for,
,/^:(2 -~ #@$)^:(3 <: #@$)

u^:(3 <: #@$)

is that 0/1 form, and u does not get executed if 0?

Correct.


,/^:(2 -~ #@$)

is ,/^:n  (where n could be greater than 1)

on timex tests with input  (i. 1 2 3 7 4 5 2 3 3 4 5) all of the options are 
super close.

They are going to be close because they are creating self-virtual blocks which is very fast, with no data movement.



Bob's version (^:_) is probably the fastest for 3 shape counts.
Not so fast.

   NB. Create an inplaceable array
   7!:2 '2 2 2 100 100 ?@$ 0'
1049792

   NB. Now let's combine the first 4 axes:
   7!:2 ',/^:(2< #@$)^:(_) 2 2 2 100 100 ?@$ 0'
1051712
   7!:2 '4 (((*/@{. , }.) $) ($,) ]) 2 2 2 100 100 ?@$ 0'
1051840

   NB. Which takes less space?

   NB. Are you sure?

   7!:2 'a =. ,/^:(2< #@$)^:(_) 2 2 2 100 100 ?@$ 0'
2100160
   7!:2 'a =. 4 (((*/@{. , }.) $) ($,) ]) 2 2 2 100 100 ?@$ 0'
1052224

Surprised?

   7!:2 'a =. ,/^:(2 -~ #@$) 2 2 2 100 100 ?@$ 0'
1051648

u^:_ cannot run inplace, because each input to u must be saved for comparison with the result.  Thus, the operation produces virtual blocks, but not self-virtual blocks, which means that when the result is assigned to a name (or boxed) the value must be realized.

u^:n for finite n CAN run inplace, and when u is ,/ it produces a self-virtual block, which can be assigned without being realized.

[a self-virtual block is a virtual block that can be written on top of its backing block, because the backing block is inplaceable and the new shape is no longer than the old.  (,/ y) creates a self-virtual block, as does (1000 {. i. 1024) .]

Henry Rich








On Sunday, May 24, 2020, 12:59:07 p.m. EDT, Henry Rich <[email protected]> 
wrote:





Counting comparisons is SO not the right way to look at J.  The
interpreter is doing much computation behind the scenes.  Here, in the
original interpreter, executing u^:v causes v to be executed to create a
noun n; then u^:n is reinterpreted as a conjunction to produce a verb;
then that verb gets executed.  I modified this to avoid the
reinterpretation if v produces atomic 0 or 1. Meanwhile, what really
makes a difference is whether the result will be a virtual block or, if
possible, an in-place (self-virtual) block.  This difference will show
up if you assign the result.

It turns out that, because of some recent rewriting, ,/^:(2 -~ #@$)^:(3
<: #@$) does execute ,/ inplace, and ,/ does produce a self-virtual
block, twice, and so this idiom takes not much more space than

2 (((*/@{. , }.) $) ($,) ]) y

which is how I would write it.

Counting cycles is quite difficult nowadays even when you are looking at
the assembler code; impossible from the J code unless you know the
internals.

Henry Rich



On 5/24/2020 10:45 AM, 'Pascal Jasmin' via Programming wrote:
to only "reduce" if rank 3 or higher, as Bob's version did

,/^:(2 -~ #@$)^:(3 <: #@$) i. 4 5

the advantage is only one comparison is needed if shape count is under 3, and 
exactly 2 comparisons if more than 2.








,/^:(2 -~ #@$) i. 1 2 3 4 5






On Saturday, May 23, 2020, 11:36:20 p.m. EDT, 'robert therriault' via Programming 
<[email protected]> wrote:





Hi Bill,

You could use this

,/^:(2< #@$)^:_

       $ ,/^:(2< #@$)^:_ i.  5
5
     $ ,/^:(2< #@$)^:_ i.  4 5
4 5
     $ ,/^:(2< #@$)^:_ i.  3 4 5
12 5
     $ ,/^:(2< #@$)^:_ i.  2 3 4 5
24 5
     $ ,/^:(2< #@$)^:_ i.  7 2 3 4 5
168 5

although Roger or Pascal may have something more elegant.

Cheers, bob

On May 23, 2020, at 20:09, bill lam <[email protected]> wrote:

Wow so simple!
Thanks Roger, Pascal.

Just curious, how to do rank-n to rank-2
where n>3


On Sun, May 24, 2020, 11:04 AM 'Pascal Jasmin' via Programming <
[email protected]> wrote:

,/ i. 3 4 5






On Saturday, May 23, 2020, 10:56:02 p.m. EDT, bill lam <
[email protected]> wrote:





I had a problem similar to that of the recent shape question,
a=. i. 3 4 5
to reshape to rank-2 array with trailing shape unchanged that is shape 12
5,
This works but difficult to remember
     (((*/@}: , {: )@: $) $ , ) i. 3 4 5
0  1  2  3  4
5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
25 26 27 28 29
30 31 32 33 34
35 36 37 38 39
40 41 42 43 44
45 46 47 48 49
50 51 52 53 54
55 56 57 58 59

     this can also work and easier to remember but Henry Rich said recently
that ]\ doesn't support virtual block yet.
     _5 ]\ ,i. 3 4 5
0  1  2  3  4
5  6  7  8  9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
25 26 27 28 29
30 31 32 33 34
35 36 37 38 39
40 41 42 43 44
45 46 47 48 49
50 51 52 53 54
55 56 57 58 59

Any suggestions of other ways to do it?
----------------------------------------------------------------------
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

Reply via email to