Refactoring can sometimes help with performance.

   100 timespacex  '5 (4 : ''C'' + 4 : ''C'' + 4 : ''C'' + * 3 : ''C=:  y''@:+
***) >: i.1000'
5.61938e_5 63360
   100 timespacex '(20*0 1 5 p. ]) >:i.1000'
4.43239e_5 35456

Note also, though, that on modern machines anything less than a factor of 2
can easily be noise:

   100 timespacex '(20*0 1 5 p. >:)i.1000'
2.70369e_5 35456
   100 timespacex '(20*0 1 5 p. ]) >:i.1000'
5.04946e_5 35456
   100 timespacex '(20*0 1 5 p. ]) >:i.1000'
4.46189e_5 35456
   100 timespacex '(20*0 1 5 p. ]) >:i.1000'
4.50423e_5 35456
   100 timespacex '(20*0 1 5 p. >:)i.1000'
4.41571e_5 35456

Performance can be a useful metric, but sometimes it's best to not take it
too seriously.

Thanks,

-- 
Raul


On Thu, Mar 20, 2014 at 12:35 PM, Pascal Jasmin <[email protected]>wrote:

> There is a performance advantage to this approach as well:
>
>    100 timespacex  '5 ((* + ***) + (* + ***) + (* + ***) + * + ***) >:
> i.1000'
> 2.937e_5 55040
>    100 timespacex  '5 ((* + ***) + (* + ***) + (* + ***) + * +M. ***) >:
> i.1000'
> 3.071e_5 59904
>    100 timespacex  '5 (4 : ''C'' + 4 : ''C'' + 4 : ''C'' + * 3 : ''C=:
>  y''@:+ ***) >: i.1000'
> 2.5e_5 63232
>
>
> the 2nd line uses M. which doesn't seem to create an improvement in this
> case.
>
>
> ----- Original Message -----
> From: Pascal Jasmin <[email protected]>
> To: "[email protected]" <[email protected]>
> Cc:
> Sent: Thursday, March 20, 2014 11:23:38 AM
> Subject: Re: [Jprogramming] intermediate tacit result assignments
>
> oh...
>
>       5    (4 :'C'+[4 :'C =: x * y'])13
> 130
>
> a  quirk in the approach is that you need to be careful with the get as 3
> : or 4 :
>
> Here is an alternate version of fset (dyad only)
>
> fset =: 3 : 'C=:  y'
>
>    5 (4 : 'C' +  fset@:* ) 13 2
> 130 20
>    C
> 65 10
>
>    5 (4 : 'C' + [ fset@* ] ) 13 2
> 75 20
>    C
> 10
>
> using names are optional: parens not required for using inline :
>   5 (fget + [  3 : 'C=:  y' @:* ] ) 13 2
> 130 20
>
> Just as the above definition is equivalent to (*+*)
>
>    5 (fget + * fset@:+ ***) 13 2
> 8580 220
>
> is equivalent to:
>
>    5 ((* + ***) + * + ***) 13 2
> 8580 220
>
>    5 (4 : 'C' + * 3 : 'C=:  y'@:+ ***) 13 2
> 8580 220
>
>
>
> ----- Original Message -----
> From: Linda Alvord <[email protected]>
> To: [email protected]
> Cc:
> Sent: Thursday, March 20, 2014 10:55:09 AM
> Subject: Re: [Jprogramming] intermediate tacit result assignments
>
> In my example,   13 was not the domain error, rather  5 f 13  was.
>
> Linda
>
> -----Original Message-----
> From: [email protected] [mailto:
> [email protected]] On Behalf Of Pascal Jasmin
> Sent: Thursday, March 20, 2014 7:45 AM
> To: [email protected]
> Subject: Re: [Jprogramming] intermediate tacit result assignments
>
> f 13 is a domin error bc f is dyadic ( 4 : ...)
>
> usually the fork ([ f ]) 13 is equivalent to f 13, but the one difference
> is that though x[ y is x, ] y(monadic) is y.  So ([ f ]) 13 is 13 f 13
> instead of domain error.
>
> > Be careful as C may be using an earlier value.
>
> The point of the exercise was to always set that value.  Your h function
> does not set C.
>
> A simpler version of the example
>
> fget =: 4 : 'C'
> fset =: 4 : 'C =: x * y'
>   2 (fget + fset) 3
> 12
>
>
> ----- Original Message -----
> From: Linda Alvord <[email protected]>
> To: [email protected]
> Cc:
> Sent: Thursday, March 20, 2014 5:34:16 AM
> Subject: Re: [Jprogramming] intermediate tacit result assignments
>
> Here’s how I studied you example.
>
>
>     (3 : 'C' + [ 4 : 'C =: x * y' ] ) 13
> 338
>    f=: 4 : 'C =: x * y'
>    NB.f 13   result is domain error
>    g=: 4 : 'C =: x * y']
>    g 13
> 169
>    C
> 169
>    g=: 4 : 'C =: (A=:x) * y']
>    erase 'C'
> 1
>    g 13
> 169
>    C
> 169
>    A
> 13
>    (3 : 'C' + [ 4 : 'C =: x * y' ] ) 13
> 338
>    h=: 13 : 'C' + [ 4 : 'C =: x * y' ]
>    erase 'C'
> 1
>    h 13
> 338
>    h
> 169"_ + [ 4 : 'C =: x * y' ]
>    C
> 169
>    erase 'C'
> 1
>    5 (3 : 'C' + [ 4 : 'C =: x * y' ] ) 13
> |domain error
> |   5    (3 :'C'+[4 :'C =: x * y'])13
> |[-18]
>    C
> 65
>
> Be careful as C may be using an earlier value.
>
> Linda
>
>
> -----Original Message-----
> From: [email protected] [mailto:
> [email protected]] On Behalf Of km
> Sent: Tuesday, March 18, 2014 5:53 PM
> To: [email protected]
> Subject: Re: [Jprogramming] intermediate tacit result assignments
>
> Have a look at the diagrams for Hook and Fork in
>
> http://www.jsoftware.com/docs/help801/dictionary/dictf.htm
>
> --Kip Murray
>
> Sent from my iPad
>
> > On Mar 18, 2014, at 2:15 PM, Pascal Jasmin <[email protected]>
> wrote:
> >
> > to be clear, I am in no way asking for how to double a product.
> >
> > what the function is actually equivalent to, though is: (*+*)
> >
> > What seems interesting about the function is it is doing something I
> previously thought was impossible.  Saving and reusing intermediate (noun)
> results in a tacit function.
> >
> > It behaves as expected, though I am only concerned about not hitting
> domain errors, and that the intermediate assignment is picked up when
> trying to retrieve it.  The expression is meant to be as simple as possible
> other than the title's feature.
> >
> >
> >
> > ----- Original Message -----
> > From: Raul Miller <[email protected]>
> > To: Programming forum <[email protected]>
> > Cc:
> > Sent: Tuesday, March 18, 2014 2:37:26 PM
> > Subject: Re: [Jprogramming] intermediate tacit result assignments
> >
> > Here's another function which achieves that end:
> >
> > test9=: 2 * *
> >
> > One interesting thing though, when comparing different expressions which
> > accomplish the same end, has to do with how their components can be used
> > differently.
> >
> > And there's something to be said for having a wide variety of components.
> > (Not all of those things to be said are good things, though some are.)
> >
> > But consider, for example:
> >
> >    1 2 3 (4 : 'c' + 4 : 'c =: x * y')"2 p:i.3 3
> >   4   6  10
> > 28  44  52
> > 102 114 138
> >    c
> > 2  3  5
> > 14 22 26
> > 51 57 69
> >    1 2 3 (4 : 'c' + 4 : 'c =: x * y')"1 p:i.3 3
> > 4 12  30
> > 14 44  78
> > 34 76 138
> >    c
> > 17 38 69
> >    1 2 3 (4 : 'c' + 4 : 'c =: x * y')"0 p:i.3 3
> >   4   6  10
> > 28  44  52
> > 102 114 138
> >    c
> > 69
> >
> > Is that how you expected it to behave?
> >
> > (Notice, in particular, how the "off-diagonal" elements for your
> expression
> > at rank 1 are different from those of the same expression at rank 0 and
> > rank 2. There's a simple explanation for this, but - like most
> realizations
> > - it's only obvious in retrospect.
> >
> > Thanks,
> >
> > --
> > Raul
> >
> >
> >
> >
> > On Tue, Mar 18, 2014 at 1:47 PM, Pascal Jasmin <[email protected]
> >wrote:
> >
> >> interesting function, Raul, but not quite what I was doing:
> >>
> >>     test8 =: 4 : 'c' + [ 4 : 'c =: x * y' ]
> >>
> >> function simply multiplies x and y and then doubles result.  Its a 5
> >> element train where the : conjunctions makes single train elements.
> The
> >> point is doing this with potntial side effects and saved intermediate
> >> results, which has escaped my previous attempts at such possibilities.
> >>   Rank modification is relatively easy, though may require parens.
> >>
> >> perhaps clearer with parens:  (4 : 'c') + [ (4 : 'c =: x * y') ]
> >>
> >>     2 test8 3
> >> 12
> >>     c
> >> 6
> >>     2 test8 3 2 1
> >>
> >> 12 8 4
> >>     c
> >> 6 4 2
> >>
> >>
> >> ________________________________
> >> From: Raul Miller <[email protected]>
> >> To: Programming forum <[email protected]>
> >> Sent: Tuesday, March 18, 2014 1:25:32 PM
> >> Subject: Re: [Jprogramming] intermediate tacit result assignments
> >>
> >>
> >> It's not clear to me what you want to accomplish here - no sample data,
> no
> >> results. Also note that while this is, in a sense, tacit, you'll get
> some
> >> ... interesting (and probably unintended) behaviors if you try using
> your 3
> >> : and/or 4 : verbs with rank.
> >>
> >> I've got some code I'm working on which uses variables in a tacit
> >> expression. Here's an example:
> >>
> >> mergetable=:2 :0
> >> :
> >>    tinds=. 1+i.#m
> >>    ginds=. -1+i.#n
> >>    tlen=. {:@$x
> >>    glen=. {:@$y
> >>    mergecol=. [:`tonly`both`gonly@.(3&#.@:*)
> >>    tget=. {&x@<:@{.@(#~ 0&<)
> >>    gget=. {&y@<:@|@{.@(#~ 0&>)
> >>    tnul=. (tlen#a:)"_
> >>    gnul=. (glen#a:)"_
> >>    tonly=. tget,gnul
> >>    gonly=. tnul,gget
> >>    both=. tget,gget
> >>    (m,n) mergecol/. tinds,ginds
> >> )
> >>
> >> Example use:
> >>
> >>     (i. 4 3) (;:'this is a test') mergetable (;:'that is not like
> >> this')&:(]each) p:i.5 2
> >> ┌─┬──┬──┬──┬──┐
> >> │0│1 │2 │23│29│
> >> ├─┼──┼──┼──┼──┤
> >> │3│4 │5 │5 │7 │
> >> ├─┼──┼──┼──┼──┤
> >> │6│7 │8 │  │  │
> >> ├─┼──┼──┼──┼──┤
> >> │9│10│11│  │  │
> >> ├─┼──┼──┼──┼──┤
> >> │ │  │  │2 │3 │
> >> ├─┼──┼──┼──┼──┤
> >> │ │  │  │11│13│
> >> ├─┼──┼──┼──┼──┤
> >> │ │  │  │17│19│
> >> └─┴──┴──┴──┴──┘
> >>     ~.;:'this is a test that is not like this'
> >> ┌────┬──┬─┬────┬────┬───┬────┐
> >> │this│is│a│test│that│not│like│
> >> └────┴──┴─┴────┴────┴───┴────┘
> >>
> >> In other words, this addresses the problem of "given two tables with
> >> different column headers, build a bigger table with combined headers and
> >> all the rows from each table."
> >>
> >> I put the table on its side (so columns are J items), but the
> interesting
> >> thing, here, is that I am using numeric indices to refer to external
> data.
> >> You'd want to transpose the table to show rows and columns more
> >> traditionally. (I'm using boxes here because "in real life" I am working
> >> with text rather than numbers.)
> >>
> >> This particular example allowed me to use (in this case) J's /. adverb
> >> without actually asking it to manipulate the data which I am grouping
> >> together. (Though in this particular example, I've brought everything
> >> together in the final result - this let me use J's error detection
> features
> >> in a way which would not have worked if I had left the data in external,
> >> "explicit" contexts.)
> >>
> >> Thanks,
> >>
> >> --
> >> Raul
> >>
> >>
> >>
> >>
> >> On Tue, Mar 18, 2014 at 12:26 PM, Pascal Jasmin <[email protected]
> >>> wrote:
> >>
> >>> Here is a neat way to get intermediate results within a tacit
> expression.
> >>>   Many drawbacks, but it is possible.  Drawbacks include global
> variables,
> >>> and dyad vs. monad must be known prior to access:
> >>>
> >>> 3 : 'c' + [ 4 : 'c =: x * y' ]
> >>>
> >>> That may not look very tacit, but it is :P  intermediate result c is
> >>> accessed later in the fork.
> >>>
> >>> the biggest drawback is accessing the result (3 : 'c')  If the access
> is
> >>> in a dyadic part of the expression, it needs to be (4 : 'c')
> >>>
> >>> Any improvements?
> >>> ----------------------------------------------------------------------
> >>> 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
> ----------------------------------------------------------------------
> 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