#include <search_tree.hpp>
|
CUDA | SearchTree (AType uid, sub_ptr a, split_ptr split, const allocator_type &alloc=allocator_type()) |
|
template<class A2 , class S2 , class Alloc2 , class... Allocators> |
CUDA NI | SearchTree (const SearchTree< A2, S2, Alloc2 > &other, AbstractDeps< Allocators... > &deps) |
|
CUDA AType | aty () const |
|
CUDA allocator_type | get_allocator () const |
|
CUDA local::B | is_singleton () const |
|
CUDA local::B | is_top () const |
|
CUDA local::B | is_bot () const |
|
template<class Alloc2 = allocator_type> |
CUDA snapshot_type< Alloc2 > | snapshot (const Alloc2 &alloc=Alloc2()) const |
|
template<class Alloc2 > |
CUDA void | restore (const snapshot_type< Alloc2 > &snap) |
|
template<bool diagnose = false, class F , class Env , class Alloc2 > |
CUDA NI bool | interpret_tell (const F &f, Env &env, tell_type< Alloc2 > &tell, IDiagnostics &diagnostics) const |
|
template<bool diagnose = false, class F , class Env , class Alloc2 > |
CUDA NI bool | interpret_ask (const F &f, Env &env, ask_type< Alloc2 > &ask, IDiagnostics &diagnostics) const |
|
template<IKind kind, bool diagnose = false, class F , class Env , class I > |
CUDA NI bool | interpret (const F &f, Env &env, I &intermediate, IDiagnostics &diagnostics) const |
|
template<class Alloc > |
CUDA local::B | deduce (const tell_type< Alloc > &t) |
|
CUDA bool | deduce () |
|
template<class ExtractionStrategy = NonAtomicExtraction> |
CUDA bool | is_extractable (const ExtractionStrategy &strategy=ExtractionStrategy()) const |
|
template<class B > |
CUDA void | extract (B &ua) const |
|
CUDA local_universe | project (AVar x) const |
|
template<class Univ > |
CUDA void | project (AVar x, Univ &r) const |
|
CUDA int | depth () const |
|
CUDA bool | push (branch_type &&branch) |
|
CUDA bool | pop (bool pruned) |
|
CUDA bool | commit_left () |
|
CUDA bool | commit_right () |
|
CUDA bool | backtrack () |
|
CUDA bool | deduce_root () |
|
CUDA bool | replay () |
|
◆ allocator_type
◆ sub_allocator_type
◆ split_type
◆ branch_type
◆ universe_type
◆ local_universe
◆ sub_type
◆ sub_ptr
◆ split_ptr
◆ this_type
◆ ask_type
◆ SearchTree() [1/2]
◆ SearchTree() [2/2]
◆ aty()
◆ get_allocator()
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ is_singleton()
◆ is_top()
◆ is_bot()
◆ snapshot()
◆ restore()
◆ interpret_tell()
◆ interpret_ask()
◆ interpret()
◆ deduce() [1/2]
◆ deduce() [2/2]
The deduction of a
and split
is not done here, and if needed, should be done before calling this method. This deduction operator performs one iteration of \( \mathit{pop} \circ \mathit{push} \circ \mathit{split} \). In short, it initializes a
to the next node of the search tree. If we observe a
from the outside of this domain, a
can backtrack, and therefore does not always evolve extensively and monotonically. Nevertheless, the deduction operator of the search tree abstract domain is extensive and monotonic (if split is) over the search tree.
◆ is_extractable()
◆ extract()
Extract an under-approximation if the last node popped \( a \) is an under-approximation. If B
is a search tree, the under-approximation consists in a search tree \( \{a\} \) with a single node, in that case, ua
must be different from bot
.
◆ project() [1/2]
If the search tree is empty ( \( \top \)), we return \( \top_U \). If the search tree consists of a single node \( \{a\} \), we return the projection of x
in that node. Projection in a search tree with multiple nodes is currently not supported (assert false).
◆ project() [2/2]
◆ depth()
- Returns
- the current depth of the search tree. The root node has a depth of 0.
◆ push()
- Returns
true
if the current node is pruned, and false
if a new branch was pushed.
◆ pop()
If the current node was pruned, we need to backtrack, otherwise we just consider the next node along the branch.
◆ commit_left()
Given the current node, commit to the node on the left. If we are on the root node, we save a snapshot of root before committing to the left node.
◆ commit_right()
We explore the next node of the search tree available (after we backtracked, so it cannot be a left node).
◆ backtrack()
Goes from the current node to root.
◆ deduce_root()
We do not always have access to the root node, so formulas that are added to the search tree are kept in root_tell
. During backtracking, root is available through a
, and we add to root the formulas stored until now, so they become automatically available to the remaining nodes in the search tree.
◆ replay()
Goes from root
to the new node to be explored.
◆ SearchTree
◆ is_abstract_universe
◆ sequential
◆ is_totally_ordered
◆ preserve_bot
◆ preserve_top
◆ preserve_join
◆ preserve_meet
◆ injective_concretization
◆ preserve_concrete_covers
◆ name
◆ split
The documentation for this class was generated from the following file: