I think the data set is more likely to be responsible.  At any rate, the
difference in space consumption seems to be related to the associativity of
@: as opposed to the method for producing the complex numbers:

   (close2  ; closest ; closest1) P100
┌─────────────────────┬─────────────────────┬─────────────────────┐
│5.33397867 5.69812853│5.33397867 5.69812853│5.33397867 5.69812853│
│5.30566575 5.61628504│5.30566575 5.61628504│5.30566575 5.61628504│
└─────────────────────┴─────────────────────┴─────────────────────┘
   666 st&> 'close2 P100' ; 'closest P100' ; 'closest1 P100'
┌─────────────┬──────┬──────────────┬──────────┐
│close2 P100  │397824│0.00122518988 │487.409938│
├─────────────┼──────┼──────────────┼──────────┤
│closest P100 │659968│0.000985331435│650.287217│
├─────────────┼──────┼──────────────┼──────────┤
│closest1 P100│397824│0.00100182537 │398.550174│
└─────────────┴──────┴──────────────┴──────────┘
   close2
#~ +/@(= ([: <./ 0 -.~ ,))@:([: | -/~)@:(j./"1)

   closest
#~ +/@(= <./@:(0 -.~ ,))@:|@:(-/~)@:(1 0j1 +/ .*~ ])

   closest1
#~ +/@(= <./@:(0 -.~ ,))@:(|@:(-/~))@:(1 0j1 +/ .*~ ])




On Thu, Sep 17, 2015 at 1:07 PM, 'Pascal Jasmin' via Programming <
[email protected]> wrote:

> I'm running it on input size of 100 points.  amd platform might make a
> difference.
>
>
> ----- Original Message -----
> From: Jose Mario Quintana <[email protected]>
> To: Programming forum <[email protected]>
> Cc:
> Sent: Thursday, September 17, 2015 1:01 PM
> Subject: Re: [Jprogramming] An adverb for a loopy algorithm
>
> Are you running your timings comparison many times to make sure?  I do (666
> times).  Alternatively, are the relative timings affected significantly by
> the platform?
>
>
>    JVERSION
> Installer: j602a_win.exe
> Engine: j803/2014-10-19-11:11:11
> Library: 6.02.023
>
>    666 st&> 'closest P' ; 'close2 P' ; 'nnf P'
> ┌─────────┬─────┬──────────┬────────┐
> │closest P│23296│2.87491e_5│0.669738│
> ├─────────┼─────┼──────────┼────────┤
> │close2 P │15104│4.55035e_5│0.687284│
> ├─────────┼─────┼──────────┼────────┤
> │nnf P    │10240│7.21532e_5│0.738849│
> └─────────┴─────┴──────────┴────────┘
>    closest
> #~ +/@(= <./@:(0 -.~ ,))@:|@:(-/~)@:(1 0j1 +/ .*~ ])
>
>    close2
> #~ +/@(= ([: <./ 0 -.~ ,))@:([: | -/~)@:(j./"1)
>
>    nnf
> {~ ((0 1 + ] , i.) (#~ (<: i.@:#)))@:([: ; (i.L:0 <./@:;))@:([: }.
> <@:|@:({: - }:)\&:(j./"1))
>
>
>
> On Thu, Sep 17, 2015 at 11:40 AM, 'Pascal Jasmin' via Programming <
> [email protected]> wrote:
>
> > A variation on your version with the same speed (actually slightly slower
> > at 5th decimal) but smaller space
> >
> > close2 =: (#~ +/@(= [: <./ 0-.~,)@:([: | -/~)@:(j./"1))
> >
> >
> >
> >
> >
> > ----- Original Message -----
> > From: Jose Mario Quintana <[email protected]>
> > To: Programming forum <[email protected]>
> > Cc:
> > Sent: Thursday, September 17, 2015 10:23 AM
> > Subject: Re: [Jprogramming] An adverb for a loopy algorithm
> >
> > Let us compare the two siblings, closest and nearest_neighbors together
> > with its fixed version:
> >
> >    nnf=. nearest_neighbors f.  NB. Fixed version
> >
> >    closest
> > ] #~ +/@(= <./@:(0 -.~ ,))@:|@:(-/~)@:(1 0j1 +/ .*~ ])
> >    nnf
> > {~ ((0 1 + ] , i.) (#~ (<: i.@:#)))@:([: ; (i.L:0 <./@:;))@:([: }.
> > <@:|@:({: - }:)\&:(j./"1))
> >
> >    666 st&> 'closest P' ; 'nearest_neighbors P' ; 'nnf P'
> > ┌───────────────────┬─────┬─────────────┬───────────┐
> > │closest P          │23296│3.27532288e_5│0.763019217│
> > ├───────────────────┼─────┼─────────────┼───────────┤
> > │nearest_neighbors P│10624│7.30659274e_5│0.776252412│
> > ├───────────────────┼─────┼─────────────┼───────────┤
> > │nnf P              │10240│7.20269787e_5│0.737556262│
> > └───────────────────┴─────┴─────────────┴───────────┘
> >
> > The nearest_neighbors verbs are leaner but closest runs twice as fast on
> my
> > PC.
> >
> > They seem to produce the same results as long as there are no ties and
> > no repetitions; otherwise there are issues:
> >
> >    Q=. 0 ". every cutLF 0 : 0  NB. Tie
> > _1 _1
> > 0  1
> > 1  0
> > 1  1
> > )
> >
> >    R=.  0 ". every cutLF 0 : 0 NB. Repetition
> > _1 _1
> > _1 _1
> > 0  0
> > )
> >
> >    (closest ; nearest_neighbors ; nnf) P
> > ┌───────────────┬───────────────┬───────────────┐
> > │6.42201 5.83321│6.42201 5.83321│6.42201 5.83321│
> > │6.62593 6.08499│6.62593 6.08499│6.62593 6.08499│
> > └───────────────┴───────────────┴───────────────┘
> >    (closest ; nearest_neighbors ; nnf) Q
> > ┌───┬───┬───┐
> > │0 1│0 1│0 1│
> > │1 0│0 1│0 1│
> > │1 1│   │   │
> > │1 1│   │   │
> > └───┴───┴───┘
> >    (closest ; nearest_neighbors ; nnf) R
> > ┌─────┬─────┬─────┐
> > │_1 _1│_1 _1│_1 _1│
> > │_1 _1│_1 _1│_1 _1│
> > │ 0  0│     │     │
> > │ 0  0│     │     │
> > └─────┴─────┴─────┘
> >
> >
> > On Thu, Sep 17, 2015 at 1:38 AM, David Lambert <[email protected]>
> > wrote:
> >
> > > If your task is actually 2D, consider complex numbers.  This version
> > > performs better on the sample data P=:p
> > >
> > > nearest_neighbors =: {~ convert_to_index@:identify_minimum@:separation
> > >
> > > separation =: [: }. <@:|@:({: - }:)\&:(j./"1)
> > > identify_minimum =: [: ; (i.L:0 <./@:;)
> > > convert_to_index=:(0 1 + ] , i.) (#~ (<: i.@:#))
> > >
> > >    NB. examples by part
> > >    boxdraw_j_ 1
> > >
> > >    separation 4{.P
> > > +-------+---------------+-----------------------+
> > > |3.71611|6.01287 6.83522|1.30641 4.14391 7.31405|
> > > +-------+---------------+-----------------------+
> > >
> > >    identify_minimum separation 4{.P
> > > 1 2 0
> > >    convert_to_index identify_minimum separation 4{.P
> > > 0 3
> > >    nearest_neighbors 4{.P
> > > 6.42201 5.83321
> > > 6.00479 7.07121
> > >    nearest_neighbors P
> > > 6.42201 5.83321
> > > 6.62593 6.08499
> > >
> > >
> > >    NB. time & space
> > >    close=: 3 :'y #~ +/@(= [: <./ 0-.~,)+/"1 *: -"1/~y' NB. RDM
> > >    flose=:nearest_neighbors f.
> > >    999 timespacex"0 1 'close P',:'flose P'
> > > 9.15946e_5 39680
> > > 5.26036e_5 10240
> > >
> > > Date: Wed, 16 Sep 2015 19:49:56 +0000 (UTC)
> > >> From: "'Pascal Jasmin' via Programming"<[email protected]>
> > >> To: Programming Forum<[email protected]>
> > >> Subject: [Jprogramming] An adverb for a loopy algorithm
> > >> Message-ID:
> > >>         <
> [email protected]>
> > >> Content-Type: text/plain; charset=UTF-8
> > >>
> > >> finding the 2 closest points in a set, has a loopy algorithm of "for
> > each
> > >> point, compare it with all of the points to its right"
> > >>
> > >> p =: 0 ". every cutLF 0 : 0
> > >> 6.42201  5.83321
> > >> 3.15448  4.06327
> > >> 8.89456 0.352235
> > >> 6.00479  7.07121
> > >> 8.10462  9.19487
> > >> 9.63448  4.00534
> > >> 6.74378 0.791349
> > >> 5.56034  9.27039
> > >> 4.67282  8.45993
> > >> 0.301042   9.4069
> > >> 6.62593  6.08499
> > >> 9.0307  2.37372
> > >> 9.36324  1.80147
> > >> 2.67396  1.62207
> > >> 4.76667  1.94554
> > >> 7.43839  6.05369
> > >> )
> > >>
> > >
> > > ----------------------------------------------------------------------
> > > 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