Scippy

SoPlex

Sequential object-oriented simPlex

solbase.h
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the class library */
4 /* SoPlex --- the Sequential object-oriented simPlex. */
5 /* */
6 /* Copyright (c) 1996-2023 Zuse Institute Berlin (ZIB) */
7 /* */
8 /* Licensed under the Apache License, Version 2.0 (the "License"); */
9 /* you may not use this file except in compliance with the License. */
10 /* You may obtain a copy of the License at */
11 /* */
12 /* http://www.apache.org/licenses/LICENSE-2.0 */
13 /* */
14 /* Unless required by applicable law or agreed to in writing, software */
15 /* distributed under the License is distributed on an "AS IS" BASIS, */
16 /* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
17 /* See the License for the specific language governing permissions and */
18 /* limitations under the License. */
19 /* */
20 /* You should have received a copy of the Apache-2.0 license */
21 /* along with SoPlex; see the file LICENSE. If not email to soplex@zib.de. */
22 /* */
23 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
24 
25 /**@file solbase.h
26  * @brief Class for storing a primal-dual solution with basis information
27  */
28 #ifndef _SOLBASE_H_
29 #define _SOLBASE_H_
30 
31 /* undefine SOPLEX_DEBUG flag from including files; if SOPLEX_DEBUG should be defined in this file, do so below */
32 #ifdef SOPLEX_DEBUG
33 #define SOPLEX_DEBUG_SOLBASE
34 #undef SOPLEX_DEBUG
35 #endif
36 
37 #include <assert.h>
38 #include <string.h>
39 #include <math.h>
40 #include <iostream>
41 
42 #include "soplex/basevectors.h"
43 #include "soplex/spxsolver.h" // needed for basis information
44 
45 namespace soplex
46 {
47 /**@class SolBase
48  * @brief Class for storing a primal-dual solution with basis information
49  * @ingroup Algo
50  */
51 template <class R>
52 class SolBase
53 {
54  template <class T> friend class SoPlexBase;
55  // Why do we need the following? This is at least used in the operator=
56  // When Rational solution needs to be copied into Real, the private member
57  // _objVal is accessed.
58  template <class S> friend class SolBase;
59 
60 public:
61  /// is the stored solution primal feasible?
62  bool isPrimalFeasible() const
63  {
64  return _isPrimalFeasible;
65  }
66 
67  /// gets the primal solution vector; returns true on success
68  bool getPrimalSol(VectorBase<R>& vector) const
69  {
70  vector = _primal;
71 
72  return _isPrimalFeasible;
73  }
74 
75  /// gets the vector of slack values; returns true on success
76  bool getSlacks(VectorBase<R>& vector) const
77  {
78  vector = _slacks;
79 
80  return _isPrimalFeasible;
81  }
82 
83  /// is a primal unbounded ray available?
84  bool hasPrimalRay() const
85  {
86  return _hasPrimalRay;
87  }
88 
89  /// gets the primal unbounded ray if available; returns true on success
90  bool getPrimalRaySol(VectorBase<R>& vector) const
91  {
92  if(_hasPrimalRay)
93  vector = _primalRay;
94 
95  return _hasPrimalRay;
96  }
97 
98  /// is a dual solution available?
99  bool isDualFeasible() const
100  {
101  return _isDualFeasible;
102  }
103 
104  /// gets the dual solution vector; returns true on success
105  bool getDualSol(VectorBase<R>& vector) const
106  {
107  vector = _dual;
108 
109  return _isDualFeasible;
110  }
111 
112  /// gets the vector of reduced cost values if available; returns true on success
113  bool getRedCostSol(VectorBase<R>& vector) const
114  {
115  vector = _redCost;
116 
117  return _isDualFeasible;
118  }
119 
120  /// is a dual farkas ray available?
121  bool hasDualFarkas() const
122  {
123  return _hasDualFarkas;
124  }
125 
126  /// gets the Farkas proof if available; returns true on success
127  bool getDualFarkasSol(VectorBase<R>& vector) const
128  {
129  if(_hasDualFarkas)
130  vector = _dualFarkas;
131 
132  return _hasDualFarkas;
133  }
134 
135  /// returns total size of primal solution
136  int totalSizePrimal(const int base = 2) const
137  {
138  int size = 0;
139 
141  size += totalSizeRational(_primal.get_const_ptr(), _primal.dim(), base);
142 
143  if(_hasPrimalRay)
144  size += totalSizeRational(_primalRay.get_const_ptr(), _primalRay.dim(), base);
145 
146  return size;
147  }
148 
149  /// returns total size of dual solution
150  int totalSizeDual(const int base = 2) const
151  {
152  int size = 0;
153 
154  if(_isDualFeasible)
155  size += totalSizeRational(_dual.get_const_ptr(), _dual.dim(), base);
156 
157  if(_hasDualFarkas)
158  size += totalSizeRational(_dualFarkas.get_const_ptr(), _dualFarkas.dim(), base);
159 
160  return size;
161  }
162 
163  /// returns size of least common multiple of denominators in primal solution
164  int dlcmSizePrimal(const int base = 2) const
165  {
166  int size = 0;
167 
169  size += dlcmSizeRational(_primal.get_const_ptr(), _primal.dim(), base);
170 
171  if(_hasPrimalRay)
172  size += dlcmSizeRational(_primalRay.get_const_ptr(), _primalRay.dim(), base);
173 
174  return size;
175  }
176 
177  /// returns size of least common multiple of denominators in dual solution
178  int dlcmSizeDual(const int base = 2) const
179  {
180  int size = 0;
181 
182  if(_isDualFeasible)
183  size += dlcmSizeRational(_dual.get_const_ptr(), _dual.dim(), base);
184 
185  if(_hasDualFarkas)
186  size += dlcmSizeRational(_dualFarkas.get_const_ptr(), _dualFarkas.dim(), base);
187 
188  return size;
189  }
190 
191  /// returns size of largest denominator in primal solution
192  int dmaxSizePrimal(const int base = 2) const
193  {
194  int size = 0;
195 
197  size += dmaxSizeRational(_primal.get_const_ptr(), _primal.dim(), base);
198 
199  if(_hasPrimalRay)
200  size += dmaxSizeRational(_primalRay.get_const_ptr(), _primalRay.dim(), base);
201 
202  return size;
203  }
204 
205  /// returns size of largest denominator in dual solution
206  int dmaxSizeDual(const int base = 2) const
207  {
208  int size = 0;
209 
210  if(_isDualFeasible)
211  size += dmaxSizeRational(_dual.get_const_ptr(), _dual.dim(), base);
212 
213  if(_hasDualFarkas)
214  size += dmaxSizeRational(_dualFarkas.get_const_ptr(), _dualFarkas.dim(), base);
215 
216  return size;
217  }
218 
219  /// invalidate solution
220  void invalidate()
221  {
222  _isPrimalFeasible = false;
223  _hasPrimalRay = false;
224  _isDualFeasible = false;
225  _hasDualFarkas = false;
226  }
227 
228 private:
235 
237 
238  unsigned int _isPrimalFeasible: 1;
239  unsigned int _hasPrimalRay: 1;
240  unsigned int _isDualFeasible: 1;
241  unsigned int _hasDualFarkas: 1;
242 
243  /// default constructor only for friends
245  : _objVal(0)
246  {
247  invalidate();
248  }
249 
250  /// assignment operator only for friends
252  {
253  if(this != &sol)
254  {
255 
257  _primal = sol._primal;
258  _slacks = sol._slacks;
259  _objVal = sol._objVal;
260 
262 
263  if(_hasPrimalRay)
264  _primalRay = sol._primalRay;
265 
267  _dual = sol._dual;
268  _redCost = sol._redCost;
269 
271 
272  if(_hasDualFarkas)
273  _dualFarkas = sol._dualFarkas;
274  }
275 
276  return *this;
277  }
278 
279  /// assignment operator only for friends
280  template <class S>
282  {
283  if((SolBase<S>*)this != &sol)
284  {
285 
287  _primal = sol._primal;
288  _slacks = sol._slacks;
289 
290  _objVal = R(sol._objVal);
291 
293 
294  if(_hasPrimalRay)
295  _primalRay = sol._primalRay;
296 
298  _dual = sol._dual;
299  _redCost = sol._redCost;
300 
302 
303  if(_hasDualFarkas)
304  _dualFarkas = sol._dualFarkas;
305  }
306 
307  return *this;
308  }
309 
310 };
311 } // namespace soplex
312 
313 /* reset the SOPLEX_DEBUG flag to its original value */
314 #undef SOPLEX_DEBUG
315 #ifdef SOPLEX_DEBUG_SOLBASE
316 #define SOPLEX_DEBUG
317 #undef SOPLEX_DEBUG_SOLBASE
318 #endif
319 
320 #endif // _SOLBASE_H_
int totalSizeDual(const int base=2) const
returns total size of dual solution
Definition: solbase.h:150
bool getPrimalSol(VectorBase< R > &vector) const
gets the primal solution vector; returns true on success
Definition: solbase.h:68
Dense vector.Class VectorBase provides dense linear algebra vectors. Internally, VectorBase wraps std...
Definition: dsvectorbase.h:37
VectorBase< R > _redCost
Definition: solbase.h:233
VectorBase< R > _slacks
Definition: solbase.h:230
int totalSizePrimal(const int base=2) const
returns total size of primal solution
Definition: solbase.h:136
SolBase()
default constructor only for friends
Definition: solbase.h:244
bool getSlacks(VectorBase< R > &vector) const
gets the vector of slack values; returns true on success
Definition: solbase.h:76
VectorBase< R > _dualFarkas
Definition: solbase.h:234
bool getRedCostSol(VectorBase< R > &vector) const
gets the vector of reduced cost values if available; returns true on success
Definition: solbase.h:113
SolBase< R > & operator=(const SolBase< R > &sol)
assignment operator only for friends
Definition: solbase.h:251
bool hasDualFarkas() const
is a dual farkas ray available?
Definition: solbase.h:121
unsigned int _hasPrimalRay
Definition: solbase.h:239
bool getDualSol(VectorBase< R > &vector) const
gets the dual solution vector; returns true on success
Definition: solbase.h:105
VectorBase< R > _primalRay
Definition: solbase.h:231
int dlcmSizeDual(const int base=2) const
returns size of least common multiple of denominators in dual solution
Definition: solbase.h:178
unsigned int _hasDualFarkas
Definition: solbase.h:241
SolBase< R > & operator=(const SolBase< S > &sol)
assignment operator only for friends
Definition: solbase.h:281
bool getPrimalRaySol(VectorBase< R > &vector) const
gets the primal unbounded ray if available; returns true on success
Definition: solbase.h:90
main LP solver class
bool isPrimalFeasible() const
is the stored solution primal feasible?
Definition: solbase.h:62
VectorBase< R > _dual
Definition: solbase.h:232
Class for storing a primal-dual solution with basis information.
Definition: solbase.h:52
int dmaxSizeDual(const int base=2) const
returns size of largest denominator in dual solution
Definition: solbase.h:206
bool isDualFeasible() const
is a dual solution available?
Definition: solbase.h:99
int dlcmSizePrimal(const int base=2) const
returns size of least common multiple of denominators in primal solution
Definition: solbase.h:164
Collection of dense, sparse, and semi-sparse vectors.
Everything should be within this namespace.
bool getDualFarkasSol(VectorBase< R > &vector) const
gets the Farkas proof if available; returns true on success
Definition: solbase.h:127
int totalSizeRational(const Rational *vector, const int length, const int base)
Total size of rational vector.
Definition: rational.h:1012
int dmaxSizePrimal(const int base=2) const
returns size of largest denominator in primal solution
Definition: solbase.h:192
unsigned int _isPrimalFeasible
Definition: solbase.h:238
void invalidate()
invalidate solution
Definition: solbase.h:220
bool hasPrimalRay() const
is a primal unbounded ray available?
Definition: solbase.h:84
unsigned int _isDualFeasible
Definition: solbase.h:240
int dmaxSizeRational(const Rational *vector, const int length, const int base)
Size of largest denominator in rational vector.
Definition: rational.h:1049
int dlcmSizeRational(const Rational *vector, const int length, const int base)
Size of least common multiple of denominators in rational vector.
Definition: rational.h:1027
VectorBase< R > _primal
Definition: solbase.h:229