#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 size_t | depth () const |
|
|
template<class A2 , class S2 , class Alloc2 > |
class | SearchTree |
|
◆ allocator_type
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ sub_allocator_type
template<class A , class Split , class Allocator = typename A::allocator_type>
using lala::SearchTree< A, Split, Allocator >::sub_allocator_type = typename A::allocator_type |
◆ split_type
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ branch_type
template<class A , class Split , class Allocator = typename A::allocator_type>
using lala::SearchTree< A, Split, Allocator >::branch_type = typename split_type::branch_type |
◆ universe_type
template<class A , class Split , class Allocator = typename A::allocator_type>
using lala::SearchTree< A, Split, Allocator >::universe_type = typename A::universe_type |
◆ local_universe
template<class A , class Split , class Allocator = typename A::allocator_type>
using lala::SearchTree< A, Split, Allocator >::local_universe = typename universe_type::local_type |
◆ sub_type
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ sub_ptr
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ split_ptr
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ this_type
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ ask_type
template<class A , class Split , class Allocator = typename A::allocator_type>
template<class Alloc >
◆ SearchTree() [1/2]
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ SearchTree() [2/2]
template<class A , class Split , class Allocator = typename A::allocator_type>
template<class A2 , class S2 , class Alloc2 , class... Allocators>
CUDA NI lala::SearchTree< A, Split, Allocator >::SearchTree |
( |
const SearchTree< A2, S2, Alloc2 > & | other, |
|
|
AbstractDeps< Allocators... > & | deps ) |
|
inline |
◆ aty()
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ get_allocator()
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ is_singleton()
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ is_top()
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ is_bot()
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ snapshot()
template<class A , class Split , class Allocator = typename A::allocator_type>
template<class Alloc2 = allocator_type>
◆ restore()
template<class A , class Split , class Allocator = typename A::allocator_type>
template<class Alloc2 >
◆ interpret_tell()
template<class A , class Split , class Allocator = typename A::allocator_type>
template<bool diagnose = false, class F , class Env , class Alloc2 >
CUDA NI bool lala::SearchTree< A, Split, Allocator >::interpret_tell |
( |
const F & | f, |
|
|
Env & | env, |
|
|
tell_type< Alloc2 > & | tell, |
|
|
IDiagnostics & | diagnostics ) const |
|
inline |
◆ interpret_ask()
template<class A , class Split , class Allocator = typename A::allocator_type>
template<bool diagnose = false, class F , class Env , class Alloc2 >
CUDA NI bool lala::SearchTree< A, Split, Allocator >::interpret_ask |
( |
const F & | f, |
|
|
Env & | env, |
|
|
ask_type< Alloc2 > & | ask, |
|
|
IDiagnostics & | diagnostics ) const |
|
inline |
◆ interpret()
template<class A , class Split , class Allocator = typename A::allocator_type>
template<IKind kind, bool diagnose = false, class F , class Env , class I >
CUDA NI bool lala::SearchTree< A, Split, Allocator >::interpret |
( |
const F & | f, |
|
|
Env & | env, |
|
|
I & | intermediate, |
|
|
IDiagnostics & | diagnostics ) const |
|
inline |
◆ deduce() [1/2]
template<class A , class Split , class Allocator = typename A::allocator_type>
template<class Alloc >
◆ deduce() [2/2]
template<class A , class Split , class Allocator = typename A::allocator_type>
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()
template<class A , class Split , class Allocator = typename A::allocator_type>
template<class ExtractionStrategy = NonAtomicExtraction>
CUDA bool lala::SearchTree< A, Split, Allocator >::is_extractable |
( |
const ExtractionStrategy & | strategy = ExtractionStrategy() | ) |
const |
|
inline |
◆ extract()
template<class A , class Split , class Allocator = typename A::allocator_type>
template<class B >
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]
template<class A , class Split , class Allocator = typename A::allocator_type>
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]
template<class A , class Split , class Allocator = typename A::allocator_type>
template<class Univ >
CUDA void lala::SearchTree< A, Split, Allocator >::project |
( |
AVar | x, |
|
|
Univ & | r ) const |
|
inline |
◆ depth()
template<class A , class Split , class Allocator = typename A::allocator_type>
- Returns
- the current depth of the search tree. The root node has a depth of 0.
◆ SearchTree
template<class A , class Split , class Allocator = typename A::allocator_type>
template<class A2 , class S2 , class Alloc2 >
◆ is_abstract_universe
template<class A , class Split , class Allocator = typename A::allocator_type>
const bool lala::SearchTree< A, Split, Allocator >::is_abstract_universe = false |
|
staticconstexpr |
◆ sequential
template<class A , class Split , class Allocator = typename A::allocator_type>
const bool lala::SearchTree< A, Split, Allocator >::sequential = sub_type::sequential |
|
staticconstexpr |
◆ is_totally_ordered
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ preserve_bot
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ preserve_top
template<class A , class Split , class Allocator = typename A::allocator_type>
◆ preserve_join
template<class A , class Split , class Allocator = typename A::allocator_type>
const bool lala::SearchTree< A, Split, Allocator >::preserve_join = sub_type::preserve_join |
|
staticconstexpr |
◆ preserve_meet
template<class A , class Split , class Allocator = typename A::allocator_type>
const bool lala::SearchTree< A, Split, Allocator >::preserve_meet = sub_type::preserve_meet |
|
staticconstexpr |
◆ injective_concretization
template<class A , class Split , class Allocator = typename A::allocator_type>
const bool lala::SearchTree< A, Split, Allocator >::injective_concretization = sub_type::injective_concretization |
|
staticconstexpr |
◆ preserve_concrete_covers
template<class A , class Split , class Allocator = typename A::allocator_type>
const bool lala::SearchTree< A, Split, Allocator >::preserve_concrete_covers = sub_type::preserve_concrete_covers |
|
staticconstexpr |
◆ name
template<class A , class Split , class Allocator = typename A::allocator_type>
The documentation for this class was generated from the following file: