Math-Pari
view release on metacpan or search on metacpan
test_eng/Testout.pm view on Meta::CPAN
@_ = grep {!/^$/} @_; # remove empty lines
return join("\t", @_) if grep {!/^\s*\[.*\]\s*$/} @_; # Not matrix
#return join("\t", @_) if grep {!/^\s*\([^,]*,\s*$/} @_; # Extra commas
map {s/^\s*\[\s*(.*?)\s*\]\s*$/$1/} @_;
my @arr = map { join ', ', split } @_;
'[' . join('; ', @arr) . ']';
}
sub mformat_transp {
return join("\t", @_) unless @_ > 1 and $_[0] =~ /^\[/;
@_ = grep {!/^$/} @_;
return join("\t", @_) if grep {!/^\s*\[.*\]\s*$/} @_; # Not matrix
#return join("\t", @_) if grep {!/^\s*\([^,]*,\s*$/} @_; # Extra commas
map {s/^\s*\[(.*)\]\s*$/$1/} @_;
my @arr = map { [split] } @_;
my @out;
my @dummy = ('') x @{$arr[0]};
for my $ind (0..$#{$arr[0]}) {
for my $subarr (@arr) {
@$subarr > $ind or $subarr->[$ind] = '';
}
push @out, join ', ', map {$_->[$ind]} @arr;
}
'[' . join('; ', @out) . ']';
}
sub massage_floats {
my $in = CORE::shift;
my $pre = CORE::shift || "16g";
$in =~ s/(.\d*)\s+e/$1E/gi; # 1.74 E-78
$in =~ s/\b(\d+\.\d*(e[-+]?\d+)?|\d{10,})\b/sprintf "%.${pre}", $1/gei;
$in;
}
sub o_format {
my ($var,$power) = @_;
return " PARI('O($var^$power)') " if defined $power;
return " PARI('O($var)') ";
}
sub process_cond {
my ($what, $cond, $then, $else, $initial) = @_;
die if $initial =~ /Skip this/;
# warn "Converting `$in'\n`$what', `$cond', `$then', `$else'\n";
if (($what eq 'if') ne (defined $else)) {
return "Skip this `$initial'";
} elsif ($what eq 'if') {
return "( ($cond) ? ($then) : ($else) )";
} else {
return "do { $what ($cond) { $then } }";
}
}
sub nok_print {
my ($n, $in) = (CORE::shift, CORE::shift);
print(@_), return unless $ENV{AUTOMATED_TESTING};
warn("# in = `$in'\n", @_);
print("not ok $n\n");
}
sub update_seen ($) {
my $seen_now = CORE::shift;
@seen{keys %$seen_now} = values %$seen_now;
# my @VARS = map "\$$_", keys %$seen_now;
# eval 'use vars @VARS; 1' or die "use vars: $@";
}
sub pre_update_seen ($) {
my $sym = CORE::shift;
# @seen{keys %$seen_now} = values %$seen_now;
# my @VARS = map "\$$_", keys %$seen_now;
eval "use vars '\$$sym'; 1" or die "use vars: $@";
}
sub subify_iterators ($$) {
my($pre, $code, $subargs, $subdecl) = (CORE::shift, CORE::shift, '', '');
if ($use_dollars_in_argsign) {
$subargs = ' ($) ';
if ($pre =~ /^(v?vector|fordiv|sumdiv|plothexport)\(/) {
$pre =~ /^\w+\s*\([^,]*,\s*([\$\w]+)\s*,/ or die "Cannot find iterator variable in `$pre\{\{\{$code\}\}\}'";
$subdecl = "my $1 = CORE::shift;"
} else {
$pre =~ /^\w+\s*\(\s*([\$\w]+)\s*,/ or die "Cannot find iterator variable in `$pre\{\{\{$code\}\}\}'";
$subdecl = "my $1 = CORE::shift;"
}
}
# /$1 sub$subargs\{$2}/xg;
"$pre sub$subargs\{$subdecl$code\}";
}
sub filter_res ($) { # In PARIs Mod() output there is an extra space comparing to ours
my $r = CORE::shift;
$r =~ s/(\bmatrix\([^\s,]+)\s+/$1,/g;
# warn "### ->\t$r\n";
return $r unless $r =~ /\bMod\(/;
$r =~ s/,\s+/,/g;
return $r;
}
my $prev;
sub process_test {
my ($in, $noans, $out) = @_;
# warn("<<<$in>>>, $noans, <<<@$out>>>");
my($IN, $res, $rres, $rout) = $in;
my $ini_time = time;
my $doprint;
$doprint = 1 if $noans eq 'print';
my $was_prev = $prev;
undef $prev;
$current_num++;
# First a trivial processing:
$in =~ s/^\s*gettime\s*;//; # Starting lines of tests...
$in =~ s/\b(\d+|[a-z]+\(\))\s*\\\s*(\d+(\^\d+)?)/ gdivent($1,$2)/g; # \
$in =~ s/\b(\d+)\s*\\\/\s*(\d+)/ gdivround($1,$2)/g; # \/
$in =~ s/\b(\w+)\s*!/ ifact($1)/g; # !
$in =~ s/,\s*(?=,)/, \$DEFAULT /g; # Default arguments?
$in =~ s/^default\(realprecision,(.*)\)/\\p $1/; # Some cases of default()
$in =~ s/^default\(realbitprecision,(.*)\)/\\pb $1/; # Some cases of default()
$in =~ s/^default\(seriesprecision,(.*)\)/\\ps $1/; # Some cases of default()
$in =~ s/(\w+)\s*\\(\w+(\s*\^\s*\w+)?)/gdivent($1,$2)/g; # random\10^8
$in =~ s/%(?!\s*[\[_\w])/\$was_prev/g; # foo(%)
( run in 1.292 second using v1.01-cache-2.11-cpan-df04353d9ac )