Matrix multiply is a good place to start as the dot conjunction simply generalizes the operations behind it.
On Thu, Oct 30, 2014 at 11:42 PM, Jon Hough <[email protected]> wrote: > Thanks. It wasn't matrix multiplication that stumped me. It was trying to > understand how the verb train worked. The conjunction . Had escaped me up > until now, so I just need read up on it a bit more carefully. > > --- Original Message --- > > From: "Raul Miller" <[email protected]> > Sent: October 31, 2014 4:13 AM > To: "Programming forum" <[email protected]> > Subject: Re: [Jprogramming] Algorithm to Check Graph is connected > > Can you be more specific about what you are not sure about getting, > with the . conjunction? > > For example, does it help to visualize the structure of matrix > multiplication? > > Here are some pages that might help with that kind of visualization: > > http://www.stoimen.com/blog/2012/11/26/computer-algorithms-strassens-matrix-multiplication/ > or http://www.sophia.org/tutorials/multiplying-matrices or > http://mathnathan.com/2010/08/matrix-multiplication-opencl/ > > Does it help to think of +/ as representing summation? > > Or are you trying to envision the steps in the process? If so, we > could sketch out some examples. > > Or are you trying to envision the data structure of the result as > based on the arguments. If so, you might try working with examples > like this: > > (i.3) < .(;&.>) 3 3$'abcdefghi' > or > (i.3 3) < .(;&.>) 3 3$'abcdefghi' > or > (i.3 3) < .+ i.3 3 > or > (i.3 3) +/ .+ i.3 3 > > Or other variations on that theme... > > I hope this helps. Joe's tips should help also. > > Thanks, > > -- > Raul > > > On Thu, Oct 30, 2014 at 9:25 AM, Jon Hough <[email protected]> wrote: > > Unfortunately, even after reading the Nuvoc entry for . , I'm not sure I > get it.I was messing around with some usages: > > > > f =. <./ . + > > > > > > > > > > m =: 2 2 $ 3 5 7 1 > > > > > > f~ m > > > > > > this gives > > > > > > 6 6 > > > > > > 8 2 > > > > > > Which seems odd. From Nuvoc, "x u . v y is defined for general u and v > as x u@(v"(1+lv,_)) y". > > > > > > So here I am doing m +"(1 _) m > > > > > > and then from using the result of that, r say, doing > > > > > > m <./ r > > > > > > But the result of doing that is clearly not what is wanted. > > > > > > > > > > > > > > > >> Date: Thu, 30 Oct 2014 06:58:31 -0400 > >> From: [email protected] > >> To: [email protected] > >> Subject: Re: [Jprogramming] Algorithm to Check Graph is connected > >> > >> It looks like a hook because of the spacing and because .+ looks like a > noun > >> > >> . is a conjunction, and returns a derived verb. As such there are two > verbs > >> in the train, so a fork > >> > >> (<./ . +) > >> u . v > >> > >> uu=: </. > >> vv=: + > >> > >> (<. (uu . vv)) ~ (3 3 $ i.3) > >> > >> > >> running trace can be helpful: > >> > >> trace '(<. <./ . +)~ arr' > >> --------------- 3 Adverb ----- > >> <. > >> / > >> <./ > >> --------------- 4 Conj ------- > >> <./ > >> . > >> + > >> <./ .+ > >> --------------- 6 Bident ----- > >> <. > >> <./ .+ > >> <. <./ .+ > >> --------------- 8 Paren ------ > >> ( > >> <. <./ .+ > >> ) > >> <. <./ .+ > >> --------------- 3 Adverb ----- > >> <. <./ .+ > >> ~ > >> (<. <./ .+)~ > >> --------------- 6 Bident ----- > >> (<. <./ .+)~ > >> arr > >> (<. <./ .+)~ arr > >> ============================== > >> > >> > >> > >> > >> > >> > >> On Thu, Oct 30, 2014 at 1:56 AM, Raul Miller <[email protected]> > wrote: > >> > >> > It's a hook. > >> > > >> > The dot needs a space to its left to prevent it binding with the > slash. > >> > > >> > (Insert slashdot joke, here.) > >> > > >> > Thanks, > >> > > >> > -- > >> > Raul > >> > > >> > > >> > On Thu, Oct 30, 2014 at 1:49 AM, Jon Hough <[email protected]> > wrote: > >> > > Is (<. <./ .+)~ a fork? It looks like it should be a fork, but > running > >> > dissect on it shows a hook. > >> > > > >> > > > >> > > --- Original Message --- > >> > > > >> > > From: "Henry Rich" <[email protected]> > >> > > Sent: October 30, 2014 11:02 AM > >> > > To: [email protected] > >> > > Subject: Re: [Jprogramming] Algorithm to Check Graph is connected > >> > > > >> > > Only one small tweak to this fine post: > >> > > > >> > > > The rough J equivalent of C's array[i][j] = 30; would be > >> > > > > >> > > > 30 (<i,j)} array > >> > > > >> > > Precisely (Raul said 'rough', but the subtlety may be lost on > >> > > beginners), the equivalent would be > >> > > > >> > > array =: 30 (<i,j)} array > >> > > > >> > > 30 (<i,j)} array makes a whole new copy of array with element (i,j) > >> > > changed. This can be expensive if the array is large. By > assigning to > >> > > the same name you save the cost of the new copy. > >> > > > >> > > Henry Rich > >> > > > >> > > On 10/29/2014 8:09 PM, Raul Miller wrote: > >> > >> The rough J equivalent of C's array[i][j] = 30; would be > >> > >> > >> > >> 30 (<i,j)} array > >> > >> > >> > >> For example: > >> > >> 30 (<2 3)} 6 6$0 > >> > >> 0 0 0 0 0 0 > >> > >> 0 0 0 0 0 0 > >> > >> 0 0 0 30 0 0 > >> > >> 0 0 0 0 0 0 > >> > >> 0 0 0 0 0 0 > >> > >> 0 0 0 0 0 0 > >> > >> > >> > >> That said, be aware that often (not always, but often enough to be > >> > >> worth discussing the algorithm) J will offer better approaches. > >> > >> > >> > >> For example, for your connectedness problem: > >> > >> mat1 =: 5 5 $ _ 3 4 2 _, 3 _ _ 1 8, 4 _ _ 5 5, 2 1 5 _ _, _ 8 5 _ _ > >> > >> mat2 =: 3 3 $ _ 1 _, 1 _ _, _ _ _ > >> > >> > >> > >> (<. <./ .+~)~^:# mat1 > >> > >> 4 3 4 2 9 > >> > >> 3 2 6 1 8 > >> > >> 4 6 8 5 5 > >> > >> 2 1 5 2 9 > >> > >> 9 8 5 9 10 > >> > >> (<. <./ .+~)~^:# mat2 > >> > >> 2 1 _ > >> > >> 1 2 _ > >> > >> _ _ _ > >> > >> > >> > >> The expression (<. <./ .+)~^:_ finds the path distance between > every > >> > >> pair of points in your distance matrix. If any of them are _ the > >> > >> matrix is not connected. > >> > >> > >> > >> _ e. , (<. <./ .+)~^:_ mat1 > >> > >> 0 > >> > >> _ e. , (<. <./ .+)~^:_ mat2 > >> > >> 1 > >> > >> > >> > >> The expression (<. <./ .+)~^:# is a slightly less efficient > version of > >> > >> (<. <./ .+)~^:_ > >> > >> > >> > >> The difference is that # specifies a repeat count equal to the > number > >> > >> of rows in the matrix, while _ stops as soon as the result > converges. > >> > >> To see why this matters, it can be instructive to look at some > >> > >> examples. You can see all the intermediate results (as well as > initial > >> > >> and final values) by using a: instead: > >> > >> > >> > >> (<. <./ .+~)~^:a: mat1 > >> > >> _ 3 4 2 _ > >> > >> 3 _ _ 1 8 > >> > >> 4 _ _ 5 5 > >> > >> 2 1 5 _ _ > >> > >> _ 8 5 _ _ > >> > >> > >> > >> 4 3 4 2 9 > >> > >> 3 2 6 1 8 > >> > >> 4 6 8 5 5 > >> > >> 2 1 5 2 9 > >> > >> 9 8 5 9 10 > >> > >> > >> > >> and > >> > >> > >> > >> (<. <./ .+~)~^:a: mat2 > >> > >> _ 1 _ > >> > >> 1 _ _ > >> > >> _ _ _ > >> > >> > >> > >> 2 1 _ > >> > >> 1 2 _ > >> > >> _ _ _ > >> > >> > >> > >> The final result was achieved on the first iteration in both > examples. > >> > >> > >> > >> So... how does that expression work? > >> > >> > >> > >> Structurally, it's doing something very like a transitive closure. > See > >> > >> example 5 in the dictionary entry for ^: > >> > >> > >> > >> http://jsoftware.com/help/dictionary/d202n.htm > >> > >> > >> > >> Except, each iteration, it's adding every pair between two copies > of > >> > >> the distance matrix and then for each endpoint pair finding the > >> > >> minimum distance which resulted. And, for sanity's sake, taking the > >> > >> minimum of that result and the original pair distance. > >> > >> > >> > >> The tricky part, if you have not seen it before, is the inner > product: > >> > >> u/ .v > >> > >> > >> > >> Matrix multiplication is +/ .* and we are following the same > pattern > >> > >> here. Rather than try to document the details, however, I would > prefer > >> > >> to point you at the dictionary > >> > >> http://jsoftware.com/help/dictionary/d202n.htm and the nuvoc page > >> > >> http://www.jsoftware.com/jwiki/Vocabulary/dot#dyadic > >> > >> > >> > >> (The other thing I am using is the u~ pattern. That's even simpler: > >> > >> u~y is equivalent to y u y. So, +~1 is equivalent to 1+1. Actually, > >> > >> it's so simple that it's worth explaining just because otherwise > it's > >> > >> something your eyes might gloss over.) > >> > >> > >> > >> Anyways, unless you are working with connection matrices which > stress > >> > >> the capacity of your machine, I imagine that finding all the path > >> > >> distances and checking if any are infinity will be faster than your > >> > >> > >> > >> connected =: verb define > >> > >> mat=: y NB. the graph (square matrix) > >> > >> in=: 0 NB. list of connected nodes, start at node 0. > >> > >> size=: # y NB. Size of y > >> > >> all=: i. size NB. all nodes. > >> > >> isconnected =: 0 NB. is connected flag. > >> > >> counter =: 0 > >> > >> NB. loop through all nodes in graph. > >> > >> NB. Add any nodes connected to the in list to the in list. > >> > >> NB. If connected, in will eventually contain every node. > >> > >> while. (counter < size) do. > >> > >> counter=: counter + 1 NB. increment counter (very bad J?). > >> > >> toin =: '' > >> > >> NB. only want nodes that may not be connected. (remove "in" > nodes) > >> > >> for_j. all -. in do. > >> > >> NB. Get each column from in list and find non-infinite > >> > >> NB. edges from these nodes to nodes in all - in list. > >> > >> NB. (%) is to convert _ to 0. > >> > >> if. ((+/@:%@:(j &{"2) @: (in& { "1) mat ) > 0) do. > >> > >> toin =: toin , j > >> > >> end. > >> > >> end. > >> > >> NB. append toin to in. Number of connected nodes increases. > >> > >> in =: ~. in, toin > >> > >> NB. check connectivity. > >> > >> isconnected =:-. (# in ) < size > >> > >> if. isconnected do. > >> > >> end. > >> > >> end. > >> > >> isconnected > >> > >> ) > >> > >> > >> > >> I hope this helps, > >> > >> > >> > > > ---------------------------------------------------------------------- > >> > > 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 > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm > -- Devon McCormick, CFA ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
