Did you read my examination of
#/.`(~...@])`(0 $~ >:@(>./)@])}~  (small-range)
Versus
[: <:@(#/.~) i.@>:@(>./) , ]  (large-range)
?
Basically what I got was about the same thing you have for nub: I used (# % 
>./), which is just about instantaneous, as a discriminator and got that you 
should use small-range when it is less than 1 and large-range when it is more 
than 1.
The speed increase is not gigantic here, and so choosing to use or not to use 
the two cases is probably not that important. 

I can substantiate my result on Boolean arrays, which is weird. It is pretty 
consistently as represented, averaging over 100 trials.
I am using 64-bit windows with a dual-core processor. Would any part of that 
make the difference?

Marshall



-----Original Message-----
From: [email protected] 
[mailto:[email protected]] On Behalf Of Roger Hui
Sent: Monday, September 06, 2010 10:09 PM
To: Programming forum
Subject: Re: [Jprogramming] Mask from list of indices with multiplicity

Candidates for special code are legion.  One often has to exercise judgment, 
sometimes arbitrary judgment, in whether some particular special code is worth 
it.  In this particular case 

- The general expression #/.~ already has special code and is already pretty 
fast.
- It is not acceptable to slow down the general case too much in order to 
detect a special case, in this case to detect that the result is going to be 
boolean.

I can not reproduce the timings posted in one of your earlier msgs:

> On the Boolean case, which I would consider the most important, ([: 
> <:@(#/.~) i.@>:@(>./) , ]) is not optimal:
> 
>    a=.0.1> 100000 ?...@$ 0
>    ia=.I. a
>    6!:2 '([: <:@(#/.~) i.@>:@(>./) , ]) ia'
> 0.00682521
>    6!:2 '(e.~ i.@>:@(>./)) ia'
> 0.002004
>    6!:2 '1 ia} (0 $~ >:@(>./)) ia'
> 0.000679754

What I got instead is:

   a=.0.1> 100000 ?...@$ 0
   ia=.I. a
   10 timer '([: <:@(#/.~) i.@>:@(>./) , ]) ia'
0.00639606
   10 timer '(e.~ i.@>:@(>./)) ia'
0.00181928
   10 timer '1 ia} (0 $~ >:@(>./)) ia'
0.00160842

The last two times are what I'd expect, approximately equal, because the way e. 
on such integers is implemented is basically the "amend" method.

Allow me to pose a interesting problem in this regard.
Several important functions in J (sort, i.) have fast implementations if the 
argument are "small range integers".

   x=: 1e6 ?...@$ 2e9        NB. large range
   10 timer 'i.~x'
0.106972
   10 timer '/:~x'
0.0685986

   y=: 1e9 + 1e6 ?...@$ 1e5  NB. small range
   10 timer 'i.~y'
0.0197962
   10 timer '/:~y'
0.0209372

It is therefore important to be able to detect inexpensively (in C) when 
something is small range.  
So that is the interesting problem.  (It is not a hard problem.)

For a related puzzle, see:
http://www.jsoftware.com/jwiki/Essays/Index%20in%20Nub



----- Original Message -----
From: Marshall Lochbaum <[email protected]>
Date: Monday, September 6, 2010 9:55
Subject: Re: [Jprogramming] Mask from list of indices with multiplicity
To: 'Programming forum' <[email protected]>

> The tolerance thing is a problem... you might be able to solve it with 
> a weird construct like I.!.(tol)^:_1!.(universe) y.
> I think this would be the same as
> 
>    (universe) (3 :0)"1 y
> ($:~ i.@>:@(>./)) y
> :
> (universe) <:@(#/.!.(tol))@, y
> )
> 
> Where universe and tol are optional. As for the domain problem with 
> I.^:_1, I. has the same problem in that it only works on numerics, so 
> it is properly reflective of the inverse, and
> I.^:_1 I. is always the identity minus trailing zeros (which can be 
> added back with ($ $!.0 I.^:_...@i.).
> 
> I agree that #/.~ is fast, but for arrays that were Boolean before I. 
> (ie. now return 1 for (-:~.)) the amend method is about 10 times 
> faster.
> Also,
> #/.`(~...@])`(0 $~ >:@(>./)@])}~
> Is a candidate that works the same as the original but is faster for 
> more sparse arrays. However, it only works if we assume a numeric 
> universe. That can probably be fixed--I'll get back to it later.
> 
> Marshall
> 
> -----Original Message-----
> From: [email protected] [mailto:programming- 
> [email protected]] On Behalf Of Henry Rich
> Sent: Monday, September 06, 2010 11:35 AM
> To: Programming forum
> Subject: Re: [Jprogramming] Mask from list of indices with 
> multiplicity Allowing !. to change the universe is an interesting 
> idea, but wouldn't !. be needed in its usual role of tolerance, since 
> there are implied comparisons in the operation?
> 
> 
> Also, your Ii works only on numeric operands, while
> 
> universe   <:@(#/.~)@,  y
> 
> works on all types (and shapes).
> 
> 
> Since the key part,   #/.~  , is already fast, I think that nothing 
> more is really needed.  This is a matter of taste.
> 
> Henry Rich
> 
> 
> 
> 
> Henry Rich
> 
> On 9/6/2010 10:06 AM, Marshall Lochbaum wrote:
> > The only way I. I.^:_1 changes x is that it sorts it, and
> I.^:_1 I. only cuts out the trailing 0s:
> >     Ii=. ([:<:@(#/.~) i.@>:@(>./) , ])
> >     (; (;Ii)@I.) 1...@$2
> > ┌───────────────────┬───────────┬─────────────────┐
> > │1 1 1 0 0 1 1 0 1 0│0 1 2 5 6 8│1 1 1 0 0 1 1 0 1│  
> >└───────────────────┴───────────┴─────────────────┘
> >     (; (;I.)@Ii) 6...@$10
> > ┌───────────┬─────────────────┬───────────┐
> > │0 0 8 6 6 3│2 0 0 1 0 0 2 0 1│0 0 3 6 6 8│  
> >└───────────┴─────────────────┴───────────┘
> >
> > I think each of these cases is acceptable, especially if you
> allow !. to change the universe (this removes the I.^:_1 I. problem).
> >
> > Marshall
> >
> >
> > -----Original Message-----
> > From: [email protected] 
> > [mailto:[email protected]] On Behalf Of Roger Hui
> > Sent: Monday, September 06, 2010 2:26 AM
> > To: Programming forum
> > Subject: Re: [Jprogramming] Mask from list of indices with 
> > multiplicity
> >
> > I.^:_1 seems too far from what<:#/.~universe,x does.
> > Another way to say that is that I. I.^:_1 x can bear scant
> resemblance to x .
> >
> >
> >
> > ----- Original Message -----
> > From: Zsbán Ambrus<[email protected]>
> > Date: Sunday, September 5, 2010 14:21
> > Subject: Re: [Jprogramming] Mask from list of indices with 
> > multiplicity
> > To: Programming forum<[email protected]>
> >
> >> On Sun, Sep 5, 2010 at 10:57 PM, Roger
> Hui<[email protected]>  wrote:
> >>>    <: #/.~ (i.7) ,x
> >>
> >> Nice solution.
> >>
> >>> ----- Original Message -----
> >>> From: Zsbán Ambrus<[email protected]>
> >>>> Would it make
> >>>> sense if I.^:_1 did this?
> >>
> >> ^^^ What's your opinion on this?
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to