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-2019 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,
411  const int rowSize, const mpq_t* rhs);
412 
413  /// adds a set of rows
414  void addRowsRational(const mpq_t* lhs, const mpq_t* rowValues, const int* rowIndices,
415  const int* rowStarts, const int* rowLengths, const int numRows, const int numValues,
416  const mpq_t* rhs);
417 #endif
418 
419  /// adds multiple rows
420  void addRowsRational(const LPRowSetRational& lprowset);
421 
422  /// adds a single column
423  void addColRational(const LPColRational& lpcol);
424 
425 #ifdef SOPLEX_WITH_GMP
426  /// adds a single column
427  void addColRational(const mpq_t* obj, const mpq_t* lower, const mpq_t* colValues,
428  const int* colIndices, const int colSize, const mpq_t* upper);
429 
430  /// adds a set of columns
431  void addColsRational(const mpq_t* obj, const mpq_t* lower, const mpq_t* colValues,
432  const int* colIndices, const int* colStarts, const int* colLengths, const int numCols,
433  const int numValues, const mpq_t* upper);
434 #endif
435 
436  /// adds multiple columns
437  void addColsRational(const LPColSetRational& lpcolset);
438 
439  /// replaces row \p i with \p lprow
440  void changeRowRational(int i, const LPRowRational& lprow);
441 
442  /// changes left-hand side vector for constraints to \p lhs
443  void changeLhsRational(const VectorRational& lhs);
444 
445  /// changes left-hand side of row \p i to \p lhs
446  void changeLhsRational(int i, const Rational& lhs);
447 
448 #ifdef SOPLEX_WITH_GMP
449  /// changes left-hand side of row \p i to \p lhs
450  void changeLhsRational(int i, const mpq_t* lhs);
451 #endif
452 
453  /// changes right-hand side vector to \p rhs
454  void changeRhsRational(const VectorRational& rhs);
455 
456 #ifdef SOPLEX_WITH_GMP
457  /// changes right-hand side vector to \p rhs
458  void changeRhsRational(const mpq_t* rhs, int rhsSize);
459 #endif
460 
461  /// changes right-hand side of row \p i to \p rhs
462  void changeRhsRational(int i, const Rational& rhs);
463 
464  /// changes left- and right-hand side vectors
465  void changeRangeRational(const VectorRational& lhs, const VectorRational& rhs);
466 
467  /// changes left- and right-hand side of row \p i
468  void changeRangeRational(int i, const Rational& lhs, const Rational& rhs);
469 
470 #ifdef SOPLEX_WITH_GMP
471  /// changes left- and right-hand side of row \p i
472  void changeRangeRational(int i, const mpq_t* lhs, const mpq_t* rhs);
473 #endif
474 
475  /// replaces column \p i with \p lpcol
476  void changeColRational(int i, const LPColRational& lpcol);
477 
478  /// changes vector of lower bounds to \p lower
479  void changeLowerRational(const VectorRational& lower);
480 
481  /// changes lower bound of column i to \p lower
482  void changeLowerRational(int i, const Rational& lower);
483 
484 #ifdef SOPLEX_WITH_GMP
485  /// changes lower bound of column i to \p lower
486  void changeLowerRational(int i, const mpq_t* lower);
487 #endif
488 
489  /// changes vector of upper bounds to \p upper
490  void changeUpperRational(const VectorRational& upper);
491 
492  /// changes \p i 'th upper bound to \p upper
493  void changeUpperRational(int i, const Rational& upper);
494 
495 #ifdef SOPLEX_WITH_GMP
496  /// changes upper bound of column i to \p upper
497  void changeUpperRational(int i, const mpq_t* upper);
498 #endif
499 
500  /// changes vectors of column bounds to \p lower and \p upper
501  void changeBoundsRational(const VectorRational& lower, const VectorRational& upper);
502 
503  /// changes bounds of column \p i to \p lower and \p upper
504  void changeBoundsRational(int i, const Rational& lower, const Rational& upper);
505 
506 #ifdef SOPLEX_WITH_GMP
507  /// changes bounds of column \p i to \p lower and \p upper
508  void changeBoundsRational(int i, const mpq_t* lower, const mpq_t* upper);
509 #endif
510 
511  /// changes objective function vector to \p obj
512  void changeObjRational(const VectorRational& obj);
513 
514  /// changes objective coefficient of column i to \p obj
515  void changeObjRational(int i, const Rational& obj);
516 
517 #ifdef SOPLEX_WITH_GMP
518  /// changes objective coefficient of column i to \p obj
519  void changeObjRational(int i, const mpq_t* obj);
520 #endif
521 
522  /// changes matrix entry in row \p i and column \p j to \p val
523  void changeElementRational(int i, int j, const Rational& val);
524 
525 #ifdef SOPLEX_WITH_GMP
526  /// changes matrix entry in row \p i and column \p j to \p val
527  void changeElementRational(int i, int j, const mpq_t* val);
528 #endif
529 
530  /// removes row \p i
531  void removeRowRational(int i);
532 
533  /// removes all rows with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the new
534  /// index where row \p i has been moved to; note that \p perm must point to an array of size at least
535  /// #numRowsRational()
536  void removeRowsRational(int perm[]);
537 
538  /// remove all rows with indices in array \p idx of size \p n; an array \p perm of size #numRowsRational() may be
539  /// passed as buffer memory
540  void removeRowsRational(int idx[], int n, int perm[] = 0);
541 
542  /// removes rows \p start to \p end including both; an array \p perm of size #numRowsRational() may be passed as
543  /// buffer memory
544  void removeRowRangeRational(int start, int end, int perm[] = 0);
545 
546  /// removes column i
547  void removeColRational(int i);
548 
549  /// removes all columns with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
550  /// new index where column \p i has been moved to; note that \p perm must point to an array of size at least
551  /// #numColsRational()
552  void removeColsRational(int perm[]);
553 
554  /// remove all columns with indices in array \p idx of size \p n; an array \p perm of size #numColsRational() may be
555  /// passed as buffer memory
556  void removeColsRational(int idx[], int n, int perm[] = 0);
557 
558  /// removes columns \p start to \p end including both; an array \p perm of size #numColsRational() may be passed as
559  /// buffer memory
560  void removeColRangeRational(int start, int end, int perm[] = 0);
561 
562  /// clears the LP
563  void clearLPRational();
564 
565  /// synchronizes rational LP with real LP, i.e., copies real LP to rational LP, if sync mode is manual
566  void syncLPRational();
567 
568  //@}
569 
570 
571  //**@name Solving and general solution query */
572  //@{
573 
574  /// optimize the given LP
576 
577  // old name for backwards compatibility
579  {
580  return optimize();
581  }
582 
583  /// returns the current solver status
584  SPxSolver::Status status() const;
585 
586  /// is stored primal solution feasible?
587  bool isPrimalFeasible() const;
588 
589  /// is a primal feasible solution available?
590  bool hasPrimal() const;
591 
592  /// is a primal unbounded ray available?
593  bool hasPrimalRay() const;
594 
595  /// is stored dual solution feasible?
596  bool isDualFeasible() const;
597 
598  /// is a dual feasible solution available?
599  bool hasDual() const;
600 
601  /// is Farkas proof of infeasibility available?
602  bool hasDualFarkas() const;
603 
604  /// sets the status to OPTIMAL in case the LP has been solved with unscaled violations
606  {
608  {
610  return true;
611  }
612  else
613  return false;
614  }
615  //@}
616 
617 
618  //**@name Query for the real solution data */
619  //@{
620 
621  /// returns the objective value if a primal solution is available
622  Real objValueReal();
623 
624  /// gets the primal solution vector if available; returns true on success
625  bool getPrimalReal(VectorReal& vector);
626 
627  /// gets the vector of slack values if available; returns true on success
628  bool getSlacksReal(VectorReal& vector);
629 
630  /// gets the primal ray if available; returns true on success
631  bool getPrimalRayReal(VectorReal& vector);
632 
633  /// gets the dual solution vector if available; returns true on success
634  bool getDualReal(VectorReal& vector);
635 
636  /// gets the vector of reduced cost values if available; returns true on success
637  bool getRedCostReal(VectorReal& vector);
638 
639  /// gets the Farkas proof if available; returns true on success
640  bool getDualFarkasReal(VectorReal& vector);
641 
642  /// gets violation of bounds; returns true on success
643  bool getBoundViolationReal(Real& maxviol, Real& sumviol);
644 
645  /// gets violation of constraints; returns true on success
646  bool getRowViolationReal(Real& maxviol, Real& sumviol);
647 
648  /// gets violation of reduced costs; returns true on success
649  bool getRedCostViolationReal(Real& maxviol, Real& sumviol);
650 
651  /// gets violation of dual multipliers; returns true on success
652  bool getDualViolationReal(Real& maxviol, Real& sumviol);
653 
654  //@}
655 
656 
657  //**@name Query for the rational solution data */
658  //@{
659 
660  /// returns the objective value if a primal solution is available
662 
663  /// gets the primal solution vector if available; returns true on success
664  bool getPrimalRational(VectorRational& vector);
665 
666  /// gets the vector of slack values if available; returns true on success
667  bool getSlacksRational(VectorRational& vector);
668 
669  /// gets the primal ray if LP is unbounded; returns true on success
670  bool getPrimalRayRational(VectorRational& vector);
671 
672  /// gets the dual solution vector if available; returns true on success
673  bool getDualRational(VectorRational& vector);
674 
675  /// gets the vector of reduced cost values if available; returns true on success
676  bool getRedCostRational(VectorRational& vector);
677 
678  /// gets the Farkas proof if LP is infeasible; returns true on success
680 
681  /// gets violation of bounds; returns true on success
682  bool getBoundViolationRational(Rational& maxviol, Rational& sumviol);
683 
684  /// gets violation of constraints; returns true on success
685  bool getRowViolationRational(Rational& maxviol, Rational& sumviol);
686 
687  /// gets violation of reduced costs; returns true on success
688  bool getRedCostViolationRational(Rational& maxviol, Rational& sumviol);
689 
690  /// gets violation of dual multipliers; returns true on success
691  bool getDualViolationRational(Rational& maxviol, Rational& sumviol);
692 
693 #ifdef SOPLEX_WITH_GMP
694  /// gets the primal solution vector if available; returns true on success
695  bool getPrimalRational(mpq_t* vector, const int size);
696 
697  /// gets the vector of slack values if available; returns true on success
698  bool getSlacksRational(mpq_t* vector, const int size);
699 
700  /// gets the primal ray if LP is unbounded; returns true on success
701  bool getPrimalRayRational(mpq_t* vector, const int size);
702 
703  /// gets the dual solution vector if available; returns true on success
704  bool getDualRational(mpq_t* vector, const int size);
705 
706  /// gets the vector of reduced cost values if available; returns true on success
707  bool getRedCostRational(mpq_t* vector, const int size);
708 
709  /// gets the Farkas proof if LP is infeasible; returns true on success
710  bool getDualFarkasRational(mpq_t* vector, const int size);
711 #endif
712 
713  /// get size of primal solution
714  int totalSizePrimalRational(const int base = 2);
715 
716  /// get size of dual solution
717  int totalSizeDualRational(const int base = 2);
718 
719  /// get size of least common multiple of denominators in primal solution
720  int dlcmSizePrimalRational(const int base = 2);
721 
722  /// get size of least common multiple of denominators in dual solution
723  int dlcmSizeDualRational(const int base = 2);
724 
725  /// get size of largest denominator in primal solution
726  int dmaxSizePrimalRational(const int base = 2);
727 
728  /// get size of largest denominator in dual solution
729  int dmaxSizeDualRational(const int base = 2);
730 
731  //@}
732 
733 
734  //**@name Access and modification of basis information */
735  //@{
736 
737  /// is an advanced starting basis available?
738  bool hasBasis() const;
739 
740  /// returns the current basis status
742 
743  /// returns basis status for a single row
744  SPxSolver::VarStatus basisRowStatus(int row) const;
745 
746  /// returns basis status for a single column
747  SPxSolver::VarStatus basisColStatus(int col) const;
748 
749  /// gets current basis via arrays of statuses
750  void getBasis(SPxSolver::VarStatus rows[], SPxSolver::VarStatus cols[]) const;
751 
752  /// gets the indices of the basic columns and rows; basic column n gives value n, basic row m gives value -1-m
753  void getBasisInd(int* bind) const;
754 
755  /// compute condition number estimate based on the diagonal of the LU factorization; returns true on success
756  /// type = 0: max/min ratio
757  /// type = 1: trace of U (sum of diagonal elements)
758  /// type = 2: product of diagonal elements
759  bool getFastCondition(Real& condition, int type = 0);
760 
761  /// computes an estimated condition number for the current basis matrix using the power method; returns true on success
762  bool getEstimatedCondition(Real& condition);
763 
764  /// computes the exact condition number for the current basis matrix using the power method; returns true on success
765  bool getExactCondition(Real& condition);
766 
767  /// computes row \p r of basis inverse; returns true on success
768  /// @param r which row of the basis inverse is computed
769  /// @param coef values of result vector (not packed but scattered)
770  /// @param inds indices of result vector (NULL if not to be used)
771  /// @param ninds number of nonzeros in result vector
772  /// @param unscale determines whether the result should be unscaled according to the original LP data
773  bool getBasisInverseRowReal(int r, Real* coef, int* inds = NULL, int* ninds = NULL,
774  bool unscale = true);
775 
776  /// computes column \p c of basis inverse; returns true on success
777  /// @param c which column of the basis inverse is computed
778  /// @param coef values of result vector (not packed but scattered)
779  /// @param inds indices of result vector (NULL if not to be used)
780  /// @param ninds number of nonzeros in result vector
781  /// @param unscale determines whether the result should be unscaled according to the original LP data
782  bool getBasisInverseColReal(int c, Real* coef, int* inds = NULL, int* ninds = NULL,
783  bool unscale = true);
784 
785  /// computes dense solution of basis matrix B * \p sol = \p rhs; returns true on success
786  bool getBasisInverseTimesVecReal(Real* rhs, Real* sol, bool unscale = true);
787 
788  /// multiply with basis matrix; B * \p vec (inplace)
789  /// @param vec (dense) vector to be multiplied with
790  /// @param unscale determines whether the result should be unscaled according to the original LP data
791  bool multBasis(Real* vec, bool unscale = true);
792 
793  /// multiply with transpose of basis matrix; \p vec * B^T (inplace)
794  /// @param vec (dense) vector to be multiplied with
795  /// @param unscale determines whether the result should be unscaled according to the original LP data
796  bool multBasisTranspose(Real* vec, bool unscale = true);
797 
798  /// compute rational basis inverse; returns true on success
800 
801  /// gets an array of indices for the columns of the rational basis matrix; bind[i] >= 0 means that the i-th column of
802  /// the basis matrix contains variable bind[i]; bind[i] < 0 means that the i-th column of the basis matrix contains
803  /// the slack variable for row -bind[i]-1; performs rational factorization if not available; returns true on success
805 
806  /// computes row r of basis inverse; performs rational factorization if not available; returns true on success
807  bool getBasisInverseRowRational(const int r, SSVectorRational& vec);
808 
809  /// computes column c of basis inverse; performs rational factorization if not available; returns true on success
810  bool getBasisInverseColRational(const int c, SSVectorRational& vec);
811 
812  /// computes solution of basis matrix B * sol = rhs; performs rational factorization if not available; returns true
813  /// on success
815 
816  /// sets starting basis via arrays of statuses
817  void setBasis(const SPxSolver::VarStatus rows[], const SPxSolver::VarStatus cols[]);
818 
819  /// clears starting basis
820  void clearBasis();
821 
822  //@}
823 
824 
825  //**@name Statistical information */
826  //@{
827 
828  /// number of iterations since last call to solve
829  int numIterations() const;
830 
831  /// time spent in last call to solve
832  Real solveTime() const;
833 
834  /// statistical information in form of a string
835  std::string statisticString() const;
836 
837  /// name of starter
838  const char* getStarterName();
839 
840  /// name of simplifier
841  const char* getSimplifierName();
842 
843  /// name of scaling method
844  const char* getScalerName();
845 
846  /// name of currently loaded pricer
847  const char* getPricerName();
848 
849  /// name of currently loaded ratiotester
850  const char* getRatiotesterName();
851 
852  //@}
853 
854 
855  //**@name File I/O */
856  //@{
857 
858  /// reads LP file in LP or MPS format according to READMODE parameter; gets row names, column names, and
859  /// integer variables if desired; returns true on success
860  bool readFile(const char* filename, NameSet* rowNames = 0, NameSet* colNames = 0,
861  DIdxSet* intVars = 0);
862 
863  /// writes real LP to file; LP or MPS format is chosen from the extension in \p filename; if \p rowNames and \p
864  /// colNames are \c NULL, default names are used; if \p intVars is not \c NULL, the variables contained in it are
865  /// marked as integer; returns true on success
866  bool writeFileReal(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0,
867  const DIdxSet* intvars = 0, const bool unscale = true) const;
868 
869  /// writes rational LP to file; LP or MPS format is chosen from the extension in \p filename; if \p rowNames and \p
870  /// colNames are \c NULL, default names are used; if \p intVars is not \c NULL, the variables contained in it are
871  /// marked as integer; returns true on success
872  bool writeFileRational(const char* filename, const NameSet* rowNames = 0,
873  const NameSet* colNames = 0, const DIdxSet* intvars = 0) const;
874 
875  /// writes the dual of the real LP to file; LP or MPS format is chosen from the extension in \p filename;
876  /// if \p rowNames and \p colNames are \c NULL, default names are used; if \p intVars is not \c NULL,
877  /// the variables contained in it are marked as integer; returns true on success
878  bool writeDualFileReal(const char* filename, const NameSet* rowNames = 0,
879  const NameSet* colNames = 0, const DIdxSet* intvars = 0) const;
880 
881  /// reads basis information from \p filename and returns true on success; if \p rowNames and \p colNames are \c NULL,
882  /// default names are assumed; returns true on success
883  bool readBasisFile(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0);
884 
885  /// writes basis information to \p filename; if \p rowNames and \p colNames are \c NULL, default names are used;
886  /// returns true on success
887  bool writeBasisFile(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0,
888  const bool cpxFormat = false) const;
889 
890  /// writes internal LP, basis information, and parameter settings; if \p rowNames and \p colNames are \c NULL,
891  /// default names are used
892  void writeStateReal(const char* filename, const NameSet* rowNames = 0, const NameSet* colNames = 0,
893  const bool cpxFormat = false) const;
894 
895  /// writes internal LP, basis information, and parameter settings; if \p rowNames and \p colNames are \c NULL,
896  /// default names are used
897  void writeStateRational(const char* filename, const NameSet* rowNames = 0,
898  const NameSet* colNames = 0, const bool cpxFormat = false) const;
899 
900  //@}
901 
902 
903  //**@name Parameters */
904  //@{
905 
906  /// boolean parameters
907  typedef enum
908  {
909  /// should lifting be used to reduce range of nonzero matrix coefficients?
910  LIFTING = 0,
911 
912  /// should LP be transformed to equality form before a rational solve?
913  EQTRANS = 1,
914 
915  /// should dual infeasibility be tested in order to try to return a dual solution even if primal infeasible?
917 
918  /// should a rational factorization be performed after iterative refinement?
919  RATFAC = 3,
920 
921  /// should the decomposition based dual simplex be used to solve the LP? Setting this to true forces the solve mode to
922  /// SOLVEMODE_REAL and the basis representation to REPRESENTATION_ROW
924 
925  /// should the degeneracy be computed for each basis?
927 
928  /// should the dual of the complementary problem be used in the decomposition simplex?
930 
931  /// should row and bound violations be computed explicitly in the update of reduced problem in the decomposition simplex
933 
934  /// should cycling solutions be accepted during iterative refinement?
936 
937  /// apply rational reconstruction after each iterative refinement?
938  RATREC = 9,
939 
940  /// round scaling factors for iterative refinement to powers of two?
942 
943  /// continue iterative refinement with exact basic solution if not optimal?
945 
946  /// use bound flipping also for row representation?
948 
949  /// use persistent scaling?
951 
952  /// perturb the entire problem or only the relevant bounds of s single pivot?
954 
955  /// re-optimize the original problem to get a proof (ray) of infeasibility/unboundedness?
956  ENSURERAY = 15,
957 
958  /// number of boolean parameters
960  } BoolParam;
961 
962  /// integer parameters
963  typedef enum
964  {
965  /// objective sense
966  OBJSENSE = 0,
967 
968  /// type of computational form, i.e., column or row representation
970 
971  /// type of algorithm, i.e., primal or dual
973 
974  /// type of LU update
976 
977  /// maximum number of updates without fresh factorization
979 
980  /// iteration limit (-1 if unlimited)
982 
983  /// refinement limit (-1 if unlimited)
984  REFLIMIT = 6,
985 
986  /// stalling refinement limit (-1 if unlimited)
988 
989  /// display frequency
991 
992  /// verbosity level
994 
995  /// type of simplifier
997 
998  /// type of scaler
999  SCALER = 11,
1000 
1001  /// type of starter used to create crash basis
1002  STARTER = 12,
1003 
1004  /// type of pricer
1005  PRICER = 13,
1006 
1007  /// type of ratio test
1009 
1010  /// mode for synchronizing real and rational LP
1011  SYNCMODE = 15,
1012 
1013  /// mode for reading LP files
1014  READMODE = 16,
1015 
1016  /// mode for iterative refinement strategy
1018 
1019  /// mode for a posteriori feasibility checks
1021 
1022  /// type of timer
1023  TIMER = 19,
1024 
1025  /// mode for hyper sparse pricing
1027 
1028  /// minimum number of stalling refinements since last pivot to trigger rational factorization
1030 
1031  /// maximum number of conjugate gradient iterations in least square scaling
1033 
1034  /// mode for solution polishing
1036 
1037  /// the number of iterations before the decomposition simplex initialisation is terminated.
1039 
1040  /// the maximum number of rows that are added in each iteration of the decomposition based simplex
1042 
1043  /// the iteration frequency at which the decomposition solve output is displayed.
1045 
1046  /// the verbosity of the decomposition based simplex
1048 
1049  /// print condition number during the solve
1051 
1052  /// number of integer parameters
1054  } IntParam;
1055 
1056  /// values for parameter OBJSENSE
1057  enum
1058  {
1059  /// minimization
1061 
1062  /// maximization
1064  };
1065 
1066  /// values for parameter REPRESENTATION
1067  enum
1068  {
1069  /// automatic choice according to number of rows and columns
1071 
1072  /// column representation Ax - s = 0, lower <= x <= upper, lhs <= s <= rhs
1074 
1075  /// row representation (lower,lhs) <= (x,Ax) <= (upper,rhs)
1077  };
1078 
1079  /// values for parameter ALGORITHM
1080  enum
1081  {
1082  /// primal simplex algorithm, i.e., entering for column and leaving for row representation
1084 
1085  /// dual simplex algorithm, i.e., leaving for column and entering for row representation
1087  };
1088 
1089  /// values for parameter FACTOR_UPDATE_TYPE
1090  enum
1091  {
1092  /// product form update
1094 
1095  /// Forrest-Tomlin type update
1097  };
1098 
1099  /// values for parameter VERBOSITY
1100  enum
1101  {
1102  /// only error output
1104 
1105  /// only error and warning output
1107 
1108  /// only error, warning, and debug output
1110 
1111  /// standard verbosity level
1113 
1114  /// high verbosity level
1116 
1117  /// full verbosity level
1119  };
1120 
1121  /// values for parameter SIMPLIFIER
1122  enum
1123  {
1124  /// no simplifier
1126 
1127  /// automatic choice
1129  };
1130 
1131  /// values for parameter SCALER
1132  enum
1133  {
1134  /// no scaler
1136 
1137  /// equilibrium scaling on rows or columns
1139 
1140  /// equilibrium scaling on rows and columns
1142 
1143  /// geometric mean scaling on rows and columns, max 1 round
1145 
1146  /// geometric mean scaling on rows and columns, max 8 rounds
1148 
1149  /// least square scaling
1151 
1152  /// geometric mean scaling (max 8 rounds) followed by equilibrium scaling (rows and columns)
1154  };
1155 
1156  /// values for parameter STARTER
1157  enum
1158  {
1159  /// slack basis
1161 
1162  /// greedy crash basis weighted by objective, bounds, and sides
1164 
1165  /// crash basis from a greedy solution
1167 
1168  /// generic solution-based crash basis
1170  };
1171 
1172  /// values for parameter PRICER
1173  enum
1174  {
1175  /// automatic pricer
1177 
1178  /// Dantzig pricer
1180 
1181  /// partial multiple pricer based on Dantzig pricing
1183 
1184  /// devex pricer
1186 
1187  /// steepest edge pricer with initialization to unit norms
1189 
1190  /// steepest edge pricer with exact initialization of norms
1192  };
1193 
1194  /// values for parameter RATIOTESTER
1195  enum
1196  {
1197  /// textbook ratio test without stabilization
1199 
1200  /// standard Harris ratio test
1202 
1203  /// modified Harris ratio test
1205 
1206  /// bound flipping ratio test for long steps in the dual simplex
1208  };
1209 
1210  /// values for parameter SYNCMODE
1211  enum
1212  {
1213  /// store only real LP
1215 
1216  /// automatic sync of real and rational LP
1218 
1219  /// user sync of real and rational LP
1221  };
1222 
1223  /// values for parameter READMODE
1224  enum
1225  {
1226  /// standard floating-point parsing
1228 
1229  /// rational parsing
1231  };
1232 
1233  /// values for parameter SOLVEMODE
1234  enum
1235  {
1236  /// apply standard floating-point algorithm
1238 
1239  /// decide depending on tolerances whether to apply iterative refinement
1241 
1242  /// force iterative refinement
1244  };
1245 
1246  /// values for parameter CHECKMODE
1247  enum
1248  {
1249  /// floating-point check
1251 
1252  /// decide according to READMODE
1254 
1255  /// rational check
1257  };
1258 
1259  /// values for parameter TIMER
1260  enum
1261  {
1262  /// disable timing
1264 
1265  /// cpu or user time
1267 
1268  /// wallclock time
1270  };
1271 
1272  /// values for parameter HYPER_PRICING
1273  enum
1274  {
1275  /// never
1277 
1278  /// decide according to problem size
1280 
1281  /// always
1283  };
1284 
1285  /// values for parameter SOLUTION_POLISHING
1286  enum
1287  {
1288  /// no solution polishing
1290 
1291  /// maximize number of basic slack variables, i.e. more variables on bounds
1293 
1294  /// minimize number of basic slack variables, i.e. more variables between bounds
1296  };
1297 
1298  /// real parameters
1299  typedef enum
1300  {
1301  /// primal feasibility tolerance
1302  FEASTOL = 0,
1303 
1304  /// dual feasibility tolerance
1305  OPTTOL = 1,
1306 
1307  /// general zero tolerance
1309 
1310  /// zero tolerance used in factorization
1312 
1313  /// zero tolerance used in update of the factorization
1315 
1316  /// pivot zero tolerance used in factorization
1318 
1319  /// infinity threshold
1320  INFTY = 6,
1321 
1322  /// time limit in seconds (INFTY if unlimited)
1324 
1325  /// lower limit on objective value
1327 
1328  /// upper limit on objective value
1330 
1331  /// working tolerance for feasibility in floating-point solver during iterative refinement
1333 
1334  /// working tolerance for optimality in floating-point solver during iterative refinement
1335  FPOPTTOL = 11,
1336 
1337  /// maximum increase of scaling factors between refinements
1339 
1340  /// lower threshold in lifting (nonzero matrix coefficients with smaller absolute value will be reformulated)
1342 
1343  /// upper threshold in lifting (nonzero matrix coefficients with larger absolute value will be reformulated)
1345 
1346  /// sparse pricing threshold (\#violations < dimension * SPARSITY_THRESHOLD activates sparse pricing)
1348 
1349  /// threshold on number of rows vs. number of columns for switching from column to row representations in auto mode
1351 
1352  /// geometric frequency at which to apply rational reconstruction
1354 
1355  /// minimal reduction (sum of removed rows/cols) to continue simplification
1356  MINRED = 18,
1357 
1358  /// refactor threshold for nonzeros in last factorized basis matrix compared to updated basis matrix
1360 
1361  /// refactor threshold for fill-in in current factor update compared to fill-in in last factorization
1363 
1364  /// refactor threshold for memory growth in factorization since last refactorization
1366 
1367  /// accuracy of conjugate gradient method in least squares scaling (higher value leads to more iterations)
1369 
1370  /// objective offset
1372 
1373  /// number of real parameters
1375  } RealParam;
1376 
1377 #ifdef SOPLEX_WITH_RATIONALPARAM
1378  /// rational parameters
1379  typedef enum
1380  {
1381  /// number of rational parameters
1382  RATIONALPARAM_COUNT = 0
1383  } RationalParam;
1384 #endif
1385 
1386  /// class of parameter settings
1387  class Settings
1388  {
1389  public:
1390  static struct BoolParam
1391  {
1392  /// constructor
1393  BoolParam();
1394  /// array of names for boolean parameters
1396  /// array of descriptions for boolean parameters
1398  /// array of default values for boolean parameters
1400  } boolParam;
1401 
1402  static struct IntParam
1403  {
1404  /// constructor
1405  IntParam();
1406  /// array of names for integer parameters
1408  /// array of descriptions for integer parameters
1410  /// array of default values for integer parameters
1412  /// array of lower bounds for int parameter values
1414  /// array of upper bounds for int parameter values
1416  } intParam;
1417 
1418  static struct RealParam
1419  {
1420  /// constructor
1421  RealParam();
1422  /// array of names for real parameters
1424  /// array of descriptions for real parameters
1426  /// array of default values for real parameters
1428  /// array of lower bounds for real parameter values
1430  /// array of upper bounds for real parameter values
1432  } realParam;
1433 
1434 #ifdef SOPLEX_WITH_RATIONALPARAM
1435  static struct RationalParam
1436  {
1437  /// constructor
1438  RationalParam();
1439  /// array of names for rational parameters
1440  std::string name[SoPlex::RATIONALPARAM_COUNT];
1441  /// array of descriptions for rational parameters
1442  std::string description[SoPlex::RATIONALPARAM_COUNT];
1443  /// array of default values for rational parameters
1444  Rational defaultValue[SoPlex::RATIONALPARAM_COUNT];
1445  /// array of lower bounds for rational parameter values
1446  Rational lower[SoPlex::RATIONALPARAM_COUNT];
1447  /// array of upper bounds for rational parameter values
1448  Rational upper[SoPlex::RATIONALPARAM_COUNT];
1449  } rationalParam;
1450 #endif
1451 
1452  /// array of current boolean parameter values
1454 
1455  /// array of current integer parameter values
1457 
1458  /// array of current real parameter values
1460 
1461 #ifdef SOPLEX_WITH_RATIONALPARAM
1462  /// array of current rational parameter values
1463  Rational _rationalParamValues[SoPlex::RATIONALPARAM_COUNT];
1464 #endif
1465 
1466  /// default constructor initializing default settings
1467  Settings();
1468 
1469  /// copy constructor
1470  Settings(const Settings& settings);
1471 
1472  /// assignment operator
1474  };
1475 
1476  mutable SPxOut spxout;
1477 
1478  /// returns boolean parameter value
1479  bool boolParam(const BoolParam param) const;
1480 
1481  /// returns integer parameter value
1482  int intParam(const IntParam param) const;
1483 
1484  /// returns real parameter value
1485  Real realParam(const RealParam param) const;
1486 
1487 #ifdef SOPLEX_WITH_RATIONALPARAM
1488  /// returns rational parameter value
1489  Rational rationalParam(const RationalParam param) const;
1490 #endif
1491 
1492  /// returns current parameter settings
1493  const Settings& settings() const;
1494 
1495  /// sets boolean parameter value; returns true on success
1496  bool setBoolParam(const BoolParam param, const bool value, const bool init = true);
1497 
1498  /// sets integer parameter value; returns true on success
1499  bool setIntParam(const IntParam param, const int value, const bool init = true);
1500 
1501  /// sets real parameter value; returns true on success
1502  bool setRealParam(const RealParam param, const Real value, const bool init = true);
1503 
1504 #ifdef SOPLEX_WITH_RATIONALPARAM
1505  /// sets rational parameter value; returns true on success
1506  bool setRationalParam(const RationalParam param, const Rational value, const bool init = true);
1507 #endif
1508 
1509  /// sets parameter settings; returns true on success
1510  bool setSettings(const Settings& newSettings, const bool init = true);
1511 
1512  /// resets default parameter settings
1513  void resetSettings(const bool quiet = false, const bool init = true);
1514 
1515  /// print non-default parameter values
1516  void printUserSettings();
1517 
1518  /// writes settings file; returns true on success
1519  bool saveSettingsFile(const char* filename, const bool onlyChanged = false) const;
1520 
1521  /// reads settings file; returns true on success
1522  bool loadSettingsFile(const char* filename);
1523 
1524  /// parses one setting string and returns true on success; note that string is modified
1525  bool parseSettingsString(char* line);
1526 
1527  //@}
1528 
1529 
1530  //**@name Statistics */
1531  //@{
1532 
1533  /// prints solution statistics
1534  void printSolutionStatistics(std::ostream& os);
1535 
1536  /// prints statistics on solving process
1537  void printSolvingStatistics(std::ostream& os);
1538 
1539  /// prints short statistics
1540  void printShortStatistics(std::ostream& os);
1541 
1542  /// prints complete statistics
1543  void printStatistics(std::ostream& os);
1544 
1545  /// prints status
1546  void printStatus(std::ostream& os, SPxSolver::Status status);
1547 
1548  //@}
1549 
1550 
1551  //**@name Miscellaneous */
1552  //@{
1553 
1554  /// prints version and compilation options
1555  void printVersion() const;
1556 
1557  /// checks if real LP and rational LP are in sync; dimensions will always be compared,
1558  /// vector and matrix values only if the respective parameter is set to true.
1559  /// If quiet is set to true the function will only display which vectors are different.
1560  bool areLPsInSync(const bool checkVecVals = true, const bool checkMatVals = false,
1561  const bool quiet = false) const;
1562 
1563  /// set the random seeds of the solver instance
1564  void setRandomSeed(unsigned int seed);
1565 
1566  /// returns the current random seed of the solver instance
1567  unsigned int randomSeed() const;
1568 
1569  //@}
1570 
1571 private:
1572 
1573  //**@name Statistics on solving process */
1574  //@{
1575 
1576  /// class of statistics
1577  class Statistics;
1578 
1579  /// statistics since last call to solveReal() or solveRational()
1581 
1582  //@}
1583 
1584 
1585  //**@name Parameter settings */
1586  //@{
1587 
1589 
1595 
1596  //@}
1597 
1598 
1599  //**@name Data for the real LP */
1600  //@{
1601 
1624 
1625  SPxLPReal*
1626  _realLP; // the real LP is also used as the original LP for the decomposition dual simplex
1627  SPxLPReal* _decompLP; // used to store the original LP for the decomposition dual simplex
1631 
1632  bool _isRealLPLoaded; // true indicates that the original LP is loaded in the _solver variable, hence all actions
1633  // are performed on the original LP.
1636 
1643 
1644  //@}
1645 
1646 
1647  //**@name Data for the rational LP */
1648  //@{
1649 
1653 
1677 
1678  /// type of bounds and sides
1679  typedef enum
1680  {
1681  /// both bounds are infinite
1683 
1684  /// lower bound is finite, upper bound is infinite
1686 
1687  /// upper bound is finite, lower bound is infinite
1689 
1690  /// lower and upper bound finite, but different
1692 
1693  /// lower bound equals upper bound
1695  } RangeType;
1696 
1699 
1700  //@}
1701 
1702 
1703  //**@name Data for the Decomposition Based Dual Simplex */
1704  //@{
1705 
1706  /** row violation structure
1707  */
1709  {
1710  Real violation; /**< the violation of the row */
1711  int idx; /**< index of corresponding row */
1712  };
1713 
1714  /** Compare class for row violations
1715  */
1717  {
1718  public:
1719  /** constructor
1720  */
1722  : entry(0)
1723  {
1724  }
1725 
1727 
1729  RowViolation i,
1730  RowViolation j
1731  ) const
1732  {
1733  return i.violation - j.violation;
1734  }
1735  };
1736 
1737 
1738  typedef enum
1739  {
1740  // is the original problem currently being solved.
1742 
1743  // is the reduced problem currently being solved.
1745 
1746  // is the complementary problem currently being solved.
1748  } decompStatus;
1749 
1750  // the expected sign of the dual variables.
1752  {
1753  IS_POS = 0,
1754  IS_NEG = 1,
1756  };
1757 
1758  SPxSolver _compSolver; // adding a solver to contain the complementary problem. It is too confusing to switch
1759  // the LP for the reduced and complementary problem in the one solver variable. The reduced
1760  // problem will be stored in _solver and the complementary problem will be stored in
1761  // _compSolver.
1762  SLUFactor _compSlufactor; // I don't know whether this is necessary, but it is a test for now.
1763 
1764  SPxBasis _decompTransBasis; // the basis required for the transformation to form the reduced problem
1765 
1766  DVector _transformedObj; // the objective coefficients of the transformed problem
1767  DVector _decompFeasVector; // feasibility vector calculated using unshifted bounds.
1768  LPRowSet _transformedRows; // a set of the original rows that have been transformed using the original basis.
1769  SPxColId _compSlackColId; // column id of the primal complementary problem slack column.
1770  SPxRowId _compSlackDualRowId; // row id in the dual of complementary problem related to the slack column.
1771  bool* _decompReducedProbRows; // flag to indicate the inclusion of a row in the reduced problem.
1772  bool* _decompReducedProbCols; // flag to indicate the inclusion of a col in the reduced problem.
1775  int* _decompCompProbColIDsIdx; // the index to _decompPrimalColIDs for a given original col.
1777  _decompReducedProbRowIDs; // the row IDs for the related rows in the reduced problem
1779  _decompReducedProbColRowIDs;// the row IDs for the related cols in the reduced problem
1781  _decompReducedProbColIDs; // the col IDs for the related cols in the reduced problem
1782  DataArray < SPxRowId > _decompPrimalRowIDs; // the primal row IDs from the original problem
1783  DataArray < SPxColId > _decompPrimalColIDs; // the primal col IDs from the original problem
1785  _decompElimPrimalRowIDs; // the primal row IDs eliminated in the complementary problem
1787  _decompDualRowIDs; // the dual row IDs from the complementary problem
1789  _decompDualColIDs; // the dual col IDs from the complementary problem
1790  DataArray < SPxColId > _decompFixedVarDualIDs; // the column ids related to the fixed variables.
1792  _decompVarBoundDualIDs; // the column ids related to the variable bound constraints.
1793 
1795  _decompCompPrimalFixedVarIDs; // the column ids related to the fixed variables in the complementary primal.
1797  _decompCompPrimalVarBoundIDs; // the column ids related to the variable bound constraints in the complementary primal.
1798 
1800  _decompCompPrimalRowIDs; // the primal row IDs from the complementary problem
1802  _decompCompPrimalColIDs; // the primal col IDs from the complementary problem
1803 
1804  int _nDecompViolBounds; // the number of violated bound constraints
1805  int _nDecompViolRows; // the number of violated rows
1806  int* _decompViolatedBounds; // the violated bounds given by the solution to the IDS reduced problem
1807  int* _decompViolatedRows; // the violated rows given by the solution to the IDS reduced problem
1808 
1809 
1810  int* _fixedOrigVars; // the original variables that are at their bounds in the reduced problem.
1811  // 1: fixed to upper, -1: fixed to lower, 0: unfixed.
1812  int _nPrimalRows; // the number of original problem rows included in the complementary problem
1813  int _nPrimalCols; // the number of original problem columns included in the complementary problem
1814  int _nElimPrimalRows; // the number of primal rows from the original problem eliminated from the complementary prob
1815  int _nDualRows; // the number of dual rows in the complementary problem. NOTE: _nPrimalRows = _nDualCols
1816  int _nDualCols; // the number of dual columns in the complementary problem. NOTE: _nPrimalRows = _nDualCols
1817  int _nCompPrimalRows; // the number of rows in the complementary primal problem. NOTE: _nPrimalRows = _nCompPrimalRows
1818  int _nCompPrimalCols; // the number of dual columns in the complementary problem. NOTE: _nPrimalCols = _nCompPrimalCols
1819 
1820  int _decompDisplayLine; // the count for the display line
1821 
1822  NameSet* _rowNames; // the row names from the input file
1823  NameSet* _colNames; // the col names from the input file
1824 
1825  // Statistic information
1826  int numIncludedRows; // the number of rows currently included in the reduced problem.
1827  int numDecompIter; // the number of iterations of the decomposition dual simplex algorithm.
1828  int numRedProbIter; // the number of simplex iterations performed in the reduced problem.
1829  int numCompProbIter; // the number of iterations of the complementary problem.
1830 
1831  // problem statistics
1837 
1842 
1848 
1850 
1851  //@}
1852 
1853 
1854  //**@name Solution data */
1855  //@{
1856 
1859 
1862 
1866 
1870 
1871  //@}
1872 
1873  //**@name Miscellaneous */
1874  //@{
1875 
1878 
1882 
1883  //@}
1884 
1885  //**@name Constant helper methods */
1886  //@{
1887 
1888  /// extends sparse vector to hold newmax entries if and only if it holds no more free entries
1889  void _ensureDSVectorRationalMemory(DSVectorRational& vec, const int newmax) const;
1890 
1891  /// creates a permutation for removing rows/columns from an array of indices
1892  void _idxToPerm(int* idx, int idxSize, int* perm, int permSize) const;
1893 
1894  /// creates a permutation for removing rows/columns from a range of indices
1895  void _rangeToPerm(int start, int end, int* perm, int permSize) const;
1896 
1897  /// checks consistency
1898  bool _isConsistent() const;
1899 
1900  /// should solving process be stopped?
1901  bool _isSolveStopped(bool& stoppedTime, bool& stoppedIter) const;
1902 
1903  /// determines RangeType from real bounds
1904  RangeType _rangeTypeReal(const Real& lower, const Real& upper) const;
1905 
1906  /// determines RangeType from rational bounds
1907  RangeType _rangeTypeRational(const Rational& lower, const Rational& upper) const;
1908 
1909  /// switches RANGETYPE_LOWER to RANGETYPE_UPPER and vice versa
1910  RangeType _switchRangeType(const RangeType& rangeType) const;
1911 
1912  /// checks whether RangeType corresponds to finite lower bound
1913  bool _lowerFinite(const RangeType& rangeType) const;
1914 
1915  /// checks whether RangeType corresponds to finite upper bound
1916  bool _upperFinite(const RangeType& rangeType) const;
1917 
1918  //@}
1919 
1920 
1921  //**@name Non-constant helper methods */
1922  //@{
1923 
1924  /// adds a single row to the real LP and adjusts basis
1925  void _addRowReal(const LPRowReal& lprow);
1926 
1927  /// adds a single row to the real LP and adjusts basis
1928  void _addRowReal(Real lhs, const SVectorReal& lprow, Real rhs);
1929 
1930  /// adds multiple rows to the real LP and adjusts basis
1931  void _addRowsReal(const LPRowSetReal& lprowset);
1932 
1933  /// adds a single column to the real LP and adjusts basis
1934  void _addColReal(const LPColReal& lpcol);
1935 
1936  /// adds a single column to the real LP and adjusts basis
1937  void _addColReal(Real obj, Real lower, const SVectorReal& lpcol, Real upper);
1938 
1939  /// adds multiple columns to the real LP and adjusts basis
1940  void _addColsReal(const LPColSetReal& lpcolset);
1941 
1942  /// replaces row \p i with \p lprow and adjusts basis
1943  void _changeRowReal(int i, const LPRowReal& lprow);
1944 
1945  /// changes left-hand side vector for constraints to \p lhs and adjusts basis
1946  void _changeLhsReal(const VectorReal& lhs);
1947 
1948  /// changes left-hand side of row \p i to \p lhs and adjusts basis
1949  void _changeLhsReal(int i, const Real& lhs);
1950 
1951  /// changes right-hand side vector to \p rhs and adjusts basis
1952  void _changeRhsReal(const VectorReal& rhs);
1953 
1954  /// changes right-hand side of row \p i to \p rhs and adjusts basis
1955  void _changeRhsReal(int i, const Real& rhs);
1956 
1957  /// changes left- and right-hand side vectors and adjusts basis
1958  void _changeRangeReal(const VectorReal& lhs, const VectorReal& rhs);
1959 
1960  /// changes left- and right-hand side of row \p i and adjusts basis
1961  void _changeRangeReal(int i, const Real& lhs, const Real& rhs);
1962 
1963  /// replaces column \p i with \p lpcol and adjusts basis
1964  void _changeColReal(int i, const LPColReal& lpcol);
1965 
1966  /// changes vector of lower bounds to \p lower and adjusts basis
1967  void _changeLowerReal(const VectorReal& lower);
1968 
1969  /// changes lower bound of column i to \p lower and adjusts basis
1970  void _changeLowerReal(int i, const Real& lower);
1971 
1972  /// changes vector of upper bounds to \p upper and adjusts basis
1973  void _changeUpperReal(const VectorReal& upper);
1974 
1975  /// changes \p i 'th upper bound to \p upper and adjusts basis
1976  void _changeUpperReal(int i, const Real& upper);
1977 
1978  /// changes vectors of column bounds to \p lower and \p upper and adjusts basis
1979  void _changeBoundsReal(const VectorReal& lower, const VectorReal& upper);
1980 
1981  /// changes bounds of column \p i to \p lower and \p upper and adjusts basis
1982  void _changeBoundsReal(int i, const Real& lower, const Real& upper);
1983 
1984  /// changes matrix entry in row \p i and column \p j to \p val and adjusts basis
1985  void _changeElementReal(int i, int j, const Real& val);
1986 
1987  /// removes row \p i and adjusts basis
1988  void _removeRowReal(int i);
1989 
1990  /// removes all rows with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
1991  /// new index where row \p i has been moved to; note that \p perm must point to an array of size at least
1992  /// #numRowsReal()
1993  void _removeRowsReal(int perm[]);
1994 
1995  /// remove all rows with indices in array \p idx of size \p n; an array \p perm of size #numRowsReal() may be passed
1996  /// as buffer memory
1997  void _removeRowsReal(int idx[], int n, int perm[]);
1998 
1999  /// removes rows \p start to \p end including both; an array \p perm of size #numRowsReal() may be passed as buffer
2000  /// memory
2001  void _removeRowRangeReal(int start, int end, int perm[]);
2002 
2003  /// removes column i
2004  void _removeColReal(int i);
2005 
2006  /// removes all columns with an index \p i such that \p perm[i] < 0; upon completion, \p perm[i] >= 0 indicates the
2007  /// new index where column \p i has been moved to; note that \p perm must point to an array of size at least
2008  /// #numColsReal()
2009  void _removeColsReal(int perm[]);
2010 
2011  /// remove all columns with indices in array \p idx of size \p n; an array \p perm of size #numColsReal() may be
2012  /// passed as buffer memory
2013  void _removeColsReal(int idx[], int n, int perm[]);
2014 
2015  /// removes columns \p start to \p end including both; an array \p perm of size #numColsReal() may be passed as
2016  /// buffer memory
2017  void _removeColRangeReal(int start, int end, int perm[]);
2018 
2019  /// invalidates solution
2020  void _invalidateSolution();
2021 
2022  /// enables simplifier and scaler according to current parameters
2024 
2025  /// disables simplifier and scaler
2027 
2028  /// ensures that the rational LP is available; performs no sync
2029  void _ensureRationalLP();
2030 
2031  /// ensures that the real LP and the basis are loaded in the solver; performs no sync
2032  void _ensureRealLPLoaded();
2033 
2034  /// call floating-point solver and update statistics on iterations etc.
2036 
2037  /// reads real LP in LP or MPS format from file and returns true on success; gets row names, column names, and
2038  /// integer variables if desired
2039  bool _readFileReal(const char* filename, NameSet* rowNames = 0, NameSet* colNames = 0,
2040  DIdxSet* intVars = 0);
2041 
2042  /// reads rational LP in LP or MPS format from file and returns true on success; gets row names, column names, and
2043  /// integer variables if desired
2044  bool _readFileRational(const char* filename, NameSet* rowNames = 0, NameSet* colNames = 0,
2045  DIdxSet* intVars = 0);
2046 
2047  /// completes range type arrays after adding columns and/or rows
2049 
2050  /// recomputes range types from scratch using real LP
2051  void _recomputeRangeTypesReal();
2052 
2053  /// recomputes range types from scratch using rational LP
2055 
2056  /// synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP, without looking at the sync mode
2057  void _syncLPReal(bool time = true);
2058 
2059  /// synchronizes rational LP with real LP, i.e., copies real LP to rational LP, without looking at the sync mode
2060  void _syncLPRational(bool time = true);
2061 
2062  /// synchronizes rational solution with real solution, i.e., copies (rounded) rational solution to real solution
2063  void _syncRealSolution();
2064 
2065  /// synchronizes real solution with rational solution, i.e., copies real solution to rational solution
2066  void _syncRationalSolution();
2067 
2068  /// returns pointer to a constant unit vector available until destruction of the SoPlex class
2069  const UnitVectorRational* _unitVectorRational(const int i);
2070 
2071  /// parses one line in a settings file and returns true on success; note that the string is modified
2072  bool _parseSettingsLine(char* line, const int lineNumber);
2073 
2074  //@}
2075 
2076 
2077  //**@name Private solving methods implemented in solverational.cpp */
2078  //@{
2079 
2080  /// solves rational LP
2081  void _optimizeRational();
2082 
2083  /// solves current problem with iterative refinement and recovery mechanism
2084  void _performOptIRStable(SolRational& sol,
2085  bool acceptUnbounded,
2086  bool acceptInfeasible,
2087  int minRounds,
2088  bool& primalFeasible,
2089  bool& dualFeasible,
2090  bool& infeasible,
2091  bool& unbounded,
2092  bool& stopped,
2093  bool& stoppedIter,
2094  bool& error);
2095 
2096  /// performs iterative refinement on the auxiliary problem for testing unboundedness
2097  void _performUnboundedIRStable(SolRational& sol, bool& hasUnboundedRay, bool& stopped,
2098  bool& stoppedIter, bool& error);
2099 
2100  /// performs iterative refinement on the auxiliary problem for testing feasibility
2101  void _performFeasIRStable(SolRational& sol, bool& withDualFarkas, bool& stopped, bool& stoppedIter,
2102  bool& error);
2103 
2104  /// reduces matrix coefficient in absolute value by the lifting procedure of Thiele et al. 2013
2105  void _lift();
2106 
2107  /// undoes lifting
2108  void _project(SolRational& sol);
2109 
2110  /// store basis
2111  void _storeBasis();
2112 
2113  /// restore basis
2114  void _restoreBasis();
2115 
2116  /// stores objective, bounds, and sides of real LP
2117  void _storeLPReal();
2118 
2119  /// restores objective, bounds, and sides of real LP
2120  void _restoreLPReal();
2121 
2122  /// introduces slack variables to transform inequality constraints into equations for both rational and real LP,
2123  /// which should be in sync
2124  void _transformEquality();
2125 
2126  /// undoes transformation to equality form
2127  void _untransformEquality(SolRational& sol);
2128 
2129  /// transforms LP to unboundedness problem by moving the objective function to the constraints, changing right-hand
2130  /// side and bounds to zero, and adding an auxiliary variable for the decrease in the objective function
2131  void _transformUnbounded();
2132 
2133  /// undoes transformation to unboundedness problem
2134  void _untransformUnbounded(SolRational& sol, bool unbounded);
2135 
2136  /// transforms LP to feasibility problem by removing the objective function, shifting variables, and homogenizing the
2137  /// right-hand side
2138  void _transformFeasibility();
2139 
2140  /// undoes transformation to feasibility problem
2141  void _untransformFeasibility(SolRational& sol, bool infeasible);
2142 
2143  /** computes radius of infeasibility box implied by an approximate Farkas' proof
2144 
2145  Given constraints of the form \f$ lhs <= Ax <= rhs \f$, a farkas proof y should satisfy \f$ y^T A = 0 \f$ and
2146  \f$ y_+^T lhs - y_-^T rhs > 0 \f$, where \f$ y_+, y_- \f$ denote the positive and negative parts of \f$ y \f$.
2147  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
2148  as the following holds for all potentially feasible \f$ x \f$:
2149 
2150  \f[
2151  y^T Ax < (y_+^T lhs - y_-^T rhs) (*)
2152  \f]
2153 
2154  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
2155  bounds on \f$ x \f$ imply that all feasible \f$ x \f$ satisfy (*), and if not then compute bounds on \f$ x \f$ to
2156  guarantee (*). The simplest way to do this is to compute
2157 
2158  \f[
2159  B = (y_+^T lhs - y_-^T rhs) / \sum_i(|(y^T A)_i|)
2160  \f]
2161 
2162  noting that if every component of \f$ x \f$ has \f$ |x_i| < B \f$, then (*) holds.
2163 
2164  \f$ B \f$ can be increased by iteratively including variable bounds smaller than \f$ B \f$. The speed of this
2165  method can be further improved by using interval arithmetic for all computations. For related information see
2166  Sec. 4 of Neumaier and Shcherbina, Mathematical Programming A, 2004.
2167 
2168  Set transformed to true if this method is called after _transformFeasibility().
2169  */
2170  void _computeInfeasBox(SolRational& sol, bool transformed);
2171 
2172  /// solves real LP during iterative refinement
2173  SPxSolver::Status _solveRealForRational(bool fromscratch, VectorReal& primal, VectorReal& dual,
2174  DataArray< SPxSolver::VarStatus >& basisStatusRows,
2175  DataArray< SPxSolver::VarStatus >& basisStatusCols, bool& returnedBasis);
2176 
2177  /// solves real LP with recovery mechanism
2178  SPxSolver::Status _solveRealStable(bool acceptUnbounded, bool acceptInfeasible, VectorReal& primal,
2179  VectorReal& dual,
2180  DataArray< SPxSolver::VarStatus >& basisStatusRows,
2181  DataArray< SPxSolver::VarStatus >& basisStatusCols, bool& returnedBasis,
2182  const bool forceNoSimplifier = false);
2183 
2184  /// computes rational inverse of basis matrix as defined by _rationalLUSolverBind
2186 
2187  /// factorizes rational basis matrix in column representation
2189  DataArray< SPxSolver::VarStatus >& basisStatusCols, bool& stoppedTime, bool& stoppedIter,
2190  bool& error, bool& optimal);
2191 
2192  /// attempts rational reconstruction of primal-dual solution
2194  DataArray< SPxSolver::VarStatus >& basisStatusRows,
2195  DataArray< SPxSolver::VarStatus >& basisStatusCols, const Rational& denomBoundSquared);
2196  //@}
2197 
2198 
2199  //**@name Private solving methods implemented in solvereal.cpp */
2200  //@{
2201 
2202  /// solves real LP
2203  void _optimizeReal();
2204 
2205  /// checks result of the solving process and solves again without preprocessing if necessary
2206  void _evaluateSolutionReal(SPxSimplifier::Result simplificationStatus);
2207 
2208  /// solves real LP with/without preprocessing
2209  void _preprocessAndSolveReal(bool applyPreprocessing);
2210 
2211  /// loads original problem into solver and solves again after it has been solved to optimality with preprocessing
2212  void _resolveWithoutPreprocessing(SPxSimplifier::Result simplificationStatus);
2213 
2214  /// verify computed solution and resolve if necessary
2215  void _verifySolutionReal();
2216 
2217  /// stores solution of the real LP; before calling this, the real LP must be loaded in the solver and solved (again)
2218  void _storeSolutionReal(bool verify = true);
2219 
2220  /// stores solution from the simplifier because problem vanished in presolving step
2222 
2223  /// unscales stored solution to remove internal or external scaling of LP
2224  void _unscaleSolutionReal(SPxLPReal& LP, bool persistent = true);
2225 
2226  /// load original LP and possibly setup a slack basis
2227  void _loadRealLP(bool initBasis);
2228 
2229  /// check scaling of LP
2230  void _checkScaling(SPxLPReal* origLP) const;
2231 
2232  /// check correctness of (un)scaled basis matrix operations
2233  void _checkBasisScaling();
2234 
2235  /// check whether persistent scaling is supposed to be reapplied again after unscaling
2236  bool _reapplyPersistentScaling() const;
2237 
2238  /// solves LP using the decomposition based dual simplex
2240 
2241  /// creating copies of the original problem that will be manipulated to form the reduced and complementary problems
2243 
2244  /// forms the reduced problem
2245  void _formDecompReducedProblem(bool& stop);
2246 
2247  /// solves the reduced problem
2249 
2250  /// forms the complementary problem
2252 
2253  /// simplifies the problem and solves
2254  void _decompSimplifyAndSolve(SPxSolver& solver, SLUFactor& sluFactor, bool fromScratch,
2255  bool applyPreprocessing);
2256 
2257  /// loads original problem into solver and solves again after it has been solved to optimality with preprocessing
2258  void _decompResolveWithoutPreprocessing(SPxSolver& solver, SLUFactor& sluFactor,
2259  SPxSimplifier::Result result);
2260 
2261  /// identifies the columns of the row-form basis that correspond to rows with zero dual multipliers.
2262  void _getZeroDualMultiplierIndices(Vector feasVector, int* nonposind, int* colsforremoval,
2263  int* nnonposind, bool& stop);
2264 
2265  /// retrieves the compatible columns from the constraint matrix
2266  void _getCompatibleColumns(Vector feasVector, int* nonposind, int* compatind, int* rowsforremoval,
2267  int* colsforremoval,
2268  int nnonposind, int* ncompatind, bool formRedProb, bool& stop);
2269 
2270  /// computes the reduced problem objective coefficients
2271  void _computeReducedProbObjCoeff(bool& stop);
2272 
2273  /// computes the compatible bound constraints and adds them to the reduced problem
2274  void _getCompatibleBoundCons(LPRowSet& boundcons, int* compatboundcons, int* nonposind,
2275  int* ncompatboundcons,
2276  int nnonposind, bool& stop);
2277 
2278  /// computes the rows to remove from the complementary problem
2279  void _getRowsForRemovalComplementaryProblem(int* nonposind, int* bind, int* rowsforremoval,
2280  int* nrowsforremoval,
2281  int nnonposind);
2282 
2283  /// removing rows from the complementary problem.
2284  void _deleteAndUpdateRowsComplementaryProblem(SPxRowId rangedRowIds[], int& naddedrows);
2285 
2286  /// evaluates the solution of the reduced problem for the DBDS
2287  void _evaluateSolutionDecomp(SPxSolver& solver, SLUFactor& sluFactor, SPxSimplifier::Result result);
2288 
2289  /// update the reduced problem with additional columns and rows
2290  void _updateDecompReducedProblem(Real objVal, DVector dualVector, DVector redcostVector,
2291  DVector compPrimalVector,
2292  DVector compDualVector);
2293 
2294  /// update the reduced problem with additional columns and rows based upon the violated original bounds and rows
2295  void _updateDecompReducedProblemViol(bool allrows);
2296 
2297  /// builds the update rows with those violated in the complmentary problem
2298  void _findViolatedRows(Real compObjValue, DataArray<RowViolation>& violatedrows,
2299  int& nviolatedrows);
2300 
2301  /// update the dual complementary problem with additional columns and rows
2302  void _updateDecompComplementaryDualProblem(bool origObj);
2303 
2304  /// update the primal complementary problem with additional columns and rows
2305  void _updateDecompComplementaryPrimalProblem(bool origObj);
2306 
2307  /// checking the optimality of the original problem.
2308  void _checkOriginalProblemOptimality(Vector primalVector, bool printViol);
2309 
2310  /// updating the slack column coefficients to adjust for equality constraints
2312 
2313  /// updating the slack column coefficients to adjust for equality constraints
2315 
2316  /// removing the dual columns related to the fixed variables
2317  void _removeComplementaryDualFixedPrimalVars(int* currFixedVars);
2318 
2319  /// removing the dual columns related to the fixed variables
2320  void _identifyComplementaryDualFixedPrimalVars(int* currFixedVars);
2321 
2322  /// updating the dual columns related to the fixed primal variables.
2323  void _updateComplementaryDualFixedPrimalVars(int* currFixedVars);
2324 
2325  /// removing the dual columns related to the fixed variables
2326  void _identifyComplementaryPrimalFixedPrimalVars(int* currFixedVars);
2327 
2328  /// updating the dual columns related to the fixed primal variables.
2329  void _updateComplementaryPrimalFixedPrimalVars(int* currFixedVars);
2330 
2331  /// updating the complementary dual problem with the original objective function
2333 
2334  /// updating the complementary primal problem with the original objective function
2336 
2337  /// determining which bound the primal variables will be fixed to.
2338  int getOrigVarFixedDirection(int colNum);
2339 
2340  /// checks the dual feasibility of the current basis
2341  bool checkBasisDualFeasibility(Vector feasVec);
2342 
2343  /// returns the expected sign of the dual variables for the reduced problem
2344  DualSign getExpectedDualVariableSign(int rowNumber);
2345 
2346  /// returns the expected sign of the dual variables for the original problem
2347  DualSign getOrigProbDualVariableSign(int rowNumber);
2348 
2349  /// prints a display line of the flying table for the DBDS
2350  void printDecompDisplayLine(SPxSolver& solver, const SPxOut::Verbosity origVerb, bool force,
2351  bool forceHead);
2352 
2353  /// stores the problem statistics of the original problem
2355 
2356  /// stores the problem statistics of the original problem
2357  void printOriginalProblemStatistics(std::ostream& os);
2358 
2359  /// gets the coefficient of the slack variable in the primal complementary problem
2360  Real getCompSlackVarCoeff(int primalRowNum);
2361 
2362  /// gets violation of bounds; returns true on success
2363  bool getDecompBoundViolation(Real& maxviol, Real& sumviol);
2364 
2365  /// gets violation of constraints; returns true on success
2366  bool getDecompRowViolation(Real& maxviol, Real& sumviol);
2367 
2368  /// function call to terminate the decomposition simplex
2369  bool decompTerminate(Real timeLimit);
2370 
2371  /// function to build a basis for the original problem as given by the solution to the reduced problem
2372  void _writeOriginalProblemBasis(const char* filename, NameSet* rowNames, NameSet* colNames,
2373  bool cpxFormat);
2374 
2375  /// function to retrieve the original problem row basis status from the reduced and complementary problems
2376  void getOriginalProblemBasisRowStatus(DataArray< int >& degenerateRowNums,
2377  DataArray< SPxSolver::VarStatus >& degenerateRowStatus, int& nDegenerateRows, int& nNonBasicRows);
2378 
2379  /// function to retrieve the column status for the original problem basis from the reduced and complementary problems
2380  void getOriginalProblemBasisColStatus(int& nNonBasicCols);
2381 
2382  //@}
2383 };
2384 }
2385 #endif // _SOPLEX_H_
void changeLhsRational(const VectorRational &lhs)
changes left-hand side vector for constraints to lhs
Definition: soplex.cpp:2187
int _lastSolveMode
Definition: soplex.h:1858
const VectorRational & rhsRational() const
returns right-hand side vector
Definition: soplex.cpp:1214
Fast shifting ratio test.
RangeType
type of bounds and sides
Definition: soplex.h:1679
const char * getRatiotesterName()
name of currently loaded ratiotester
Definition: soplex.cpp:5324
cpu or user time
Definition: soplex.h:1266
void getRowsRational(int start, int end, LPRowSetRational &lprowset) const
gets rows start, ..., end.
Definition: soplex.cpp:1196
const VectorReal & maxObjRealInternal() const
returns objective function vector after transformation to a maximization problem; since this is how i...
Definition: soplex.cpp:1090
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:4972
void _changeUpperReal(const VectorReal &upper)
changes vector of upper bounds to upper and adjusts basis
Definition: soplex.cpp:8184
standard floating-point parsing
Definition: soplex.h:1227
int _nCompPrimalCols
Definition: soplex.h:1818
textbook ratio test without stabilization
Definition: soplex.h:1198
accuracy of conjugate gradient method in least squares scaling (higher value leads to more iterations...
Definition: soplex.h:1368
SoPlex start basis generation base class.
zero tolerance used in factorization
Definition: soplex.h:1311
void getUpperReal(DVectorReal &upper) const
gets upper bound vector
Definition: soplex.cpp:1034
Rational _rationalMaxscaleincr
Definition: soplex.h:1594
Bound flipping ratio test ("long step dual") for SoPlex.Class SPxBoundFlippingRT provides an implemen...
DVectorRational _unboundedRhs
Definition: soplex.h:1658
bool _reapplyPersistentScaling() const
check whether persistent scaling is supposed to be reapplied again after unscaling ...
Definition: solvereal.cpp:84
void printVersion() const
prints version and compilation options
Definition: soplex.cpp:7309
SoPlex()
default constructor
Definition: soplex.cpp:611
bool getDualViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of dual multipliers; returns true on success
Definition: soplex.cpp:3709
Types of solution classes.
SolRational _workSol
Definition: soplex.h:1865
void printSolutionStatistics(std::ostream &os)
prints solution statistics
Definition: soplex.cpp:7082
refactor threshold for memory growth in factorization since last refactorization
Definition: soplex.h:1365
void _transformEquality()
introduces slack variables to transform inequality constraints into equations for both rational and r...
SPxColId _compSlackColId
Definition: soplex.h:1769
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:1182
bool getDualNorms(int &nnormsRow, int &nnormsCol, Real *norms) const
gets steepest edge norms and returns false if they are not available
Definition: soplex.cpp:1117
void _addColReal(const LPColReal &lpcol)
adds a single column to the real LP and adjusts basis
Definition: soplex.cpp:7877
int numRowsReal() const
returns number of rows
Definition: soplex.cpp:850
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:4284
Rational minAbsNonzeroRational() const
returns smallest non-zero element in absolute value
Definition: soplex.cpp:1169
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:2697
int _nDecompViolRows
Definition: soplex.h:1805
type of starter used to create crash basis
Definition: soplex.h:1002
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:1882
const RowViolation * entry
Definition: soplex.h:1726
void _optimizeReal()
solves real LP
Definition: solvereal.cpp:28
geometric mean scaling on rows and columns, max 8 rounds
Definition: soplex.h:1147
const Settings & settings() const
returns current parameter settings
Definition: soplex.cpp:5807
upper limit on objective value
Definition: soplex.h:1329
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:1147
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:8279
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:1308
Result
Result of the simplification.
Definition: spxsimplifier.h:81
mode for solution polishing
Definition: soplex.h:1035
Real _realParamValues[SoPlex::REALPARAM_COUNT]
array of current real parameter values
Definition: soplex.h:1459
void _changeRangeReal(const VectorReal &lhs, const VectorReal &rhs)
changes left- and right-hand side vectors and adjusts basis
Definition: soplex.cpp:8061
type of ratio test
Definition: soplex.h:1008
void removeColReal(int i)
removes column i
Definition: soplex.cpp:1854
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:1338
SPxMainSM _simplifierMainSM
Definition: soplex.h:1604
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:886
verbosity level
Definition: soplex.h:993
LP has beed solved to optimality but unscaled solution contains violations.
Definition: spxsolver.h:224
continue iterative refinement with exact basic solution if not optimal?
Definition: soplex.h:944
int origCountLower
Definition: soplex.h:1838
type of timer
Definition: soplex.h:1023
const SVectorReal & colVectorRealInternal(int i) const
returns vector of col i, ignoring scaling
Definition: soplex.cpp:998
int numRedProbIter
Definition: soplex.h:1828
automatic sync of real and rational LP
Definition: soplex.h:1217
DVectorRational _feasLhs
Definition: soplex.h:1661
void _findViolatedRows(Real compObjValue, DataArray< RowViolation > &violatedrows, int &nviolatedrows)
builds the update rows with those violated in the complmentary problem
Definition: solvedbds.cpp:1503
DataArray< SPxRowId > _decompPrimalRowIDs
Definition: soplex.h:1782
DataArray< SPxRowId > _decompElimPrimalRowIDs
Definition: soplex.h:1785
number of real parameters
Definition: soplex.h:1374
int origCountRhs
Definition: soplex.h:1845
void _checkOriginalProblemOptimality(Vector primalVector, bool printViol)
checking the optimality of the original problem.
Definition: solvedbds.cpp:2795
void _removeComplementaryDualFixedPrimalVars(int *currFixedVars)
removing the dual columns related to the fixed variables
Definition: solvedbds.cpp:2952
type of computational form, i.e., column or row representation
Definition: soplex.h:969
void changeColRational(int i, const LPColRational &lpcol)
replaces column i with lpcol
Definition: soplex.cpp:2373
void _setComplementaryPrimalOriginalObjective()
updating the complementary primal problem with the original objective function
Definition: solvedbds.cpp:3316
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:5113
Abstract pricer base class.
bool getPrimalReal(VectorReal &vector)
gets the primal solution vector if available; returns true on success
Definition: soplex.cpp:3078
int origCountUpper
Definition: soplex.h:1839
dual simplex algorithm, i.e., leaving for column and entering for row representation ...
Definition: soplex.h:1086
pivot zero tolerance used in factorization
Definition: soplex.h:1317
int numRowsRational() const
returns number of rows
Definition: soplex.cpp:1142
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:5399
SPxSolver::Status solve()
Definition: soplex.h:578
objective offset
Definition: soplex.h:1371
DataArray< SPxRowId > _decompReducedProbColRowIDs
Definition: soplex.h:1779
refinement limit (-1 if unlimited)
Definition: soplex.h:984
bool getDualRational(VectorRational &vector)
gets the dual solution vector if available; returns true on success
Definition: soplex.cpp:3453
class of parameter settings
Definition: soplex.h:1387
SPxLPRational * _rationalLP
Definition: soplex.h:1650
void printShortStatistics(std::ostream &os)
prints short statistics
Definition: soplex.cpp:7185
Solution vector based start basis.
Real coefReal(int row, int col) const
returns (unscaled) coefficient
Definition: soplex.cpp:895
bool getSlacksRational(VectorRational &vector)
gets the vector of slack values if available; returns true on success
Definition: soplex.cpp:3423
bool multBasis(Real *vec, bool unscale=true)
multiply with basis matrix; B * vec (inplace)
Definition: soplex.cpp:4857
void getColsRational(int start, int end, LPColSetRational &lpcolset) const
gets columns start, ..., end
Definition: soplex.cpp:1268
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:3941
void _addColsReal(const LPColSetReal &lpcolset)
adds multiple columns to the real LP and adjusts basis
Definition: soplex.cpp:7920
primal simplex algorithm, i.e., entering for column and leaving for row representation ...
Definition: soplex.h:1083
unsigned int randomSeed() const
returns the current random seed of the solver instance
Definition: soplex.cpp:7647
LPRowSet _transformedRows
Definition: soplex.h:1768
int _nDecompViolBounds
Definition: soplex.h:1804
DVector _transformedObj
Definition: soplex.h:1766
time limit in seconds (INFTY if unlimited)
Definition: soplex.h:1323
steepest edge pricer with exact initialization of norms
Definition: soplex.h:1191
mode for iterative refinement strategy
Definition: soplex.h:1017
SPxGeometSC _scalerGeo8
Definition: soplex.h:1608
void changeRangeReal(const VectorReal &lhs, const VectorReal &rhs)
changes left- and right-hand side vectors
Definition: soplex.cpp:1538
Rational _rationalFeastol
Definition: soplex.h:1592
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:5722
greedy crash basis weighted by objective, bounds, and sides
Definition: soplex.h:1163
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:8395
virtual ~SoPlex()
destructor
Definition: soplex.cpp:808
bool getRedCostRational(VectorRational &vector)
gets the vector of reduced cost values if available; returns true on success
Definition: soplex.cpp:3468
only error and warning output
Definition: soplex.h:1106
LP geometric mean scaling.
int _unscaleCalls
Definition: soplex.h:1877
primal feasibility tolerance
Definition: soplex.h:1302
static struct soplex::SoPlex::Settings::RealParam realParam
Definition: soplex.cpp:605
void _storeSolutionRealFromPresol()
stores solution from the simplifier because problem vanished in presolving step
Definition: solvereal.cpp:616
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:5615
Abstract ratio test base class.
void _addRowReal(const LPRowReal &lprow)
adds a single row to the real LP and adjusts basis
Definition: soplex.cpp:7824
DVectorRational _feasLower
Definition: soplex.h:1663
DVectorRational _feasRhs
Definition: soplex.h:1662
bool defaultValue[SoPlex::BOOLPARAM_COUNT]
array of default values for boolean parameters
Definition: soplex.h:1399
only error output
Definition: soplex.h:1103
SPxScaler * _scaler
Definition: soplex.h:1629
std::string name[SoPlex::BOOLPARAM_COUNT]
array of names for boolean parameters
Definition: soplex.h:1395
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:5415
void changeRangeRational(const VectorRational &lhs, const VectorRational &rhs)
changes left- and right-hand side vectors
Definition: soplex.cpp:2312
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:1014
mode for synchronizing real and rational LP
Definition: soplex.h:1011
void _syncLPReal(bool time=true)
synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP...
Definition: soplex.cpp:8807
void _optimizeRational()
solves rational LP
bool getDualFarkasReal(VectorReal &vector)
gets the Farkas proof if available; returns true on success
Definition: soplex.cpp:3153
void resetSettings(const bool quiet=false, const bool init=true)
resets default parameter settings
Definition: soplex.cpp:6537
void _recomputeRangeTypesRational()
recomputes range types from scratch using rational LP
Definition: soplex.cpp:8791
void _unscaleSolutionReal(SPxLPReal &LP, bool persistent=true)
unscales stored solution to remove internal or external scaling of LP
Definition: solvereal.cpp:703
iteration limit (-1 if unlimited)
Definition: soplex.h:981
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:1710
void changeRowRational(int i, const LPRowRational &lprow)
replaces row i with lprow
Definition: soplex.cpp:2167
Implementation of Sparse Linear Solver.
bool getRowViolationReal(Real &maxviol, Real &sumviol)
gets violation of constraints; returns true on success
Definition: soplex.cpp:3211
re-optimize the original problem to get a proof (ray) of infeasibility/unboundedness?
Definition: soplex.h:956
decide according to READMODE
Definition: soplex.h:1253
SPxFastRT _ratiotesterFast
Definition: soplex.h:1622
should cycling solutions be accepted during iterative refinement?
Definition: soplex.h:935
void _disableSimplifierAndScaler()
disables simplifier and scaler
Definition: soplex.cpp:8503
bool getRowViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of constraints; returns true on success
Definition: soplex.cpp:3555
static struct soplex::SoPlex::Settings::IntParam intParam
Definition: soplex.cpp:604
should the decomposition based dual simplex be used to solve the LP? Setting this to true forces the ...
Definition: soplex.h:923
DataArray< SPxSolver::VarStatus > _storedBasisStatusCols
Definition: soplex.h:1672
Real lowerReal(int i) const
returns lower bound of column i
Definition: soplex.cpp:1052
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:5129
Implementation of Sparse Linear Solver with Rational precision.
bool * _decompReducedProbCols
Definition: soplex.h:1772
int _nDualCols
Definition: soplex.h:1816
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:1822
void _removeRowReal(int i)
removes row i and adjusts basis
Definition: soplex.cpp:8302
lower bound is finite, upper bound is infinite
Definition: soplex.h:1685
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:8669
SoPlex start basis generation base class.SPxStarter is the virtual base class for classes generating ...
Definition: spxstarter.h:41
int _nElimPrimalRows
Definition: soplex.h:1814
void addColsRational(const LPColSetRational &lpcolset)
adds multiple columns
Definition: soplex.cpp:2148
full verbosity level
Definition: soplex.h:1118
Real upperReal(int i) const
returns upper bound of column i
Definition: soplex.cpp:1025
void _computeReducedProbObjCoeff(bool &stop)
computes the reduced problem objective coefficients
Definition: solvedbds.cpp:1850
minimize number of basic slack variables, i.e. more variables between bounds
Definition: soplex.h:1295
void getColRational(int i, LPColRational &lpcol) const
gets column i
Definition: soplex.cpp:1259
const char * getStarterName()
name of starter
Definition: soplex.cpp:5283
DVectorReal _manualObj
Definition: soplex.h:1641
int origCountBoxed
Definition: soplex.h:1840
objective sense
Definition: soplex.h:966
Dantzig pricer.
void _checkBasisScaling()
check correctness of (un)scaled basis matrix operations
Definition: testsoplex.cpp:92
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:3335
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:5333
Ids for LP columns.Class SPxColId provides DataKeys for the column indices of an SPxLP.
Definition: spxid.h:36
display frequency
Definition: soplex.h:990
void _ensureRationalLP()
ensures that the rational LP is available; performs no sync
Definition: soplex.cpp:8517
geometric mean scaling on rows and columns, max 1 round
Definition: soplex.h:1144
minimum number of stalling refinements since last pivot to trigger rational factorization ...
Definition: soplex.h:1029
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:1356
void getRowVectorReal(int i, DSVectorReal &row) const
gets vector of row i
Definition: soplex.cpp:918
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:6507
void _changeRhsReal(const VectorReal &rhs)
changes right-hand side vector to rhs and adjusts basis
Definition: soplex.cpp:8017
void changeElementReal(int i, int j, const Real &val)
changes matrix entry in row i and column j to val
Definition: soplex.cpp:1742
Devex pricer.
void printStatistics(std::ostream &os)
prints complete statistics
Definition: soplex.cpp:7198
Real rhsReal(int i) const
returns right-hand side of row i
Definition: soplex.cpp:953
bool getDecompBoundViolation(Real &maxviol, Real &sumviol)
gets violation of bounds; returns true on success
Definition: solvedbds.cpp:3776
should a rational factorization be performed after iterative refinement?
Definition: soplex.h:919
int origCountRanged
Definition: soplex.h:1846
user sync of real and rational LP
Definition: soplex.h:1220
mode for hyper sparse pricing
Definition: soplex.h:1026
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:1918
void getRhsReal(DVectorReal &rhs) const
gets right-hand side vector
Definition: soplex.cpp:944
maximum number of updates without fresh factorization
Definition: soplex.h:978
SPxSolver _compSolver
Definition: soplex.h:1758
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:2849
bound flipping ratio test for long steps in the dual simplex
Definition: soplex.h:1207
void changeUpperRational(const VectorRational &upper)
changes vector of upper bounds to upper
Definition: soplex.cpp:2454
bool _boolParamValues[SoPlex::BOOLPARAM_COUNT]
array of current boolean parameter values
Definition: soplex.h:1453
Rational _rationalPosInfty
Definition: soplex.h:1590
int numDecompIter
Definition: soplex.h:1827
number of integer parameters
Definition: soplex.h:1053
DataArray< SPxColId > _decompCompPrimalColIDs
Definition: soplex.h:1802
Rational _rationalOpttol
Definition: soplex.h:1593
RealParam
real parameters
Definition: soplex.h:1299
bool setDualNorms(int nnormsRow, int nnormsCol, Real *norms)
sets steepest edge norms and returns false if that&#39;s not possible
Definition: soplex.cpp:1125
static struct soplex::SoPlex::Settings::BoolParam boolParam
Definition: soplex.cpp:603
LP simplification base class.
const VectorRational & lhsRational() const
returns left-hand side vector
Definition: soplex.cpp:1232
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:5379
SPxEquiliSC _scalerBiequi
Definition: soplex.h:1606
int numNonzerosRational() const
returns number of nonzeros
Definition: soplex.cpp:1160
int origCountFreeRow
Definition: soplex.h:1847
DataArray< SPxColId > _decompReducedProbColIDs
Definition: soplex.h:1781
bool isDualFeasible() const
is stored dual solution feasible?
Definition: soplex.cpp:3031
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:1933
void addColReal(const LPCol &lpcol)
adds a single column
Definition: soplex.cpp:1407
Rational objRational(int i) const
returns objective value of column i
Definition: soplex.cpp:1342
void clearLPRational()
clears the LP
Definition: soplex.cpp:2867
void _solveDecompReducedProblem()
solves the reduced problem
DVectorRational _modLhs
Definition: soplex.h:1667
DataArray< SPxRowId > _decompReducedProbRowIDs
Definition: soplex.h:1777
DVectorReal _manualLower
Definition: soplex.h:1637
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:2054
void printOriginalProblemStatistics(std::ostream &os)
stores the problem statistics of the original problem
Definition: solvedbds.cpp:3700
SPxSolver::Status optimize()
optimize the given LP
Definition: soplex.cpp:2902
Steepest edge pricer.
void getObjReal(VectorReal &obj) const
gets objective function vector
Definition: soplex.cpp:1071
void getLowerReal(DVectorReal &lower) const
gets lower bound vector
Definition: soplex.cpp:1061
void addRowRational(const LPRowRational &lprow)
adds a single row
Definition: soplex.cpp:1983
void addColRational(const LPColRational &lpcol)
adds a single column
Definition: soplex.cpp:2073
row representation (lower,lhs) <= (x,Ax) <= (upper,rhs)
Definition: soplex.h:1076
SPxGeometSC _scalerGeoequi
Definition: soplex.h:1609
const UnitVectorRational * _unitVectorRational(const int i)
returns pointer to a constant unit vector available until destruction of the SoPlex class ...
Definition: soplex.cpp:8874
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:7687
void _syncRealSolution()
synchronizes rational solution with real solution, i.e., copies (rounded) rational solution to real s...
Definition: soplex.cpp:8850
SLUFactor _compSlufactor
Definition: soplex.h:1762
void _formDecompReducedProblem(bool &stop)
forms the reduced problem
Definition: solvedbds.cpp:636
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:2797
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:1362
Forrest-Tomlin type update.
Definition: soplex.h:1096
void changeRhsRational(const VectorRational &rhs)
changes right-hand side vector to rhs
Definition: soplex.cpp:2248
int dmaxSizeDualRational(const int base=2)
get size of largest denominator in dual solution
Definition: soplex.cpp:4011
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:7655
DataArray< SPxRowId > _decompCompPrimalRowIDs
Definition: soplex.h:1800
no solution polishing
Definition: soplex.h:1289
void _updateComplementaryPrimalFixedPrimalVars(int *currFixedVars)
updating the dual columns related to the fixed primal variables.
Definition: solvedbds.cpp:3203
int dlcmSizePrimalRational(const int base=2)
get size of least common multiple of denominators in primal solution
Definition: soplex.cpp:3969
Rational objValueRational()
returns the objective value if a primal solution is available
Definition: soplex.cpp:3377
void getBasis(SPxSolver::VarStatus rows[], SPxSolver::VarStatus cols[]) const
gets current basis via arrays of statuses
Definition: soplex.cpp:4115
DataArray< SPxSolver::VarStatus > _basisStatusCols
Definition: soplex.h:1861
DVectorRational _unboundedLower
Definition: soplex.h:1655
void getLhsReal(DVectorReal &lhs) const
gets left-hand side vector
Definition: soplex.cpp:971
decompStatus _currentProb
Definition: soplex.h:1849
DVectorReal _manualRhs
Definition: soplex.h:1640
bool isPrimalFeasible() const
is stored primal solution feasible?
Definition: soplex.cpp:3006
DataArray< RangeType > _colTypes
Definition: soplex.h:1697
type of scaler
Definition: soplex.h:999
double Real
Definition: spxdefines.h:218
Rational _rationalPosone
Definition: soplex.h:1879
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:1836
SPxBoundFlippingRT _ratiotesterBoundFlipping
Definition: soplex.h:1623
bool ignoreUnscaledViolations()
sets the status to OPTIMAL in case the LP has been solved with unscaled violations ...
Definition: soplex.h:605
bool _isRealLPLoaded
Definition: soplex.h:1632
SLUFactorRational _rationalLUSolver
Definition: soplex.h:1651
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:1606
void getRowRational(int i, LPRowRational &lprow) const
gets row i
Definition: soplex.cpp:1187
void _solveRealLPAndRecordStatistics()
call floating-point solver and update statistics on iterations etc.
Definition: soplex.cpp:8557
void _evaluateSolutionDecomp(SPxSolver &solver, SLUFactor &sluFactor, SPxSimplifier::Result result)
evaluates the solution of the reduced problem for the DBDS
Definition: solvedbds.cpp:3365
number of boolean parameters
Definition: soplex.h:959
void _setComplementaryDualOriginalObjective()
updating the complementary dual problem with the original objective function
Definition: solvedbds.cpp:3243
SPxEquiliSC _scalerUniequi
Definition: soplex.h:1605
void printSolvingStatistics(std::ostream &os)
prints statistics on solving process
Definition: soplex.cpp:7176
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:8712
lower threshold in lifting (nonzero matrix coefficients with smaller absolute value will be reformula...
Definition: soplex.h:1341
bool getPrimalRayReal(VectorReal &vector)
gets the primal ray if available; returns true on success
Definition: soplex.cpp:3108
disable timing
Definition: soplex.h:1263
bool hasPrimal() const
is a primal feasible solution available?
Definition: soplex.cpp:3015
standard Harris ratio test
Definition: soplex.h:1201
void _decompSimplifyAndSolve(SPxSolver &solver, SLUFactor &sluFactor, bool fromScratch, bool applyPreprocessing)
simplifies the problem and solves
Definition: solvedbds.cpp:881
void changeLhsReal(const VectorReal &lhs)
changes left-hand side vector for constraints to lhs
Definition: soplex.cpp:1462
bool getDecompRowViolation(Real &maxviol, Real &sumviol)
gets violation of constraints; returns true on success
Definition: solvedbds.cpp:3857
generic solution-based crash basis
Definition: soplex.h:1169
crash basis from a greedy solution
Definition: soplex.h:1166
int _beforeLiftCols
Definition: soplex.h:1676
bool hasDualFarkas() const
is Farkas proof of infeasibility available?
Definition: soplex.cpp:3048
bool _isConsistent() const
checks consistency
Definition: soplex.cpp:7699
void _changeLowerReal(const VectorReal &lower)
changes vector of lower bounds to lower and adjusts basis
Definition: soplex.cpp:8139
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:1685
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:1044
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:220
Rational maxAbsNonzeroRational() const
returns biggest non-zero element in absolute value
Definition: soplex.cpp:1178
use persistent scaling?
Definition: soplex.h:950
bool computeBasisInverseRational()
compute rational basis inverse; returns true on success
Definition: soplex.cpp:5085
bool _upperFinite(const RangeType &rangeType) const
checks whether RangeType corresponds to finite upper bound
Definition: soplex.cpp:7815
bool _hasBasis
Definition: soplex.h:1867
use bound flipping also for row representation?
Definition: soplex.h:947
bool hasBasis() const
is an advanced starting basis available?
Definition: soplex.cpp:4025
void _invalidateSolution()
invalidates solution
Definition: soplex.cpp:8430
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:4476
bool getDualViolationReal(Real &maxviol, Real &sumviol)
gets violation of dual multipliers; returns true on success
Definition: soplex.cpp:3317
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:5155
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:5294
void changeLowerReal(const VectorReal &lower)
changes vector of lower bounds to lower
Definition: soplex.cpp:1595
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:5316
print condition number during the solve
Definition: soplex.h:1050
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:1880
main LP solver class
SPxRowId _compSlackDualRowId
Definition: soplex.h:1770
DVectorRational _feasObj
Definition: soplex.h:1660
round scaling factors for iterative refinement to powers of two?
Definition: soplex.h:941
SPxBasis::SPxStatus basisStatus() const
returns the current basis status
Definition: soplex.cpp:4033
void _computeInfeasBox(SolRational &sol, bool transformed)
void removeRowReal(int i)
removes row i
Definition: soplex.cpp:1757
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:4687
int dlcmSizeDualRational(const int base=2)
get size of least common multiple of denominators in dual solution
Definition: soplex.cpp:3983
Auto pricer.
SPxWeightST _starterWeight
Definition: soplex.h:1611
Statistics * _statistics
statistics since last call to solveReal() or solveRational()
Definition: soplex.h:1577
void _evaluateSolutionReal(SPxSimplifier::Result simplificationStatus)
checks result of the solving process and solves again without preprocessing if necessary ...
Definition: solvereal.cpp:96
LPColSetRational _slackCols
Definition: soplex.h:1654
type of simplifier
Definition: soplex.h:996
int origCountFreeCol
Definition: soplex.h:1841
int numNonzeros
Definition: soplex.h:1834
Real getCompSlackVarCoeff(int primalRowNum)
gets the coefficient of the slack variable in the primal complementary problem
Definition: solvedbds.cpp:3724
void getColVectorReal(int i, DSVectorReal &col) const
gets vector of col i
Definition: soplex.cpp:1007
DVectorRational _feasUpper
Definition: soplex.h:1664
floating-point check
Definition: soplex.h:1250
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:8331
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:8831
void printUserSettings()
print non-default parameter values
Definition: soplex.cpp:6559
void changeBoundsReal(const VectorReal &lower, const VectorReal &upper)
changes vectors of column bounds to lower and upper
Definition: soplex.cpp:1672
RangeType _rangeTypeRational(const Rational &lower, const Rational &upper) const
determines RangeType from rational bounds
Definition: soplex.cpp:7768
SPxSteepPR _pricerQuickSteep
Definition: soplex.h:1618
int numColsRational() const
returns number of columns
Definition: soplex.cpp:1151
force iterative refinement
Definition: soplex.h:1243
void syncLPReal()
synchronizes real LP with rational LP, i.e., copies (rounded) rational LP into real LP...
Definition: soplex.cpp:1972
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:1615
SPxParMultPR _pricerParMult
Definition: soplex.h:1616
bool getPrimalRational(VectorRational &vector)
gets the primal solution vector if available; returns true on success
Definition: soplex.cpp:3408
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:2576
std::string statisticString() const
statistical information in form of a string
Definition: soplex.cpp:5265
RangeType _switchRangeType(const RangeType &rangeType) const
switches RANGETYPE_LOWER to RANGETYPE_UPPER and vice versa
Definition: soplex.cpp:7793
SLUFactor _slufactor
Definition: soplex.h:1603
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...
Real operator()(RowViolation i, RowViolation j) const
Definition: soplex.h:1728
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:5238
const SVectorReal & rowVectorRealInternal(int i) const
returns vector of row i, ignoring scaling
Definition: soplex.cpp:909
void syncLPRational()
synchronizes rational LP with real LP, i.e., copies real LP to rational LP, if sync mode is manual ...
Definition: soplex.cpp:2891
bool getRedCostReal(VectorReal &vector)
gets the vector of reduced cost values if available; returns true on success
Definition: soplex.cpp:3138
DataArray< SPxColId > _decompPrimalColIDs
Definition: soplex.h:1783
Simple heuristic SPxStarter.
DVectorRational _modUpper
Definition: soplex.h:1666
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:1057
int _nPrimalCols
Definition: soplex.h:1813
SPxSteepExPR _pricerSteep
Definition: soplex.h:1619
void _verifySolutionReal()
verify computed solution and resolve if necessary
Definition: solvereal.cpp:407
bool hasDual() const
is a dual feasible solution available?
Definition: soplex.cpp:3040
automatic pricer
Definition: soplex.h:1176
bool parseSettingsString(char *line)
parses one setting string and returns true on success; note that string is modified ...
Definition: soplex.cpp:6776
const VectorReal & upperRealInternal() const
returns upper bound vector
Definition: soplex.cpp:1016
only error, warning, and debug output
Definition: soplex.h:1109
SPxOut spxout
Definition: soplex.h:1476
infinity threshold
Definition: soplex.h:1320
void changeBoundsRational(const VectorRational &lower, const VectorRational &upper)
changes vectors of column bounds to lower and upper
Definition: soplex.cpp:2515
const SVectorRational & colVectorRational(int i) const
returns vector of column i
Definition: soplex.cpp:1277
int numIterations() const
number of iterations since last call to solve
Definition: soplex.cpp:5249
SPxDefaultRT _ratiotesterTextbook
Definition: soplex.h:1620
void _loadRealLP(bool initBasis)
load original LP and possibly setup a slack basis
Definition: solvereal.cpp:688
(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:1588
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:5182
Real lhsReal(int i) const
returns left-hand side of row i
Definition: soplex.cpp:980
LPRowReal::Type rowTypeReal(int i) const
returns inequality type of row i
Definition: soplex.cpp:989
automatic choice according to number of rows and columns
Definition: soplex.h:1070
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:4163
void _syncRationalSolution()
synchronizes real solution with rational solution, i.e., copies real solution to rational solution ...
Definition: soplex.cpp:8862
int _intParamValues[SoPlex::INTPARAM_COUNT]
array of current integer parameter values
Definition: soplex.h:1456
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:603
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:1237
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:7349
store only real LP
Definition: soplex.h:1214
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:1240
int _beforeLiftRows
Definition: soplex.h:1675
DataArray< SPxColId > _decompFixedVarDualIDs
Definition: soplex.h:1790
lower and upper bound finite, but different
Definition: soplex.h:1691
DualSign getOrigProbDualVariableSign(int rowNumber)
returns the expected sign of the dual variables for the original problem
Definition: solvedbds.cpp:3556
Sequential object-oriented SimPlex.SPxSolver is an LP solver class using the revised Simplex algorith...
Definition: spxsolver.h:85
DVectorReal _manualLhs
Definition: soplex.h:1639
bool _storedBasis
Definition: soplex.h:1674
void _storeLPReal()
stores objective, bounds, and sides of real LP
least square scaling
Definition: soplex.h:1150
LP least squares scaling.
Rational _rationalNegInfty
Definition: soplex.h:1591
const SVectorRational & rowVectorRational(int i) const
returns vector of row i
Definition: soplex.cpp:1205
DataArray< SPxColId > _decompCompPrimalFixedVarIDs
Definition: soplex.h:1795
void printStatus(std::ostream &os, SPxSolver::Status status)
prints status
Definition: soplex.cpp:7223
threshold on number of rows vs. number of columns for switching from column to row representations in...
Definition: soplex.h:1350
lower bound equals upper bound
Definition: soplex.h:1694
Collection of dense, sparse, and semi-sparse vectors.
high verbosity level
Definition: soplex.h:1115
bool getSlacksReal(VectorReal &vector)
gets the vector of slack values if available; returns true on success
Definition: soplex.cpp:3093
Implementation of Sparse Linear Solver.This class implements a SLinSolver interface by using the spar...
Definition: slufactor.h:41
int * _decompViolatedRows
Definition: soplex.h:1807
DataArray< SPxColId > _decompVarBoundDualIDs
Definition: soplex.h:1792
DataArray< SPxRowId > _decompDualRowIDs
Definition: soplex.h:1787
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:6312
void _changeLhsReal(const VectorReal &lhs)
changes left-hand side vector for constraints to lhs and adjusts basis
Definition: soplex.cpp:7974
int numCompProbIter
Definition: soplex.h:1829
DVectorReal _manualUpper
Definition: soplex.h:1638
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:4220
working tolerance for feasibility in floating-point solver during iterative refinement ...
Definition: soplex.h:1332
SPxLPReal * _realLP
Definition: soplex.h:1626
bool _lowerFinite(const RangeType &rangeType) const
checks whether RangeType corresponds to finite lower bound
Definition: soplex.cpp:7806
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:1041
bool loadSettingsFile(const char *filename)
reads settings file; returns true on success
Definition: soplex.cpp:6724
SPxGeometSC _scalerGeo1
Definition: soplex.h:1607
void _preprocessAndSolveReal(bool applyPreprocessing)
solves real LP with/without preprocessing
Definition: solvereal.cpp:223
geometric mean scaling (max 8 rounds) followed by equilibrium scaling (rows and columns) ...
Definition: soplex.h:1153
void _deleteAndUpdateRowsComplementaryProblem(SPxRowId rangedRowIds[], int &naddedrows)
removing rows from the complementary problem.
Definition: solvedbds.cpp:2062
int numNonzerosReal() const
returns number of nonzeros
Definition: soplex.cpp:868
SoPlex & operator=(const SoPlex &rhs)
assignment operator
Definition: soplex.cpp:673
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:3614
Harris pricing with shifting.
SPxDevexPR _pricerDevex
Definition: soplex.h:1617
Real minAbsNonzero
Definition: soplex.h:1835
DVector _decompFeasVector
Definition: soplex.h:1767
Real objReal(int i) const
returns objective value of column i
Definition: soplex.cpp:1080
DataArray< RangeType > _rowTypes
Definition: soplex.h:1698
void _removeColReal(int i)
removes column i
Definition: soplex.cpp:8366
void _changeRowReal(int i, const LPRowReal &lprow)
replaces row i with lprow and adjusts basis
Definition: soplex.cpp:7947
void setIntegralityInformation(int ncols, int *intInfo)
pass integrality information about the variables to the solver
Definition: soplex.cpp:1133
DVectorRational _modObj
Definition: soplex.h:1669
SPxSumST _starterSum
Definition: soplex.h:1612
maximize number of basic slack variables, i.e. more variables on bounds
Definition: soplex.h:1292
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:4155
apply rational reconstruction after each iterative refinement?
Definition: soplex.h:938
void _changeColReal(int i, const LPColReal &lpcol)
replaces column i with lpcol and adjusts basis
Definition: soplex.cpp:8110
void _formDecompComplementaryProblem()
forms the complementary problem
Definition: solvedbds.cpp:735
Real minAbsNonzeroReal() const
returns smallest non-zero element in absolute value
Definition: soplex.cpp:877
Weighted start basis.
type of pricer
Definition: soplex.h:1005
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:1043
bool getDualReal(VectorReal &vector)
gets the dual solution vector if available; returns true on success
Definition: soplex.cpp:3123
SPxHarrisRT _ratiotesterHarris
Definition: soplex.h:1621
int * _fixedOrigVars
Definition: soplex.h:1810
int * _decompRowStatus
Definition: soplex.h:1773
void changeColReal(int i, const LPColReal &lpcol)
replaces column i with lpcol
Definition: soplex.cpp:1576
Steepest edge pricer with exact initialization of weights.
working tolerance for optimality in floating-point solver during iterative refinement ...
Definition: soplex.h:1335
void clearLPReal()
clears the LP
Definition: soplex.cpp:1951
equilibrium scaling on rows or columns
Definition: soplex.h:1138
Preconfigured SoPlex LP-solver.
Definition: soplex.h:89
int _nCompPrimalRows
Definition: soplex.h:1817
should the dual of the complementary problem be used in the decomposition simplex?
Definition: soplex.h:929
void removeRowRational(int i)
removes row i
Definition: soplex.cpp:2668
Type
(In)Equality type of an LP row.
Definition: lprowbase.h:72
Real maxAbsNonzero
Definition: soplex.h:1836
DVectorRational _unboundedLhs
Definition: soplex.h:1657
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:3965
DSVectorRational _primalDualDiff
Definition: soplex.h:1670
int _decompDisplayLine
Definition: soplex.h:1820
SPxVectorST _starterVector
Definition: soplex.h:1613
LP scaling base class.
DVectorRational _unboundedUpper
Definition: soplex.h:1656
bool getBoundViolationReal(Real &maxviol, Real &sumviol)
gets violation of bounds; returns true on success
Definition: soplex.cpp:3168
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:5352
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:1286
NameSet * _colNames
Definition: soplex.h:1823
Weighted start basis.Class SPxWeightST is an implementation of a SPxStarter for generating a Simplex ...
Definition: spxweightst.h:56
SPxSolver _solver
Definition: soplex.h:1602
column representation Ax - s = 0, lower <= x <= upper, lhs <= s <= rhs
Definition: soplex.h:1073
mode for a posteriori feasibility checks
Definition: soplex.h:1020
refactor threshold for nonzeros in last factorized basis matrix compared to updated basis matrix ...
Definition: soplex.h:1359
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:3576
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:328
void _identifyComplementaryPrimalFixedPrimalVars(int *currFixedVars)
removing the dual columns related to the fixed variables
Definition: solvedbds.cpp:3170
int _optimizeCalls
Definition: soplex.h:1876
LPRowRational::Type rowTypeRational(int i) const
returns inequality type of row i
Definition: soplex.cpp:1250
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:972
bool * _decompReducedProbRows
Definition: soplex.h:1771
void _recomputeRangeTypesReal()
recomputes range types from scratch using real LP
Definition: soplex.cpp:8775
void _getRowsForRemovalComplementaryProblem(int *nonposind, int *bind, int *rowsforremoval, int *nrowsforremoval, int nnonposind)
computes the rows to remove from the complementary problem
Definition: solvedbds.cpp:2042
DataArray< UnitVectorRational *> _unitMatrixRational
Definition: soplex.h:1673
bool getDualFarkasRational(VectorRational &vector)
gets the Farkas proof if LP is infeasible; returns true on success
Definition: soplex.cpp:3483
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:987
DataArray< SPxSolver::VarStatus > _basisStatusRows
Definition: soplex.h:1860
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:1844
SPxSolver::VarStatus basisColStatus(int col) const
returns basis status for a single column
Definition: soplex.cpp:4079
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:916
void getNdualNorms(int &nnormsRow, int &nnormsCol) const
gets number of available dual norms
Definition: soplex.cpp:1109
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:4236
std::string description[SoPlex::BOOLPARAM_COUNT]
array of descriptions for boolean parameters
Definition: soplex.h:1397
SPxBasis _decompTransBasis
Definition: soplex.h:1764
const VectorReal & rhsRealInternal() const
returns right-hand side vector, ignoring scaling
Definition: soplex.cpp:935
the verbosity of the decomposition based simplex
Definition: soplex.h:1047
should lifting be used to reduce range of nonzero matrix coefficients?
Definition: soplex.h:910
int dmaxSizePrimalRational(const int base=2)
get size of largest denominator in primal solution
Definition: soplex.cpp:3997
bool getEstimatedCondition(Real &condition)
computes an estimated condition number for the current basis matrix using the power method; returns t...
Definition: soplex.cpp:4252
Real maxObjReal(int i) const
returns objective value of column i after transformation to a maximization problem; since this is how...
Definition: soplex.cpp:1100
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:463
void setRandomSeed(unsigned int seed)
set the random seeds of the solver instance
Definition: soplex.cpp:7639
DataArray< int > _rationalLUSolverBind
Definition: soplex.h:1652
should the degeneracy be computed for each basis?
Definition: soplex.h:926
bool _applyPolishing
Definition: soplex.h:1635
bool getExactCondition(Real &condition)
computes the exact condition number for the current basis matrix using the power method; returns true...
Definition: soplex.cpp:4268
SPxStatus
basis status.
Definition: spxbasis.h:90
const char * getScalerName()
name of scaling method
Definition: soplex.cpp:5305
Real solveTime() const
time spent in last call to solve
Definition: soplex.cpp:5257
void addColsReal(const LPColSetReal &lpcolset)
adds multiple columns
Definition: soplex.cpp:1425
int _nDualRows
Definition: soplex.h:1815
standard verbosity level
Definition: soplex.h:1112
SPxSolver::Status status() const
returns the current solver status
Definition: soplex.cpp:2998
SolReal _solReal
Definition: soplex.h:1863
zero tolerance used in update of the factorization
Definition: soplex.h:1314
lower limit on objective value
Definition: soplex.h:1326
void changeLowerRational(const VectorRational &lower)
changes vector of lower bounds to lower
Definition: soplex.cpp:2393
DSVectorRational _tauColVector
Definition: soplex.h:1659
DVectorRational _modLower
Definition: soplex.h:1665
both bounds are infinite
Definition: soplex.h:1682
bool getRedCostViolationReal(Real &maxviol, Real &sumviol)
gets violation of reduced costs; returns true on success
Definition: soplex.cpp:3257
BoolParam
boolean parameters
Definition: soplex.h:907
bool _hasSolReal
Definition: soplex.h:1868
int numProbRows
Definition: soplex.h:1832
int * _decompViolatedBounds
Definition: soplex.h:1806
bool _isSolveStopped(bool &stoppedTime, bool &stoppedIter) const
should solving process be stopped?
Definition: soplex.cpp:7727
void _changeBoundsReal(const VectorReal &lower, const VectorReal &upper)
changes vectors of column bounds to lower and upper and adjusts basis
Definition: soplex.cpp:8229
Settings()
default constructor initializing default settings
Definition: soplex.cpp:558
void _updateComplementaryDualSlackColCoeff()
updating the slack column coefficients to adjust for equality constraints
Definition: solvedbds.cpp:2865
maximum number of conjugate gradient iterations in least square scaling
Definition: soplex.h:1032
sparse pricing threshold (#violations < dimension * SPARSITY_THRESHOLD activates sparse pricing) ...
Definition: soplex.h:1347
Settings & operator=(const Settings &settings)
assignment operator
Definition: soplex.cpp:582
void addRowReal(const LPRowReal &lprow)
adds a single row
Definition: soplex.cpp:1371
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:3438
dual feasibility tolerance
Definition: soplex.h:1305
void _ensureRealLPLoaded()
ensures that the real LP and the basis are loaded in the solver; performs no sync ...
Definition: soplex.cpp:8530
void _restoreBasis()
restore basis
void changeRowReal(int i, const LPRowReal &lprow)
replaces row i with lprow
Definition: soplex.cpp:1443
equilibrium scaling on rows and columns
Definition: soplex.h:1141
void setBasis(const SPxSolver::VarStatus rows[], const SPxSolver::VarStatus cols[])
sets starting basis via arrays of statuses
Definition: soplex.cpp:5208
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:5887
void _identifyComplementaryDualFixedPrimalVars(int *currFixedVars)
removing the dual columns related to the fixed variables
Definition: solvedbds.cpp:2905
SolRational _solRational
Definition: soplex.h:1864
bool saveSettingsFile(const char *filename, const bool onlyChanged=false) const
writes settings file; returns true on success
Definition: soplex.cpp:6624
Textbook ratio test for SoPlex.
DataArray< SPxColId > _decompCompPrimalVarBoundIDs
Definition: soplex.h:1797
Real objValueReal()
returns the objective value if a primal solution is available
Definition: soplex.cpp:3057
void _updateComplementaryDualFixedPrimalVars(int *currFixedVars)
updating the dual columns related to the fixed primal variables.
Definition: solvedbds.cpp:3021
DualSign getExpectedDualVariableSign(int rowNumber)
returns the expected sign of the dual variables for the reduced problem
Definition: solvedbds.cpp:3537
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:8899
void changeRhsReal(const VectorReal &rhs)
changes right-hand side vector to rhs
Definition: soplex.cpp:1500
bool decompTerminate(Real timeLimit)
function call to terminate the decomposition simplex
Definition: solvedbds.cpp:3941
SPxLeastSqSC _scalerLeastsq
Definition: soplex.h:1610
geometric frequency at which to apply rational reconstruction
Definition: soplex.h:1353
void changeElementRational(int i, int j, const Rational &val)
changes matrix entry in row i and column j to val
Definition: soplex.cpp:2632
SPxStarter * _starter
Definition: soplex.h:1630
bool _hasSolRational
Definition: soplex.h:1869
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:5744
void getOriginalProblemStatistics()
stores the problem statistics of the original problem
Definition: solvedbds.cpp:3620
int origCountEqual
Definition: soplex.h:1843
void _enableSimplifierAndScaler()
enables simplifier and scaler according to current parameters
Definition: soplex.cpp:8445
int _nPrimalRows
Definition: soplex.h:1812
DVectorRational _modRhs
Definition: soplex.h:1668
bool checkBasisDualFeasibility(Vector feasVec)
checks the dual feasibility of the current basis
Definition: solvedbds.cpp:3481
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:5815
should LP be transformed to equality form before a rational solve?
Definition: soplex.h:913
int * _decompColStatus
Definition: soplex.h:1774
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:7666
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:4054
the number of iterations before the decomposition simplex initialisation is terminated.
Definition: soplex.h:1038
decide according to problem size
Definition: soplex.h:1279
int numIncludedRows
Definition: soplex.h:1826
const VectorRational & maxObjRational() const
returns objective function vector after transformation to a maximization problem; since this is how i...
Definition: soplex.cpp:1352
upper threshold in lifting (nonzero matrix coefficients with larger absolute value will be reformulat...
Definition: soplex.h:1344
DataArray< SPxSolver::VarStatus > _storedBasisStatusRows
Definition: soplex.h:1671
SPxLPReal _manualRealLP
Definition: soplex.h:1642
void _addRowsReal(const LPRowSetReal &lprowset)
adds multiple rows to the real LP and adjusts basis
Definition: soplex.cpp:7860
void _updateDecompReducedProblemViol(bool allrows)
update the reduced problem with additional columns and rows based upon the violated original bounds a...
Definition: solvedbds.cpp:1352
int numColsReal() const
returns number of columns
Definition: soplex.cpp:859
void changeUpperReal(const VectorReal &upper)
changes vector of upper bounds to upper
Definition: soplex.cpp:1634
bool hasPrimalRay() const
is a primal unbounded ray available?
Definition: soplex.cpp:3023
void removeColRational(int i)
removes column i
Definition: soplex.cpp:2768
SPxLPReal * _decompLP
Definition: soplex.h:1627
bool _isRealLPScaled
Definition: soplex.h:1634
IntParam
integer parameters
Definition: soplex.h:963
void _lift()
reduces matrix coefficient in absolute value by the lifting procedure of Thiele et al...
SPxSolver::Status _status
Definition: soplex.h:1857
void getObjRational(VectorRational &obj) const
gets objective function vector
Definition: soplex.cpp:1322
Rational _rationalZero
Definition: soplex.h:1881
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:8761
RangeType _rangeTypeReal(const Real &lower, const Real &upper) const
determines RangeType from real bounds
Definition: soplex.cpp:7743
const VectorReal & lhsRealInternal() const
returns left-hand side vector, ignoring scaling
Definition: soplex.cpp:962
SPxSimplifier * _simplifier
Definition: soplex.h:1628
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:2750
void _updateDecompComplementaryPrimalProblem(bool origObj)
update the primal complementary problem with additional columns and rows
Definition: solvedbds.cpp:2545
void addRowsReal(const LPRowSetReal &lprowset)
adds multiple rows
Definition: soplex.cpp:1389
int numProbCols
Definition: soplex.h:1833
DataArray< SPxColId > _decompDualColIDs
Definition: soplex.h:1789
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:953
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:932
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:1688
int * _decompCompProbColIDsIdx
Definition: soplex.h:1775
bool getBoundViolationRational(Rational &maxviol, Rational &sumviol)
gets violation of bounds; returns true on success
Definition: soplex.cpp:3498
SPxAutoPR _pricerAuto
Definition: soplex.h:1614
modified Harris ratio test
Definition: soplex.h:1204
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:3955
void _updateDecompComplementaryDualProblem(bool origObj)
update the dual complementary problem with additional columns and rows
Definition: solvedbds.cpp:2138
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:1785
const VectorRational & lowerRational() const
returns lower bound vector
Definition: soplex.cpp:1304
steepest edge pricer with initialization to unit norms
Definition: soplex.h:1188