Scippy

SoPlex

Sequential object-oriented simPlex

soplex.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-2017 Konrad-Zuse-Zentrum */
7 /* fuer Informationstechnik Berlin */
8 /* */
9 /* SoPlex is distributed under the terms of the ZIB Academic Licence. */
10 /* */
11 /* You should have received a copy of the ZIB Academic License */
12 /* along with SoPlex; see the file COPYING. If not email to soplex@zib.de. */
13 /* */
14 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
15 
16 /**@file soplex.h
17  * @brief Preconfigured SoPlex LP solver
18  */
19 
20 #ifndef _SOPLEX_H_
21 #define _SOPLEX_H_
22 
23 #ifndef SOPLEX_LEGACY
24 #include <string.h>
25 
26 ///@todo SoPlex should also have an spxout object to avoid using a global one
27 #include "spxdefines.h"
28 #include "basevectors.h"
29 #include "spxsolver.h"
30 #include "slufactor.h"
31 #include "slufactor_rational.h"
32 
33 ///@todo try to move to cpp file by forward declaration
34 #include "spxsimplifier.h"
35 #include "spxmainsm.h"
36 
37 #include "spxscaler.h"
38 #include "spxequilisc.h"
39 #include "spxleastsqsc.h"
40 #include "spxgeometsc.h"
41 
42 #include "spxstarter.h"
43 #include "spxweightst.h"
44 #include "spxsumst.h"
45 #include "spxvectorst.h"
46 
47 #include "spxpricer.h"
48 #include "spxautopr.h"
49 #include "spxdantzigpr.h"
50 #include "spxparmultpr.h"
51 #include "spxdevexpr.h"
52 #include "spxsteeppr.h"
53 #include "spxsteepexpr.h"
54 #include "spxhybridpr.h"
55 
56 #include "spxratiotester.h"
57 #include "spxdefaultrt.h"
58 #include "spxharrisrt.h"
59 #include "spxfastrt.h"
60 #include "spxboundflippingrt.h"
61 
62 #include "sol.h"
63 
64 #define DEFAULT_RANDOM_SEED 0 // used to suppress output when the seed was not changed
65 
66 ///@todo implement automatic rep switch, based on row/col dim
67 ///@todo introduce status codes for SoPlex, especially for rational solving
68 
69 ///@todo record and return "best" solutions found during IR (Ambros)
70 ///@todo implement main IR loop for primal and dual feasible case with fail otherwise (Ambros)
71 ///@todo implement statistical info (time, factor time, iters, ...) since last call to solveReal() or solveRational() (Ambros?)
72 ///@todo implement performInfeasibilityIR (Ambros?)
73 ///@todo extend IR loop to infeasible case (Dan?)
74 ///@todo extend IR loop to unbounded case (Dan?)
75 
76 ///@todo interface rational reconstruction code for rational vectors
77 ///@todo integrate rational reconstruction into IR loop
78 ///@todo templatize SPxSolver and necessary components (SLUFactor, pricer, ratiotester)
79 ///@todo integrate rational SPxSolver and distinguish between original and transformed rational LP
80 ///@todo rational scalers
81 ///@todo rational simplifier
82 
83 namespace soplex
84 {
85 
86 /**@class SoPlex
87  * @brief Preconfigured SoPlex LP-solver.
88  * @ingroup Algo
89  */
90 class SoPlex
91 {
92 public:
93 
94  //**@name Construction and destruction */
95  //@{
96 
97  /// default constructor
98  SoPlex();
99 
100  /// assignment operator
101  SoPlex& operator=(const SoPlex& rhs);
102 
103  /// copy constructor
104  SoPlex(const SoPlex& rhs);
105 
106  /// destructor
107  virtual ~SoPlex();
108 
109  //@}
110 
111 
112  //**@name Access to the real LP */
113  //@{
114 
115  /// returns number of rows
116  int numRowsReal() const;
117 
118  /// returns number of columns
119  int numColsReal() const;
120 
121  /// returns number of nonzeros
122  int numNonzerosReal() const;
123 
124  /// returns smallest non-zero element in absolute value
125  Real minAbsNonzeroReal() const;
126 
127  /// returns biggest non-zero element in absolute value
128  Real maxAbsNonzeroReal() const;
129 
130  /// returns (unscaled) coefficient
131  Real coefReal(int row, int col) const;
132 
133  /// returns vector of row \p i, ignoring scaling
134  const SVectorReal& rowVectorRealInternal(int i) const;
135 
136  /// gets vector of row \p i
137  void getRowVectorReal(int i, DSVectorReal& row) const;
138 
139  /// returns right-hand side vector, ignoring scaling
140  const VectorReal& rhsRealInternal() const;
141 
142  /// gets right-hand side vector
143  void getRhsReal(DVectorReal& rhs) const;
144 
145  /// returns right-hand side of row \p i
146  Real rhsReal(int i) const;
147 
148  /// returns left-hand side vector, ignoring scaling
149  const VectorReal& lhsRealInternal() const;
150 
151  /// gets left-hand side vector
152  void getLhsReal(DVectorReal& lhs) const;
153 
154  /// returns left-hand side of row \p i
155  Real lhsReal(int i) const;
156 
157  /// returns inequality type of row \p i
158  LPRowReal::Type rowTypeReal(int i) const;
159 
160  /// returns vector of col \p i, ignoring scaling
161  const SVectorReal& colVectorRealInternal(int i) const;
162 
163  /// gets vector of col \p i
164  void getColVectorReal(int i, DSVectorReal& col) const;
165 
166  /// returns upper bound vector
167  const VectorReal& upperRealInternal() const;
168 
169  /// returns upper bound of column \p i
170  Real upperReal(int i) const;
171 
172  /// gets upper bound vector
173  void getUpperReal(DVectorReal& upper) const;
174 
175  /// returns lower bound vector
176  const VectorReal& lowerRealInternal() const;
177 
178  /// returns lower bound of column \p i
179  Real lowerReal(int i) const;
180 
181  /// gets lower bound vector
182  void getLowerReal(DVectorReal& lower) const;
183 
184  /// gets objective function vector
185  void getObjReal(VectorReal& obj) const;
186 
187  /// returns objective value of column \p i
188  Real objReal(int i) const;
189 
190  /// returns objective function vector after transformation to a maximization problem; since this is how it is stored
191  /// internally, this is generally faster
192  const VectorReal& maxObjRealInternal() const;
193 
194  /// returns objective value of column \p i after transformation to a maximization problem; since this is how it is
195  /// stored internally, this is generally faster
196  Real maxObjReal(int i) const;
197 
198  /// gets number of available dual norms
199  void getNdualNorms(int& nnormsRow, int& nnormsCol) const;
200 
201  /// gets steepest edge norms and returns false if they are not available
202  bool getDualNorms(int& nnormsRow, int& nnormsCol, Real* norms) const;
203 
204  /// sets steepest edge norms and returns false if that's not possible
205  bool setDualNorms(int nnormsRow, int nnormsCol, Real* norms);
206 
207  /// pass integrality information about the variables to the solver
208  void setIntegralityInformation(int ncols, int* intInfo);
209 
210  //@}
211 
212 
213  //**@name Access to the rational LP */
214  //@{
215 
216  /// returns number of rows
217  int numRowsRational() const;
218 
219  /// returns number of columns
220  int numColsRational() const;
221 
222  /// returns number of nonzeros
223  int numNonzerosRational() const;
224 
225  /// returns smallest non-zero element in absolute value
227 
228  /// returns biggest non-zero element in absolute value
230 
231  /// gets row \p i
232  void getRowRational(int i, LPRowRational& lprow) const;
233 
234  /// gets rows \p start, ..., \p end.
235  void getRowsRational(int start, int end, LPRowSetRational& lprowset) const;
236 
237  /// returns vector of row \p i
238  const SVectorRational& rowVectorRational(int i) const;
239 
240  /// returns right-hand side vector
241  const VectorRational& rhsRational() const;
242 
243  /// returns right-hand side of row \p i
244  const Rational& rhsRational(int i) const;
245 
246  /// returns left-hand side vector
247  const VectorRational& lhsRational() const;
248 
249  /// returns left-hand side of row \p i
250  const Rational& lhsRational(int i) const;
251 
252  /// returns inequality type of row \p i
254 
255  /// gets column \p i
256  void getColRational(int i, LPColRational& lpcol) const;
257 
258  /// gets columns \p start, ..., \p end
259  void getColsRational(int start, int end, LPColSetRational& lpcolset) const;
260 
261  /// returns vector of column \p i
262  const SVectorRational& colVectorRational(int i) const;
263 
264  /// returns upper bound vector
265  const VectorRational& upperRational() const;
266 
267  /// returns upper bound of column \p i
268  const Rational& upperRational(int i) const;
269 
270  /// returns lower bound vector
271  const VectorRational& lowerRational() const;
272 
273  /// returns lower bound of column \p i
274  const Rational& lowerRational(int i) const;
275 
276  /// gets objective function vector
277  void getObjRational(VectorRational& obj) const;
278 
279  /// gets objective value of column \p i
280  void getObjRational(int i, Rational& obj) const;
281 
282  /// returns objective value of column \p i
283  Rational objRational(int i) const;
284 
285  /// returns objective function vector after transformation to a maximization problem; since this is how it is stored
286  /// internally, this is generally faster
287  const VectorRational& maxObjRational() const;
288 
289  /// returns objective value of column \p i after transformation to a maximization problem; since this is how it is
290  /// stored internally, this is generally faster
291  const Rational& maxObjRational(int i) const;
292 
293  //@}
294 
295 
296  //**@name Modification of the real LP */
297  //@{
298 
299  /// adds a single row
300  void addRowReal(const LPRowReal& lprow);
301 
302  /// adds multiple rows
303  void addRowsReal(const LPRowSetReal& lprowset);
304 
305  /// adds a single column
306  void addColReal(const LPCol& lpcol);
307 
308  /// adds multiple columns
309  void addColsReal(const LPColSetReal& lpcolset);
310 
311  /// replaces row \p i with \p lprow
312  void changeRowReal(int i, const LPRowReal& lprow);
313 
314  /// changes left-hand side vector for constraints to \p lhs
315  void changeLhsReal(const VectorReal& lhs);
316 
317  /// changes left-hand side of row \p i to \p lhs
318  void changeLhsReal(int i, const Real& lhs);
319 
320  /// changes right-hand side vector to \p rhs
321  void changeRhsReal(const VectorReal& rhs);
322 
323  /// changes right-hand side of row \p i to \p rhs
324  void changeRhsReal(int i, const Real& rhs);
325 
326  /// changes left- and right-hand side vectors
327  void changeRangeReal(const VectorReal& lhs, const VectorReal& rhs);
328 
329  /// changes left- and right-hand side of row \p i
330  void changeRangeReal(int i, const Real& lhs, const Real& rhs);
331 
332  /// replaces column \p i with \p lpcol
333  void changeColReal(int i, const LPColReal& lpcol);
334 
335  /// changes vector of lower bounds to \p lower
336  void changeLowerReal(const VectorReal& lower);
337 
338  /// changes lower bound of column i to \p lower
339  void changeLowerReal(int i, const Real& lower);
340 
341  /// changes vector of upper bounds to \p upper
342  void changeUpperReal(const VectorReal& upper);
343 
344  /// changes \p i 'th upper bound to \p upper
345  void changeUpperReal(int i, const Real& upper);
346 
347  /// changes vectors of column bounds to \p lower and \p upper
348  void changeBoundsReal(const VectorReal& lower, const VectorReal& upper);
349 
350  /// changes bounds of column \p i to \p lower and \p upper
351  void changeBoundsReal(int i, const Real& lower, const Real& upper);
352 
353  /// changes objective function vector to \p obj
354  void changeObjReal(const VectorReal& obj);
355 
356  /// changes objective coefficient of column i to \p obj
357  void changeObjReal(int i, const Real& obj);
358 
359  /// changes matrix entry in row \p i and column \p j to \p val
360  void changeElementReal(int i, int j, const Real& val);
361 
362  /// removes row \p i
363  void removeRowReal(int i);
364 
365  /// removes all rows with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
366  /// new index where row \p i has been moved to; note that \p perm must point to an array of size at least
367  /// #numRowsReal()
368  void removeRowsReal(int perm[]);
369 
370  /// remove all rows with indices in array \p idx of size \p n; an array \p perm of size #numRowsReal() may be passed
371  /// as buffer memory
372  void removeRowsReal(int idx[], int n, int perm[] = 0);
373 
374  /// removes rows \p start to \p end including both; an array \p perm of size #numRowsReal() may be passed as buffer
375  /// memory
376  void removeRowRangeReal(int start, int end, int perm[] = 0);
377 
378  /// removes column i
379  void removeColReal(int i);
380 
381  /// removes all columns with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
382  /// new index where column \p i has been moved to; note that \p perm must point to an array of size at least
383  /// #numColsReal()
384  void removeColsReal(int perm[]);
385 
386  /// remove all columns with indices in array \p idx of size \p n; an array \p perm of size #numColsReal() may be
387  /// passed as buffer memory
388  void removeColsReal(int idx[], int n, int perm[] = 0);
389 
390  /// removes columns \p start to \p end including both; an array \p perm of size #numColsReal() may be passed as
391  /// buffer memory
392  void removeColRangeReal(int start, int end, int perm[] = 0);
393 
394  /// clears the LP
395  void clearLPReal();
396 
397  /// synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP, if sync mode is manual
398  void syncLPReal();
399 
400  //@}
401 
402 
403  //**@name Modification of the rational LP */
404  //@{
405 
406  /// adds a single row
407  void addRowRational(const LPRowRational& lprow);
408 
409 #ifdef SOPLEX_WITH_GMP
410  /// adds a single row
411  void addRowRational(const mpq_t* lhs, const mpq_t* rowValues, const int* rowIndices, const int rowSize, const mpq_t* rhs);
412 
413  /// adds a set of rows
414  void addRowsRational(const mpq_t* lhs, const mpq_t* rowValues, const int* rowIndices, const int* rowStarts, const int* rowLengths, const int numRows, const int numValues, const mpq_t* rhs);
415 #endif
416 
417  /// adds multiple rows
418  void addRowsRational(const LPRowSetRational& lprowset);
419 
420  /// adds a single column
421  void addColRational(const LPColRational& lpcol);
422 
423 #ifdef SOPLEX_WITH_GMP
424  /// adds a single column
425  void addColRational(const mpq_t* obj, const mpq_t* lower, const mpq_t* colValues, const int* colIndices, const int colSize, const mpq_t* upper);
426 
427  /// adds a set of columns
428  void addColsRational(const mpq_t* obj, const mpq_t* lower, const mpq_t* colValues, const int* colIndices, const int* colStarts, const int* colLengths, const int numCols, const int numValues, const mpq_t* upper);
429 #endif
430 
431  /// adds multiple columns
432  void addColsRational(const LPColSetRational& lpcolset);
433 
434  /// replaces row \p i with \p lprow
435  void changeRowRational(int i, const LPRowRational& lprow);
436 
437  /// changes left-hand side vector for constraints to \p lhs
438  void changeLhsRational(const VectorRational& lhs);
439 
440  /// changes left-hand side of row \p i to \p lhs
441  void changeLhsRational(int i, const Rational& lhs);
442 
443 #ifdef SOPLEX_WITH_GMP
444  /// changes left-hand side of row \p i to \p lhs
445  void changeLhsRational(int i, const mpq_t* lhs);
446 #endif
447 
448  /// changes right-hand side vector to \p rhs
449  void changeRhsRational(const VectorRational& rhs);
450 
451 #ifdef SOPLEX_WITH_GMP
452  /// changes right-hand side vector to \p rhs
453  void changeRhsRational(const mpq_t* rhs, int rhsSize);
454 #endif
455 
456  /// changes right-hand side of row \p i to \p rhs
457  void changeRhsRational(int i, const Rational& rhs);
458 
459  /// changes left- and right-hand side vectors
460  void changeRangeRational(const VectorRational& lhs, const VectorRational& rhs);
461 
462  /// changes left- and right-hand side of row \p i
463  void changeRangeRational(int i, const Rational& lhs, const Rational& rhs);
464 
465 #ifdef SOPLEX_WITH_GMP
466  /// changes left- and right-hand side of row \p i
467  void changeRangeRational(int i, const mpq_t* lhs, const mpq_t* rhs);
468 #endif
469 
470  /// replaces column \p i with \p lpcol
471  void changeColRational(int i, const LPColRational& lpcol);
472 
473  /// changes vector of lower bounds to \p lower
474  void changeLowerRational(const VectorRational& lower);
475 
476  /// changes lower bound of column i to \p lower
477  void changeLowerRational(int i, const Rational& lower);
478 
479 #ifdef SOPLEX_WITH_GMP
480  /// changes lower bound of column i to \p lower
481  void changeLowerRational(int i, const mpq_t* lower);
482 #endif
483 
484  /// changes vector of upper bounds to \p upper
485  void changeUpperRational(const VectorRational& upper);
486 
487  /// changes \p i 'th upper bound to \p upper
488  void changeUpperRational(int i, const Rational& upper);
489 
490 #ifdef SOPLEX_WITH_GMP
491  /// changes upper bound of column i to \p upper
492  void changeUpperRational(int i, const mpq_t* upper);
493 #endif
494 
495  /// changes vectors of column bounds to \p lower and \p upper
496  void changeBoundsRational(const VectorRational& lower, const VectorRational& upper);
497 
498  /// changes bounds of column \p i to \p lower and \p upper
499  void changeBoundsRational(int i, const Rational& lower, const Rational& upper);
500 
501 #ifdef SOPLEX_WITH_GMP
502  /// changes bounds of column \p i to \p lower and \p upper
503  void changeBoundsRational(int i, const mpq_t* lower, const mpq_t* upper);
504 #endif
505 
506  /// changes objective function vector to \p obj
507  void changeObjRational(const VectorRational& obj);
508 
509  /// changes objective coefficient of column i to \p obj
510  void changeObjRational(int i, const Rational& obj);
511 
512 #ifdef SOPLEX_WITH_GMP
513  /// changes objective coefficient of column i to \p obj
514  void changeObjRational(int i, const mpq_t* obj);
515 #endif
516 
517  /// changes matrix entry in row \p i and column \p j to \p val
518  void changeElementRational(int i, int j, const Rational& val);
519 
520 #ifdef SOPLEX_WITH_GMP
521  /// changes matrix entry in row \p i and column \p j to \p val
522  void changeElementRational(int i, int j, const mpq_t* val);
523 #endif
524 
525  /// removes row \p i
526  void removeRowRational(int i);
527 
528  /// removes all rows with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the new
529  /// index where row \p i has been moved to; note that \p perm must point to an array of size at least
530  /// #numRowsRational()
531  void removeRowsRational(int perm[]);
532 
533  /// remove all rows with indices in array \p idx of size \p n; an array \p perm of size #numRowsRational() may be
534  /// passed as buffer memory
535  void removeRowsRational(int idx[], int n, int perm[] = 0);
536 
537  /// removes rows \p start to \p end including both; an array \p perm of size #numRowsRational() may be passed as
538  /// buffer memory
539  void removeRowRangeRational(int start, int end, int perm[] = 0);
540 
541  /// removes column i
542  void removeColRational(int i);
543 
544  /// removes all columns with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
545  /// new index where column \p i has been moved to; note that \p perm must point to an array of size at least
546  /// #numColsRational()
547  void removeColsRational(int perm[]);
548 
549  /// remove all columns with indices in array \p idx of size \p n; an array \p perm of size #numColsRational() may be
550  /// passed as buffer memory
551  void removeColsRational(int idx[], int n, int perm[] = 0);
552 
553  /// removes columns \p start to \p end including both; an array \p perm of size #numColsRational() may be passed as
554  /// buffer memory
555  void removeColRangeRational(int start, int end, int perm[] = 0);
556 
557  /// clears the LP
558  void clearLPRational();
559 
560  /// synchronizes rational LP with real LP, i.e., copies real LP to rational LP, if sync mode is manual
561  void syncLPRational();
562 
563  //@}
564 
565 
566  //**@name Solving and general solution query */
567  //@{
568 
569  /// optimize the given LP
571 
572  // old name for backwards compatibility
574  {
575  return optimize();
576  }
577 
578  /// returns the current solver status
579  SPxSolver::Status status() const;
580 
581  /// is stored primal solution feasible?
582  bool isPrimalFeasible() const;
583 
584  /// is a primal feasible solution available?
585  bool hasPrimal() const;
586 
587  /// is a primal unbounded ray available?
588  bool hasPrimalRay() const;
589 
590  /// is stored dual solution feasible?
591  bool isDualFeasible() const;
592 
593  /// is a dual feasible solution available?
594  bool hasDual() const;
595 
596  /// is Farkas proof of infeasibility available?
597  bool hasDualFarkas() const;
598 
599  //@}
600 
601 
602  //**@name Query for the real solution data */
603  //@{
604 
605  /// returns the objective value if a primal solution is available
606  Real objValueReal();
607 
608  /// gets the primal solution vector if available; returns true on success
609  bool getPrimalReal(VectorReal& vector);
610 
611  /// gets the vector of slack values if available; returns true on success
612  bool getSlacksReal(VectorReal& vector);
613 
614  /// gets the primal ray if available; returns true on success
615  bool getPrimalRayReal(VectorReal& vector);
616 
617  /// gets the dual solution vector if available; returns true on success
618  bool getDualReal(VectorReal& vector);
619 
620  /// gets the vector of reduced cost values if available; returns true on success
621  bool getRedCostReal(VectorReal& vector);
622 
623  /// gets the Farkas proof if available; returns true on success
624  bool getDualFarkasReal(VectorReal& vector);
625 
626  /// gets violation of bounds; returns true on success
627  bool getBoundViolationReal(Real& maxviol, Real& sumviol);
628 
629  /// gets violation of constraints; returns true on success
630  bool getRowViolationReal(Real& maxviol, Real& sumviol);
631 
632  /// gets violation of reduced costs; returns true on success
633  bool getRedCostViolationReal(Real& maxviol, Real& sumviol);
634 
635  /// gets violation of dual multipliers; returns true on success
636  bool getDualViolationReal(Real& maxviol, Real& sumviol);
637 
638  //@}
639 
640 
641  //**@name Query for the rational solution data */
642  //@{
643 
644  /// returns the objective value if a primal solution is available
646 
647  /// gets the primal solution vector if available; returns true on success
648  bool getPrimalRational(VectorRational& vector);
649 
650  /// gets the vector of slack values if available; returns true on success
651  bool getSlacksRational(VectorRational& vector);
652 
653  /// gets the primal ray if LP is unbounded; returns true on success
654  bool getPrimalRayRational(VectorRational& vector);
655 
656  /// gets the dual solution vector if available; returns true on success
657  bool getDualRational(VectorRational& vector);
658 
659  /// gets the vector of reduced cost values if available; returns true on success
660  bool getRedCostRational(VectorRational& vector);
661 
662  /// gets the Farkas proof if LP is infeasible; returns true on success
664 
665  /// gets violation of bounds; returns true on success
666  bool getBoundViolationRational(Rational& maxviol, Rational& sumviol);
667 
668  /// gets violation of constraints; returns true on success
669  bool getRowViolationRational(Rational& maxviol, Rational& sumviol);
670 
671  /// gets violation of reduced costs; returns true on success
672  bool getRedCostViolationRational(Rational& maxviol, Rational& sumviol);
673 
674  /// gets violation of dual multipliers; returns true on success
675  bool getDualViolationRational(Rational& maxviol, Rational& sumviol);
676 
677 #ifdef SOPLEX_WITH_GMP
678  /// gets the primal solution vector if available; returns true on success
679  bool getPrimalRational(mpq_t* vector, const int size);
680 
681  /// gets the vector of slack values if available; returns true on success
682  bool getSlacksRational(mpq_t* vector, const int size);
683 
684  /// gets the primal ray if LP is unbounded; returns true on success
685  bool getPrimalRayRational(mpq_t* vector, const int size);
686 
687  /// gets the dual solution vector if available; returns true on success
688  bool getDualRational(mpq_t* vector, const int size);
689 
690  /// gets the vector of reduced cost values if available; returns true on success
691  bool getRedCostRational(mpq_t* vector, const int size);
692 
693  /// gets the Farkas proof if LP is infeasible; returns true on success
694  bool getDualFarkasRational(mpq_t* vector, const int size);
695 #endif
696 
697  /// get size of primal solution
698  int totalSizePrimalRational(const int base = 2);
699 
700  /// get size of dual solution
701  int totalSizeDualRational(const int base = 2);
702 
703  /// get size of least common multiple of denominators in primal solution
704  int dlcmSizePrimalRational(const int base = 2);
705 
706  /// get size of least common multiple of denominators in dual solution
707  int dlcmSizeDualRational(const int base = 2);
708 
709  /// get size of largest denominator in primal solution
710  int dmaxSizePrimalRational(const int base = 2);
711 
712  /// get size of largest denominator in dual solution
713  int dmaxSizeDualRational(const int base = 2);
714 
715  //@}
716 
717 
718  //**@name Access and modification of basis information */
719  //@{
720 
721  /// is an advanced starting basis available?
722  bool hasBasis() const;
723 
724  /// returns the current basis status
726 
727  /// returns basis status for a single row
728  SPxSolver::VarStatus basisRowStatus(int row) const;
729 
730  /// returns basis status for a single column
731  SPxSolver::VarStatus basisColStatus(int col) const;
732 
733  /// gets current basis via arrays of statuses
734  void getBasis(SPxSolver::VarStatus rows[], SPxSolver::VarStatus cols[]) const;
735 
736  /// gets the indices of the basic columns and rows; basic column n gives value n, basic row m gives value -1-m
737  void getBasisInd(int* bind) const;
738 
739  /// compute condition number estimate based on the diagonal of the LU factorization; returns true on success
740  /// type = 0: max/min ratio
741  /// type = 1: trace of U (sum of diagonal elements)
742  /// type = 2: product of diagonal elements
743  bool getFastCondition(Real& condition, int type = 0);
744 
745  /// computes an estimated condition number for the current basis matrix using the power method; returns true on success
746  bool getEstimatedCondition(Real& condition);
747 
748  /// computes the exact condition number for the current basis matrix using the power method; returns true on success
749  bool getExactCondition(Real& condition);
750 
751  /// computes row \p r of basis inverse; returns true on success
752  /// @param r which row of the basis inverse is computed
753  /// @param coef values of result vector (not packed but scattered)
754  /// @param inds indices of result vector (NULL if not to be used)
755  /// @param ninds number of nonzeros in result vector
756  /// @param unscale determines whether the result should be unscaled according to the original LP data
757  bool getBasisInverseRowReal(int r, Real* coef, int* inds = NULL, int* ninds = NULL, bool unscale = true);
758 
759  /// computes column \p c of basis inverse; returns true on success
760  /// @param c which column of the basis inverse is computed
761  /// @param coef values of result vector (not packed but scattered)
762  /// @param inds indices of result vector (NULL if not to be used)
763  /// @param ninds number of nonzeros in result vector
764  /// @param unscale determines whether the result should be unscaled according to the original LP data
765  bool getBasisInverseColReal(int c, Real* coef, int* inds = NULL, int* ninds = NULL, bool unscale = true);
766 
767  /// computes dense solution of basis matrix B * \p sol = \p rhs; returns true on success
768  bool getBasisInverseTimesVecReal(Real* rhs, Real* sol, bool unscale = true);
769 
770  /// multiply with basis matrix; B * \p vec (inplace)
771  /// @param vec (dense) vector to be multiplied with
772  /// @param unscale determines whether the result should be unscaled according to the original LP data
773  bool multBasis(Real* vec, bool unscale = true);
774 
775  /// multiply with transpose of basis matrix; \p vec * B^T (inplace)
776  /// @param vec (dense) vector to be multiplied with
777  /// @param unscale determines whether the result should be unscaled according to the original LP data
778  bool multBasisTranspose(Real* vec, bool unscale = true);
779 
780  /// compute rational basis inverse; returns true on success
782 
783  /// gets an array of indices for the columns of the rational basis matrix; bind[i] >= 0 means that the i-th column of
784  /// the basis matrix contains variable bind[i]; bind[i] < 0 means that the i-th column of the basis matrix contains
785  /// the slack variable for row -bind[i]-1; performs rational factorization if not available; returns true on success
787 
788  /// computes row r of basis inverse; performs rational factorization if not available; returns true on success
789  bool getBasisInverseRowRational(const int r, SSVectorRational& vec);
790 
791  /// computes column c of basis inverse; performs rational factorization if not available; returns true on success
792  bool getBasisInverseColRational(const int c, SSVectorRational& vec);
793 
794  /// computes solution of basis matrix B * sol = rhs; performs rational factorization if not available; returns true
795  /// on success
797 
798  /// sets starting basis via arrays of statuses
799  void setBasis(const SPxSolver::VarStatus rows[], const SPxSolver::VarStatus cols[]);
800 
801  /// clears starting basis
802  void clearBasis();
803 
804  //@}
805 
806 
807  //**@name Statistical information */
808  //@{
809 
810  /// number of iterations since last call to solve
811  int numIterations() const;
812 
813  /// time spent in last call to solve
814  Real solveTime() const;
815 
816  /// statistical information in form of a string
817  std::string statisticString() const;
818 
819  /// name of starter
820  const char* getStarterName();
821 
822  /// name of simplifier
823  const char* getSimplifierName();
824 
825  /// name of scaling method
826  const char* getScalerName();
827 
828  /// name of currently loaded pricer
829  const char* getPricerName();
830 
831  /// name of currently loaded ratiotester
832  const char* getRatiotesterName();
833 
834  //@}
835 
836 
837  //**@name File I/O */
838  //@{
839 
840  /// reads LP file in LP or MPS format according to READMODE parameter; gets row names, column names, and
841  /// integer variables if desired; returns true on success
842  bool readFile(const char* filename, NameSet* rowNames = 0, NameSet* colNames = 0, DIdxSet* intVars = 0);
843 
844  /// writes real LP to file; LP or MPS format is chosen from the extension in \p filename; if \p rowNames and \p
845  /// colNames are \c NULL, default names are used; if \p intVars is not \c NULL, the variables contained in it are
846  /// marked as integer; returns true on success
847  bool writeFileReal(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const DIdxSet* intvars = 0, const bool unscale = true) const;
848 
849  /// writes rational LP to file; LP or MPS format is chosen from the extension in \p filename; if \p rowNames and \p
850  /// colNames are \c NULL, default names are used; if \p intVars is not \c NULL, the variables contained in it are
851  /// marked as integer; returns true on success
852  bool writeFileRational(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const DIdxSet* intvars = 0) const;
853 
854  /// writes the dual of the real LP to file; LP or MPS format is chosen from the extension in \p filename;
855  /// if \p rowNames and \p colNames are \c NULL, default names are used; if \p intVars is not \c NULL,
856  /// the variables contained in it are marked as integer; returns true on success
857  bool writeDualFileReal(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const DIdxSet* intvars = 0) const;
858 
859  /// reads basis information from \p filename and returns true on success; if \p rowNames and \p colNames are \c NULL,
860  /// default names are assumed; returns true on success
861  bool readBasisFile(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0);
862 
863  /// writes basis information to \p filename; if \p rowNames and \p colNames are \c NULL, default names are used;
864  /// returns true on success
865  bool writeBasisFile(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const bool cpxFormat = false) const;
866 
867  /// writes internal LP, basis information, and parameter settings; if \p rowNames and \p colNames are \c NULL,
868  /// default names are used
869  void writeStateReal(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const bool cpxFormat = false) const;
870 
871  /// writes internal LP, basis information, and parameter settings; if \p rowNames and \p colNames are \c NULL,
872  /// default names are used
873  void writeStateRational(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const bool cpxFormat = false) const;
874 
875  //@}
876 
877 
878  //**@name Parameters */
879  //@{
880 
881  /// boolean parameters
882  typedef enum
883  {
884  /// should lifting be used to reduce range of nonzero matrix coefficients?
885  LIFTING = 0,
886 
887  /// should LP be transformed to equality form before a rational solve?
888  EQTRANS = 1,
889 
890  /// should dual infeasibility be tested in order to try to return a dual solution even if primal infeasible?
892 
893  /// should a rational factorization be performed after iterative refinement?
894  RATFAC = 3,
895 
896  /// should the decomposition based dual simplex be used to solve the LP? Setting this to true forces the solve mode to
897  /// SOLVEMODE_REAL and the basis representation to REPRESENTATION_ROW
899 
900  /// should the degeneracy be computed for each basis?
902 
903  /// should the dual of the complementary problem be used in the decomposition simplex?
905 
906  /// should row and bound violations be computed explicitly in the update of reduced problem in the decomposition simplex
908 
909  /// should cycling solutions be accepted during iterative refinement?
911 
912  /// apply rational reconstruction after each iterative refinement?
913  RATREC = 9,
914 
915  /// round scaling factors for iterative refinement to powers of two?
917 
918  /// continue iterative refinement with exact basic solution if not optimal?
920 
921  /// use bound flipping also for row representation?
923 
924  /// use persistent scaling?
926 
927  /// perturb the entire problem or only the relevant bounds of s single pivot?
929 
930  /// number of boolean parameters
932  } BoolParam;
933 
934  /// integer parameters
935  typedef enum
936  {
937  /// objective sense
938  OBJSENSE = 0,
939 
940  /// type of computational form, i.e., column or row representation
942 
943  /// type of algorithm, i.e., primal or dual
945 
946  /// type of LU update
948 
949  /// maximum number of updates without fresh factorization
951 
952  /// iteration limit (-1 if unlimited)
954 
955  /// refinement limit (-1 if unlimited)
956  REFLIMIT = 6,
957 
958  /// stalling refinement limit (-1 if unlimited)
960 
961  /// display frequency
963 
964  /// verbosity level
966 
967  /// type of simplifier
969 
970  /// type of scaler
971  SCALER = 11,
972 
973  /// type of starter used to create crash basis
974  STARTER = 12,
975 
976  /// type of pricer
977  PRICER = 13,
978 
979  /// type of ratio test
981 
982  /// mode for synchronizing real and rational LP
983  SYNCMODE = 15,
984 
985  /// mode for reading LP files
986  READMODE = 16,
987 
988  /// mode for iterative refinement strategy
989  SOLVEMODE = 17,
990 
991  /// mode for a posteriori feasibility checks
992  CHECKMODE = 18,
993 
994  /// type of timer
995  TIMER = 19,
996 
997  /// mode for hyper sparse pricing
999 
1000  /// minimum number of stalling refinements since last pivot to trigger rational factorization
1002 
1003  /// maximum number of conjugate gradient iterations in least square scaling
1005 
1006  /// mode for solution polishing
1008 
1009  /// the number of iterations before the decomposition simplex initialisation is terminated.
1011 
1012  /// the maximum number of rows that are added in each iteration of the decomposition based simplex
1014 
1015  /// the iteration frequency at which the decomposition solve output is displayed.
1017 
1018  /// the verbosity of the decomposition based simplex
1020 
1021  /// print condition number during the solve
1023 
1024  /// number of integer parameters
1026  } IntParam;
1027 
1028  /// values for parameter OBJSENSE
1029  enum
1030  {
1031  /// minimization
1033 
1034  /// maximization
1036  };
1037 
1038  /// values for parameter REPRESENTATION
1039  enum
1040  {
1041  /// automatic choice according to number of rows and columns
1043 
1044  /// column representation Ax - s = 0, lower <= x <= upper, lhs <= s <= rhs
1046 
1047  /// row representation (lower,lhs) <= (x,Ax) <= (upper,rhs)
1049  };
1050 
1051  /// values for parameter ALGORITHM
1052  enum
1053  {
1054  /// primal simplex algorithm, i.e., entering for column and leaving for row representation
1056 
1057  /// dual simplex algorithm, i.e., leaving for column and entering for row representation
1059  };
1060 
1061  /// values for parameter FACTOR_UPDATE_TYPE
1062  enum
1063  {
1064  /// product form update
1066 
1067  /// Forrest-Tomlin type update
1069  };
1070 
1071  /// values for parameter VERBOSITY
1072  enum
1073  {
1074  /// only error output
1076 
1077  /// only error and warning output
1079 
1080  /// only error, warning, and debug output
1082 
1083  /// standard verbosity level
1085 
1086  /// high verbosity level
1088 
1089  /// full verbosity level
1091  };
1092 
1093  /// values for parameter SIMPLIFIER
1094  enum
1095  {
1096  /// no simplifier
1098 
1099  /// automatic choice
1101  };
1102 
1103  /// values for parameter SCALER
1104  enum
1105  {
1106  /// no scaler
1108 
1109  /// equilibrium scaling on rows or columns
1111 
1112  /// equilibrium scaling on rows and columns
1114 
1115  /// geometric mean scaling on rows and columns, max 1 round
1117 
1118  /// geometric mean scaling on rows and columns, max 8 rounds
1120 
1121  /// least square scaling
1123  };
1124 
1125  /// values for parameter STARTER
1126  enum
1127  {
1128  /// slack basis
1130 
1131  /// greedy crash basis weighted by objective, bounds, and sides
1133 
1134  /// crash basis from a greedy solution
1136 
1137  /// generic solution-based crash basis
1139  };
1140 
1141  /// values for parameter PRICER
1142  enum
1143  {
1144  /// automatic pricer
1146 
1147  /// Dantzig pricer
1149 
1150  /// partial multiple pricer based on Dantzig pricing
1152 
1153  /// devex pricer
1155 
1156  /// steepest edge pricer with initialization to unit norms
1158 
1159  /// steepest edge pricer with exact initialization of norms
1161  };
1162 
1163  /// values for parameter RATIOTESTER
1164  enum
1165  {
1166  /// textbook ratio test without stabilization
1168 
1169  /// standard Harris ratio test
1171 
1172  /// modified Harris ratio test
1174 
1175  /// bound flipping ratio test for long steps in the dual simplex
1177  };
1178 
1179  /// values for parameter SYNCMODE
1180  enum
1181  {
1182  /// store only real LP
1184 
1185  /// automatic sync of real and rational LP
1187 
1188  /// user sync of real and rational LP
1190  };
1191 
1192  /// values for parameter READMODE
1193  enum
1194  {
1195  /// standard floating-point parsing
1197 
1198  /// rational parsing
1200  };
1201 
1202  /// values for parameter SOLVEMODE
1203  enum
1204  {
1205  /// apply standard floating-point algorithm
1207 
1208  /// decide depending on tolerances whether to apply iterative refinement
1210 
1211  /// force iterative refinement
1213  };
1214 
1215  /// values for parameter CHECKMODE
1216  enum
1217  {
1218  /// floating-point check
1220 
1221  /// decide according to READMODE
1223 
1224  /// rational check
1226  };
1227 
1228  /// values for parameter TIMER
1229  enum
1230  {
1231  /// disable timing
1233 
1234  /// cpu or user time
1236 
1237  /// wallclock time
1239  };
1240 
1241  /// values for parameter HYPER_PRICING
1242  enum
1243  {
1244  /// never
1246 
1247  /// decide according to problem size
1249 
1250  /// always
1252  };
1253 
1254  /// values for parameter SOLUTION_POLISHING
1255  enum
1256  {
1257  /// no solution polishing
1259 
1260  /// maximize number of basic slack variables, i.e. more variables on bounds
1262 
1263  /// minimize number of basic slack variables, i.e. more variables between bounds
1265  };
1266 
1267  /// real parameters
1268  typedef enum
1269  {
1270  /// primal feasibility tolerance
1271  FEASTOL = 0,
1272 
1273  /// dual feasibility tolerance
1274  OPTTOL = 1,
1275 
1276  /// general zero tolerance
1278 
1279  /// zero tolerance used in factorization
1281 
1282  /// zero tolerance used in update of the factorization
1284 
1285  /// pivot zero tolerance used in factorization
1287 
1288  /// infinity threshold
1289  INFTY = 6,
1290 
1291  /// time limit in seconds (INFTY if unlimited)
1293 
1294  /// lower limit on objective value
1296 
1297  /// upper limit on objective value
1299 
1300  /// working tolerance for feasibility in floating-point solver during iterative refinement
1302 
1303  /// working tolerance for optimality in floating-point solver during iterative refinement
1304  FPOPTTOL = 11,
1305 
1306  /// maximum increase of scaling factors between refinements
1308 
1309  /// lower threshold in lifting (nonzero matrix coefficients with smaller absolute value will be reformulated)
1311 
1312  /// upper threshold in lifting (nonzero matrix coefficients with larger absolute value will be reformulated)
1314 
1315  /// sparse pricing threshold (\#violations < dimension * SPARSITY_THRESHOLD activates sparse pricing)
1317 
1318  /// threshold on number of rows vs. number of columns for switching from column to row representations in auto mode
1320 
1321  /// geometric frequency at which to apply rational reconstruction
1323 
1324  /// minimal reduction (sum of removed rows/cols) to continue simplification
1325  MINRED = 18,
1326 
1327  /// refactor threshold for nonzeros in last factorized basis matrix compared to updated basis matrix
1329 
1330  /// refactor threshold for fill-in in current factor update compared to fill-in in last factorization
1332 
1333  /// refactor threshold for memory growth in factorization since last refactorization
1335 
1336  /// accuracy of conjugate gradient method in least squares scaling (higher value leads to more iterations)
1338 
1339  /// objective offset
1341 
1342  /// number of real parameters
1344  } RealParam;
1345 
1346 #ifdef SOPLEX_WITH_RATIONALPARAM
1347  /// rational parameters
1348  typedef enum
1349  {
1350  /// number of rational parameters
1351  RATIONALPARAM_COUNT = 0
1352  } RationalParam;
1353 #endif
1354 
1355  /// class of parameter settings
1356  class Settings
1357  {
1358  public:
1359  static struct BoolParam {
1360  /// constructor
1361  BoolParam();
1362  /// array of names for boolean parameters
1364  /// array of descriptions for boolean parameters
1366  /// array of default values for boolean parameters
1368  } boolParam;
1369 
1370  static struct IntParam {
1371  /// constructor
1372  IntParam();
1373  /// array of names for integer parameters
1375  /// array of descriptions for integer parameters
1377  /// array of default values for integer parameters
1379  /// array of lower bounds for int parameter values
1381  /// array of upper bounds for int parameter values
1383  } intParam;
1384 
1385  static struct RealParam {
1386  /// constructor
1387  RealParam();
1388  /// array of names for real parameters
1390  /// array of descriptions for real parameters
1392  /// array of default values for real parameters
1394  /// array of lower bounds for real parameter values
1396  /// array of upper bounds for real parameter values
1398  } realParam;
1399 
1400 #ifdef SOPLEX_WITH_RATIONALPARAM
1401  static struct RationalParam {
1402  /// constructor
1403  RationalParam();
1404  /// array of names for rational parameters
1405  std::string name[SoPlex::RATIONALPARAM_COUNT];
1406  /// array of descriptions for rational parameters
1407  std::string description[SoPlex::RATIONALPARAM_COUNT];
1408  /// array of default values for rational parameters
1409  Rational defaultValue[SoPlex::RATIONALPARAM_COUNT];
1410  /// array of lower bounds for rational parameter values
1411  Rational lower[SoPlex::RATIONALPARAM_COUNT];
1412  /// array of upper bounds for rational parameter values
1413  Rational upper[SoPlex::RATIONALPARAM_COUNT];
1414  } rationalParam;
1415 #endif
1416 
1417  /// array of current boolean parameter values
1419 
1420  /// array of current integer parameter values
1422 
1423  /// array of current real parameter values
1425 
1426 #ifdef SOPLEX_WITH_RATIONALPARAM
1427  /// array of current rational parameter values
1428  Rational _rationalParamValues[SoPlex::RATIONALPARAM_COUNT];
1429 #endif
1430 
1431  /// default constructor initializing default settings
1432  Settings();
1433 
1434  /// copy constructor
1435  Settings(const Settings& settings);
1436 
1437  /// assignment operator
1439  };
1440 
1441  mutable SPxOut spxout;
1442 
1443  /// returns boolean parameter value
1444  bool boolParam(const BoolParam param) const;
1445 
1446  /// returns integer parameter value
1447  int intParam(const IntParam param) const;
1448 
1449  /// returns real parameter value
1450  Real realParam(const RealParam param) const;
1451 
1452 #ifdef SOPLEX_WITH_RATIONALPARAM
1453  /// returns rational parameter value
1454  Rational rationalParam(const RationalParam param) const;
1455 #endif
1456 
1457  /// returns current parameter settings
1458  const Settings& settings() const;
1459 
1460  /// sets boolean parameter value; returns true on success
1461  bool setBoolParam(const BoolParam param, const bool value, const bool init = true);
1462 
1463  /// sets integer parameter value; returns true on success
1464  bool setIntParam(const IntParam param, const int value, const bool init = true);
1465 
1466  /// sets real parameter value; returns true on success
1467  bool setRealParam(const RealParam param, const Real value, const bool init = true);
1468 
1469 #ifdef SOPLEX_WITH_RATIONALPARAM
1470  /// sets rational parameter value; returns true on success
1471  bool setRationalParam(const RationalParam param, const Rational value, const bool init = true);
1472 #endif
1473 
1474  /// sets parameter settings; returns true on success
1475  bool setSettings(const Settings& newSettings, const bool init = true);
1476 
1477  /// resets default parameter settings
1478  void resetSettings(const bool quiet = false, const bool init = true);
1479 
1480  /// print non-default parameter values
1481  void printUserSettings();
1482 
1483  /// writes settings file; returns true on success
1484  bool saveSettingsFile(const char* filename, const bool onlyChanged = false) const;
1485 
1486  /// reads settings file; returns true on success
1487  bool loadSettingsFile(const char* filename);
1488 
1489  /// parses one setting string and returns true on success; note that string is modified
1490  bool parseSettingsString(char* line);
1491 
1492  //@}
1493 
1494 
1495  //**@name Statistics */
1496  //@{
1497 
1498  /// prints solution statistics
1499  void printSolutionStatistics(std::ostream& os);
1500 
1501  /// prints statistics on solving process
1502  void printSolvingStatistics(std::ostream& os);
1503 
1504  /// prints short statistics
1505  void printShortStatistics(std::ostream& os);
1506 
1507  /// prints complete statistics
1508  void printStatistics(std::ostream& os);
1509 
1510  /// prints status
1511  void printStatus(std::ostream& os, SPxSolver::Status status);
1512 
1513  //@}
1514 
1515 
1516  //**@name Miscellaneous */
1517  //@{
1518 
1519  /// prints version and compilation options
1520  void printVersion() const;
1521 
1522  /// checks if real LP and rational LP are in sync; dimensions will always be compared,
1523  /// vector and matrix values only if the respective parameter is set to true.
1524  /// If quiet is set to true the function will only display which vectors are different.
1525  bool areLPsInSync(const bool checkVecVals = true, const bool checkMatVals = false, const bool quiet = false) const;
1526 
1527  /// set the random seeds of the solver instance
1528  void setRandomSeed(unsigned int seed);
1529 
1530  /// returns the current random seed of the solver instance
1531  unsigned int randomSeed() const;
1532 
1533  //@}
1534 
1535 private:
1536 
1537  //**@name Statistics on solving process */
1538  //@{
1539 
1540  /// class of statistics
1541  class Statistics;
1542 
1543  /// statistics since last call to solveReal() or solveRational()
1545 
1546  //@}
1547 
1548 
1549  //**@name Parameter settings */
1550  //@{
1551 
1553 
1559 
1560  //@}
1561 
1562 
1563  //**@name Data for the real LP */
1564  //@{
1565 
1587 
1588  SPxLPReal* _realLP; // the real LP is also used as the original LP for the decomposition dual simplex
1589  SPxLPReal* _decompLP; // used to store the original LP for the decomposition dual simplex
1593 
1594  bool _isRealLPLoaded; // true indicates that the original LP is loaded in the _solver variable, hence all actions
1595  // are performed on the original LP.
1598 
1605 
1606  //@}
1607 
1608 
1609  //**@name Data for the rational LP */
1610  //@{
1611 
1615 
1639 
1640  /// type of bounds and sides
1641  typedef enum
1642  {
1643  /// both bounds are infinite
1645 
1646  /// lower bound is finite, upper bound is infinite
1648 
1649  /// upper bound is finite, lower bound is infinite
1651 
1652  /// lower and upper bound finite, but different
1654 
1655  /// lower bound equals upper bound
1657  } RangeType;
1658 
1661 
1662  //@}
1663 
1664 
1665  //**@name Data for the Decomposition Based Dual Simplex */
1666  //@{
1667 
1668  /** row violation structure
1669  */
1671  {
1672  Real violation; /**< the violation of the row */
1673  int idx; /**< index of corresponding row */
1674  };
1675 
1676  /** Compare class for row violations
1677  */
1679  {
1680  public:
1681  /** constructor
1682  */
1684  : entry(0)
1685  {
1686  }
1687 
1689 
1690  Real operator() (
1691  RowViolation i,
1692  RowViolation j
1693  ) const
1694  {
1695  return i.violation - j.violation;
1696  }
1697  };
1698 
1699 
1700  typedef enum
1701  {
1702  // is the original problem currently being solved.
1704 
1705  // is the reduced problem currently being solved.
1707 
1708  // is the complementary problem currently being solved.
1710  } decompStatus;
1711 
1712  // the expected sign of the dual variables.
1714  {
1715  IS_POS = 0,
1716  IS_NEG = 1,
1718  };
1719 
1720  SPxSolver _compSolver; // adding a solver to contain the complementary problem. It is too confusing to switch
1721  // the LP for the reduced and complementary problem in the one solver variable. The reduced
1722  // problem will be stored in _solver and the complementary problem will be stored in
1723  // _compSolver.
1724  SLUFactor _compSlufactor; // I don't know whether this is necessary, but it is a test for now.
1725 
1726  SPxBasis _decompTransBasis; // the basis required for the transformation to form the reduced problem
1727 
1728  DVector _transformedObj; // the objective coefficients of the transformed problem
1729  DVector _decompFeasVector; // feasibility vector calculated using unshifted bounds.
1730  LPRowSet _transformedRows; // a set of the original rows that have been transformed using the original basis.
1731  SPxColId _compSlackColId; // column id of the primal complementary problem slack column.
1732  SPxRowId _compSlackDualRowId; // row id in the dual of complementary problem related to the slack column.
1733  bool* _decompReducedProbRows; // flag to indicate the inclusion of a row in the reduced problem.
1734  bool* _decompReducedProbCols; // flag to indicate the inclusion of a col in the reduced problem.
1737  int* _decompCompProbColIDsIdx; // the index to _decompPrimalColIDs for a given original col.
1738  DataArray < SPxRowId > _decompReducedProbRowIDs; // the row IDs for the related rows in the reduced problem
1739  DataArray < SPxRowId > _decompReducedProbColRowIDs;// the row IDs for the related cols in the reduced problem
1740  DataArray < SPxColId > _decompReducedProbColIDs; // the col IDs for the related cols in the reduced problem
1741  DataArray < SPxRowId > _decompPrimalRowIDs; // the primal row IDs from the original problem
1742  DataArray < SPxColId > _decompPrimalColIDs; // the primal col IDs from the original problem
1743  DataArray < SPxRowId > _decompElimPrimalRowIDs; // the primal row IDs eliminated in the complementary problem
1744  DataArray < SPxRowId > _decompDualRowIDs; // the dual row IDs from the complementary problem
1745  DataArray < SPxColId > _decompDualColIDs; // the dual col IDs from the complementary problem
1746  DataArray < SPxColId > _decompFixedVarDualIDs; // the column ids related to the fixed variables.
1747  DataArray < SPxColId > _decompVarBoundDualIDs; // the column ids related to the variable bound constraints.
1748 
1749  DataArray < SPxColId > _decompCompPrimalFixedVarIDs; // the column ids related to the fixed variables in the complementary primal.
1750  DataArray < SPxColId > _decompCompPrimalVarBoundIDs; // the column ids related to the variable bound constraints in the complementary primal.
1751 
1752  DataArray < SPxRowId > _decompCompPrimalRowIDs; // the primal row IDs from the complementary problem
1753  DataArray < SPxColId > _decompCompPrimalColIDs; // the primal col IDs from the complementary problem
1754 
1755  int _nDecompViolBounds; // the number of violated bound constraints
1756  int _nDecompViolRows; // the number of violated rows
1757  int* _decompViolatedBounds; // the violated bounds given by the solution to the IDS reduced problem
1758  int* _decompViolatedRows; // the violated rows given by the solution to the IDS reduced problem
1759 
1760 
1761  int* _fixedOrigVars; // the original variables that are at their bounds in the reduced problem.
1762  // 1: fixed to upper, -1: fixed to lower, 0: unfixed.
1763  int _nPrimalRows; // the number of original problem rows included in the complementary problem
1764  int _nPrimalCols; // the number of original problem columns included in the complementary problem
1765  int _nElimPrimalRows; // the number of primal rows from the original problem eliminated from the complementary prob
1766  int _nDualRows; // the number of dual rows in the complementary problem. NOTE: _nPrimalRows = _nDualCols
1767  int _nDualCols; // the number of dual columns in the complementary problem. NOTE: _nPrimalRows = _nDualCols
1768  int _nCompPrimalRows; // the number of rows in the complementary primal problem. NOTE: _nPrimalRows = _nCompPrimalRows
1769  int _nCompPrimalCols; // the number of dual columns in the complementary problem. NOTE: _nPrimalCols = _nCompPrimalCols
1770 
1771  int _decompDisplayLine; // the count for the display line
1772 
1773  NameSet* _rowNames; // the row names from the input file
1774  NameSet* _colNames; // the col names from the input file
1775 
1776  // Statistic information
1777  int numIncludedRows; // the number of rows currently included in the reduced problem.
1778  int numDecompIter; // the number of iterations of the decomposition dual simplex algorithm.
1779  int numRedProbIter; // the number of simplex iterations performed in the reduced problem.
1780  int numCompProbIter; // the number of iterations of the complementary problem.
1781 
1782  // problem statistics
1788 
1793 
1798 
1799 
1801 
1802  //@}
1803 
1804 
1805  //**@name Solution data */
1806  //@{
1807 
1810 
1813 
1817 
1821 
1822  //@}
1823 
1824  //**@name Miscellaneous */
1825  //@{
1826 
1829 
1833 
1834  //@}
1835 
1836  //**@name Constant helper methods */
1837  //@{
1838 
1839  /// extends sparse vector to hold newmax entries if and only if it holds no more free entries
1840  void _ensureDSVectorRationalMemory(DSVectorRational& vec, const int newmax) const;
1841 
1842  /// creates a permutation for removing rows/columns from an array of indices
1843  void _idxToPerm(int* idx, int idxSize, int* perm, int permSize) const;
1844 
1845  /// creates a permutation for removing rows/columns from a range of indices
1846  void _rangeToPerm(int start, int end, int* perm, int permSize) const;
1847 
1848  /// checks consistency
1849  bool _isConsistent() const;
1850 
1851  /// should solving process be stopped?
1852  bool _isSolveStopped(bool& stoppedTime, bool& stoppedIter) const;
1853 
1854  /// determines RangeType from real bounds
1855  RangeType _rangeTypeReal(const Real& lower, const Real& upper) const;
1856 
1857  /// determines RangeType from rational bounds
1858  RangeType _rangeTypeRational(const Rational& lower, const Rational& upper) const;
1859 
1860  /// switches RANGETYPE_LOWER to RANGETYPE_UPPER and vice versa
1861  RangeType _switchRangeType(const RangeType& rangeType) const;
1862 
1863  /// checks whether RangeType corresponds to finite lower bound
1864  bool _lowerFinite(const RangeType& rangeType) const;
1865 
1866  /// checks whether RangeType corresponds to finite upper bound
1867  bool _upperFinite(const RangeType& rangeType) const;
1868 
1869  //@}
1870 
1871 
1872  //**@name Non-constant helper methods */
1873  //@{
1874 
1875  /// adds a single row to the real LP and adjusts basis
1876  void _addRowReal(const LPRowReal& lprow);
1877 
1878  /// adds a single row to the real LP and adjusts basis
1879  void _addRowReal(Real lhs, const SVectorReal& lprow, Real rhs);
1880 
1881  /// adds multiple rows to the real LP and adjusts basis
1882  void _addRowsReal(const LPRowSetReal& lprowset);
1883 
1884  /// adds a single column to the real LP and adjusts basis
1885  void _addColReal(const LPColReal& lpcol);
1886 
1887  /// adds a single column to the real LP and adjusts basis
1888  void _addColReal(Real obj, Real lower, const SVectorReal& lpcol, Real upper);
1889 
1890  /// adds multiple columns to the real LP and adjusts basis
1891  void _addColsReal(const LPColSetReal& lpcolset);
1892 
1893  /// replaces row \p i with \p lprow and adjusts basis
1894  void _changeRowReal(int i, const LPRowReal& lprow);
1895 
1896  /// changes left-hand side vector for constraints to \p lhs and adjusts basis
1897  void _changeLhsReal(const VectorReal& lhs);
1898 
1899  /// changes left-hand side of row \p i to \p lhs and adjusts basis
1900  void _changeLhsReal(int i, const Real& lhs);
1901 
1902  /// changes right-hand side vector to \p rhs and adjusts basis
1903  void _changeRhsReal(const VectorReal& rhs);
1904 
1905  /// changes right-hand side of row \p i to \p rhs and adjusts basis
1906  void _changeRhsReal(int i, const Real& rhs);
1907 
1908  /// changes left- and right-hand side vectors and adjusts basis
1909  void _changeRangeReal(const VectorReal& lhs, const VectorReal& rhs);
1910 
1911  /// changes left- and right-hand side of row \p i and adjusts basis
1912  void _changeRangeReal(int i, const Real& lhs, const Real& rhs);
1913 
1914  /// replaces column \p i with \p lpcol and adjusts basis
1915  void _changeColReal(int i, const LPColReal& lpcol);
1916 
1917  /// changes vector of lower bounds to \p lower and adjusts basis
1918  void _changeLowerReal(const VectorReal& lower);
1919 
1920  /// changes lower bound of column i to \p lower and adjusts basis
1921  void _changeLowerReal(int i, const Real& lower);
1922 
1923  /// changes vector of upper bounds to \p upper and adjusts basis
1924  void _changeUpperReal(const VectorReal& upper);
1925 
1926  /// changes \p i 'th upper bound to \p upper and adjusts basis
1927  void _changeUpperReal(int i, const Real& upper);
1928 
1929  /// changes vectors of column bounds to \p lower and \p upper and adjusts basis
1930  void _changeBoundsReal(const VectorReal& lower, const VectorReal& upper);
1931 
1932  /// changes bounds of column \p i to \p lower and \p upper and adjusts basis
1933  void _changeBoundsReal(int i, const Real& lower, const Real& upper);
1934 
1935  /// changes matrix entry in row \p i and column \p j to \p val and adjusts basis
1936  void _changeElementReal(int i, int j, const Real& val);
1937 
1938  /// removes row \p i and adjusts basis
1939  void _removeRowReal(int i);
1940 
1941  /// removes all rows with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
1942  /// new index where row \p i has been moved to; note that \p perm must point to an array of size at least
1943  /// #numRowsReal()
1944  void _removeRowsReal(int perm[]);
1945 
1946  /// remove all rows with indices in array \p idx of size \p n; an array \p perm of size #numRowsReal() may be passed
1947  /// as buffer memory
1948  void _removeRowsReal(int idx[], int n, int perm[]);
1949 
1950  /// removes rows \p start to \p end including both; an array \p perm of size #numRowsReal() may be passed as buffer
1951  /// memory
1952  void _removeRowRangeReal(int start, int end, int perm[]);
1953 
1954  /// removes column i
1955  void _removeColReal(int i);
1956 
1957  /// removes all columns with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
1958  /// new index where column \p i has been moved to; note that \p perm must point to an array of size at least
1959  /// #numColsReal()
1960  void _removeColsReal(int perm[]);
1961 
1962  /// remove all columns with indices in array \p idx of size \p n; an array \p perm of size #numColsReal() may be
1963  /// passed as buffer memory
1964  void _removeColsReal(int idx[], int n, int perm[]);
1965 
1966  /// removes columns \p start to \p end including both; an array \p perm of size #numColsReal() may be passed as
1967  /// buffer memory
1968  void _removeColRangeReal(int start, int end, int perm[]);
1969 
1970  /// invalidates solution
1971  void _invalidateSolution();
1972 
1973  /// enables simplifier and scaler according to current parameters
1975 
1976  /// disables simplifier and scaler
1978 
1979  /// ensures that the rational LP is available; performs no sync
1980  void _ensureRationalLP();
1981 
1982  /// ensures that the real LP and the basis are loaded in the solver; performs no sync
1983  void _ensureRealLPLoaded();
1984 
1985  /// call floating-point solver and update statistics on iterations etc.
1987 
1988  /// reads real LP in LP or MPS format from file and returns true on success; gets row names, column names, and
1989  /// integer variables if desired
1990  bool _readFileReal(const char* filename, NameSet* rowNames = 0, NameSet* colNames = 0, DIdxSet* intVars = 0);
1991 
1992  /// reads rational LP in LP or MPS format from file and returns true on success; gets row names, column names, and
1993  /// integer variables if desired
1994  bool _readFileRational(const char* filename, NameSet* rowNames = 0, NameSet* colNames = 0, DIdxSet* intVars = 0);
1995 
1996  /// completes range type arrays after adding columns and/or rows
1998 
1999  /// recomputes range types from scratch using real LP
2000  void _recomputeRangeTypesReal();
2001 
2002  /// recomputes range types from scratch using rational LP
2004 
2005  /// synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP, without looking at the sync mode
2006  void _syncLPReal(bool time = true);
2007 
2008  /// synchronizes rational LP with real LP, i.e., copies real LP to rational LP, without looking at the sync mode
2009  void _syncLPRational(bool time = true);
2010 
2011  /// synchronizes rational solution with real solution, i.e., copies (rounded) rational solution to real solution
2012  void _syncRealSolution();
2013 
2014  /// synchronizes real solution with rational solution, i.e., copies real solution to rational solution
2015  void _syncRationalSolution();
2016 
2017  /// returns pointer to a constant unit vector available until destruction of the SoPlex class
2018  const UnitVectorRational* _unitVectorRational(const int i);
2019 
2020  /// parses one line in a settings file and returns true on success; note that the string is modified
2021  bool _parseSettingsLine(char* line, const int lineNumber);
2022 
2023  //@}
2024 
2025 
2026  //**@name Private solving methods implemented in solverational.cpp */
2027  //@{
2028 
2029  /// solves rational LP
2030  void _optimizeRational();
2031 
2032  /// solves current problem with iterative refinement and recovery mechanism
2033  void _performOptIRStable(SolRational& sol,
2034  bool acceptUnbounded,
2035  bool acceptInfeasible,
2036  int minRounds,
2037  bool& primalFeasible,
2038  bool& dualFeasible,
2039  bool& infeasible,
2040  bool& unbounded,
2041  bool& stopped,
2042  bool& stoppedIter,
2043  bool& error);
2044 
2045  /// performs iterative refinement on the auxiliary problem for testing unboundedness
2046  void _performUnboundedIRStable(SolRational& sol, bool& hasUnboundedRay, bool& stopped, bool& stoppedIter, bool& error);
2047 
2048  /// performs iterative refinement on the auxiliary problem for testing feasibility
2049  void _performFeasIRStable(SolRational& sol, bool& withDualFarkas, bool& stopped, bool& stoppedIter, bool& error);
2050 
2051  /// reduces matrix coefficient in absolute value by the lifting procedure of Thiele et al. 2013
2052  void _lift();
2053 
2054  /// undoes lifting
2055  void _project(SolRational& sol);
2056 
2057  /// store basis
2058  void _storeBasis();
2059 
2060  /// restore basis
2061  void _restoreBasis();
2062 
2063  /// stores objective, bounds, and sides of real LP
2064  void _storeLPReal();
2065 
2066  /// restores objective, bounds, and sides of real LP
2067  void _restoreLPReal();
2068 
2069  /// introduces slack variables to transform inequality constraints into equations for both rational and real LP,
2070  /// which should be in sync
2071  void _transformEquality();
2072 
2073  /// undoes transformation to equality form
2074  void _untransformEquality(SolRational& sol);
2075 
2076  /// transforms LP to unboundedness problem by moving the objective function to the constraints, changing right-hand
2077  /// side and bounds to zero, and adding an auxiliary variable for the decrease in the objective function
2078  void _transformUnbounded();
2079 
2080  /// undoes transformation to unboundedness problem
2081  void _untransformUnbounded(SolRational& sol, bool unbounded);
2082 
2083  /// transforms LP to feasibility problem by removing the objective function, shifting variables, and homogenizing the
2084  /// right-hand side
2085  void _transformFeasibility();
2086 
2087  /// undoes transformation to feasibility problem
2088  void _untransformFeasibility(SolRational& sol, bool infeasible);
2089 
2090  /** computes radius of infeasibility box implied by an approximate Farkas' proof
2091 
2092  Given constraints of the form \f$ lhs <= Ax <= rhs \f$, a farkas proof y should satisfy \f$ y^T A = 0 \f$ and
2093  \f$ y_+^T lhs - y_-^T rhs > 0 \f$, where \f$ y_+, y_- \f$ denote the positive and negative parts of \f$ y \f$.
2094  If \f$ y \f$ is approximate, it may not satisfy \f$ y^T A = 0 \f$ exactly, but the proof is still valid as long
2095  as the following holds for all potentially feasible \f$ x \f$:
2096 
2097  \f[
2098  y^T Ax < (y_+^T lhs - y_-^T rhs) (*)
2099  \f]
2100 
2101  we may therefore calculate \f$ y^T A \f$ and \f$ y_+^T lhs - y_-^T rhs \f$ exactly and check if the upper and lower
2102  bounds on \f$ x \f$ imply that all feasible \f$ x \f$ satisfy (*), and if not then compute bounds on \f$ x \f$ to
2103  guarantee (*). The simplest way to do this is to compute
2104 
2105  \f[
2106  B = (y_+^T lhs - y_-^T rhs) / \sum_i(|(y^T A)_i|)
2107  \f]
2108 
2109  noting that if every component of \f$ x \f$ has \f$ |x_i| < B \f$, then (*) holds.
2110 
2111  \f$ B \f$ can be increased by iteratively including variable bounds smaller than \f$ B \f$. The speed of this
2112  method can be further improved by using interval arithmetic for all computations. For related information see
2113  Sec. 4 of Neumaier and Shcherbina, Mathematical Programming A, 2004.
2114 
2115  Set transformed to true if this method is called after _transformFeasibility().
2116  */
2117  void _computeInfeasBox(SolRational& sol, bool transformed);
2118 
2119  /// solves real LP during iterative refinement
2120  SPxSolver::Status _solveRealForRational(bool fromscratch, VectorReal& primal, VectorReal& dual,
2121  DataArray< SPxSolver::VarStatus >& basisStatusRows,
2122  DataArray< SPxSolver::VarStatus >& basisStatusCols, bool& returnedBasis);
2123 
2124  /// solves real LP with recovery mechanism
2125  SPxSolver::Status _solveRealStable(bool acceptUnbounded, bool acceptInfeasible, VectorReal& primal, VectorReal& dual,
2126  DataArray< SPxSolver::VarStatus >& basisStatusRows,
2127  DataArray< SPxSolver::VarStatus >& basisStatusCols, bool& returnedBasis, const bool forceNoSimplifier = false);
2128 
2129  /// computes rational inverse of basis matrix as defined by _rationalLUSolverBind
2131 
2132  /// factorizes rational basis matrix in column representation
2133  void _factorizeColumnRational(SolRational& sol, DataArray< SPxSolver::VarStatus >& basisStatusRows, DataArray< SPxSolver::VarStatus >& basisStatusCols, bool& stoppedTime, bool& stoppedIter, bool& error, bool& optimal);
2134 
2135  /// attempts rational reconstruction of primal-dual solution
2136  bool _reconstructSolutionRational(SolRational& sol, DataArray< SPxSolver::VarStatus >& basisStatusRows, DataArray< SPxSolver::VarStatus >& basisStatusCols, const Rational& denomBoundSquared);
2137  //@}
2138 
2139 
2140  //**@name Private solving methods implemented in solvereal.cpp */
2141  //@{
2142 
2143  /// solves real LP
2144  void _optimizeReal();
2145 
2146  /// checks result of the solving process and solves again without preprocessing if necessary
2147  void _evaluateSolutionReal(SPxSimplifier::Result simplificationStatus);
2148 
2149  /// solves real LP with/without preprocessing
2150  void _preprocessAndSolveReal(bool applyPreprocessing);
2151 
2152  /// loads original problem into solver and solves again after it has been solved to optimality with preprocessing
2153  void _resolveWithoutPreprocessing(SPxSimplifier::Result simplificationStatus);
2154 
2155  /// verify computed solution and resolve if necessary
2156  void _verifySolutionReal();
2157 
2158  /// stores solution of the real LP; before calling this, the real LP must be loaded in the solver and solved (again)
2159  void _storeSolutionReal(bool verify = true);
2160 
2161  /// stores solution from the simplifier because problem vanished in presolving step
2163 
2164  /// unscales stored solution to remove internal or external scaling of LP
2165  void _unscaleSolutionReal(SPxLPReal& LP, bool persistent = true);
2166 
2167  /// load original LP and possibly setup a slack basis
2168  void _loadRealLP(bool initBasis);
2169 
2170  /// check scaling of LP
2171  void _checkScaling(SPxLPReal* origLP) const;
2172 
2173  /// check correctness of (un)scaled basis matrix operations
2174  void _checkBasisScaling();
2175 
2176  /// check whether persistent scaling is supposed to be reapplied again after unscaling
2177  bool _reapplyPersistentScaling() const;
2178 
2179  /// solves LP using the decomposition based dual simplex
2181 
2182  /// creating copies of the original problem that will be manipulated to form the reduced and complementary problems
2184 
2185  /// forms the reduced problem
2186  void _formDecompReducedProblem(bool& stop);
2187 
2188  /// solves the reduced problem
2190 
2191  /// forms the complementary problem
2193 
2194  /// simplifies the problem and solves
2195  void _decompSimplifyAndSolve(SPxSolver& solver, SLUFactor& sluFactor, bool fromScratch, bool applyPreprocessing);
2196 
2197  /// loads original problem into solver and solves again after it has been solved to optimality with preprocessing
2199 
2200  /// identifies the columns of the row-form basis that correspond to rows with zero dual multipliers.
2201  void _getZeroDualMultiplierIndices(Vector feasVector, int* nonposind, int* colsforremoval,
2202  int* nnonposind, bool& stop);
2203 
2204  /// retrieves the compatible columns from the constraint matrix
2205  void _getCompatibleColumns(Vector feasVector, int* nonposind, int* compatind, int* rowsforremoval, int* colsforremoval,
2206  int nnonposind, int* ncompatind, bool formRedProb, bool& stop);
2207 
2208  /// computes the reduced problem objective coefficients
2209  void _computeReducedProbObjCoeff(bool& stop);
2210 
2211  /// computes the compatible bound constraints and adds them to the reduced problem
2212  void _getCompatibleBoundCons(LPRowSet& boundcons, int* compatboundcons, int* nonposind, int* ncompatboundcons,
2213  int nnonposind, bool& stop);
2214 
2215  /// computes the rows to remove from the complementary problem
2216  void _getRowsForRemovalComplementaryProblem(int* nonposind, int* bind, int* rowsforremoval, int* nrowsforremoval,
2217  int nnonposind);
2218 
2219  /// removing rows from the complementary problem.
2220  void _deleteAndUpdateRowsComplementaryProblem(SPxRowId rangedRowIds[], int& naddedrows);
2221 
2222  /// evaluates the solution of the reduced problem for the DBDS
2223  void _evaluateSolutionDecomp(SPxSolver& solver, SLUFactor& sluFactor, SPxSimplifier::Result result);
2224 
2225  /// update the reduced problem with additional columns and rows
2226  void _updateDecompReducedProblem(Real objVal, DVector dualVector, DVector redcostVector, DVector compPrimalVector,
2227  DVector compDualVector);
2228 
2229  /// update the reduced problem with additional columns and rows based upon the violated original bounds and rows
2230  void _updateDecompReducedProblemViol(bool allrows);
2231 
2232  /// builds the update rows with those violated in the complmentary problem
2233  void _findViolatedRows(Real compObjValue, DataArray<RowViolation>& violatedrows, int& nviolatedrows);
2234 
2235  /// update the dual complementary problem with additional columns and rows
2236  void _updateDecompComplementaryDualProblem(bool origObj);
2237 
2238  /// update the primal complementary problem with additional columns and rows
2239  void _updateDecompComplementaryPrimalProblem(bool origObj);
2240 
2241  /// checking the optimality of the original problem.
2242  void _checkOriginalProblemOptimality(Vector primalVector, bool printViol);
2243 
2244  /// updating the slack column coefficients to adjust for equality constraints
2246 
2247  /// updating the slack column coefficients to adjust for equality constraints
2249 
2250  /// removing the dual columns related to the fixed variables
2251  void _removeComplementaryDualFixedPrimalVars(int* currFixedVars);
2252 
2253  /// removing the dual columns related to the fixed variables
2254  void _identifyComplementaryDualFixedPrimalVars(int* currFixedVars);
2255 
2256  /// updating the dual columns related to the fixed primal variables.
2257  void _updateComplementaryDualFixedPrimalVars(int* currFixedVars);
2258 
2259  /// removing the dual columns related to the fixed variables
2260  void _identifyComplementaryPrimalFixedPrimalVars(int* currFixedVars);
2261 
2262  /// updating the dual columns related to the fixed primal variables.
2263  void _updateComplementaryPrimalFixedPrimalVars(int* currFixedVars);
2264 
2265  /// updating the complementary dual problem with the original objective function
2267 
2268  /// updating the complementary primal problem with the original objective function
2270 
2271  /// determining which bound the primal variables will be fixed to.
2272  int getOrigVarFixedDirection(int colNum);
2273 
2274  /// checks the dual feasibility of the current basis
2275  bool checkBasisDualFeasibility(Vector feasVec);
2276 
2277  /// returns the expected sign of the dual variables for the reduced problem
2278  DualSign getExpectedDualVariableSign(int rowNumber);
2279 
2280  /// returns the expected sign of the dual variables for the original problem
2281  DualSign getOrigProbDualVariableSign(int rowNumber);
2282 
2283  /// prints a display line of the flying table for the DBDS
2284  void printDecompDisplayLine(SPxSolver& solver, const SPxOut::Verbosity origVerb, bool force, bool forceHead);
2285 
2286  /// stores the problem statistics of the original problem
2288 
2289  /// stores the problem statistics of the original problem
2290  void printOriginalProblemStatistics(std::ostream& os);
2291 
2292  /// gets the coefficient of the slack variable in the primal complementary problem
2293  Real getCompSlackVarCoeff(int primalRowNum);
2294 
2295  /// gets violation of bounds; returns true on success
2296  bool getDecompBoundViolation(Real& maxviol, Real& sumviol);
2297 
2298  /// gets violation of constraints; returns true on success
2299  bool getDecompRowViolation(Real& maxviol, Real& sumviol);
2300 
2301  /// function call to terminate the decomposition simplex
2302  bool decompTerminate(Real timeLimit);
2303 
2304  /// function to build a basis for the original problem as given by the solution to the reduced problem
2305  void _writeOriginalProblemBasis(const char* filename, NameSet* rowNames, NameSet* colNames, bool cpxFormat);
2306 
2307  /// function to retrieve the original problem row basis status from the reduced and complementary problems
2308  void getOriginalProblemBasisRowStatus(DataArray< int >& degenerateRowNums,
2309  DataArray< SPxSolver::VarStatus >& degenerateRowStatus, int& nDegenerateRows, int& nNonBasicRows);
2310 
2311  /// function to retrieve the column status for the original problem basis from the reduced and complementary problems
2312  void getOriginalProblemBasisColStatus(int& nNonBasicCols);
2313 
2314  //@}
2315 };
2316 }
2317 #else
2318 #include "soplexlegacy.h"
2319 
2320 namespace soplex
2321 {
2322  typedef SoPlexLegacy SoPlex;
2323 }
2324 #endif
2325 #endif // _SOPLEX_H_
void changeLhsRational(const VectorRational &lhs)
changes left-hand side vector for constraints to lhs
Definition: soplex.cpp:2098
int _lastSolveMode
Definition: soplex.h:1809
const VectorRational & rhsRational() const
returns right-hand side vector
Definition: soplex.cpp:1157
floating-point check
Definition: soplex.h:1219
Fast shifting ratio test.
RangeType
type of bounds and sides
Definition: soplex.h:1641
const char * getRatiotesterName()
name of currently loaded ratiotester
Definition: soplex.cpp:5105
textbook ratio test without stabilization
Definition: soplex.h:1167
void getRowsRational(int start, int end, LPRowSetRational &lprowset) const
gets rows start, ..., end.
Definition: soplex.cpp:1139
const VectorReal & maxObjRealInternal() const
returns objective function vector after transformation to a maximization problem; since this is how i...
Definition: soplex.cpp:1033
void _computeBasisInverseRational()
computes rational inverse of basis matrix as defined by _rationalLUSolverBind
void _checkScaling(SPxLPReal *origLP) const
check scaling of LP
Definition: testsoplex.cpp:26
bool multBasisTranspose(Real *vec, bool unscale=true)
multiply with transpose of basis matrix; vec * B^T (inplace)
Definition: soplex.cpp:4766
void _changeUpperReal(const VectorReal &upper)
changes vector of upper bounds to upper and adjusts basis
Definition: soplex.cpp:7662
int _nCompPrimalCols
Definition: soplex.h:1769
accuracy of conjugate gradient method in least squares scaling (higher value leads to more iterations...
Definition: soplex.h:1337
SoPlex start basis generation base class.
zero tolerance used in factorization
Definition: soplex.h:1280
void getUpperReal(DVectorReal &upper) const
gets upper bound vector
Definition: soplex.cpp:977
Rational _rationalMaxscaleincr
Definition: soplex.h:1558
Bound flipping ratio test ("long step dual") for SoPlex.Class SPxBoundFlippingRT provides an implemen...
DVectorRational _unboundedRhs
Definition: soplex.h:1620
bool _reapplyPersistentScaling() const
check whether persistent scaling is supposed to be reapplied again after unscaling ...
Definition: solvereal.cpp:84
void printVersion() const
prints version and compilation options
Definition: soplex.cpp:6835
SoPlex()
default constructor
Definition: soplex.cpp:559
bool getDualViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of dual multipliers; returns true on success
Definition: soplex.cpp:3554
Types of solution classes.
SolRational _workSol
Definition: soplex.h:1816
void printSolutionStatistics(std::ostream &os)
prints solution statistics
Definition: soplex.cpp:6642
refactor threshold for memory growth in factorization since last refactorization
Definition: soplex.h:1334
void _transformEquality()
introduces slack variables to transform inequality constraints into equations for both rational and r...
SPxColId _compSlackColId
Definition: soplex.h:1731
void _updateComplementaryPrimalSlackColCoeff()
updating the slack column coefficients to adjust for equality constraints
Implementation of Sparse Linear Solver with Rational precision.This class implements a SLinSolverRati...
bool getDualNorms(int &nnormsRow, int &nnormsCol, Real *norms) const
gets steepest edge norms and returns false if they are not available
Definition: soplex.cpp:1060
void _addColReal(const LPColReal &lpcol)
adds a single column to the real LP and adjusts basis
Definition: soplex.cpp:7366
int numRowsReal() const
returns number of rows
Definition: soplex.cpp:793
bool getBasisInverseRowReal(int r, Real *coef, int *inds=NULL, int *ninds=NULL, bool unscale=true)
computes row r of basis inverse; returns true on success
Definition: soplex.cpp:4100
Rational minAbsNonzeroRational() const
returns smallest non-zero element in absolute value
Definition: soplex.cpp:1112
void removeRowsRational(int perm[])
removes all rows with an index i such that perm[i] < 0; upon completion, perm[i] >= 0 indicates the n...
Definition: soplex.cpp:2600
int _nDecompViolRows
Definition: soplex.h:1756
type of starter used to create crash basis
Definition: soplex.h:974
void removeColsReal(int perm[])
removes all columns with an index i such that perm[i] < 0; upon completion, perm[i] >= 0 indicates th...
Definition: soplex.cpp:1810
const RowViolation * entry
Definition: soplex.h:1688
void _optimizeReal()
solves real LP
Definition: solvereal.cpp:29
const Settings & settings() const
returns current parameter settings
Definition: soplex.cpp:5566
upper limit on objective value
Definition: soplex.h:1298
Devex pricer.The Devex Pricer for SoPlex implements an approximate steepest edge pricing, that does without solving an extra linear system and computing the scalar products.
Definition: spxdevexpr.h:43
void _updateDecompReducedProblem(Real objVal, DVector dualVector, DVector redcostVector, DVector compPrimalVector, DVector compDualVector)
update the reduced problem with additional columns and rows
Definition: solvedbds.cpp:1116
void _changeElementReal(int i, int j, const Real &val)
changes matrix entry in row i and column j to val and adjusts basis
Definition: soplex.cpp:7753
void _transformUnbounded()
transforms LP to unboundedness problem by moving the objective function to the constraints, changing right-hand side and bounds to zero, and adding an auxiliary variable for the decrease in the objective function
general zero tolerance
Definition: soplex.h:1277
Result
Result of the simplification.
Definition: spxsimplifier.h:81
mode for solution polishing
Definition: soplex.h:1007
Real _realParamValues[SoPlex::REALPARAM_COUNT]
array of current real parameter values
Definition: soplex.h:1424
void _changeRangeReal(const VectorReal &lhs, const VectorReal &rhs)
changes left- and right-hand side vectors and adjusts basis
Definition: soplex.cpp:7544
type of ratio test
Definition: soplex.h:980
void removeColReal(int i)
removes column i
Definition: soplex.cpp:1784
Steepest edge pricer.Class SPxSteepExPR implements a steepest edge pricer to be used with SoPlex...
Definition: spxsteepexpr.h:40
maximum increase of scaling factors between refinements
Definition: soplex.h:1307
SPxMainSM _simplifierMainSM
Definition: soplex.h:1568
Geometric mean row/column scaling.This SPxScaler implementation performs geometric mean scaling of th...
Definition: spxgeometsc.h:35
Real maxAbsNonzeroReal() const
returns biggest non-zero element in absolute value
Definition: soplex.cpp:829
verbosity level
Definition: soplex.h:965
continue iterative refinement with exact basic solution if not optimal?
Definition: soplex.h:919
int origCountLower
Definition: soplex.h:1789
type of timer
Definition: soplex.h:995
const SVectorReal & colVectorRealInternal(int i) const
returns vector of col i, ignoring scaling
Definition: soplex.cpp:941
int numRedProbIter
Definition: soplex.h:1779
DVectorRational _feasLhs
Definition: soplex.h:1623
void _findViolatedRows(Real compObjValue, DataArray< RowViolation > &violatedrows, int &nviolatedrows)
builds the update rows with those violated in the complmentary problem
Definition: solvedbds.cpp:1460
DataArray< SPxRowId > _decompPrimalRowIDs
Definition: soplex.h:1741
DataArray< SPxRowId > _decompElimPrimalRowIDs
Definition: soplex.h:1743
number of real parameters
Definition: soplex.h:1343
apply standard floating-point algorithm
Definition: soplex.h:1206
int origCountRhs
Definition: soplex.h:1795
void _checkOriginalProblemOptimality(Vector primalVector, bool printViol)
checking the optimality of the original problem.
Definition: solvedbds.cpp:2691
void _removeComplementaryDualFixedPrimalVars(int *currFixedVars)
removing the dual columns related to the fixed variables
Definition: solvedbds.cpp:2841
type of computational form, i.e., column or row representation
Definition: soplex.h:941
void changeColRational(int i, const LPColRational &lpcol)
replaces column i with lpcol
Definition: soplex.cpp:2281
void _setComplementaryPrimalOriginalObjective()
updating the complementary primal problem with the original objective function
Definition: solvedbds.cpp:3179
bool getBasisIndRational(DataArray< int > &bind)
gets an array of indices for the columns of the rational basis matrix; bind[i] >= 0 means that the i-...
Definition: soplex.cpp:4902
Abstract pricer base class.
bool getPrimalReal(VectorReal &vector)
gets the primal solution vector if available; returns true on success
Definition: soplex.cpp:2969
int origCountUpper
Definition: soplex.h:1790
pivot zero tolerance used in factorization
Definition: soplex.h:1286
equilibrium scaling on rows or columns
Definition: soplex.h:1110
int numRowsRational() const
returns number of rows
Definition: soplex.cpp:1085
bool writeDualFileReal(const char *filename, const NameSet *rowNames=0, const NameSet *colNames=0, const DIdxSet *intvars=0) const
writes the dual of the real LP to file; LP or MPS format is chosen from the extension in filename; if...
Definition: soplex.cpp:5177
SPxSolver::Status solve()
Definition: soplex.h:573
objective offset
Definition: soplex.h:1340
DataArray< SPxRowId > _decompReducedProbColRowIDs
Definition: soplex.h:1739
refinement limit (-1 if unlimited)
Definition: soplex.h:956
bool getDualRational(VectorRational &vector)
gets the dual solution vector if available; returns true on success
Definition: soplex.cpp:3324
class of parameter settings
Definition: soplex.h:1356
SPxLPRational * _rationalLP
Definition: soplex.h:1612
void printShortStatistics(std::ostream &os)
prints short statistics
Definition: soplex.cpp:6731
Solution vector based start basis.
Real coefReal(int row, int col) const
returns (unscaled) coefficient
Definition: soplex.cpp:838
bool getSlacksRational(VectorRational &vector)
gets the vector of slack values if available; returns true on success
Definition: soplex.cpp:3294
standard Harris ratio test
Definition: soplex.h:1170
bool multBasis(Real *vec, bool unscale=true)
multiply with basis matrix; B * vec (inplace)
Definition: soplex.cpp:4656
void getColsRational(int start, int end, LPColSetRational &lpcolset) const
gets columns start, ..., end
Definition: soplex.cpp:1211
SPxSolver::Status _solveRealStable(bool acceptUnbounded, bool acceptInfeasible, VectorReal &primal, VectorReal &dual, DataArray< SPxSolver::VarStatus > &basisStatusRows, DataArray< SPxSolver::VarStatus > &basisStatusCols, bool &returnedBasis, const bool forceNoSimplifier=false)
solves real LP with recovery mechanism
int totalSizePrimalRational(const int base=2)
get size of primal solution
Definition: soplex.cpp:3760
void _addColsReal(const LPColSetReal &lpcolset)
adds multiple columns to the real LP and adjusts basis
Definition: soplex.cpp:7409
unsigned int randomSeed() const
returns the current random seed of the solver instance
Definition: soplex.cpp:7142
LPRowSet _transformedRows
Definition: soplex.h:1730
int _nDecompViolBounds
Definition: soplex.h:1755
DVector _transformedObj
Definition: soplex.h:1728
time limit in seconds (INFTY if unlimited)
Definition: soplex.h:1292
mode for iterative refinement strategy
Definition: soplex.h:989
SPxGeometSC _scalerGeo8
Definition: soplex.h:1572
void changeRangeReal(const VectorReal &lhs, const VectorReal &rhs)
changes left- and right-hand side vectors
Definition: soplex.cpp:1478
Rational _rationalFeastol
Definition: soplex.h:1556
void writeStateReal(const char *filename, const NameSet *rowNames=0, const NameSet *colNames=0, const bool cpxFormat=false) const
writes internal LP, basis information, and parameter settings; if rowNames and colNames are NULL...
Definition: soplex.cpp:5483
void _removeColsReal(int perm[])
removes all columns with an index i such that perm[i] < 0; upon completion, perm[i] >= 0 indicates th...
Definition: soplex.cpp:7869
modified Harris ratio test
Definition: soplex.h:1173
virtual ~SoPlex()
destructor
Definition: soplex.cpp:752
bool getRedCostRational(VectorRational &vector)
gets the vector of reduced cost values if available; returns true on success
Definition: soplex.cpp:3339
LP geometric mean scaling.
int _unscaleCalls
Definition: soplex.h:1828
crash basis from a greedy solution
Definition: soplex.h:1135
primal feasibility tolerance
Definition: soplex.h:1271
static struct soplex::SoPlex::Settings::RealParam realParam
Definition: soplex.cpp:553
standard verbosity level
Definition: soplex.h:1084
bound flipping ratio test for long steps in the dual simplex
Definition: soplex.h:1176
void _storeSolutionRealFromPresol()
stores solution from the simplifier because problem vanished in presolving step
Definition: solvereal.cpp:560
bool writeBasisFile(const char *filename, const NameSet *rowNames=0, const NameSet *colNames=0, const bool cpxFormat=false) const
writes basis information to filename; if rowNames and colNames are NULL, default names are used; retu...
Definition: soplex.cpp:5385
Abstract ratio test base class.
void _addRowReal(const LPRowReal &lprow)
adds a single row to the real LP and adjusts basis
Definition: soplex.cpp:7313
DVectorRational _feasLower
Definition: soplex.h:1625
DVectorRational _feasRhs
Definition: soplex.h:1624
bool defaultValue[SoPlex::BOOLPARAM_COUNT]
array of default values for boolean parameters
Definition: soplex.h:1367
SPxScaler * _scaler
Definition: soplex.h:1591
std::string name[SoPlex::BOOLPARAM_COUNT]
array of names for boolean parameters
Definition: soplex.h:1363
cpu or user time
Definition: soplex.h:1235
bool readBasisFile(const char *filename, const NameSet *rowNames=0, const NameSet *colNames=0)
reads basis information from filename and returns true on success; if rowNames and colNames are NULL...
Definition: soplex.cpp:5192
void changeRangeRational(const VectorRational &lhs, const VectorRational &rhs)
changes left- and right-hand side vectors
Definition: soplex.cpp:2221
Least squares scaling.This SPxScaler implementation performs least squares scaling as suggested by Cu...
Definition: spxleastsqsc.h:38
mode for reading LP files
Definition: soplex.h:986
mode for synchronizing real and rational LP
Definition: soplex.h:983
void _syncLPReal(bool time=true)
synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP...
Definition: soplex.cpp:8251
void _optimizeRational()
solves rational LP
bool getDualFarkasReal(VectorReal &vector)
gets the Farkas proof if available; returns true on success
Definition: soplex.cpp:3044
void resetSettings(const bool quiet=false, const bool init=true)
resets default parameter settings
Definition: soplex.cpp:6186
automatic sync of real and rational LP
Definition: soplex.h:1186
void _recomputeRangeTypesRational()
recomputes range types from scratch using rational LP
Definition: soplex.cpp:8238
void _unscaleSolutionReal(SPxLPReal &LP, bool persistent=true)
unscales stored solution to remove internal or external scaling of LP
Definition: solvereal.cpp:641
iteration limit (-1 if unlimited)
Definition: soplex.h:953
void _transformFeasibility()
transforms LP to feasibility problem by removing the objective function, shifting variables...
void changeObjReal(const VectorReal &obj)
changes objective function vector to obj
Definition: soplex.cpp:1645
void changeRowRational(int i, const LPRowRational &lprow)
replaces row i with lprow
Definition: soplex.cpp:2078
Implementation of Sparse Linear Solver.
bool getRowViolationReal(Real &maxviol, Real &sumviol)
gets violation of constraints; returns true on success
Definition: soplex.cpp:3098
SPxFastRT _ratiotesterFast
Definition: soplex.h:1585
should cycling solutions be accepted during iterative refinement?
Definition: soplex.h:910
void _disableSimplifierAndScaler()
disables simplifier and scaler
Definition: soplex.cpp:7965
bool getRowViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of constraints; returns true on success
Definition: soplex.cpp:3420
static struct soplex::SoPlex::Settings::IntParam intParam
Definition: soplex.cpp:552
should the decomposition based dual simplex be used to solve the LP? Setting this to true forces the ...
Definition: soplex.h:898
DataArray< SPxSolver::VarStatus > _storedBasisStatusCols
Definition: soplex.h:1634
Real lowerReal(int i) const
returns lower bound of column i
Definition: soplex.cpp:995
bool getBasisInverseRowRational(const int r, SSVectorRational &vec)
computes row r of basis inverse; performs rational factorization if not available; returns true on su...
Definition: soplex.cpp:4918
Implementation of Sparse Linear Solver with Rational precision.
bool * _decompReducedProbCols
Definition: soplex.h:1734
int _nDualCols
Definition: soplex.h:1767
void _performFeasIRStable(SolRational &sol, bool &withDualFarkas, bool &stopped, bool &stoppedIter, bool &error)
performs iterative refinement on the auxiliary problem for testing feasibility
NameSet * _rowNames
Definition: soplex.h:1773
void _removeRowReal(int i)
removes row i and adjusts basis
Definition: soplex.cpp:7776
lower bound is finite, upper bound is infinite
Definition: soplex.h:1647
void _storeBasis()
store basis
bool _readFileReal(const char *filename, NameSet *rowNames=0, NameSet *colNames=0, DIdxSet *intVars=0)
reads real LP in LP or MPS format from file and returns true on success; gets row names...
Definition: soplex.cpp:8124
decide according to problem size
Definition: soplex.h:1248
SoPlex start basis generation base class.SPxStarter is the virtual base class for classes generating ...
Definition: spxstarter.h:41
int _nElimPrimalRows
Definition: soplex.h:1765
void addColsRational(const LPColSetRational &lpcolset)
adds multiple columns
Definition: soplex.cpp:2059
Real upperReal(int i) const
returns upper bound of column i
Definition: soplex.cpp:968
void _computeReducedProbObjCoeff(bool &stop)
computes the reduced problem objective coefficients
Definition: solvedbds.cpp:1792
void getColRational(int i, LPColRational &lpcol) const
gets column i
Definition: soplex.cpp:1202
const char * getStarterName()
name of starter
Definition: soplex.cpp:5064
DVectorReal _manualObj
Definition: soplex.h:1603
int origCountBoxed
Definition: soplex.h:1791
objective sense
Definition: soplex.h:938
Dantzig pricer.
void _checkBasisScaling()
check correctness of (un)scaled basis matrix operations
Definition: testsoplex.cpp:89
SPxSolver::Status _solveRealForRational(bool fromscratch, VectorReal &primal, VectorReal &dual, DataArray< SPxSolver::VarStatus > &basisStatusRows, DataArray< SPxSolver::VarStatus > &basisStatusCols, bool &returnedBasis)
solves real LP during iterative refinement
int getOrigVarFixedDirection(int colNum)
determining which bound the primal variables will be fixed to.
Definition: solvedbds.cpp:3197
General methods in LP preprocessing.
void _untransformUnbounded(SolRational &sol, bool unbounded)
undoes transformation to unboundedness problem
bool readFile(const char *filename, NameSet *rowNames=0, NameSet *colNames=0, DIdxSet *intVars=0)
reads LP file in LP or MPS format according to READMODE parameter; gets row names, column names, and integer variables if desired; returns true on success
Definition: soplex.cpp:5114
Ids for LP columns.Class SPxColId provides DataKeys for the column indices of an SPxLP.
Definition: spxid.h:36
display frequency
Definition: soplex.h:962
void _ensureRationalLP()
ensures that the rational LP is available; performs no sync
Definition: soplex.cpp:7979
minimum number of stalling refinements since last pivot to trigger rational factorization ...
Definition: soplex.h:1001
Auto pricer.This pricer switches between Devex and Steepest edge pricer based on the difficulty of th...
Definition: spxautopr.h:41
minimal reduction (sum of removed rows/cols) to continue simplification
Definition: soplex.h:1325
void getRowVectorReal(int i, DSVectorReal &row) const
gets vector of row i
Definition: soplex.cpp:861
Wrapper for GMP type mpq_class.We wrap mpq_class so that we can replace it by a double type if GMP is...
Definition: rational.h:45
bool setSettings(const Settings &newSettings, const bool init=true)
sets parameter settings; returns true on success
Definition: soplex.cpp:6158
void _changeRhsReal(const VectorReal &rhs)
changes right-hand side vector to rhs and adjusts basis
Definition: soplex.cpp:7502
void changeElementReal(int i, int j, const Real &val)
changes matrix entry in row i and column j to val
Definition: soplex.cpp:1677
Devex pricer.
disable timing
Definition: soplex.h:1232
void printStatistics(std::ostream &os)
prints complete statistics
Definition: soplex.cpp:6742
Real rhsReal(int i) const
returns right-hand side of row i
Definition: soplex.cpp:896
bool getDecompBoundViolation(Real &maxviol, Real &sumviol)
gets violation of bounds; returns true on success
Definition: solvedbds.cpp:3604
should a rational factorization be performed after iterative refinement?
Definition: soplex.h:894
int origCountRanged
Definition: soplex.h:1796
mode for hyper sparse pricing
Definition: soplex.h:998
void _getCompatibleBoundCons(LPRowSet &boundcons, int *compatboundcons, int *nonposind, int *ncompatboundcons, int nnonposind, bool &stop)
computes the compatible bound constraints and adds them to the reduced problem
Definition: solvedbds.cpp:1858
void getRhsReal(DVectorReal &rhs) const
gets right-hand side vector
Definition: soplex.cpp:887
maximum number of updates without fresh factorization
Definition: soplex.h:950
SPxSolver _compSolver
Definition: soplex.h:1720
void removeColRangeRational(int start, int end, int perm[]=0)
removes columns start to end including both; an array perm of size numColsRational() may be passed as...
Definition: soplex.cpp:2744
void changeUpperRational(const VectorRational &upper)
changes vector of upper bounds to upper
Definition: soplex.cpp:2361
bool _boolParamValues[SoPlex::BOOLPARAM_COUNT]
array of current boolean parameter values
Definition: soplex.h:1418
Rational _rationalPosInfty
Definition: soplex.h:1554
int numDecompIter
Definition: soplex.h:1778
number of integer parameters
Definition: soplex.h:1025
DataArray< SPxColId > _decompCompPrimalColIDs
Definition: soplex.h:1753
Rational _rationalOpttol
Definition: soplex.h:1557
RealParam
real parameters
Definition: soplex.h:1268
bool setDualNorms(int nnormsRow, int nnormsCol, Real *norms)
sets steepest edge norms and returns false if that&#39;s not possible
Definition: soplex.cpp:1068
static struct soplex::SoPlex::Settings::BoolParam boolParam
Definition: soplex.cpp:551
LP simplification base class.
const VectorRational & lhsRational() const
returns left-hand side vector
Definition: soplex.cpp:1175
bool writeFileRational(const char *filename, const NameSet *rowNames=0, const NameSet *colNames=0, const DIdxSet *intvars=0) const
writes rational LP to file; LP or MPS format is chosen from the extension in filename; if rowNames an...
Definition: soplex.cpp:5158
SPxEquiliSC _scalerBiequi
Definition: soplex.h:1570
int numNonzerosRational() const
returns number of nonzeros
Definition: soplex.cpp:1103
steepest edge pricer with exact initialization of norms
Definition: soplex.h:1160
int origCountFreeRow
Definition: soplex.h:1797
DataArray< SPxColId > _decompReducedProbColIDs
Definition: soplex.h:1740
bool isDualFeasible() const
is stored dual solution feasible?
Definition: soplex.cpp:2924
full verbosity level
Definition: soplex.h:1090
only error, warning, and debug output
Definition: soplex.h:1081
Partial multiple pricing.Class SPxParMultPr is an implementation class for SPxPricer implementing Dan...
Definition: spxparmultpr.h:47
void removeColRangeReal(int start, int end, int perm[]=0)
removes columns start to end including both; an array perm of size numColsReal() may be passed as buf...
Definition: soplex.cpp:1858
void addColReal(const LPCol &lpcol)
adds a single column
Definition: soplex.cpp:1349
Rational objRational(int i) const
returns objective value of column i
Definition: soplex.cpp:1284
void clearLPRational()
clears the LP
Definition: soplex.cpp:2762
void _solveDecompReducedProblem()
solves the reduced problem
DVectorRational _modLhs
Definition: soplex.h:1629
DataArray< SPxRowId > _decompReducedProbRowIDs
Definition: soplex.h:1738
DVectorReal _manualLower
Definition: soplex.h:1599
void _removeColRangeReal(int start, int end, int perm[])
removes columns start to end including both; an array perm of size numColsReal() may be passed as buf...
void addRowsRational(const LPRowSetRational &lprowset)
adds multiple rows
Definition: soplex.cpp:1973
void printOriginalProblemStatistics(std::ostream &os)
stores the problem statistics of the original problem
Definition: solvedbds.cpp:3533
SPxSolver::Status optimize()
optimize the given LP
Definition: soplex.cpp:2797
Steepest edge pricer.
void getObjReal(VectorReal &obj) const
gets objective function vector
Definition: soplex.cpp:1014
void getLowerReal(DVectorReal &lower) const
gets lower bound vector
Definition: soplex.cpp:1004
void addRowRational(const LPRowRational &lprow)
adds a single row
Definition: soplex.cpp:1908
void addColRational(const LPColRational &lpcol)
adds a single column
Definition: soplex.cpp:1992
const UnitVectorRational * _unitVectorRational(const int i)
returns pointer to a constant unit vector available until destruction of the SoPlex class ...
Definition: soplex.cpp:8318
void _rangeToPerm(int start, int end, int *perm, int permSize) const
creates a permutation for removing rows/columns from a range of indices
Definition: soplex.cpp:7181
void _syncRealSolution()
synchronizes rational solution with real solution, i.e., copies (rounded) rational solution to real s...
Definition: soplex.cpp:8294
SLUFactor _compSlufactor
Definition: soplex.h:1724
void _formDecompReducedProblem(bool &stop)
forms the reduced problem
Definition: solvedbds.cpp:624
void removeColsRational(int perm[])
removes all columns with an index i such that perm[i] < 0; upon completion, perm[i] >= 0 indicates th...
Definition: soplex.cpp:2695
Fast shifting ratio test.Class SPxFastRT is an implementation class of SPxRatioTester providing fast ...
Definition: spxfastrt.h:41
refactor threshold for fill-in in current factor update compared to fill-in in last factorization ...
Definition: soplex.h:1331
void changeRhsRational(const VectorRational &rhs)
changes right-hand side vector to rhs
Definition: soplex.cpp:2158
standard floating-point parsing
Definition: soplex.h:1196
int dmaxSizeDualRational(const int base=2)
get size of largest denominator in dual solution
Definition: soplex.cpp:3830
void _ensureDSVectorRationalMemory(DSVectorRational &vec, const int newmax) const
extends sparse vector to hold newmax entries if and only if it holds no more free entries ...
Definition: soplex.cpp:7150
DataArray< SPxRowId > _decompCompPrimalRowIDs
Definition: soplex.h:1752
void _updateComplementaryPrimalFixedPrimalVars(int *currFixedVars)
updating the dual columns related to the fixed primal variables.
Definition: solvedbds.cpp:3071
int dlcmSizePrimalRational(const int base=2)
get size of least common multiple of denominators in primal solution
Definition: soplex.cpp:3788
Rational objValueRational()
returns the objective value if a primal solution is available
Definition: soplex.cpp:3248
void getBasis(SPxSolver::VarStatus rows[], SPxSolver::VarStatus cols[]) const
gets current basis via arrays of statuses
Definition: soplex.cpp:3934
DataArray< SPxSolver::VarStatus > _basisStatusCols
Definition: soplex.h:1812
DVectorRational _unboundedLower
Definition: soplex.h:1617
decide depending on tolerances whether to apply iterative refinement
Definition: soplex.h:1209
void getLhsReal(DVectorReal &lhs) const
gets left-hand side vector
Definition: soplex.cpp:914
decompStatus _currentProb
Definition: soplex.h:1800
DVectorReal _manualRhs
Definition: soplex.h:1602
bool isPrimalFeasible() const
is stored primal solution feasible?
Definition: soplex.cpp:2900
DataArray< RangeType > _colTypes
Definition: soplex.h:1659
type of scaler
Definition: soplex.h:971
automatic choice according to number of rows and columns
Definition: soplex.h:1042
double Real
Definition: spxdefines.h:215
Rational _rationalPosone
Definition: soplex.h:1830
void removeRowRangeReal(int start, int end, int perm[]=0)
removes rows start to end including both; an array perm of size numRowsReal() may be passed as buffer...
Definition: soplex.cpp:1766
SPxBoundFlippingRT _ratiotesterBoundFlipping
Definition: soplex.h:1586
bool _isRealLPLoaded
Definition: soplex.h:1594
SLUFactorRational _rationalLUSolver
Definition: soplex.h:1613
geometric mean scaling on rows and columns, max 8 rounds
Definition: soplex.h:1119
void _getZeroDualMultiplierIndices(Vector feasVector, int *nonposind, int *colsforremoval, int *nnonposind, bool &stop)
identifies the columns of the row-form basis that correspond to rows with zero dual multipliers...
Definition: solvedbds.cpp:1556
void getRowRational(int i, LPRowRational &lprow) const
gets row i
Definition: soplex.cpp:1130
void _solveRealLPAndRecordStatistics()
call floating-point solver and update statistics on iterations etc.
Definition: soplex.cpp:8019
void _evaluateSolutionDecomp(SPxSolver &solver, SLUFactor &sluFactor, SPxSimplifier::Result result)
evaluates the solution of the reduced problem for the DBDS
Definition: solvedbds.cpp:3226
number of boolean parameters
Definition: soplex.h:931
void _setComplementaryDualOriginalObjective()
updating the complementary dual problem with the original objective function
Definition: solvedbds.cpp:3109
SPxEquiliSC _scalerUniequi
Definition: soplex.h:1569
void printSolvingStatistics(std::ostream &os)
prints statistics on solving process
Definition: soplex.cpp:6722
bool _readFileRational(const char *filename, NameSet *rowNames=0, NameSet *colNames=0, DIdxSet *intVars=0)
reads rational LP in LP or MPS format from file and returns true on success; gets row names...
Definition: soplex.cpp:8165
lower threshold in lifting (nonzero matrix coefficients with smaller absolute value will be reformula...
Definition: soplex.h:1310
bool getPrimalRayReal(VectorReal &vector)
gets the primal ray if available; returns true on success
Definition: soplex.cpp:2999
bool hasPrimal() const
is a primal feasible solution available?
Definition: soplex.cpp:2908
void _decompSimplifyAndSolve(SPxSolver &solver, SLUFactor &sluFactor, bool fromScratch, bool applyPreprocessing)
simplifies the problem and solves
Definition: solvedbds.cpp:859
void changeLhsReal(const VectorReal &lhs)
changes left-hand side vector for constraints to lhs
Definition: soplex.cpp:1404
bool getDecompRowViolation(Real &maxviol, Real &sumviol)
gets violation of constraints; returns true on success
Definition: solvedbds.cpp:3682
int _beforeLiftCols
Definition: soplex.h:1638
greedy crash basis weighted by objective, bounds, and sides
Definition: soplex.h:1132
bool hasDualFarkas() const
is Farkas proof of infeasibility available?
Definition: soplex.cpp:2940
bool _isConsistent() const
checks consistency
Definition: soplex.cpp:7193
void _changeLowerReal(const VectorReal &lower)
changes vector of lower bounds to lower and adjusts basis
Definition: soplex.cpp:7620
void _getCompatibleColumns(Vector feasVector, int *nonposind, int *compatind, int *rowsforremoval, int *colsforremoval, int nnonposind, int *ncompatind, bool formRedProb, bool &stop)
retrieves the compatible columns from the constraint matrix
Definition: solvedbds.cpp:1632
void _performOptIRStable(SolRational &sol, bool acceptUnbounded, bool acceptInfeasible, int minRounds, bool &primalFeasible, bool &dualFeasible, bool &infeasible, bool &unbounded, bool &stopped, bool &stoppedIter, bool &error)
solves current problem with iterative refinement and recovery mechanism
the iteration frequency at which the decomposition solve output is displayed.
Definition: soplex.h:1016
dual simplex algorithm, i.e., leaving for column and entering for row representation ...
Definition: soplex.h:1058
LP simplification abstract base class.Instances of classes derived from SPxSimplifier may be loaded t...
Definition: spxsimplifier.h:41
steepest edge pricer with initialization to unit norms
Definition: soplex.h:1157
Rational maxAbsNonzeroRational() const
returns biggest non-zero element in absolute value
Definition: soplex.cpp:1121
use persistent scaling?
Definition: soplex.h:925
bool computeBasisInverseRational()
compute rational basis inverse; returns true on success
Definition: soplex.cpp:4874
bool _upperFinite(const RangeType &rangeType) const
checks whether RangeType corresponds to finite upper bound
Definition: soplex.cpp:7305
bool _hasBasis
Definition: soplex.h:1818
use bound flipping also for row representation?
Definition: soplex.h:922
bool hasBasis() const
is an advanced starting basis available?
Definition: soplex.cpp:3844
void _invalidateSolution()
invalidates solution
Definition: soplex.cpp:7904
preconfigured SoPlexLegacy LP-solver.
bool getBasisInverseColReal(int c, Real *coef, int *inds=NULL, int *ninds=NULL, bool unscale=true)
computes column c of basis inverse; returns true on success
Definition: soplex.cpp:4286
bool getDualViolationReal(Real &maxviol, Real &sumviol)
gets violation of dual multipliers; returns true on success
Definition: soplex.cpp:3194
bool getBasisInverseColRational(const int c, SSVectorRational &vec)
computes column c of basis inverse; performs rational factorization if not available; returns true on...
Definition: soplex.cpp:4942
Wrapper for several output streams. A verbosity level is used to decide which stream to use and wheth...
Definition: spxout.h:63
const char * getSimplifierName()
name of simplifier
Definition: soplex.cpp:5075
void changeLowerReal(const VectorReal &lower)
changes vector of lower bounds to lower
Definition: soplex.cpp:1534
void _restoreLPReal()
restores objective, bounds, and sides of real LP
void _project(SolRational &sol)
undoes lifting
const char * getPricerName()
name of currently loaded pricer
Definition: soplex.cpp:5097
print condition number during the solve
Definition: soplex.h:1022
void _performUnboundedIRStable(SolRational &sol, bool &hasUnboundedRay, bool &stopped, bool &stoppedIter, bool &error)
performs iterative refinement on the auxiliary problem for testing unboundedness
Rational _rationalNegone
Definition: soplex.h:1831
main LP solver class
SPxRowId _compSlackDualRowId
Definition: soplex.h:1732
DVectorRational _feasObj
Definition: soplex.h:1622
round scaling factors for iterative refinement to powers of two?
Definition: soplex.h:916
maximize number of basic slack variables, i.e. more variables on bounds
Definition: soplex.h:1261
SPxBasis::SPxStatus basisStatus() const
returns the current basis status
Definition: soplex.cpp:3852
void _computeInfeasBox(SolRational &sol, bool transformed)
void removeRowReal(int i)
removes row i
Definition: soplex.cpp:1692
Forrest-Tomlin type update.
Definition: soplex.h:1068
bool getBasisInverseTimesVecReal(Real *rhs, Real *sol, bool unscale=true)
computes dense solution of basis matrix B * sol = rhs; returns true on success
Definition: soplex.cpp:4491
int dlcmSizeDualRational(const int base=2)
get size of least common multiple of denominators in dual solution
Definition: soplex.cpp:3802
Auto pricer.
SPxWeightST _starterWeight
Definition: soplex.h:1574
Statistics * _statistics
statistics since last call to solveReal() or solveRational()
Definition: soplex.h:1541
void _evaluateSolutionReal(SPxSimplifier::Result simplificationStatus)
checks result of the solving process and solves again without preprocessing if necessary ...
Definition: solvereal.cpp:95
LPColSetRational _slackCols
Definition: soplex.h:1616
type of simplifier
Definition: soplex.h:968
int origCountFreeCol
Definition: soplex.h:1792
int numNonzeros
Definition: soplex.h:1785
Real getCompSlackVarCoeff(int primalRowNum)
gets the coefficient of the slack variable in the primal complementary problem
Definition: solvedbds.cpp:3556
void getColVectorReal(int i, DSVectorReal &col) const
gets vector of col i
Definition: soplex.cpp:950
DVectorRational _feasUpper
Definition: soplex.h:1626
void _removeRowsReal(int perm[])
removes all rows with an index i such that perm[i] < 0; upon completion, perm[i] >= 0 indicates the n...
Definition: soplex.cpp:7805
void _syncLPRational(bool time=true)
synchronizes rational LP with real LP, i.e., copies real LP to rational LP, without looking at the sy...
Definition: soplex.cpp:8275
void printUserSettings()
print non-default parameter values
Definition: soplex.cpp:6205
void changeBoundsReal(const VectorReal &lower, const VectorReal &upper)
changes vectors of column bounds to lower and upper
Definition: soplex.cpp:1609
RangeType _rangeTypeRational(const Rational &lower, const Rational &upper) const
determines RangeType from rational bounds
Definition: soplex.cpp:7259
SPxSteepPR _pricerQuickSteep
Definition: soplex.h:1581
int numColsRational() const
returns number of columns
Definition: soplex.cpp:1094
void syncLPReal()
synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP...
Definition: soplex.cpp:1897
bool _reconstructSolutionRational(SolRational &sol, DataArray< SPxSolver::VarStatus > &basisStatusRows, DataArray< SPxSolver::VarStatus > &basisStatusCols, const Rational &denomBoundSquared)
attempts rational reconstruction of primal-dual solution
SPxDantzigPR _pricerDantzig
Definition: soplex.h:1578
SPxParMultPR _pricerParMult
Definition: soplex.h:1579
bool getPrimalRational(VectorRational &vector)
gets the primal solution vector if available; returns true on success
Definition: soplex.cpp:3279
Solution vector based start basis.This version of SPxWeightST can be used to construct a starting bas...
Definition: spxvectorst.h:44
void changeObjRational(const VectorRational &obj)
changes objective function vector to obj
Definition: soplex.cpp:2481
std::string statisticString() const
statistical information in form of a string
Definition: soplex.cpp:5048
RangeType _switchRangeType(const RangeType &rangeType) const
switches RANGETYPE_LOWER to RANGETYPE_UPPER and vice versa
Definition: soplex.cpp:7284
SLUFactor _slufactor
Definition: soplex.h:1567
void _removeRowRangeReal(int start, int end, int perm[])
removes rows start to end including both; an array perm of size numRowsReal() may be passed as buffer...
Dynamic index set.Class DIdxSet provides dynamic IdxSet in the sense, that no restrictions are posed ...
Definition: didxset.h:42
void clearBasis()
clears starting basis
Definition: soplex.cpp:5021
const SVectorReal & rowVectorRealInternal(int i) const
returns vector of row i, ignoring scaling
Definition: soplex.cpp:852
void syncLPRational()
synchronizes rational LP with real LP, i.e., copies real LP to rational LP, if sync mode is manual ...
Definition: soplex.cpp:2786
bool getRedCostReal(VectorReal &vector)
gets the vector of reduced cost values if available; returns true on success
Definition: soplex.cpp:3029
DataArray< SPxColId > _decompPrimalColIDs
Definition: soplex.h:1742
Simple heuristic SPxStarter.
DVectorRational _modUpper
Definition: soplex.h:1628
void _decompResolveWithoutPreprocessing(SPxSolver &solver, SLUFactor &sluFactor, SPxSimplifier::Result result)
loads original problem into solver and solves again after it has been solved to optimality with prepr...
Definition: solvedbds.cpp:1031
int _nPrimalCols
Definition: soplex.h:1764
user sync of real and rational LP
Definition: soplex.h:1189
SPxSteepExPR _pricerSteep
Definition: soplex.h:1582
void _verifySolutionReal()
verify computed solution and resolve if necessary
Definition: solvereal.cpp:361
bool hasDual() const
is a dual feasible solution available?
Definition: soplex.cpp:2932
bool parseSettingsString(char *line)
parses one setting string and returns true on success; note that string is modified ...
Definition: soplex.cpp:6387
const VectorReal & upperRealInternal() const
returns upper bound vector
Definition: soplex.cpp:959
SPxOut spxout
Definition: soplex.h:1441
infinity threshold
Definition: soplex.h:1289
void changeBoundsRational(const VectorRational &lower, const VectorRational &upper)
changes vectors of column bounds to lower and upper
Definition: soplex.cpp:2421
const SVectorRational & colVectorRational(int i) const
returns vector of column i
Definition: soplex.cpp:1220
int numIterations() const
number of iterations since last call to solve
Definition: soplex.cpp:5032
SPxDefaultRT _ratiotesterTextbook
Definition: soplex.h:1583
void _loadRealLP(bool initBasis)
load original LP and possibly setup a slack basis
Definition: solvereal.cpp:627
(In)equality for LPs.Class LPRowBase provides constraints for linear programs in the form where a is...
Definition: lprowbase.h:45
Settings * _currentSettings
Definition: soplex.h:1552
bool getBasisInverseTimesVecRational(const SVectorRational &rhs, SSVectorRational &sol)
computes solution of basis matrix B * sol = rhs; performs rational factorization if not available; re...
Definition: soplex.cpp:4967
Real lhsReal(int i) const
returns left-hand side of row i
Definition: soplex.cpp:923
LPRowReal::Type rowTypeReal(int i) const
returns inequality type of row i
Definition: soplex.cpp:932
only error and warning output
Definition: soplex.h:1078
Sparse vector .A UnitVectorBase is an SVectorBase that can take only one nonzero value with value 1 b...
Bound flipping ratio test (long step dual) for SoPlex.
Preconfigured SoPlexLegacy LP-solver.
Definition: soplexlegacy.h:41
void getOriginalProblemBasisColStatus(int &nNonBasicCols)
function to retrieve the column status for the original problem basis from the reduced and complement...
Definition: solvedbds.cpp:3975
void _syncRationalSolution()
synchronizes real solution with rational solution, i.e., copies real solution to rational solution ...
Definition: soplex.cpp:8306
int _intParamValues[SoPlex::INTPARAM_COUNT]
array of current integer parameter values
Definition: soplex.h:1421
Debugging, floating point type and parameter definitions.
void _createDecompReducedAndComplementaryProblems()
creating copies of the original problem that will be manipulated to form the reduced and complementar...
Definition: solvedbds.cpp:591
Simplex basis.Consider the linear program as provided from class SPxLP: where , and ...
Definition: spxbasis.h:82
bool areLPsInSync(const bool checkVecVals=true, const bool checkMatVals=false, const bool quiet=false) const
checks if real LP and rational LP are in sync; dimensions will always be compared, vector and matrix values only if the respective parameter is set to true. If quiet is set to true the function will only display which vectors are different.
Definition: soplex.cpp:6875
Set of strings.Class NameSet implements a symbol or name table. It allows to store or remove names (i...
Definition: nameset.h:61
int _beforeLiftRows
Definition: soplex.h:1637
DataArray< SPxColId > _decompFixedVarDualIDs
Definition: soplex.h:1746
partial multiple pricer based on Dantzig pricing
Definition: soplex.h:1151
lower and upper bound finite, but different
Definition: soplex.h:1653
DualSign getOrigProbDualVariableSign(int rowNumber)
returns the expected sign of the dual variables for the original problem
Definition: solvedbds.cpp:3403
Sequential object-oriented SimPlex.SPxSolver is an LP solver class using the revised Simplex algorith...
Definition: spxsolver.h:84
DVectorReal _manualLhs
Definition: soplex.h:1601
equilibrium scaling on rows and columns
Definition: soplex.h:1113
bool _storedBasis
Definition: soplex.h:1636
minimize number of basic slack variables, i.e. more variables between bounds
Definition: soplex.h:1264
void _storeLPReal()
stores objective, bounds, and sides of real LP
LP least squares scaling.
Rational _rationalNegInfty
Definition: soplex.h:1555
const SVectorRational & rowVectorRational(int i) const
returns vector of row i
Definition: soplex.cpp:1148
DataArray< SPxColId > _decompCompPrimalFixedVarIDs
Definition: soplex.h:1749
void printStatus(std::ostream &os, SPxSolver::Status status)
prints status
Definition: soplex.cpp:6769
threshold on number of rows vs. number of columns for switching from column to row representations in...
Definition: soplex.h:1319
lower bound equals upper bound
Definition: soplex.h:1656
Collection of dense, sparse, and semi-sparse vectors.
column representation Ax - s = 0, lower <= x <= upper, lhs <= s <= rhs
Definition: soplex.h:1045
bool getSlacksReal(VectorReal &vector)
gets the vector of slack values if available; returns true on success
Definition: soplex.cpp:2984
Implementation of Sparse Linear Solver.This class implements a SLinSolver interface by using the spar...
Definition: slufactor.h:41
automatic pricer
Definition: soplex.h:1145
int * _decompViolatedRows
Definition: soplex.h:1758
DataArray< SPxColId > _decompVarBoundDualIDs
Definition: soplex.h:1747
DataArray< SPxRowId > _decompDualRowIDs
Definition: soplex.h:1744
Everything should be within this namespace.
bool setRealParam(const RealParam param, const Real value, const bool init=true)
sets real parameter value; returns true on success
Definition: soplex.cpp:5979
void _changeLhsReal(const VectorReal &lhs)
changes left-hand side vector for constraints to lhs and adjusts basis
Definition: soplex.cpp:7461
int numCompProbIter
Definition: soplex.h:1780
DVectorReal _manualUpper
Definition: soplex.h:1600
void _writeOriginalProblemBasis(const char *filename, NameSet *rowNames, NameSet *colNames, bool cpxFormat)
function to build a basis for the original problem as given by the solution to the reduced problem ...
Definition: solvedbds.cpp:4030
working tolerance for feasibility in floating-point solver during iterative refinement ...
Definition: soplex.h:1301
SPxLPReal * _realLP
Definition: soplex.h:1588
bool _lowerFinite(const RangeType &rangeType) const
checks whether RangeType corresponds to finite lower bound
Definition: soplex.cpp:7297
the maximum number of rows that are added in each iteration of the decomposition based simplex ...
Definition: soplex.h:1013
bool loadSettingsFile(const char *filename)
reads settings file; returns true on success
Definition: soplex.cpp:6338
SPxGeometSC _scalerGeo1
Definition: soplex.h:1571
void _preprocessAndSolveReal(bool applyPreprocessing)
solves real LP with/without preprocessing
Definition: solvereal.cpp:187
void _deleteAndUpdateRowsComplementaryProblem(SPxRowId rangedRowIds[], int &naddedrows)
removing rows from the complementary problem.
Definition: solvedbds.cpp:1998
int numNonzerosReal() const
returns number of nonzeros
Definition: soplex.cpp:811
SoPlex & operator=(const SoPlex &rhs)
assignment operator
Definition: soplex.cpp:619
Dantzig pricer.Class SPxDantzigPR is an implementation class of an SPxPricer implementing Dantzig&#39;s d...
Definition: spxdantzigpr.h:38
bool getRedCostViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of reduced costs; returns true on success
Definition: soplex.cpp:3473
Harris pricing with shifting.
SPxDevexPR _pricerDevex
Definition: soplex.h:1580
Real minAbsNonzero
Definition: soplex.h:1786
DVector _decompFeasVector
Definition: soplex.h:1729
Real objReal(int i) const
returns objective value of column i
Definition: soplex.cpp:1023
DataArray< RangeType > _rowTypes
Definition: soplex.h:1660
void _removeColReal(int i)
removes column i
Definition: soplex.cpp:7840
void _changeRowReal(int i, const LPRowReal &lprow)
replaces row i with lprow and adjusts basis
Definition: soplex.cpp:7436
void setIntegralityInformation(int ncols, int *intInfo)
pass integrality information about the variables to the solver
Definition: soplex.cpp:1076
DVectorRational _modObj
Definition: soplex.h:1631
SPxSumST _starterSum
Definition: soplex.h:1575
void getBasisInd(int *bind) const
gets the indices of the basic columns and rows; basic column n gives value n, basic row m gives value...
Definition: soplex.cpp:3974
row representation (lower,lhs) <= (x,Ax) <= (upper,rhs)
Definition: soplex.h:1048
apply rational reconstruction after each iterative refinement?
Definition: soplex.h:913
void _changeColReal(int i, const LPColReal &lpcol)
replaces column i with lpcol and adjusts basis
Definition: soplex.cpp:7593
void _formDecompComplementaryProblem()
forms the complementary problem
Definition: solvedbds.cpp:720
Real minAbsNonzeroReal() const
returns smallest non-zero element in absolute value
Definition: soplex.cpp:820
Weighted start basis.
type of pricer
Definition: soplex.h:977
Saving LPs in a form suitable for SoPlex.Class SPxLPBase provides the data structures required for sa...
Definition: spxlpbase.h:80
const VectorReal & lowerRealInternal() const
returns lower bound vector
Definition: soplex.cpp:986
bool getDualReal(VectorReal &vector)
gets the dual solution vector if available; returns true on success
Definition: soplex.cpp:3014
SPxHarrisRT _ratiotesterHarris
Definition: soplex.h:1584
int * _fixedOrigVars
Definition: soplex.h:1761
int * _decompRowStatus
Definition: soplex.h:1735
void changeColReal(int i, const LPColReal &lpcol)
replaces column i with lpcol
Definition: soplex.cpp:1515
Steepest edge pricer with exact initialization of weights.
working tolerance for optimality in floating-point solver during iterative refinement ...
Definition: soplex.h:1304
void clearLPReal()
clears the LP
Definition: soplex.cpp:1876
Preconfigured SoPlex LP-solver.
Definition: soplex.h:90
int _nCompPrimalRows
Definition: soplex.h:1768
should the dual of the complementary problem be used in the decomposition simplex?
Definition: soplex.h:904
void removeRowRational(int i)
removes row i
Definition: soplex.cpp:2573
Type
(In)Equality type of an LP row.
Definition: lprowbase.h:72
Real maxAbsNonzero
Definition: soplex.h:1787
DVectorRational _unboundedLhs
Definition: soplex.h:1619
void getOriginalProblemBasisRowStatus(DataArray< int > &degenerateRowNums, DataArray< SPxSolver::VarStatus > &degenerateRowStatus, int &nDegenerateRows, int &nNonBasicRows)
function to retrieve the original problem row basis status from the reduced and complementary problem...
Definition: solvedbds.cpp:3785
DSVectorRational _primalDualDiff
Definition: soplex.h:1632
int _decompDisplayLine
Definition: soplex.h:1771
SPxVectorST _starterVector
Definition: soplex.h:1576
LP scaling base class.
DVectorRational _unboundedUpper
Definition: soplex.h:1618
bool getBoundViolationReal(Real &maxviol, Real &sumviol)
gets violation of bounds; returns true on success
Definition: soplex.cpp:3059
bool writeFileReal(const char *filename, const NameSet *rowNames=0, const NameSet *colNames=0, const DIdxSet *intvars=0, const bool unscale=true) const
writes real LP to file; LP or MPS format is chosen from the extension in filename; if rowNames and co...
Definition: soplex.cpp:5132
Simple heuristic SPxStarter.Testing version of an SPxVectorST using a very simplistic heuristic to bu...
Definition: spxsumst.h:37
const VectorRational & upperRational() const
returns upper bound vector
Definition: soplex.cpp:1229
NameSet * _colNames
Definition: soplex.h:1774
Weighted start basis.Class SPxWeightST is an implementation of a SPxStarter for generating a Simplex ...
Definition: spxweightst.h:56
decide according to READMODE
Definition: soplex.h:1222
SPxSolver _solver
Definition: soplex.h:1566
mode for a posteriori feasibility checks
Definition: soplex.h:992
refactor threshold for nonzeros in last factorized basis matrix compared to updated basis matrix ...
Definition: soplex.h:1328
void printDecompDisplayLine(SPxSolver &solver, const SPxOut::Verbosity origVerb, bool force, bool forceHead)
prints a display line of the flying table for the DBDS
Definition: solvedbds.cpp:3423
Partial multiple pricing.
Verbosity
Verbosity level.
Definition: spxout.h:72
void _resolveWithoutPreprocessing(SPxSimplifier::Result simplificationStatus)
loads original problem into solver and solves again after it has been solved to optimality with prepr...
Definition: solvereal.cpp:288
void _identifyComplementaryPrimalFixedPrimalVars(int *currFixedVars)
removing the dual columns related to the fixed variables
Definition: solvedbds.cpp:3042
int _optimizeCalls
Definition: soplex.h:1827
LPRowRational::Type rowTypeRational(int i) const
returns inequality type of row i
Definition: soplex.cpp:1193
Textbook ratio test for SoPlex.Class SPxDefaultRT provides an implementation of the textbook ratio te...
Definition: spxdefaultrt.h:42
type of algorithm, i.e., primal or dual
Definition: soplex.h:944
bool * _decompReducedProbRows
Definition: soplex.h:1733
void _recomputeRangeTypesReal()
recomputes range types from scratch using real LP
Definition: soplex.cpp:8225
void _getRowsForRemovalComplementaryProblem(int *nonposind, int *bind, int *rowsforremoval, int *nrowsforremoval, int nnonposind)
computes the rows to remove from the complementary problem
Definition: solvedbds.cpp:1978
DataArray< UnitVectorRational *> _unitMatrixRational
Definition: soplex.h:1635
bool getDualFarkasRational(VectorRational &vector)
gets the Farkas proof if LP is infeasible; returns true on success
Definition: soplex.cpp:3354
LP scaler abstract base class.Instances of classes derived from SPxScaler may be loaded to SoPlex in ...
Definition: spxscaler.h:75
stalling refinement limit (-1 if unlimited)
Definition: soplex.h:959
DataArray< SPxSolver::VarStatus > _basisStatusRows
Definition: soplex.h:1811
Set of LP rows.Class LPRowSetBase implements a set of LPRowBase%s. Unless for memory limitations...
Definition: lprowsetbase.h:44
int origCountLhs
Definition: soplex.h:1794
SPxSolver::VarStatus basisColStatus(int col) const
returns basis status for a single column
Definition: soplex.cpp:3898
void _solveDecompositionDualSimplex()
solves LP using the decomposition based dual simplex
Definition: solvedbds.cpp:48
should dual infeasibility be tested in order to try to return a dual solution even if primal infeasib...
Definition: soplex.h:891
void getNdualNorms(int &nnormsRow, int &nnormsCol) const
gets number of available dual norms
Definition: soplex.cpp:1052
void _factorizeColumnRational(SolRational &sol, DataArray< SPxSolver::VarStatus > &basisStatusRows, DataArray< SPxSolver::VarStatus > &basisStatusCols, bool &stoppedTime, bool &stoppedIter, bool &error, bool &optimal)
factorizes rational basis matrix in column representation
bool getFastCondition(Real &condition, int type=0)
compute condition number estimate based on the diagonal of the LU factorization; returns true on succ...
Definition: soplex.cpp:4055
generic solution-based crash basis
Definition: soplex.h:1138
std::string description[SoPlex::BOOLPARAM_COUNT]
array of descriptions for boolean parameters
Definition: soplex.h:1365
SPxBasis _decompTransBasis
Definition: soplex.h:1726
const VectorReal & rhsRealInternal() const
returns right-hand side vector, ignoring scaling
Definition: soplex.cpp:878
the verbosity of the decomposition based simplex
Definition: soplex.h:1019
should lifting be used to reduce range of nonzero matrix coefficients?
Definition: soplex.h:885
int dmaxSizePrimalRational(const int base=2)
get size of largest denominator in primal solution
Definition: soplex.cpp:3816
bool getEstimatedCondition(Real &condition)
computes an estimated condition number for the current basis matrix using the power method; returns t...
Definition: soplex.cpp:4070
Real maxObjReal(int i) const
returns objective value of column i after transformation to a maximization problem; since this is how...
Definition: soplex.cpp:1043
void _storeSolutionReal(bool verify=true)
stores solution of the real LP; before calling this, the real LP must be loaded in the solver and sol...
Definition: solvereal.cpp:412
void setRandomSeed(unsigned int seed)
set the random seeds of the solver instance
Definition: soplex.cpp:7134
DataArray< int > _rationalLUSolverBind
Definition: soplex.h:1614
should the degeneracy be computed for each basis?
Definition: soplex.h:901
bool _applyPolishing
Definition: soplex.h:1597
bool getExactCondition(Real &condition)
computes the exact condition number for the current basis matrix using the power method; returns true...
Definition: soplex.cpp:4085
SPxStatus
basis status.
Definition: spxbasis.h:90
const char * getScalerName()
name of scaling method
Definition: soplex.cpp:5086
Real solveTime() const
time spent in last call to solve
Definition: soplex.cpp:5040
void addColsReal(const LPColSetReal &lpcolset)
adds multiple columns
Definition: soplex.cpp:1367
int _nDualRows
Definition: soplex.h:1766
SPxSolver::Status status() const
returns the current solver status
Definition: soplex.cpp:2892
SolReal _solReal
Definition: soplex.h:1814
zero tolerance used in update of the factorization
Definition: soplex.h:1283
lower limit on objective value
Definition: soplex.h:1295
void changeLowerRational(const VectorRational &lower)
changes vector of lower bounds to lower
Definition: soplex.cpp:2301
DSVectorRational _tauColVector
Definition: soplex.h:1621
DVectorRational _modLower
Definition: soplex.h:1627
both bounds are infinite
Definition: soplex.h:1644
bool getRedCostViolationReal(Real &maxviol, Real &sumviol)
gets violation of reduced costs; returns true on success
Definition: soplex.cpp:3140
BoolParam
boolean parameters
Definition: soplex.h:882
bool _hasSolReal
Definition: soplex.h:1819
int numProbRows
Definition: soplex.h:1783
int * _decompViolatedBounds
Definition: soplex.h:1757
bool _isSolveStopped(bool &stoppedTime, bool &stoppedIter) const
should solving process be stopped?
Definition: soplex.cpp:7219
void _changeBoundsReal(const VectorReal &lower, const VectorReal &upper)
changes vectors of column bounds to lower and upper and adjusts basis
Definition: soplex.cpp:7704
Settings()
default constructor initializing default settings
Definition: soplex.cpp:510
void _updateComplementaryDualSlackColCoeff()
updating the slack column coefficients to adjust for equality constraints
Definition: solvedbds.cpp:2760
maximum number of conjugate gradient iterations in least square scaling
Definition: soplex.h:1004
sparse pricing threshold (#violations < dimension * SPARSITY_THRESHOLD activates sparse pricing) ...
Definition: soplex.h:1316
Settings & operator=(const Settings &settings)
assignment operator
Definition: soplex.cpp:532
void addRowReal(const LPRowReal &lprow)
adds a single row
Definition: soplex.cpp:1313
Ids for LP rows.Class SPxRowId provides DataKeys for the row indices of an SPxLP. ...
Definition: spxid.h:55
bool getPrimalRayRational(VectorRational &vector)
gets the primal ray if LP is unbounded; returns true on success
Definition: soplex.cpp:3309
dual feasibility tolerance
Definition: soplex.h:1274
void _ensureRealLPLoaded()
ensures that the real LP and the basis are loaded in the solver; performs no sync ...
Definition: soplex.cpp:7992
high verbosity level
Definition: soplex.h:1087
void _restoreBasis()
restore basis
no solution polishing
Definition: soplex.h:1258
void changeRowReal(int i, const LPRowReal &lprow)
replaces row i with lprow
Definition: soplex.cpp:1385
void setBasis(const SPxSolver::VarStatus rows[], const SPxSolver::VarStatus cols[])
sets starting basis via arrays of statuses
Definition: soplex.cpp:4991
Hybrid pricer.
bool setIntParam(const IntParam param, const int value, const bool init=true)
sets integer parameter value; returns true on success
Definition: soplex.cpp:5628
void _identifyComplementaryDualFixedPrimalVars(int *currFixedVars)
removing the dual columns related to the fixed variables
Definition: solvedbds.cpp:2797
SolRational _solRational
Definition: soplex.h:1815
bool saveSettingsFile(const char *filename, const bool onlyChanged=false) const
writes settings file; returns true on success
Definition: soplex.cpp:6260
Textbook ratio test for SoPlex.
DataArray< SPxColId > _decompCompPrimalVarBoundIDs
Definition: soplex.h:1750
Real objValueReal()
returns the objective value if a primal solution is available
Definition: soplex.cpp:2948
void _updateComplementaryDualFixedPrimalVars(int *currFixedVars)
updating the dual columns related to the fixed primal variables.
Definition: solvedbds.cpp:2904
DualSign getExpectedDualVariableSign(int rowNumber)
returns the expected sign of the dual variables for the reduced problem
Definition: solvedbds.cpp:3384
bool _parseSettingsLine(char *line, const int lineNumber)
parses one line in a settings file and returns true on success; note that the string is modified ...
Definition: soplex.cpp:8341
void changeRhsReal(const VectorReal &rhs)
changes right-hand side vector to rhs
Definition: soplex.cpp:1441
bool decompTerminate(Real timeLimit)
function call to terminate the decomposition simplex
Definition: solvedbds.cpp:3762
SPxLeastSqSC _scalerLeastsq
Definition: soplex.h:1573
geometric frequency at which to apply rational reconstruction
Definition: soplex.h:1322
void changeElementRational(int i, int j, const Rational &val)
changes matrix entry in row i and column j to val
Definition: soplex.cpp:2537
SPxStarter * _starter
Definition: soplex.h:1592
bool _hasSolRational
Definition: soplex.h:1820
void writeStateRational(const char *filename, const NameSet *rowNames=0, const NameSet *colNames=0, const bool cpxFormat=false) const
writes internal LP, basis information, and parameter settings; if rowNames and colNames are NULL...
Definition: soplex.cpp:5504
void getOriginalProblemStatistics()
stores the problem statistics of the original problem
Definition: solvedbds.cpp:3465
void _enableSimplifierAndScaler()
enables simplifier and scaler according to current parameters
Definition: soplex.cpp:7919
int _nPrimalRows
Definition: soplex.h:1763
primal simplex algorithm, i.e., entering for column and leaving for row representation ...
Definition: soplex.h:1055
DVectorRational _modRhs
Definition: soplex.h:1630
bool checkBasisDualFeasibility(Vector feasVec)
checks the dual feasibility of the current basis
Definition: solvedbds.cpp:3332
LP equilibrium scaling.
bool setBoolParam(const BoolParam param, const bool value, const bool init=true)
sets boolean parameter value; returns true on success
Definition: soplex.cpp:5574
should LP be transformed to equality form before a rational solve?
Definition: soplex.h:888
int * _decompColStatus
Definition: soplex.h:1736
void _idxToPerm(int *idx, int idxSize, int *perm, int permSize) const
creates a permutation for removing rows/columns from an array of indices
Definition: soplex.cpp:7160
Equilibrium row/column scaling.This SPxScaler implementation performs equilibrium scaling of the LPs ...
Definition: spxequilisc.h:35
SPxSolver::VarStatus basisRowStatus(int row) const
returns basis status for a single row
Definition: soplex.cpp:3873
the number of iterations before the decomposition simplex initialisation is terminated.
Definition: soplex.h:1010
int numIncludedRows
Definition: soplex.h:1777
store only real LP
Definition: soplex.h:1183
const VectorRational & maxObjRational() const
returns objective function vector after transformation to a maximization problem; since this is how i...
Definition: soplex.cpp:1294
upper threshold in lifting (nonzero matrix coefficients with larger absolute value will be reformulat...
Definition: soplex.h:1313
DataArray< SPxSolver::VarStatus > _storedBasisStatusRows
Definition: soplex.h:1633
SPxLPReal _manualRealLP
Definition: soplex.h:1604
void _addRowsReal(const LPRowSetReal &lprowset)
adds multiple rows to the real LP and adjusts basis
Definition: soplex.cpp:7349
void _updateDecompReducedProblemViol(bool allrows)
update the reduced problem with additional columns and rows based upon the violated original bounds a...
Definition: solvedbds.cpp:1311
int numColsReal() const
returns number of columns
Definition: soplex.cpp:802
void changeUpperReal(const VectorReal &upper)
changes vector of upper bounds to upper
Definition: soplex.cpp:1572
bool hasPrimalRay() const
is a primal unbounded ray available?
Definition: soplex.cpp:2916
void removeColRational(int i)
removes column i
Definition: soplex.cpp:2668
SPxLPReal * _decompLP
Definition: soplex.h:1589
bool _isRealLPScaled
Definition: soplex.h:1596
IntParam
integer parameters
Definition: soplex.h:935
void _lift()
reduces matrix coefficient in absolute value by the lifting procedure of Thiele et al...
force iterative refinement
Definition: soplex.h:1212
SPxSolver::Status _status
Definition: soplex.h:1808
void getObjRational(VectorRational &obj) const
gets objective function vector
Definition: soplex.cpp:1265
Rational _rationalZero
Definition: soplex.h:1832
LP column.Class LPColBase provides a datatype for storing the column of an LP a the form similar to ...
Definition: lpcolbase.h:45
void _completeRangeTypesRational()
completes range type arrays after adding columns and/or rows
Definition: soplex.cpp:8212
RangeType _rangeTypeReal(const Real &lower, const Real &upper) const
determines RangeType from real bounds
Definition: soplex.cpp:7234
const VectorReal & lhsRealInternal() const
returns left-hand side vector, ignoring scaling
Definition: soplex.cpp:905
SPxSimplifier * _simplifier
Definition: soplex.h:1590
void removeRowRangeRational(int start, int end, int perm[]=0)
removes rows start to end including both; an array perm of size numRowsRational() may be passed as bu...
Definition: soplex.cpp:2650
void _updateDecompComplementaryPrimalProblem(bool origObj)
update the primal complementary problem with additional columns and rows
Definition: solvedbds.cpp:2449
void addRowsReal(const LPRowSetReal &lprowset)
adds multiple rows
Definition: soplex.cpp:1331
int numProbCols
Definition: soplex.h:1784
geometric mean scaling on rows and columns, max 1 round
Definition: soplex.h:1116
DataArray< SPxColId > _decompDualColIDs
Definition: soplex.h:1745
void _untransformEquality(SolRational &sol)
undoes transformation to equality form
perturb the entire problem or only the relevant bounds of s single pivot?
Definition: soplex.h:928
Steepest edge pricer.Class SPxSteepPR implements a steepest edge pricer to be used with SoPlex...
Definition: spxsteeppr.h:41
should row and bound violations be computed explicitly in the update of reduced problem in the decomp...
Definition: soplex.h:907
Harris pricing with shifting.Class SPxHarrisRT is a stable implementation of a SPxRatioTester class a...
Definition: spxharrisrt.h:40
upper bound is finite, lower bound is infinite
Definition: soplex.h:1650
int * _decompCompProbColIDsIdx
Definition: soplex.h:1737
bool getBoundViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of bounds; returns true on success
Definition: soplex.cpp:3369
SPxAutoPR _pricerAuto
Definition: soplex.h:1577
least square scaling
Definition: soplex.h:1122
only error output
Definition: soplex.h:1075
LP simplifier for removing uneccessary row/columns.This SPxSimplifier is mainly based on the paper "P...
Definition: spxmainsm.h:60
void _untransformFeasibility(SolRational &sol, bool infeasible)
undoes transformation to feasibility problem
int totalSizeDualRational(const int base=2)
get size of dual solution
Definition: soplex.cpp:3774
void _updateDecompComplementaryDualProblem(bool origObj)
update the dual complementary problem with additional columns and rows
Definition: solvedbds.cpp:2070
void removeRowsReal(int perm[])
removes all rows with an index i such that perm[i] < 0; upon completion, perm[i] >= 0 indicates the n...
Definition: soplex.cpp:1718
const VectorRational & lowerRational() const
returns lower bound vector
Definition: soplex.cpp:1247