coin-Bcp
ClpInterior.hpp
Go to the documentation of this file.
1 /* $Id: ClpInterior.hpp 2385 2019-01-06 19:43:06Z unxusr $ */
2 // Copyright (C) 2003, International Business Machines
3 // Corporation and others. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 /*
6  Authors
7 
8  John Tomlin (pdco)
9  John Forrest (standard predictor-corrector)
10 
11  Note JJF has added arrays - this takes more memory but makes
12  flow easier to understand and hopefully easier to extend
13 
14  */
15 #ifndef ClpInterior_H
16 #define ClpInterior_H
17 
18 #include <iostream>
19 #include <cfloat>
20 #include "ClpModel.hpp"
21 #include "ClpMatrixBase.hpp"
22 #include "ClpSolve.hpp"
23 #include "CoinDenseVector.hpp"
24 class ClpLsqr;
25 class ClpPdcoBase;
27 typedef struct {
28  double atolmin;
29  double r3norm;
30  double LSdamp;
31  double *deltay;
32 } Info;
34 
35 typedef struct {
36  double atolold;
37  double atolnew;
38  double r3ratio;
39  int istop;
40  int itncg;
41 } Outfo;
43 
44 typedef struct {
45  double gamma;
46  double delta;
47  int MaxIter;
48  double FeaTol;
49  double OptTol;
50  double StepTol;
51  double x0min;
52  double z0min;
53  double mu0;
54  int LSmethod; // 1=Cholesky 2=QR 3=LSQR
55  int LSproblem; // See below
57  double LSQRatol1; // Initial atol
58  double LSQRatol2; // Smallest atol (unless atol1 is smaller)
59  double LSQRconlim;
60  int wait;
61 } Options;
62 class Lsqr;
63 class ClpCholeskyBase;
64 // ***** END
72 class ClpInterior : public ClpModel {
73  friend void ClpInteriorUnitTest(const std::string &mpsDir,
74  const std::string &netlibDir);
75 
76 public:
79  ClpInterior();
81 
83  ClpInterior(const ClpInterior &);
85  ClpInterior(const ClpModel &);
90  ClpInterior(const ClpModel *wholeModel,
91  int numberRows, const int *whichRows,
92  int numberColumns, const int *whichColumns,
93  bool dropNames = true, bool dropIntegers = true);
95  ClpInterior &operator=(const ClpInterior &rhs);
97  ~ClpInterior();
98  // Ones below are just ClpModel with some changes
110  void loadProblem(const ClpMatrixBase &matrix,
111  const double *collb, const double *colub,
112  const double *obj,
113  const double *rowlb, const double *rowub,
114  const double *rowObjective = NULL);
115  void loadProblem(const CoinPackedMatrix &matrix,
116  const double *collb, const double *colub,
117  const double *obj,
118  const double *rowlb, const double *rowub,
119  const double *rowObjective = NULL);
120 
123  void loadProblem(const int numcols, const int numrows,
124  const CoinBigIndex *start, const int *index,
125  const double *value,
126  const double *collb, const double *colub,
127  const double *obj,
128  const double *rowlb, const double *rowub,
129  const double *rowObjective = NULL);
131  void loadProblem(const int numcols, const int numrows,
132  const CoinBigIndex *start, const int *index,
133  const double *value, const int *length,
134  const double *collb, const double *colub,
135  const double *obj,
136  const double *rowlb, const double *rowub,
137  const double *rowObjective = NULL);
139  int readMps(const char *filename,
140  bool keepNames = false,
141  bool ignoreErrors = false);
146  void borrowModel(ClpModel &otherModel);
148  void returnModel(ClpModel &otherModel);
150 
154  int pdco();
155  // ** Temporary version
156  int pdco(ClpPdcoBase *stuff, Options &options, Info &info, Outfo &outfo);
158  int primalDual();
160 
163  inline bool primalFeasible() const
165  {
166  return (sumPrimalInfeasibilities_ <= 1.0e-5);
167  }
169  inline bool dualFeasible() const
170  {
171  return (sumDualInfeasibilities_ <= 1.0e-5);
172  }
174  inline int algorithm() const
175  {
176  return algorithm_;
177  }
179  inline void setAlgorithm(int value)
180  {
181  algorithm_ = value;
182  }
185  {
187  }
190  {
192  }
195  {
196  return dualObjective_;
197  }
200  {
201  return primalObjective_;
202  }
205  {
206  return diagonalNorm_;
207  }
210  {
211  return linearPerturbation_;
212  }
214  {
215  linearPerturbation_ = value;
216  }
219  {
220  return projectionTolerance_;
221  }
223  {
224  projectionTolerance_ = value;
225  }
228  {
229  return diagonalPerturbation_;
230  }
232  {
233  diagonalPerturbation_ = value;
234  }
236  inline CoinWorkDouble gamma() const
237  {
238  return gamma_;
239  }
240  inline void setGamma(CoinWorkDouble value)
241  {
242  gamma_ = value;
243  }
245  inline CoinWorkDouble delta() const
246  {
247  return delta_;
248  }
249  inline void setDelta(CoinWorkDouble value)
250  {
251  delta_ = value;
252  }
255  {
256  return complementarityGap_;
257  }
259 
262  inline CoinWorkDouble largestPrimalError() const
264  {
265  return largestPrimalError_;
266  }
269  {
270  return largestDualError_;
271  }
273  inline int maximumBarrierIterations() const
274  {
276  }
277  inline void setMaximumBarrierIterations(int value)
278  {
280  }
282  void setCholesky(ClpCholeskyBase *cholesky);
284  int numberFixed() const;
287  void fixFixed(bool reallyFix = true);
289  inline CoinWorkDouble *primalR() const
290  {
291  return primalR_;
292  }
294  inline CoinWorkDouble *dualR() const
295  {
296  return dualR_;
297  }
299 
300 protected:
303  void gutsOfDelete();
306  void gutsOfCopy(const ClpInterior &rhs);
308  bool createWorkingData();
309  void deleteWorkingData();
311  bool sanityCheck();
313  int housekeeping();
315 public:
318  inline CoinWorkDouble rawObjectiveValue() const
320  {
321  return objectiveValue_;
322  }
324  inline int isColumn(int sequence) const
325  {
326  return sequence < numberColumns_ ? 1 : 0;
327  }
329  inline int sequenceWithin(int sequence) const
330  {
331  return sequence < numberColumns_ ? sequence : sequence - numberColumns_;
332  }
334  void checkSolution();
337  CoinWorkDouble quadraticDjs(CoinWorkDouble *djRegion, const CoinWorkDouble *solution,
338  CoinWorkDouble scaleFactor);
339 
341  inline void setFixed(int sequence)
342  {
343  status_[sequence] = static_cast< unsigned char >(status_[sequence] | 1);
344  }
345  inline void clearFixed(int sequence)
346  {
347  status_[sequence] = static_cast< unsigned char >(status_[sequence] & ~1);
348  }
349  inline bool fixed(int sequence) const
350  {
351  return ((status_[sequence] & 1) != 0);
352  }
353 
355  inline void setFlagged(int sequence)
356  {
357  status_[sequence] = static_cast< unsigned char >(status_[sequence] | 2);
358  }
359  inline void clearFlagged(int sequence)
360  {
361  status_[sequence] = static_cast< unsigned char >(status_[sequence] & ~2);
362  }
363  inline bool flagged(int sequence) const
364  {
365  return ((status_[sequence] & 2) != 0);
366  }
367 
369  inline void setFixedOrFree(int sequence)
370  {
371  status_[sequence] = static_cast< unsigned char >(status_[sequence] | 4);
372  }
373  inline void clearFixedOrFree(int sequence)
374  {
375  status_[sequence] = static_cast< unsigned char >(status_[sequence] & ~4);
376  }
377  inline bool fixedOrFree(int sequence) const
378  {
379  return ((status_[sequence] & 4) != 0);
380  }
381 
383  inline void setLowerBound(int sequence)
384  {
385  status_[sequence] = static_cast< unsigned char >(status_[sequence] | 8);
386  }
387  inline void clearLowerBound(int sequence)
388  {
389  status_[sequence] = static_cast< unsigned char >(status_[sequence] & ~8);
390  }
391  inline bool lowerBound(int sequence) const
392  {
393  return ((status_[sequence] & 8) != 0);
394  }
395 
397  inline void setUpperBound(int sequence)
398  {
399  status_[sequence] = static_cast< unsigned char >(status_[sequence] | 16);
400  }
401  inline void clearUpperBound(int sequence)
402  {
403  status_[sequence] = static_cast< unsigned char >(status_[sequence] & ~16);
404  }
405  inline bool upperBound(int sequence) const
406  {
407  return ((status_[sequence] & 16) != 0);
408  }
409 
411  inline void setFakeLower(int sequence)
412  {
413  status_[sequence] = static_cast< unsigned char >(status_[sequence] | 32);
414  }
415  inline void clearFakeLower(int sequence)
416  {
417  status_[sequence] = static_cast< unsigned char >(status_[sequence] & ~32);
418  }
419  inline bool fakeLower(int sequence) const
420  {
421  return ((status_[sequence] & 32) != 0);
422  }
423 
425  inline void setFakeUpper(int sequence)
426  {
427  status_[sequence] = static_cast< unsigned char >(status_[sequence] | 64);
428  }
429  inline void clearFakeUpper(int sequence)
430  {
431  status_[sequence] = static_cast< unsigned char >(status_[sequence] & ~64);
432  }
433  inline bool fakeUpper(int sequence) const
434  {
435  return ((status_[sequence] & 64) != 0);
436  }
438 
440 protected:
458 public:
461 
462 protected:
477 
478 public:
484 
485 protected:
511  // gamma from Saunders and Tomlin regularized
513  // delta from Saunders and Tomlin regularized
536 #define LENGTH_HISTORY 5
606 };
607 //#############################################################################
616 void ClpInteriorUnitTest(const std::string &mpsDir,
617  const std::string &netlibDir);
618 
619 #endif
620 
621 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
622 */
void setGamma(CoinWorkDouble value)
If problem is primal feasible.
int CoinBigIndex
CoinWorkDouble largestDualError_
Largest error on basic duals.
CoinWorkDouble diagonalPerturbation() const
diagonalPerturbation
void setFakeLower(int sequence)
To say a variable has fake lower bound.
CoinWorkDouble scaleFactor_
scaleFactor. For scaling objective
void setCholesky(ClpCholeskyBase *cholesky)
Set cholesky (and delete present one)
bool fixed(int sequence) const
Raw objective value (so always minimize)
void setFixed(int sequence)
To say a variable is fixed.
CoinWorkDouble * upperSlack_
upperSlack
CoinWorkDouble * rhsU_
rhsU.
******** DATA to be moved into protected section of ClpInterior
Definition: ClpInterior.hpp:27
double r3norm
Definition: ClpInterior.hpp:29
void setAlgorithm(int value)
Set algorithm.
bool createWorkingData()
Returns true if data looks okay, false if not.
void clearLowerBound(int sequence)
Raw objective value (so always minimize)
CoinWorkDouble * deltaW_
deltaW.
CoinWorkDouble * rhsW_
rhsW.
void setLinearPerturbation(CoinWorkDouble value)
If problem is primal feasible.
bool sanityCheck()
Sanity check on input rim data.
int numberColumns_
Number of columns.
Definition: ClpModel.hpp:1254
int maximumBarrierIterations_
Maximum iterations.
CoinWorkDouble sumDualInfeasibilities() const
Sum of dual infeasibilities.
CoinWorkDouble diagonalPerturbation_
diagonalPerturbation
void setUpperBound(int sequence)
To say a variable has upper bound.
CoinWorkDouble * rhsB_
rhs B
CoinWorkDouble sumPrimalInfeasibilities() const
Sum of primal infeasibilities.
CoinWorkDouble stepLength_
stepLength
CoinWorkDouble actualDualStep_
actualDualStep
bool lowerBound(int sequence) const
Raw objective value (so always minimize)
double OptTol
Definition: ClpInterior.hpp:49
CoinPackedMatrix * matrix() const
Matrix (if not ClpPackedmatrix be careful about memory leak.
Definition: ClpModel.hpp:768
void gutsOfDelete()
Does most of deletion.
CoinWorkDouble * rhs_
Rhs.
CoinWorkDouble quadraticDjs(CoinWorkDouble *djRegion, const CoinWorkDouble *solution, CoinWorkDouble scaleFactor)
Modifies djs to allow for quadratic.
unsigned char * status_
Status (i.e.
Definition: ClpModel.hpp:1301
CoinWorkDouble historyInfeasibility_[LENGTH_HISTORY]
Largest error on Ax-b.
CoinWorkDouble maximumRHSChange_
maximumRHSChange
int primalDual()
Primal-Dual Predictor-Corrector barrier.
bool upperBound(int sequence) const
Raw objective value (so always minimize)
CoinWorkDouble * workArray_
work array
CoinWorkDouble * rhsZ_
rhsZ.
CoinWorkDouble * rowLowerWork_
Row lower bounds - working copy.
void returnModel(ClpModel &otherModel)
Return model - updates any scalars.
ClpInterior()
Default constructor.
int numberRows() const
Number of rows.
Definition: ClpModel.hpp:315
CoinWorkDouble largestDualError() const
Largest error on basic duals.
CoinWorkDouble * errorRegion_
errorRegion. i.e. Ax
Base class for Clp Cholesky factorization Will do better factorization.
CoinWorkDouble * zVec_
zVec
CoinWorkDouble actualPrimalStep_
actualPrimalStep
CoinWorkDouble * wVec_
wVec
double * deltay
Definition: ClpInterior.hpp:31
CoinWorkDouble delta() const
delta
CoinWorkDouble * dualR() const
Dual erturbation vector.
double z0min
Definition: ClpInterior.hpp:52
******** DATA to be moved into protected section of ClpInterior
Definition: ClpInterior.hpp:35
int algorithm() const
Current (or last) algorithm.
void clearFlagged(int sequence)
Raw objective value (so always minimize)
Sparse Matrix Base Class.
CoinWorkDouble * deltaZ_
deltaZ.
int pdco()
Pdco algorithm - see ClpPdco.hpp for method.
CoinWorkDouble diagonalNorm_
diagonalNorm.
CoinWorkDouble objectiveNorm_
objectiveNorm.
This solves LPs using interior point methods.
Definition: ClpInterior.hpp:72
double atolnew
Definition: ClpInterior.hpp:37
CoinWorkDouble mu_
Below here is standard barrier stuff mu.
int isColumn(int sequence) const
Returns 1 if sequence indicates column.
CoinWorkDouble * rhsC_
rhs C
CoinWorkDouble maximumRHSError_
maximumRHSError. maximum Ax
double * rowObjective() const
Row Objective.
Definition: ClpModel.hpp:741
CoinWorkDouble * diagonal_
diagonal
friend void ClpInteriorUnitTest(const std::string &mpsDir, const std::string &netlibDir)
A function that tests the methods in the ClpInterior class.
CoinWorkDouble * upper_
Working copy of upper bounds (Owner of arrays below)
CoinWorkDouble largestPrimalError() const
Largest error on Ax-b.
CoinWorkDouble * lowerSlack_
lowerSlack
void clearFixedOrFree(int sequence)
Raw objective value (so always minimize)
CoinWorkDouble gamma() const
gamma
ClpCholeskyBase * cholesky_
cholesky.
double CoinWorkDouble
Definition: CoinTypes.hpp:53
int numberComplementarityItems_
numberComplementarityItems_ i.e. number of active bounds
CoinWorkDouble diagonalScaleFactor_
diagonalScaleFactor.
void checkSolution()
Checks solution.
CoinWorkDouble sumPrimalInfeasibilities_
Sum of primal infeasibilities.
CoinWorkDouble * rhsFixRegion_
rhsFixRegion.
int maximumBarrierIterations() const
Maximum iterations.
int MaxIter
Definition: ClpInterior.hpp:47
CoinWorkDouble gamma_
Largest error on Ax-b.
CoinWorkDouble primalObjective_
primalObjective.
CoinWorkDouble * y_
Largest error on Ax-b.
int numberColumns() const
Number of rows.
Definition: ClpModel.hpp:328
void setFakeUpper(int sequence)
To say a variable has fake upper bound.
void ClpInteriorUnitTest(const std::string &mpsDir, const std::string &netlibDir)
A function that tests the methods in the ClpInterior class.
int itncg
Definition: ClpInterior.hpp:40
CoinWorkDouble rawObjectiveValue() const
Raw objective value (so always minimize)
void clearFakeUpper(int sequence)
Raw objective value (so always minimize)
CoinWorkDouble projectionTolerance_
projectionTolerance
void gutsOfCopy(const ClpInterior &rhs)
Does most of copying.
bool primalFeasible() const
If problem is primal feasible.
bool fakeLower(int sequence) const
Raw objective value (so always minimize)
double StepTol
Definition: ClpInterior.hpp:50
CoinWorkDouble * dualR_
Dual regularization array.
double objectiveValue_
Objective value.
Definition: ClpModel.hpp:1244
CoinWorkDouble dualObjective() const
dualObjective.
ClpPdcoBase * pdcoStuff_
Pointer to stuff.
void setDiagonalPerturbation(CoinWorkDouble value)
If problem is primal feasible.
CoinWorkDouble * deltaSU_
deltaS.
int LSQRMaxIter
Definition: ClpInterior.hpp:56
CoinWorkDouble complementarityGap_
complementarityGap.
CoinWorkDouble dualObjective_
dualObjective.
double LSdamp
Definition: ClpInterior.hpp:30
int istop
Definition: ClpInterior.hpp:39
void fixFixed(bool reallyFix=true)
fix variables interior says should be.
CoinWorkDouble rhsNorm_
rhsNorm.
Abstract base class for tailoring everything for Pcdo.
Definition: ClpPdcoBase.hpp:25
CoinWorkDouble projectionTolerance() const
projectionTolerance
CoinWorkDouble * solution_
solution
CoinWorkDouble solutionNorm_
solutionNorm.
bool fixedOrFree(int sequence) const
Raw objective value (so always minimize)
CoinWorkDouble * columnLowerWork_
Column lower bounds - working copy.
bool fakeUpper(int sequence) const
Raw objective value (so always minimize)
bool goneDualFeasible_
goneDualFeasible.
double atolold
Definition: ClpInterior.hpp:36
******** DATA to be moved into protected section of ClpInterior
Definition: ClpInterior.hpp:44
double atolmin
Definition: ClpInterior.hpp:28
ClpLsqr * lsqrObject_
Pointer to Lsqr object.
ClpInterior & operator=(const ClpInterior &rhs)
Assignment operator. This copies the data.
CoinWorkDouble baseObjectiveNorm_
baseObjectiveNorm
CoinWorkDouble diagonalNorm() const
diagonalNorm
void setProjectionTolerance(CoinWorkDouble value)
If problem is primal feasible.
Abstract base class for Clp Matrices.
CoinWorkDouble * dj_
Largest error on Ax-b.
bool gonePrimalFeasible_
gonePrimalFeasible.
CoinWorkDouble * primalR() const
Primal erturbation vector.
double delta
Definition: ClpInterior.hpp:46
#define LENGTH_HISTORY
historyInfeasibility.
double mu0
Definition: ClpInterior.hpp:53
CoinWorkDouble smallestInfeasibility_
smallestInfeasibility
int housekeeping()
This does housekeeping.
int numberComplementarityPairs_
numberComplementarityPairs i.e. ones with lower and/or upper bounds (not fixed)
CoinWorkDouble * primalR_
Primal regularization array.
void loadProblem(const ClpMatrixBase &matrix, const double *collb, const double *colub, const double *obj, const double *rowlb, const double *rowub, const double *rowObjective=NULL)
Loads a problem (the constraints on the rows are given by lower and upper bounds).
void setMaximumBarrierIterations(int value)
If problem is primal feasible.
~ClpInterior()
Destructor.
void setLowerBound(int sequence)
To say a variable has lower bound.
void setFixedOrFree(int sequence)
To say a variable is fixed OR free.
CoinWorkDouble xsize_
Largest error on Ax-b.
This class implements LSQR.
Definition: ClpLsqr.hpp:75
void clearFixed(int sequence)
Raw objective value (so always minimize)
CoinWorkDouble * lower_
Working copy of lower bounds (Owner of arrays below)
double gamma
Definition: ClpInterior.hpp:45
void setFlagged(int sequence)
To flag a variable.
void dropNames()
Drops names - makes lengthnames 0 and names empty.
CoinWorkDouble worstComplementarity_
Worst complementarity.
CoinWorkDouble * rowUpperWork_
Row upper bounds - working copy.
void deleteWorkingData()
Does most of deletion.
CoinWorkDouble * cost_
Working copy of objective.
CoinWorkDouble primalObjective() const
primalObjective.
int sequenceWithin(int sequence) const
Returns sequence number within section.
double LSQRatol2
Definition: ClpInterior.hpp:58
int readMps(const char *filename, bool keepNames=false, bool ignoreErrors=false)
Read an mps file from the given filename.
int LSproblem
Definition: ClpInterior.hpp:55
CoinWorkDouble * deltaSL_
Largest error on Ax-b.
CoinWorkDouble * columnUpperWork_
Column upper bounds - working copy.
int numberFixed() const
Return number fixed to see if worth presolving.
CoinWorkDouble * rhsL_
rhsL.
CoinWorkDouble linearPerturbation_
linearPerturbation
CoinWorkDouble maximumBoundInfeasibility_
maximumBoundInfeasibility.
CoinWorkDouble * deltaX_
delta X
CoinWorkDouble worstDirectionAccuracy_
worstDirectionAccuracy
CoinWorkDouble complementarityGap() const
ComplementarityGap.
CoinWorkDouble * x_
Largest error on Ax-b.
int algorithm_
Which algorithm being used.
CoinWorkDouble zsize_
Largest error on Ax-b.
CoinWorkDouble delta_
Largest error on Ax-b.
double FeaTol
Definition: ClpInterior.hpp:48
bool flagged(int sequence) const
Raw objective value (so always minimize)
void clearFakeLower(int sequence)
Raw objective value (so always minimize)
bool dualFeasible() const
If problem is dual feasible.
void setDelta(CoinWorkDouble value)
If problem is primal feasible.
void borrowModel(ClpModel &otherModel)
Borrow model.
double LSQRconlim
Definition: ClpInterior.hpp:59
CoinWorkDouble targetGap_
targetGap
double r3ratio
Definition: ClpInterior.hpp:38
double LSQRatol1
Definition: ClpInterior.hpp:57
int LSmethod
Definition: ClpInterior.hpp:54
CoinWorkDouble * deltaY_
delta Y
CoinWorkDouble sumDualInfeasibilities_
Sum of dual infeasibilities.
CoinWorkDouble linearPerturbation() const
linearPerturbation
CoinWorkDouble largestPrimalError_
Largest error on Ax-b.
void clearUpperBound(int sequence)
Raw objective value (so always minimize)
CoinWorkDouble maximumDualError_
maximumDualError.
double x0min
Definition: ClpInterior.hpp:51