[Jprogramming] bug in ?

Henry Rich henryhrich at gmail.com
Wed Aug 17 19:05:30 UTC 2016


The original code underread the input area; the suggested replacement 
overwrote the output area.

And, on 32-but machines, the random bits were degraded for some generators.

All will be fixed soon.

Henry Rich

On 8/16/2016 7:38 AM, bill lam wrote:
> Apologize to re-opening this old thread. I tried Joe's
> patch on the current J source and it seems working. But
> it also crashed when running g640 in the test suite.
> I can get a simple repeatable expression that caused crash.
>
> ?@:(5e3&$)"0 ] 2
>
> but 1e3 or 2e3 is ok.  Any idea?
>
> Чт, 17 дек 2015, Joe Bogner написал(а):
>> looks like the problem likes in
>> https://github.com/openj/core/blob/18fd23bbdc2f50770eb3047e978cd5e4e3b47039/vrand.c#L726
>>
>> It looks like it checks to see if the first number in the list is 2
>> and if so, it uses the roll2 implementation
>>
>> RZ(w=vi(w)); m=*AV(w);
>> if( 2==m)RZ(z=roll2 (w,&b));
>>
>> It also appears to be a 64-bit bug
>>
>> 32-bit:
>>
>>     ?. 16 # 2 2 2 16
>> 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1
>> 1 1 1 1 0 1 1 1 0 0 1 1 1 13 12 13 4 9 15 5 9 6 3 9 1 2 11 1 8
>>
>> 64-bit
>>        ?. 16 # 2 2 2 16
>> 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0
>> 0 0 0 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1
>>
>> The simplest 'fix' would be to disable the roll 2 optimization by
>> commenting it out, but that may not be ideal since presumably it was
>> put in place for a reason to speed up random booleans on large arrays.
>> The next fix would be to check to see if all numbers in the ravel are
>> 2 and only then use roll2. The last, probably more complicated fix
>> would be to support 2 and other numbers in roll2 safely in 64-bit, but
>> even that is pretty simple
>>
>>
>> just copy and paste the block of shifts (since there is only 8), to
>> add 8 more for 64-bit... need to do this for the random and fixed seed
>> part
>>
>>   }else for(j=0;j<q;++j){
>>    t=NEXT;
>>    if(!(2==*v++&&2==*v++&&2==*v++&&2==*v++))R mark; *zv++=mk&t; t>>=1;
>>    if(!(2==*v++&&2==*v++&&2==*v++&&2==*v++))R mark; *zv++=mk&t; t>>=1;
>>    if(!(2==*v++&&2==*v++&&2==*v++&&2==*v++))R mark; *zv++=mk&t; t>>=1;
>>    if(!(2==*v++&&2==*v++&&2==*v++&&2==*v++))R mark; *zv++=mk&t; t>>=1;
>>    if(!(2==*v++&&2==*v++&&2==*v++&&2==*v++))R mark; *zv++=mk&t; t>>=1;
>>    if(!(2==*v++&&2==*v++&&2==*v++&&2==*v++))R mark; *zv++=mk&t; t>>=1;
>>    if(!(2==*v++&&2==*v++&&2==*v++&&2==*v++))R mark; *zv++=mk&t; t>>=1;
>>    if(!(2==*v++&&2==*v++&&2==*v++&&2==*v++))R mark; *zv++=mk&t;
>>
>>   //start new code
>>    #if SY_64
>>    t>>=1;
>>    if(!(2==*v++&&2==*v++&&2==*v++&&2==*v++))R mark; *zv++=mk&t; t>>=1;
>>    if (!(2 == *v++ && 2 == *v++ && 2 == *v++ && 2 == *v++))R mark;
>> *zv++ = mk&t; t >>= 1;
>>    if (!(2 == *v++ && 2 == *v++ && 2 == *v++ && 2 == *v++))R mark;
>> *zv++ = mk&t; t >>= 1;
>>    if (!(2 == *v++ && 2 == *v++ && 2 == *v++ && 2 == *v++))R mark;
>> *zv++ = mk&t; t >>= 1;
>>    if (!(2 == *v++ && 2 == *v++ && 2 == *v++ && 2 == *v++))R mark;
>> *zv++ = mk&t; t >>= 1;
>>    if (!(2 == *v++ && 2 == *v++ && 2 == *v++ && 2 == *v++))R mark;
>> *zv++ = mk&t; t >>= 1;
>>    if (!(2 == *v++ && 2 == *v++ && 2 == *v++ && 2 == *v++))R mark;
>> *zv++ = mk&t; t >>= 1;
>>    if (!(2 == *v++ && 2 == *v++ && 2 == *v++ && 2 == *v++))R mark; *zv++ = mk&t;
>>    #endif
>>   }
>>
>> On Thu, Dec 17, 2015 at 10:29 PM, Linda A Alvord
>> <lindaalvord at verizon.net> wrote:
>>> These are the results you should get in a fresh version of JHS or jqt.  If
>>> you use ?. you will insure repeated exact results in a session. In all cases
>>> the length of the list is 64 elements so there should be enough 2's.
>>>
>>> ?. 16 # 2 2 2 16
>>> 1 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1 1 1
>>> 1 0 1 1 1 0 0 1 1 1 13 12 13 4 9 15 5 9 6 3 9 1 2 11 1 8
>>>     ?. 16 # 3 2 2 16
>>> 0 2 2 1 2 0 2 1 1 2 0 2 1 1 1 2 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 1 1 1
>>> 1 1 1 0 1 1 1 0 0 1 13 11 13 12 13 4 9 15 5 9 6 3 9 1 2 11
>>>     ?. 16 # 16 2 2 2
>>> 2 11 15 4 6 7 4 1 4 2 6 14 1 14 7 12 0 0 0 0 1 0 0 0 0 1 1 1 0 0 1 1 0 0 0 1
>>> 1 1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 0 1 1 1 0 1
>>>
>>>     $?. 16 # 2 2 2 16
>>> 64
>>>     $?. 16 # 3 2 2 16
>>> 64
>>>     $?. 16 # 16 2 2 2
>>> 64
>>>
>>> Linda
>>>
>>> -----Original Message-----
>>> From: programming-bounces at forums.jsoftware.com
>>> [mailto:programming-bounces at forums.jsoftware.com] On Behalf Of 'Pascal
>>> Jasmin' via Programming
>>> Sent: Thursday, December 17, 2015 12:41 PM
>>> To: programming at jsoftware.com
>>> Subject: Re: [Jprogramming] bug in ?
>>>
>>> ?.  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
>>> 2 2 2 2 2 2 2 2 2 2 2 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
>>> 0 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 1 1 1 0 1 1 1 0 1 0 1 1 1 1
>>> 0 1 1 1 1 0 0 1 1 1 8 9 6 8 14 7 12 9 1 15 2 15 3 13 3
>>>
>>> ?. 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
>>> 2 2 2 2 2 2 2 2 2 2 2 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16
>>> 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0
>>> 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1
>>>
>>>
>>> one less leading 2 in first example.  47 leading 2s, correct result.  48
>>> leading 2s and everything is 2.
>>>
>>>
>>> ----- Original Message -----
>>> From: Raul Miller <rauldmiller at gmail.com>
>>> To: Programming forum <programming at jsoftware.com>
>>> Sent: Thursday, December 17, 2015 12:28 PM
>>> Subject: Re: [Jprogramming] bug in ?
>>>
>>> Consider
>>>     ?.2 2 2 32
>>> 0 1 0 18
>>>
>>> Thanks,
>>>
>>> --
>>> Raul
>>>
>>>
>>> On Thu, Dec 17, 2015 at 12:13 PM, 'Pascal Jasmin' via Programming
>>> <programming at jsoftware.com> wrote:
>>>>
>>>>
>>>> ?. 16 # 2 2 2 16
>>>>
>>>>
>>>> result is same as
>>>>
>>>> ?. 16 # 2 2 2 2
>>>>
>>>> ignores the request for 0-15 range random numbers.
>>>>
>>>>
>>>> ----- Original Message -----
>>>> From: Raul Miller <rauldmiller at gmail.com>
>>>> To: Programming forum <programming at jsoftware.com>
>>>> Sent: Thursday, December 17, 2015 12:10 PM
>>>> Subject: Re: [Jprogramming] bug in ?
>>>>
>>>> On Thu, Dec 17, 2015 at 11:49 AM, 'Pascal Jasmin' via Programming
>>>> <programming at jsoftware.com> wrote:
>>>>> ?. 16 # 2 2 2 16
>>>>> 0 1 0 1 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0
>>> 0 1 0 1 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 1 1
>>>>>
>>>>> ?. 16 # 3 2 2 16
>>>>> 0 2 1 0 2 1 1 1 2 1 0 2 1 2 1 2 1 0 1 1 1 1 1 1 0 0 1 0 0 1 1 0 0 1 1 1 0
>>> 1 0 0 0 1 1 1 1 0 1 0 8 4 14 3 1 6 14 10 15 13 5 6 2 14 0 5
>>>>> The last 16 numbers in the first example should match the 2nd.
>>>> Why do you say that?
>>>>
>>>> Thanks,
>>>>
>>>> --
>>>> Raul
>>>>
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>> 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



More information about the Programming mailing list