Please please please could one of you turn the example into a *.t file which we 
can use to permanently constrain PDL behaviour going forward?

Ed

From: Marek Gierliński 
Sent: Tuesday, June 16, 2015 5:12 PM
To: Chris Marshall ; pdl-devel@lists.sourceforge.net 
Subject: Re: [Pdl-devel] Fwd: Re: [Pdl-general] Weird behaviour of stats with 
bad values

Thanks a lot, Chris! 

Marek


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

  Marek-

  I've opened a highest priority bug report based on your information:

    http://sourceforge.net/p/pdl/bugs/390

  Could you add information on your system specifics to the ticket
  for reference (the output of perldl -V has the main information)?
  We'll be updating the ticket as information becomes available.

  Thanks for reporting the problem!

  Chris





  On 6/16/2015 09:49, Marek Gierliński wrote:

    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 mailto:devel.chm...@gmail.com 
                To:  Derek Lamb mailto:de...@boulder.swri.edu, Marek Gierliński 
mailto: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
------------------------------------------------------------------------------
_______________________________________________
pdl-devel mailing list
pdl-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pdl-devel

Reply via email to