> 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

Reply via email to