Algorithm-Search
view release on metacpan or search on metacpan
lib/Algorithm/Search.pm view on Meta::CPAN
}
}
push @{$self->{info}}, [$value, $self->{cost}, $self->{commit}];
}
if ($self->{return_search_trace}) {
push @{$self->{trace}}, {
cost => $self->{cost},
commit => $self->{commit},
value_before => undef,
value_after => $value,
move => undef,
};
}
}
sub forward_rdfs_search_step {
my $self = shift;
my $search_this = $self->{search_this};
my $next_move = $self->{next_move};
#print STDERR "frdfs next move is $next_move\n";
my $new_cost = $search_this->move($next_move);
$self->{steps}++;
if (!defined $new_cost) {
$self->{moving_forward} = 0;
return;
}
if (($self->{cost_cannot_increase}) && ($new_cost > $self->{cost})) {
#print STDERR "cost increased was ".$self->{cost}." to be $new_cost\n";
$search_this->reverse_move($next_move);
$self->{moving_forward} = 0;
return;
}
my $value;
if ($self->{value_function}) {
$value = $search_this->value;
#print STDERR "considering vf on $value\n";
if ($self->{do_not_repeat_values}) {
if ($self->{handled}->{$value}) {
#print STDERR "handled already\n";
$search_this->reverse_move($next_move);
$self->{moving_forward} = 0;
return;
}
$self->{handled}->{$value} = 1;
}
if ($self->{path_values}->{$value}) {
#print STDERR "repeating value\n";
$search_this->reverse_move($next_move);
$self->{moving_forward} = 0;
return;
}
}
my $new_commit;
if ($self->{committing}) {
$new_commit = $search_this->commit_level;
}
if ($self->{return_search_trace}) {
#use Data::Dumper;
#print STDERR "si ".Dumper($self->{info})."\n";
push @{$self->{trace}}, {
cost => $new_cost,
commit => $new_commit,
value_after => $value,
value_before => $self->{info}->[-1]->[0],
move => $next_move,
};
}
if ($search_this->is_solution) {
push @{$self->{paths}}, [@{$self->{path}}, $next_move];
if ($self->{preserve_solutions}) {
push @{$self->{solutions}}, $search_this->copy;
}
if (++$self->{solutions_found} == $self->{solutions_to_find}) {
$self->{search_completed} = 1;
$self->{continue_search} = 0;
}
# else {
# $self->{last_path} = $self->{path} = [@{$self->{path}}];
# }
}
if (scalar(@{$self->{path}}) == $self->{maximum_depth_minus_one}) {
#print STDERR "hit max depth ".$self->{maximum_depth}."\n";
$search_this->reverse_move($next_move);
$self->{moving_forward} = 0;
return;
}
$self->{next_move} = $search_this->move_after_given();
if (defined $self->{next_move}) {
if ($self->{value_function}) {
$self->{path_values}->{$value} = 1;
}
push @{$self->{path}}, $next_move;
push @{$self->{info}}, [$value, $new_cost, $new_commit];
$self->{cost} = $new_cost;
$self->{commit} = $new_commit;
return;
}
else {
$self->{next_move} = $next_move;
$search_this->reverse_move($next_move);
$self->{moving_forward} = 0;
return;
}
}
sub backward_rdfs_search_step {
my $self = shift;
my $search_this = $self->{search_this};
my $next_move = $search_this->move_after_given($self->{next_move});
if (defined $next_move) {
#print STDERR "back Have new move\n";
$self->{moving_forward} = 1;
$self->{next_move} = $next_move;
return;
( run in 0.668 second using v1.01-cache-2.11-cpan-39bf76dae61 )