Concurrent tree search, branch by branch.
A framework and implementation for concurrently running a class of tree search algorithms. Ramis decouples the specific algorithm from its concurrent state exploration logic, allowing easy and efficient implementation of concurrent algorithms.
Ramis can run any algorithm expressible as an oracle-guided tree search satisfying following
constraints:
- Tree structure — the search space is an (implicit) tree where children of a node represent one step of refinement (for example a smaller test case)
-
Pure oracle — acceptance depends only on the candidate's value, not on evaluation
order or concurrent context. In other words the state at node
$N$ should depend entirely on its trace. -
Enumerable neighbourhood — For a node
$N$ it must be decidable which child of it is best. This means that all children need to be constructable, or a forced accept needs to be injected
All following guarantees depend on the generic algorithm allowing such a guarantee and being sound in that regard.
1-minimality. The returned state has no single-step improvement: the oracle rejects every
immediate child of the result. Ramis achieves this by evaluating every child of a node
concurrently before advancing.
N concurrent workers.
Soundness. Every state accepted and retained by the scheduler satisfies the oracle.
Describe your algorithm in terms of the trait ramis::traits::SearchDomain, construct a ramis::schedule::BFS with this spec and run it on your problem space.
Examples may be found in examples/.
-
std: Enablesstdsupport -
default:std
For no_std targets alloc is required.
- Python bindings are available via
lib_ramis