SMT-RAT  24.02
Toolbox for Strategic and Parallel Satisfiability-Modulo-Theories Solving
Value.tpp
Go to the documentation of this file.
1 /**
2  * @file Value.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 "Value.h"
11 
12 namespace smtrat
13 {
14  namespace lra
15  {
16  template<class T>
17  Value<T>::Value():
18  mMainPart( 0 ),
19  mDeltaPart( 0 )
20  {}
21 
22  template<class T>
23  Value<T>::Value( const T& _num ):
24  mMainPart( _num ),
25  mDeltaPart( 0 )
26  {}
27 
28  template<class T>
29  Value<T>::Value( const T& _num1, const T& _num2 ):
30  mMainPart( _num1 ),
31  mDeltaPart( _num2 )
32  {}
33 
34  template<class T>
35  Value<T>::Value( const Value<T>& _orig ):
36  mMainPart( _orig.mainPart() ),
37  mDeltaPart( _orig.deltaPart() )
38  {}
39 
40  template<class T>
41  Value<T>::~Value(){}
42 
43  template<class T>
44  Value<T>& Value<T>::operator=( const Value<T>& _value )
45  {
46  mMainPart = _value.mainPart();
47  mDeltaPart = _value.deltaPart();
48  return *this;
49  }
50 
51  template<class T>
52  Value<T> Value<T>::operator +( const Value<T>& _value ) const
53  {
54  T num1 = mMainPart + _value.mainPart();
55  T num2 = mDeltaPart + _value.deltaPart();
56  return Value( num1, num2 );
57  }
58 
59  template<class T>
60  void Value<T>::operator +=( const Value<T>& _value )
61  {
62  mMainPart += _value.mainPart();
63  mDeltaPart += _value.deltaPart();
64  }
65 
66  template<class T>
67  Value<T> Value<T>::operator -( const Value<T>& _value ) const
68  {
69  T num1 = mMainPart - _value.mainPart();
70  T num2 = mDeltaPart - _value.deltaPart();
71  return Value( num1, num2 );
72  }
73 
74  template<class T>
75  void Value<T>::operator -=( const Value<T>& _value )
76  {
77  mMainPart -= _value.mainPart();
78  mDeltaPart -= _value.deltaPart();
79  }
80 
81  template<class T>
82  Value<T> Value<T>::operator *( const T& a ) const
83  {
84  T num1 = a * mMainPart;
85  T num2 = a * mDeltaPart;
86  return Value( num1, num2 );
87  }
88 
89  template<class T>
90  Value<T> Value<T>::operator *( const Value<T>& _value ) const
91  {
92  T num1 = _value.mainPart() * mMainPart;
93  T num2 = _value.deltaPart() * mDeltaPart;
94  return Value( num1, num2 );
95  }
96 
97  template<class T>
98  void Value<T>::operator *=( const Value<T>& _value )
99  {
100  mMainPart *= _value.mainPart();
101  mDeltaPart *= _value.deltaPart();
102  }
103 
104  template<class T>
105  void Value<T>::operator *=( const T& _a )
106  {
107  mMainPart *= _a;
108  mDeltaPart *= _a;
109  }
110 
111  template<class T>
112  Value<T> Value<T>::operator /( const T& _a ) const
113  {
114  T num1 = T( mMainPart ) / _a;
115  T num2 = T( mDeltaPart ) / _a;
116  return Value( num1, num2 );
117  }
118 
119  template<class T>
120  void Value<T>::operator /=( const T& _a )
121  {
122  mMainPart /= _a;
123  mDeltaPart /= _a;
124  }
125 
126  template<class T>
127  bool Value<T>::operator <( const Value<T>& _value ) const
128  {
129  if( mMainPart < _value.mainPart() )
130  {
131  return true;
132  }
133  else if( mMainPart == _value.mainPart() )
134  {
135  if( mDeltaPart < _value.deltaPart() )
136  {
137  return true;
138  }
139  }
140  return false;
141  }
142 
143  template<class T>
144  bool Value<T>::operator <=( const Value<T>& _value ) const
145  {
146  bool b = false;
147  if( (mMainPart < _value.mainPart()) || (mMainPart == _value.mainPart() && mDeltaPart <= _value.deltaPart()) )
148  b = true;
149  return b;
150  }
151 
152  template<class T>
153  bool Value<T>::operator ==( const Value<T>& _value ) const
154  {
155  bool b = false;
156  if( (mMainPart == _value.mainPart()) && (mDeltaPart == _value.deltaPart()) )
157  b = true;
158  return b;
159  }
160 
161  template<class T>
162  bool Value<T>::operator ==( const T& _a ) const
163  {
164  return (mMainPart == _a && mDeltaPart == 0 );
165  }
166 
167  template<class T>
168  bool Value<T>::operator <( const T& _a ) const
169  {
170  return (mMainPart < _a || (mMainPart == _a && mDeltaPart < 0 ));
171  }
172 
173  template<class T>
174  bool Value<T>::operator >( const T& _a ) const
175  {
176  return (mMainPart > _a || (mMainPart == _a && mDeltaPart > 0 ));
177  }
178 
179  template<class T>
180  bool Value<T>::operator <=( const T& _a ) const
181  {
182  return (mMainPart < _a || (mMainPart == _a && mDeltaPart <= 0 ));
183  }
184 
185  template<class T>
186  bool Value<T>::operator >=( const T& _a ) const
187  {
188  return (mMainPart > _a || (mMainPart == _a && mDeltaPart >= 0 ));
189  }
190 
191  template<class T>
192  const std::string Value<T>::toString() const
193  {
194  std::stringstream out;
195  out << *this;
196  return out.str();
197  }
198 
199  template<class T1>
200  std::ostream& operator<<( std::ostream& _out, const Value<T1>& _value )
201  {
202  return _out << _value.mainPart() << "+d*" << _value.deltaPart();
203  }
204 
205  template<class T>
206  void Value<T>::print( std::ostream& _out ) const
207  {
208  _out << "( " << mMainPart;
209  _out << " + d * " << mDeltaPart << " )";
210  }
211 
212  /**
213  * Computes the sign: 0 if main & delta part are unequal 0. Else +/- 1 determined by the sign of main part (if set) else delta part.
214  */
215  template<class T>
216  T Value<T>::sign() const{
217  if(this < 0){
218  return T(-1);
219  }
220  else if(this > 0){
221  return T(1);
222  }
223  else{
224  return T(0);
225  }
226  }
227  } // end namspace lra
228 } // end namspace smtrat
229