App-ErrorCalculator
view release on metacpan or search on metacpan
lib/App/ErrorCalculator.pm view on Meta::CPAN
($name, $body) = _parse_function($f);
if (not defined $name) {
$funclabel->set_text('Invalid Function');
}
else {
$funclabel->set_text('Valid Function ');
}
}
my $data;
sub _read_file {
my $file = $inentry->get_text();
if (not -e $file) {
$inlabel->set_text('Invalid Data File');
$data = undef;
}
my $ref = Spreadsheet::Read::ReadData($file);
if (not defined $ref) {
$inlabel->set_text('Invalid Data File');
$data = undef;
}
else {
$inlabel->set_text('Valid Data File ');
$data = $ref;
}
}
sub _run_calculation {
my $func = $body;
if (not $funclabel->get_text() eq 'Valid Function ') {
new_and_run
Gtk2::Ex::Dialogs::ErrorMsg( text => "You should give me a valid formula first." );
return();
}
if (not $inlabel->get_text() eq 'Valid Data File ') {
new_and_run
Gtk2::Ex::Dialogs::ErrorMsg( text => "You need to select a valid input data file first." );
return();
}
if (not $outlabel->get_text() eq 'Valid Output File ') {
new_and_run
Gtk2::Ex::Dialogs::ErrorMsg( text => "You need to select a valid output data file first." );
return();
}
my $sym = $name->name;
my $csv = $data->[1];
my $cell = $csv->{cell};
my @vars = $func->signature;
my %vars = map {($_ => undef)} @vars;
my %errors;
foreach my $col (1..$csv->{maxcol}) {
my $name = $cell->[$col][1];
if ($name =~ /^([a-zA-Z]\w*)_(\d+)$/) {
# looks like an error
my $var = $1;
my $id = $2;
if (exists $vars{$var}) {
$errors{$var}[$id] = $col;
}
next;
}
next if not exists $vars{$name};
next if defined $vars{$name};
$vars{$name} = $col;
}
my @undefined = grep {not defined $vars{$_}} keys %vars;
if (@undefined) {
new_and_run
Gtk2::Ex::Dialogs::ErrorMsg( text => "The data file does not include columns for the following variables:\n" . join("\n", sort @undefined) );
return();
}
my $maxrow = 0;
foreach my $col (values %vars) {
my $this = @{$cell->[$col]};
$maxrow = $this if $this > $maxrow;
}
$maxrow--;
if ($maxrow < 2) {
new_and_run
Gtk2::Ex::Dialogs::ErrorMsg( text => "The data file does not have any data!" );
return();
}
my $maxerr = 0;
foreach my $k (keys %errors) {
$maxerr = @{$errors{$k}} if $maxerr < @{$errors{$k}};
}
$maxerr--;
my @out;
foreach my $i (2..$maxrow) {
my %v =
map {
my $n = $_;
my $v = $cell->[$vars{$_}][$i];
$v = 0 if not defined $v;
$v =~ s/,/./g;
my @e =
map {s/,/./g}
map {defined($_) ? $_ : 0}
map {
my $col = $errors{$n}[$_];
defined $col ? $cell->[$col][$i] : 0
}
1..$maxerr;
($n => Number::WithError->new_big($v, @e))
}
keys %vars;
my $value = $body->value(%v);
$value = Number::WithError->new_big($value) if not ref($value) =~ /^Number::WithError/;
( run in 1.602 second using v1.01-cache-2.11-cpan-39bf76dae61 )