| 
    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 | value_type = battery::tuple< typename LB::value_type, typename UB::value_type > | 
| using | memory_type = typename LB::memory_type | 
Public Member Functions | |
| constexpr | Interval ()=default | 
| constexpr | Interval (const this_type &)=default | 
| constexpr | Interval (this_type &&)=default | 
| 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) | 
| constexpr this_type & | operator= (const this_type &)=default | 
| constexpr this_type & | operator= (this_type &&)=default | 
| CUDA constexpr local::B | is_bot () const | 
| CUDA constexpr local::B | is_top () const | 
| CUDA constexpr value_type | value () const | 
| CUDA INLINE constexpr LB & | lb () | 
| CUDA INLINE constexpr UB & | ub () | 
| CUDA INLINE constexpr const LB & | lb () const | 
| CUDA INLINE 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 = LB::sequential | 
| static constexpr const bool | is_totally_ordered = false | 
| static constexpr const bool | preserve_top = LB::preserve_top && UB::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 = LB::injective_concretization && UB::injective_concretization | 
| static constexpr const bool | preserve_concrete_covers = LB::preserve_concrete_covers && UB::preserve_concrete_covers | 
| static constexpr const bool | complemented = false | 
| static constexpr const bool | is_arithmetic = LB::is_arithmetic && UB::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 >::value_type = battery::tuple<typename LB::value_type, typename UB::value_type> | 
| using lala::Interval< U >::memory_type = typename LB::memory_type | 
      
  | 
  constexprdefault | 
Initialize the interval to top using the default constructor of the bounds.
      
  | 
  constexprdefault | 
      
  | 
  constexprdefault | 
      
  | 
  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.
      
  | 
  constexprdefault | 
      
  | 
  constexprdefault | 
      
  | 
  inlinestaticconstexpr | 
Pre-interpreted formula x == 0. 
      
  | 
  inlinestaticconstexpr | 
Pre-interpreted formula x == 1. 
      
  | 
  inlinestaticconstexpr | 
      
  | 
  inlinestaticconstexpr | 
      
  | 
  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-approximatingx >= landx <= 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 |