[PEAK] interpreting CircularityError
Sergey Schetinin
maluke at gmail.com
Tue Oct 21 20:52:14 EDT 2008
The change fixed it, thanks a lot!
On Wed, Oct 22, 2008 at 03:39, Phillip J. Eby <pje at telecommunity.com> wrote:
> At 02:16 AM 10/22/2008 +0300, Sergey Schetinin wrote:
>>
>> If I understand correctly, when CircularityError is raised it's
>> supposed that routes parameter describes the circularity in question.
>> It's a dict that maps cells that need to run to sets of dependent
>> cells. So the circularity means there should be a cycle in there, i.e.
>> no possible order to calculate the tree running each cell rule no more
>> than once. I can't see it this error I get:
>>
>> {LazyCell(<bound method AutoSize.y of AutoSize(376, 178)>, 178):
>> set([LazyCell(<function <lambda> at 0x01C162B0>, 158)]),
>> LazyCell(<function <lambda> at 0x01C162B0>, 158):
>> set([LazyCell(<bound method OffsetPoint.y of OffsetPoint(384, 194)>,
>> 194)]),
>> LazyCell(<bound method OffsetPoint.y of OffsetPoint(384, 194)>, 194):
>> set([Cell(<bound method OptionalPanel.track_rect of
>> <gui5.models.OptionalPanel object at 0x00E00830>>, None),
>> LazyCell(<bound method AutoSize.y of AutoSize(376, 20)>, 20)]),
>> LazyCell(<bound method AutoSize.y of AutoSize(376, 20)>, 20):
>> set([Cell(<bound method OptionalPanel.track_rect of
>> <gui5.models.OptionalPanel object at 0x00E00830>>, None)])}
>>
>>
>> This happens in response to resizing the window and it only happens
>> once, after first 1px change, after that everything works as intended
>> and without a glitch, which suggests it's a fluke of finding the
>> proper order for running the rules. I'll also try to create a smaller
>> test to reproduce it, so for now I'm just seeking assistance with
>> .routes interpretation.
>
> Hm. It appears it's possible for the cycle detection to be
> over-enthusiastic. It declares a cycle if any retried rule triggers the
> recalc of any other retried rule. It does not actually verify that the rule
> triggers *itself*.
>
> So, the raising of a circularity error should be replaced with a check for
> an actual cycle, probably by calling a check_circularity function, e.g.:
>
> def check_circularity(item, routes, start=None, seen=None):
> if seen is None: seen = {}
> if start is None: start = item
> for via in routes.get(item, ()):
> if via is start:
> raise CircularityError(routes, start)
> elif via not in seen:
> seen[via] = 1
> check_circularity(via, routes, start, seen)
>
>
--
Best Regards,
Sergey Schetinin
http://s3bk.com/ -- S3 Backup
http://word-to-html.com/ -- Word to HTML Converter
More information about the PEAK
mailing list