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 a primal feasible solution available?
582  bool hasPrimal() const;
583 
584  /// is a primal unbounded ray available?
585  bool hasPrimalRay() const;
586 
587  /// is a dual feasible solution available?
588  bool hasDual() const;
589 
590  /// is Farkas proof of infeasibility available?
591  bool hasDualFarkas() const;
592 
593  //@}
594 
595 
596  //**@name Query for the real solution data */
597  //@{
598 
599  /// returns the objective value if a primal solution is available
600  Real objValueReal();
601 
602  /// gets the primal solution vector if available; returns true on success
603  bool getPrimalReal(VectorReal& vector);
604 
605  /// gets the vector of slack values if available; returns true on success
606  bool getSlacksReal(VectorReal& vector);
607 
608  /// gets the primal ray if available; returns true on success
609  bool getPrimalRayReal(VectorReal& vector);
610 
611  /// gets the dual solution vector if available; returns true on success
612  bool getDualReal(VectorReal& vector);
613 
614  /// gets the vector of reduced cost values if available; returns true on success
615  bool getRedCostReal(VectorReal& vector);
616 
617  /// gets the Farkas proof if available; returns true on success
618  bool getDualFarkasReal(VectorReal& vector);
619 
620  /// gets violation of bounds; returns true on success
621  bool getBoundViolationReal(Real& maxviol, Real& sumviol);
622 
623  /// gets violation of constraints; returns true on success
624  bool getRowViolationReal(Real& maxviol, Real& sumviol);
625 
626  /// gets violation of reduced costs; returns true on success
627  bool getRedCostViolationReal(Real& maxviol, Real& sumviol);
628 
629  /// gets violation of dual multipliers; returns true on success
630  bool getDualViolationReal(Real& maxviol, Real& sumviol);
631 
632  //@}
633 
634 
635  //**@name Query for the rational solution data */
636  //@{
637 
638  /// returns the objective value if a primal solution is available
640 
641  /// gets the primal solution vector if available; returns true on success
642  bool getPrimalRational(VectorRational& vector);
643 
644  /// gets the vector of slack values if available; returns true on success
645  bool getSlacksRational(VectorRational& vector);
646 
647  /// gets the primal ray if LP is unbounded; returns true on success
648  bool getPrimalRayRational(VectorRational& vector);
649 
650  /// gets the dual solution vector if available; returns true on success
651  bool getDualRational(VectorRational& vector);
652 
653  /// gets the vector of reduced cost values if available; returns true on success
654  bool getRedCostRational(VectorRational& vector);
655 
656  /// gets the Farkas proof if LP is infeasible; returns true on success
658 
659  /// gets violation of bounds; returns true on success
660  bool getBoundViolationRational(Rational& maxviol, Rational& sumviol);
661 
662  /// gets violation of constraints; returns true on success
663  bool getRowViolationRational(Rational& maxviol, Rational& sumviol);
664 
665  /// gets violation of reduced costs; returns true on success
666  bool getRedCostViolationRational(Rational& maxviol, Rational& sumviol);
667 
668  /// gets violation of dual multipliers; returns true on success
669  bool getDualViolationRational(Rational& maxviol, Rational& sumviol);
670 
671 #ifdef SOPLEX_WITH_GMP
672  /// gets the primal solution vector if available; returns true on success
673  bool getPrimalRational(mpq_t* vector, const int size);
674 
675  /// gets the vector of slack values if available; returns true on success
676  bool getSlacksRational(mpq_t* vector, const int size);
677 
678  /// gets the primal ray if LP is unbounded; returns true on success
679  bool getPrimalRayRational(mpq_t* vector, const int size);
680 
681  /// gets the dual solution vector if available; returns true on success
682  bool getDualRational(mpq_t* vector, const int size);
683 
684  /// gets the vector of reduced cost values if available; returns true on success
685  bool getRedCostRational(mpq_t* vector, const int size);
686 
687  /// gets the Farkas proof if LP is infeasible; returns true on success
688  bool getDualFarkasRational(mpq_t* vector, const int size);
689 #endif
690 
691  /// get size of primal solution
692  int totalSizePrimalRational(const int base = 2);
693 
694  /// get size of dual solution
695  int totalSizeDualRational(const int base = 2);
696 
697  /// get size of least common multiple of denominators in primal solution
698  int dlcmSizePrimalRational(const int base = 2);
699 
700  /// get size of least common multiple of denominators in dual solution
701  int dlcmSizeDualRational(const int base = 2);
702 
703  /// get size of largest denominator in primal solution
704  int dmaxSizePrimalRational(const int base = 2);
705 
706  /// get size of largest denominator in dual solution
707  int dmaxSizeDualRational(const int base = 2);
708 
709  //@}
710 
711 
712  //**@name Access and modification of basis information */
713  //@{
714 
715  /// is an advanced starting basis available?
716  bool hasBasis() const;
717 
718  /// returns the current basis status
720 
721  /// returns basis status for a single row
722  SPxSolver::VarStatus basisRowStatus(int row) const;
723 
724  /// returns basis status for a single column
725  SPxSolver::VarStatus basisColStatus(int col) const;
726 
727  /// gets current basis via arrays of statuses
728  void getBasis(SPxSolver::VarStatus rows[], SPxSolver::VarStatus cols[]) const;
729 
730  /// gets the indices of the basic columns and rows; basic column n gives value n, basic row m gives value -1-m
731  void getBasisInd(int* bind) const;
732 
733  /// computes an estimated condition number for the current basis matrix using the power method; returns true on success
734  bool getEstimatedCondition(Real& condition);
735 
736  /// computes the exact condition number for the current basis matrix using the power method; returns true on success
737  bool getExactCondition(Real& condition);
738 
739  /// computes row \p r of basis inverse; returns true on success
740  /// @param unscale determines whether the result should be unscaled according to the original LP data
741  bool getBasisInverseRowReal(int r, Real* coef, int* inds = NULL, int* ninds = NULL, bool unscale = true);
742 
743  /// computes column \p c of basis inverse; returns true on success
744  /// @param unscale determines whether the result should be unscaled according to the original LP data
745  bool getBasisInverseColReal(int c, Real* coef, int* inds = NULL, int* ninds = NULL, bool unscale = true);
746 
747  /// computes dense solution of basis matrix B * \p sol = \p rhs; returns true on success
748  bool getBasisInverseTimesVecReal(Real* rhs, Real* sol, bool unscale = true);
749 
750  /// multiply with basis matrix; B * \p vec (inplace)
751  /// @param unscale determines whether the result should be unscaled according to the original LP data
752  bool multBasis(Real* vec, bool unscale = true);
753 
754  /// multiply with transpose of basis matrix; \p vec * B^T (inplace)
755  /// @param unscale determines whether the result should be unscaled according to the original LP data
756  bool multBasisTranspose(Real* vec, bool unscale = true);
757 
758  /// compute rational basis inverse; returns true on success
760 
761  /// gets an array of indices for the columns of the rational basis matrix; bind[i] >= 0 means that the i-th column of
762  /// the basis matrix contains variable bind[i]; bind[i] < 0 means that the i-th column of the basis matrix contains
763  /// the slack variable for row -bind[i]-1; performs rational factorization if not available; returns true on success
765 
766  /// computes row r of basis inverse; performs rational factorization if not available; returns true on success
767  bool getBasisInverseRowRational(const int r, SSVectorRational& vec);
768 
769  /// computes column c of basis inverse; performs rational factorization if not available; returns true on success
770  bool getBasisInverseColRational(const int c, SSVectorRational& vec);
771 
772  /// computes solution of basis matrix B * sol = rhs; performs rational factorization if not available; returns true
773  /// on success
775 
776  /// sets starting basis via arrays of statuses
777  void setBasis(const SPxSolver::VarStatus rows[], const SPxSolver::VarStatus cols[]);
778 
779  /// clears starting basis
780  void clearBasis();
781 
782  //@}
783 
784 
785  //**@name Statistical information */
786  //@{
787 
788  /// number of iterations since last call to solve
789  int numIterations() const;
790 
791  /// time spent in last call to solve
792  Real solveTime() const;
793 
794  /// statistical information in form of a string
795  std::string statisticString() const;
796 
797  /// name of starter
798  const char* getStarterName();
799 
800  /// name of simplifier
801  const char* getSimplifierName();
802 
803  /// name of scaling method
804  const char* getScalerName();
805 
806  /// name of currently loaded pricer
807  const char* getPricerName();
808 
809  /// name of currently loaded ratiotester
810  const char* getRatiotesterName();
811 
812  //@}
813 
814 
815  //**@name File I/O */
816  //@{
817 
818  /// reads LP file in LP or MPS format according to READMODE parameter; gets row names, column names, and
819  /// integer variables if desired; returns true on success
820  bool readFile(const char* filename, NameSet* rowNames = 0, NameSet* colNames = 0, DIdxSet* intVars = 0);
821 
822  /// writes real LP to file; LP or MPS format is chosen from the extension in \p filename; if \p rowNames and \p
823  /// colNames are \c NULL, default names are used; if \p intVars is not \c NULL, the variables contained in it are
824  /// marked as integer; returns true on success
825  bool writeFileReal(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const DIdxSet* intvars = 0, const bool unscale = false) const;
826 
827  /// writes rational LP to file; LP or MPS format is chosen from the extension in \p filename; if \p rowNames and \p
828  /// colNames are \c NULL, default names are used; if \p intVars is not \c NULL, the variables contained in it are
829  /// marked as integer; returns true on success
830  bool writeFileRational(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const DIdxSet* intvars = 0) const;
831 
832  /// writes the dual of the real LP to file; LP or MPS format is chosen from the extension in \p filename;
833  /// if \p rowNames and \p colNames are \c NULL, default names are used; if \p intVars is not \c NULL,
834  /// the variables contained in it are marked as integer; returns true on success
835  bool writeDualFileReal(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const DIdxSet* intvars = 0) const;
836 
837  /// reads basis information from \p filename and returns true on success; if \p rowNames and \p colNames are \c NULL,
838  /// default names are assumed; returns true on success
839  bool readBasisFile(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0);
840 
841  /// writes basis information to \p filename; if \p rowNames and \p colNames are \c NULL, default names are used;
842  /// returns true on success
843  bool writeBasisFile(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const bool cpxFormat = false) const;
844 
845  /// writes internal LP, basis information, and parameter settings; if \p rowNames and \p colNames are \c NULL,
846  /// default names are used
847  void writeStateReal(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const bool cpxFormat = false) const;
848 
849  /// writes internal LP, basis information, and parameter settings; if \p rowNames and \p colNames are \c NULL,
850  /// default names are used
851  void writeStateRational(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0, const bool cpxFormat = false) const;
852 
853  //@}
854 
855 
856  //**@name Parameters */
857  //@{
858 
859  /// boolean parameters
860  typedef enum
861  {
862  /// should lifting be used to reduce range of nonzero matrix coefficients?
863  LIFTING = 0,
864 
865  /// should LP be transformed to equality form before a rational solve?
866  EQTRANS = 1,
867 
868  /// should dual infeasibility be tested in order to try to return a dual solution even if primal infeasible?
870 
871  /// should a rational factorization be performed after iterative refinement?
872  RATFAC = 3,
873 
874  /// should the decomposition based dual simplex be used to solve the LP? Setting this to true forces the solve mode to
875  /// SOLVEMODE_REAL and the basis representation to REPRESENTATION_ROW
877 
878  /// should the degeneracy be computed for each basis?
880 
881  /// should the dual of the complementary problem be used in the decomposition simplex?
883 
884  /// should row and bound violations be computed explicitly in the update of reduced problem in the decomposition simplex
886 
887  /// should cycling solutions be accepted during iterative refinement?
889 
890  /// apply rational reconstruction after each iterative refinement?
891  RATREC = 9,
892 
893  /// round scaling factors for iterative refinement to powers of two?
895 
896  /// continue iterative refinement with exact basic solution if not optimal?
898 
899  /// use bound flipping also for row representation?
901 
902  /// use persistent scaling?
904 
905  /// perturb the entire problem or only the relevant bounds of s single pivot?
907 
908  /// number of boolean parameters
910  } BoolParam;
911 
912  /// integer parameters
913  typedef enum
914  {
915  /// objective sense
916  OBJSENSE = 0,
917 
918  /// type of computational form, i.e., column or row representation
920 
921  /// type of algorithm, i.e., primal or dual
923 
924  /// type of LU update
926 
927  /// maximum number of updates without fresh factorization
929 
930  /// iteration limit (-1 if unlimited)
932 
933  /// refinement limit (-1 if unlimited)
934  REFLIMIT = 6,
935 
936  /// stalling refinement limit (-1 if unlimited)
938 
939  /// display frequency
941 
942  /// verbosity level
944 
945  /// type of simplifier
947 
948  /// type of scaler
949  SCALER = 11,
950 
951  /// type of starter used to create crash basis
952  STARTER = 12,
953 
954  /// type of pricer
955  PRICER = 13,
956 
957  /// type of ratio test
959 
960  /// mode for synchronizing real and rational LP
961  SYNCMODE = 15,
962 
963  /// mode for reading LP files
964  READMODE = 16,
965 
966  /// mode for iterative refinement strategy
967  SOLVEMODE = 17,
968 
969  /// mode for a posteriori feasibility checks
970  CHECKMODE = 18,
971 
972  /// type of timer
973  TIMER = 19,
974 
975  /// mode for hyper sparse pricing
977 
978  /// minimum number of stalling refinements since last pivot to trigger rational factorization
980 
981  /// maximum number of conjugate gradient iterations in least square scaling
983 
984  /// mode for solution polishing
986 
987  /// the number of iterations before the decomposition simplex initialisation is terminated.
989 
990  /// the maximum number of rows that are added in each iteration of the decomposition based simplex
992 
993  /// the iteration frequency at which the decomposition solve output is displayed.
995 
996  /// the verbosity of the decomposition based simplex
998 
999  /// number of integer parameters
1001  } IntParam;
1002 
1003  /// values for parameter OBJSENSE
1004  enum
1005  {
1006  /// minimization
1008 
1009  /// maximization
1011  };
1012 
1013  /// values for parameter REPRESENTATION
1014  enum
1015  {
1016  /// automatic choice according to number of rows and columns
1018 
1019  /// column representation Ax - s = 0, lower <= x <= upper, lhs <= s <= rhs
1021 
1022  /// row representation (lower,lhs) <= (x,Ax) <= (upper,rhs)
1024  };
1025 
1026  /// values for parameter ALGORITHM
1027  enum
1028  {
1029  /// primal simplex algorithm, i.e., entering for column and leaving for row representation
1031 
1032  /// dual simplex algorithm, i.e., leaving for column and entering for row representation
1034  };
1035 
1036  /// values for parameter FACTOR_UPDATE_TYPE
1037  enum
1038  {
1039  /// product form update
1041 
1042  /// Forrest-Tomlin type update
1044  };
1045 
1046  /// values for parameter VERBOSITY
1047  enum
1048  {
1049  /// only error output
1051 
1052  /// only error and warning output
1054 
1055  /// only error, warning, and debug output
1057 
1058  /// standard verbosity level
1060 
1061  /// high verbosity level
1063 
1064  /// full verbosity level
1066  };
1067 
1068  /// values for parameter SIMPLIFIER
1069  enum
1070  {
1071  /// no simplifier
1073 
1074  /// automatic choice
1076  };
1077 
1078  /// values for parameter SCALER
1079  enum
1080  {
1081  /// no scaler
1083 
1084  /// equilibrium scaling on rows or columns
1086 
1087  /// equilibrium scaling on rows and columns
1089 
1090  /// geometric mean scaling on rows and columns, max 1 round
1092 
1093  /// geometric mean scaling on rows and columns, max 8 rounds
1095 
1096  /// least square scaling
1098  };
1099 
1100  /// values for parameter STARTER
1101  enum
1102  {
1103  /// slack basis
1105 
1106  /// greedy crash basis weighted by objective, bounds, and sides
1108 
1109  /// crash basis from a greedy solution
1111 
1112  /// generic solution-based crash basis
1114  };
1115 
1116  /// values for parameter PRICER
1117  enum
1118  {
1119  /// automatic pricer
1121 
1122  /// Dantzig pricer
1124 
1125  /// partial multiple pricer based on Dantzig pricing
1127 
1128  /// devex pricer
1130 
1131  /// steepest edge pricer with initialization to unit norms
1133 
1134  /// steepest edge pricer with exact initialization of norms
1136  };
1137 
1138  /// values for parameter RATIOTESTER
1139  enum
1140  {
1141  /// textbook ratio test without stabilization
1143 
1144  /// standard Harris ratio test
1146 
1147  /// modified Harris ratio test
1149 
1150  /// bound flipping ratio test for long steps in the dual simplex
1152  };
1153 
1154  /// values for parameter SYNCMODE
1155  enum
1156  {
1157  /// store only real LP
1159 
1160  /// automatic sync of real and rational LP
1162 
1163  /// user sync of real and rational LP
1165  };
1166 
1167  /// values for parameter READMODE
1168  enum
1169  {
1170  /// standard floating-point parsing
1172 
1173  /// rational parsing
1175  };
1176 
1177  /// values for parameter SOLVEMODE
1178  enum
1179  {
1180  /// apply standard floating-point algorithm
1182 
1183  /// decide depending on tolerances whether to apply iterative refinement
1185 
1186  /// force iterative refinement
1188  };
1189 
1190  /// values for parameter CHECKMODE
1191  enum
1192  {
1193  /// floating-point check
1195 
1196  /// decide according to READMODE
1198 
1199  /// rational check
1201  };
1202 
1203  /// values for parameter TIMER
1204  enum
1205  {
1206  /// disable timing
1208 
1209  /// cpu or user time
1211 
1212  /// wallclock time
1214  };
1215 
1216  /// values for parameter HYPER_PRICING
1217  enum
1218  {
1219  /// never
1221 
1222  /// decide according to problem size
1224 
1225  /// always
1227  };
1228 
1229  /// values for parameter SOLUTION_POLISHING
1230  enum
1231  {
1232  /// no solution polishing
1234 
1235  /// maximize number of basic slack variables, i.e. more variables on bounds
1237 
1238  /// minimize number of basic slack variables, i.e. more variables between bounds
1240  };
1241 
1242  /// real parameters
1243  typedef enum
1244  {
1245  /// primal feasibility tolerance
1246  FEASTOL = 0,
1247 
1248  /// dual feasibility tolerance
1249  OPTTOL = 1,
1250 
1251  /// general zero tolerance
1253 
1254  /// zero tolerance used in factorization
1256 
1257  /// zero tolerance used in update of the factorization
1259 
1260  /// pivot zero tolerance used in factorization
1262 
1263  /// infinity threshold
1264  INFTY = 6,
1265 
1266  /// time limit in seconds (INFTY if unlimited)
1268 
1269  /// lower limit on objective value
1271 
1272  /// upper limit on objective value
1274 
1275  /// working tolerance for feasibility in floating-point solver during iterative refinement
1277 
1278  /// working tolerance for optimality in floating-point solver during iterative refinement
1279  FPOPTTOL = 11,
1280 
1281  /// maximum increase of scaling factors between refinements
1283 
1284  /// lower threshold in lifting (nonzero matrix coefficients with smaller absolute value will be reformulated)
1286 
1287  /// upper threshold in lifting (nonzero matrix coefficients with larger absolute value will be reformulated)
1289 
1290  /// sparse pricing threshold (\#violations < dimension * SPARSITY_THRESHOLD activates sparse pricing)
1292 
1293  /// threshold on number of rows vs. number of columns for switching from column to row representations in auto mode
1295 
1296  /// geometric frequency at which to apply rational reconstruction
1298 
1299  /// minimal reduction (sum of removed rows/cols) to continue simplification
1300  MINRED = 18,
1301 
1302  /// refactor threshold for nonzeros in last factorized basis matrix compared to updated basis matrix
1304 
1305  /// refactor threshold for fill-in in current factor update compared to fill-in in last factorization
1307 
1308  /// refactor threshold for memory growth in factorization since last refactorization
1310 
1311  /// accuracy of conjugate gradient method in least squares scaling (higher value leads to more iterations)
1313 
1314  /// objective offset
1316 
1317  /// number of real parameters
1319  } RealParam;
1320 
1321 #ifdef SOPLEX_WITH_RATIONALPARAM
1322  /// rational parameters
1323  typedef enum
1324  {
1325  /// number of rational parameters
1326  RATIONALPARAM_COUNT = 0
1327  } RationalParam;
1328 #endif
1329 
1330  /// class of parameter settings
1331  class Settings
1332  {
1333  public:
1334  static struct BoolParam {
1335  /// constructor
1336  BoolParam();
1337  /// array of names for boolean parameters
1339  /// array of descriptions for boolean parameters
1341  /// array of default values for boolean parameters
1343  } boolParam;
1344 
1345  static struct IntParam {
1346  /// constructor
1347  IntParam();
1348  /// array of names for integer parameters
1350  /// array of descriptions for integer parameters
1352  /// array of default values for integer parameters
1354  /// array of lower bounds for int parameter values
1356  /// array of upper bounds for int parameter values
1358  } intParam;
1359 
1360  static struct RealParam {
1361  /// constructor
1362  RealParam();
1363  /// array of names for real parameters
1365  /// array of descriptions for real parameters
1367  /// array of default values for real parameters
1369  /// array of lower bounds for real parameter values
1371  /// array of upper bounds for real parameter values
1373  } realParam;
1374 
1375 #ifdef SOPLEX_WITH_RATIONALPARAM
1376  static struct RationalParam {
1377  /// constructor
1378  RationalParam();
1379  /// array of names for rational parameters
1380  std::string name[SoPlex::RATIONALPARAM_COUNT];
1381  /// array of descriptions for rational parameters
1382  std::string description[SoPlex::RATIONALPARAM_COUNT];
1383  /// array of default values for rational parameters
1384  Rational defaultValue[SoPlex::RATIONALPARAM_COUNT];
1385  /// array of lower bounds for rational parameter values
1386  Rational lower[SoPlex::RATIONALPARAM_COUNT];
1387  /// array of upper bounds for rational parameter values
1388  Rational upper[SoPlex::RATIONALPARAM_COUNT];
1389  } rationalParam;
1390 #endif
1391 
1392  /// array of current boolean parameter values
1394 
1395  /// array of current integer parameter values
1397 
1398  /// array of current real parameter values
1400 
1401 #ifdef SOPLEX_WITH_RATIONALPARAM
1402  /// array of current rational parameter values
1403  Rational _rationalParamValues[SoPlex::RATIONALPARAM_COUNT];
1404 #endif
1405 
1406  /// default constructor initializing default settings
1407  Settings();
1408 
1409  /// copy constructor
1410  Settings(const Settings& settings);
1411 
1412  /// assignment operator
1414  };
1415 
1416  mutable SPxOut spxout;
1417 
1418  /// returns boolean parameter value
1419  bool boolParam(const BoolParam param) const;
1420 
1421  /// returns integer parameter value
1422  int intParam(const IntParam param) const;
1423 
1424  /// returns real parameter value
1425  Real realParam(const RealParam param) const;
1426 
1427 #ifdef SOPLEX_WITH_RATIONALPARAM
1428  /// returns rational parameter value
1429  Rational rationalParam(const RationalParam param) const;
1430 #endif
1431 
1432  /// returns current parameter settings
1433  const Settings& settings() const;
1434 
1435  /// sets boolean parameter value; returns true on success
1436  bool setBoolParam(const BoolParam param, const bool value, const bool init = true);
1437 
1438  /// sets integer parameter value; returns true on success
1439  bool setIntParam(const IntParam param, const int value, const bool init = true);
1440 
1441  /// sets real parameter value; returns true on success
1442  bool setRealParam(const RealParam param, const Real value, const bool init = true);
1443 
1444 #ifdef SOPLEX_WITH_RATIONALPARAM
1445  /// sets rational parameter value; returns true on success
1446  bool setRationalParam(const RationalParam param, const Rational value, const bool init = true);
1447 #endif
1448 
1449  /// sets parameter settings; returns true on success
1450  bool setSettings(const Settings& newSettings, const bool init = true);
1451 
1452  /// resets default parameter settings
1453  void resetSettings(const bool quiet = false, const bool init = true);
1454 
1455  /// print non-default parameter values
1456  void printUserSettings();
1457 
1458  /// writes settings file; returns true on success
1459  bool saveSettingsFile(const char* filename, const bool onlyChanged = false) const;
1460 
1461  /// reads settings file; returns true on success
1462  bool loadSettingsFile(const char* filename);
1463 
1464  /// parses one setting string and returns true on success; note that string is modified
1465  bool parseSettingsString(char* line);
1466 
1467  //@}
1468 
1469 
1470  //**@name Statistics */
1471  //@{
1472 
1473  /// prints solution statistics
1474  void printSolutionStatistics(std::ostream& os);
1475 
1476  /// prints statistics on solving process
1477  void printSolvingStatistics(std::ostream& os);
1478 
1479  /// prints short statistics
1480  void printShortStatistics(std::ostream& os);
1481 
1482  /// prints complete statistics
1483  void printStatistics(std::ostream& os);
1484 
1485  /// prints status
1486  void printStatus(std::ostream& os, SPxSolver::Status status);
1487 
1488  //@}
1489 
1490 
1491  //**@name Miscellaneous */
1492  //@{
1493 
1494  /// prints version and compilation options
1495  void printVersion() const;
1496 
1497  /// checks if real LP and rational LP are in sync; dimensions will always be compared,
1498  /// vector and matrix values only if the respective parameter is set to true.
1499  /// If quiet is set to true the function will only display which vectors are different.
1500  bool areLPsInSync(const bool checkVecVals = true, const bool checkMatVals = false, const bool quiet = false) const;
1501 
1502  /// set the random seeds of the solver instance
1503  void setRandomSeed(unsigned int seed);
1504 
1505  /// returns the current random seed of the solver instance
1506  unsigned int randomSeed() const;
1507 
1508  //@}
1509 
1510 private:
1511 
1512  //**@name Statistics on solving process */
1513  //@{
1514 
1515  /// class of statistics
1516  class Statistics;
1517 
1518  /// statistics since last call to solveReal() or solveRational()
1520 
1521  //@}
1522 
1523 
1524  //**@name Parameter settings */
1525  //@{
1526 
1528 
1534 
1535  //@}
1536 
1537 
1538  //**@name Data for the real LP */
1539  //@{
1540 
1562 
1563  SPxLPReal* _realLP; // the real LP is also used as the original LP for the decomposition dual simplex
1564  SPxLPReal* _decompLP; // used to store the original LP for the decomposition dual simplex
1568 
1569  bool _isRealLPLoaded; // true indicates that the original LP is loaded in the _solver variable, hence all actions
1570  // are performed on the original LP.
1573 
1580 
1581  //@}
1582 
1583 
1584  //**@name Data for the rational LP */
1585  //@{
1586 
1590 
1614 
1615  /// type of bounds and sides
1616  typedef enum
1617  {
1618  /// both bounds are infinite
1620 
1621  /// lower bound is finite, upper bound is infinite
1623 
1624  /// upper bound is finite, lower bound is infinite
1626 
1627  /// lower and upper bound finite, but different
1629 
1630  /// lower bound equals upper bound
1632  } RangeType;
1633 
1636 
1637  //@}
1638 
1639 
1640  //**@name Data for the Decomposition Based Dual Simplex */
1641  //@{
1642 
1643  /** row violation structure
1644  */
1646  {
1647  Real violation; /**< the violation of the row */
1648  int idx; /**< index of corresponding row */
1649  };
1650 
1651  /** Compare class for row violations
1652  */
1654  {
1655  public:
1656  /** constructor
1657  */
1659  : entry(0)
1660  {
1661  }
1662 
1664 
1665  Real operator() (
1666  RowViolation i,
1667  RowViolation j
1668  ) const
1669  {
1670  return i.violation - j.violation;
1671  }
1672  };
1673 
1674 
1675  typedef enum
1676  {
1677  // is the original problem currently being solved.
1679 
1680  // is the reduced problem currently being solved.
1682 
1683  // is the complementary problem currently being solved.
1685  } decompStatus;
1686 
1687  // the expected sign of the dual variables.
1689  {
1690  IS_POS = 0,
1691  IS_NEG = 1,
1693  };
1694 
1695  SPxSolver _compSolver; // adding a solver to contain the complementary problem. It is too confusing to switch
1696  // the LP for the reduced and complementary problem in the one solver variable. The reduced
1697  // problem will be stored in _solver and the complementary problem will be stored in
1698  // _compSolver.
1699  SLUFactor _compSlufactor; // I don't know whether this is necessary, but it is a test for now.
1700 
1701  SPxBasis _decompTransBasis; // the basis required for the transformation to form the reduced problem
1702 
1703  DVector _transformedObj; // the objective coefficients of the transformed problem
1704  DVector _decompFeasVector; // feasibility vector calculated using unshifted bounds.
1705  LPRowSet _transformedRows; // a set of the original rows that have been transformed using the original basis.
1706  SPxColId _compSlackColId; // column id of the primal complementary problem slack column.
1707  SPxRowId _compSlackDualRowId; // row id in the dual of complementary problem related to the slack column.
1708  bool* _decompReducedProbRows; // flag to indicate the inclusion of a row in the reduced problem.
1709  bool* _decompReducedProbCols; // flag to indicate the inclusion of a col in the reduced problem.
1712  int* _decompCompProbColIDsIdx; // the index to _decompPrimalColIDs for a given original col.
1713  DataArray < SPxRowId > _decompReducedProbRowIDs; // the row IDs for the related rows in the reduced problem
1714  DataArray < SPxRowId > _decompReducedProbColRowIDs;// the row IDs for the related cols in the reduced problem
1715  DataArray < SPxColId > _decompReducedProbColIDs; // the col IDs for the related cols in the reduced problem
1716  DataArray < SPxRowId > _decompPrimalRowIDs; // the primal row IDs from the original problem
1717  DataArray < SPxColId > _decompPrimalColIDs; // the primal col IDs from the original problem
1718  DataArray < SPxRowId > _decompElimPrimalRowIDs; // the primal row IDs eliminated in the complementary problem
1719  DataArray < SPxRowId > _decompDualRowIDs; // the dual row IDs from the complementary problem
1720  DataArray < SPxColId > _decompDualColIDs; // the dual col IDs from the complementary problem
1721  DataArray < SPxColId > _decompFixedVarDualIDs; // the column ids related to the fixed variables.
1722  DataArray < SPxColId > _decompVarBoundDualIDs; // the column ids related to the variable bound constraints.
1723 
1724  DataArray < SPxColId > _decompCompPrimalFixedVarIDs; // the column ids related to the fixed variables in the complementary primal.
1725  DataArray < SPxColId > _decompCompPrimalVarBoundIDs; // the column ids related to the variable bound constraints in the complementary primal.
1726 
1727  DataArray < SPxRowId > _decompCompPrimalRowIDs; // the primal row IDs from the complementary problem
1728  DataArray < SPxColId > _decompCompPrimalColIDs; // the primal col IDs from the complementary problem
1729 
1730  int _nDecompViolBounds; // the number of violated bound constraints
1731  int _nDecompViolRows; // the number of violated rows
1732  int* _decompViolatedBounds; // the violated bounds given by the solution to the IDS reduced problem
1733  int* _decompViolatedRows; // the violated rows given by the solution to the IDS reduced problem
1734 
1735 
1736  int* _fixedOrigVars; // the original variables that are at their bounds in the reduced problem.
1737  // 1: fixed to upper, -1: fixed to lower, 0: unfixed.
1738  int _nPrimalRows; // the number of original problem rows included in the complementary problem
1739  int _nPrimalCols; // the number of original problem columns included in the complementary problem
1740  int _nElimPrimalRows; // the number of primal rows from the original problem eliminated from the complementary prob
1741  int _nDualRows; // the number of dual rows in the complementary problem. NOTE: _nPrimalRows = _nDualCols
1742  int _nDualCols; // the number of dual columns in the complementary problem. NOTE: _nPrimalRows = _nDualCols
1743  int _nCompPrimalRows; // the number of rows in the complementary primal problem. NOTE: _nPrimalRows = _nCompPrimalRows
1744  int _nCompPrimalCols; // the number of dual columns in the complementary problem. NOTE: _nPrimalCols = _nCompPrimalCols
1745 
1746  int _decompDisplayLine; // the count for the display line
1747 
1748  NameSet* _rowNames; // the row names from the input file
1749  NameSet* _colNames; // the col names from the input file
1750 
1751  // Statistic information
1752  int numIncludedRows; // the number of rows currently included in the reduced problem.
1753  int numDecompIter; // the number of iterations of the decomposition dual simplex algorithm.
1754  int numRedProbIter; // the number of simplex iterations performed in the reduced problem.
1755  int numCompProbIter; // the number of iterations of the complementary problem.
1756 
1757  // problem statistics
1763 
1768 
1773 
1774 
1776 
1777  //@}
1778 
1779 
1780  //**@name Solution data */
1781  //@{
1782 
1785 
1788 
1792 
1796 
1797  //@}
1798 
1799  //**@name Miscellaneous */
1800  //@{
1801 
1804 
1808 
1809  //@}
1810 
1811  //**@name Constant helper methods */
1812  //@{
1813 
1814  /// extends sparse vector to hold newmax entries if and only if it holds no more free entries
1815  void _ensureDSVectorRationalMemory(DSVectorRational& vec, const int newmax) const;
1816 
1817  /// creates a permutation for removing rows/columns from an array of indices
1818  void _idxToPerm(int* idx, int idxSize, int* perm, int permSize) const;
1819 
1820  /// creates a permutation for removing rows/columns from a range of indices
1821  void _rangeToPerm(int start, int end, int* perm, int permSize) const;
1822 
1823  /// checks consistency
1824  bool _isConsistent() const;
1825 
1826  /// should solving process be stopped?
1827  bool _isSolveStopped(bool& stoppedTime, bool& stoppedIter) const;
1828 
1829  /// determines RangeType from real bounds
1830  RangeType _rangeTypeReal(const Real& lower, const Real& upper) const;
1831 
1832  /// determines RangeType from rational bounds
1833  RangeType _rangeTypeRational(const Rational& lower, const Rational& upper) const;
1834 
1835  /// switches RANGETYPE_LOWER to RANGETYPE_UPPER and vice versa
1836  RangeType _switchRangeType(const RangeType& rangeType) const;
1837 
1838  /// checks whether RangeType corresponds to finite lower bound
1839  bool _lowerFinite(const RangeType& rangeType) const;
1840 
1841  /// checks whether RangeType corresponds to finite upper bound
1842  bool _upperFinite(const RangeType& rangeType) const;
1843 
1844  //@}
1845 
1846 
1847  //**@name Non-constant helper methods */
1848  //@{
1849 
1850  /// adds a single row to the real LP and adjusts basis
1851  void _addRowReal(const LPRowReal& lprow);
1852 
1853  /// adds a single row to the real LP and adjusts basis
1854  void _addRowReal(Real lhs, const SVectorReal& lprow, Real rhs);
1855 
1856  /// adds multiple rows to the real LP and adjusts basis
1857  void _addRowsReal(const LPRowSetReal& lprowset);
1858 
1859  /// adds a single column to the real LP and adjusts basis
1860  void _addColReal(const LPColReal& lpcol);
1861 
1862  /// adds a single column to the real LP and adjusts basis
1863  void _addColReal(Real obj, Real lower, const SVectorReal& lpcol, Real upper);
1864 
1865  /// adds multiple columns to the real LP and adjusts basis
1866  void _addColsReal(const LPColSetReal& lpcolset);
1867 
1868  /// replaces row \p i with \p lprow and adjusts basis
1869  void _changeRowReal(int i, const LPRowReal& lprow);
1870 
1871  /// changes left-hand side vector for constraints to \p lhs and adjusts basis
1872  void _changeLhsReal(const VectorReal& lhs);
1873 
1874  /// changes left-hand side of row \p i to \p lhs and adjusts basis
1875  void _changeLhsReal(int i, const Real& lhs);
1876 
1877  /// changes right-hand side vector to \p rhs and adjusts basis
1878  void _changeRhsReal(const VectorReal& rhs);
1879 
1880  /// changes right-hand side of row \p i to \p rhs and adjusts basis
1881  void _changeRhsReal(int i, const Real& rhs);
1882 
1883  /// changes left- and right-hand side vectors and adjusts basis
1884  void _changeRangeReal(const VectorReal& lhs, const VectorReal& rhs);
1885 
1886  /// changes left- and right-hand side of row \p i and adjusts basis
1887  void _changeRangeReal(int i, const Real& lhs, const Real& rhs);
1888 
1889  /// replaces column \p i with \p lpcol and adjusts basis
1890  void _changeColReal(int i, const LPColReal& lpcol);
1891 
1892  /// changes vector of lower bounds to \p lower and adjusts basis
1893  void _changeLowerReal(const VectorReal& lower);
1894 
1895  /// changes lower bound of column i to \p lower and adjusts basis
1896  void _changeLowerReal(int i, const Real& lower);
1897 
1898  /// changes vector of upper bounds to \p upper and adjusts basis
1899  void _changeUpperReal(const VectorReal& upper);
1900 
1901  /// changes \p i 'th upper bound to \p upper and adjusts basis
1902  void _changeUpperReal(int i, const Real& upper);
1903 
1904  /// changes vectors of column bounds to \p lower and \p upper and adjusts basis
1905  void _changeBoundsReal(const VectorReal& lower, const VectorReal& upper);
1906 
1907  /// changes bounds of column \p i to \p lower and \p upper and adjusts basis
1908  void _changeBoundsReal(int i, const Real& lower, const Real& upper);
1909 
1910  /// changes matrix entry in row \p i and column \p j to \p val and adjusts basis
1911  void _changeElementReal(int i, int j, const Real& val);
1912 
1913  /// removes row \p i and adjusts basis
1914  void _removeRowReal(int i);
1915 
1916  /// removes all rows with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
1917  /// new index where row \p i has been moved to; note that \p perm must point to an array of size at least
1918  /// #numRowsReal()
1919  void _removeRowsReal(int perm[]);
1920 
1921  /// remove all rows with indices in array \p idx of size \p n; an array \p perm of size #numRowsReal() may be passed
1922  /// as buffer memory
1923  void _removeRowsReal(int idx[], int n, int perm[]);
1924 
1925  /// removes rows \p start to \p end including both; an array \p perm of size #numRowsReal() may be passed as buffer
1926  /// memory
1927  void _removeRowRangeReal(int start, int end, int perm[]);
1928 
1929  /// removes column i
1930  void _removeColReal(int i);
1931 
1932  /// removes all columns with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
1933  /// new index where column \p i has been moved to; note that \p perm must point to an array of size at least
1934  /// #numColsReal()
1935  void _removeColsReal(int perm[]);
1936 
1937  /// remove all columns with indices in array \p idx of size \p n; an array \p perm of size #numColsReal() may be
1938  /// passed as buffer memory
1939  void _removeColsReal(int idx[], int n, int perm[]);
1940 
1941  /// removes columns \p start to \p end including both; an array \p perm of size #numColsReal() may be passed as
1942  /// buffer memory
1943  void _removeColRangeReal(int start, int end, int perm[]);
1944 
1945  /// invalidates solution
1946  void _invalidateSolution();
1947 
1948  /// enables simplifier and scaler according to current parameters
1950 
1951  /// disables simplifier and scaler
1953 
1954  /// ensures that the rational LP is available; performs no sync
1955  void _ensureRationalLP();
1956 
1957  /// ensures that the real LP and the basis are loaded in the solver; performs no sync
1958  void _ensureRealLPLoaded();
1959 
1960  /// call floating-point solver and update statistics on iterations etc.
1962 
1963  /// reads real LP in LP or MPS format from file and returns true on success; gets row names, column names, and
1964  /// integer variables if desired
1965  bool _readFileReal(const char* filename, NameSet* rowNames = 0, NameSet* colNames = 0, DIdxSet* intVars = 0);
1966 
1967  /// reads rational LP in LP or MPS format from file and returns true on success; gets row names, column names, and
1968  /// integer variables if desired
1969  bool _readFileRational(const char* filename, NameSet* rowNames = 0, NameSet* colNames = 0, DIdxSet* intVars = 0);
1970 
1971  /// completes range type arrays after adding columns and/or rows
1973 
1974  /// recomputes range types from scratch using real LP
1975  void _recomputeRangeTypesReal();
1976 
1977  /// recomputes range types from scratch using rational LP
1979 
1980  /// synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP, without looking at the sync mode
1981  void _syncLPReal(bool time = true);
1982 
1983  /// synchronizes rational LP with real LP, i.e., copies real LP to rational LP, without looking at the sync mode
1984  void _syncLPRational(bool time = true);
1985 
1986  /// synchronizes real solution with rational solution, i.e., copies real solution to rational solution
1987  void _syncRealSolution();
1988 
1989  /// synchronizes rational solution with real solution, i.e., copies (rounded) rational solution to real solution
1990  void _syncRationalSolution();
1991 
1992  /// returns pointer to a constant unit vector available until destruction of the SoPlex class
1993  const UnitVectorRational* _unitVectorRational(const int i);
1994 
1995  /// parses one line in a settings file and returns true on success; note that the string is modified
1996  bool _parseSettingsLine(char* line, const int lineNumber);
1997 
1998  //@}
1999 
2000 
2001  //**@name Private solving methods implemented in solverational.cpp */
2002  //@{
2003 
2004  /// solves rational LP
2005  void _optimizeRational();
2006 
2007  /// solves current problem with iterative refinement and recovery mechanism
2008  void _performOptIRStable(SolRational& sol,
2009  bool acceptUnbounded,
2010  bool acceptInfeasible,
2011  int minRounds,
2012  bool& primalFeasible,
2013  bool& dualFeasible,
2014  bool& infeasible,
2015  bool& unbounded,
2016  bool& stopped,
2017  bool& stoppedIter,
2018  bool& error);
2019 
2020  /// performs iterative refinement on the auxiliary problem for testing unboundedness
2021  void _performUnboundedIRStable(SolRational& sol, bool& hasUnboundedRay, bool& stopped, bool& stoppedIter, bool& error);
2022 
2023  /// performs iterative refinement on the auxiliary problem for testing feasibility
2024  void _performFeasIRStable(SolRational& sol, bool& withDualFarkas, bool& stopped, bool& stoppedIter, bool& error);
2025 
2026  /// reduces matrix coefficient in absolute value by the lifting procedure of Thiele et al. 2013
2027  void _lift();
2028 
2029  /// undoes lifting
2030  void _project(SolRational& sol);
2031 
2032  /// store basis
2033  void _storeBasis();
2034 
2035  /// restore basis
2036  void _restoreBasis();
2037 
2038  /// stores objective, bounds, and sides of real LP
2039  void _storeLPReal();
2040 
2041  /// restores objective, bounds, and sides of real LP
2042  void _restoreLPReal();
2043 
2044  /// introduces slack variables to transform inequality constraints into equations for both rational and real LP,
2045  /// which should be in sync
2046  void _transformEquality();
2047 
2048  /// undoes transformation to equality form
2049  void _untransformEquality(SolRational& sol);
2050 
2051  /// transforms LP to unboundedness problem by moving the objective function to the constraints, changing right-hand
2052  /// side and bounds to zero, and adding an auxiliary variable for the decrease in the objective function
2053  void _transformUnbounded();
2054 
2055  /// undoes transformation to unboundedness problem
2056  void _untransformUnbounded(SolRational& sol, bool unbounded);
2057 
2058  /// transforms LP to feasibility problem by removing the objective function, shifting variables, and homogenizing the
2059  /// right-hand side
2060  void _transformFeasibility();
2061 
2062  /// undoes transformation to feasibility problem
2063  void _untransformFeasibility(SolRational& sol, bool infeasible);
2064 
2065  /** computes radius of infeasibility box implied by an approximate Farkas' proof
2066 
2067  Given constraints of the form \f$ lhs <= Ax <= rhs \f$, a farkas proof y should satisfy \f$ y^T A = 0 \f$ and
2068  \f$ y_+^T lhs - y_-^T rhs > 0 \f$, where \f$ y_+, y_- \f$ denote the positive and negative parts of \f$ y \f$.
2069  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
2070  as the following holds for all potentially feasible \f$ x \f$:
2071 
2072  \f[
2073  y^T Ax < (y_+^T lhs - y_-^T rhs) (*)
2074  \f]
2075 
2076  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
2077  bounds on \f$ x \f$ imply that all feasible \f$ x \f$ satisfy (*), and if not then compute bounds on \f$ x \f$ to
2078  guarantee (*). The simplest way to do this is to compute
2079 
2080  \f[
2081  B = (y_+^T lhs - y_-^T rhs) / \sum_i(|(y^T A)_i|)
2082  \f]
2083 
2084  noting that if every component of \f$ x \f$ has \f$ |x_i| < B \f$, then (*) holds.
2085 
2086  \f$ B \f$ can be increased by iteratively including variable bounds smaller than \f$ B \f$. The speed of this
2087  method can be further improved by using interval arithmetic for all computations. For related information see
2088  Sec. 4 of Neumaier and Shcherbina, Mathematical Programming A, 2004.
2089 
2090  Set transformed to true if this method is called after _transformFeasibility().
2091  */
2092  void _computeInfeasBox(SolRational& sol, bool transformed);
2093 
2094  /// solves real LP during iterative refinement
2095  SPxSolver::Status _solveRealForRational(bool fromscratch, VectorReal& primal, VectorReal& dual,
2096  DataArray< SPxSolver::VarStatus >& basisStatusRows,
2097  DataArray< SPxSolver::VarStatus >& basisStatusCols, bool& returnedBasis);
2098 
2099  /// solves real LP with recovery mechanism
2100  SPxSolver::Status _solveRealStable(bool acceptUnbounded, bool acceptInfeasible, VectorReal& primal, VectorReal& dual,
2101  DataArray< SPxSolver::VarStatus >& basisStatusRows,
2102  DataArray< SPxSolver::VarStatus >& basisStatusCols, bool& returnedBasis, const bool forceNoSimplifier = false);
2103 
2104  /// computes rational inverse of basis matrix as defined by _rationalLUSolverBind
2106 
2107  /// factorizes rational basis matrix in column representation
2108  void _factorizeColumnRational(SolRational& sol, DataArray< SPxSolver::VarStatus >& basisStatusRows, DataArray< SPxSolver::VarStatus >& basisStatusCols, bool& stoppedTime, bool& stoppedIter, bool& error, bool& optimal);
2109 
2110  /// attempts rational reconstruction of primal-dual solution
2111  bool _reconstructSolutionRational(SolRational& sol, DataArray< SPxSolver::VarStatus >& basisStatusRows, DataArray< SPxSolver::VarStatus >& basisStatusCols, const Rational& denomBoundSquared);
2112  //@}
2113 
2114 
2115  //**@name Private solving methods implemented in solvereal.cpp */
2116  //@{
2117 
2118  /// solves real LP
2119  void _optimizeReal();
2120 
2121  /// checks result of the solving process and solves again without preprocessing if necessary
2122  void _evaluateSolutionReal(SPxSimplifier::Result simplificationStatus);
2123 
2124  /// solves real LP with/without preprocessing
2125  void _preprocessAndSolveReal(bool applyPreprocessing);
2126 
2127  /// loads original problem into solver and solves again after it has been solved to optimality with preprocessing
2128  void _resolveWithoutPreprocessing(SPxSimplifier::Result simplificationStatus);
2129 
2130  /// verify computed solution and resolve if necessary
2131  void _verifySolutionReal();
2132 
2133  /// stores solution of the real LP; before calling this, the real LP must be loaded in the solver and solved (again)
2134  void _storeSolutionReal(bool verify = true);
2135 
2136  /// stores solution from the simplifier because problem vanished in presolving step
2138 
2139  /// unscales stored solution to remove internal or external scaling of LP
2140  void _unscaleSolutionReal(SPxLPReal& LP, bool persistent = true);
2141 
2142  /// load original LP and possibly setup a slack basis
2143  void _loadRealLP(bool initBasis);
2144 
2145  /// check scaling of LP
2146  void _checkScaling(SPxLPReal* origLP) const;
2147 
2148  /// check correctness of (un)scaled basis matrix operations
2149  void _checkBasisScaling();
2150 
2151  /// check whether persistent scaling is supposed to be reapplied again after unscaling
2152  bool _reapplyPersistentScaling() const;
2153 
2154  /// solves LP using the decomposition based dual simplex
2156 
2157  /// creating copies of the original problem that will be manipulated to form the reduced and complementary problems
2159 
2160  /// forms the reduced problem
2161  void _formDecompReducedProblem(bool& stop);
2162 
2163  /// solves the reduced problem
2165 
2166  /// forms the complementary problem
2168 
2169  /// simplifies the problem and solves
2170  void _decompSimplifyAndSolve(SPxSolver& solver, SLUFactor& sluFactor, bool fromScratch, bool applyPreprocessing);
2171 
2172  /// loads original problem into solver and solves again after it has been solved to optimality with preprocessing
2174 
2175  /// identifies the columns of the row-form basis that correspond to rows with zero dual multipliers.
2176  void _getZeroDualMultiplierIndices(Vector feasVector, int* nonposind, int* colsforremoval,
2177  int* nnonposind, bool& stop);
2178 
2179  /// retrieves the compatible columns from the constraint matrix
2180  void _getCompatibleColumns(Vector feasVector, int* nonposind, int* compatind, int* rowsforremoval, int* colsforremoval,
2181  int nnonposind, int* ncompatind, bool formRedProb, bool& stop);
2182 
2183  /// computes the reduced problem objective coefficients
2184  void _computeReducedProbObjCoeff(bool& stop);
2185 
2186  /// computes the compatible bound constraints and adds them to the reduced problem
2187  void _getCompatibleBoundCons(LPRowSet& boundcons, int* compatboundcons, int* nonposind, int* ncompatboundcons,
2188  int nnonposind, bool& stop);
2189 
2190  /// computes the rows to remove from the complementary problem
2191  void _getRowsForRemovalComplementaryProblem(int* nonposind, int* bind, int* rowsforremoval, int* nrowsforremoval,
2192  int nnonposind);
2193 
2194  /// removing rows from the complementary problem.
2195  void _deleteAndUpdateRowsComplementaryProblem(SPxRowId rangedRowIds[], int& naddedrows);
2196 
2197  /// evaluates the solution of the reduced problem for the DBDS
2198  void _evaluateSolutionDecomp(SPxSolver& solver, SLUFactor& sluFactor, SPxSimplifier::Result result);
2199 
2200  /// update the reduced problem with additional columns and rows
2201  void _updateDecompReducedProblem(Real objVal, DVector dualVector, DVector redcostVector, DVector compPrimalVector,
2202  DVector compDualVector);
2203 
2204  /// update the reduced problem with additional columns and rows based upon the violated original bounds and rows
2205  void _updateDecompReducedProblemViol(bool allrows);
2206 
2207  /// builds the update rows with those violated in the complmentary problem
2208  void _findViolatedRows(Real compObjValue, DataArray<RowViolation>& violatedrows, int& nviolatedrows);
2209 
2210  /// update the dual complementary problem with additional columns and rows
2211  void _updateDecompComplementaryDualProblem(bool origObj);
2212 
2213  /// update the primal complementary problem with additional columns and rows
2214  void _updateDecompComplementaryPrimalProblem(bool origObj);
2215 
2216  /// checking the optimality of the original problem.
2217  void _checkOriginalProblemOptimality(Vector primalVector, bool printViol);
2218 
2219  /// updating the slack column coefficients to adjust for equality constraints
2221 
2222  /// updating the slack column coefficients to adjust for equality constraints
2224 
2225  /// removing the dual columns related to the fixed variables
2226  void _removeComplementaryDualFixedPrimalVars(int* currFixedVars);
2227 
2228  /// removing the dual columns related to the fixed variables
2229  void _identifyComplementaryDualFixedPrimalVars(int* currFixedVars);
2230 
2231  /// updating the dual columns related to the fixed primal variables.
2232  void _updateComplementaryDualFixedPrimalVars(int* currFixedVars);
2233 
2234  /// removing the dual columns related to the fixed variables
2235  void _identifyComplementaryPrimalFixedPrimalVars(int* currFixedVars);
2236 
2237  /// updating the dual columns related to the fixed primal variables.
2238  void _updateComplementaryPrimalFixedPrimalVars(int* currFixedVars);
2239 
2240  /// updating the complementary dual problem with the original objective function
2242 
2243  /// updating the complementary primal problem with the original objective function
2245 
2246  /// determining which bound the primal variables will be fixed to.
2247  int getOrigVarFixedDirection(int colNum);
2248 
2249  /// checks the dual feasibility of the current basis
2250  bool checkBasisDualFeasibility(Vector feasVec);
2251 
2252  /// returns the expected sign of the dual variables for the reduced problem
2253  DualSign getExpectedDualVariableSign(int rowNumber);
2254 
2255  /// returns the expected sign of the dual variables for the original problem
2256  DualSign getOrigProbDualVariableSign(int rowNumber);
2257 
2258  /// prints a display line of the flying table for the DBDS
2259  void printDecompDisplayLine(SPxSolver& solver, const SPxOut::Verbosity origVerb, bool force, bool forceHead);
2260 
2261  /// stores the problem statistics of the original problem
2263 
2264  /// stores the problem statistics of the original problem
2265  void printOriginalProblemStatistics(std::ostream& os);
2266 
2267  /// gets the coefficient of the slack variable in the primal complementary problem
2268  Real getCompSlackVarCoeff(int primalRowNum);
2269 
2270  /// gets violation of bounds; returns true on success
2271  bool getDecompBoundViolation(Real& maxviol, Real& sumviol);
2272 
2273  /// gets violation of constraints; returns true on success
2274  bool getDecompRowViolation(Real& maxviol, Real& sumviol);
2275 
2276  /// function call to terminate the decomposition simplex
2277  bool decompTerminate(Real timeLimit);
2278 
2279  /// function to build a basis for the original problem as given by the solution to the reduced problem
2280  void _writeOriginalProblemBasis(const char* filename, NameSet* rowNames, NameSet* colNames, bool cpxFormat);
2281 
2282  /// function to retrieve the original problem row basis status from the reduced and complementary problems
2283  void getOriginalProblemBasisRowStatus(DataArray< int >& degenerateRowNums,
2284  DataArray< SPxSolver::VarStatus >& degenerateRowStatus, int& nDegenerateRows, int& nNonBasicRows);
2285 
2286  /// function to retrieve the column status for the original problem basis from the reduced and complementary problems
2287  void getOriginalProblemBasisColStatus(int& nNonBasicCols);
2288 
2289  //@}
2290 };
2291 }
2292 #else
2293 #include "soplexlegacy.h"
2294 
2295 namespace soplex
2296 {
2297  typedef SoPlexLegacy SoPlex;
2298 }
2299 #endif
2300 #endif // _SOPLEX_H_
void changeLhsRational(const VectorRational &lhs)
changes left-hand side vector for constraints to lhs
Definition: soplex.cpp:2089
int _lastSolveMode
Definition: soplex.h:1784
const VectorRational & rhsRational() const
returns right-hand side vector
Definition: soplex.cpp:1148
floating-point check
Definition: soplex.h:1194
Fast shifting ratio test.
RangeType
type of bounds and sides
Definition: soplex.h:1616
const char * getRatiotesterName()
name of currently loaded ratiotester
Definition: soplex.cpp:5072
textbook ratio test without stabilization
Definition: soplex.h:1142
void getRowsRational(int start, int end, LPRowSetRational &lprowset) const
gets rows start, ..., end.
Definition: soplex.cpp:1130
const VectorReal & maxObjRealInternal() const
returns objective function vector after transformation to a maximization problem; since this is how i...
Definition: soplex.cpp:1024
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:4733
void _changeUpperReal(const VectorReal &upper)
changes vector of upper bounds to upper and adjusts basis
Definition: soplex.cpp:7619
int _nCompPrimalCols
Definition: soplex.h:1744
accuracy of conjugate gradient method in least squares scaling (higher value leads to more iterations...
Definition: soplex.h:1312
SoPlex start basis generation base class.
zero tolerance used in factorization
Definition: soplex.h:1255
void getUpperReal(DVectorReal &upper) const
gets upper bound vector
Definition: soplex.cpp:968
Rational _rationalMaxscaleincr
Definition: soplex.h:1533
Bound flipping ratio test ("long step dual") for SoPlex.Class SPxBoundFlippingRT provides an implemen...
DVectorRational _unboundedRhs
Definition: soplex.h:1595
bool _reapplyPersistentScaling() const
check whether persistent scaling is supposed to be reapplied again after unscaling ...
Definition: solvereal.cpp:82
void printVersion() const
prints version and compilation options
Definition: soplex.cpp:6792
SoPlex()
default constructor
Definition: soplex.cpp:550
bool getDualViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of dual multipliers; returns true on success
Definition: soplex.cpp:3538
Types of solution classes.
SolRational _workSol
Definition: soplex.h:1791
void printSolutionStatistics(std::ostream &os)
prints solution statistics
Definition: soplex.cpp:6599
refactor threshold for memory growth in factorization since last refactorization
Definition: soplex.h:1309
void _transformEquality()
introduces slack variables to transform inequality constraints into equations for both rational and r...
SPxColId _compSlackColId
Definition: soplex.h:1706
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:1051
void _addColReal(const LPColReal &lpcol)
adds a single column to the real LP and adjusts basis
Definition: soplex.cpp:7323
int numRowsReal() const
returns number of rows
Definition: soplex.cpp:784
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:4067
Rational minAbsNonzeroRational() const
returns smallest non-zero element in absolute value
Definition: soplex.cpp:1103
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:2591
int _nDecompViolRows
Definition: soplex.h:1731
type of starter used to create crash basis
Definition: soplex.h:952
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:1801
const RowViolation * entry
Definition: soplex.h:1663
void _optimizeReal()
solves real LP
Definition: solvereal.cpp:29
const Settings & settings() const
returns current parameter settings
Definition: soplex.cpp:5532
upper limit on objective value
Definition: soplex.h:1273
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:7710
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:1252
Result
Result of the simplification.
Definition: spxsimplifier.h:81
mode for solution polishing
Definition: soplex.h:985
Real _realParamValues[SoPlex::REALPARAM_COUNT]
array of current real parameter values
Definition: soplex.h:1399
void _changeRangeReal(const VectorReal &lhs, const VectorReal &rhs)
changes left- and right-hand side vectors and adjusts basis
Definition: soplex.cpp:7501
type of ratio test
Definition: soplex.h:958
void removeColReal(int i)
removes column i
Definition: soplex.cpp:1775
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:1282
SPxMainSM _simplifierMainSM
Definition: soplex.h:1543
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:820
verbosity level
Definition: soplex.h:943
continue iterative refinement with exact basic solution if not optimal?
Definition: soplex.h:897
int origCountLower
Definition: soplex.h:1764
type of timer
Definition: soplex.h:973
const SVectorReal & colVectorRealInternal(int i) const
returns vector of col i, ignoring scaling
Definition: soplex.cpp:932
int numRedProbIter
Definition: soplex.h:1754
DVectorRational _feasLhs
Definition: soplex.h:1598
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:1716
DataArray< SPxRowId > _decompElimPrimalRowIDs
Definition: soplex.h:1718
number of real parameters
Definition: soplex.h:1318
apply standard floating-point algorithm
Definition: soplex.h:1181
int origCountRhs
Definition: soplex.h:1770
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:919
void changeColRational(int i, const LPColRational &lpcol)
replaces column i with lpcol
Definition: soplex.cpp:2272
void _setComplementaryPrimalOriginalObjective()
updating the complementary primal problem with the original objective function
Definition: solvedbds.cpp:3178
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:4869
Abstract pricer base class.
bool getPrimalReal(VectorReal &vector)
gets the primal solution vector if available; returns true on success
Definition: soplex.cpp:2948
int origCountUpper
Definition: soplex.h:1765
pivot zero tolerance used in factorization
Definition: soplex.h:1261
equilibrium scaling on rows or columns
Definition: soplex.h:1085
int numRowsRational() const
returns number of rows
Definition: soplex.cpp:1076
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:5144
SPxSolver::Status solve()
Definition: soplex.h:573
objective offset
Definition: soplex.h:1315
DataArray< SPxRowId > _decompReducedProbColRowIDs
Definition: soplex.h:1714
refinement limit (-1 if unlimited)
Definition: soplex.h:934
bool getDualRational(VectorRational &vector)
gets the dual solution vector if available; returns true on success
Definition: soplex.cpp:3308
class of parameter settings
Definition: soplex.h:1331
SPxLPRational * _rationalLP
Definition: soplex.h:1587
void printShortStatistics(std::ostream &os)
prints short statistics
Definition: soplex.cpp:6688
Solution vector based start basis.
Real coefReal(int row, int col) const
returns (unscaled) coefficient
Definition: soplex.cpp:829
bool getSlacksRational(VectorRational &vector)
gets the vector of slack values if available; returns true on success
Definition: soplex.cpp:3278
standard Harris ratio test
Definition: soplex.h:1145
bool multBasis(Real *vec, bool unscale=true)
multiply with basis matrix; B * vec (inplace)
Definition: soplex.cpp:4623
void getColsRational(int start, int end, LPColSetRational &lpcolset) const
gets columns start, ..., end
Definition: soplex.cpp:1202
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:3744
void _addColsReal(const LPColSetReal &lpcolset)
adds multiple columns to the real LP and adjusts basis
Definition: soplex.cpp:7366
unsigned int randomSeed() const
returns the current random seed of the solver instance
Definition: soplex.cpp:7099
LPRowSet _transformedRows
Definition: soplex.h:1705
int _nDecompViolBounds
Definition: soplex.h:1730
DVector _transformedObj
Definition: soplex.h:1703
time limit in seconds (INFTY if unlimited)
Definition: soplex.h:1267
mode for iterative refinement strategy
Definition: soplex.h:967
SPxGeometSC _scalerGeo8
Definition: soplex.h:1547
void changeRangeReal(const VectorReal &lhs, const VectorReal &rhs)
changes left- and right-hand side vectors
Definition: soplex.cpp:1469
Rational _rationalFeastol
Definition: soplex.h:1531
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:5449
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:7826
modified Harris ratio test
Definition: soplex.h:1148
virtual ~SoPlex()
destructor
Definition: soplex.cpp:743
bool getRedCostRational(VectorRational &vector)
gets the vector of reduced cost values if available; returns true on success
Definition: soplex.cpp:3323
LP geometric mean scaling.
int _unscaleCalls
Definition: soplex.h:1803
crash basis from a greedy solution
Definition: soplex.h:1110
primal feasibility tolerance
Definition: soplex.h:1246
static struct soplex::SoPlex::Settings::RealParam realParam
Definition: soplex.cpp:544
standard verbosity level
Definition: soplex.h:1059
bound flipping ratio test for long steps in the dual simplex
Definition: soplex.h:1151
void _storeSolutionRealFromPresol()
stores solution from the simplifier because problem vanished in presolving step
Definition: solvereal.cpp:562
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:5351
Abstract ratio test base class.
void _addRowReal(const LPRowReal &lprow)
adds a single row to the real LP and adjusts basis
Definition: soplex.cpp:7270
DVectorRational _feasLower
Definition: soplex.h:1600
DVectorRational _feasRhs
Definition: soplex.h:1599
bool defaultValue[SoPlex::BOOLPARAM_COUNT]
array of default values for boolean parameters
Definition: soplex.h:1342
SPxScaler * _scaler
Definition: soplex.h:1566
std::string name[SoPlex::BOOLPARAM_COUNT]
array of names for boolean parameters
Definition: soplex.h:1338
cpu or user time
Definition: soplex.h:1210
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:5158
void changeRangeRational(const VectorRational &lhs, const VectorRational &rhs)
changes left- and right-hand side vectors
Definition: soplex.cpp:2212
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:964
mode for synchronizing real and rational LP
Definition: soplex.h:961
void _syncLPReal(bool time=true)
synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP...
Definition: soplex.cpp:8208
void _optimizeRational()
solves rational LP
bool getDualFarkasReal(VectorReal &vector)
gets the Farkas proof if available; returns true on success
Definition: soplex.cpp:3023
void resetSettings(const bool quiet=false, const bool init=true)
resets default parameter settings
Definition: soplex.cpp:6143
automatic sync of real and rational LP
Definition: soplex.h:1161
void _recomputeRangeTypesRational()
recomputes range types from scratch using rational LP
Definition: soplex.cpp:8195
void _unscaleSolutionReal(SPxLPReal &LP, bool persistent=true)
unscales stored solution to remove internal or external scaling of LP
Definition: solvereal.cpp:645
iteration limit (-1 if unlimited)
Definition: soplex.h:931
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:1636
void changeRowRational(int i, const LPRowRational &lprow)
replaces row i with lprow
Definition: soplex.cpp:2069
Implementation of Sparse Linear Solver.
bool getRowViolationReal(Real &maxviol, Real &sumviol)
gets violation of constraints; returns true on success
Definition: soplex.cpp:3077
SPxFastRT _ratiotesterFast
Definition: soplex.h:1560
should cycling solutions be accepted during iterative refinement?
Definition: soplex.h:888
void _disableSimplifierAndScaler()
disables simplifier and scaler
Definition: soplex.cpp:7922
bool getRowViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of constraints; returns true on success
Definition: soplex.cpp:3404
static struct soplex::SoPlex::Settings::IntParam intParam
Definition: soplex.cpp:543
should the decomposition based dual simplex be used to solve the LP? Setting this to true forces the ...
Definition: soplex.h:876
DataArray< SPxSolver::VarStatus > _storedBasisStatusCols
Definition: soplex.h:1609
Real lowerReal(int i) const
returns lower bound of column i
Definition: soplex.cpp:986
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:4885
Implementation of Sparse Linear Solver with Rational precision.
bool * _decompReducedProbCols
Definition: soplex.h:1709
int _nDualCols
Definition: soplex.h:1742
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:1748
void _removeRowReal(int i)
removes row i and adjusts basis
Definition: soplex.cpp:7733
lower bound is finite, upper bound is infinite
Definition: soplex.h:1622
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:8081
decide according to problem size
Definition: soplex.h:1223
SoPlex start basis generation base class.SPxStarter is the virtual base class for classes generating ...
Definition: spxstarter.h:41
int _nElimPrimalRows
Definition: soplex.h:1740
void addColsRational(const LPColSetRational &lpcolset)
adds multiple columns
Definition: soplex.cpp:2050
Real upperReal(int i) const
returns upper bound of column i
Definition: soplex.cpp:959
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:1193
const char * getStarterName()
name of starter
Definition: soplex.cpp:5031
DVectorReal _manualObj
Definition: soplex.h:1578
int origCountBoxed
Definition: soplex.h:1766
objective sense
Definition: soplex.h:916
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:3196
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:5081
Ids for LP columns.Class SPxColId provides DataKeys for the column indices of an SPxLP.
Definition: spxid.h:36
display frequency
Definition: soplex.h:940
void _ensureRationalLP()
ensures that the rational LP is available; performs no sync
Definition: soplex.cpp:7936
minimum number of stalling refinements since last pivot to trigger rational factorization ...
Definition: soplex.h:979
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:1300
void getRowVectorReal(int i, DSVectorReal &row) const
gets vector of row i
Definition: soplex.cpp:852
bool writeFileReal(const char *filename, const NameSet *rowNames=0, const NameSet *colNames=0, const DIdxSet *intvars=0, const bool unscale=false) const
writes real LP to file; LP or MPS format is chosen from the extension in filename; if rowNames and co...
Definition: soplex.cpp:5099
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:6115
void _changeRhsReal(const VectorReal &rhs)
changes right-hand side vector to rhs and adjusts basis
Definition: soplex.cpp:7459
void changeElementReal(int i, int j, const Real &val)
changes matrix entry in row i and column j to val
Definition: soplex.cpp:1668
Devex pricer.
disable timing
Definition: soplex.h:1207
void printStatistics(std::ostream &os)
prints complete statistics
Definition: soplex.cpp:6699
Real rhsReal(int i) const
returns right-hand side of row i
Definition: soplex.cpp:887
bool getDecompBoundViolation(Real &maxviol, Real &sumviol)
gets violation of bounds; returns true on success
Definition: solvedbds.cpp:3602
should a rational factorization be performed after iterative refinement?
Definition: soplex.h:872
int origCountRanged
Definition: soplex.h:1771
mode for hyper sparse pricing
Definition: soplex.h:976
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:878
maximum number of updates without fresh factorization
Definition: soplex.h:928
SPxSolver _compSolver
Definition: soplex.h:1695
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:2735
void changeUpperRational(const VectorRational &upper)
changes vector of upper bounds to upper
Definition: soplex.cpp:2352
bool _boolParamValues[SoPlex::BOOLPARAM_COUNT]
array of current boolean parameter values
Definition: soplex.h:1393
Rational _rationalPosInfty
Definition: soplex.h:1529
int numDecompIter
Definition: soplex.h:1753
number of integer parameters
Definition: soplex.h:1000
DataArray< SPxColId > _decompCompPrimalColIDs
Definition: soplex.h:1728
Rational _rationalOpttol
Definition: soplex.h:1532
RealParam
real parameters
Definition: soplex.h:1243
bool setDualNorms(int nnormsRow, int nnormsCol, Real *norms)
sets steepest edge norms and returns false if that&#39;s not possible
Definition: soplex.cpp:1059
static struct soplex::SoPlex::Settings::BoolParam boolParam
Definition: soplex.cpp:542
LP simplification base class.
const VectorRational & lhsRational() const
returns left-hand side vector
Definition: soplex.cpp:1166
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:5125
SPxEquiliSC _scalerBiequi
Definition: soplex.h:1545
int numNonzerosRational() const
returns number of nonzeros
Definition: soplex.cpp:1094
steepest edge pricer with exact initialization of norms
Definition: soplex.h:1135
int origCountFreeRow
Definition: soplex.h:1772
DataArray< SPxColId > _decompReducedProbColIDs
Definition: soplex.h:1715
full verbosity level
Definition: soplex.h:1065
only error, warning, and debug output
Definition: soplex.h:1056
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:1849
void addColReal(const LPCol &lpcol)
adds a single column
Definition: soplex.cpp:1340
Rational objRational(int i) const
returns objective value of column i
Definition: soplex.cpp:1275
void clearLPRational()
clears the LP
Definition: soplex.cpp:2753
void _solveDecompReducedProblem()
solves the reduced problem
DVectorRational _modLhs
Definition: soplex.h:1604
DataArray< SPxRowId > _decompReducedProbRowIDs
Definition: soplex.h:1713
DVectorReal _manualLower
Definition: soplex.h:1574
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:1964
void printOriginalProblemStatistics(std::ostream &os)
stores the problem statistics of the original problem
Definition: solvedbds.cpp:3532
SPxSolver::Status optimize()
optimize the given LP
Definition: soplex.cpp:2788
Steepest edge pricer.
void getObjReal(VectorReal &obj) const
gets objective function vector
Definition: soplex.cpp:1005
void getLowerReal(DVectorReal &lower) const
gets lower bound vector
Definition: soplex.cpp:995
void addRowRational(const LPRowRational &lprow)
adds a single row
Definition: soplex.cpp:1899
void addColRational(const LPColRational &lpcol)
adds a single column
Definition: soplex.cpp:1983
const UnitVectorRational * _unitVectorRational(const int i)
returns pointer to a constant unit vector available until destruction of the SoPlex class ...
Definition: soplex.cpp:8275
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:7138
void _syncRealSolution()
synchronizes real solution with rational solution, i.e., copies real solution to rational solution ...
Definition: soplex.cpp:8251
SLUFactor _compSlufactor
Definition: soplex.h:1699
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:2686
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:1306
void changeRhsRational(const VectorRational &rhs)
changes right-hand side vector to rhs
Definition: soplex.cpp:2149
standard floating-point parsing
Definition: soplex.h:1171
int dmaxSizeDualRational(const int base=2)
get size of largest denominator in dual solution
Definition: soplex.cpp:3814
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:7107
DataArray< SPxRowId > _decompCompPrimalRowIDs
Definition: soplex.h:1727
void _updateComplementaryPrimalFixedPrimalVars(int *currFixedVars)
updating the dual columns related to the fixed primal variables.
Definition: solvedbds.cpp:3070
int dlcmSizePrimalRational(const int base=2)
get size of least common multiple of denominators in primal solution
Definition: soplex.cpp:3772
Rational objValueRational()
returns the objective value if a primal solution is available
Definition: soplex.cpp:3227
void getBasis(SPxSolver::VarStatus rows[], SPxSolver::VarStatus cols[]) const
gets current basis via arrays of statuses
Definition: soplex.cpp:3918
DataArray< SPxSolver::VarStatus > _basisStatusCols
Definition: soplex.h:1787
DVectorRational _unboundedLower
Definition: soplex.h:1592
decide depending on tolerances whether to apply iterative refinement
Definition: soplex.h:1184
void getLhsReal(DVectorReal &lhs) const
gets left-hand side vector
Definition: soplex.cpp:905
decompStatus _currentProb
Definition: soplex.h:1775
DVectorReal _manualRhs
Definition: soplex.h:1577
DataArray< RangeType > _colTypes
Definition: soplex.h:1634
type of scaler
Definition: soplex.h:949
automatic choice according to number of rows and columns
Definition: soplex.h:1017
double Real
Definition: spxdefines.h:214
Rational _rationalPosone
Definition: soplex.h:1805
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:1757
SPxBoundFlippingRT _ratiotesterBoundFlipping
Definition: soplex.h:1561
bool _isRealLPLoaded
Definition: soplex.h:1569
SLUFactorRational _rationalLUSolver
Definition: soplex.h:1588
geometric mean scaling on rows and columns, max 8 rounds
Definition: soplex.h:1094
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:1121
void _solveRealLPAndRecordStatistics()
call floating-point solver and update statistics on iterations etc.
Definition: soplex.cpp:7976
void _evaluateSolutionDecomp(SPxSolver &solver, SLUFactor &sluFactor, SPxSimplifier::Result result)
evaluates the solution of the reduced problem for the DBDS
Definition: solvedbds.cpp:3225
number of boolean parameters
Definition: soplex.h:909
void _setComplementaryDualOriginalObjective()
updating the complementary dual problem with the original objective function
Definition: solvedbds.cpp:3108
SPxEquiliSC _scalerUniequi
Definition: soplex.h:1544
void printSolvingStatistics(std::ostream &os)
prints statistics on solving process
Definition: soplex.cpp:6679
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:8122
lower threshold in lifting (nonzero matrix coefficients with smaller absolute value will be reformula...
Definition: soplex.h:1285
bool getPrimalRayReal(VectorReal &vector)
gets the primal ray if available; returns true on success
Definition: soplex.cpp:2978
bool hasPrimal() const
is a primal feasible solution available?
Definition: soplex.cpp:2890
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:1395
bool getDecompRowViolation(Real &maxviol, Real &sumviol)
gets violation of constraints; returns true on success
Definition: solvedbds.cpp:3680
int _beforeLiftCols
Definition: soplex.h:1613
greedy crash basis weighted by objective, bounds, and sides
Definition: soplex.h:1107
bool hasDualFarkas() const
is Farkas proof of infeasibility available?
Definition: soplex.cpp:2914
bool _isConsistent() const
checks consistency
Definition: soplex.cpp:7150
void _changeLowerReal(const VectorReal &lower)
changes vector of lower bounds to lower and adjusts basis
Definition: soplex.cpp:7577
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:994
dual simplex algorithm, i.e., leaving for column and entering for row representation ...
Definition: soplex.h:1033
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:1132
Rational maxAbsNonzeroRational() const
returns biggest non-zero element in absolute value
Definition: soplex.cpp:1112
use persistent scaling?
Definition: soplex.h:903
bool computeBasisInverseRational()
compute rational basis inverse; returns true on success
Definition: soplex.cpp:4841
bool _upperFinite(const RangeType &rangeType) const
checks whether RangeType corresponds to finite upper bound
Definition: soplex.cpp:7262
bool _hasBasis
Definition: soplex.h:1793
use bound flipping also for row representation?
Definition: soplex.h:900
bool hasBasis() const
is an advanced starting basis available?
Definition: soplex.cpp:3828
void _invalidateSolution()
invalidates solution
Definition: soplex.cpp:7861
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:4253
bool getDualViolationReal(Real &maxviol, Real &sumviol)
gets violation of dual multipliers; returns true on success
Definition: soplex.cpp:3173
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:4909
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:5042
void changeLowerReal(const VectorReal &lower)
changes vector of lower bounds to lower
Definition: soplex.cpp:1525
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:5064
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:1806
main LP solver class
SPxRowId _compSlackDualRowId
Definition: soplex.h:1707
DVectorRational _feasObj
Definition: soplex.h:1597
round scaling factors for iterative refinement to powers of two?
Definition: soplex.h:894
SPxBasis::SPxStatus basisStatus() const
returns the current basis status
Definition: soplex.cpp:3836
void _computeInfeasBox(SolRational &sol, bool transformed)
void removeRowReal(int i)
removes row i
Definition: soplex.cpp:1683
Forrest-Tomlin type update.
Definition: soplex.h:1043
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:4458
int dlcmSizeDualRational(const int base=2)
get size of least common multiple of denominators in dual solution
Definition: soplex.cpp:3786
Auto pricer.
SPxWeightST _starterWeight
Definition: soplex.h:1549
Statistics * _statistics
statistics since last call to solveReal() or solveRational()
Definition: soplex.h:1516
void _evaluateSolutionReal(SPxSimplifier::Result simplificationStatus)
checks result of the solving process and solves again without preprocessing if necessary ...
Definition: solvereal.cpp:93
LPColSetRational _slackCols
Definition: soplex.h:1591
type of simplifier
Definition: soplex.h:946
int origCountFreeCol
Definition: soplex.h:1767
int numNonzeros
Definition: soplex.h:1760
Real getCompSlackVarCoeff(int primalRowNum)
gets the coefficient of the slack variable in the primal complementary problem
Definition: solvedbds.cpp:3555
void getColVectorReal(int i, DSVectorReal &col) const
gets vector of col i
Definition: soplex.cpp:941
DVectorRational _feasUpper
Definition: soplex.h:1601
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:7762
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:8232
void printUserSettings()
print non-default parameter values
Definition: soplex.cpp:6162
void changeBoundsReal(const VectorReal &lower, const VectorReal &upper)
changes vectors of column bounds to lower and upper
Definition: soplex.cpp:1600
RangeType _rangeTypeRational(const Rational &lower, const Rational &upper) const
determines RangeType from rational bounds
Definition: soplex.cpp:7216
SPxSteepPR _pricerQuickSteep
Definition: soplex.h:1556
int numColsRational() const
returns number of columns
Definition: soplex.cpp:1085
void syncLPReal()
synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP...
Definition: soplex.cpp:1888
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:1553
SPxParMultPR _pricerParMult
Definition: soplex.h:1554
bool getPrimalRational(VectorRational &vector)
gets the primal solution vector if available; returns true on success
Definition: soplex.cpp:3263
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:2472
std::string statisticString() const
statistical information in form of a string
Definition: soplex.cpp:5015
RangeType _switchRangeType(const RangeType &rangeType) const
switches RANGETYPE_LOWER to RANGETYPE_UPPER and vice versa
Definition: soplex.cpp:7241
SLUFactor _slufactor
Definition: soplex.h:1542
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:4988
const SVectorReal & rowVectorRealInternal(int i) const
returns vector of row i, ignoring scaling
Definition: soplex.cpp:843
void syncLPRational()
synchronizes rational LP with real LP, i.e., copies real LP to rational LP, if sync mode is manual ...
Definition: soplex.cpp:2777
bool getRedCostReal(VectorReal &vector)
gets the vector of reduced cost values if available; returns true on success
Definition: soplex.cpp:3008
DataArray< SPxColId > _decompPrimalColIDs
Definition: soplex.h:1717
Simple heuristic SPxStarter.
DVectorRational _modUpper
Definition: soplex.h:1603
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:1739
user sync of real and rational LP
Definition: soplex.h:1164
SPxSteepExPR _pricerSteep
Definition: soplex.h:1557
void _verifySolutionReal()
verify computed solution and resolve if necessary
Definition: solvereal.cpp:359
bool hasDual() const
is a dual feasible solution available?
Definition: soplex.cpp:2906
bool parseSettingsString(char *line)
parses one setting string and returns true on success; note that string is modified ...
Definition: soplex.cpp:6344
const VectorReal & upperRealInternal() const
returns upper bound vector
Definition: soplex.cpp:950
SPxOut spxout
Definition: soplex.h:1416
infinity threshold
Definition: soplex.h:1264
void changeBoundsRational(const VectorRational &lower, const VectorRational &upper)
changes vectors of column bounds to lower and upper
Definition: soplex.cpp:2412
const SVectorRational & colVectorRational(int i) const
returns vector of column i
Definition: soplex.cpp:1211
int numIterations() const
number of iterations since last call to solve
Definition: soplex.cpp:4999
SPxDefaultRT _ratiotesterTextbook
Definition: soplex.h:1558
void _loadRealLP(bool initBasis)
load original LP and possibly setup a slack basis
Definition: solvereal.cpp:632
(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:1527
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:4934
Real lhsReal(int i) const
returns left-hand side of row i
Definition: soplex.cpp:914
LPRowReal::Type rowTypeReal(int i) const
returns inequality type of row i
Definition: soplex.cpp:923
only error and warning output
Definition: soplex.h:1053
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:3973
void _syncRationalSolution()
synchronizes rational solution with real solution, i.e., copies (rounded) rational solution to real s...
Definition: soplex.cpp:8263
int _intParamValues[SoPlex::INTPARAM_COUNT]
array of current integer parameter values
Definition: soplex.h:1396
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:6832
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:1612
DataArray< SPxColId > _decompFixedVarDualIDs
Definition: soplex.h:1721
partial multiple pricer based on Dantzig pricing
Definition: soplex.h:1126
lower and upper bound finite, but different
Definition: soplex.h:1628
DualSign getOrigProbDualVariableSign(int rowNumber)
returns the expected sign of the dual variables for the original problem
Definition: solvedbds.cpp:3402
Sequential object-oriented SimPlex.SPxSolver is an LP solver class using the revised Simplex algorith...
Definition: spxsolver.h:84
DVectorReal _manualLhs
Definition: soplex.h:1576
equilibrium scaling on rows and columns
Definition: soplex.h:1088
bool _storedBasis
Definition: soplex.h:1611
void _storeLPReal()
stores objective, bounds, and sides of real LP
LP least squares scaling.
Rational _rationalNegInfty
Definition: soplex.h:1530
const SVectorRational & rowVectorRational(int i) const
returns vector of row i
Definition: soplex.cpp:1139
DataArray< SPxColId > _decompCompPrimalFixedVarIDs
Definition: soplex.h:1724
void printStatus(std::ostream &os, SPxSolver::Status status)
prints status
Definition: soplex.cpp:6726
threshold on number of rows vs. number of columns for switching from column to row representations in...
Definition: soplex.h:1294
lower bound equals upper bound
Definition: soplex.h:1631
Collection of dense, sparse, and semi-sparse vectors.
column representation Ax - s = 0, lower <= x <= upper, lhs <= s <= rhs
Definition: soplex.h:1020
bool getSlacksReal(VectorReal &vector)
gets the vector of slack values if available; returns true on success
Definition: soplex.cpp:2963
Implementation of Sparse Linear Solver.This class implements a SLinSolver interface by using the spar...
Definition: slufactor.h:41
automatic pricer
Definition: soplex.h:1120
int * _decompViolatedRows
Definition: soplex.h:1733
DataArray< SPxColId > _decompVarBoundDualIDs
Definition: soplex.h:1722
DataArray< SPxRowId > _decompDualRowIDs
Definition: soplex.h:1719
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:5936
void _changeLhsReal(const VectorReal &lhs)
changes left-hand side vector for constraints to lhs and adjusts basis
Definition: soplex.cpp:7418
int numCompProbIter
Definition: soplex.h:1755
DVectorReal _manualUpper
Definition: soplex.h:1575
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:4028
working tolerance for feasibility in floating-point solver during iterative refinement ...
Definition: soplex.h:1276
SPxLPReal * _realLP
Definition: soplex.h:1563
bool _lowerFinite(const RangeType &rangeType) const
checks whether RangeType corresponds to finite lower bound
Definition: soplex.cpp:7254
the maximum number of rows that are added in each iteration of the decomposition based simplex ...
Definition: soplex.h:991
bool loadSettingsFile(const char *filename)
reads settings file; returns true on success
Definition: soplex.cpp:6295
SPxGeometSC _scalerGeo1
Definition: soplex.h:1546
void _preprocessAndSolveReal(bool applyPreprocessing)
solves real LP with/without preprocessing
Definition: solvereal.cpp:185
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:802
SoPlex & operator=(const SoPlex &rhs)
assignment operator
Definition: soplex.cpp:610
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:3457
Harris pricing with shifting.
SPxDevexPR _pricerDevex
Definition: soplex.h:1555
Real minAbsNonzero
Definition: soplex.h:1761
DVector _decompFeasVector
Definition: soplex.h:1704
Real objReal(int i) const
returns objective value of column i
Definition: soplex.cpp:1014
DataArray< RangeType > _rowTypes
Definition: soplex.h:1635
void _removeColReal(int i)
removes column i
Definition: soplex.cpp:7797
void _changeRowReal(int i, const LPRowReal &lprow)
replaces row i with lprow and adjusts basis
Definition: soplex.cpp:7393
void setIntegralityInformation(int ncols, int *intInfo)
pass integrality information about the variables to the solver
Definition: soplex.cpp:1067
DVectorRational _modObj
Definition: soplex.h:1606
SPxSumST _starterSum
Definition: soplex.h:1550
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:3958
row representation (lower,lhs) <= (x,Ax) <= (upper,rhs)
Definition: soplex.h:1023
apply rational reconstruction after each iterative refinement?
Definition: soplex.h:891
void _changeColReal(int i, const LPColReal &lpcol)
replaces column i with lpcol and adjusts basis
Definition: soplex.cpp:7550
void _formDecompComplementaryProblem()
forms the complementary problem
Definition: solvedbds.cpp:720
Real minAbsNonzeroReal() const
returns smallest non-zero element in absolute value
Definition: soplex.cpp:811
Weighted start basis.
type of pricer
Definition: soplex.h:955
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:977
bool getDualReal(VectorReal &vector)
gets the dual solution vector if available; returns true on success
Definition: soplex.cpp:2993
SPxHarrisRT _ratiotesterHarris
Definition: soplex.h:1559
int * _fixedOrigVars
Definition: soplex.h:1736
int * _decompRowStatus
Definition: soplex.h:1710
void changeColReal(int i, const LPColReal &lpcol)
replaces column i with lpcol
Definition: soplex.cpp:1506
Steepest edge pricer with exact initialization of weights.
working tolerance for optimality in floating-point solver during iterative refinement ...
Definition: soplex.h:1279
void clearLPReal()
clears the LP
Definition: soplex.cpp:1867
Preconfigured SoPlex LP-solver.
Definition: soplex.h:90
int _nCompPrimalRows
Definition: soplex.h:1743
should the dual of the complementary problem be used in the decomposition simplex?
Definition: soplex.h:882
void removeRowRational(int i)
removes row i
Definition: soplex.cpp:2564
Type
(In)Equality type of an LP row.
Definition: lprowbase.h:72
Real maxAbsNonzero
Definition: soplex.h:1762
DVectorRational _unboundedLhs
Definition: soplex.h:1594
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:3783
DSVectorRational _primalDualDiff
Definition: soplex.h:1607
minimize number of basic slack variables, i.e. more variables between bounds
Definition: soplex.h:1239
int _decompDisplayLine
Definition: soplex.h:1746
SPxVectorST _starterVector
Definition: soplex.h:1551
LP scaling base class.
DVectorRational _unboundedUpper
Definition: soplex.h:1593
bool getBoundViolationReal(Real &maxviol, Real &sumviol)
gets violation of bounds; returns true on success
Definition: soplex.cpp:3038
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:1220
NameSet * _colNames
Definition: soplex.h:1749
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:1197
SPxSolver _solver
Definition: soplex.h:1541
mode for a posteriori feasibility checks
Definition: soplex.h:970
refactor threshold for nonzeros in last factorized basis matrix compared to updated basis matrix ...
Definition: soplex.h:1303
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:3422
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:286
void _identifyComplementaryPrimalFixedPrimalVars(int *currFixedVars)
removing the dual columns related to the fixed variables
Definition: solvedbds.cpp:3041
int _optimizeCalls
Definition: soplex.h:1802
LPRowRational::Type rowTypeRational(int i) const
returns inequality type of row i
Definition: soplex.cpp:1184
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:922
bool * _decompReducedProbRows
Definition: soplex.h:1708
void _recomputeRangeTypesReal()
recomputes range types from scratch using real LP
Definition: soplex.cpp:8182
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:1610
bool getDualFarkasRational(VectorRational &vector)
gets the Farkas proof if LP is infeasible; returns true on success
Definition: soplex.cpp:3338
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:937
DataArray< SPxSolver::VarStatus > _basisStatusRows
Definition: soplex.h:1786
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:1769
SPxSolver::VarStatus basisColStatus(int col) const
returns basis status for a single column
Definition: soplex.cpp:3882
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:869
void getNdualNorms(int &nnormsRow, int &nnormsCol) const
gets number of available dual norms
Definition: soplex.cpp:1043
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
generic solution-based crash basis
Definition: soplex.h:1113
std::string description[SoPlex::BOOLPARAM_COUNT]
array of descriptions for boolean parameters
Definition: soplex.h:1340
SPxBasis _decompTransBasis
Definition: soplex.h:1701
const VectorReal & rhsRealInternal() const
returns right-hand side vector, ignoring scaling
Definition: soplex.cpp:869
the verbosity of the decomposition based simplex
Definition: soplex.h:997
should lifting be used to reduce range of nonzero matrix coefficients?
Definition: soplex.h:863
int dmaxSizePrimalRational(const int base=2)
get size of largest denominator in primal solution
Definition: soplex.cpp:3800
bool getEstimatedCondition(Real &condition)
computes an estimated condition number for the current basis matrix using the power method; returns t...
Definition: soplex.cpp:4037
Real maxObjReal(int i) const
returns objective value of column i after transformation to a maximization problem; since this is how...
Definition: soplex.cpp:1034
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:410
void setRandomSeed(unsigned int seed)
set the random seeds of the solver instance
Definition: soplex.cpp:7091
DataArray< int > _rationalLUSolverBind
Definition: soplex.h:1589
should the degeneracy be computed for each basis?
Definition: soplex.h:879
bool _applyPolishing
Definition: soplex.h:1572
bool getExactCondition(Real &condition)
computes the exact condition number for the current basis matrix using the power method; returns true...
Definition: soplex.cpp:4052
SPxStatus
basis status.
Definition: spxbasis.h:90
const char * getScalerName()
name of scaling method
Definition: soplex.cpp:5053
Real solveTime() const
time spent in last call to solve
Definition: soplex.cpp:5007
void addColsReal(const LPColSetReal &lpcolset)
adds multiple columns
Definition: soplex.cpp:1358
int _nDualRows
Definition: soplex.h:1741
SPxSolver::Status status() const
returns the current solver status
Definition: soplex.cpp:2882
SolReal _solReal
Definition: soplex.h:1789
zero tolerance used in update of the factorization
Definition: soplex.h:1258
lower limit on objective value
Definition: soplex.h:1270
void changeLowerRational(const VectorRational &lower)
changes vector of lower bounds to lower
Definition: soplex.cpp:2292
DSVectorRational _tauColVector
Definition: soplex.h:1596
DVectorRational _modLower
Definition: soplex.h:1602
both bounds are infinite
Definition: soplex.h:1619
bool getRedCostViolationReal(Real &maxviol, Real &sumviol)
gets violation of reduced costs; returns true on success
Definition: soplex.cpp:3119
BoolParam
boolean parameters
Definition: soplex.h:860
bool _hasSolReal
Definition: soplex.h:1794
int numProbRows
Definition: soplex.h:1758
int * _decompViolatedBounds
Definition: soplex.h:1732
bool _isSolveStopped(bool &stoppedTime, bool &stoppedIter) const
should solving process be stopped?
Definition: soplex.cpp:7176
void _changeBoundsReal(const VectorReal &lower, const VectorReal &upper)
changes vectors of column bounds to lower and upper and adjusts basis
Definition: soplex.cpp:7661
Settings()
default constructor initializing default settings
Definition: soplex.cpp:501
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:982
sparse pricing threshold (#violations < dimension * SPARSITY_THRESHOLD activates sparse pricing) ...
Definition: soplex.h:1291
Settings & operator=(const Settings &settings)
assignment operator
Definition: soplex.cpp:523
void addRowReal(const LPRowReal &lprow)
adds a single row
Definition: soplex.cpp:1304
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:3293
dual feasibility tolerance
Definition: soplex.h:1249
void _ensureRealLPLoaded()
ensures that the real LP and the basis are loaded in the solver; performs no sync ...
Definition: soplex.cpp:7949
high verbosity level
Definition: soplex.h:1062
void _restoreBasis()
restore basis
no solution polishing
Definition: soplex.h:1233
void changeRowReal(int i, const LPRowReal &lprow)
replaces row i with lprow
Definition: soplex.cpp:1376
void setBasis(const SPxSolver::VarStatus rows[], const SPxSolver::VarStatus cols[])
sets starting basis via arrays of statuses
Definition: soplex.cpp:4958
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:5594
void _identifyComplementaryDualFixedPrimalVars(int *currFixedVars)
removing the dual columns related to the fixed variables
Definition: solvedbds.cpp:2797
SolRational _solRational
Definition: soplex.h:1790
bool saveSettingsFile(const char *filename, const bool onlyChanged=false) const
writes settings file; returns true on success
Definition: soplex.cpp:6217
Textbook ratio test for SoPlex.
DataArray< SPxColId > _decompCompPrimalVarBoundIDs
Definition: soplex.h:1725
Real objValueReal()
returns the objective value if a primal solution is available
Definition: soplex.cpp:2922
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:3383
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:8298
void changeRhsReal(const VectorReal &rhs)
changes right-hand side vector to rhs
Definition: soplex.cpp:1432
bool decompTerminate(Real timeLimit)
function call to terminate the decomposition simplex
Definition: solvedbds.cpp:3760
SPxLeastSqSC _scalerLeastsq
Definition: soplex.h:1548
geometric frequency at which to apply rational reconstruction
Definition: soplex.h:1297
void changeElementRational(int i, int j, const Rational &val)
changes matrix entry in row i and column j to val
Definition: soplex.cpp:2528
SPxStarter * _starter
Definition: soplex.h:1567
bool _hasSolRational
Definition: soplex.h:1795
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:5470
void getOriginalProblemStatistics()
stores the problem statistics of the original problem
Definition: solvedbds.cpp:3464
void _enableSimplifierAndScaler()
enables simplifier and scaler according to current parameters
Definition: soplex.cpp:7876
int _nPrimalRows
Definition: soplex.h:1738
primal simplex algorithm, i.e., entering for column and leaving for row representation ...
Definition: soplex.h:1030
DVectorRational _modRhs
Definition: soplex.h:1605
bool checkBasisDualFeasibility(Vector feasVec)
checks the dual feasibility of the current basis
Definition: solvedbds.cpp:3331
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:5540
should LP be transformed to equality form before a rational solve?
Definition: soplex.h:866
int * _decompColStatus
Definition: soplex.h:1711
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:7117
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:3857
the number of iterations before the decomposition simplex initialisation is terminated.
Definition: soplex.h:988
int numIncludedRows
Definition: soplex.h:1752
store only real LP
Definition: soplex.h:1158
const VectorRational & maxObjRational() const
returns objective function vector after transformation to a maximization problem; since this is how i...
Definition: soplex.cpp:1285
upper threshold in lifting (nonzero matrix coefficients with larger absolute value will be reformulat...
Definition: soplex.h:1288
DataArray< SPxSolver::VarStatus > _storedBasisStatusRows
Definition: soplex.h:1608
SPxLPReal _manualRealLP
Definition: soplex.h:1579
void _addRowsReal(const LPRowSetReal &lprowset)
adds multiple rows to the real LP and adjusts basis
Definition: soplex.cpp:7306
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:793
void changeUpperReal(const VectorReal &upper)
changes vector of upper bounds to upper
Definition: soplex.cpp:1563
bool hasPrimalRay() const
is a primal unbounded ray available?
Definition: soplex.cpp:2898
void removeColRational(int i)
removes column i
Definition: soplex.cpp:2659
SPxLPReal * _decompLP
Definition: soplex.h:1564
bool _isRealLPScaled
Definition: soplex.h:1571
IntParam
integer parameters
Definition: soplex.h:913
void _lift()
reduces matrix coefficient in absolute value by the lifting procedure of Thiele et al...
force iterative refinement
Definition: soplex.h:1187
SPxSolver::Status _status
Definition: soplex.h:1783
void getObjRational(VectorRational &obj) const
gets objective function vector
Definition: soplex.cpp:1256
Rational _rationalZero
Definition: soplex.h:1807
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:8169
RangeType _rangeTypeReal(const Real &lower, const Real &upper) const
determines RangeType from real bounds
Definition: soplex.cpp:7191
const VectorReal & lhsRealInternal() const
returns left-hand side vector, ignoring scaling
Definition: soplex.cpp:896
SPxSimplifier * _simplifier
Definition: soplex.h:1565
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:2641
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:1322
int numProbCols
Definition: soplex.h:1759
geometric mean scaling on rows and columns, max 1 round
Definition: soplex.h:1091
DataArray< SPxColId > _decompDualColIDs
Definition: soplex.h:1720
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:906
maximize number of basic slack variables, i.e. more variables on bounds
Definition: soplex.h:1236
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:885
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:1625
int * _decompCompProbColIDsIdx
Definition: soplex.h:1712
bool getBoundViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of bounds; returns true on success
Definition: soplex.cpp:3353
SPxAutoPR _pricerAuto
Definition: soplex.h:1552
least square scaling
Definition: soplex.h:1097
only error output
Definition: soplex.h:1050
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:3758
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:1709
const VectorRational & lowerRational() const
returns lower bound vector
Definition: soplex.cpp:1238