This is very bad news for me. I just searched through my scripts and found
586 instances of 'stats'. If this is not corrected, I have to assume that
all of them might potentially produce incorrect results, without even
failing (like in the if($s > 0) example).

We've been using 2.007 for a couple of months now. I'm not even sure if my
recent results are correct.

Marek

On Tue, 16 Jun 2015 at 14:43 Chris Marshall <devel.chm...@gmail.com> wrote:

>  That definitely seems like a bug to me.  Thanks for the cross-check,
> Marek.
> Devels, I see the same in the latest PDL release so it is not a PDL-2.007
> only issue.
>
>
> --Chris
>
>
> On 6/16/2015 09:36, Marek Gierliński wrote:
>
> OK, thank you for your explanations. I'm not sure if all of this makes
> sense. If you try
>
>  print $s > 5;
>
>  in the above example, you will get 'BAD'. 5 is just a scalar and not a
> bad value. And $s is a one-dimensional piddle with a value different from
> the bad value. Neither of the values in this conditional expression is bad.
> Why does it return a string 'BAD'?
>
>  Marek
>
>  On Tue, 16 Jun 2015 at 14:24 Chris Marshall <devel.chm...@gmail.com>
> wrote:
>
>>  This result seems to violate the principle of least surprise.
>> On the LHS we have a PDL with badvalue(0) and on the RHS we
>> have a perl scalar with value 0 (which happens to be the bad
>> value for the PDL).
>>
>> It seems surprising that $pdl > 0 is actually $pdl > pdl(0)->badvalue(0)
>>
>> Thoughts?
>> Chris
>>
>>
>> -------- Forwarded Message --------  Subject: Re: [Pdl-general] Weird
>> behaviour of stats with bad values  Date: Tue, 16 Jun 2015 09:18:29 -0400  
>> From:
>> Chris Marshall <devel.chm...@gmail.com> <devel.chm...@gmail.com>  To: Derek
>> Lamb <de...@boulder.swri.edu> <de...@boulder.swri.edu>, Marek Gierliński
>> <marek.gierlin...@gmail.com> <marek.gierlin...@gmail.com>  CC:
>> pdl-gene...@lists.sourceforge.net
>>
>>
>>  I think the problem is that if $s is a badvalue piddle with the
>> badvalue=0
>>  then $s>0 is $s>BAD which is BAD.  If you use a value for badvalue that
>> is
>>  not in the comparison, you should be good.
>>
>>  --Chris
>>
>>  On 6/16/2015 09:11, Derek Lamb wrote:
>>
>> Thanks for the simple example.  That helps a lot.
>>
>>  The actual problem is that piddles with the badflags set always
>> evaluate to BAD when element-wise logical operations are performed on them.
>>
>>   "print $s<0" prints BAD instead of 0 or 1.  "print $x>0" also prints
>> [BAD BAD BAD BAD].
>>
>>  $m and $s have their badflags set (as they should, since they were made
>> from partially-bad data).  You can check if they can be safely cleared, and
>> clear them if so, with $s->check_badflag, etc.  Since $m and $s are
>> 1-element piddles, you can also just set them directly to their scalar
>> values, for example
>>
>>  map{$_=$_->sclr} ($m,$s)=stats($x); #if you know they are only going to
>> be 1 element piddles
>> OR
>> map{$_=$_->((0))} ($m,$s)=stats($x); #if you just want the first value
>>
>>  The fact that $m and $s are 1-element piddles is likely what is causing
>> your problem.  My guess is that this behavior has changed (perhaps
>> intentionally, perhaps not) between your old version and more recent
>> versions, and if you were getting $m and $s as simple perl scalars before
>> you would not have seen this problem.  I can verify that stats() has
>> returned 1-piddles and not perl scalars at least as far back as PDL-2.4.11.
>>
>>  cheers,
>> Derek
>>
>>   On Jun 16, 2015, at 6:29 AM, Marek Gierliński <
>> marek.gierlin...@gmail.com> wrote:
>>
>>  Oops, sorry, I missed a line when copying the text. Here is the code
>> again.
>>
>>  use PDL;
>> use PDL::NiceSlice;
>>
>>
>>  my $x = pdl(1, 2, 3, 0);
>> $x->badflag(1);
>> $x->badvalue(0);
>>
>>  print "x = $x\n";
>>
>>  my ($m, $s) = stats($x);
>>
>>  print "m = $m, s = $s\n";
>> print "s greater than zero\n" if $s > 0;
>> print "s less than zero\n" if $s < 0;
>> print "s equals zero\n" if $s == 0;
>>
>>
>>  On Tue, 16 Jun 2015 at 12:20 Chris Marshall <devel.chm...@gmail.com>
>> wrote:
>>
>>>  Hi Marek-
>>>
>>>  Do you have a complete example showing the problem?
>>>  You don't show where $m and $s are being set below.
>>>
>>>  Thanks,
>>>  Chris
>>>
>>>
>>>  On 6/16/2015 07:04, Marek Gierliński wrote:
>>>
>>> I have recently encountered a weird problem with stats (or statsover)
>>> using bad values. The resulting numbers have a strange property, they
>>> always return true in comparisons. This code:
>>>
>>>   use PDL;
>>> use PDL::NiceSlice;
>>>
>>>  my $x = pdl(1, 2, 3, 0);
>>> $x->badflag(1); $x->badvalue(0);
>>>
>>>   print "m = $m, s = $s\n";
>>> print "s greater than zero\n" if $s > 0;
>>> print "s less than zero\n" if $s < 0;
>>> print "s equals zero\n" if $s == 0;
>>>
>>>  returns the following output:
>>>
>>>  x = [1 2 3 BAD]
>>> m = 2, s = 1
>>> s greater than zero
>>> s less than zero
>>> s equals zero
>>>
>>>  which doesn't make any sense. Can anyone explain this? I always
>>> assumed that 'stats' returned ordinary Perl scalars, but this must be
>>> something different.
>>>
>>>  I'm using PDL version 2.007. We had an older version installed for a
>>> long time and I think this problem appeared when we upgraded to 2.007.
>>>
>>>  Marek
>>>
>>>
>> ------------------------------------------------------------------------------
>> _______________________________________________
>> pdl-devel mailing list
>> pdl-devel@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/pdl-devel
>>
>
>
------------------------------------------------------------------------------
_______________________________________________
pdl-devel mailing list
pdl-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pdl-devel

Reply via email to