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