|
Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
|
Recursive depth-first backtracking over an implicit state space. More...
#include <Backtracking.H>
Public Types | |
| using | Domain_Type = Domain |
| Type of the problem domain. | |
| using | State = typename Domain::State |
| Concrete search state type. | |
| using | Move = typename Domain::Move |
| Move type. | |
| using | Solution = SearchSolution< State, Move > |
| Concrete solution type. | |
| using | Solution_Compare = state_search_detail::PreferShallowerSolution< State, Move > |
| Internal solution comparator. | |
| using | Result = SearchResult< Solution, Solution_Compare > |
| Aggregated result type. | |
Public Member Functions | |
| Depth_First_Backtracking (Domain domain, ExplorationPolicy policy={}, const SearchLimits &limits={}, Solution_Compare compare={}) | |
| Build an engine bound to one domain adapter. | |
| const Domain & | domain () const noexcept |
| Read-only access to the bound domain adapter. | |
| Domain & | domain () noexcept |
| Mutable access to the bound domain adapter. | |
| const ExplorationPolicy & | policy () const noexcept |
| Current exploration policy. | |
| const SearchLimits & | limits () const noexcept |
| Current hard limits. | |
| void | set_policy (const ExplorationPolicy &policy) noexcept |
| Replace the exploration policy for future runs. | |
| void | set_limits (const SearchLimits &limits) noexcept |
| Replace the hard limits for future runs. | |
| Result | search (State initial_state) |
Execute a depth-first backtracking search from initial_state. | |
| template<typename OnSolution > requires SearchSolutionVisitor<OnSolution, Solution> | |
| Result | search (State initial_state, OnSolution &on_solution) |
Execute DFS/backtracking and invoke on_solution on each solution. | |
| template<typename OnSolution > requires SearchSolutionVisitor<OnSolution, Solution> | |
| Result | search (State initial_state, OnSolution &&on_solution) |
| Rvalue-friendly overload for temporary solution visitors. | |
| template<typename VisitedSet > requires SearchStateKeyProvider<Domain> | |
| and VisitedBoundMap< VisitedSet, typename Domain::State_Key, size_t > Result | search (State initial_state, VisitedSet &visited) |
| DFS/backtracking with a depth-aware visited-state map. | |
| template<typename VisitedSet , typename OnSolution > requires SearchStateKeyProvider<Domain> | |
| and VisitedBoundMap< VisitedSet, typename Domain::State_Key, size_t > and SearchSolutionVisitor< OnSolution, Solution > Result | search (State initial_state, VisitedSet &visited, OnSolution &on_solution) |
| DFS/backtracking with depth-aware visited-state tracking and a solution callback. | |
Static Public Attributes | |
| static constexpr bool | supports_best_first = false |
| Compile-time marker: Depth_First_Backtracking only supports Depth_First strategy. | |
Private Member Functions | |
| bool | stop_after_solution (Result &result) const |
| bool | expansion_limit_reached (Result &result) const |
| template<typename OnSolution > requires SearchSolutionVisitor<OnSolution, Solution> | |
| bool | dfs (State &state, SearchPath< Move > &path, const size_t depth, Result &result, OnSolution &on_solution) |
| template<typename OnSolution , typename VisitedSet > requires SearchSolutionVisitor<OnSolution, Solution> | |
| and VisitedBoundMap< VisitedSet, typename Domain::State_Key, size_t > bool | dfs_visited (State &state, SearchPath< Move > &path, const size_t depth, Result &result, OnSolution &on_solution, VisitedSet &visited) |
Private Attributes | |
| Domain | domain_ |
| ExplorationPolicy | policy_ |
| SearchLimits | limits_ |
| Solution_Compare | compare_ |
Recursive depth-first backtracking over an implicit state space.
The domain contract is given by Aleph::BacktrackingDomain. Goal states are treated as accepted solutions and are not expanded further. Domains may also expose optional is_terminal() and should_prune() hooks.
| Domain | problem adapter exposing State, Move, successor generation and apply() / undo(). |
Definition at line 85 of file Backtracking.H.
| using Aleph::Depth_First_Backtracking< Domain >::Domain_Type = Domain |
Type of the problem domain.
Definition at line 89 of file Backtracking.H.
| using Aleph::Depth_First_Backtracking< Domain >::Move = typename Domain::Move |
Move type.
Definition at line 93 of file Backtracking.H.
| using Aleph::Depth_First_Backtracking< Domain >::Result = SearchResult<Solution, Solution_Compare> |
Aggregated result type.
Definition at line 99 of file Backtracking.H.
| using Aleph::Depth_First_Backtracking< Domain >::Solution = SearchSolution<State, Move> |
Concrete solution type.
Definition at line 95 of file Backtracking.H.
| using Aleph::Depth_First_Backtracking< Domain >::Solution_Compare = state_search_detail::PreferShallowerSolution<State, Move> |
Internal solution comparator.
Definition at line 97 of file Backtracking.H.
| using Aleph::Depth_First_Backtracking< Domain >::State = typename Domain::State |
Concrete search state type.
Definition at line 91 of file Backtracking.H.
|
inlineexplicit |
Build an engine bound to one domain adapter.
| domain | Problem adapter captured by value. Ownership is transferred into the engine; move-only domains are accepted and remain owned for the lifetime of the Depth_First_Backtracking. |
| policy | Exploration policy copied into the engine. Only Depth_First traversal is honored during search. |
| limits | Search constraints copied and enforced on every run (such as depth, expansions and solutions). |
| compare | Functor used to rank solutions kept by Result; moved into the result objects returned by search. |
| None. |
Definition at line 127 of file Backtracking.H.
|
inlineprivate |
Definition at line 394 of file Backtracking.H.
References Aleph::Array< T >::append(), Aleph::SearchResult< Solution, Compare >::best_solution, Aleph::BestSolution< Solution, Compare >::consider(), Aleph::Depth_First_Backtracking< Domain >::dfs(), Aleph::divide_and_conquer_partition_dp(), Aleph::Depth_First_Backtracking< Domain >::domain_, Aleph::SearchStats::expanded_states, Aleph::Depth_First_Backtracking< Domain >::expansion_limit_reached(), Aleph::SearchStats::generated_successors, Aleph::search_engine_detail::is_terminal_state(), Aleph::Depth_First_Backtracking< Domain >::limits_, Aleph::SearchLimits::max_depth, Aleph::SearchStats::max_depth_reached, Aleph::SearchStats::pruned_by_depth, Aleph::SearchStats::pruned_by_domain, Aleph::Array< T >::remove_last(), Aleph::search_engine_detail::should_prune_state(), Aleph::SearchStats::solutions_found, Aleph::SearchResult< Solution, Compare >::stats, Aleph::SearchResult< Solution, Compare >::status, Aleph::Depth_First_Backtracking< Domain >::stop_after_solution(), Aleph::StoppedOnSolution, Aleph::SearchStats::terminal_states, and Aleph::SearchStats::visited_states.
Referenced by Aleph::Depth_First_Backtracking< Domain >::dfs(), and Aleph::Depth_First_Backtracking< Domain >::search().
|
inlineprivate |
Definition at line 470 of file Backtracking.H.
References Aleph::and, Aleph::Array< T >::append(), Aleph::SearchResult< Solution, Compare >::best_solution, Aleph::BestSolution< Solution, Compare >::consider(), Aleph::Depth_First_Backtracking< Domain >::dfs_visited(), Aleph::divide_and_conquer_partition_dp(), Aleph::Depth_First_Backtracking< Domain >::domain_, Aleph::SearchStats::expanded_states, Aleph::Depth_First_Backtracking< Domain >::expansion_limit_reached(), Aleph::SearchStats::generated_successors, Aleph::search_engine_detail::is_terminal_state(), Aleph::Depth_First_Backtracking< Domain >::limits_, Aleph::SearchLimits::max_depth, Aleph::SearchStats::max_depth_reached, Aleph::SearchStats::pruned_by_depth, Aleph::SearchStats::pruned_by_domain, Aleph::SearchStats::pruned_by_visited, Aleph::Array< T >::remove_last(), Aleph::search_engine_detail::should_prune_state(), Aleph::SearchStats::solutions_found, Aleph::SearchResult< Solution, Compare >::stats, Aleph::SearchResult< Solution, Compare >::status, Aleph::Depth_First_Backtracking< Domain >::stop_after_solution(), Aleph::StoppedOnSolution, Aleph::SearchStats::terminal_states, and Aleph::SearchStats::visited_states.
Referenced by Aleph::Depth_First_Backtracking< Domain >::dfs_visited(), and Aleph::Depth_First_Backtracking< Domain >::search().
|
inlinenoexcept |
Read-only access to the bound domain adapter.
| None. |
Definition at line 144 of file Backtracking.H.
References Aleph::Depth_First_Backtracking< Domain >::domain_.
|
inlinenoexcept |
Mutable access to the bound domain adapter.
| None. |
Definition at line 157 of file Backtracking.H.
References Aleph::Depth_First_Backtracking< Domain >::domain_.
|
inlineprivate |
Definition at line 387 of file Backtracking.H.
References Aleph::search_engine_detail::expansion_limit_reached(), and Aleph::Depth_First_Backtracking< Domain >::limits_.
Referenced by Aleph::Depth_First_Backtracking< Domain >::dfs(), and Aleph::Depth_First_Backtracking< Domain >::dfs_visited().
|
inlinenoexcept |
Current hard limits.
| None. |
Definition at line 183 of file Backtracking.H.
References Aleph::Depth_First_Backtracking< Domain >::limits_.
Referenced by Aleph::Depth_First_Backtracking< Domain >::set_limits().
|
inlinenoexcept |
Current exploration policy.
| None. |
Definition at line 170 of file Backtracking.H.
References Aleph::Depth_First_Backtracking< Domain >::policy_.
Referenced by Aleph::Depth_First_Backtracking< Domain >::set_policy().
|
inline |
Execute a depth-first backtracking search from initial_state.
| initial_state | Mutable root state provided by value; the engine restores it before returning so callers retain ownership. |
| std::invalid_argument | if policy().strategy is not ExplorationPolicy::Strategy::Depth_First or if limits().max_solutions == 0. |
Definition at line 231 of file Backtracking.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Depth_First_Backtracking< Domain >::search().
Referenced by Aleph::Depth_First_Backtracking< Domain >::search(), Aleph::Depth_First_Backtracking< Domain >::search(), Aleph::Depth_First_Backtracking< Domain >::search(), and TEST().
|
inline |
Rvalue-friendly overload for temporary solution visitors.
| initial_state | Mutable root state explored by value. |
| on_solution | Temporary visitor consumed (moved) by the call. |
| std::invalid_argument | under the same conditions as the lvalue overload. |
Definition at line 291 of file Backtracking.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Depth_First_Backtracking< Domain >::search().
|
inline |
Execute DFS/backtracking and invoke on_solution on each solution.
| initial_state | Mutable root state explored by value. |
| on_solution | Functor satisfying Aleph::SearchSolutionVisitor that receives immutable Solution snapshots and returns true to continue or false to stop immediately. |
| std::invalid_argument | if the exploration policy is not depth-first or if limits().max_solutions == 0. |
Definition at line 255 of file Backtracking.H.
References ah_invalid_argument_if, Aleph::Depth_First_Backtracking< Domain >::compare_, Aleph::ExplorationPolicy::Depth_First, Aleph::Depth_First_Backtracking< Domain >::dfs(), Aleph::divide_and_conquer_partition_dp(), Aleph::SearchStats::elapsed_ms, Aleph::Exhausted, Aleph::SearchResult< Solution, Compare >::limits, Aleph::Depth_First_Backtracking< Domain >::limits_, Aleph::SearchLimits::max_solutions, Aleph::NotStarted, Aleph::SearchResult< Solution, Compare >::policy, Aleph::Depth_First_Backtracking< Domain >::policy_, Aleph::reserve_search_path(), Aleph::search_elapsed_ms(), Aleph::SearchResult< Solution, Compare >::stats, Aleph::SearchResult< Solution, Compare >::status, and Aleph::ExplorationPolicy::strategy.
|
inline |
DFS/backtracking with a depth-aware visited-state map.
Converts tree-search to graph-search: states are marked globally after passing limit/pruning checks. A state is pruned only when a previous expansion reached it at an equal or shallower depth (i.e., with at least as much remaining budget); if the current path is shallower the stored depth is updated and exploration continues. Requires domains exposing state_key(state).
| initial_state | Mutable root state explored by value. |
| visited | Caller-managed depth map that accumulates visited keys across calls; must satisfy Aleph::VisitedBoundMap with size_t as the bound type (e.g. SearchStorageMap<Key, size_t>). |
| std::invalid_argument | if the exploration policy is not depth-first or if limits().max_solutions == 0. |
visited. visited map. Definition at line 323 of file Backtracking.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Depth_First_Backtracking< Domain >::search().
|
inline |
DFS/backtracking with depth-aware visited-state tracking and a solution callback.
| initial_state | Mutable root state explored by value. |
| visited | Caller-managed depth map updated at every state expansion; must satisfy Aleph::VisitedBoundMap with size_t as bound type (e.g. SearchStorageMap<Key, size_t>). |
| on_solution | Solution visitor invoked for each solution; returning false stops the search immediately. |
| std::invalid_argument | if the policy is not depth-first or if the configured maximum number of solutions is zero. |
visited. Definition at line 352 of file Backtracking.H.
References ah_invalid_argument_if, Aleph::Depth_First_Backtracking< Domain >::compare_, Aleph::ExplorationPolicy::Depth_First, Aleph::Depth_First_Backtracking< Domain >::dfs_visited(), Aleph::divide_and_conquer_partition_dp(), Aleph::SearchStats::elapsed_ms, Aleph::Exhausted, Aleph::SearchResult< Solution, Compare >::limits, Aleph::Depth_First_Backtracking< Domain >::limits_, Aleph::SearchLimits::max_solutions, Aleph::NotStarted, Aleph::SearchResult< Solution, Compare >::policy, Aleph::Depth_First_Backtracking< Domain >::policy_, Aleph::reserve_search_path(), Aleph::search_elapsed_ms(), Aleph::SearchResult< Solution, Compare >::stats, Aleph::SearchResult< Solution, Compare >::status, and Aleph::ExplorationPolicy::strategy.
|
inlinenoexcept |
Replace the hard limits for future runs.
| limits | New SearchLimits copied verbatim into the engine. |
| None. |
Definition at line 209 of file Backtracking.H.
References Aleph::Depth_First_Backtracking< Domain >::limits(), and Aleph::Depth_First_Backtracking< Domain >::limits_.
|
inlinenoexcept |
Replace the exploration policy for future runs.
| policy | Exploration policy copied and used by subsequent search calls. |
| None. |
Definition at line 196 of file Backtracking.H.
References Aleph::Depth_First_Backtracking< Domain >::policy(), and Aleph::Depth_First_Backtracking< Domain >::policy_.
|
inlineprivate |
Definition at line 382 of file Backtracking.H.
References Aleph::Depth_First_Backtracking< Domain >::limits_, Aleph::Depth_First_Backtracking< Domain >::policy_, and Aleph::search_engine_detail::stop_after_solution().
Referenced by Aleph::Depth_First_Backtracking< Domain >::dfs(), and Aleph::Depth_First_Backtracking< Domain >::dfs_visited().
|
private |
Definition at line 380 of file Backtracking.H.
Referenced by Aleph::Depth_First_Backtracking< Domain >::search(), and Aleph::Depth_First_Backtracking< Domain >::search().
|
private |
|
private |
Definition at line 379 of file Backtracking.H.
Referenced by Aleph::Depth_First_Backtracking< Domain >::dfs(), Aleph::Depth_First_Backtracking< Domain >::dfs_visited(), Aleph::Depth_First_Backtracking< Domain >::expansion_limit_reached(), Aleph::Depth_First_Backtracking< Domain >::limits(), Aleph::Depth_First_Backtracking< Domain >::search(), Aleph::Depth_First_Backtracking< Domain >::search(), Aleph::Depth_First_Backtracking< Domain >::set_limits(), and Aleph::Depth_First_Backtracking< Domain >::stop_after_solution().
|
private |
Definition at line 378 of file Backtracking.H.
Referenced by Aleph::Depth_First_Backtracking< Domain >::policy(), Aleph::Depth_First_Backtracking< Domain >::search(), Aleph::Depth_First_Backtracking< Domain >::search(), Aleph::Depth_First_Backtracking< Domain >::set_policy(), and Aleph::Depth_First_Backtracking< Domain >::stop_after_solution().
|
staticconstexpr |
Compile-time marker: Depth_First_Backtracking only supports Depth_First strategy.
Passing ExplorationPolicy::Strategy::Best_First to this engine raises std::invalid_argument at runtime. Check this constant before constructing a policy to detect the mismatch at compile time.
Definition at line 108 of file Backtracking.H.