[Jprogramming] Proposal for a new table adverb

David Lambert b49p23tivg at gmail.com
Thu Jul 5 02:47:21 UTC 2018


Thank you Raul for response.  This optimization can be implemented as a 
customized table
with computational time saving of a factor of 2.  Does the pattern occur 
often enough to be worthwhile?
Is a factor of 2 sufficient to trouble with?
I forget Roger's rule, he took care to change the source if the savings 
were a factor of 10, or a factor of 2 or greater?

NB. CustomTable u/!.n  for n is 0 or 1

CustomTable =: conjunction define
  NB. insert is unaffected
  u/ y
:
  NB. customized table   u/!.n
  x ((<:`<@.n)/&:(i.@:#) * u/) y
)


Where n is n of the conjunction,
instead of for (i=0;i<N;++i) for (j=0;j<m;++j) statement;
we implement for (i=0;i<N;++i) for (j=i+n;j<m;++j) statement;
The remainder of the table is filled.

Here's an example.

NB. r finds the radius of the intersection of n-spheres
NB. x (r -: r~) y
r=: radius@:[ -&.:*: ex

radius=: {:
coordinate=: }:
length=: +/&.:*: :($:@:-)
d=: length&:coordinate
ex=: ((+*-)&:radius + *:@:d)%(+:@:d)


TESTS=:((4#10)#:".);._2]0 :0
  1111 1454  NB. tangent 3 4 5 triangle
     1   11  NB. normal contact
     1   31  NB. not touching
     1    2  NB. enclosed
)

assert '0 0.866025 0j1.11803 0j_' -: ": r/"2 TESTS


    r"1 CustomTable 1~ ~. ,/ TESTS
0 0       0.5  0.707107 0j0.707107         1
0 0 0j1.82737 0j1.20605   0.755929 0j1.16496
0 0         0  0.866025  0j1.11803       0j_
0 0         0         0          0         0
0 0         0         0          0         0
0 0         0         0          0         0


    NB. r is a horrible monster
    r f.
{:@:[ -&.:*: ((+ * -)&:{: + *:@:(3 : '+/&.:*: :($:@:-) y' :(4 : 'x 
+/&.:*: :($:@:-) y')&:}:)) % +:@:(3 : '+/&.:*: :($:@:-) y' :(4 : 'x 
+/&.:*: :($:@:-) y')&:}:)

Preselecting the argument pairs is an alternative with  2 combinations # 
SPHERES

> Date: Fri, 29 Jun 2018 12:34:09 -0400
> From: Raul Miller<rauldmiller at gmail.com>
> To: Programming forum<programming at jsoftware.com>
> Subject: Re: [Jprogramming] Proposal for a new table adverb
> Message-ID:
> 	<CAD2jOU8O7bjBM2uRkTD5fTDX9a6bahQ_h8zUyw82wWejBK=bhQ at mail.gmail.com>
> Content-Type: text/plain; charset="UTF-8"
>
> Here's a tentative implementation of part of what I think you have described:
>
> commute=:3 :0
>    assert.2=#$y
>    assert.=/$y
>    assert. 0={.u b. 0
>    mask=. <:/~i.#y
>    inds=. (>. |:)mask*i.$y
>    inds{u mask #&, y
> )
>
> That said, I don't think this would work for you - this winds up
> testing each item independently so there's no comparison involved.
>
> Perhaps you could flesh out an example to better show what you mean?
>
> Thanks,
>
> -- Raul On Fri, Jun 29, 2018 at 12:04 PM David Lambert 
> <b49p23tivg at gmail.com> wrote:
>> I have an equality test.  If a=b then b=a .  (In my case "find overlapping
>> spheres", in other words the equality test may be non-trivial.)  The new
>> adverb would compute only the upper triangular set of cases and thereby
>> save about half the time.
>>
>>     NB. assuming the main diagonal could be interesting
>>     NB. the new adverb would compute these cases
>>     <:/~ i.7
>> 1 1 1 1 1 1 1
>> 0 1 1 1 1 1 1
>> 0 0 1 1 1 1 1
>> 0 0 0 1 1 1 1
>> 0 0 0 0 1 1 1
>> 0 0 0 0 0 1 1
>> 0 0 0 0 0 0 1
>> ----------------------



More information about the Programming mailing list