Monadic works fine, as in
   u^:(<n)y
but dyadic is incorrect
   x u^:(<n)y
seems to be interpreted as
   x u^:(<_)y
regardless of n.

> On Sep 7, 2016, at 4:30 AM, 'Jon Hough' via Programming 
> <programm...@jsoftware.com> wrote:
> 
> " It appears that <n is being interpreted 
> as <_ regardless of n."
> 
> I'm not sure this is the case, for any left hand verb.
> ]^:(<4) 4
> works fine.
> 
> 
> --------------------------------------------
> On Wed, 9/7/16, Henry Rich <henryhr...@gmail.com> wrote:
> 
> Subject: Re: [Jprogramming] Greatest Increasing Subsequence
> To: programm...@jsoftware.com
> Date: Wednesday, September 7, 2016, 6:05 PM
> 
> I noticed this the other
> day.  It appears that <n is being interpreted 
> as <_ regardless of n.  I'll look into
> it.
> 
> Henry Rich
> 
> On 9/6/2016 11:53 PM,
> Xiao-Yong Jin wrote:
>> I’m trying to
> rewrite lisM in a readable tacit form but hit something I
> didn’t understand.
>> Supplying i.n to
> ^: works fine, but <n does not work like the dictionary
> says.  Namely
>> 
>>  
>   (_1+i.5){~^:(i.4)4
>> 
>> produces 4 3 2 1, but
>> 
>>    
> (_1+i.5){~^:(<4)4
>> 
>> exhausts all the memory with J804 and
> J805beta.
>> 
>> The
> dictionary says
>> 
>>  
>   If n is boxed it must be an atom, and u^:(<m)
>>      ↔ u^:(i.m) y     
>     if m is a non-negative integer
>> 
>> so the above two
> should be the same.  What’s going on here?
>> 
>>> On Sep 5, 2016,
> at 3:17 AM, 'Mike Day' via Programming <programm...@jsoftware.com>
> wrote:
>>> 
>>> 
> Thanks Jon
>>> 
>>> 
> lisM isn't really "my" version - I was just
> translating the pseudo-code...
>>> I
> expect -without checking! - that its advantage over lisl
> resides in avoiding the do-it-yourself binary search by
> using J's built-in dyadic I. , albeit at the expense of
> an explicit sorted array, which I called mx .   I
> tried limiting the I. search to only the first L items of
> mx,  but with no benefit,  at least for the sizes I
> tried.
>>> The time taken to recover
> the result is fairly trivial,  so I don't suppose my
> use of
>>> |. x{~(p{~])^:(i.L) L{m
>>> is particularly interesting,  but it
> avoided that explicit while loop.
>>> 
>>> Mike
>>> 
>>> Please reply
> to mike_liz....@tiscali.co.uk.
>>> Sent from my iPad
>>> 
>>>> On 5 Sep
> 2016, at 08:07, 'Jon Hough' via Programming <programm...@jsoftware.com>
> wrote:
>>>> 
>>>> Just out of interest, I compared
> the various results.
>>>> I wrote a
> fully imperative version, which uses in-place modification
> of the results array.
>>>> 
>>>> I also wrote a version that avoids
> any while / for loops (because I wanted to avoid using
> them), and ended up putting
>>>> 
> most of the logic in anonymous verbs. Which is probably a
> big mistake because that gets very slow. Also barely
> readable.
>>>> 
>>>> 
> NB.===========================================================================
>>>> 
>>>> NB.
> Jon - bizarre version. Uses anonymous verbs for most of the
> logic.
>>>> NB. Slow and, uses huge
> amounts of memory.
>>>> 
> appendOrInsert=:(3 : 'insert max' [ 3 :
> '(max=:<:#lst)[(min=:0)[val=:i{r[i=:y')`(3 :
> '(lst=:lst,y)[prev=:(_1{lst) y} prev')@.(3 :
> '(val>({:lst){r)[val=:y{r')
>>>> insert=:(3 : '(prev=:
> ((y-1){lst)i}prev)[(lst=: i y }lst)' ] ])@:(3 :
> 'mid'`(3 : 'min=: mid+1')@.(3 :
> '(val>(mid{lst){r)[(mid=:<.(min+y)%2)')^:(0&<)^:_)
>>>> 
>>>> lisJ
> =: 3 : 0
>>>> r=:y           
>   NB. array
>>>> 
> [val=:0[max=:0[mid=:0[min=:0  NB. useful numbers
>>>> lst=:0            NB. list
> of indices
>>>> prev=: (#y)#0   
>     NB. previous indices
>>>> 
> i=:0            NB. current index
>>>> 
>>>> 
> appendOrInsert"0 >: i.<: # y    NB. append the
> items, or insert them, into lst (and update prev)
>>>> res=:''
>>>> ptr=: _1{lst
>>>> (ptr&buildEx)^:(#lst) res
>>>> |. res
>>>> )
>>>> 
>>>> buildEx =: 4 : 0
>>>> res=:y,ptr{r
>>>> ptr=: ptr{prev
>>>> res
>>>> 
> )
>>>> 
>>>> 
>>>> 
> NB.===========================================================================
>>>> 
>>>> 
>>>> NB. Imperative version. just for
> benchmarking
>>>> lisI =: 3 : 0
>>>> lst =: 0
>>>> r=: y
>>>> 
> parent=: (#y)#0
>>>> 
> for_i.>:i.<:# r do.
>>>> 
> if.((i{r) > ({: lst){r )  do.
>>>> parent=:(_1{lst) i}parent
>>>> lst =: lst, i
>>>> else.
>>>> 
> min=: 0
>>>> max =: <:#lst
>>>> while. min < max do.
>>>> mid =: <. (min + max) % 2
>>>> if. (i{r) > ((mid { lst{r)) do.
> min =: mid + 1
>>>> else. max =: mid
> end.
>>>> end.
>>>> lst=: (i) max} lst
>>>> parent=: ((max-1){lst)(i})
> parent
>>>> end.
>>>> end.
>>>> 
> res=: ''
>>>> ptr=:
> _1{lst
>>>> while. (# res) < #
> lst do.
>>>> res=:res,ptr{r
>>>> ptr=:ptr{parent
>>>> end.
>>>> 
> I. res
>>>> )
>>>> 
>>>> 
>>>> 
>>>> 
> NB.===========================================================================
>>>> 
>>>> 
>>>> NB. Mike's version.
>>>> 
>>>> lisM
> =: 3 : 0
>>>> n   
>    =. #x   =. y
>>>> if. 2>#x do. x return. end. 
>      NB. special case empty or singleton
> array
>>>> if. (-:/:~)x do. ~.x
> return. end. NB. special case sorted arrays
>>>> if. (-:\:~)x do. {.x return.
> end.
>>>> p       =.
> n#0
>>>> NB. seed m with trailing _1
> so that final L (as in wiki algorithm) can be found
>>>> m       =. n 0 }
> _1#~>:n
>>>> NB. set up sorted
> mx, with just the first element of x, so that I. works
>>>> mx      =. ({.x) 1 }
> (<:<./x), n#>:>./x
>>>> 
> for_i. i.n do.
>>>>    xi    =. i{x
>>>>    lo    =. mx I.
> xi
>>>>    p 
>    =. (m{~<:lo) i } p NB. better than
> appending to short p for larger x
>>>>    m     =.
> i  lo } m
>>>>    mx   
> =. xi lo } mx
>>>> end.
>>>> |. x{~(p{~])^:(i.L) m{~ L =. <:
> m i. _1
>>>> )
>>>> 
>>>> 
> NB.===========================================================================
>>>> 
>>>> NB.
> Louis' version.
>>>> p=: ] , [
> ,&.> ] #~ (< {.&>) (= >./)@:*
> #&>@]
>>>> e=: }:@>@(#~ (=
>> ./)@:(#&>))@>
>>>> 
>>>> s=: [: e (<<_)
> p&.>/@,~ <"0
>>>> 
> pi=: ] , [ ,&.> ] {~ (< {.&>) (i.
>> ./)@:* #&>@]
>>>> lisL =:
> [: e (<<_) pi&.>/@,~ <"0         
>                             NB.
> <------------- this one.
>>>> 
>>>> f=: ((] >: (-~ >./))
> #&>) # ]
>>>> 
>>>> P=: ] , [ ,&.> ] #~ (<
> {.&>) (,@[ #^:_1 (= >./)@#) #&>@]
>>>> sp=: [: e (<<_) ({:@[ f {.@[
> P ])&.>/@,~ (,&.> i.@#)
>>>> 
>>>> 
>>>> 
>>>> 
> NB.===========================================================================
>>>> 
>>>> 
>>>> NB. Xiao's version with
> Raul's modifications. Renamed verbs to avoid
> clashing.
>>>> 
>>>> NB. dyads
>>>>    exr=:  (1 + {:@[
> < ]) {. [ ; ,
>>>>    hxr=:  [: ;
> exr&.>
>>>> 
>>>> NB. monads
>>>>    gxr=: (}.@] ;~ {.@] ;
> (hxr {.))&>/
>>>>    cxr=: ({::~ [: (i.
>> ./) #@>)@>@{.
>>>>    dxr=: (<_) ; ]
>>>>    lisXR=: ([: cxr
> gxr^:(#@(>@{:)))@dxr
>>>> 
>>>> 
> NB.===========================================================================
>>>> 
>>>> a=:
> 25 ? 25
>>>> timespacex 'lisI
> a'
>>>> timespacex 'lisJ
> a'
>>>> timespacex 'lisM
> a'
>>>> timespacex 'lisL
> a'
>>>> timespacex 'lisXR
> a' NB. comment out for larger arrays,a.
>>>> 
>>>> 
> Playing around with various arrays, it seems lisM is the
> most efficient in time and space (more than the imperative
> version).
>>>> lisM and lisI can
> handle array larger than 10000. The others struggle or give
> up with them.
>>>> 
>>>> 
>>>> 
> --------------------------------------------
>>>> On Sun, 9/4/16, 'Mike Day'
> via Programming <programm...@jsoftware.com>
> wrote:
>>>> 
>>>> Subject: Re: [Jprogramming]
> Greatest Increasing Subsequence
>>>> 
> To: programm...@jsoftware.com
>>>> Date: Sunday, September 4, 2016,
> 4:30 AM
>>>> 
>>>> This version of
>>>> "lis" is a bit more
> J-like,  especially in using
>>>> 
> dyadic I.
>>>> instead of the diy
> binary search,
>>>> at the expense
> of a slightly more
>>>> complicated
> set-up for the m and mx arrays.
>>>> 
>>>> lis
> =: 3 : 0
>>>> n   
>    =. #x   =. y
>>>> if. 2>#x do. x return. end.
>>>>     NB. special case empty or
> singleton array
>>>> if. (-:/:~)x
> do. ~.x return. end. NB. special
>>>> case sorted arrays
>>>> if. (-:\:~)x do. {.x
>>>> return. end.
>>>> p       =. n#0
>>>> NB. seed m with trailing _1 so
> that final L (as
>>>> in wiki
> algorithm) can
>>>> be found
>>>> m       =. n 0 }
> _1#~>:n
>>>> NB. set up sorted
> mx, with just the first
>>>> element
> of x, so that I. works
>>>> mx   
>   =.
>>>> ({.x) 1 } (<:<./x),
> n#>:>./x
>>>> for_i. i.n
> do.
>>>>      xi   
> =.
>>>> i{x
>>>>      lo    =. mx I.
> xi
>>>>      p 
>    =. (m{~<:lo) i } p
>>>> NB. better than appending to short
> p for
>>>> larger x
>>>>      m
>>>>     =. i  lo } m
>>>>      mx    =.
>>>> xi lo } mx
>>>> end.
>>>> 
> |.
>>>> x{~(p{~])^:(i.L) m{~ L =.
> <: m i. _1
>>>> )
>>>> 
>>>> 
> Mike
>>>> 
>>>> 
>>>> On
> 02/09/2016 20:45, 'Mike
>>>> 
> Day' via Programming wrote:
>>>>> Well,
>>>> assuming for now that it does
> work,  here's an attempt
>>>> 
> at a J
>>>>> version of
>>>> the pseudo-code listed at
>>>>> https://en.wikipedia.org/wiki/Longest_increasing_subsequence#Efficient_algorithms
>>>>> 
>>>>> lis =: 3 : 0   NB.
> longest
>>>> increasing
> subsequence
>>>>> m
>>>>     =.
> 0#~>:n   =.
>>>> 
> #x   =. y
>>>>> L
>>>>     =. #p       =.
> ''
>>>>> mx      =.
> m{x NB. added this vector
>>>> for
> better look-up of x{~mid{m
>>>>> 
> for_i.
>>>> i.n do.
>>>>>     'lo hi' =.
>>>> 1, L
>>>>>      xi 
>    =. i{x
>>>>>  
>    while. lo <: hi do.
>>>>>         mid    =. >.@-: lo + hi
>>>> NB.       if. xi >
> x{~ mid{m do. NB. next
>>>> line a
> bit better
>>>>     if. xi >
> mid{mx do.
>>>>      
>    lo =. >: mid
>>>>  
>   else.
>>>>>        
>    hi =.
>>>> <:
> mid
>>>>>         end.
>>>>>      end.
>>>>>      p
>>>>     =. p, m{~<:lo
>>>>>      m
>>>>     =. i  lo } m
>>>>>      mx
>>>>    =. xi lo } mx   
> NB. update my additional array
>>>>>      L 
>    =. L >. lo
>>>>> 
> NB. smoutput i; (x{.~ >:i);
>>>> 
> L{.m   NB. diagnostic
>>>> end.
>>>>> |. x{~(p{~])^:(i.L) L{m
>>>>> )
>>>>> 
>>>>> It's reasonably fast on
> ?10000#5000 -
>>>> but possibly
> wrong!It does
>>>>> fail on an
>>>> empty array.
>>>> Mike
>>>>> 
>>>>>> On 02/09/2016 17:30, Raul
> Miller wrote:
>>>>>> It seems
> to me that the
>>>> "efficient
> algorithm" documented on the
>>>>>> wikipedia page would have
> an analogous
>>>> flaw. It is
> performing binary
>>>> searches on
> unsorted lists. That said, it does perform
>>>> correctly for
>>>>>> this example.
>>>>>> 
>>>>>> Thanks,
>>>>> 
>>>>> ---
>>>>> This email has been checked
> for viruses by
>>>> Avast antivirus
> software.
>>>>> https://www.avast.com/antivirus
>>>> 
> ----------------------------------------------------------------------
>>>>> For information about J forums
> see http://www.jsoftware.com/forums.htm
>>>> 
>>>> 
> ---
>>>> This email
>>>> has been checked for viruses by
> Avast antivirus software.
>>>> https://www.avast.com/antivirus
>>>> 
>>>> 
> ----------------------------------------------------------------------
>>>> 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