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