Clp  1.17.6
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
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 */
CoinWorkDouble zsize_
int algorithm() const
Current (or last) algorithm.
bool goneDualFeasible_
goneDualFeasible.
void clearUpperBound(int sequence)
bool flagged(int sequence) const
CoinWorkDouble diagonalNorm_
diagonalNorm.
CoinWorkDouble maximumBoundInfeasibility_
maximumBoundInfeasibility.
friend void ClpInteriorUnitTest(const std::string &mpsDir, const std::string &netlibDir)
A function that tests the methods in the ClpInterior class.
CoinWorkDouble complementarityGap() const
ComplementarityGap.
double atolmin
Definition: ClpInterior.hpp:28
CoinWorkDouble gamma() const
gamma
CoinWorkDouble smallestInfeasibility_
smallestInfeasibility
int itncg
Definition: ClpInterior.hpp:40
void ClpInteriorUnitTest(const std::string &mpsDir, const std::string &netlibDir)
A function that tests the methods in the ClpInterior class.
void setDelta(CoinWorkDouble value)
CoinWorkDouble * columnLowerWork_
Column lower bounds - working copy.
CoinWorkDouble worstComplementarity_
Worst complementarity.
void setFixedOrFree(int sequence)
To say a variable is fixed OR free.
int numberComplementarityItems_
numberComplementarityItems_ i.e. number of active bounds
Abstract base class for Clp Matrices.
CoinWorkDouble * rhsL_
rhsL.
CoinWorkDouble * solution_
solution
This solves LPs using interior point methods.
Definition: ClpInterior.hpp:72
CoinWorkDouble rawObjectiveValue() const
Raw objective value (so always minimize)
void setUpperBound(int sequence)
To say a variable has upper bound.
CoinWorkDouble primalObjective() const
primalObjective.
CoinWorkDouble historyInfeasibility_[LENGTH_HISTORY]
CoinWorkDouble * lower_
Working copy of lower bounds (Owner of arrays below)
CoinWorkDouble solutionNorm_
solutionNorm.
bool fakeLower(int sequence) const
void deleteWorkingData()
This class implements LSQR.
Definition: ClpLsqr.hpp:75
double LSdamp
Definition: ClpInterior.hpp:30
CoinWorkDouble linearPerturbation() const
linearPerturbation
CoinWorkDouble * primalR() const
Primal erturbation vector.
CoinWorkDouble diagonalPerturbation_
diagonalPerturbation
double r3norm
Definition: ClpInterior.hpp:29
void clearFixedOrFree(int sequence)
CoinWorkDouble * deltaSU_
deltaS.
CoinWorkDouble sumPrimalInfeasibilities() const
Sum of primal infeasibilities.
bool lowerBound(int sequence) const
******** DATA to be moved into protected section of ClpInterior
Definition: ClpInterior.hpp:35
CoinWorkDouble * rhsC_
rhs C
CoinWorkDouble largestPrimalError() const
Largest error on Ax-b.
bool gonePrimalFeasible_
gonePrimalFeasible.
~ClpInterior()
Destructor.
double * deltay
Definition: ClpInterior.hpp:31
CoinWorkDouble targetGap_
targetGap
void setFixed(int sequence)
To say a variable is fixed.
CoinWorkDouble * errorRegion_
errorRegion. i.e. Ax
CoinWorkDouble objectiveNorm_
objectiveNorm.
CoinWorkDouble delta_
int algorithm_
Which algorithm being used.
bool fakeUpper(int sequence) const
CoinWorkDouble xsize_
CoinWorkDouble * deltaY_
delta Y
int maximumBarrierIterations_
Maximum iterations.
double LSQRconlim
Definition: ClpInterior.hpp:59
void setGamma(CoinWorkDouble value)
CoinWorkDouble * upperSlack_
upperSlack
int isColumn(int sequence) const
Returns 1 if sequence indicates column.
int numberColumns() const
Definition: ClpModel.hpp:332
void clearFakeUpper(int sequence)
Base class for Clp Cholesky factorization Will do better factorization.
CoinWorkDouble baseObjectiveNorm_
baseObjectiveNorm
double mu0
Definition: ClpInterior.hpp:53
CoinWorkDouble * rhsFixRegion_
rhsFixRegion.
void clearLowerBound(int sequence)
CoinWorkDouble * rhsZ_
rhsZ.
#define LENGTH_HISTORY
historyInfeasibility.
CoinWorkDouble delta() const
delta
void setFakeLower(int sequence)
To say a variable has fake lower bound.
void clearFixed(int sequence)
int LSQRMaxIter
Definition: ClpInterior.hpp:56
void setLinearPerturbation(CoinWorkDouble value)
******** DATA to be moved into protected section of ClpInterior
Definition: ClpInterior.hpp:27
CoinWorkDouble * rhsW_
rhsW.
CoinWorkDouble projectionTolerance_
projectionTolerance
CoinWorkDouble * zVec_
zVec
int numberComplementarityPairs_
numberComplementarityPairs i.e. ones with lower and/or upper bounds (not fixed)
int sequenceWithin(int sequence) const
Returns sequence number within section.
int primalDual()
Primal-Dual Predictor-Corrector barrier.
CoinWorkDouble * deltaSL_
CoinWorkDouble * workArray_
work array
CoinWorkDouble * x_
CoinWorkDouble sumPrimalInfeasibilities_
Sum of primal infeasibilities.
CoinWorkDouble diagonalNorm() const
diagonalNorm
void gutsOfCopy(const ClpInterior &rhs)
Does most of copying.
ClpInterior()
Default constructor.
double z0min
Definition: ClpInterior.hpp:52
CoinWorkDouble complementarityGap_
complementarityGap.
void setFakeUpper(int sequence)
To say a variable has fake upper bound.
int istop
Definition: ClpInterior.hpp:39
CoinWorkDouble maximumRHSError_
maximumRHSError. maximum Ax
CoinWorkDouble maximumDualError_
maximumDualError.
CoinWorkDouble * diagonal_
diagonal
double gamma
Definition: ClpInterior.hpp:45
CoinWorkDouble primalObjective_
primalObjective.
Abstract base class for tailoring everything for Pcdo.
Definition: ClpPdcoBase.hpp:25
CoinWorkDouble * dualR() const
Dual erturbation vector.
int numberColumns_
Number of columns.
Definition: ClpModel.hpp:1258
ClpInterior & operator=(const ClpInterior &rhs)
Assignment operator. This copies the data.
void setAlgorithm(int value)
Set algorithm.
void checkSolution()
Checks solution.
double LSQRatol2
Definition: ClpInterior.hpp:58
CoinWorkDouble * columnUpperWork_
Column upper bounds - working copy.
CoinWorkDouble quadraticDjs(CoinWorkDouble *djRegion, const CoinWorkDouble *solution, CoinWorkDouble scaleFactor)
Modifies djs to allow for quadratic.
double atolnew
Definition: ClpInterior.hpp:37
int readMps(const char *filename, bool keepNames=false, bool ignoreErrors=false)
Read an mps file from the given filename.
double * rowObjective() const
Row Objective.
Definition: ClpModel.hpp:745
CoinWorkDouble largestDualError() const
Largest error on basic duals.
CoinWorkDouble * upper_
Working copy of upper bounds (Owner of arrays below)
void setMaximumBarrierIterations(int value)
void setProjectionTolerance(CoinWorkDouble value)
CoinWorkDouble * rowUpperWork_
Row upper bounds - working copy.
CoinWorkDouble * deltaW_
deltaW.
double delta
Definition: ClpInterior.hpp:46
void clearFlagged(int sequence)
CoinWorkDouble actualPrimalStep_
actualPrimalStep
CoinWorkDouble sumDualInfeasibilities() const
Sum of dual infeasibilities.
ClpLsqr * lsqrObject_
Pointer to Lsqr object.
int pdco()
Pdco algorithm - see ClpPdco.hpp for method.
int MaxIter
Definition: ClpInterior.hpp:47
Sparse Matrix Base Class.
CoinWorkDouble * dualR_
Dual regularization array.
CoinWorkDouble dualObjective() const
dualObjective.
double r3ratio
Definition: ClpInterior.hpp:38
ClpPdcoBase * pdcoStuff_
Pointer to stuff.
bool dualFeasible() const
If problem is dual feasible.
CoinWorkDouble maximumRHSChange_
maximumRHSChange
CoinWorkDouble rhsNorm_
rhsNorm.
CoinWorkDouble sumDualInfeasibilities_
Sum of dual infeasibilities.
bool fixed(int sequence) const
bool fixedOrFree(int sequence) const
int numberRows() const
Number of rows.
Definition: ClpModel.hpp:319
void setLowerBound(int sequence)
To say a variable has lower bound.
int housekeeping()
This does housekeeping.
CoinWorkDouble * y_
bool upperBound(int sequence) const
CoinWorkDouble scaleFactor_
scaleFactor. For scaling objective
CoinWorkDouble * deltaX_
delta X
int CoinBigIndex
CoinWorkDouble stepLength_
stepLength
double StepTol
Definition: ClpInterior.hpp:50
double LSQRatol1
Definition: ClpInterior.hpp:57
bool sanityCheck()
Sanity check on input rim data.
double FeaTol
Definition: ClpInterior.hpp:48
CoinWorkDouble * lowerSlack_
lowerSlack
unsigned char * status_
Status (i.e.
Definition: ClpModel.hpp:1305
double x0min
Definition: ClpInterior.hpp:51
double atolold
Definition: ClpInterior.hpp:36
bool primalFeasible() const
If problem is primal feasible.
void fixFixed(bool reallyFix=true)
fix variables interior says should be.
CoinWorkDouble diagonalPerturbation() const
diagonalPerturbation
void setCholesky(ClpCholeskyBase *cholesky)
Set cholesky (and delete present one)
int LSmethod
Definition: ClpInterior.hpp:54
CoinWorkDouble * cost_
Working copy of objective.
CoinWorkDouble * wVec_
wVec
void returnModel(ClpModel &otherModel)
Return model - updates any scalars.
int maximumBarrierIterations() const
Maximum iterations.
CoinWorkDouble largestPrimalError_
Largest error on Ax-b.
int numberFixed() const
Return number fixed to see if worth presolving.
CoinWorkDouble * rhs_
Rhs.
bool createWorkingData()
Returns true if data looks okay, false if not.
double CoinWorkDouble
Definition: CoinTypes.hpp:53
CoinWorkDouble * rowLowerWork_
Row lower bounds - working copy.
CoinWorkDouble * dj_
CoinWorkDouble actualDualStep_
actualDualStep
CoinWorkDouble * rhsU_
rhsU.
void borrowModel(ClpModel &otherModel)
Borrow model.
CoinWorkDouble linearPerturbation_
linearPerturbation
CoinWorkDouble worstDirectionAccuracy_
worstDirectionAccuracy
ClpCholeskyBase * cholesky_
cholesky.
double OptTol
Definition: ClpInterior.hpp:49
CoinWorkDouble dualObjective_
dualObjective.
void dropNames()
Drops names - makes lengthnames 0 and names empty.
CoinWorkDouble * primalR_
Primal regularization array.
double objectiveValue_
Objective value.
Definition: ClpModel.hpp:1248
CoinWorkDouble projectionTolerance() const
projectionTolerance
CoinWorkDouble * rhsB_
rhs B
void setFlagged(int sequence)
To flag a variable.
CoinWorkDouble * deltaZ_
deltaZ.
CoinPackedMatrix * matrix() const
Matrix (if not ClpPackedmatrix be careful about memory leak.
Definition: ClpModel.hpp:772
CoinWorkDouble diagonalScaleFactor_
diagonalScaleFactor.
CoinWorkDouble gamma_
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).
******** DATA to be moved into protected section of ClpInterior
Definition: ClpInterior.hpp:44
int LSproblem
Definition: ClpInterior.hpp:55
CoinWorkDouble mu_
Below here is standard barrier stuff mu.
void gutsOfDelete()
Does most of deletion.
CoinWorkDouble largestDualError_
Largest error on basic duals.
void clearFakeLower(int sequence)
void setDiagonalPerturbation(CoinWorkDouble value)