#include <Interval.defs.hh>


Public Types | |
| typedef Boundary | boundary_type |
| typedef Info | info_type |
| typedef Interval_NS::Property | Property |
Public Member Functions | |
| void | lower_load () |
| void | upper_load () |
| void | complete_init () |
| void | complete_init_internal () |
| template<typename T> | |
| Enable_If< Is_Singleton< T > ::value||Is_Interval< T > ::value, Interval & >::type | operator= (const T &x) |
| template<typename T> | |
| Enable_If< Is_Singleton< T > ::value||Is_Interval< T > ::value, Interval & >::type | operator+= (const T &x) |
| template<typename T> | |
| Enable_If< Is_Singleton< T > ::value||Is_Interval< T > ::value, Interval & >::type | operator-= (const T &x) |
| template<typename T> | |
| Enable_If< Is_Singleton< T > ::value||Is_Interval< T > ::value, Interval & >::type | operator*= (const T &x) |
| template<typename T> | |
| Enable_If< Is_Singleton< T > ::value||Is_Interval< T > ::value, Interval & >::type | operator/= (const T &x) |
| void | swap (Interval &y) |
Swaps *this with y. | |
| Info & | info () |
| const Info & | info () const |
| Boundary & | lower () |
| const Boundary & | lower () const |
| Boundary & | upper () |
| const Boundary & | upper () const |
| Ternary | is_empty_cached () const |
| Ternary | is_singleton_cached () const |
| bool | is_empty () const |
| bool | is_singleton () const |
| bool | has_restriction () const |
| I_Result | normalize () const |
| bool | lower_is_open () const |
| bool | upper_is_open () const |
| Result | lower_shrink () |
| Result | upper_shrink () |
| bool | lower_is_unbounded () const |
| bool | upper_is_unbounded () const |
| bool | is_unbounded () const |
| bool | is_universe () const |
| void | invalidate_cardinality_cache () const |
| template<typename T> | |
| Result | lower_set_uninit (const T &x, bool open=false) |
| Result | lower_set_uninit (const Unbounded &) |
| template<typename T> | |
| Result | lower_set (const T &x, bool open=false) |
| Result | lower_set (const Unbounded &) |
| template<typename T> | |
| Result | lower_narrow (const T &x, bool open=false) |
| template<typename T> | |
| Result | lower_widen (const T &x, bool open=false) |
| Result | lower_widen (const Unbounded &) |
| template<typename T> | |
| Result | upper_set_uninit (const T &x, bool open=false) |
| Result | upper_set_uninit (const Unbounded &) |
| template<typename T> | |
| Result | upper_set (const T &x, bool open=false) |
| Result | upper_set (const Unbounded &) |
| template<typename T> | |
| Result | upper_narrow (const T &x, bool open=false) |
| template<typename T> | |
| Result | upper_widen (const T &x, bool open=false) |
| Result | upper_widen (const Unbounded &) |
| I_Result | assign (Degenerate_Element e) |
| template<typename From> | |
| Enable_If< Is_Special< From > ::value, I_Result >::type | assign (const From &) |
| I_Result | set_infinities () |
| bool | is_topologically_closed () const |
| void | topological_closure_assign () |
Assigns to *this its topological closure. | |
| bool | is_infinity () const |
| bool | contains_integer_point () const |
| memory_size_type | total_memory_in_bytes () const |
Returns the total size in bytes of the memory occupied by *this. | |
| memory_size_type | external_memory_in_bytes () const |
Returns the size in bytes of the memory managed by *this. | |
| void | ascii_dump (std::ostream &s) const |
| bool | ascii_load (std::istream &s) |
| bool | OK () const |
| Interval () | |
| template<typename T> | |
| Interval (const T &x) | |
| template<typename T> | |
| Enable_If< Is_Singleton< T > ::value||Is_Interval< T > ::value, bool >::type | contains (const T &y) const |
| template<typename T> | |
| Enable_If< Is_Singleton< T > ::value||Is_Interval< T > ::value, bool >::type | strictly_contains (const T &y) const |
| template<typename T> | |
| Enable_If< Is_Singleton< T > ::value||Is_Interval< T > ::value, bool >::type | is_disjoint_from (const T &y) const |
| template<typename From1, typename From2> | |
| I_Result | assign (const From1 &l, const From2 &u) |
| template<typename From> | |
| Enable_If< Is_Singleton< From > ::value||Is_Interval< From > ::value, I_Result >::type | assign (const From &x) |
| template<typename From> | |
| Enable_If< Is_Singleton< From > ::value||Is_Interval< From > ::value, I_Result >::type | join_assign (const From &x) |
| template<typename From1, typename From2> | |
| Enable_If<((Is_Singleton < From1 >::value||Is_Interval < From1 >::value)&&(Is_Singleton < From2 >::value||Is_Interval < From2 >::value)), I_Result > ::type | join_assign (const From1 &x, const From2 &y) |
| template<typename From> | |
| Enable_If< Is_Singleton< From > ::value||Is_Interval< From > ::value, I_Result >::type | intersect_assign (const From &x) |
| template<typename From1, typename From2> | |
| Enable_If<((Is_Singleton < From1 >::value||Is_Interval < From1 >::value)&&(Is_Singleton < From2 >::value||Is_Interval < From2 >::value)), I_Result > ::type | intersect_assign (const From1 &x, const From2 &y) |
| template<typename From> | |
| Enable_If< Is_Singleton< From > ::value||Is_Interval< From > ::value, I_Result >::type | difference_assign (const From &x) |
Assigns to *this the smallest interval containing the set-theoretic difference of *this and x. | |
| template<typename From1, typename From2> | |
| Enable_If<((Is_Singleton < From1 >::value||Is_Interval < From1 >::value)&&(Is_Singleton < From2 >::value||Is_Interval < From2 >::value)), I_Result > ::type | difference_assign (const From1 &x, const From2 &y) |
Assigns to *this the smallest interval containing the set-theoretic difference of x and y. | |
| template<typename From> | |
| Enable_If< Is_Singleton< From > ::value||Is_Interval< From > ::value, I_Result >::type | refine_existential (Relation_Symbol rel, const From &x) |
Refines to according to the existential relation rel with x. | |
| template<typename From> | |
| Enable_If< Is_Singleton< From > ::value||Is_Interval< From > ::value, I_Result >::type | refine_universal (Relation_Symbol rel, const From &x) |
Refines to so that it satisfies the universal relation rel with x. | |
| template<typename From> | |
| Enable_If< Is_Singleton< From > ::value||Is_Interval< From > ::value, I_Result >::type | neg_assign (const From &x) |
| template<typename From1, typename From2> | |
| Enable_If<((Is_Singleton < From1 >::value||Is_Interval < From1 >::value)&&(Is_Singleton < From2 >::value||Is_Interval < From2 >::value)), I_Result > ::type | add_assign (const From1 &x, const From2 &y) |
| template<typename From1, typename From2> | |
| Enable_If<((Is_Singleton < From1 >::value||Is_Interval < From1 >::value)&&(Is_Singleton < From2 >::value||Is_Interval < From2 >::value)), I_Result > ::type | sub_assign (const From1 &x, const From2 &y) |
| template<typename From1, typename From2> | |
| Enable_If<((Is_Singleton < From1 >::value||Is_Interval < From1 >::value)&&(Is_Singleton < From2 >::value||Is_Interval < From2 >::value)), I_Result > ::type | mul_assign (const From1 &x, const From2 &y) |
| template<typename From1, typename From2> | |
| Enable_If<((Is_Singleton < From1 >::value||Is_Interval < From1 >::value)&&(Is_Singleton < From2 >::value||Is_Interval < From2 >::value)), I_Result > ::type | div_assign (const From1 &x, const From2 &y) |
| template<typename From, typename Iterator> | |
| Enable_If< Is_Interval< From > ::value, void >::type | CC76_widening_assign (const From &y, Iterator first, Iterator last) |
Private Member Functions | |
| COMPILE_TIME_CHECK (!Info::store_special||!std::numeric_limits< Boundary >::has_infinity,"store_special is meaningless"" when boundary type may contains infinity") | |
| Info & | w_info () const |
| bool | is_empty_nocache () const |
| bool | is_singleton_nocache () const |
| Result | lower_normalize () const |
| Result | upper_normalize () const |
Private Attributes | |
| Boundary | lower_ |
| Boundary | upper_ |
Related Functions | |
| (Note that these are not member functions.) | |
| template<typename Boundary, typename Info> | |
| void | swap (Parma_Polyhedra_Library::Interval< Boundary, Info > &x, Parma_Polyhedra_Library::Interval< Boundary, Info > &y) |
FIXME: to be written.
Definition at line 92 of file Interval.defs.hh.
| typedef Boundary Parma_Polyhedra_Library::Interval< Boundary, Info >::boundary_type |
Definition at line 150 of file Interval.defs.hh.
| typedef Info Parma_Polyhedra_Library::Interval< Boundary, Info >::info_type |
Definition at line 151 of file Interval.defs.hh.
| typedef Interval_NS::Property Parma_Polyhedra_Library::Interval< Boundary, Info >::Property |
Definition at line 153 of file Interval.defs.hh.
| Parma_Polyhedra_Library::Interval< Boundary, Info >::Interval | ( | ) | [inline] |
| Parma_Polyhedra_Library::Interval< Boundary, Info >::Interval | ( | const T & | x | ) | [inline, explicit] |
Definition at line 763 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign().
00765 : lower_loaded(0), upper_loaded(0), completed(0) 00766 #endif 00767 { 00768 assign(x); 00769 }
| Parma_Polyhedra_Library::Interval< Boundary, Info >::COMPILE_TIME_CHECK | ( | !Info::store_special||!std::numeric_limits< Boundary >::has_infinity | , | |
| "store_special is meaningless"" when boundary type may contains infinity" | ||||
| ) | [private] |
| Info& Parma_Polyhedra_Library::Interval< Boundary, Info >::w_info | ( | ) | const [inline, private] |
Definition at line 98 of file Interval.defs.hh.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_normalize(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_normalize().
00098 { 00099 return const_cast<Interval&>(*this); 00100 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_nocache | ( | ) | const [inline, private] |
Definition at line 101 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Checked::lt(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_nocache | ( | ) | const [inline, private] |
Definition at line 104 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Checked::eq(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_normalize | ( | ) | const [inline, private] |
Definition at line 107 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::w_info().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::normalize().
00107 { 00108 Result r; 00109 if (info().get_boundary_property(LOWER, NORMALIZED) 00110 || info().get_boundary_property(LOWER, SPECIAL)) 00111 r = V_EQ; 00112 else { 00113 if (info().get_boundary_property(LOWER, OPEN)) { 00114 r = info().restrict(lower(), V_GT); 00115 if (r != V_GT) 00116 w_info().set_boundary_property(LOWER, OPEN, false); 00117 } 00118 else { 00119 r = info().restrict(lower(), V_GE); 00120 if (r == V_GT) 00121 w_info().set_boundary_property(LOWER, OPEN); 00122 } 00123 w_info().set_boundary_property(LOWER, NORMALIZED); 00124 } 00125 return r; 00126 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_normalize | ( | ) | const [inline, private] |
Definition at line 127 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::w_info().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::normalize().
00127 { 00128 Result r; 00129 if (info().get_boundary_property(UPPER, NORMALIZED) 00130 || info().get_boundary_property(UPPER, SPECIAL)) 00131 r = V_EQ; 00132 else { 00133 if (info().get_boundary_property(UPPER, OPEN)) { 00134 r = info().restrict(upper(), V_LT); 00135 if (r != V_LT) 00136 w_info().set_boundary_property(UPPER, OPEN, false); 00137 } 00138 else { 00139 r = info().restrict(upper(), V_LE); 00140 if (r == V_LT) 00141 w_info().set_boundary_property(UPPER, OPEN); 00142 } 00143 w_info().set_boundary_property(UPPER, NORMALIZED); 00144 } 00145 return r; 00146 }
| void Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_load | ( | ) | [inline] |
Definition at line 155 of file Interval.defs.hh.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set_uninit().
| void Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_load | ( | ) | [inline] |
Definition at line 161 of file Interval.defs.hh.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set_uninit().
| void Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init | ( | ) | [inline] |
Definition at line 167 of file Interval.defs.hh.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::assign().
00167 { 00168 #ifdef PPL_ABI_BREAKING_EXTRA_DEBUG 00169 assert(lower_loaded); 00170 assert(upper_loaded); 00171 completed = 1; 00172 #endif 00173 }
| void Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal | ( | ) | [inline] |
Definition at line 175 of file Interval.defs.hh.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::add_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_load(), Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::difference_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::div_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::intersect_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::join_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::mul_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::neg_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::set_infinities(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::sub_assign().
00175 { 00176 #ifdef PPL_ABI_BREAKING_EXTRA_DEBUG 00177 lower_loaded = 1; 00178 upper_loaded = 1; 00179 completed = 1; 00180 #endif 00181 }
| Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type Parma_Polyhedra_Library::Interval< Boundary, Info >::operator= | ( | const T & | x | ) | [inline] |
Definition at line 185 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign().
00185 { 00186 assign(x); 00187 return *this; 00188 }
| Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type Parma_Polyhedra_Library::Interval< Boundary, Info >::operator+= | ( | const T & | x | ) | [inline] |
Definition at line 192 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::add_assign().
00192 { 00193 add_assign(*this, x); 00194 return *this; 00195 }
| Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type Parma_Polyhedra_Library::Interval< Boundary, Info >::operator-= | ( | const T & | x | ) | [inline] |
Definition at line 198 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::sub_assign().
00198 { 00199 sub_assign(*this, x); 00200 return *this; 00201 }
| Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type Parma_Polyhedra_Library::Interval< Boundary, Info >::operator*= | ( | const T & | x | ) | [inline] |
Definition at line 204 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::mul_assign().
00204 { 00205 mul_assign(*this, x); 00206 return *this; 00207 }
| Enable_If<Is_Singleton<T>::value || Is_Interval<T>::value, Interval&>::type Parma_Polyhedra_Library::Interval< Boundary, Info >::operator/= | ( | const T & | x | ) | [inline] |
Definition at line 210 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::div_assign().
00210 { 00211 div_assign(*this, x); 00212 return *this; 00213 }
| void Parma_Polyhedra_Library::Interval< Boundary, Info >::swap | ( | Interval< Boundary, Info > & | y | ) | [inline] |
Swaps *this with y.
Definition at line 43 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::swap(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::swap().
00043 { 00044 std::swap(lower(), y.lower()); 00045 std::swap(upper(), y.upper()); 00046 std::swap(info(), y.info()); 00047 }
| Info& Parma_Polyhedra_Library::Interval< Boundary, Info >::info | ( | ) | [inline] |
Definition at line 218 of file Interval.defs.hh.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::add_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_dump(), Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_load(), Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::contains(), Parma_Polyhedra_Library::Interval< Boundary, Info >::difference_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::div_assign(), Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::has_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::intersect_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_disjoint_from(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_cached(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_nocache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_infinity(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_cached(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_nocache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::join_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_open(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_narrow(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_normalize(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set_uninit(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_shrink(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_widen(), Parma_Polyhedra_Library::Interval< Boundary, Info >::mul_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::neg_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::normalize(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal(), Parma_Polyhedra_Library::Interval< Boundary, Info >::set_infinities(), Parma_Polyhedra_Library::Interval< Boundary, Info >::strictly_contains(), Parma_Polyhedra_Library::Interval< Boundary, Info >::sub_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::swap(), Parma_Polyhedra_Library::Interval< Boundary, Info >::topological_closure_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_open(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_narrow(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_normalize(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set_uninit(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_shrink(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_widen().
| const Info& Parma_Polyhedra_Library::Interval< Boundary, Info >::info | ( | ) | const [inline] |
| Boundary& Parma_Polyhedra_Library::Interval< Boundary, Info >::lower | ( | ) | [inline] |
Definition at line 226 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::add_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_dump(), Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_load(), Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::contains(), Parma_Polyhedra_Library::Interval< Boundary, Info >::contains_integer_point(), Parma_Polyhedra_Library::Interval< Boundary, Info >::difference_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::div_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::external_memory_in_bytes(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::intersect_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_disjoint_from(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_nocache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_infinity(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_nocache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::join_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_open(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_narrow(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_normalize(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set_uninit(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_shrink(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_widen(), Parma_Polyhedra_Library::Interval< Boundary, Info >::mul_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::neg_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal(), Parma_Polyhedra_Library::Interval< Boundary, Info >::set_infinities(), Parma_Polyhedra_Library::Interval< Boundary, Info >::strictly_contains(), Parma_Polyhedra_Library::Interval< Boundary, Info >::sub_assign(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::swap().
00226 { 00227 return lower_; 00228 }
| const Boundary& Parma_Polyhedra_Library::Interval< Boundary, Info >::lower | ( | ) | const [inline] |
Definition at line 230 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_.
00230 { 00231 return lower_; 00232 }
| Boundary& Parma_Polyhedra_Library::Interval< Boundary, Info >::upper | ( | ) | [inline] |
Definition at line 234 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::add_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_dump(), Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_load(), Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::contains(), Parma_Polyhedra_Library::Interval< Boundary, Info >::contains_integer_point(), Parma_Polyhedra_Library::Interval< Boundary, Info >::difference_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::div_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::external_memory_in_bytes(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::intersect_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_disjoint_from(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_nocache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_infinity(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_nocache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::join_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::mul_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::neg_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal(), Parma_Polyhedra_Library::Interval< Boundary, Info >::set_infinities(), Parma_Polyhedra_Library::Interval< Boundary, Info >::strictly_contains(), Parma_Polyhedra_Library::Interval< Boundary, Info >::sub_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::swap(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_open(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_narrow(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_normalize(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set_uninit(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_shrink(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_widen().
00234 { 00235 return upper_; 00236 }
| const Boundary& Parma_Polyhedra_Library::Interval< Boundary, Info >::upper | ( | ) | const [inline] |
Definition at line 238 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_.
00238 { 00239 return upper_; 00240 }
| Ternary Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_cached | ( | ) | const [inline] |
Definition at line 242 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_IS, Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::T_MAYBE, Parma_Polyhedra_Library::T_NO, and Parma_Polyhedra_Library::T_YES.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
00242 { 00243 if (info().get_interval_property(CARDINALITY_0)) 00244 return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO; 00245 else if (info().get_interval_property(CARDINALITY_IS)) 00246 return T_NO; 00247 else 00248 return T_MAYBE; 00249 }
| Ternary Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_cached | ( | ) | const [inline] |
Definition at line 251 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::CARDINALITY_1, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_IS, Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::T_MAYBE, Parma_Polyhedra_Library::T_NO, and Parma_Polyhedra_Library::T_YES.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
00251 { 00252 if (info().get_interval_property(CARDINALITY_1)) 00253 return info().get_interval_property(CARDINALITY_IS) ? T_YES : T_NO; 00254 else if (info().get_interval_property(CARDINALITY_IS)) 00255 return T_NO; 00256 else 00257 return T_MAYBE; 00258 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty | ( | ) | const [inline] |
Definition at line 260 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_1, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_IS, Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_cached(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_nocache(), Parma_Polyhedra_Library::T_MAYBE, Parma_Polyhedra_Library::T_NO, Parma_Polyhedra_Library::T_YES, and Parma_Polyhedra_Library::Interval< Boundary, Info >::w_info().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::contains_integer_point(), Parma_Polyhedra_Library::f_is_empty(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_topologically_closed(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::topological_closure_assign().
00260 { 00261 switch (is_empty_cached()) { 00262 case T_NO: 00263 return false; 00264 case T_YES: 00265 return true; 00266 case T_MAYBE: 00267 bool r = is_empty_nocache(); 00268 if (r) { 00269 w_info().set_interval_property(CARDINALITY_IS, r); 00270 w_info().set_interval_property(CARDINALITY_1, false); 00271 } 00272 w_info().set_interval_property(CARDINALITY_0); 00273 return r; 00274 } 00275 assert(false); 00276 return false; 00277 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton | ( | ) | const [inline] |
Definition at line 279 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_1, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_IS, Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_cached(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_nocache(), Parma_Polyhedra_Library::T_MAYBE, Parma_Polyhedra_Library::T_NO, Parma_Polyhedra_Library::T_YES, and Parma_Polyhedra_Library::Interval< Boundary, Info >::w_info().
Referenced by Parma_Polyhedra_Library::f_is_singleton(), and Parma_Polyhedra_Library::is_singleton_integer().
00279 { 00280 switch (is_singleton_cached()) { 00281 case T_NO: 00282 return false; 00283 case T_YES: 00284 return true; 00285 case T_MAYBE: 00286 bool r = is_singleton_nocache(); 00287 if (r) { 00288 w_info().set_interval_property(CARDINALITY_IS, r); 00289 w_info().set_interval_property(CARDINALITY_0, false); 00290 } 00291 w_info().set_interval_property(CARDINALITY_1); 00292 return r; 00293 } 00294 assert(false); 00295 return false; 00296 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::has_restriction | ( | ) | const [inline] |
Definition at line 298 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::is_universe(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::normalize().
00298 { 00299 return info().has_restriction(); 00300 }
| I_Result Parma_Polyhedra_Library::Interval< Boundary, Info >::normalize | ( | ) | const [inline] |
Definition at line 302 of file Interval.defs.hh.
References Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::has_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_normalize(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_normalize().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal().
00302 { 00303 assert(OK()); 00304 if (has_restriction()) { 00305 Result rl = lower_normalize(); 00306 Result ru = upper_normalize(); 00307 // FIXME: this invalidation is not needed if interval is unchanged 00308 invalidate_cardinality_cache(); 00309 info().normalize(); 00310 assert(OK()); 00311 return combine(rl, ru); 00312 } 00313 else 00314 return combine(V_EQ, V_EQ); 00315 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_open | ( | ) | const [inline] |
Definition at line 317 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::contains_integer_point(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::is_topologically_closed().
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_open | ( | ) | const [inline] |
Definition at line 322 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::contains_integer_point(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::is_topologically_closed().
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_shrink | ( | ) | [inline] |
Definition at line 327 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal().
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_shrink | ( | ) | [inline] |
Definition at line 332 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal().
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_unbounded | ( | ) | const [inline] |
Definition at line 337 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::is_topologically_closed(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_universe(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_widen(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::topological_closure_assign().
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_unbounded | ( | ) | const [inline] |
Definition at line 342 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::is_topologically_closed(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_universe(), Parma_Polyhedra_Library::Interval< Boundary, Info >::topological_closure_assign(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_widen().
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::is_unbounded | ( | ) | const [inline] |
Definition at line 347 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_unbounded().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::contains_integer_point().
00347 { 00348 assert(OK()); 00349 return lower_is_unbounded() || upper_is_unbounded(); 00350 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::is_universe | ( | ) | const [inline] |
Definition at line 352 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::has_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_unbounded().
00352 { 00353 assert(OK()); 00354 return lower_is_unbounded() && upper_is_unbounded() 00355 && !has_restriction(); 00356 }
| void Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache | ( | ) | const [inline] |
Definition at line 358 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_1, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_IS, and Parma_Polyhedra_Library::Interval< Boundary, Info >::w_info().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::difference_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::intersect_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_widen(), Parma_Polyhedra_Library::Interval< Boundary, Info >::normalize(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_widen().
00358 { 00359 w_info().set_interval_property(CARDINALITY_IS, false); 00360 w_info().set_interval_property(CARDINALITY_0, false); 00361 w_info().set_interval_property(CARDINALITY_1, false); 00362 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set_uninit | ( | const T & | x, | |
| bool | open = false | |||
| ) | [inline] |
Definition at line 365 of file Interval.defs.hh.
References assign(), Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_load().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::assign().
00365 { 00366 info().clear_boundary_properties(LOWER); 00367 Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open)); 00368 lower_load(); 00369 return rl; 00370 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set_uninit | ( | const Unbounded & | ) | [inline] |
Definition at line 372 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_load().
00372 { 00373 info().clear_boundary_properties(LOWER); 00374 Result rl = set_unbounded(LOWER, lower(), info()); 00375 lower_load(); 00376 return rl; 00377 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set | ( | const T & | x, | |
| bool | open = false | |||
| ) | [inline] |
Definition at line 380 of file Interval.defs.hh.
References assign(), Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_narrow(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_widen().
00380 { 00381 assert(OK()); 00382 info().clear_boundary_properties(LOWER); 00383 Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, x, f_info(x, open)); 00384 invalidate_cardinality_cache(); 00385 assert(OK()); 00386 return rl; 00387 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set | ( | const Unbounded & | ) | [inline] |
Definition at line 389 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
00389 { 00390 assert(OK()); 00391 info().clear_boundary_properties(LOWER); 00392 Result rl = set_unbounded(LOWER, lower(), info()); 00393 invalidate_cardinality_cache(); 00394 assert(OK()); 00395 return rl; 00396 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_narrow | ( | const T & | x, | |
| bool | open = false | |||
| ) | [inline] |
Definition at line 399 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
00399 { 00400 assert(OK()); 00401 if (ge(LOWER, lower(), info(), LOWER, x, f_info(x, open))) 00402 return V_EQ; 00403 return lower_set(x, open); 00404 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_widen | ( | const T & | x, | |
| bool | open = false | |||
| ) | [inline] |
Definition at line 407 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Checked::le(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
00407 { 00408 assert(OK()); 00409 if (le(LOWER, lower(), info(), LOWER, x, f_info(x, open))) 00410 return V_EQ; 00411 return lower_set(x, open); 00412 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_widen | ( | const Unbounded & | ) | [inline] |
Definition at line 414 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_unbounded(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::OK().
00414 { 00415 assert(OK()); 00416 if (lower_is_unbounded()) 00417 return V_EQ; 00418 info().clear_boundary_properties(LOWER); 00419 Result rl = set_unbounded(LOWER, lower(), info()); 00420 invalidate_cardinality_cache(); 00421 assert(OK()); 00422 return V_EQ; 00423 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set_uninit | ( | const T & | x, | |
| bool | open = false | |||
| ) | [inline] |
Definition at line 426 of file Interval.defs.hh.
References assign(), Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_load().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::assign().
00426 { 00427 info().clear_boundary_properties(UPPER); 00428 Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open)); 00429 upper_load(); 00430 return rl; 00431 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set_uninit | ( | const Unbounded & | ) | [inline] |
Definition at line 432 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_load().
00432 { 00433 info().clear_boundary_properties(UPPER); 00434 Result rl = set_unbounded(UPPER, upper(), info()); 00435 upper_load(); 00436 return rl; 00437 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set | ( | const T & | x, | |
| bool | open = false | |||
| ) | [inline] |
Definition at line 440 of file Interval.defs.hh.
References assign(), Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_narrow(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_widen().
00440 { 00441 assert(OK()); 00442 info().clear_boundary_properties(UPPER); 00443 Result rl = Boundary_NS::assign(UPPER, upper(), info(), UPPER, x, f_info(x, open)); 00444 invalidate_cardinality_cache(); 00445 assert(OK()); 00446 return rl; 00447 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set | ( | const Unbounded & | ) | [inline] |
Definition at line 449 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00449 { 00450 assert(OK()); 00451 info().clear_boundary_properties(UPPER); 00452 Result rl = set_unbounded(UPPER, upper(), info()); 00453 invalidate_cardinality_cache(); 00454 assert(OK()); 00455 return rl; 00456 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_narrow | ( | const T & | x, | |
| bool | open = false | |||
| ) | [inline] |
Definition at line 459 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Checked::le(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set().
00459 { 00460 assert(OK()); 00461 if (le(UPPER, upper(), info(), UPPER, x, f_info(x, open))) 00462 return V_EQ; 00463 return upper_set(x, open); 00464 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_widen | ( | const T & | x, | |
| bool | open = false | |||
| ) | [inline] |
Definition at line 467 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set().
00467 { 00468 assert(OK()); 00469 if (ge(UPPER, upper(), info(), UPPER, x, f_info(x, open))) 00470 return V_EQ; 00471 return upper_set(x, open); 00472 }
| Result Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_widen | ( | const Unbounded & | ) | [inline] |
Definition at line 474 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_unbounded().
00474 { 00475 assert(OK()); 00476 if (upper_is_unbounded()) 00477 return V_EQ; 00478 info().clear_boundary_properties(UPPER); 00479 Result rl = set_unbounded(UPPER, upper(), info()); 00480 invalidate_cardinality_cache(); 00481 assert(OK()); 00482 return rl; 00483 }
| I_Result Parma_Polyhedra_Library::Interval< Boundary, Info >::assign | ( | Degenerate_Element | e | ) | [inline] |
Definition at line 485 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_1, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_IS, Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::I_EMPTY, Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set_uninit(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::UNIVERSE, and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set_uninit().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::add_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::difference_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::div_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::intersect_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::Interval(), Parma_Polyhedra_Library::Interval< Boundary, Info >::join_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::mul_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::neg_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::operator=(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::sub_assign().
00485 { 00486 I_Result r; 00487 Result rl, ru; 00488 info().clear(); 00489 switch (e) { 00490 case EMPTY: 00491 info().set_interval_property(CARDINALITY_IS); 00492 info().set_interval_property(CARDINALITY_0); 00493 lower_set_uninit(1); 00494 upper_set_uninit(0); 00495 r = I_EMPTY; 00496 break; 00497 case UNIVERSE: 00498 info().set_interval_property(CARDINALITY_0, true); 00499 info().set_interval_property(CARDINALITY_1, true); 00500 rl = lower_set_uninit(UNBOUNDED); 00501 ru = upper_set_uninit(UNBOUNDED); 00502 r = combine(rl, ru); 00503 break; 00504 default: 00505 assert(0); 00506 r = I_EMPTY; 00507 break; 00508 } 00509 complete_init(); 00510 assert(OK()); 00511 return r; 00512 }
| Enable_If< Is_Singleton< From >::value||Is_Interval< From >::value, I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::assign | ( | const From & | x | ) | [inline] |
Definition at line 515 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_1, Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00515 { 00516 info().clear(); 00517 info().set_interval_property(CARDINALITY_0, true); 00518 info().set_interval_property(CARDINALITY_1, true); 00519 Result rl, ru; 00520 switch (From::code) { 00521 case VC_MINUS_INFINITY: 00522 rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info()); 00523 ru = Boundary_NS::set_minus_infinity(UPPER, upper(), info()); 00524 break; 00525 case VC_PLUS_INFINITY: 00526 rl = Boundary_NS::set_plus_infinity(LOWER, lower(), info()); 00527 ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info()); 00528 break; 00529 default: 00530 assert(0); 00531 rl = VC_NAN; 00532 ru = VC_NAN; 00533 } 00534 complete_init_internal(); 00535 assert(OK()); 00536 return combine(rl, ru); 00537 }
| I_Result Parma_Polyhedra_Library::Interval< Boundary, Info >::set_infinities | ( | ) | [inline] |
Definition at line 539 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_1, Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::div_assign(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::mul_assign().
00539 { 00540 info().clear(); 00541 info().set_interval_property(CARDINALITY_0, true); 00542 info().set_interval_property(CARDINALITY_1, true); 00543 // FIXME: what about restrictions? 00544 Result rl = Boundary_NS::set_minus_infinity(LOWER, lower(), info()); 00545 Result ru = Boundary_NS::set_plus_infinity(UPPER, upper(), info()); 00546 complete_init_internal(); 00547 assert(OK()); 00548 return combine(rl, ru); 00549 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::is_topologically_closed | ( | ) | const [inline] |
Definition at line 551 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_open(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_open(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_unbounded().
00551 { 00552 assert(OK()); 00553 return !Info::store_open 00554 || is_empty() 00555 || ((lower_is_unbounded() || !lower_is_open()) 00556 && (upper_is_unbounded() || !upper_is_open())); 00557 }
| void Parma_Polyhedra_Library::Interval< Boundary, Info >::topological_closure_assign | ( | ) | [inline] |
Assigns to *this its topological closure.
Definition at line 560 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_unbounded(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_unbounded().
00560 { 00561 if (!Info::store_open || is_empty()) 00562 return; 00563 00564 if (!lower_is_unbounded()) 00565 info().set_boundary_property(LOWER, OPEN, false); 00566 00567 if (!upper_is_unbounded()) 00568 info().set_boundary_property(UPPER, OPEN, false); 00569 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::is_infinity | ( | ) | const [inline] |
Definition at line 571 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::is_infinity().
00571 { 00572 assert(OK()); 00573 if (is_reverse_infinity(LOWER, lower(), info())) 00574 return 1; 00575 else if (is_reverse_infinity(UPPER, upper(), info())) 00576 return -1; 00577 else 00578 return 0; 00579 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::contains_integer_point | ( | ) | const [inline] |
Definition at line 581 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_open(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_open().
00581 { 00582 assert(OK()); 00583 if (is_empty()) 00584 return false; 00585 if (is_unbounded()) 00586 return true; 00587 Boundary l; 00588 if (lower_is_open()) { 00589 add_assign_r(l, lower(), Boundary(1), ROUND_DOWN); 00590 floor_assign_r(l, l, ROUND_DOWN); 00591 } 00592 else 00593 ceil_assign_r(l, lower(), ROUND_DOWN); 00594 Boundary u; 00595 if (upper_is_open()) { 00596 sub_assign_r(u, upper(), Boundary(1), ROUND_UP); 00597 ceil_assign_r(u, u, ROUND_UP); 00598 } 00599 else 00600 floor_assign_r(u, upper(), ROUND_UP); 00601 return u >= l; 00602 }
| memory_size_type Parma_Polyhedra_Library::Interval< Boundary, Info >::total_memory_in_bytes | ( | ) | const [inline] |
Returns the total size in bytes of the memory occupied by *this.
Definition at line 37 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::external_memory_in_bytes().
00037 { 00038 return sizeof(*this) + external_memory_in_bytes(); 00039 }
| memory_size_type Parma_Polyhedra_Library::Interval< Boundary, Info >::external_memory_in_bytes | ( | ) | const [inline] |
Returns the size in bytes of the memory managed by *this.
Definition at line 30 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::external_memory_in_bytes(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::total_memory_in_bytes().
00030 { 00031 return Parma_Polyhedra_Library::external_memory_in_bytes(lower()) 00032 + Parma_Polyhedra_Library::external_memory_in_bytes(upper()); 00033 }
| void Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_dump | ( | std::ostream & | s | ) | const [inline] |
Definition at line 1166 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::ascii_dump(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
01166 { 01167 using Parma_Polyhedra_Library::ascii_dump; 01168 s << "info "; 01169 info().ascii_dump(s); 01170 s << " lower "; 01171 ascii_dump(s, lower()); 01172 s << " upper "; 01173 ascii_dump(s, upper()); 01174 s << '\n'; 01175 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_load | ( | std::istream & | s | ) | [inline] |
Definition at line 1179 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::ascii_load(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
01179 { 01180 using Parma_Polyhedra_Library::ascii_load; 01181 std::string str; 01182 if (!(s >> str) || str != "info") 01183 return false; 01184 if (!info().ascii_load(s)) 01185 return false; 01186 if (!(s >> str) || str != "lower") 01187 return false; 01188 if (!ascii_load(s, lower())) 01189 return false; 01190 if (!(s >> str) || str != "upper") 01191 return false; 01192 if (!ascii_load(s, upper())) 01193 return false; 01194 #ifdef PPL_ABI_BREAKING_EXTRA_DEBUG 01195 complete_init_internal(); 01196 #endif 01197 assert(OK()); 01198 return true; 01199 }
| bool Parma_Polyhedra_Library::Interval< Boundary, Info >::OK | ( | ) | const [inline] |
Definition at line 613 of file Interval.defs.hh.
References Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_1, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_IS, Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_cached(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_empty_nocache(), Parma_Polyhedra_Library::is_minus_infinity(), Parma_Polyhedra_Library::is_not_a_number(), Parma_Polyhedra_Library::is_plus_infinity(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_cached(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_singleton_nocache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::T_NO, Parma_Polyhedra_Library::T_YES, and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::add_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::ascii_load(), Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::contains(), Parma_Polyhedra_Library::Interval< Boundary, Info >::contains_integer_point(), Parma_Polyhedra_Library::Interval< Boundary, Info >::difference_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::div_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::intersect_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_disjoint_from(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_infinity(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_topologically_closed(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::is_universe(), Parma_Polyhedra_Library::Interval< Boundary, Info >::join_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_open(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_narrow(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_set(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_shrink(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_widen(), Parma_Polyhedra_Library::Interval< Boundary, Info >::mul_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::neg_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::normalize(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal(), Parma_Polyhedra_Library::Interval< Boundary, Info >::set_infinities(), Parma_Polyhedra_Library::Interval< Boundary, Info >::strictly_contains(), Parma_Polyhedra_Library::Interval< Boundary, Info >::sub_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_open(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_is_unbounded(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_narrow(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_set(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_shrink(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_widen().
00613 { 00614 #ifdef PPL_ABI_BREAKING_EXTRA_DEBUG 00615 if (!completed) { 00616 std::cerr << "The interval initialization has not been completed." 00617 << std::endl; 00618 return false; 00619 } 00620 #endif 00621 #if 0 00622 if (!Info::may_be_empty && is_empty()) { 00623 #ifndef NDEBUG 00624 std::cerr << "The interval is unexpectedly empty.\n"; 00625 #endif 00626 return false; 00627 } 00628 #endif 00629 00630 if (is_open(LOWER, lower(), info())) { 00631 if (is_plus_infinity(LOWER, lower(), info())) { 00632 #ifndef NDEBUG 00633 std::cerr << "The lower boundary is +inf open.\n"; 00634 #endif 00635 } 00636 } 00637 else if (!Info::may_contain_infinity 00638 && (is_minus_infinity(LOWER, lower(), info()) 00639 || is_plus_infinity(LOWER, lower(), info()))) { 00640 #ifndef NDEBUG 00641 std::cerr << "The lower boundary is unexpectedly infinity.\n"; 00642 #endif 00643 return false; 00644 } 00645 if (!info().get_boundary_property(LOWER, SPECIAL)) { 00646 if (is_not_a_number(lower())) { 00647 #ifndef NDEBUG 00648 std::cerr << "The lower boundary is not a number.\n"; 00649 #endif 00650 return false; 00651 } 00652 #if 0 00653 if (info().get_boundary_property(LOWER, NORMALIZED) 00654 && !info().is_restricted(lower())) { 00655 #ifndef NDEBUG 00656 std::cerr << "The lower boundary is marked to be normalized, " 00657 << "but it is not.\n"; 00658 #endif 00659 return false; 00660 } 00661 #endif 00662 } 00663 00664 if (is_open(UPPER, upper(), info())) { 00665 if (is_minus_infinity(UPPER, upper(), info())) { 00666 #ifndef NDEBUG 00667 std::cerr << "The upper boundary is -inf open.\n"; 00668 #endif 00669 } 00670 } 00671 else if (!Info::may_contain_infinity 00672 && (is_minus_infinity(UPPER, upper(), info()) 00673 || is_plus_infinity(UPPER, upper(), info()))) { 00674 #ifndef NDEBUG 00675 std::cerr << "The upper boundary is unexpectedly infinity." 00676 << std::endl; 00677 #endif 00678 return false; 00679 } 00680 if (!info().get_boundary_property(UPPER, SPECIAL)) { 00681 if (is_not_a_number(upper())) { 00682 #ifndef NDEBUG 00683 std::cerr << "The upper boundary is not a number.\n"; 00684 #endif 00685 return false; 00686 } 00687 #if 0 00688 if (info().get_boundary_property(UPPER, NORMALIZED) 00689 && !info().is_restricted(upper())) { 00690 #ifndef NDEBUG 00691 std::cerr << "The upper boundary is marked to be normalized, " 00692 << "but it is not.\n"; 00693 #endif 00694 return false; 00695 } 00696 #endif 00697 } 00698 00699 Ternary t; 00700 00701 t = is_empty_cached(); 00702 if (t == T_YES) { 00703 if (!is_empty_nocache()) { 00704 #ifndef NDEBUG 00705 std::cerr << "The interval is marked to be empty, " 00706 << "but actually it is not empty.\n"; 00707 #endif 00708 return false; 00709 } 00710 } 00711 else if (t == T_NO) { 00712 if (is_empty_nocache()) { 00713 #ifndef NDEBUG 00714 std::cerr << "The interval is marked to be not empty, " 00715 << "but actually it is empty.\n"; 00716 #endif 00717 return false; 00718 } 00719 } 00720 00721 t = is_singleton_cached(); 00722 if (t == T_YES) { 00723 if (!is_singleton_nocache()) { 00724 #ifndef NDEBUG 00725 std::cerr << "The interval is marked to be singleton, " 00726 << "but actually it is not singleton.\n"; 00727 #endif 00728 return false; 00729 } 00730 } 00731 else if (t == T_NO) { 00732 if (is_singleton_nocache()) { 00733 #ifndef NDEBUG 00734 std::cerr << "The interval is marked to be not singleton, " 00735 << "but actually it is singleton.\n"; 00736 #endif 00737 return false; 00738 } 00739 } 00740 00741 if (info().get_interval_property(CARDINALITY_IS) && 00742 info().get_interval_property(CARDINALITY_0) 00743 == info().get_interval_property(CARDINALITY_1)) { 00744 #ifndef NDEBUG 00745 std::cerr << "The interval is marked to know its cardinality, " 00746 << "but this is unspecified or ambiguous.\n"; 00747 #endif 00748 return false; 00749 } 00750 00751 // Everything OK. 00752 return true; 00753 }
| Enable_If< Is_Singleton< T >::value||Is_Interval< T >::value, bool >::type Parma_Polyhedra_Library::Interval< Boundary, Info >::contains | ( | const T & | y | ) | const [inline] |
Definition at line 219 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::contains_restriction(), Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Checked::le(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00219 { 00220 assert(OK()); 00221 assert(f_OK(y)); 00222 if (check_empty_arg(y)) 00223 return true; 00224 if (check_empty_arg(*this)) 00225 return false; 00226 if (!contains_restriction(info(), f_info(y))) 00227 return false; 00228 return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y)) 00229 && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)); 00230 }
| Enable_If< Is_Singleton< T >::value||Is_Interval< T >::value, bool >::type Parma_Polyhedra_Library::Interval< Boundary, Info >::strictly_contains | ( | const T & | y | ) | const [inline] |
Definition at line 235 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::contains_restriction(), Parma_Polyhedra_Library::eq_restriction(), Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Checked::le(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Checked::lt(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00235 { 00236 assert(OK()); 00237 assert(f_OK(y)); 00238 if (check_empty_arg(y)) 00239 return !check_empty_arg(*this); 00240 if (check_empty_arg(*this)) 00241 return false; 00242 if (!contains_restriction(info(), f_info(y))) 00243 return false; 00244 else if (!eq_restriction(*this, y)) 00245 return le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y)) 00246 && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y)); 00247 return (lt(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y)) 00248 && ge(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y))) 00249 || (le(LOWER, lower(), info(), LOWER, f_lower(y), f_info(y)) 00250 && gt(UPPER, upper(), info(), UPPER, f_upper(y), f_info(y))); 00251 }
| Enable_If< Is_Singleton< T >::value||Is_Interval< T >::value, bool >::type Parma_Polyhedra_Library::Interval< Boundary, Info >::is_disjoint_from | ( | const T & | y | ) | const [inline] |
Definition at line 257 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Checked::lt(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00257 { 00258 assert(OK()); 00259 assert(f_OK(y)); 00260 if (check_empty_arg(*this) || check_empty_arg(y)) 00261 return true; 00262 // CHECKME. 00263 // if (!contains_restriction(info(), f_info(y))) 00264 // return false; 00265 return gt(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y)) 00266 || lt(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y)); 00267 }
| I_Result Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::assign | ( | const From1 & | l, | |
| const From2 & | u | |||
| ) | [inline] |
Definition at line 272 of file Interval.inlines.hh.
References assign(), Parma_Polyhedra_Library::check_empty_result(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00272 { 00273 info().clear(); 00274 Result rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, l, f_info(l)); 00275 Result ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, u, f_info(u)); 00276 complete_init_internal(); 00277 assert(OK()); 00278 // The following Parma_Polyhedra_Library:: qualification is to work 00279 // around a bug in version 10.0 of the Intel C/C++ compiler. 00280 return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru)); 00281 }
| Enable_If<Is_Singleton<From>::value || Is_Interval<From>::value, I_Result>::type Parma_Polyhedra_Library::Interval< Boundary, Info >::assign | ( | const From & | x | ) | [inline] |
| Enable_If< Is_Singleton< From >::value||Is_Interval< From >::value, I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::join_assign | ( | const From & | x | ) | [inline] |
Definition at line 309 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_1, Parma_Polyhedra_Library::Interval_NS::CARDINALITY_IS, Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::join_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::max_assign(), Parma_Polyhedra_Library::min_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00309 { 00310 assert(f_OK(x)); 00311 if (check_empty_arg(*this)) 00312 return assign(x); 00313 if (check_empty_arg(x)) 00314 return combine(V_EQ, V_EQ); 00315 if (!join_restriction(info(), *this, x)) 00316 return assign(EMPTY); 00317 info().set_interval_property(CARDINALITY_IS, false); 00318 info().set_interval_property(CARDINALITY_0); 00319 info().set_interval_property(CARDINALITY_1, false); 00320 Result rl, ru; 00321 rl = min_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)); 00322 ru = max_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)); 00323 assert(OK()); 00324 return combine(rl, ru); 00325 }
| Enable_If<((Is_Singleton< From1 >::value||Is_Interval< From1 >::value)&&(Is_Singleton< From2 >::value||Is_Interval< From2 >::value)), I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::join_assign | ( | const From1 & | x, | |
| const From2 & | y | |||
| ) | [inline] |
Definition at line 333 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::Interval_NS::CARDINALITY_0, Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::join_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::max_assign(), Parma_Polyhedra_Library::min_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00333 { 00334 assert(f_OK(x)); 00335 assert(f_OK(y)); 00336 if (check_empty_arg(x)) 00337 return assign(y); 00338 if (check_empty_arg(y)) 00339 return assign(x); 00340 DIRTY_TEMP(To_Info, to_info); 00341 to_info.clear(); 00342 if (!join_restriction(to_info, x, y)) 00343 return assign(EMPTY); 00344 to_info.set_interval_property(CARDINALITY_0); 00345 Result rl, ru; 00346 rl = min_assign(LOWER, lower(), to_info, 00347 LOWER, f_lower(x), f_info(x), 00348 LOWER, f_lower(y), f_info(y)); 00349 ru = max_assign(UPPER, upper(), to_info, 00350 UPPER, f_upper(x), f_info(x), 00351 UPPER, f_upper(y), f_info(y)); 00352 assign_or_swap(info(), to_info); 00353 complete_init_internal(); 00354 assert(OK()); 00355 return combine(rl, ru); 00356 }
| Enable_If< Is_Singleton< From >::value||Is_Interval< From >::value, I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::intersect_assign | ( | const From & | x | ) | [inline] |
Definition at line 362 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::check_empty_result(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::intersect_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::max_assign(), Parma_Polyhedra_Library::min_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_existential(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::refine_universal().
00362 { 00363 assert(f_OK(x)); 00364 if (!intersect_restriction(info(), *this, x)) 00365 return assign(EMPTY); 00366 // FIXME: more accurate? 00367 invalidate_cardinality_cache(); 00368 Result rl, ru; 00369 rl = max_assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)); 00370 ru = min_assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)); 00371 assert(OK()); 00372 // The following Parma_Polyhedra_Library:: qualification is to work 00373 // around a bug in version 10.0 of the Intel C/C++ compiler. 00374 return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru)); 00375 }
| Enable_If<((Is_Singleton< From1 >::value||Is_Interval< From1 >::value)&&(Is_Singleton< From2 >::value||Is_Interval< From2 >::value)), I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::intersect_assign | ( | const From1 & | x, | |
| const From2 & | y | |||
| ) | [inline] |
Definition at line 383 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::check_empty_result(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::intersect_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::max_assign(), Parma_Polyhedra_Library::min_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00384 { 00385 assert(f_OK(x)); 00386 assert(f_OK(y)); 00387 DIRTY_TEMP(To_Info, to_info); 00388 to_info.clear(); 00389 if (!intersect_restriction(to_info, x, y)) 00390 return assign(EMPTY); 00391 Result rl, ru; 00392 rl = max_assign(LOWER, lower(), to_info, 00393 LOWER, f_lower(x), f_info(x), 00394 LOWER, f_lower(y), f_info(y)); 00395 ru = min_assign(UPPER, upper(), to_info, 00396 UPPER, f_upper(x), f_info(x), 00397 UPPER, f_upper(y), f_info(y)); 00398 assign_or_swap(info(), to_info); 00399 complete_init_internal(); 00400 assert(OK()); 00401 // The following Parma_Polyhedra_Library:: qualification is to work 00402 // around a bug in version 10.0 of the Intel C/C++ compiler. 00403 return Parma_Polyhedra_Library::check_empty_result(*this, combine(rl, ru)); 00404 }
| Enable_If< Is_Singleton< From >::value||Is_Interval< From >::value, I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::difference_assign | ( | const From & | x | ) | [inline] |
Assigns to *this the smallest interval containing the set-theoretic difference of *this and x.
Definition at line 410 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Checked::le(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Checked::lt(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00410 { 00411 assert(f_OK(x)); 00412 // FIXME: restrictions 00413 if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)) || 00414 gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x))) 00415 return combine(V_EQ, V_EQ); 00416 bool nl = ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)); 00417 bool nu = le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)); 00418 Result rl = V_EQ, ru = V_EQ; 00419 if (nl) { 00420 if (nu) 00421 return assign(EMPTY); 00422 else { 00423 invalidate_cardinality_cache(); 00424 info().clear_boundary_properties(LOWER); 00425 rl = complement(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x)); 00426 } 00427 } 00428 else if (nu) { 00429 invalidate_cardinality_cache(); 00430 info().clear_boundary_properties(UPPER); 00431 ru = complement(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x)); 00432 } 00433 assert(OK()); 00434 return combine(rl, ru); 00435 }
| Enable_If<((Is_Singleton< From1 >::value||Is_Interval< From1 >::value)&&(Is_Singleton< From2 >::value||Is_Interval< From2 >::value)), I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::difference_assign | ( | const From1 & | x, | |
| const From2 & | y | |||
| ) | [inline] |
Assigns to *this the smallest interval containing the set-theoretic difference of x and y.
Definition at line 443 of file Interval.inlines.hh.
References assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Checked::le(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Checked::lt(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00444 { 00445 assert(f_OK(x)); 00446 assert(f_OK(y)); 00447 DIRTY_TEMP(To_Info, to_info); 00448 to_info.clear(); 00449 // FIXME: restrictions 00450 if (lt(UPPER, f_upper(x), f_info(x), LOWER, f_lower(y), f_info(y)) || 00451 gt(LOWER, f_lower(x), f_info(x), UPPER, f_upper(y), f_info(y))) 00452 return assign(x); 00453 bool nl = ge(LOWER, f_lower(x), f_info(x), LOWER, f_lower(y), f_info(y)); 00454 bool nu = le(UPPER, f_upper(x), f_info(x), UPPER, f_upper(y), f_info(y)); 00455 Result rl = V_EQ, ru = V_EQ; 00456 if (nl) { 00457 if (nu) 00458 return assign(EMPTY); 00459 else { 00460 rl = complement(LOWER, lower(), info(), UPPER, f_upper(y), f_info(y)); 00461 ru = Boundary_NS::assign(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x)); 00462 } 00463 } 00464 else if (nu) { 00465 ru = complement(UPPER, upper(), info(), LOWER, f_lower(y), f_info(y)); 00466 rl = Boundary_NS::assign(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x)); 00467 } 00468 assign_or_swap(info(), to_info); 00469 complete_init_internal(); 00470 assert(OK()); 00471 return combine(rl, ru); 00472 }
| Enable_If< Is_Singleton< From >::value||Is_Interval< From >::value, I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::refine_existential | ( | Relation_Symbol | rel, | |
| const From & | x | |||
| ) | [inline] |
Refines to according to the existential relation rel with x.
The to interval is restricted to become, upon successful exit, the smallest interval of its type that contains the set
Definition at line 479 of file Interval.inlines.hh.
References assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::check_empty_result(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Checked::eq(), Parma_Polyhedra_Library::EQUAL, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::f_is_singleton(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::GREATER_OR_EQUAL, Parma_Polyhedra_Library::GREATER_THAN, Parma_Polyhedra_Library::I_EMPTY, Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::intersect_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Checked::le(), Parma_Polyhedra_Library::LESS_OR_EQUAL, Parma_Polyhedra_Library::LESS_THAN, Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_shrink(), Parma_Polyhedra_Library::Checked::lt(), Parma_Polyhedra_Library::Interval< Boundary, Info >::normalize(), Parma_Polyhedra_Library::NOT_EQUAL, Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval< Boundary, Info >::upper(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_shrink().
00479 { 00480 assert(OK()); 00481 assert(f_OK(x)); 00482 if (check_empty_arg(x)) 00483 return assign(EMPTY); 00484 switch (rel) { 00485 case LESS_THAN: 00486 { 00487 if (lt(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x))) 00488 return combine(V_EQ, V_EQ); 00489 info().clear_boundary_properties(UPPER); 00490 Result ru = Boundary_NS::assign(UPPER, upper(), info(), 00491 UPPER, f_upper(x), f_info(x), true); 00492 invalidate_cardinality_cache(); 00493 normalize(); 00494 // The following Parma_Polyhedra_Library:: qualification is to work 00495 // around a bug in version 10.0 of the Intel C/C++ compiler. 00496 return Parma_Polyhedra_Library::check_empty_result(*this, 00497 combine(V_EQ, ru)); 00498 } 00499 case LESS_OR_EQUAL: 00500 { 00501 if (le(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x))) 00502 return combine(V_EQ, V_EQ); 00503 info().clear_boundary_properties(UPPER); 00504 Result ru = Boundary_NS::assign(UPPER, upper(), info(), 00505 UPPER, f_upper(x), f_info(x)); 00506 invalidate_cardinality_cache(); 00507 normalize(); 00508 // The following Parma_Polyhedra_Library:: qualification is to work 00509 // around a bug in version 10.0 of the Intel C/C++ compiler. 00510 return Parma_Polyhedra_Library::check_empty_result(*this, 00511 combine(V_EQ, ru)); 00512 } 00513 case GREATER_THAN: 00514 { 00515 if (gt(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x))) 00516 return combine(V_EQ, V_EQ); 00517 info().clear_boundary_properties(LOWER); 00518 Result rl = Boundary_NS::assign(LOWER, lower(), info(), 00519 LOWER, f_lower(x), f_info(x), true); 00520 invalidate_cardinality_cache(); 00521 normalize(); 00522 // The following Parma_Polyhedra_Library:: qualification is to work 00523 // around a bug in version 10.0 of the Intel C/C++ compiler. 00524 return Parma_Polyhedra_Library::check_empty_result(*this, 00525 combine(rl, V_EQ)); 00526 } 00527 case GREATER_OR_EQUAL: 00528 { 00529 if (ge(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x))) 00530 return combine(V_EQ, V_EQ); 00531 info().clear_boundary_properties(LOWER); 00532 Result rl = Boundary_NS::assign(LOWER, lower(), info(), 00533 LOWER, f_lower(x), f_info(x)); 00534 invalidate_cardinality_cache(); 00535 normalize(); 00536 // The following Parma_Polyhedra_Library:: qualification is to work 00537 // around a bug in version 10.0 of the Intel C/C++ compiler. 00538 return Parma_Polyhedra_Library::check_empty_result(*this, 00539 combine(rl, V_EQ)); 00540 } 00541 case EQUAL: 00542 return intersect_assign(x); 00543 case NOT_EQUAL: 00544 { 00545 if (!f_is_singleton(x)) 00546 return combine(V_EQ, V_EQ); 00547 if (check_empty_arg(*this)) 00548 return I_EMPTY; 00549 if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x))) 00550 lower_shrink(); 00551 if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x))) 00552 upper_shrink(); 00553 invalidate_cardinality_cache(); 00554 normalize(); 00555 // The following Parma_Polyhedra_Library:: qualification is to work 00556 // around a bug in version 10.0 of the Intel C/C++ compiler. 00557 return Parma_Polyhedra_Library::check_empty_result(*this, 00558 combine(V_EQ, V_EQ)); 00559 } 00560 default: 00561 assert(false); 00562 return I_EMPTY; 00563 } 00564 }
| Enable_If< Is_Singleton< From >::value||Is_Interval< From >::value, I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::refine_universal | ( | Relation_Symbol | rel, | |
| const From & | x | |||
| ) | [inline] |
Refines to so that it satisfies the universal relation rel with x.
The to interval is restricted to become, upon successful exit, the smallest interval of its type that contains the set
Definition at line 570 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), assign(), Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::check_empty_result(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Checked::eq(), Parma_Polyhedra_Library::EQUAL, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::f_is_singleton(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::GREATER_OR_EQUAL, Parma_Polyhedra_Library::GREATER_THAN, Parma_Polyhedra_Library::I_EMPTY, Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::intersect_assign(), Parma_Polyhedra_Library::Interval< Boundary, Info >::invalidate_cardinality_cache(), Parma_Polyhedra_Library::Checked::le(), Parma_Polyhedra_Library::LESS_OR_EQUAL, Parma_Polyhedra_Library::LESS_THAN, Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_shrink(), Parma_Polyhedra_Library::Checked::lt(), Parma_Polyhedra_Library::Interval< Boundary, Info >::normalize(), Parma_Polyhedra_Library::NOT_EQUAL, Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), Parma_Polyhedra_Library::Interval_NS::SCALAR_INFO, Parma_Polyhedra_Library::Interval< Boundary, Info >::upper(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_shrink().
00571 { 00572 assert(OK()); 00573 assert(f_OK(x)); 00574 if (check_empty_arg(x)) 00575 return combine(V_EQ, V_EQ); 00576 switch (rel) { 00577 case LESS_THAN: 00578 { 00579 if (lt(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))) 00580 return combine(V_EQ, V_EQ); 00581 info().clear_boundary_properties(UPPER); 00582 Result ru = Boundary_NS::assign(UPPER, upper(), info(), 00583 LOWER, f_lower(x), SCALAR_INFO, !is_open(LOWER, f_lower(x), f_info(x))); 00584 invalidate_cardinality_cache(); 00585 normalize(); 00586 // The following Parma_Polyhedra_Library:: qualification is to work 00587 // around a bug in version 10.0 of the Intel C/C++ compiler. 00588 return Parma_Polyhedra_Library::check_empty_result(*this, 00589 combine(V_EQ, ru)); 00590 } 00591 case LESS_OR_EQUAL: 00592 { 00593 if (le(UPPER, upper(), info(), LOWER, f_lower(x), f_info(x))) 00594 return combine(V_EQ, V_EQ); 00595 info().clear_boundary_properties(UPPER); 00596 Result ru = Boundary_NS::assign(UPPER, upper(), info(), 00597 LOWER, f_lower(x), SCALAR_INFO); 00598 invalidate_cardinality_cache(); 00599 normalize(); 00600 // The following Parma_Polyhedra_Library:: qualification is to work 00601 // around a bug in version 10.0 of the Intel C/C++ compiler. 00602 return Parma_Polyhedra_Library::check_empty_result(*this, 00603 combine(V_EQ, ru)); 00604 } 00605 case GREATER_THAN: 00606 { 00607 if (gt(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x))) 00608 return combine(V_EQ, V_EQ); 00609 info().clear_boundary_properties(LOWER); 00610 Result rl = Boundary_NS::assign(LOWER, lower(), info(), 00611 UPPER, f_upper(x), SCALAR_INFO, !is_open(UPPER, f_upper(x), f_info(x))); 00612 invalidate_cardinality_cache(); 00613 normalize(); 00614 // The following Parma_Polyhedra_Library:: qualification is to work 00615 // around a bug in version 10.0 of the Intel C/C++ compiler. 00616 return Parma_Polyhedra_Library::check_empty_result(*this, 00617 combine(rl, V_EQ)); 00618 } 00619 case GREATER_OR_EQUAL: 00620 { 00621 if (ge(LOWER, lower(), info(), UPPER, f_upper(x), f_info(x))) 00622 return combine(V_EQ, V_EQ); 00623 info().clear_boundary_properties(LOWER); 00624 Result rl = Boundary_NS::assign(LOWER, lower(), info(), 00625 UPPER, f_upper(x), SCALAR_INFO); 00626 invalidate_cardinality_cache(); 00627 normalize(); 00628 // The following Parma_Polyhedra_Library:: qualification is to work 00629 // around a bug in version 10.0 of the Intel C/C++ compiler. 00630 return Parma_Polyhedra_Library::check_empty_result(*this, 00631 combine(rl, V_EQ)); 00632 } 00633 case EQUAL: 00634 if (!f_is_singleton(x)) 00635 return assign(EMPTY); 00636 return intersect_assign(x); 00637 case NOT_EQUAL: 00638 { 00639 if (check_empty_arg(*this)) 00640 return I_EMPTY; 00641 if (eq(LOWER, lower(), info(), LOWER, f_lower(x), f_info(x))) 00642 lower_shrink(); 00643 if (eq(UPPER, upper(), info(), UPPER, f_upper(x), f_info(x))) 00644 upper_shrink(); 00645 invalidate_cardinality_cache(); 00646 normalize(); 00647 // The following Parma_Polyhedra_Library:: qualification is to work 00648 // around a bug in version 10.0 of the Intel C/C++ compiler. 00649 return Parma_Polyhedra_Library::check_empty_result(*this, 00650 combine(V_EQ, V_EQ)); 00651 } 00652 default: 00653 assert(false); 00654 return I_EMPTY; 00655 } 00656 }
| Enable_If< Is_Singleton< From >::value||Is_Interval< From >::value, I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::neg_assign | ( | const From & | x | ) | [inline] |
Definition at line 662 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::neg_assign(), Parma_Polyhedra_Library::neg_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
00662 { 00663 assert(f_OK(x)); 00664 if (check_empty_arg(x)) 00665 return assign(EMPTY); 00666 DIRTY_TEMP(To_Info, to_info); 00667 to_info.clear(); 00668 if (!neg_restriction(to_info, x)) 00669 return assign(EMPTY); 00670 Result rl, ru; 00671 DIRTY_TEMP(To_Boundary, to_lower); 00672 rl = Boundary_NS::neg_assign(LOWER, to_lower, to_info, UPPER, f_upper(x), f_info(x)); 00673 ru = Boundary_NS::neg_assign(UPPER, upper(), to_info, LOWER, f_lower(x), f_info(x)); 00674 assign_or_swap(lower(), to_lower); 00675 assign_or_swap(info(), to_info); 00676 complete_init_internal(); 00677 assert(OK()); 00678 return combine(rl, ru); 00679 }
| Enable_If<((Is_Singleton< From1 >::value||Is_Interval< From1 >::value)&&(Is_Singleton< From2 >::value||Is_Interval< From2 >::value)), I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::add_assign | ( | const From1 & | x, | |
| const From2 & | y | |||
| ) | [inline] |
Definition at line 687 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::add_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::is_infinity(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), MINUS_INFINITY, Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), PLUS_INFINITY, and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::operator+(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::operator+=().
00687 { 00688 assert(f_OK(x)); 00689 assert(f_OK(y)); 00690 if (check_empty_arg(x) || check_empty_arg(y)) 00691 return assign(EMPTY); 00692 int inf = Parma_Polyhedra_Library::is_infinity(x); 00693 if (inf) { 00694 if (Parma_Polyhedra_Library::is_infinity(y) == -inf) 00695 return assign(EMPTY); 00696 } 00697 else 00698 inf = Parma_Polyhedra_Library::is_infinity(y); 00699 if (inf < 0) 00700 return assign(MINUS_INFINITY); 00701 else if (inf > 0) 00702 return assign(PLUS_INFINITY); 00703 DIRTY_TEMP(To_Info, to_info); 00704 to_info.clear(); 00705 if (!add_restriction(to_info, x, y)) 00706 return assign(EMPTY); 00707 Result rl = Boundary_NS::add_assign(LOWER, lower(), to_info, 00708 LOWER, f_lower(x), f_info(x), 00709 LOWER, f_lower(y), f_info(y)); 00710 Result ru = Boundary_NS::add_assign(UPPER, upper(), to_info, 00711 UPPER, f_upper(x), f_info(x), 00712 UPPER, f_upper(y), f_info(y)); 00713 assign_or_swap(info(), to_info); 00714 complete_init_internal(); 00715 assert(OK()); 00716 return combine(rl, ru); 00717 }
| Enable_If<((Is_Singleton< From1 >::value||Is_Interval< From1 >::value)&&(Is_Singleton< From2 >::value||Is_Interval< From2 >::value)), I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::sub_assign | ( | const From1 & | x, | |
| const From2 & | y | |||
| ) | [inline] |
Definition at line 725 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::is_infinity(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), MINUS_INFINITY, Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), PLUS_INFINITY, Parma_Polyhedra_Library::sub_restriction(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::operator-(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::operator-=().
00725 { 00726 assert(f_OK(x)); 00727 assert(f_OK(y)); 00728 if (check_empty_arg(x) || check_empty_arg(y)) 00729 return assign(EMPTY); 00730 int inf = Parma_Polyhedra_Library::is_infinity(x); 00731 if (inf) { 00732 if (Parma_Polyhedra_Library::is_infinity(y) == inf) 00733 return assign(EMPTY); 00734 } 00735 else 00736 inf = -Parma_Polyhedra_Library::is_infinity(y); 00737 if (inf < 0) 00738 return assign(MINUS_INFINITY); 00739 else if (inf > 0) 00740 return assign(PLUS_INFINITY); 00741 00742 DIRTY_TEMP(To_Info, to_info); 00743 to_info.clear(); 00744 if (!sub_restriction(to_info, x, y)) 00745 return assign(EMPTY); 00746 Result rl, ru; 00747 DIRTY_TEMP(To_Boundary, to_lower); 00748 rl = Boundary_NS::sub_assign(LOWER, to_lower, to_info, 00749 LOWER, f_lower(x), f_info(x), 00750 UPPER, f_upper(y), f_info(y)); 00751 ru = Boundary_NS::sub_assign(UPPER, upper(), to_info, 00752 UPPER, f_upper(x), f_info(x), 00753 LOWER, f_lower(y), f_info(y)); 00754 assign_or_swap(lower(), to_lower); 00755 assign_or_swap(info(), to_info); 00756 complete_init_internal(); 00757 assert(OK()); 00758 return combine(rl, ru); 00759 }
| Enable_If<((Is_Singleton< From1 >::value||Is_Interval< From1 >::value)&&(Is_Singleton< From2 >::value||Is_Interval< From2 >::value)), I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::mul_assign | ( | const From1 & | x, | |
| const From2 & | y | |||
| ) | [inline] |
+---------+-----------+-----------+-----------------+ | * | yl > 0 | yu < 0 | yl < 0, yu > 0 | +---------+-----------+-----------+-----------------+ | xl > 0 |xl*yl,xu*yu|xu*yl,xl*yu| xu*yl,xu*yu | +---------+-----------+-----------+-----------------+ | xu < 0 |xl*yu,xu*yl|xu*yu,xl*yl| xl*yu,xl*yl | +---------+-----------+-----------+-----------------+ |xl<0 xu>0|xl*yu,xu*yu|xu*yl,xl*yl|min(xl*yu,xu*yl),| | | | |max(xl*yl,xu*yu) | +---------+-----------+-----------+-----------------+
Definition at line 779 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::is_infinity(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), Parma_Polyhedra_Library::Checked::lt(), MINUS_INFINITY, Parma_Polyhedra_Library::mul_restriction(), Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), PLUS_INFINITY, Parma_Polyhedra_Library::Interval< Boundary, Info >::set_infinities(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::operator*(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::operator*=().
00779 { 00780 assert(f_OK(x)); 00781 assert(f_OK(y)); 00782 if (check_empty_arg(x) || check_empty_arg(y)) 00783 return assign(EMPTY); 00784 int xls = sgn_b(LOWER, f_lower(x), f_info(x)); 00785 int xus = xls > 0 ? 1 : sgn_b(UPPER, f_upper(x), f_info(x)); 00786 int yls = sgn_b(LOWER, f_lower(y), f_info(y)); 00787 int yus = yls > 0 ? 1 : sgn_b(UPPER, f_upper(y), f_info(y)); 00788 int inf = Parma_Polyhedra_Library::is_infinity(x); 00789 int ls, us; 00790 if (inf) { 00791 ls = yls; 00792 us = yus; 00793 goto inf; 00794 } 00795 else { 00796 inf = Parma_Polyhedra_Library::is_infinity(y); 00797 if (inf) { 00798 ls = xls; 00799 us = xus; 00800 inf: 00801 if (ls == 0 && us == 0) 00802 return assign(EMPTY); 00803 if (ls == -us) 00804 return set_infinities(); 00805 if (ls < 0 || us < 0) 00806 inf = -inf; 00807 if (inf < 0) 00808 return assign(MINUS_INFINITY); 00809 else 00810 return assign(PLUS_INFINITY); 00811 } 00812 } 00813 00814 DIRTY_TEMP(To_Info, to_info); 00815 to_info.clear(); 00816 if (!mul_restriction(to_info, x, y)) 00817 return assign(EMPTY); 00818 Result rl, ru; 00819 DIRTY_TEMP(To_Boundary, to_lower); 00820 00821 if (xls >= 0) { 00822 if (yls >= 0) { 00823 // 0 <= xl <= xu, 0 <= yl <= yu 00824 rl = mul_assign_z(LOWER, to_lower, to_info, 00825 LOWER, f_lower(x), f_info(x), xls, 00826 LOWER, f_lower(y), f_info(y), yls); 00827 ru = mul_assign_z(UPPER, upper(), to_info, 00828 UPPER, f_upper(x), f_info(x), xus, 00829 UPPER, f_upper(y), f_info(y), yus); 00830 } 00831 else if (yus <= 0) { 00832 // 0 <= xl <= xu, yl <= yu <= 0 00833 rl = mul_assign_z(LOWER, to_lower, to_info, 00834 UPPER, f_upper(x), f_info(x), xus, 00835 LOWER, f_lower(y), f_info(y), yls); 00836 ru = mul_assign_z(UPPER, upper(), to_info, 00837 LOWER, f_lower(x), f_info(x), xls, 00838 UPPER, f_upper(y), f_info(y), yus); 00839 } 00840 else { 00841 // 0 <= xl <= xu, yl < 0 < yu 00842 rl = mul_assign_z(LOWER, to_lower, to_info, 00843 UPPER, f_upper(x), f_info(x), xus, 00844 LOWER, f_lower(y), f_info(y), yls); 00845 ru = mul_assign_z(UPPER, upper(), to_info, 00846 UPPER, f_upper(x), f_info(x), xus, 00847 UPPER, f_upper(y), f_info(y), yus); 00848 } 00849 } 00850 else if (xus <= 0) { 00851 if (yls >= 0) { 00852 // xl <= xu <= 0, 0 <= yl <= yu 00853 rl = mul_assign_z(LOWER, to_lower, to_info, 00854 LOWER, f_lower(x), f_info(x), xls, 00855 UPPER, f_upper(y), f_info(y), yus); 00856 ru = mul_assign_z(UPPER, upper(), to_info, 00857 UPPER, f_upper(x), f_info(x), xus, 00858 LOWER, f_lower(y), f_info(y), yls); 00859 } 00860 else if (yus <= 0) { 00861 // xl <= xu <= 0, yl <= yu <= 0 00862 rl = mul_assign_z(LOWER, to_lower, to_info, 00863 UPPER, f_upper(x), f_info(x), xus, 00864 UPPER, f_upper(y), f_info(y), yus); 00865 ru = mul_assign_z(UPPER, upper(), to_info, 00866 LOWER, f_lower(x), f_info(x), xls, 00867 LOWER, f_lower(y), f_info(y), yls); 00868 } 00869 else { 00870 // xl <= xu <= 0, yl < 0 < yu 00871 rl = mul_assign_z(LOWER, to_lower, to_info, 00872 LOWER, f_lower(x), f_info(x), xls, 00873 UPPER, f_upper(y), f_info(y), yus); 00874 ru = mul_assign_z(UPPER, upper(), to_info, 00875 LOWER, f_lower(x), f_info(x), xls, 00876 LOWER, f_lower(y), f_info(y), yls); 00877 } 00878 } 00879 else if (yls >= 0) { 00880 // xl < 0 < xu, 0 <= yl <= yu 00881 rl = mul_assign_z(LOWER, to_lower, to_info, 00882 LOWER, f_lower(x), f_info(x), xls, 00883 UPPER, f_upper(y), f_info(y), yus); 00884 ru = mul_assign_z(UPPER, upper(), to_info, 00885 UPPER, f_upper(x), f_info(x), xus, 00886 UPPER, f_upper(y), f_info(y), yus); 00887 } 00888 else if (yus <= 0) { 00889 // xl < 0 < xu, yl <= yu <= 0 00890 rl = mul_assign_z(LOWER, to_lower, to_info, 00891 UPPER, f_upper(x), f_info(x), xus, 00892 LOWER, f_lower(y), f_info(y), yls); 00893 ru = mul_assign_z(UPPER, upper(), to_info, 00894 LOWER, f_lower(x), f_info(x), xls, 00895 LOWER, f_lower(y), f_info(y), yls); 00896 } 00897 else { 00898 // xl < 0 < xu, yl < 0 < yu 00899 DIRTY_TEMP(To_Boundary, tmp); 00900 DIRTY_TEMP(To_Info, tmp_info); 00901 tmp_info.clear(); 00902 Result tmp_r; 00903 tmp_r = Boundary_NS::mul_assign(LOWER, tmp, tmp_info, 00904 UPPER, f_upper(x), f_info(x), 00905 LOWER, f_lower(y), f_info(y)); 00906 rl = Boundary_NS::mul_assign(LOWER, to_lower, to_info, 00907 LOWER, f_lower(x), f_info(x), 00908 UPPER, f_upper(y), f_info(y)); 00909 if (gt(LOWER, to_lower, to_info, LOWER, tmp, tmp_info)) { 00910 to_lower = tmp; 00911 rl = tmp_r; 00912 } 00913 tmp_info.clear(); 00914 tmp_r = Boundary_NS::mul_assign(UPPER, tmp, tmp_info, 00915 UPPER, f_upper(x), f_info(x), 00916 UPPER, f_upper(y), f_info(y)); 00917 ru = Boundary_NS::mul_assign(UPPER, upper(), to_info, 00918 LOWER, f_lower(x), f_info(x), 00919 LOWER, f_lower(y), f_info(y)); 00920 if (lt(UPPER, upper(), to_info, UPPER, tmp, tmp_info)) { 00921 upper() = tmp; 00922 ru = tmp_r; 00923 } 00924 } 00925 assign_or_swap(lower(), to_lower); 00926 assign_or_swap(info(), to_info); 00927 complete_init_internal(); 00928 assert(OK()); 00929 return combine(rl, ru); 00930 }
| Enable_If<((Is_Singleton< From1 >::value||Is_Interval< From1 >::value)&&(Is_Singleton< From2 >::value||Is_Interval< From2 >::value)), I_Result >::type Parma_Polyhedra_Library::Interval< To_Boundary, To_Info >::div_assign | ( | const From1 & | x, | |
| const From2 & | y | |||
| ) | [inline] |
+-----------+-----------+-----------+ | / | yu < 0 | yl > 0 | +-----------+-----------+-----------+ | xu<=0 |xu/yl,xl/yu|xl/yl,xu/yu| +-----------+-----------+-----------+ |xl<=0 xu>=0|xu/yu,xl/yu|xl/yl,xu/yl| +-----------+-----------+-----------+ | xl>=0 |xu/yu,xl/yl|xl/yu,xu/yl| +-----------+-----------+-----------+
Definition at line 949 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::assign(), Parma_Polyhedra_Library::check_empty_arg(), Parma_Polyhedra_Library::combine(), Parma_Polyhedra_Library::Interval< Boundary, Info >::complete_init_internal(), Parma_Polyhedra_Library::div_restriction(), Parma_Polyhedra_Library::EMPTY, Parma_Polyhedra_Library::Interval_NS::f_info(), Parma_Polyhedra_Library::Interval_NS::f_lower(), Parma_Polyhedra_Library::f_OK(), Parma_Polyhedra_Library::Interval_NS::f_upper(), Parma_Polyhedra_Library::I_SINGULARITIES, Parma_Polyhedra_Library::Interval< Boundary, Info >::info(), Parma_Polyhedra_Library::is_infinity(), Parma_Polyhedra_Library::Interval< Boundary, Info >::lower(), MINUS_INFINITY, Parma_Polyhedra_Library::Interval< Boundary, Info >::OK(), PLUS_INFINITY, Parma_Polyhedra_Library::Interval< Boundary, Info >::set_infinities(), Parma_Polyhedra_Library::UNIVERSE, and Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
Referenced by Parma_Polyhedra_Library::operator/(), and Parma_Polyhedra_Library::Interval< Boundary, Info >::operator/=().
00949 { 00950 assert(f_OK(x)); 00951 assert(f_OK(y)); 00952 if (check_empty_arg(x) || check_empty_arg(y)) 00953 return assign(EMPTY); 00954 int yls = sgn_b(LOWER, f_lower(y), f_info(y)); 00955 int yus = yls > 0 ? 1 : sgn_b(UPPER, f_upper(y), f_info(y)); 00956 if (yls == 0 && yus == 0) 00957 return assign(EMPTY); 00958 int inf = Parma_Polyhedra_Library::is_infinity(x); 00959 if (inf) { 00960 if (Parma_Polyhedra_Library::is_infinity(y)) 00961 return assign(EMPTY); 00962 if (yls == -yus) 00963 return set_infinities(); 00964 if (yls < 0 || yus < 0) 00965 inf = -inf; 00966 if (inf < 0) 00967 return assign(MINUS_INFINITY); 00968 else 00969 return assign(PLUS_INFINITY); 00970 } 00971 int xls = sgn_b(LOWER, f_lower(x), f_info(x)); 00972 int xus = xls > 0 ? 1 : sgn_b(UPPER, f_upper(x), f_info(x)); 00973 00974 DIRTY_TEMP(To_Info, to_info); 00975 to_info.clear(); 00976 if (!div_restriction(to_info, x, y)) 00977 return assign(EMPTY); 00978 Result rl, ru; 00979 DIRTY_TEMP(To_Boundary, to_lower); 00980 if (yls >= 0) { 00981 if (xls >= 0) { 00982 rl = div_assign_z(LOWER, to_lower, to_info, 00983 LOWER, f_lower(x), f_info(x), xls, 00984 UPPER, f_upper(y), f_info(y), yus); 00985 ru = div_assign_z(UPPER, upper(), to_info, 00986 UPPER, f_upper(x), f_info(x), xus, 00987 LOWER, f_lower(y), f_info(y), yls); 00988 } 00989 else if (xus <= 0) { 00990 rl = div_assign_z(LOWER, to_lower, to_info, 00991 LOWER, f_lower(x), f_info(x), xls, 00992 LOWER, f_lower(y), f_info(y), yls); 00993 ru = div_assign_z(UPPER, upper(), to_info, 00994 UPPER, f_upper(x), f_info(x), xus, 00995 UPPER, f_upper(y), f_info(y), yus); 00996 } 00997 else { 00998 rl = div_assign_z(LOWER, to_lower, to_info, 00999 LOWER, f_lower(x), f_info(x), xls, 01000 LOWER, f_lower(y), f_info(y), yls); 01001 ru = div_assign_z(UPPER, upper(), to_info, 01002 UPPER, f_upper(x), f_info(x), xus, 01003 LOWER, f_lower(y), f_info(y), yls); 01004 } 01005 } 01006 else if (yus <= 0) { 01007 if (xls >= 0) { 01008 rl = div_assign_z(LOWER, to_lower, to_info, 01009 UPPER, f_upper(x), f_info(x), xus, 01010 UPPER, f_upper(y), f_info(y), yus); 01011 ru = div_assign_z(UPPER, upper(), to_info, 01012 LOWER, f_lower(x), f_info(x), xls, 01013 LOWER, f_lower(y), f_info(y), yls); 01014 } 01015 else if (xus <= 0) { 01016 rl = div_assign_z(LOWER, to_lower, to_info, 01017 UPPER, f_upper(x), f_info(x), xus, 01018 LOWER, f_lower(y), f_info(y), yls); 01019 ru = div_assign_z(UPPER, upper(), to_info, 01020 LOWER, f_lower(x), f_info(x), xls, 01021 UPPER, f_upper(y), f_info(y), yus); 01022 } 01023 else { 01024 rl = div_assign_z(LOWER, to_lower, to_info, 01025 UPPER, f_upper(x), f_info(x), xus, 01026 UPPER, f_upper(y), f_info(y), yus); 01027 ru = div_assign_z(UPPER, upper(), to_info, 01028 LOWER, f_lower(x), f_info(x), xls, 01029 UPPER, f_upper(y), f_info(y), yus); 01030 } 01031 } 01032 else { 01033 // FIXME: restrictions 01034 return static_cast<I_Result>(assign(UNIVERSE) | I_SINGULARITIES); 01035 } 01036 assign_or_swap(lower(), to_lower); 01037 assign_or_swap(info(), to_info); 01038 complete_init_internal(); 01039 assert(OK()); 01040 return combine(rl, ru); 01041 }
| Enable_If<Is_Interval<From>::value, void>::type Parma_Polyhedra_Library::Interval< Boundary, Info >::CC76_widening_assign | ( | const From & | y, | |
| Iterator | first, | |||
| Iterator | last | |||
| ) | [inline] |
| void swap | ( | Parma_Polyhedra_Library::Interval< Boundary, Info > & | x, | |
| Parma_Polyhedra_Library::Interval< Boundary, Info > & | y | |||
| ) | [related] |
Definition at line 1270 of file Interval.inlines.hh.
References Parma_Polyhedra_Library::Interval< Boundary, Info >::swap().
01271 { 01272 x.swap(y); 01273 }
Boundary Parma_Polyhedra_Library::Interval< Boundary, Info >::lower_ [private] |
Definition at line 903 of file Interval.defs.hh.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::lower().
Boundary Parma_Polyhedra_Library::Interval< Boundary, Info >::upper_ [private] |
Definition at line 904 of file Interval.defs.hh.
Referenced by Parma_Polyhedra_Library::Interval< Boundary, Info >::upper().
1.5.6