package Dda;
require Exporter;

@ISA = qw(Exporter);

@EXPORT = qw(
	step_dda
	eval_poly
	poly_outputs_to_seeds
	eval_poly_mesh);

# ----------------------------------------------------------------
sub step_dda
{
	my ($regsref) = @_;
	my $i;

	die "step_dda():  Need vector reference as argument.\n"
		unless defined $regsref;

	for $i (0 .. $#$regsref - 1) {
		$$regsref[$i] = $$regsref[$i] + $$regsref[$i + 1];
	}
}

# ----------------------------------------------------------------
sub eval_poly_mesh
{
	my ($coefs_ref, $x0, $h) = @_;
	my $i;
	my $x;
	my $N;
	my @y;

	die "eval_poly_mesh():  Need vector reference, x0, h and N as arguments.\n"
		unless defined $h;

	$N = $#$coefs_ref;

	for $i (0 .. $N) {
		$x = $x0 + $i * $h;
		$y[$i] = eval_poly($coefs_ref, $x);
	}
	return @y;
}

# ----------------------------------------------------------------
sub poly_outputs_to_seeds
{
	my ($outputs_ref) = @_;
	my $N = $#$outputs_ref;
	my $i;
	my $j;
	my @c;

	die "poly_outputs_to_seeds():  Need vector reference as argument.\n"
		unless defined $outputs_ref;

	for $j (0 .. $N) {
		$c[$j] = $$outputs_ref[$j];
	}

	for ($i = 1; $i <= $N; $i++) {
		for ($j = $N; $j >= $i; $j--) {
			$c[$j] = $c[$j] - $c[$j - 1];
		}
	}
	return @c;
}

# ----------------------------------------------------------------
sub eval_poly
{
	my ($coefs_ref, $x) = @_;
	my $y;
	my $i;
	my $N;

	die "eval_poly():  Need vector reference and x as arguments.\n"
		unless defined $x;

	$N = $#$coefs_ref;
	$y = $$coefs_ref[$N];

	for ($i = $N - 1; $i >= 0; $i--) {
		$y *= $x;
		$y += $$coefs_ref[$i];
	}

	return $y;
}
