1 package DX::Step::Backtrack;
4 use DX::Utils qw(format_deps compact_deps);
9 has resolution_space => (is => 'ro', isa => ResolutionSpace, required => 1);
13 my $rspace = $self->resolution_space;
14 trace backtrack => [ statement => [
15 [ symbol => 'backtrack' ],
18 trace backtrack => [ statement => [
19 [ symbol => 'failure_dependencies' ],
20 format_deps($rspace->geometry_depends_on)
22 my $dmap = DX::DependencyMap->new_empty
23 ->with_dependencies_for(
24 backtrack => $rspace->geometry_depends_on
26 DECISION: foreach my $adj (@{$ss->decisions_taken}) {
27 my ($rspace_was, $ss_was) = @$adj;
28 trace backtrack => [ statement => [
29 [ symbol => 'decision' ],
31 [ for => $rspace_was->proposition, ]
35 foreach my $event (@{$rspace_was->aperture}) {
36 if ($dmap->dependents_of($event)) {
37 my $remain = $rspace_was->remaining_resolution_space;
38 if (@{$remain->members}) {
39 trace backtrack => [ statement => [
40 [ symbol => 'found_alternative' ]
42 trace backtrack => [ 'leave_block' ];
44 next_step => $remain->with_geometry_dependencies(
45 $dmap->dependencies_for('backtrack')
49 $dmap = $dmap->with_dependencies_for(
50 backtrack => $rspace_was->geometry_depends_on
52 trace backtrack => [ statement => [
53 [ symbol => 'failure_dependencies' ],
54 format_deps(compact_deps($dmap->dependencies_for('backtrack')))
59 trace backtrack => [ statement => [ [ symbol => 'non_relevant' ] ] ];
61 trace backtrack => [ statement => [ [ symbol => 'exhaustion' ] ] ];
62 trace backtrack => [ 'leave_block' ];
65 => $ss->on_exhaustion_step->but(
66 exhaustion_depends_on => $dmap->dependencies_for('backtrack')