Hi all!

New thread.

Cheers,

Erling Hellenäs



-------- Forwarded Message --------
Subject:        Re: [Jprogramming] Partitions
Date:   Mon, 6 Nov 2017 13:20:31 -0500
From:   Raul Miller <[email protected]>
Reply-To:       [email protected]
To:     Programming forum <[email protected]>



Very nice.

This deserves its own thread though. And possibly a wiki entry.

Thanks,

--
Raul


On Mon, Nov 6, 2017 at 10:31 AM, Erling Hellenäs
<[email protected]> wrote:
Hi all!

I made a version of comb, which uses bitmaps.

   2 CombE 3
1 1 0
1 0 1
0 1 1
   (2 CombE 3) #"1 i.3
0 1
0 2
1 2

   ts'12 comb 24'
0.606316 9.02647e8
   ts'12 CombE 24'
0.202434 2.82336e8
   ts'35 comb 40'
1.39813 1.22167e9
   ts'35 CombE 40'
0.268998 1.53241e8

CombE=: 4 : 0
k=. <"1 (-i.1+d=.y-x)|."0 1 y{.1
z=. (d$<(0,y)$0),<,:y#0
for. i.x do. z=. k (+."1)&.> ,&.>/\. (_1&|."1)&.> z end.
; z
)

Cheers,

Erling Hellenäs








Den 2017-11-03 kl. 08:18, skrev Linda Alvord:

You can compare the tree versions of comb3a and comb4 to see their
differences:

comb3a
   ┌─ [
   │          ┌─ =
   │   ┌──────┤      ┌─ / ─── +
   │   │      └─ " ──┴─ 1
   │   │
   ├───┤             ┌─ |.
──┤   │      ┌─ @: ─┴─ I.
   │   ├─ @ ──┴─ #
   │   └─ ]
   │
   │   ┌─ 2
   │   │             ┌─ #:
   └───┤      ┌─ @ ──┴─ i.
       ├─ @: ─┴─ ^
       └─ ]
        comb4
   ┌─ [:
   ├─ |.
   │    ┌─ [:
   │    ├─ I.
──┤    │        ┌─ [
   │    │        ├─ =
   │    │        │    ┌─ [:
   │    │    ┌───┤    │     ┌─ / ─── +
   └────┤    │   │    ├─ " ─┴─ 1
        │    │   └────┤
        │    │        │     ┌─ [:
        │    │        │     ├─ #:
        │    │        └─────┤     ┌─ [:
        │    │              │     ├─ i.
        └────┤              └─────┤    ┌─ 2
             │                    └────┼─ ^
             │                         └─ ]
             ├─ #
             │   ┌─ [:
             │   ├─ #:
             └───┤    ┌─ [:
                 │    ├─ i.
                 └────┤     ┌─ 2
                      └─────┼─ ^
                            └─ ]

Linda

-----Original Message-----
From: Programming [mailto:[email protected]] On
Behalf Of Linda Alvord
Sent: Friday, November 3, 2017 2:28 AM
To: [email protected]
Subject: Re: [Jprogramming] Partitions

Oops, this should be better:


    comb4=: 13 :'|.I.(x=+/"1#:i.2^y)##:i.       2^y'
    comb4
[: |. [: I. ([ = [: +/"1 [: #: [: i. 2 ^ ]) # [: #: [: i. 2 ^ ]
    #3 comb4  5
10
    Linda


-----Original Message-----
From: Programming [mailto:[email protected]] On
Behalf Of Raul Miller
Sent: Thursday, November 2, 2017 2:54 AM
To: Programming forum <[email protected]>
Subject: Re: [Jprogramming] Partitions

No, you did not test your work.

    #3 comb 5
10
    #3 comb4 5
56

Probably the simplest way to approach what I think you are trying to do
involves expanding the part in parenthesis independent of the rest of it.

And, personally, when I am working on a line of J code, I like to have a
little test rig so that I can quickly see when I have gone astray.
Doing that here (and clipping out my mistakes), then adding comments gets
me this:

First, I set up a test rig with the original expression:

    #3 ([ ((= +/"1) |.@:I.@# ]) 2 #:@i.@:^ ]) 5
10

Then, I rephrase the outer part as an explicit expression for 13 :

   #3 (13 :'x ((= +/"1) |.@:I.@# ]) #:i. 2^y') 5
10

Since that worked, I take a look at what 13 : gave me

    13 :'x ((= +/"1) |.@:I.@# ]) #:i. 2^y'
[ ((= +/"1) |.@:I.@# ]) [: #: [: i. 2 ^ ]

Next, I try that out in my test rig:

    #3 ([ ((= +/"1) |.@:I.@# ]) [: #: [: i. 2 ^ ]) 5
10

So, now that I have that, I do a rephrase of the inner part for another 13
:

    # 3([ (13 :'|.I.(x = +/"1 y) # y') [: #: [: i. 2 ^ ]) 5
10

And, since that works, I take a look at what it gave me:

    [ (13 :'|.I.(x = +/"1 y) # y') [: #: [: i. 2 ^ ] [ ([: |. [: I. ] #~ [
= [: +/"1 ]) [: #: [: i. 2 ^ ]

And, voila, I've got another variation that I can use in a word
definition:

    comb4a=: [ ([: |. [: I. ] #~ [ = [: +/"1 ]) [: #: [: i. 2 ^ ]

That's a bit ugly, but ascii is ugly (but, also, standardized and - thus -
widely available).

So, we can try that out and see it in operation:

    3 comb4a 5
0 1 2
0 1 3
0 1 4
0 2 3
0 2 4
0 3 4
1 2 3
1 2 4
1 3 4
2 3 4

Also... note that when working with "real life" mechanisms (not just J),
having some sort of test rig to make sure that what you are doing behaves
like you think it does can be an invaluable time saver. (The alternative -
putting a lot of work into something, only to find out that it doesn't work
and that you have to start over again - is sometimes necessary but not
always attractive.)

(Well, that, and remember that this approach is slower than the stock comb
implementation when y > 10 - so mostly I would just do require'stats' and
then use that comb implementation.)

Then again, now that we have this variation, we could also try to
reconstruct an explicit expression which does the same thing. For that we
want to merge these two examples:

    #3 (13 :'x ((= +/"1) |.@:I.@# ]) #:i. 2^y') 5
    # 3([ (13 :'|.I.(x = +/"1 y) # y') [: #: [: i. 2 ^ ]) 5

Perhaps something like:
    #3 (13 :'|.I.(x = +/"1 t) # t=. #:i. 2^y') 5
10

(But I would not blindly enshrine results just because they were generated
by an automated mechanism - such things can be useful tools, of course, but
if you abandon your own understanding that's not good.)

I hope this helps,

--
Raul

On Wed, Nov 1, 2017 at 11:55 PM, Linda Alvord <[email protected]>
wrote:

This is another way to get to Raul's ideas in a tacit soluion:

comb4=: 13 :'|.I.(x=+/"1#:i.x^y)##:i.x^y'
    2 comb4 4
0 1
0 2
0 3
1 2
1 3
2 3
    comb4
[: |. [: I. ([ = [: +/"1 [: #: [: i. ^) # [: #: [: i. ^

Linda


-----Original Message-----
From: Programming [mailto:[email protected]] On
Behalf Of Lippu Esa
Sent: Wednesday, November 1, 2017 5:53 PM
To: '[email protected]' <[email protected]>
Subject: Re: [Jprogramming] Partitions

Thank you, Raul! I knew that there would be a tacit solution. But comb is
better with big y as you said.

Esa

-----Original Message-----
From: Programming [mailto:[email protected]] On
Behalf Of Raul Miller
Sent: Wednesday, November 1, 2017 11:26 PM
To: Programming forum <[email protected]>
Subject: Re: [Jprogramming] Partitions

comb3 performs well for y<10, but bogs down (compared to comb) for
y>10

That said, a=.[: #: [: i. 2 ^ ] is a verb, not a noun.

That said, you do not have to compute a twice, for example:

comb3a=:   [ ((= +/"1) |.@:I.@# ]) 2 #:@i.@:^ ]

(but comb3a is still slower than comb, when I time it, for y>10)

Thanks,

--
Raul


On Wed, Nov 1, 2017 at 4:52 PM, Lippu Esa <[email protected]> wrote:

Yes, interesting! Thank you Linda.

Just for practice, I tried to isolate the common part: [: #: [: i. 2 ^ ]
but had to use a noun as didn't manage to find a tacit solution.

comb3=:([ = [: +/"1 a) ([: |. [: I. #) a=.[: #: [: i. 2 ^ ]

Anyone?

Esa

-----Original Message-----
From: Programming [mailto:[email protected]]
On Behalf Of Linda Alvord
Sent: Wednesday, November 1, 2017 1:49 PM
To: [email protected]
Subject: Re: [Jprogramming] Partitions

Maybe you will find comb2 interesfing.

load 'stats'

comb2=:([ = [: +/"1 [: #: [: i. 2 ^ ]) ([: |. [: I. #) [: #: [: i. 2
^ ]

(4 comb2 7)-:4 comb 7


Li nda



Get Outlook for Android<https://aka.ms/ghei36>

________________________________
From: Programming <[email protected]> on
behalf of Erling Hellenäs <[email protected]>
Sent: Wednesday, November 1, 2017 7:13:33 AM
To: [email protected]
Subject: Re: [Jprogramming] Partitions

Hi all!

parRuskey comparison.

Mike Days new version is slightly faster than the Frank Ruskey version.

Cheers,

Erling Hellenäs

----------Project----------

ts=: 6!:2 , 7!:2@]       NB. Time and space

normalize=: 3 :0
NB. The idea here is to normalize the representation so that NB. the
copies are adjacent.
NB. Sort buckets within each combination after first item in each
bucket v31=.(] /: {.&.>)"1 y NB. Sort buckets within each combination
after number of items in each bucket v4=.(] /: #&.>)"1 v31 NB. Sort
v5=. /:~  v4
(/: #&.> v5){ v5
)

compare=: -:&:normalize

NB. parELMDE for comparison

parELMDE=: 4 : 0
a =. ~. i.~"1 iy #: i. */ iy =. (1+i.x),(y-x)$x a =. a#~ x = #@~."1 a
sort a </."1 i. y
)

NB. Original Frank Ruskey version.

parRuskey =: 4 : 0
a=: i. y
r=: (0,y)$0
(x-1) S y-1
r </."1 i.y
)


S =: 4 : 0
if. x=y do.
    r=:r,a
else.
    for_i. i.x+1 do.
      a=: i y } a
      x S y-1
      a=: y y } a
    end.
    if. x > 0 do.
      a=: x y } a
      (x-1) S y-1
      a=: y y } a
    end.
end.
)

NB. Slightly modified by Erling to remove global variables.

parRuskeyE =: 4 : 0
r=. (i.y) SE (x-1);y-1
r </."1 i.y
)

SE =: 4 : 0
'k n' =. y
r=. 0{.,:x
if. k=n do.
    r=.,:x
else.
    for_i. i.k+1 do.
      r=.r, (i n } x) SE k;n-1
end.
    if. k > 0 do.
      r=.r, (k n } x) SE (k-1);n-1
    end.
end.
r
)

NB. Modified by Mike Day

parRuskeyMD =: 4 : 0
NB. L =: 0$~0, 2 + y   NB. debug/understand array of call parameters
r=. (i.y) SMD (x-1),y-1
NB. R =: r             NB. debug/understand output
r </."1 i.y
)

SMD =: 4 : 0
NB. L =: L, y, x       NB. debug/understand array of call parameters
'k n' =. y
a =.x
r =. 0$~ 0, #a
if. k = n - 1 do.      NB. replace repeated calls with k = n (on entry)
    r =. (i.k+1) n }"0 1 (k+1)# ,:a  NB. don't need to use recursion
here!
else.
       NB. is there a way to avoid recursion here,  too?
    r =. r, ,/ (SMD&(k,n-1))"1 (i.k+1) n }"0 1 a NB.apply "1 instead
of do loop end.
if. k > 0 do.
    r=.r, (k n } a) SMD (k-1),n-1
end.
r
)

x=:1
y=:1
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y NB.(x parELMDE y) compare x
parRuskeyMD y - Error
x=:1
y=:2
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y (x parELMDE y) compare x
parRuskeyMD y
x=:2
y=:3
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y (x parELMDE y) compare x
parRuskeyMD y
x=:3
y=:5
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y (x parELMDE y) compare x
parRuskeyMD y
x=:3
y=:6
(x parELMDE y) compare x parRuskey y
(x parELMDE y) compare x parRuskeyE y (x parELMDE y) compare x
parRuskeyMD y

x=:5
y=:10
ts'x parRuskey y'
ts'x parRuskeyE y'
ts'x parRuskeyMD y'


-------Output-------------------


     x=:1
     y=:1
     (x parELMDE y) compare x parRuskey y
1
     (x parELMDE y) compare x parRuskeyE y
1
     NB.(x parELMDE y) compare x parRuskeyMD y - Error
     x=:1
     y=:2
     (x parELMDE y) compare x parRuskey y
1
     (x parELMDE y) compare x parRuskeyE y
1
     (x parELMDE y) compare x parRuskeyMD y
1
     x=:2
     y=:3
     (x parELMDE y) compare x parRuskey y
1
     (x parELMDE y) compare x parRuskeyE y
1
     (x parELMDE y) compare x parRuskeyMD y
1
     x=:3
     y=:5
     (x parELMDE y) compare x parRuskey y
1
     (x parELMDE y) compare x parRuskeyE y
1
     (x parELMDE y) compare x parRuskeyMD y
1
     x=:3
     y=:6
     (x parELMDE y) compare x parRuskey y
1
     (x parELMDE y) compare x parRuskeyE y
1
     (x parELMDE y) compare x parRuskeyMD y
1

     x=:5
     y=:10
     ts'x parRuskey y'
0.204245 3.89459e7
     ts'x parRuskeyE y'
0.316044 3.8954e7
     ts'x parRuskeyMD y'
0.173341 3.8954e7


Cheers,


Erling Hellenäs


Den 2017-10-31 kl. 20:17, skrev 'Mike Day' via Programming:

parRuskeynew =: 4 : 0
NB. L =: 0$~0, 2 + y   NB. debug/understand array of call parameters
r=. (i.y) Snew (x-1),y-1
NB. R =: r             NB. debug/understand output
r </."1 i.y
)

Snew =: 4 : 0
NB. L =: L, y, x       NB. debug/understand array of call parameters
'k n' =. y
a =.x
r =. 0$~ 0, #a
if. k = n - 1 do.      NB. replace repeated calls with k = n (on entry)
   r =. (i.k+1) n }"0 1 (k+1)# ,:a  NB. don't need to use recursion
here!
else.
      NB. is there a way to avoid recursion here,  too?
   r =. r, ,/ (Snew&(k,n-1))"1 (i.k+1) n }"0 1 a NB.apply "1 instead
of do loop end.
if. k > 0 do.
   r=.r, (k n } a) Snew (k-1),n-1
end.
r
)

---------------------------------------------------------------------
- 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