Just a few notes based on only a cursory examination of this code: it does not appear to use arrays well. Working on higher-level arrays rather than scalars simplifies your code and potentially speeds it up.
For instance, in the function "mS" below, nearly every line has a duplicate, doing the same thing on slightly different data. Also,it's hard to tell from a single example, but in "NoKPs" it looks like you're breaking apart your two-element vector argument into two global scalars - not a good practice for a number of reasons. This breaking the one thing - a vector - into two separate scalars - is at the root of the duplicated code in "mS". To clean this up,here's an example of how this first part of "mS": ny=. #y ax=. i:<.-: #x hy=. <.-: ny xi=: hy + I - ax xj=: hy + J - ax could be simplified to xij=. (IJ+<.-:#y)-/i:<.-:#x (where I re-combine the two global scalars back into a vector ( IJ=: I,J) - only an interim solution as there's no need for a global at all, especially if it's only ever used once.) This results in a single, two-row matrix "xij" - instead of the two vectors "xi" and "xj" - and eliminates five temporary variables that don't get used again. The two pairs of duplicate lines after this could also be similarly simplified. Basically, it looks like "mS" is really a one- or two-line function. Once you've saved all those lines of code, it wouldn't hurt to give back some of the typing saved with a descriptive comment and perhaps a more meaningful name for the function; the function name doesn't even need to be longer if you explain its meaning in a comment. I'd be interested in finding out if reducing the code like this gives any performance improvement; it almost certainly would if it allows you to come up with a tacit version though that may be too much work in this case. Good luck, Devon On Sun, Jan 4, 2009 at 3:12 AM, Aai <[email protected]> wrote: > Cleaning up a bit. And reusing resources gives a small improvement: > > > mS=: 4 : 0 > ny=. #y > ax=. i:<.-: #x > hy=. <.-: ny > xi=: hy + I - ax > xj=: hy + J - ax > p1=. +/ x * xi{y,0$~+/ny<: xi > p2=. +/ x * xj{y,0$~+/ny<: xj > p1*p2 > ) > > NoKPs =: 4 : 0 > 'I J'=: y > ep=. ((0x&(,+,~)^: (]`1:))*(_1x&*^:(<@(1&+)`(_1x&^)))) x > pa=. 1 1 0 1 1 & (+//.@(*/)) &.>^: (<x+1) <1 > (2x^x)%~ +/ ep * > pa mS &.> |. (*1 _1$~#)&.> pa > ) > > > Aai schreef: > > Update: > > > > ah=: 1 1 0 1 1x > > bh=: 1 _1 0 _1 1x > > > > ppr=: +//.@(*/) > > > > mulSqAt=: 4 : 0 > > nx=. #x > > ax=. i:<.-: nx > > ay=. <.-: #y > > aymi=. ay + I - ax > > aymj=. ay + J - ax > > nuli=. 0$~+/-.(#y)>aymi > > nulj=. 0$~+/-.(#y)>aymj > > p1=. +/ x * (aymi){y,nuli > > p2=. +/ x * (aymj){y,nulj > > p1*p2 > > ) > > > > pathstr =: 4 : 0 > > 'I J'=: y > > ep=: ((0x&(,+,~)^: (]`1:))*(_1x&*^:(<@(1&+)`(_1x&^)))) x > > tp=: (ah&ppr&.>^: (<x+1) <1) mulSqAt &.> |. bh&ppr&.>^: (<x+1) <1 > > (2x^x)%~ +/ ep * > tp > > ) > > > > 100 pathstr 4 4 > > > 2422219241769802380469882122062019059350760968380804461263234408581143863208781993964800 > > > > ts '100 pathstr 4 4' > > 0.535013 10054144 > > > > Time to speed up things! > > > > =@@i > > > > > > Aai schreef: > > > >> Trying to translate some parts of pathstensor from part IV: > >> > >> The part with 'multinomial' * sign: > >> multinomial [na,nb] * (-1)^nb > >> > >> can be interpreted as: > >> > >> mnpd=: (0&(,+,~)^: (]`1:))*(_1&*^:(<@(1&+)`(_1&^))) > >> > >> (not really a first shot for) emulating mulArray and powers_of: > >> > >> a=: _2]\ _2 1 _1 1 0 0 1 1 2 1 > >> b=: _2]\ _2 1 _1 _1 0 0 1 _1 2 1 > >> > >> mularr=: [:({...@{.,+/@{:)@|:/.({.,{:)@(+,*)"1"1 _ > >> > >> powers_of=: 4 : 0 > >> if. 0=y do. 0 1 return. end. > >> if. 1=y do. x return. end. > >> x&mularr^: (y-1) x > >> ) > >> > >> Some examples: > >> > >> a powers_of 0 > >> 0 1 > >> a powers_of 1 > >> _2 1 > >> _1 1 > >> 0 0 > >> 1 1 > >> 2 1 > >> a powers_of 2 > >> _4 1 > >> _3 2 > >> _2 1 > >> _1 2 > >> 0 4 > >> 1 2 > >> 2 1 > >> 3 2 > >> 4 1 > >> > >> However they will be way too slow for pathstensor 100 (4,4). So > >> something to chew on. > >> > >> ... still trying to wrap my brain around 'mulSquareAt arr arr (i,j)' and > >> all the other stuff :-) > >> > >> > >> > >> =@@i > >> > >> > >> > >> Tracy Harms schreef: > >> > >> > >>> There is a lot of array-oriented thinking in a series of four blog > >>> posts by Twan van Laarhoven. The ideas include tensor product of rings > >>> and arrays as polynomials. Although his code is in Haskell, some here > >>> may share my interest in what he's written. I won't be surprised if > >>> somebody finds something fun to translate into J, or to do differently > >>> in J. > >>> > >>> Part one is here: > >>> http://twan.home.fmf.nl/blog/haskell/Knight1.details > >>> > >>> The overall blog post series (with all four parts) is here: > >>> http://twan.home.fmf.nl/blog/ > >>> > >>> The problem examined is: A knight is placed at the origin of a > >>> chessboard that is infinite in all directions. How many ways are there > >>> for that knight to reach cell (i,j) in exactly n moves? > >>> > >>> -- > >>> Tracy > >>> ---------------------------------------------------------------------- > >>> 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 > -- Devon McCormick, CFA ^me^ at acm. org is my preferred e-mail ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
