Marshall, BQN is really interesting! I'll definitely study it (and maybe steal 1-2 things along the way ;-). Your function makes for a ~25% faster computation on my preliminary testing, albeit at the price of ~3x the space. I'll have to think more about it to understand the complexity of your expression, but it seems like a nice improvement!
Henry, if I understood your last correctly your modification is almost identical (within 5% both time & space -wise) . The expression is simpler though, which is nice. Cheers! Raoul On Sat, May 29, 2021 at 6:10 PM Henry Rich <henryhr...@gmail.com> wrote: > Good algorithm! > > Consider > > 'p g' =. |: 0 2 #: g2 =. ... > > for the first 2 lines. (0,2^n) #: y avoids the divide and remainder. > > Henry Rich > > > > On 5/29/2021 11:50 AM, Marshall Lochbaum wrote: > > It's possible to convert depths to parent indices without boxes, by > > sorting a depth list with twice the input size. The idea is to list each > > depth twice, with the first instance representing it as a child entry, > > and the second, which is increased by one, representing it as a parent > > entry. After sorting, the parents and children for each depth are > > grouped together, so a child's parent is the most recent parent in the > > sorted list. > > > > The format of the grade result isn't particularly convenient. It has to > > be split with division and remainder by 2, where the quotient is the > > index in y and the remainder indicates if it is used as a parent. > > Besides that, there's a pattern >./\p*i.#p to get the index of the most > > recent 1 in p, and the rest is straightforward. > > > > pv_flat =: 3 : 0 > > p =. 2| g2 =. /: ,y+/i.2 > > g =. <.g2%2 > > g /:~&:((-.p)&#) (>./\p*i.#p){g > > ) > > > > When I built an array-based compiler for BQN I found that it tends to be > > simpler not to convert to trees explicitly, and instead to order by > > parenthesis (or other bracket) depth, which splits things into flat > > expressions where a closed parenthesis denotes a subexpression result. > > The paired parentheses serve the same purpose that the parent-child > > doubling does here, and the natural depth computation (+/\-/'()'=/s) > > automatically places open parentheses one higher than closed ones. Some > > further discussion at > > https://mlochbaum.github.io/BQN/implementation/codfns.html . > > > > Marshall > > > > On Wed, May 26, 2021 at 12:44:13AM +0200, Raoul Schorer wrote: > >> It is indeed very much worthy of note! I am currently making a little > >> library of all the tree manipulation idioms in Hsu's thesis, with the > final > >> goal of using them in an interpreter. It is therefore very useful to > have > >> the inverse of those transformations to reverse the encoded results into > >> more usual J language terms for trees (i.e. nested boxes), if only to > >> visualize the result and also make it available to the L. L: S: family > of > >> primitives. > >> > >> As for the depth -> parent vector transform, an almost literal > translation > >> of the thesis code is: > >> > >> pv =: monad define > >> > >> p =.i.@# y > >> > >> i =. (</. i.@#) y > >> > >> j =. ; 2 (0&{:: <@(<:@I.{[) 1&{::)\ i > >> > >> j (;}.i) } p > >> > >> ) > >> > >> > >> which seems almost equivalent to your solution regarding time > complexity, > >> although yours seems ~25% better spacewise on preliminary tests. > Probably > >> because it avoids some intermediate result copying? > >> > >> I am sure Dr. Hsu would be extremely interested if someone came up with > >> more efficient solutions for all those transforms, as they are the > >> foundation of his Co-dfns compiler and are therefore used pervasively. > >> > >> > >> Cheers, > >> > >> Raoul > >> > >> On Tue, May 25, 2021 at 11:16 PM Raul Miller <rauldmil...@gmail.com> > wrote: > >> > >>> It's perhaps worth noting that you can convert a depth vector to a > >>> parent vector (except for the root element, which has no parent -- > >>> though it's convenient to represent the root element as being its own > >>> parent) using (i: <:@{:)\ > >>> > >>> For example: > >>> ast=:t;(t;t);(t;(t;t);t);<(t;(t;t;t);(t;t;t);t=.'.') > >>> dv=: 0, 1+ [:; [:dv&.> 1}.] > >>> > >>> 0,}.(i: <:@{:)\dv ast > >>> 0 0 1 0 3 4 3 0 7 8 8 7 11 11 7 > >>> > >>> You can convert a parent vector back to a depth vector using: > >>> pv2dv=:{{ > >>> (0,1+}.)@(y&{)^:_ y > >>> }} > >>> > >>> There might be more efficient approaches? > >>> > >>> Thanks, > >>> > >>> -- > >>> Raul > >>> > >>> On Mon, May 24, 2021 at 8:57 AM Raul Miller <rauldmil...@gmail.com> > wrote: > >>>> Oops > >>>> > >>>> dv=: 0, 1+ [:; [:dv&.> 1}.] > >>>> > >>>> > >>>> Thanks, > >>>> > >>>> > >>>> -- > >>>> > >>>> Raul > >>>> > >>>> > >>>> On Mon, May 24, 2021 at 8:40 AM Raoul Schorer < > raoul.scho...@gmail.com> > >>> wrote: > >>>>> Hi and thanks to all for helpting! > >>>>> > >>>>> Raul, I think you forgot to copy your working verb in your last. > >>>>> Ethejiesa, good catch and great insight! Your verb yields a domain > >>> error on > >>>>> J902, though. > >>>>> > >>>>> Cheers, > >>>>> Raoul > >>>>> > >>>>> On Mon, May 24, 2021 at 2:35 PM Raul Miller <rauldmil...@gmail.com> > >>> wrote: > >>>>>> Thank you, that makes sense. > >>>>>> > >>>>>> And, I also see that I built a faulty value for ast. > >>>>>> > >>>>>> Here's a fixed ast and a working depth vector verb: > >>>>>> > >>>>>> t=:'.' > >>>>>> > >>>>>> ast=:t;(t;t);(t;(t;t);t);<(t;(t;t;t);(t;t;t);t) > >>>>>> > >>>>>> ast > >>>>>> > >>>>>> +-+-----+-----------+---------------------+ > >>>>>> > >>>>>> |.|+-+-+|+-+-----+-+|+-+-------+-------+-+| > >>>>>> > >>>>>> | ||.|.|||.|+-+-+|.|||.|+-+-+-+|+-+-+-+|.|| > >>>>>> > >>>>>> | |+-+-+|| ||.|.|| ||| ||.|.|.|||.|.|.|| || > >>>>>> > >>>>>> | | || |+-+-+| ||| |+-+-+-+|+-+-+-+| || > >>>>>> > >>>>>> | | |+-+-----+-+|+-+-------+-------+-+| > >>>>>> > >>>>>> +-+-----+-----------+---------------------+ > >>>>>> > >>>>>> dv ast > >>>>>> > >>>>>> 0 1 2 1 2 3 2 1 2 3 3 2 3 3 2 > >>>>>> > >>>>>> > >>>>>> (Apologies for any wonky formatting -- I am on a phone right now.) > >>>>>> > >>>>>> > >>>>>> Thanks, > >>>>>> > >>>>>> > >>>>>> -- > >>>>>> > >>>>>> Raul > >>>>>> > >>>>>> On Mon, May 24, 2021 at 2:47 AM ethiejiesa via Programming < > >>>>>> programm...@jsoftware.com> wrote: > >>>>>> > >>>>>>> Raoul Schorer <raoul.scho...@gmail.com> wrote: > >>>>>>>> Dear all, > >>>>>>>> > >>>>>>>> I am struggling with the translation of the following APL dyad to > >>> J: > >>>>>>>> ∊ 0 {(⊢,(⍺+1)∇⊣)/⌽⍺,1↓⍵} y > >>>>>>>> > >>>>>>>> which is the expression to yield a depth vector from a tree in > >>> record > >>>>>>>> format (drawn from Dr. Hsu's thesis). Demo: > >>>>>>> Oh cool! I have been (very sparingly) messing about with Hsu's tree > >>>>>>> representation. For purely selfish reasons, I haven't looked at the > >>>>>> thesis, > >>>>>>> trying to figure out the representation myself. However, I have > >>> only got > >>>>>>> so far > >>>>>>> as figuring out an algorithm for non-recursively generating random > >>> depth > >>>>>>> vectors. > >>>>>>> > >>>>>>>> t ← '∘' > >>>>>>>> ast ← t (t t) (t (t t) t) (t (t t t) (t t t) t) > >>>>>>>> ∊ 0 {(⊢,(⍺+1)∇⊣)/⌽⍺,1↓⍵} ast > >>>>>>>> 0 1 2 1 2 3 2 1 2 3 3 2 3 3 2 > >>>>>>>> > >>>>>>>> In particular, I don't understand the control flow and termination > >>>>>>>> condition for the recursion. Dr. Hsu says that this uses tree > >>> reduction > >>>>>>>> with no base case. > >>>>>>> Anyway, my APL is pretty sketchy, but it looks like the ast > >>>>>> representation > >>>>>>> there is something like this: > >>>>>>> > >>>>>>> 1) First element of list is node content, > >>>>>>> 2) Following nodes are child subtrees. > >>>>>>> > >>>>>>> So the algorithm should be conceptually simple. Replace the head > >>> atom > >>>>>> with > >>>>>>> the > >>>>>>> current depth, bump current depth, and then recurse over the child > >>>>>>> subtrees. I > >>>>>>> believe that the "base case" is taken care of by (/), since at the > >>> leaves > >>>>>>> it > >>>>>>> should be operating on atoms. > >>>>>>> > >>>>>>>> dv =. {{ (];(>:x) dv [)/\ |.x;}.y }} > >>>>>>>> > >>>>>>>> results in an infinite loop. What am I missing? Is there some > >>> kind of > >>>>>>>> implicit termination condition in the ∇ primitive? > >>>>>>> The main problem is the (x;}.y) part. The recursion depends on the > >>> fact > >>>>>>> that > >>>>>>> (⍺,1↓⍵) equals ⍺ at the leaves, but (x;}.<'anything') is the same > >>> thing > >>>>>> as > >>>>>>> (x;a:). Thus when y is a leaf, (x;}.y) turns into a tree! > >>>>>>> > >>>>>>> We can brute for a fix by replacing the (;) in (x;}.y) with > >>>>>>> (;`(<@[)@.(0=#@])): > >>>>>>> > >>>>>>> t=: '.' > >>>>>>> ast=: t;(t;t);(t;(t;t);t);<(t;(t;t;t);(t;t;t);t) > >>>>>>> f=: {{(],(>:x) f >@[)/ |. x ;`(<@[)@.(0=#@]) }.y}} > >>>>>>> 0 ;@f ast > >>>>>>> 0 1 2 1 2 3 2 1 2 3 3 2 3 3 2 > >>>>>>> > >>>>>>> Hope that's somewhat comprehensible. > >>>>>>> > >>> ---------------------------------------------------------------------- > >>>>>>> For information about J forums see > >>> http://www.jsoftware.com/forums.htm > >>>>>> > ---------------------------------------------------------------------- > >>>>>> For information about J forums see > >>> http://www.jsoftware.com/forums.htm > >>>>> > ---------------------------------------------------------------------- > >>>>> For information about J forums see > http://www.jsoftware.com/forums.htm > >>> ---------------------------------------------------------------------- > >>> For information about J forums see http://www.jsoftware.com/forums.htm > >>> > >> ---------------------------------------------------------------------- > >> For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > > For information about J forums see http://www.jsoftware.com/forums.htm > > > -- > This email has been checked for viruses by AVG. > https://www.avg.com > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm