Edot504


e.i.1:
Improved
initial writing: 2004-08-18
last updated: 2005-04-21


The dyad e.i.1: (and others, see below) are now supported
by special code. These are similar to the dyads previously described in
J5.02 and J5.03.
A complete table of such dyads are as follows:

f i. 0:     i.&0@:f     first place where not x f y
f i. 1:   i.&1@:f   first place where x f y
f i: 0:   i:&0@:f   last place where not x f y
f i: 1:   i:&1@:f   last place where x f y
[: + / f   + /@:f   number of places where x f y
[: +./ f   +./@:f   x f y anywhere?
[: *./ f   *./@:f   x f y everywhere?
[: I.  f   I. @:f   indices where x f y
Notes:
    f is one of the verbs = ~: < <: > >: E. e.
    Special code is available only for Boolean, integer, floating point, literal,
and symbol arguments
    Special code is used only for atoms and lists if f is not e.
    If f is E. , special code only
for   E.i.1:  +/@:E.  +./@:E.  I.@:E.

Moreover, if f is e. and the right argument is fixed,
that is, (e.i.0:)&m , then that also is supported by special code.
(See details here.)

The following benchmarks demonstrate the improvement:

x=: 1e6 ?.@$ 1e6
y=: 1e3 ?.@$ 1e4
a=: 'abcdefghijklmnopqrstuvwxyz'
c=: a {~ 1e5 4 ?.@$ #a
d=: a {~ 1e4 4 ?.@$ #a
ts=: 6!:2 , 7!:2@]
ts 'Expression'
Expression    J 5.04     J 5.03    Ratio
x(e.i.1:)y 0.0000119 17664 0.0309512 5244160 2600.01 296.88
x(e.i:1:)y 0.0000123 17664 0.0308734 5244160 2509.46 296.88
x +/@:e. y 0.0027426 17792 0.0248151 2098496 9.05 117.95
x I.@e. y 0.0031021 4211648 0.0265907 2098112 8.57 0.50
 
c(e.i.1:)d 0.0002968 132352 0.0045880 656640 15.46 4.96
c(e.i:1:)d 0.0002963 132352 0.0046068 656640 15.55 4.96
c +/@:e. d 0.0032609 132480 0.0039788 263488 1.22 1.99
c I.@e. d 0.0033605 656320 0.0041747 263104 1.24 0.40