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 )