Clp 1.17.10
Loading...
Searching...
No Matches
AbcSimplexFactorization.hpp
Go to the documentation of this file.
1/* $Id$ */
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#ifndef AbcSimplexFactorization_H
7#define AbcSimplexFactorization_H
8
9#include "CoinPragma.hpp"
10
11#include "CoinAbcCommon.hpp"
13#include "AbcMatrix.hpp"
14//#include "CoinAbcAnyFactorization.hpp"
15#include "AbcSimplex.hpp"
16#ifndef ABC_USE_COIN_FACTORIZATION
18class CoinFactorization;
19#else
20#include "ClpFactorization.hpp"
21#include "CoinFactorization.hpp"
22#endif
27
28public:
31
40 int factorize(AbcSimplex *model, int solveType, bool valuesPass);
41#ifdef EARLY_FACTORIZE
43 inline int factorize(AbcSimplex *model, CoinIndexedVector &stuff)
44 {
45 return coinAbcFactorization_->factorize(model, stuff);
46 }
47#endif
49
52
57
60
61 AbcSimplexFactorization(const AbcSimplexFactorization &, int denseIfSmaller = 0);
66
67 /* **** below here is so can use networkish basis */
70
75 inline
76#ifdef ABC_LONG_FACTORIZATION
77 long
78#endif
79 double
80 checkReplacePart1(CoinIndexedVector *regionSparse,
81 int pivotRow)
82 {
83 return coinAbcFactorization_->checkReplacePart1(regionSparse, pivotRow);
84 }
85
89 inline
90#ifdef ABC_LONG_FACTORIZATION
91 long
92#endif
93 double
94 checkReplacePart1(CoinIndexedVector *regionSparse,
95 CoinIndexedVector *partialUpdate,
96 int pivotRow)
97 {
98 return coinAbcFactorization_->checkReplacePart1(regionSparse, partialUpdate, pivotRow);
99 }
100#ifdef MOVE_REPLACE_PART1A
105 inline void checkReplacePart1a(CoinIndexedVector *regionSparse,
106 int pivotRow)
107 {
108 coinAbcFactorization_->checkReplacePart1a(regionSparse, pivotRow);
109 }
110 inline double checkReplacePart1b(CoinIndexedVector *regionSparse,
111 int pivotRow)
112 {
113 return coinAbcFactorization_->checkReplacePart1b(regionSparse, pivotRow);
114 }
115#endif
118 inline int checkReplacePart2(int pivotRow,
119 double btranAlpha,
120 double ftranAlpha,
121#ifdef ABC_LONG_FACTORIZATION
122 long
123#endif
124 double ftAlpha)
125 {
126 return coinAbcFactorization_->checkReplacePart2(pivotRow, btranAlpha, ftranAlpha, ftAlpha);
127 }
128#ifdef ABC_LONG_FACTORIZATION
130 inline void clearHiddenArrays()
131 {
132 coinAbcFactorization_->clearHiddenArrays();
133 }
134#endif
138 CoinIndexedVector *regionSparse,
139 CoinIndexedVector *tableauColumn,
140 int pivotRow,
141#ifdef ABC_LONG_FACTORIZATION
142 long
143#endif
144 double alpha);
148 CoinIndexedVector *regionSparse,
149 CoinIndexedVector *tableauColumn,
150 CoinIndexedVector *partialUpdate,
151 int pivotRow,
152#ifdef ABC_LONG_FACTORIZATION
153 long
154#endif
155 double alpha);
156#ifdef EARLY_FACTORIZE
158 inline int replaceColumns(const AbcSimplex *model,
159 CoinIndexedVector &stuff,
160 int firstPivot, int lastPivot, bool cleanUp)
161 {
162 return coinAbcFactorization_->replaceColumns(model, stuff, firstPivot, lastPivot, cleanUp);
163 }
164#endif
166
170#if 0
175 int updateColumnFT ( CoinIndexedVector * regionSparse,
176 CoinIndexedVector * regionSparse2);
179 int updateColumn ( CoinIndexedVector * regionSparse,
180 CoinIndexedVector * regionSparse2) const;
186 int updateTwoColumnsFT ( CoinIndexedVector * regionSparse1,
187 CoinIndexedVector * regionSparse2,
188 CoinIndexedVector * regionSparse3) ;
191 int updateColumnTranspose ( CoinIndexedVector * regionSparse,
192 CoinIndexedVector * regionSparse2) const;
193#endif
197 inline int updateColumnFT(CoinIndexedVector &regionSparseFT)
198 {
199 return coinAbcFactorization_->updateColumnFT(regionSparseFT);
200 }
201 inline int updateColumnFTPart1(CoinIndexedVector &regionSparseFT)
202 {
203 return coinAbcFactorization_->updateColumnFTPart1(regionSparseFT);
204 }
205 inline void updateColumnFTPart2(CoinIndexedVector &regionSparseFT)
206 {
207 coinAbcFactorization_->updateColumnFTPart2(regionSparseFT);
208 }
209
212 inline void updateColumnFT(CoinIndexedVector &regionSparseFT,
213 CoinIndexedVector &partialUpdate,
214 int which)
215 {
216 coinAbcFactorization_->updateColumnFT(regionSparseFT, partialUpdate, which);
217 }
218
219 inline int updateColumn(CoinIndexedVector &regionSparse) const
220 {
221 return coinAbcFactorization_->updateColumn(regionSparse);
222 }
223
227 inline int updateTwoColumnsFT(CoinIndexedVector &regionSparseFT,
228 CoinIndexedVector &regionSparseOther)
229 {
230 return coinAbcFactorization_->updateTwoColumnsFT(regionSparseFT, regionSparseOther);
231 }
232
233 inline int updateColumnTranspose(CoinIndexedVector &regionSparse) const
234 {
235 return coinAbcFactorization_->updateColumnTranspose(regionSparse);
236 }
237
238 inline void updateColumnCpu(CoinIndexedVector &regionSparse, int whichCpu) const
239#ifndef ABC_USE_COIN_FACTORIZATION
240 {
241 coinAbcFactorization_->updateColumnCpu(regionSparse, whichCpu);
242 }
243#else
244 {
245 coinAbcFactorization_->updateColumn(regionSparse);
246 }
247#endif
249 inline void updateColumnTransposeCpu(CoinIndexedVector &regionSparse, int whichCpu) const
250#ifndef ABC_USE_COIN_FACTORIZATION
251 {
252 coinAbcFactorization_->updateColumnTransposeCpu(regionSparse, whichCpu);
253 }
254#else
255 {
257 }
258#endif
260 inline void updateFullColumn(CoinIndexedVector &regionSparse) const
261 {
262 coinAbcFactorization_->updateFullColumn(regionSparse);
263 }
264
265 inline void updateFullColumnTranspose(CoinIndexedVector &regionSparse) const
266 {
267 coinAbcFactorization_->updateFullColumnTranspose(regionSparse);
268 }
269
270 void updateWeights(CoinIndexedVector &regionSparse) const
271#ifndef ABC_USE_COIN_FACTORIZATION
272 {
273 coinAbcFactorization_->updateWeights(regionSparse);
274 }
275#else
276 {
277 coinAbcFactorization_->updateColumn(regionSparse);
278 }
279#endif
281
283
284 inline int numberElements() const
285 {
286 return coinAbcFactorization_->numberElements();
287 }
288
289 inline int maximumPivots() const
290 {
291 return coinAbcFactorization_->maximumPivots();
292 }
293
294 inline void maximumPivots(int value)
295 {
296 coinAbcFactorization_->maximumPivots(value);
297 }
298
299 inline bool usingFT() const
300 {
301 return !coinAbcFactorization_->wantsTableauColumn();
302 }
303
304 inline int pivots() const
305 {
306 return coinAbcFactorization_->pivots();
307 }
308
309 inline void setModel(AbcSimplex *model)
310 {
311 model_ = model;
312 }
313
314 inline void setPivots(int value) const
315 {
316 coinAbcFactorization_->setPivots(value);
317 }
318
319 inline double areaFactor() const
320 {
321 return coinAbcFactorization_->areaFactor();
322 }
323
324 inline void areaFactor(double value)
325 {
326 coinAbcFactorization_->areaFactor(value);
327 }
328
329 inline double zeroTolerance() const
330 {
331 return coinAbcFactorization_->zeroTolerance();
332 }
333
334 inline void zeroTolerance(double value)
335 {
336 coinAbcFactorization_->zeroTolerance(value);
337 }
338
341 inline int status() const
342 {
343 return coinAbcFactorization_->status();
344 }
345
346 inline void setStatus(int value)
347 {
348 coinAbcFactorization_->setStatus(value);
349 }
350#if ABC_PARALLEL == 2
352 inline void setParallelMode(int value)
353 {
354 coinAbcFactorization_->setParallelMode(value);
355 };
356#endif
358 inline int numberDense() const
359 {
360 return coinAbcFactorization_->numberDense();
361 }
362 bool timeToRefactorize() const;
363#if CLP_FACTORIZATION_NEW_TIMING > 1
364 void statsRefactor(char when) const;
365#endif
367 inline void clearArrays()
368 {
369 coinAbcFactorization_->clearArrays();
370 }
371
372 inline int numberRows() const
373 {
374 return coinAbcFactorization_->numberRows();
375 }
376
377 inline int numberSlacks() const
378 {
379 return numberSlacks_;
380 }
381
382 inline double pivotTolerance() const
383 {
384 return coinAbcFactorization_->pivotTolerance();
385 }
386
387 inline void pivotTolerance(double value)
388 {
389 coinAbcFactorization_->pivotTolerance(value);
390 }
391
392 inline double minimumPivotTolerance() const
393 {
394 return coinAbcFactorization_->minimumPivotTolerance();
395 }
396
397 inline void minimumPivotTolerance(double value)
398 {
399 coinAbcFactorization_->minimumPivotTolerance(value);
400 }
401
402 inline double *pivotRegion() const
403 {
404 return coinAbcFactorization_->pivotRegion();
405 }
406
407 //inline void relaxAccuracyCheck(double /*value*/) {
408 //abort();
409 //}
411 inline void almostDestructor()
412 {
413 coinAbcFactorization_->clearArrays();
414 }
415
416 void setDenseThreshold(int number);
417 int getDenseThreshold() const;
419 void forceOtherFactorization(int which);
423 inline int goDenseThreshold() const
424 {
425 return goDenseThreshold_;
426 }
427
428 inline void setGoDenseThreshold(int value)
429 {
430 goDenseThreshold_ = value;
431 }
432
433 inline int goSmallThreshold() const
434 {
435 return goSmallThreshold_;
436 }
437
438 inline void setGoSmallThreshold(int value)
439 {
440 goSmallThreshold_ = value;
441 }
442
443 inline int goLongThreshold() const
444 {
445 return goLongThreshold_;
446 }
447
448 inline void setGoLongThreshold(int value)
449 {
450 goLongThreshold_ = value;
451 }
452
453 inline int typeOfFactorization() const
454 {
455 return forceB_;
456 }
457
458 void synchronize(const ClpFactorization *otherFactorization, const AbcSimplex *model);
460
463
464 void goSparse();
465#ifndef NDEBUG
466#ifndef ABC_USE_COIN_FACTORIZATION
467 inline void checkMarkArrays() const
468 {
469 coinAbcFactorization_->checkMarkArrays();
470 }
471#else
472 inline void checkMarkArrays() const
473 {
474 }
475#endif
476#endif
478 inline bool needToReorder() const
479 {
480 abort();
481 return true;
482 }
483
484#ifndef ABC_USE_COIN_FACTORIZATION
489#else
490 CoinFactorization *factorization() const
491 {
493 }
494#endif
496
498private:
501
504#ifndef ABC_USE_COIN_FACTORIZATION
506#else
507 CoinFactorization *coinAbcFactorization_;
508#endif
509#ifdef CLP_FACTORIZATION_NEW_TIMING
511 mutable double shortestAverage_;
512 mutable double totalInR_;
513 mutable double totalInIncreasingU_;
514 mutable int endLengthU_;
515 mutable int lastNumberPivots_;
516 mutable int effectiveStartNumberU_;
517#endif
529};
530
531#endif
532
533/* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
534*/
#define AbcSimplex
int updateTwoColumnsFT(CoinIndexedVector &regionSparseFT, CoinIndexedVector &regionSparseOther)
Updates one column (FTRAN) from regionFT Tries to do FT update number returned is negative if no room...
AbcSimplexFactorization(const AbcSimplexFactorization &, int denseIfSmaller=0)
The copy constructor.
int factorize(AbcSimplex *model, int solveType, bool valuesPass)
When part of LP - given by basic variables.
void zeroTolerance(double value)
Set zero tolerance.
int goSmallThreshold_
Switch to small if number rows <= this.
int goDenseThreshold() const
Get switch to dense if number rows <= this.
void almostDestructor()
Allows change of pivot accuracy check 1.0 == none >1.0 relaxed.
void pivotTolerance(double value)
Set pivot tolerance.
int numberElements() const
Total number of elements in factorization.
bool needToReorder() const
Says whether to redo pivot order.
int goLongThreshold_
Switch to long/ordered if number rows >= this.
void updateFullColumn(CoinIndexedVector &regionSparse) const
Updates one full column (FTRAN)
AbcSimplex * model_
Pointer to model.
int numberSlacks() const
Number of slacks at last factorization.
double * pivotRegion() const
pivot region
int pivots() const
Returns number of pivots since factorization.
void updateColumnFT(CoinIndexedVector &regionSparseFT, CoinIndexedVector &partialUpdate, int which)
Updates one column (FTRAN) Tries to do FT update puts partial update in vector.
int typeOfFactorization() const
Returns type.
CoinAbcAnyFactorization * coinAbcFactorization_
Pointer to factorization.
double checkReplacePart1(CoinIndexedVector *regionSparse, CoinIndexedVector *partialUpdate, int pivotRow)
Checks if can replace one Column to basis, returns update alpha Fills in region for use later partial...
bool timeToRefactorize() const
void goSparse()
makes a row copy of L for speed and to allow very sparse problems
double minimumPivotTolerance() const
Minimum pivot tolerance.
void synchronize(const ClpFactorization *otherFactorization, const AbcSimplex *model)
Synchronize stuff.
int getDenseThreshold() const
int numberRows() const
Number of Rows after factorization.
void saferTolerances(double zeroTolerance, double pivotTolerance)
Set tolerances to safer of existing and given.
int updateColumnFTPart1(CoinIndexedVector &regionSparseFT)
CoinAbcAnyFactorization * factorization() const
Pointer to factorization.
void replaceColumnPart3(const AbcSimplex *model, CoinIndexedVector *regionSparse, CoinIndexedVector *tableauColumn, int pivotRow, double alpha)
Replaces one Column to basis, partial update already in U.
int goDenseThreshold_
Switch to dense if number rows <= this.
AbcSimplexFactorization(int numberRows=0)
Default constructor.
double pivotTolerance() const
Pivot tolerance.
void setDenseThreshold(int number)
So we can temporarily switch off dense.
void setPivots(int value) const
Sets number of pivots since factorization.
int maximumPivots() const
Maximum number of pivots between factorizations.
int forceB_
If nonzero force use of 1,dense 2,small 3,long.
void clearArrays()
Get rid of all memory.
void updateFullColumnTranspose(CoinIndexedVector &regionSparse) const
Updates one full column (BTRAN)
void setGoSmallThreshold(int value)
Set switch to small if number rows <= this.
int numberSlacks_
Number of slacks at last factorization.
void areaFactor(double value)
Set whether larger areas needed.
int updateColumnTranspose(CoinIndexedVector &regionSparse) const
Updates one column (BTRAN)
~AbcSimplexFactorization()
Destructor.
double areaFactor() const
Whether larger areas needed.
int updateColumnFT(CoinIndexedVector &regionSparseFT)
Updates one column (FTRAN) Tries to do FT update number returned is negative if no room.
int goSmallThreshold() const
Get switch to small if number rows <= this.
void updateColumnTransposeCpu(CoinIndexedVector &regionSparse, int whichCpu) const
Updates one column (BTRAN)
void goDenseOrSmall(int numberRows)
Go over to dense code.
void setGoLongThreshold(int value)
Set switch to long/ordered if number rows >= this.
void forceOtherFactorization(int which)
If nonzero force use of 1,dense 2,small 3,long.
double zeroTolerance() const
Zero tolerance.
void setGoDenseThreshold(int value)
Set switch to dense if number rows <= this.
AbcSimplexFactorization & operator=(const AbcSimplexFactorization &)
void setFactorization(AbcSimplexFactorization &rhs)
Sets factorization.
void replaceColumnPart3(const AbcSimplex *model, CoinIndexedVector *regionSparse, CoinIndexedVector *tableauColumn, CoinIndexedVector *partialUpdate, int pivotRow, double alpha)
Replaces one Column to basis, partial update in vector.
int goLongThreshold() const
Get switch to long/ordered if number rows >= this.
void setModel(AbcSimplex *model)
Sets model.
double checkReplacePart1(CoinIndexedVector *regionSparse, int pivotRow)
Checks if can replace one Column to basis, returns update alpha Fills in region for use later partial...
void setStatus(int value)
Sets status.
bool usingFT() const
Returns true if doing FT.
int status() const
Returns status.
void updateColumnCpu(CoinIndexedVector &regionSparse, int whichCpu) const
Updates one column (FTRAN)
void updateWeights(CoinIndexedVector &regionSparse) const
Updates one column for dual steepest edge weights (FTRAN)
void maximumPivots(int value)
Set maximum number of pivots between factorizations.
int numberDense() const
Returns number of dense rows.
void updateColumnFTPart2(CoinIndexedVector &regionSparseFT)
void minimumPivotTolerance(double value)
Set minimum pivot tolerance.
int updateColumn(CoinIndexedVector &regionSparse) const
Updates one column (FTRAN)
int checkReplacePart2(int pivotRow, double btranAlpha, double ftranAlpha, double ftAlpha)
Checks if can replace one Column to basis, returns 0=OK, 1=Probably OK, 2=singular,...
This just implements CoinFactorization when an ClpMatrixBase object is passed.
Abstract base class which also has some scalars so can be used from Dense or Simp.
virtual int updateColumn(CoinIndexedVector &regionSparse) const =0
This version has same effect as above with FTUpdate==false so number returned is always >=0.
virtual void checkReplacePart1a(CoinIndexedVector *, int)
virtual int updateColumnTranspose(CoinIndexedVector &regionSparse) const =0
Updates one column (BTRAN) from unpacked regionSparse.