Re: ENB: Ahas re paste-retaining-clones
Actually v_gen2 can be written differently to retain the same API as v_generator: def v_gen2(v): for ch in v.children: yield ch yield from v_gen2(ch) On Monday, August 14, 2023 at 7:48:11 AM UTC+2 vitalije wrote: > Happy birthday to you Edward. But putting birthday aside, I can't resist > to comment on some parts of your post. > > > On Sunday, August 13, 2023 at 11:31:16 AM UTC+2 Edward K. Ream wrote: > > Today is my 74th birthday. This Engineering Notebook post is my birthday > present to myself. > > - We can't use VNode generators because they don't yield VNodes in outline > order. > > > > I really don't know where did you get this idea from? Have you test it? > For me they always give me the nodes in the outline order. Maybe we don't > use the same generator? Here is mine: > > def v_generator(v): > yield v > for ch in v.children: > yield from v_generator(ch) > > a = ('hidden-root-vnode-gnx',) + tuple(p.gnx for p in c.all_positions()) > b = tuple(v.gnx for v in v_generator(c.hiddenRootNode)) > > assert a == b > > # of coarse you can avoid yielding root vnode with > # a slightly different generator > > def v_gen2(vs): > for ch in vs: > yield ch > yield from v_gen2(ch.children) > > # and it can be used like this > > a = tuple(p.gnx for p in c.all_positions()) > b = tuple(v.gnx for v in v_gen2(c.hiddenRootNode.children)) > assert a == b > g.es('ok') > > The parents attribute is never used in this generators so it is completely > free to be modified by the scripts. The information about outline order is > fully contained in the v.children attributes. The v.parents attribute is > necessary only if you want to continue traversal in outline order from any > given point. > > Vitalije > -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/c31ce713-2ee4-432d-8ef1-09184f156e78n%40googlegroups.com.
Re: ENB: Ahas re paste-retaining-clones
Happy birthday to you Edward. But putting birthday aside, I can't resist to comment on some parts of your post. On Sunday, August 13, 2023 at 11:31:16 AM UTC+2 Edward K. Ream wrote: Today is my 74th birthday. This Engineering Notebook post is my birthday present to myself. - We can't use VNode generators because they don't yield VNodes in outline order. I really don't know where did you get this idea from? Have you test it? For me they always give me the nodes in the outline order. Maybe we don't use the same generator? Here is mine: def v_generator(v): yield v for ch in v.children: yield from v_generator(ch) a = ('hidden-root-vnode-gnx',) + tuple(p.gnx for p in c.all_positions()) b = tuple(v.gnx for v in v_generator(c.hiddenRootNode)) assert a == b # of coarse you can avoid yielding root vnode with # a slightly different generator def v_gen2(vs): for ch in vs: yield ch yield from v_gen2(ch.children) # and it can be used like this a = tuple(p.gnx for p in c.all_positions()) b = tuple(v.gnx for v in v_gen2(c.hiddenRootNode.children)) assert a == b g.es('ok') The parents attribute is never used in this generators so it is completely free to be modified by the scripts. The information about outline order is fully contained in the v.children attributes. The v.parents attribute is necessary only if you want to continue traversal in outline order from any given point. Vitalije -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/3ddc42e6-6c0f-48b2-90d5-e838ff4743c9n%40googlegroups.com.
Re: ENB: Ahas re paste-retaining-clones
On Sunday, August 13, 2023 at 2:17:56 PM UTC-5 Viktor wrote: Another one joining late - but - still in time ;-) There's no rush, hehe. Enjoy your birthday exactly the way you prefer to ! I'm having way too much fun. Time to rejoin my family :-) Edward -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/f1f14bd9-5e00-4b73-a6a6-a70ad80a201fn%40googlegroups.com.
Re: ENB: Ahas re paste-retaining-clones
On Sun, Aug 13, 2023 at 12:10 PM Edward K. Ream wrote: > c.*alt*_all_positions must use a stack just like Position.stack. True, but c.alt_all_positions is simpler than I dared hope: def alt_all_positions(self) -> Generator: """An alternative implementation of c.all_positions.""" c = self PositionStack = list[tuple[VNode, int]] def visit(childIndex: int, v: VNode, stack: PositionStack) -> Generator: yield leoNodes.Position(v, childIndex, stack[:]) stack.append((v, childIndex)) for child_childIndex, child_v, in enumerate(v.children): yield from visit(child_childIndex, child_v, stack) stack.pop() stack: PositionStack = [] for i, v in enumerate(c.hiddenRootNode.children): yield from visit(i, v, stack) No helper methods required! This method passes TestNodes.test_c_alt_all_positions: def test_c_alt_all_positions(self): c = self.c self.clean_tree() cc = self.create_test_paste_outline() assert cc.h == 'cc', repr(cc) positions1 = list(c.all_positions()) positions2 = list(c.alt_all_positions()) assert positions1 == positions2 An amazing development. The birthday presents keep coming. Edward -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/CAMF8tS0hu1U6Hs8Fqe64PkEKkay9EdDC7qQWHZws0GreeSv4PQ%40mail.gmail.com.
Re: ENB: Ahas re paste-retaining-clones
Hello Edward, On Sun, 13 Aug 2023, 21:06 Félix, wrote: > Edward, I also want to join my voice to the group in wishing you a happy > birthday! :D Another one joining late - but - still in time ;-) Enjoy your birthday exactly the way you prefer to ! > -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/CAAeSrGKV2JgbCSV1a-2%2BoOyC6V38U15evDsXiMmRtYGUBA0P7A%40mail.gmail.com.
Re: ENB: Ahas re paste-retaining-clones
On Sunday, August 13, 2023 at 2:06:19 PM UTC-5 Félix wrote: Edward, I also want to join my voice to the group in wishing you a happy birthday! :D So Happy Birthday, Edward! Another year older, but your programming prowess keeps getting younger! Cheers to you and the adventures your code will take us on! 🚀 Many thanks, my friend. Edward -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/3a636ead-07e5-4176-b274-e5cda7182253n%40googlegroups.com.
Re: ENB: Ahas re paste-retaining-clones
Edward, I also want to join my voice to the group in wishing you a happy birthday! :D So Happy Birthday, Edward! Another year older, but your programming prowess keeps getting younger! Cheers to you and the adventures your code will take us on! 🚀 Félix On Sunday, August 13, 2023 at 2:31:58 PM UTC-4 Edward K. Ream wrote: > On Sun, Aug 13, 2023 at 1:10 PM Thomas Passin wrote: > >> Best wishes on your birthday from this quarter, too! >> > > :-) > > Edward > -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/9a2985f3-e8d3-433b-b206-149431374fc8n%40googlegroups.com.
Re: ENB: Ahas re paste-retaining-clones
On Sun, Aug 13, 2023 at 1:10 PM Thomas Passin wrote: > Best wishes on your birthday from this quarter, too! > :-) Edward -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/CAMF8tS3EM%2Bxx%3DW_COtVCcj6wr3ec9E1vcXvEkPeit%3DiBSu0heA%40mail.gmail.com.
Re: ENB: Ahas re paste-retaining-clones
Best wishes on your birthday from this quarter, too! On Sunday, August 13, 2023 at 1:13:18 PM UTC-4 Edward K. Ream wrote: On Sunday, August 13, 2023 at 12:00:43 PM UTC-5 David Szent-Györgyi wrote: > Thank you for working on your birthday and giving a gift to us all. -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/febb50e1-9da7-44fe-b726-d418dcbc174en%40googlegroups.com.
Re: ENB: Ahas re paste-retaining-clones
On Sunday, August 13, 2023 at 12:00:43 PM UTC-5 David Szent-Györgyi wrote: > Thank you for working on your birthday and giving a gift to us all. You're welcome. It's been my pleasure. Edward -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/537ae5c6-5828-4e2f-b579-49d73b48421an%40googlegroups.com.
Re: ENB: Ahas re paste-retaining-clones
On Sun, Aug 13, 2023, Edward K. Ream wrote: >> Is it possible to write [*c.all_vnode_positions*]? > You bet: [snip] > This generator passes the following consistency test: vnodes1 = [c.hiddenRootNode] + [z.v for z in c.all_positions()] vnodes2 = list(c.all_vnode_positions()) assert vnodes1 == vnodes2 The elegance of this VNode-based stand-in for c.all_positions raises some follow-on questions. *Does c.all_positions use v.parents?* Apparently not, which means that c.all_vnode_positions isn't strictly necessary. Leo could define it like this: def all_vnode_positions(self): c = self yield c.hiddenRootNode for p in c.all_positions(): yield p.v But this definition would be much worse than a VNode-based definition. *c.alt_all_positions* Could Leo define a generator, say *c.alt_all_positions*, using c.all_vnode_positions as a template? Yes it could. In my original post, I said, "[c.all_vnode_positions] will maintain an explicit stack just like Position.stack." In fact, the generator uses only a stack of VNodes. But c.*alt*_all_positions must indeed use a stack just like Position.stack. c.all_positions calls p.moveToThreadNext to advance through the outline. In turn, p.moveToThreadNext calls p.moveToParent, p.moveToFirstChild and p.moveToNext. c.*alt*_all_positions will use none of these helpers. Instead, the new generator will operate directly on its explicit stack, yielding new positions with (copies of) the explicit stack. There will be no need for a "copy" kwarg. *Summary* *c.alt_all_positions* is feasible. Similarly, Leo could define other "alt" generators. Alt generators should be faster (and use less memory) than the corresponding legacy generators. Nevertheless, Positions themselves and all Position methods must remain, whatever their internal form. Edward -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/CAMF8tS1-NtBYKghZHe1rPZaRcFa6x5GKavzsLyioF%2BgnhA_19A%40mail.gmail.com.
Re: ENB: Ahas re paste-retaining-clones
On Sunday, August 13, 2023 at 5:31:16 AM UTC-4 Edward K. Ream wrote: Today is my 74th birthday. This Engineering Notebook post is my birthday present to myself. Have the happiest of birthdays. Thank you for working on your birthday and giving a gift to us all. -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/510e2cf7-cf7c-482e-acfb-42af7196b0b4n%40googlegroups.com.
Re: ENB: Ahas re paste-retaining-clones
On Sun, Aug 13 Edward K. Ream wrote: > Is it possible to write [*c.all_vnode_positions*]? You bet: def all_vnode_positions(self) -> Generator: c = self to_be_visited: list[VNode] = [c.hiddenRootNode] while to_be_visited: v = to_be_visited.pop() yield v for child in reversed(v.children): to_be_visited.append(child) This generator passes the following consistency test: vnodes1 = [c.hiddenRootNode] + [z.v for z in c.all_positions()] vnodes2 = list(c.all_vnode_positions()) assert vnodes1 == vnodes2 Edward -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/CAMF8tS1rwk6A6QnYeCoVwKEcJ6RiAxhUS8DRzLa4VbdOztUbTQ%40mail.gmail.com.
Re: ENB: Ahas re paste-retaining-clones
On Sun, Aug 13, 2023 at 4:50 AM jkn wrote: > Well, Happy Birthday Edward! ;-) > Thanks :-) Edward -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/CAMF8tS0grWE7S%3DX8d80Bw8o62EriiJBUAKoRayYXJZWh2j6xgg%40mail.gmail.com.
Re: ENB: Ahas re paste-retaining-clones
Well, Happy Birthday Edward! ;-) Regards, Jon N On Sunday, August 13, 2023 at 10:31:16 AM UTC+1 Edward K. Ream wrote: > Today is my 74th birthday. This Engineering Notebook post is my birthday > present to myself. > > > For the last week, I have been trying to make paste-retaining-clones work. > Unit tests show this command improperly computes v.parents arrays in the > pasted outline. > > > This morning I saw the way forward: > > > *Aha!* paste-retaining-clones must recompute *all* v.parents arrays in > the entire outline! > > > I won't attempt a formal proof, but I am sure this Aha is correct. Note > that the paste-node command does *not *require the complications > described next. > > > *Recomputing v.parents* > > > But how to recompute v.parents? > > > - We can't use Position generators because they all use v.parents! > - We can't use VNode generators because they don't yield VNodes in outline > order. > > > *Aha! *Define a *c.all_vnode_positions* generator. This *hybrid generator* > will > yield VNodes in the same order as p.all_positions *using neither > v.parents nor Positions.* > > > Is it possible to write this generator? Yes, it is. The generator will > maintain an explicit stack just like Position.stack. *Note*: > c.all_vnode_positions must yield the hidden root VNode. > > > *Recomputing all v.parents* > > > Supposing the new generator exists, recomputing all v.parents arrays is > straightforward. Something like this (untested): > > > for v in c.all_vnode_positions(): > > v.parents = [] > > for v in c.all_vnode_positions(): > > for child in v.children: > > child.parents.append(v) > > > Yes, a one-pass solution is possible. It *might* be faster. > > > *Summary* > > > *Aha!* The paste-retaining-clones command must recompute *all *v.parents > ivars. This recomputation is sound. The link correction in > c.checkVnodeLinks is not. > > > Leo can use neither Position nor VNode generators to do the recomputation. > > > *Aha!* A new generator, *c.all_vnode_positions*, will yield all VNodes in > outline order using neither v.parents nor Positions. > > > Given this generator, updating all v.parents ivars will be straightforward. > > > Edward > > > P.S. Let us define a *hybrid generator *as a generator yielding VNodes in > the same order as some Position generator *without *using Positions. > > > Could Leo replace Position generators with hybrids? I think not. For > example, please take a look qtree.full_redraw. It would not be fun to > eliminate Positions there. > > > In any event, Leo's Position class is never going away :-) > > > EKR > -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/667252b3-0580-4a72-ab5e-29154440d1d8n%40googlegroups.com.
ENB: Ahas re paste-retaining-clones
Today is my 74th birthday. This Engineering Notebook post is my birthday present to myself. For the last week, I have been trying to make paste-retaining-clones work. Unit tests show this command improperly computes v.parents arrays in the pasted outline. This morning I saw the way forward: *Aha!* paste-retaining-clones must recompute *all* v.parents arrays in the entire outline! I won't attempt a formal proof, but I am sure this Aha is correct. Note that the paste-node command does *not *require the complications described next. *Recomputing v.parents* But how to recompute v.parents? - We can't use Position generators because they all use v.parents! - We can't use VNode generators because they don't yield VNodes in outline order. *Aha! *Define a *c.all_vnode_positions* generator. This *hybrid generator* will yield VNodes in the same order as p.all_positions *using neither v.parents nor Positions.* Is it possible to write this generator? Yes, it is. The generator will maintain an explicit stack just like Position.stack. *Note*: c.all_vnode_positions must yield the hidden root VNode. *Recomputing all v.parents* Supposing the new generator exists, recomputing all v.parents arrays is straightforward. Something like this (untested): for v in c.all_vnode_positions(): v.parents = [] for v in c.all_vnode_positions(): for child in v.children: child.parents.append(v) Yes, a one-pass solution is possible. It *might* be faster. *Summary* *Aha!* The paste-retaining-clones command must recompute *all *v.parents ivars. This recomputation is sound. The link correction in c.checkVnodeLinks is not. Leo can use neither Position nor VNode generators to do the recomputation. *Aha!* A new generator, *c.all_vnode_positions*, will yield all VNodes in outline order using neither v.parents nor Positions. Given this generator, updating all v.parents ivars will be straightforward. Edward P.S. Let us define a *hybrid generator *as a generator yielding VNodes in the same order as some Position generator *without *using Positions. Could Leo replace Position generators with hybrids? I think not. For example, please take a look qtree.full_redraw. It would not be fun to eliminate Positions there. In any event, Leo's Position class is never going away :-) EKR -- You received this message because you are subscribed to the Google Groups "leo-editor" group. To unsubscribe from this group and stop receiving emails from it, send an email to leo-editor+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/leo-editor/ac395ee0-7d14-47fa-989f-d78139168c50n%40googlegroups.com.