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
