SMT-RAT  24.02
Toolbox for Strategic and Parallel Satisfiability-Modulo-Theories Solving
Bound.tpp
Go to the documentation of this file.
1 /**
2  * @file Bound.tpp
3  * @author Florian Corzilius <corzilius@cs.rwth-aachen.de>
4  * @since 2012-04-05
5  * @version 2014-10-01
6  */
7 
8 #pragma once
9 
10 #include "Bound.h"
11 
12 namespace smtrat
13 {
14  namespace lra
15  {
16  template<typename T1, typename T2>
17 #ifdef __VS
18  Bound<T1, T2>::Bound(const Value<T1>* const _limit, Variable<T1, T2>* const _var, Type _type, const FormulaT& _constraint, Info* _boundInfo, bool _deduced) :
19 #else
20  Bound<T1, T2>::Bound(const Value<T1>* const _limit, Variable<T1, T2>* const _var, Type _type, const FormulaT& _constraint, Bound<T1, T2>::Info* _boundInfo, bool _deduced) :
21 #endif
22  mDeduced( _deduced ),
23  mMarkedAsDeleted( false ),
24  mType( _type ),
25  mLimit( _limit ),
26  mVar( _var ),
27  mAsConstraint( _constraint ),
28  mpInfo( _boundInfo )
29  {
30  mpOrigins = std::shared_ptr<std::vector<FormulaT>>(new std::vector<FormulaT>());
31  if( _limit == NULL )
32  {
33  mpOrigins->push_back( FormulaT( carl::FormulaType::TRUE ) );
34  }
35  }
36 
37  template<typename T1, typename T2>
38  Bound<T1, T2>::~Bound()
39  {
40  delete mpInfo;
41  delete mLimit;
42  }
43 
44  template<typename T1, typename T2>
45  bool Bound<T1, T2>::operator <( const Bound& _bound ) const
46  {
47  assert( mType == EQUAL || _bound.type() == EQUAL || mType == _bound.type() );
48  if( mLimit == NULL && _bound.pLimit() == NULL )
49  {
50  return false;
51  }
52  else if( mLimit == NULL && _bound.pLimit() != NULL )
53  {
54  return mType == LOWER;
55  }
56  else if( mLimit != NULL && _bound.pLimit() == NULL )
57  {
58  return _bound.type() == UPPER;
59  }
60  else
61  {
62  if( (*mLimit) < _bound.limit() )
63  {
64  return true;
65  }
66  else if( (*mLimit) == _bound.limit() )
67  {
68  if( mType == LOWER && _bound.type() == EQUAL ) return true;
69  if( mType == EQUAL && _bound.type() == UPPER ) return true;
70  }
71  return false;
72  }
73  }
74 
75  template<typename T1, typename T2>
76  bool Bound<T1, T2>::operator >( const Bound& _bound ) const
77  {
78  if( mLimit == NULL && _bound.pLimit() == NULL )
79  {
80  return (mType == UPPER && _bound.type() == LOWER);
81  }
82  else if( mLimit == NULL && _bound.pLimit() != NULL )
83  {
84  return mType == UPPER;
85  }
86  else if( mLimit != NULL && _bound.pLimit() == NULL )
87  {
88  return _bound.type() == LOWER;
89  }
90  else
91  {
92  if( (*mLimit) > _bound.limit() )
93  {
94  return true;
95  }
96  else if( (*mLimit) == _bound.limit() )
97  {
98  if( mType != EQUAL && _bound.type() == EQUAL ) return true;
99  }
100  return false;
101  }
102  }
103 
104  template<typename T1, typename T2>
105  bool Bound<T1, T2>::operator <( const Value<T1>& _value ) const
106  {
107  if( mLimit == NULL && mType == UPPER )
108  {
109  return false;
110  }
111  else if( mLimit == NULL && mType == LOWER )
112  {
113  return true;
114  }
115  else
116  {
117  return (*mLimit) < _value;
118  }
119  }
120 
121  template<typename T1, typename T2>
122  bool Bound<T1, T2>::operator >( const Value<T1>& _value ) const
123  {
124  if( mLimit == NULL && mType == UPPER )
125  {
126  return true;
127  }
128  else if( mLimit == NULL && mType == LOWER )
129  {
130  return false;
131  }
132  else
133  {
134  return (*mLimit) > _value;
135  }
136  }
137 
138  template<typename T1, typename T2>
139  bool Bound<T1, T2>::operator ==( const Value<T1>& _value ) const
140  {
141  if( mLimit == NULL )
142  {
143  return false;
144  }
145  return (*mLimit) == _value;
146  }
147 
148  template<typename T1, typename T2>
149  bool Bound<T1, T2>::operator ==( const T1& _a ) const
150  {
151  return mLimit != NULL && (*mLimit) == _a;
152  }
153 
154  template<typename T1, typename T2>
155  bool Bound<T1, T2>::operator >( const T1& _a ) const
156  {
157  if( mLimit == NULL )
158  return mType == UPPER;
159  return (*mLimit) > _a;
160  }
161 
162  template<typename T1, typename T2>
163  bool Bound<T1, T2>::operator <( const T1& _a ) const
164  {
165  if( mLimit == NULL )
166  return mType == LOWER;
167  return (*mLimit) < _a;
168  }
169 
170  template<typename T1, typename T2>
171  bool Bound<T1, T2>::operator >=( const T1& _a ) const
172  {
173  if( mLimit == NULL )
174  return mType == UPPER;
175  return (*mLimit) >= _a;
176  }
177 
178  template<typename T1, typename T2>
179  bool Bound<T1, T2>::operator <=( const T1& _a ) const
180  {
181  if( mLimit == NULL )
182  return mType == LOWER;
183  return (*mLimit) <= _a;
184  }
185 
186  template<typename T1, typename T2>
187  const std::string Bound<T1, T2>::toString() const
188  {
189  if( mLimit == NULL && mType == UPPER )
190  {
191  return "oo";
192  }
193  else if( mLimit == NULL && mType == LOWER )
194  {
195  return "-oo";
196  }
197  else
198  {
199  return limit().toString();
200  }
201  }
202 
203  template<typename T3, typename T4>
204  std::ostream& operator <<( std::ostream& _ostream, const Bound<T3, T4>& _bound )
205  {
206  _bound.print( false, _ostream, false );
207  return _ostream;
208  }
209 
210  template<typename T1, typename T2>
211  void Bound<T1, T2>::print( bool _withOrigins, std::ostream& _out, bool _printType ) const
212  {
213  if( _printType )
214  {
215  if( mType == UPPER )
216  {
217  _out << "<=";
218  }
219  else if( mType == LOWER )
220  {
221  _out << ">=";
222  }
223  else
224  {
225  _out << "==";
226  }
227  }
228  if( mLimit == NULL && mType == UPPER )
229  {
230  _out << "inf";
231  }
232  else if( mLimit == NULL && mType == LOWER )
233  {
234  _out << "-inf";
235  }
236  else
237  {
238  limit().print();
239  if( _withOrigins )
240  _out << " from " << mAsConstraint;
241  if( _withOrigins )
242  _out << " [" << mpInfo->neqRepresentation << "]";
243  }
244  if( mDeduced ) _out << " (deduced) ";
245  if( _withOrigins )
246  {
247  _out << " ( ";
248  for( auto origin = origins().begin(); origin != origins().end(); ++origin )
249  {
250  _out << *origin << " ";
251  }
252  _out << ")";
253  }
254  }
255 
256  } // end namspace lra
257 } // end namspace smtrat