> I was not thinking about performance when I was rewriting them but theseare
>the numbers I get...
I tried making a version with @. to see, and this compiles
if =. (`])(@.([: -. ".&'flag1_z_'"_)) NB. same results as @: replacing capped
fork below
and looks right with
+: if
+:`]@.(-.@:".&'flag1_z_'"_)
but:
+: if i.20
|rank error
| +:if i.20
and:
+: if("0) i.20
|index error
| +:if("0)i.20
I don't understand the reason for either error.
----- Original Message -----
From: Jose Mario Quintana <[email protected]>
To: [email protected]
Cc:
Sent: Sunday, September 15, 2013 11:10:42 PM
Subject: Re: [Jgeneral] Bug in adverb define
I was not thinking about performance when I was rewriting them but these
are the numbers I get...
NB.Performance
st=. 7!:2@:] ; 6!:2
NB. Explicitly...
controlA_z_ =: 1 : 0
flag1_z_ =: 1
o=. u y
flag1_z_ =: 0
o
)
ifC=: 1 : 'if. flag1_z_ do. u y else. y end.'
( test=: +: ifC )
+: (1 : 'if. flag1_z_ do. u y else. y end.')
( test"0 controlA )
(test"0) (1 : 0)
flag1_z_ =: 1
o=. u y
flag1_z_ =: 0
o
)
10 st 'test"0 i.100000' NB. 8794368 is very puzzling!
┌───────┬────────┐
│8794368│0.249716│
└───────┴────────┘
10 st 'test"0 controlA i.100000'
┌───────┬────────┐
│1052544│0.249951│
└───────┴────────┘
10 st 'test controlA"0 i.100000'
┌───────┬────────┐
│1052544│0.583864│
└───────┴────────┘
test"0 i.10
0 1 2 3 4 5 6 7 8 9
test"0 controlA i.10
0 2 4 6 8 10 12 14 16 18
test controlA"0 i.10
0 2 4 6 8 10 12 14 16 18
NB. Tacitly...
ifC=. ^: (". @: ('flag1_z_'"_))
( test=: +: ifC )
+:^:(".@:('flag1_z_'"_))
controlA_z_=. (`'' (&,) (@:(,&<)) ((([ ".@:('flag1_z_=:
0'"_))@:((((<'`:') (0:`)(,^:)&6))@:(0&{ , <@:((,'0') ,&< ])@:(1&{::)))@:([
".@:('flag1_z_=: 1'"_)))@:))
( test"0 controlA )
((([ (".@:('flag1_z_=: 0'"_)))@:(((,^:((0:)``:))&6)@:((0&{) , ((<@:((,'0')
(,&<) ]))@:(1&({::))))))@:([ (".@:('flag1_z_=:
1'"_))))@:(((,<(<,'"'),<(<'test'),<(,'0');0)&,)@:(,&<))
10 st 'test"0 i.100000'
┌───────┬────────┐
│1050560│0.120329│
└───────┴────────┘
10 st 'test"0 controlA i.100000'
┌───────┬────────┐
│1576832│0.124354│
└───────┴────────┘
10 st 'test controlA"0 i.100000'
┌───────┬───────┐
│1052416│0.71766│
└───────┴───────┘
test"0 i.10
0 1 2 3 4 5 6 7 8 9
test"0 controlA i.10
0 2 4 6 8 10 12 14 16 18
test controlA"0 i.10
0 2 4 6 8 10 12 14 16 18
On Sun, Sep 15, 2013 at 5:47 PM, Pascal Jasmin <[email protected]>wrote:
> btw, your tacit definition of ifC (and test) is twice as fast as the
> explicit one when applied to 0 cells.
>
> 10 ts 'test1"0 controlA i.100000' -- tacit ^: (". @: ('flag1_z_'"_))
> 7.74526/sec 2.10483MB
> 10 ts 'test"0 controlA i.100000' -- explicit 1 : 'if. flag1_z_ do. u
> y else. y end.'
> 4.18765/sec 2.10598MB
> 10 ts 'test1"0 i.100000'
> 8.76733/sec 2.10099MB
> 10 ts 'test"0 i.100000'
>
> 4.11696/sec 16.5399MB
>
> I assume that it is because the if. structure is just slower rather than
> the J engine not being able to peek inside. The explicit version is 50%
> faster on "_ rank though, probably because the explicit one is evaluated
> once. The tacit version of controlA seems slower than the explicit one,
> probably because it does so much.
>
>
>
> ----- Original Message -----
> From: Jose Mario Quintana <[email protected]>
> To: [email protected]
> Cc:
> Sent: Sunday, September 15, 2013 2:01:20 PM
> Subject: Re: [Jgeneral] Bug in adverb define
>
> > An improvement I'm not sure is possible would be to modify controlA
> and/or
> > ifC to not access y, ie. be tacit.
>
> Sure it is; as far as I know, an explicit adverb (or verb) always can be
> rewritten tacitly, in theory.
>
>
> controlA_z_ =: 1 : 0
> flag1_z_ =: 1
> o=. u y
> flag1_z_ =: 0
> o
> )
>
> ifC=: 1 : 'if. flag1_z_ do. u y else. y end.'
>
> ( test=: +: ifC )
> +: (1 : 'if. flag1_z_ do. u y else. y end.')
>
> test controlA a=. 1 2 3
> 2 4 6
> test a=. 1 2 3
> 1 2 3
>
> test@:(+/%#) 1 2 3
> 2
> test@:(+/%#) controlA 1 2 3
> 4
> test (+/%#) controlA 1 2 3
> 2
>
>
> In practice, it can be easy,
>
> ifC=. ^: (". @: ('flag1_z_'"_))
>
> ( test=: +: ifC )
> +:^:(".@:('flag1_z_'"_))
>
> or it can be difficult but not nearly as difficult as it should be (so to
> speak),
>
>
> Force=. (0:`)(,^:) NB. May the Force be with you
> train=. (<'`:') (Force (&6))
> an=. <@:((,'0') ,&< ]) NB. Atomizing a noun
> core=. ([ ".@:('flag1_z_=: 0'"_))@:(train@:(0&{ , an@:(1&{::)))@:([
> ".@:('flag1_z_=: 1'"_))
>
> controlA=. `'' (&,) (@:(,&<)) (core@:) NB. A train of adverbs
>
> test controlA a=. 1 2 3
> 2 4 6
> test a=. 1 2 3
> 1 2 3
>
> test@:(+/%#) 1 2 3
> 2
> test@:(+/%#) controlA 1 2 3
> 4
> test (+/%#) controlA 1 2 3
> 2
>
> controlA=. (`'' (&,) (@:(,&<)) ((([ ".@:('flag1_z_=: 0'"_))@:((((<'`:')
> (0:`)(,^:)&6))@:(0&{ , <@:((,'0') ,&< ])@:(1&{::)))@:([ ".@:('flag1_z_=:
> 1'"_)))@:))
> NB. The adverb as a long self-contained one-liner (fixed manually to
> avoid the linear representation bug)
>
> test controlA a=. 1 2 3
> 2 4 6
> test a=. 1 2 3
> 1 2 3
>
> test@:(+/%#) 1 2 3
> 2
> test@:(+/%#) controlA 1 2 3
> 4
> test (+/%#) controlA 1 2 3
> 2
>
> On Fri, Sep 13, 2013 at 2:19 PM, Pascal Jasmin <[email protected]
> >wrote:
>
> > Thanks very much.
> >
> > In terms of usefulness,
> > ifC=: 1 : 'if. flag1_z_ do. u y else. y end.'
> > pD =: smoutput ifC
> > test=: +: ifC
> >
> > test controlA a=. 1 2 3
> > 2 4 6
> > test a=. 1 2 3
> > 1 2 3
> >
> > The pD verb can produce verbose output for debugging only when asked.
> >
> > 2 points to a single line:
> > 1. eliminates 11 lines of irritating clutter that I don't want to see.
> > 2. If I or someone else copies just the definition without the
> > initialization variable into a new project, in someone's lifetime, I/they
> > will get a domain error, and will either hate the function or their lives
> > because of it. I might make this error more likely to occur by
> > inadvertantly inserting code between the function and the initialization.
> >
> > An improvement I'm not sure is possible would be to modify controlA
> and/or
> > ifC to not access y, ie. be tacit.
> >
> > ----- Original Message -----
> > From: Raul Miller <[email protected]>
> > To: General forum <[email protected]>
> > Cc:
> > Sent: Friday, September 13, 2013 1:25:06 PM
> > Subject: Re: [Jgeneral] Bug in adverb define
> >
> > It's not at all clear to me why doing this kind of thing on "one line"
> > is useful.
> >
> > That said, this example of yours:
> >
> > flag1_z_ =: 0 [ controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u
> > y';'flag1_z_ =: 0';'o')
> >
> > has this grammar:
> >
> > name =: noun verb name =: noun conjunction noun
> >
> > Which, simplifies to
> >
> > name =: noun verb adverb
> >
> > In other words, you are executing controlA with u defined as [ which
> > then simplifies to
> >
> > name =: noun verb
> >
> > and that's just bad grammar. A simple transformation which would make
> > it grammatically correct would be:
> >
> > name =: verb noun
> >
> > and... projecting this back into your original sentence, it would become
> >
> > flag1_z_ =: ([ controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u
> > y';'flag1_z_ =: 0';'o')) 0
> >
> > However, since I have no idea what you are trying to accomplish, I
> > have no idea if this is relevant to your efforts.
> >
> > FYI,
> >
> > --
> > Raul
> >
> > On Fri, Sep 13, 2013 at 1:09 PM, Pascal Jasmin <[email protected]>
> > wrote:
> > > thank you. I'm still not able to combine into one line (which IIUC can
> > be done with verb defines)
> > > flag1_z_ =: 0 [ controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u
> y';'flag1_z_
> > =: 0';'o')
> > >
> > >
> > > btw, The dyad version define is:
> > > (flag1_z_ =: 0) [ controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u
> > y';'flag1_z_ =: 0';'o';':';'flag1_z_ =: 1';'o=. x u y';'flag1_z_ =:
> 0';'o')
> > >
> > >
> > >
> > >
> > > ----- Original Message -----
> > > From: Don Guinn <[email protected]>
> > > To: General forum <[email protected]>
> > > Cc:
> > > Sent: Friday, September 13, 2013 12:18:34 PM
> > > Subject: Re: [Jgeneral] Bug in adverb define
> > >
> > > Need to add parens.
> > >
> > > controlA_z_ =: 1 : ('flag1_z_ =: 1';'o=. u y';'flag1_z_ =: 0';'o')
> > >
> > >
> > > On Fri, Sep 13, 2013 at 9:18 AM, Pascal Jasmin <[email protected]
> > >wrote:
> > >
> > >> The following in a script should work according to
> > >> http://www.jsoftware.com/help/dictionary/dicth.htm
> > >> flag1_z_ =: 0
> > >> controlA_z_ =: 1 : 'flag1_z_ =: 1';'o=. u y';'flag1_z_ =: 0';'o'
> > >>
> > >> It results in a syntax error script in J7. The syntax error can be
> > >> eliminated by changing 1 : to 3 :
> > >>
> > >> The adverb (and definition) works as a 4 line definition. Its purpose
> > is
> > >> to send control flags to a verb which changes its behaviour if called
> > with
> > >> the adverb. The importance of getting it on one line is that
> supporting
> > >> dyads would take a multiline definition 10 lines with the ending ),
> and
> > its
> > >> the type of utility function that can be cloned to control2A control3A
> > and
> > >> so, single line definitions are more reusable.
> > >>
> > >> The multiline version is:
> > >> controlA_z_ =: 1 : 0
> > >> flag1_z_ =: 1
> > >> o=. u y
> > >> flag1_z_ =: 0
> > >> o
> > >> )
> > >>
> > >> Ideally I'd like to be able to write a definition line such as:
> > >>
> > >> flag1_z_ =: 0 [ controlA_z_ =: 1 : 'flag1_z_ =: 1';'o=. u y';'flag1_z_
> > =:
> > >> 0';'o'
> > >>
> > >> (which does load if '1 :' changed to '3 :')
> > >> ----------------------------------------------------------------------
> > >> 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
>
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm