This also runs out of memory:

       (1 2 3 4 5 6){~^:(5&>)^:(_) 1
|out of memory
|   (1 2 3 4 5 6)    {~^:(5&>)^:(_)1

whereas this doesn't
{&(1 2 3 4 5 6)^:(5&>)^:(_)1


Wouldn't this imply the bug (if there is a bug) is not in the boxed integer?

System details:

Engine: j804/j64/windows
Release: commercial/2015-12-21 16:18:48
Library: 8.04.15
Qt IDE: 1.4.10/5.4.2
Platform: Win 64
Installer: J804 install


--------------------------------------------
On Wed, 9/7/16, 'Jon Hough' via Programming <programm...@jsoftware.com> wrote:

 Subject: Re: [Jprogramming] Greatest Increasing Subsequence
 To: programm...@jsoftware.com
 Date: Wednesday, September 7, 2016, 6:30 PM
 
 " 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