AbcSimplexPrimal.hpp
Go to the documentation of this file.
1 /* $Id: AbcSimplexPrimal.hpp 1910 2013-01-27 02:00:13Z stefan $ */
2 // Copyright (C) 2002, International Business Machines
3 // Corporation and others, Copyright (C) 2012, FasterCoin. All Rights Reserved.
4 // This code is licensed under the terms of the Eclipse Public License (EPL).
5 /*
6  Authors
7 
8  John Forrest
9 
10  */
11 #ifndef AbcSimplexPrimal_H
12 #define AbcSimplexPrimal_H
13 
14 #include "AbcSimplex.hpp"
15 
23 class AbcSimplexPrimal : public AbcSimplex {
24 
25 public:
26 
115  int primal(int ifValuesPass = 0, int startFinishOptions = 0);
117 
120  void alwaysOptimal(bool onOff);
122  bool alwaysOptimal() const;
127  void exactOutgoing(bool onOff);
128  bool exactOutgoing() const;
130 
145  int whileIterating(int valuesOption);
146 
165  int pivotResult(int ifValuesPass = 0);
166  int pivotResult4(int ifValuesPass = 0);
167 
168 
174  double theta,
175  double & objectiveChange,
176  int valuesPass);
181  double theta,bool valuesPass);
184  void createUpdateDuals(CoinIndexedVector & rowArray,
185  const double * originalCost,
186  const double extraCost[4],
187  double & objectiveChange,
188  int valuesPass);
191  double updateMinorCandidate(const CoinIndexedVector & updateBy,
192  CoinIndexedVector & candidate,
193  int sequenceIn);
195  void updatePartialUpdate(CoinIndexedVector & partialUpdate);
197  int doFTUpdate(CoinIndexedVector * vector[4]);
206  void primalRow(CoinIndexedVector * rowArray,
207  CoinIndexedVector * rhsArray,
208  CoinIndexedVector * spareArray,
209  int valuesPass);
210  typedef struct {
211  double theta_;
212  double alpha_;
213  double saveDualIn_;
214  double dualIn_;
215  double lowerIn_;
216  double upperIn_;
217  double valueIn_;
220  double dualOut_;
221  double lowerOut_;
222  double upperOut_;
223  double valueOut_;
228  } pivotStruct;
229  void primalRow(CoinIndexedVector * rowArray,
230  CoinIndexedVector * rhsArray,
231  CoinIndexedVector * spareArray,
232  pivotStruct & stuff);
240  void primalColumn(CoinPartitionedVector * updateArray,
241  CoinPartitionedVector * spareRow2,
242  CoinPartitionedVector * spareColumn1);
243 
247  double changeCost);
257  void statusOfProblemInPrimal(int type);
259  void perturb(int type);
261  bool unPerturb();
263  int unflag();
269  int nextSuperBasic(int superBasicType, CoinIndexedVector * columnArray);
270 
272  void primalRay(CoinIndexedVector * rowArray);
274  void clearAll();
275 
277  int lexSolve();
278 
280 };
281 #endif
282 
void createUpdateDuals(CoinIndexedVector &rowArray, const double *originalCost, const double extraCost[4], double &objectiveChange, int valuesPass)
After rowArray will have cost changes for use next iteration.
void primalColumn(CoinPartitionedVector *updateArray, CoinPartitionedVector *spareRow2, CoinPartitionedVector *spareColumn1)
Chooses primal pivot column updateArray has cost updates (also use pivotRow_ from last iteration) Wou...
int doFTUpdate(CoinIndexedVector *vector[4])
Do FT update as separate function for minor iterations (nonzero return code on problems) ...
int unflag()
Unflag all variables and return number unflagged.
int primal(int ifValuesPass=0, int startFinishOptions=0)
Primal algorithm.
bool exactOutgoing() const
Do not change infeasibility cost and always say optimal.
void perturb(int type)
Perturbs problem (method depends on perturbation())
void updatePartialUpdate(CoinIndexedVector &partialUpdate)
Update partial Ftran by R update.
int lexSolve()
Sort of lexicographic resolve.
CoinIndexedVector * columnArray(int index) const
Useful column length arrays (0,1,2,3,4,5)
Definition: ClpSimplex.hpp:731
This solves LPs using the primal simplex method.
double theta() const
Theta (pivot change)
bool unPerturb()
Take off effect of perturbation and say whether to try dual.
Indexed Vector.
int pivotResult(int ifValuesPass=0)
Do last half of an iteration.
void statusOfProblemInPrimal(int type)
Refactorizes if necessary Checks if finished.
int nextSuperBasic(int superBasicType, CoinIndexedVector *columnArray)
Get next superbasic -1 if none, Normal type is 1 If type is 3 then initializes sorted list if 2 uses ...
double updateMinorCandidate(const CoinIndexedVector &updateBy, CoinIndexedVector &candidate, int sequenceIn)
Update minor candidate vector - new reduced cost returned later try and get change in reduced cost (t...
int checkUnbounded(CoinIndexedVector *ray, CoinIndexedVector *spare, double changeCost)
Checks if tentative optimal actually means unbounded in primal Returns -3 if not, 2 if is unbounded...
void clearAll()
Clears all bits and clears rowArray[1] etc.
CoinIndexedVector * rowArray(int index) const
Useful row length arrays (0,1,2,3,4,5)
Definition: ClpSimplex.hpp:727
int whileIterating(int valuesOption)
This has the flow between re-factorizations.
int updatePrimalsInPrimal(CoinIndexedVector *rowArray, double theta, double &objectiveChange, int valuesPass)
The primals are updated by the given array.
bool alwaysOptimal() const
Do not change infeasibility cost and always say optimal.
int pivotResult4(int ifValuesPass=0)
This has the flow between re-factorizations.
void primalRow(CoinIndexedVector *rowArray, CoinIndexedVector *rhsArray, CoinIndexedVector *spareArray, int valuesPass)
Row array has pivot column This chooses pivot row.
int sequenceIn() const
Return sequence In or Out.
Definition: AbcSimplex.hpp:596
void primalRay(CoinIndexedVector *rowArray)
Create primal ray.
double * ray() const
For advanced users - no need to delete - sign not changed.
Definition: ClpModel.hpp:772