Algorithm-NeedlemanWunsch
view release on metacpan or search on metacpan
lib/Algorithm/NeedlemanWunsch.pm view on Meta::CPAN
++$i;
}
$i = $m;
$j = $n;
while (($i > 0) || ($j > 0)) {
my $a = $A->[$i]->[$j];
my @alt;
if ($a & $from_diag) {
die "internal error" unless ($i > 0) && ($j > 0);
push @alt, [ $i - 1, $j - 1 ];
}
if ($a & $from_up) {
die "internal error" unless ($i > 0);
push @alt, [ $i - 1, $j ];
}
if ($a & $from_left) {
die "internal error" unless ($j > 0);
push @alt, [ $i, $j - 1];
}
if (!@alt) {
die "internal error";
}
my $cur = [ $i, $j ];
my $move;
if (@alt == 1) {
$move = $self->_simple_trace_back($cur, $alt[0],
$self->{callbacks});
} else {
$move = $self->_trace_back($cur, \@alt);
}
if ($move eq 'align') {
--$i;
--$j;
} elsif ($move eq 'shift_a') {
--$j;
} elsif ($move eq 'shift_b') {
--$i;
} else {
die "internal error";
}
}
return $D->[$m]->[$n];
}
sub _align_affine {
my $self = shift;
my $a = shift;
my $b = shift;
lib/Algorithm/NeedlemanWunsch.pm view on Meta::CPAN
$flag *= 2;
++$idx;
}
$i = $m;
$j = $n;
while (($i > 0) || ($j > 0)) {
my @alt;
if ($arrow & $from_diag) {
die "internal error" unless ($i > 0) && ($j > 0);
push @alt, [ $i - 1, $j - 1 ];
}
if ($arrow & $from_up) {
die "internal error" unless ($i > 0);
push @alt, [ $i - 1, $j ];
}
if ($arrow & $from_left) {
die "internal error" unless ($j > 0);
push @alt, [ $i, $j - 1];
}
if (!@alt) {
die "internal error";
}
# my $x = join ', ', map { "[ " . $_->[0] . ", " . $_->[1] . " ]"; } @alt;
# warn "$i, $j: $x\n";
my $cur = [ $i, $j ];
my $move;
if (@alt == 1) {
$move = $self->_simple_trace_back($cur, $alt[0],
$self->{callbacks});
lib/Algorithm/NeedlemanWunsch.pm view on Meta::CPAN
\@base, $delta);
@score = @base;
} elsif ($move eq 'shift_b') {
--$i;
my @base = map { $_->[$i]->[$j] } @D;
$arrow = $self->_retread($score[$from_up_idx], $i, $j,
\@base, \@delta_up);
@score = @base;
} else {
die "internal error";
}
}
return $res;
}
sub _retread {
my ($self, $to_score, $i, $j, $base, $delta) = @_;
if ($i == 0) {
lib/Algorithm/NeedlemanWunsch.pm view on Meta::CPAN
my $arg = { };
foreach my $next (@$sources) {
my $m = $self->_simple_trace_back($cur, $next, { });
if ($m eq 'align') {
$arg->{align} = [ $cur->[1] - 1, $cur->[0] - 1 ];
} elsif ($m eq 'shift_a') {
$arg->{shift_a} = $cur->[1] - 1;
} elsif ($m eq 'shift_b') {
$arg->{shift_b} = $cur->[0] - 1;
} else {
die "internal error";
}
}
my $move;
my $cb = $self->{callbacks};
if (exists($cb->{select_align})) {
$move = &{$cb->{select_align}}($arg);
if (!exists($arg->{$move})) {
die "select_align callback returned invalid selection $move.";
}
} else {
my @cn = qw(align shift_a shift_b);
foreach my $m (@cn) {
if (exists($arg->{$m})) {
$move = $m;
last;
}
}
if (!$move) {
die "internal error";
}
if (exists($cb->{$move})) {
if ($move eq 'align') {
&{$cb->{align}}(@{$arg->{align}});
} else {
&{$cb->{$move}}($arg->{$move});
}
}
}
lib/Algorithm/NeedlemanWunsch.pm view on Meta::CPAN
if ($next->[0] == $cur->[0] - 1) {
if ($next->[1] == $cur->[1] - 1) {
if (exists($cb->{align})) {
&{$cb->{align}}($next->[1], $next->[0]);
}
return 'align';
} else {
if ($next->[1] != $cur->[1]) {
die "internal error";
}
if (exists($cb->{shift_b})) {
&{$cb->{shift_b}}($cur->[0] - 1);
}
return 'shift_b';
}
} else {
if ($next->[0] != $cur->[0]) {
die "internal error";
}
if ($next->[1] != $cur->[1] - 1) {
die "internal error";
}
if (exists($cb->{shift_a})) {
&{$cb->{shift_a}}($cur->[1] - 1);
}
return 'shift_a';
}
}
( run in 0.556 second using v1.01-cache-2.11-cpan-65fba6d93b7 )