Core.pm (PDL-2.077) | : | Core.pm (PDL-2.078) | ||
---|---|---|---|---|

skipping to change at line 200 | skipping to change at line 200 | |||

=head2 Broadcast rules and assignments | =head2 Broadcast rules and assignments | |||

Versions of PDL through 2.4.10 have some irregularity with broadcasting and | Versions of PDL through 2.4.10 have some irregularity with broadcasting and | |||

assignments. Currently the broadcasting engine performs a full expansion of | assignments. Currently the broadcasting engine performs a full expansion of | |||

both sides of the computed assignment operator C<.=> (which assigns values | both sides of the computed assignment operator C<.=> (which assigns values | |||

to a pre-existing PDL). This leads to counter-intuitive behavior in | to a pre-existing PDL). This leads to counter-intuitive behavior in | |||

some cases: | some cases: | |||

=over 3 | =over 3 | |||

=item * Generalized scalars and computed assignment | ||||

If the PDL on the left-hand side of C<.=> has a dim of size 1, it can be | ||||

treated as a generalized scalar, as in: | ||||

$x = sequence(2,3); | ||||

$y = zeroes(1,3); | ||||

$y .= $x; | ||||

In this case, C<$y> is automatically treated as a 2x3-PDL during the | ||||

broadcasting operation, but half of the values from C<$x> silently disappear. | ||||

The output is, as Kernighan and Ritchie would say, "undefined". | ||||

Further, if the value on the right of C<.=> is empty, then C<.=> becomes | ||||

a silent no-op: | ||||

$x = zeroes(0); | ||||

$y = zeroes(1); | ||||

$y .= $x+1; | ||||

print $y; | ||||

will print C<[0]>. In this case, "$x+1" is empty, and "$y" is a generalized | ||||

scalar that is adjusted to be empty, so the assignment is carried out for | ||||

zero elements (a no-op). | ||||

Both of these behaviors are considered harmful and should not be relied upon: | ||||

they may be patched away in a future version of PDL. | ||||

=item * Empty PDLs and generalized scalars | =item * Empty PDLs and generalized scalars | |||

Generalized scalars (PDLs with a dim of size 1) can match any size in the | Generalized scalars (PDLs with a dim of size 1) can match any size in the | |||

corresponding dim, including 0. Thus, | corresponding dim, including 0. Thus, | |||

$x = ones(2,0); | $x = ones(2,0); | |||

$y = sequence(2,1); | $y = sequence(2,1); | |||

$c = $x * $y; | $c = $x * $y; | |||

print $c; | print $c; | |||

skipping to change at line 3433 | skipping to change at line 3405 | |||

} | } | |||

chop $ret; $ret.="]"; | chop $ret; $ret.="]"; | |||

return $ret; | return $ret; | |||

} | } | |||

# String 2D array in nice uniform format | # String 2D array in nice uniform format | |||

sub str2D{ | sub str2D{ | |||

my($self,$format,$level)=@_; | my($self,$format,$level)=@_; | |||

# print "STR2D:\n"; $self->printdims(); | ||||

my @dims = $self->dims(); | my @dims = $self->dims(); | |||

barf "Not 2D" if scalar(@dims)!=2; | barf "Not 2D" if scalar(@dims)!=2; | |||

my $x = listref_c($self); | my $x = listref_c($self); | |||

my ($i, $f, $t, $len, $ret); | my ($i, $f, $t, $len, $ret); | |||

my $dtype = $self->get_datatype(); | my $dtype = $self->get_datatype(); | |||

my $badflag = $self->badflag(); | my $badflag = $self->badflag(); | |||

my $findmax = 1; | my $findmax = 1; | |||

if (!defined $format || $format eq "") { | if (!defined $format || $format eq "") { | |||

skipping to change at line 3972 | skipping to change at line 3943 | |||

File::Map::sys_map( | File::Map::sys_map( | |||

${$pdl_dataref}, | ${$pdl_dataref}, | |||

$len, | $len, | |||

File::Map::PROT_READ() | ($writable ? File::Map::PROT_WRITE() : 0), | File::Map::PROT_READ() | ($writable ? File::Map::PROT_WRITE() : 0), | |||

($shared ? File::Map::MAP_SHARED() : File::Map::MAP_PRIVATE()), | ($shared ? File::Map::MAP_SHARED() : File::Map::MAP_PRIVATE()), | |||

$fh, | $fh, | |||

0 | 0 | |||

); | ); | |||

$pdl->upd_data; | $pdl->upd_data(1); | |||

if ($PDL::debug) { | if ($PDL::debug) { | |||

printf STDERR "set_data_by_file_map: length \${\$pdl_dataref} is %d.\n" , length ${$pdl_dataref}; | printf STDERR "set_data_by_file_map: length \${\$pdl_dataref} is %d.\n" , length ${$pdl_dataref}; | |||

} | } | |||

$pdl->set_donttouchdata($len); | $pdl->set_donttouchdata($len); | |||

} else { | } else { | |||

# Special case: zero-length file | # Special case: zero-length file | |||

$_[0] = undef; | $_[0] = undef; | |||

End of changes. 3 change blocks. | ||||

30 lines changed or deleted | | 1 lines changed or added |