Algorithm-DependencySolver
view release on metacpan or search on metacpan
lib/Algorithm/DependencySolver/Solver.pm view on Meta::CPAN
vice-versa). Suppose that the edge from C<$n> to C<$a> has been
removed. Can the edge from C<$n> to C<$b> safely be removed?
Using the algorithm described above, yes! This is because there is
another path from C<$n> to C<$b>: C<$n -> $b -> $a -> b>. We
can, of course, detect such occurrences; however, I choose not to,
because it's not clear to me what the most elegant result should be in
these situations. Semantically, it does not matter whether the edge
from C<$n> to the C<$a,$b>-cycle is from C<$n> to C<$a>, or C<$n> to
C<$b>. Which should it be? Both, or one-or-the-other (presumably
decided arbitrarily)?
Properties:
* This method can be safely called on cyclic graphs (i.e., it will not
enter a non-terminating loop)
* This method will not fail early if a cycle is encountered (i.e., it
will do as much work as it can, even though the graph is probably
invalid)
lib/Algorithm/DependencySolver/Traversal.pm view on Meta::CPAN
);
=head2 C<choose>
During the traversal, we maintain a list of nodes, C<visitable>, which
can be immediately visited. If this list is empty, the traversal is
complete.
The C<choose> function is called to decide which node is C<visitable>
to visit next. Note that C<choose> is guaranteed to be called, even if
C<visitable> is a singleton (but not if it's empty).
=cut
method choose() {
my $size = @{$self->get_visitable};
die "choose(): precondition for size failed" unless $size;
my $choice = $self->get_choose->(@{$self->get_visitable});
die "choose() function didn't make a choice! ($size)"
( run in 1.075 second using v1.01-cache-2.11-cpan-de7293f3b23 )