Lattice Land Core Library
|
#include <interval.hpp>
Public Types | |
using | LB = U |
using | UB = typename LB::dual_type |
using | this_type = Interval<LB> |
using | local_type = Interval<typename LB::local_type> |
using | CP = CartesianProduct<LB, UB> |
using | value_type = typename CP::value_type |
using | memory_type = typename CP::memory_type |
Public Member Functions | |
CUDA constexpr | Interval () |
CUDA constexpr | Interval (const typename U::value_type &x) |
CUDA constexpr | Interval (const LB &lb, const UB &ub) |
template<class A > | |
CUDA constexpr | Interval (const Interval< A > &other) |
template<class A > | |
CUDA constexpr | Interval (Interval< A > &&other) |
template<class A > | |
CUDA constexpr this_type & | operator= (const Interval< A > &other) |
CUDA constexpr this_type & | operator= (const this_type &other) |
CUDA constexpr local::B | is_bot () const |
CUDA constexpr local::B | is_top () const |
CUDA constexpr const CP & | as_product () const |
CUDA constexpr value_type | value () const |
CUDA constexpr LB & | lb () |
CUDA constexpr UB & | ub () |
CUDA constexpr const LB & | lb () const |
CUDA constexpr const UB & | ub () const |
CUDA constexpr void | join_top () |
template<class A > | |
CUDA constexpr bool | join_lb (const A &lb) |
template<class A > | |
CUDA constexpr bool | join_ub (const A &ub) |
template<class A > | |
CUDA constexpr bool | join (const Interval< A > &other) |
CUDA constexpr void | meet_bot () |
template<class A > | |
CUDA constexpr bool | meet_lb (const A &lb) |
template<class A > | |
CUDA constexpr bool | meet_ub (const A &ub) |
template<class A > | |
CUDA constexpr bool | meet (const Interval< A > &other) |
template<class A > | |
CUDA constexpr bool | extract (Interval< A > &ua) const |
template<class Env , class Allocator = typename Env::allocator_type> | |
CUDA TFormula< Allocator > | deinterpret (AVar x, const Env &env, const Allocator &allocator=Allocator()) const |
template<class F > | |
CUDA NI F | deinterpret () const |
CUDA NI void | print () const |
CUDA constexpr void | additive_inverse (const this_type &x) |
CUDA constexpr void | neg (const local_type &x) |
CUDA constexpr void | abs (const local_type &x) |
CUDA constexpr void | project (Sig fun, const local_type &x) |
CUDA constexpr void | add (const local_type &x, const local_type &y) |
CUDA constexpr void | sub (const local_type &x, const local_type &y) |
CUDA constexpr void | mul (const local_type &a, const local_type &b) |
CUDA constexpr void | div (Sig divfun, const local_type &a, const local_type &b) |
CUDA constexpr void | mod (Sig modfun, const local_type &a, const local_type &b) |
CUDA constexpr void | pow (const local_type &a, const local_type &b) |
CUDA constexpr void | project (Sig fun, const local_type &x, const local_type &y) |
CUDA constexpr local_type | width () const |
CUDA constexpr local_type | median () const |
Static Public Member Functions | |
CUDA static constexpr local_type | eq_zero () |
CUDA static constexpr local_type | eq_one () |
CUDA static constexpr local_type | bot () |
CUDA static constexpr local_type | top () |
template<bool diagnose = false, class F , class Env , class U2 > | |
CUDA static NI bool | interpret_tell (const F &f, const Env &env, Interval< U2 > &k, IDiagnostics &diagnostics) |
template<bool diagnose = false, class F , class Env , class U2 > | |
CUDA static NI bool | interpret_ask (const F &f, const Env &env, Interval< U2 > &k, IDiagnostics &diagnostics) |
template<IKind kind, bool diagnose = false, class F , class Env , class U2 > | |
CUDA static NI bool | interpret (const F &f, const Env &env, Interval< U2 > &k, IDiagnostics &diagnostics) |
template<class L > | |
CUDA static constexpr local_type | reverse (const Interval< L > &x) |
static CUDA constexpr bool | is_trivial_fun (Sig fun) |
Static Public Attributes | |
static constexpr const bool | is_abstract_universe = true |
static constexpr const bool | sequential = CP::sequential |
static constexpr const bool | is_totally_ordered = false |
static constexpr const bool | preserve_top = CP::preserve_top |
static constexpr const bool | preserve_bot = true |
static constexpr const bool | preserve_meet = true |
static constexpr const bool | preserve_join = false |
static constexpr const bool | injective_concretization = CP::injective_concretization |
static constexpr const bool | preserve_concrete_covers = CP::preserve_concrete_covers |
static constexpr const bool | complemented = false |
static constexpr const bool | is_arithmetic = LB::is_arithmetic |
static constexpr const char * | name = "Interval" |
Friends | |
template<class A > | |
class | Interval |
An interval is a Cartesian product of a lower and upper bounds, themselves represented as lattices. One difference, is that the \( \top \) can be represented by multiple interval elements, whenever \( l > u \), therefore some operations are different than on the Cartesian product, e.g., \( [3..2] \equiv [4..1] \) in the interval lattice.
using lala::Interval< U >::LB = U |
using lala::Interval< U >::UB = typename LB::dual_type |
using lala::Interval< U >::this_type = Interval<LB> |
using lala::Interval< U >::local_type = Interval<typename LB::local_type> |
using lala::Interval< U >::CP = CartesianProduct<LB, UB> |
using lala::Interval< U >::value_type = typename CP::value_type |
using lala::Interval< U >::memory_type = typename CP::memory_type |
|
inlineconstexpr |
Initialize the interval to top using the default constructor of the bounds.
|
inlineconstexpr |
Given a value \( x \in U \) where \( U \) is the universe of discourse, we initialize a singleton interval \( [x..x] \).
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
The assignment operator can only be used in a sequential context. It is monotone but not extensive.
|
inlineconstexpr |
|
inlinestaticconstexpr |
Pre-interpreted formula x == 0
.
|
inlinestaticconstexpr |
Pre-interpreted formula x == 1
.
|
inlinestaticconstexpr |
|
inlinestaticconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlinestatic |
Support the same language than the Cartesian product, and more:
var x:B
when the underlying universe is arithmetic and preserve concrete covers. Therefore, the element k
is always in \( \gamma(lb) \cap \gamma(ub) \).
|
inlinestatic |
Support the same language than the Cartesian product, and more:
x != k
is under-approximated by interpreting x != k
in the lower bound.x == k
is interpreted by over-approximating x == k
in both bounds and then verifying both bounds are the same.x in {[l..u]} is interpreted by under-approximating
x >= land
x <= u`.
|
inlinestatic |
|
inlineconstexpr |
You must use the lattice interface (join/meet methods) to modify the lower and upper bounds, if you use assignment you violate the PCCP model.
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inline |
Deinterpret the current value to a logical constant. The lower bound is deinterpreted, and it is up to the user to check that interval is a singleton. A special case is made for real numbers where the both bounds are used, since the logical interpretation uses interval.
|
inline |
|
inlineconstexpr |
The additive inverse is obtained by pairwise negation of the components. Equivalent to neg(reverse(x))
. Note that the inverse of bot
is bot
, simply because bot
has no mathematical inverse.
|
inlinestaticconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlinestaticconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
inlineconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |
|
staticconstexpr |