summaryrefslogtreecommitdiff
path: root/build/Bonmin/include/coin/ClpMatrixBase.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'build/Bonmin/include/coin/ClpMatrixBase.hpp')
-rw-r--r--build/Bonmin/include/coin/ClpMatrixBase.hpp524
1 files changed, 0 insertions, 524 deletions
diff --git a/build/Bonmin/include/coin/ClpMatrixBase.hpp b/build/Bonmin/include/coin/ClpMatrixBase.hpp
deleted file mode 100644
index 06dc523..0000000
--- a/build/Bonmin/include/coin/ClpMatrixBase.hpp
+++ /dev/null
@@ -1,524 +0,0 @@
-/* $Id: ClpMatrixBase.hpp 2078 2015-01-05 12:39:49Z forrest $ */
-// Copyright (C) 2002, International Business Machines
-// Corporation and others. All Rights Reserved.
-// This code is licensed under the terms of the Eclipse Public License (EPL).
-
-#ifndef ClpMatrixBase_H
-#define ClpMatrixBase_H
-
-#include "CoinPragma.hpp"
-#include "CoinTypes.hpp"
-
-#include "CoinPackedMatrix.hpp"
-class CoinIndexedVector;
-class ClpSimplex;
-class ClpModel;
-// Compilers can produce better code if they know about __restrict
-#ifndef COIN_RESTRICT
-#ifdef COIN_USE_RESTRICT
-#define COIN_RESTRICT __restrict
-#else
-#define COIN_RESTRICT
-#endif
-#endif
-
-/** Abstract base class for Clp Matrices
-
-Since this class is abstract, no object of this type can be created.
-
-If a derived class provides all methods then all Clp algorithms
-should work. Some can be very inefficient e.g. getElements etc is
-only used for tightening bounds for dual and the copies are
-deleted. Many methods can just be dummy i.e. abort(); if not
-all features are being used. So if column generation was being done
-then it makes no sense to do steepest edge so there would be
-no point providing subsetTransposeTimes.
-*/
-
-class ClpMatrixBase {
-
-public:
- /**@name Virtual methods that the derived classes must provide */
- //@{
- /// Return a complete CoinPackedMatrix
- virtual CoinPackedMatrix * getPackedMatrix() const = 0;
- /** Whether the packed matrix is column major ordered or not. */
- virtual bool isColOrdered() const = 0;
- /** Number of entries in the packed matrix. */
- virtual CoinBigIndex getNumElements() const = 0;
- /** Number of columns. */
- virtual int getNumCols() const = 0;
- /** Number of rows. */
- virtual int getNumRows() const = 0;
-
- /** A vector containing the elements in the packed matrix. Note that there
- might be gaps in this list, entries that do not belong to any
- major-dimension vector. To get the actual elements one should look at
- this vector together with vectorStarts and vectorLengths. */
- virtual const double * getElements() const = 0;
- /** A vector containing the minor indices of the elements in the packed
- matrix. Note that there might be gaps in this list, entries that do not
- belong to any major-dimension vector. To get the actual elements one
- should look at this vector together with vectorStarts and
- vectorLengths. */
- virtual const int * getIndices() const = 0;
-
- virtual const CoinBigIndex * getVectorStarts() const = 0;
- /** The lengths of the major-dimension vectors. */
- virtual const int * getVectorLengths() const = 0 ;
- /** The length of a single major-dimension vector. */
- virtual int getVectorLength(int index) const ;
- /** Delete the columns whose indices are listed in <code>indDel</code>. */
- virtual void deleteCols(const int numDel, const int * indDel) = 0;
- /** Delete the rows whose indices are listed in <code>indDel</code>. */
- virtual void deleteRows(const int numDel, const int * indDel) = 0;
-#ifndef CLP_NO_VECTOR
- /// Append Columns
- virtual void appendCols(int number, const CoinPackedVectorBase * const * columns);
- /// Append Rows
- virtual void appendRows(int number, const CoinPackedVectorBase * const * rows);
-#endif
- /** Modify one element of packed matrix. An element may be added.
- This works for either ordering If the new element is zero it will be
- deleted unless keepZero true */
- virtual void modifyCoefficient(int row, int column, double newElement,
- bool keepZero = false);
- /** Append a set of rows/columns to the end of the matrix. Returns number of errors
- i.e. if any of the new rows/columns contain an index that's larger than the
- number of columns-1/rows-1 (if numberOther>0) or duplicates
- If 0 then rows, 1 if columns */
- virtual int appendMatrix(int number, int type,
- const CoinBigIndex * starts, const int * index,
- const double * element, int numberOther = -1);
-
- /** Returns a new matrix in reverse order without gaps
- Is allowed to return NULL if doesn't want to have row copy */
- virtual ClpMatrixBase * reverseOrderedCopy() const {
- return NULL;
- }
-
- /// Returns number of elements in column part of basis
- virtual CoinBigIndex countBasis(const int * whichColumn,
- int & numberColumnBasic) = 0;
- /// Fills in column part of basis
- virtual void fillBasis(ClpSimplex * model,
- const int * whichColumn,
- int & numberColumnBasic,
- int * row, int * start,
- int * rowCount, int * columnCount,
- CoinFactorizationDouble * element) = 0;
- /** Creates scales for column copy (rowCopy in model may be modified)
- default does not allow scaling
- returns non-zero if no scaling done */
- virtual int scale(ClpModel * , const ClpSimplex * = NULL) const {
- return 1;
- }
- /** Scales rowCopy if column copy scaled
- Only called if scales already exist */
- virtual void scaleRowCopy(ClpModel * ) const { }
- /// Returns true if can create row copy
- virtual bool canGetRowCopy() const {
- return true;
- }
- /** Realy really scales column copy
- Only called if scales already exist.
- Up to user to delete */
- inline virtual ClpMatrixBase * scaledColumnCopy(ClpModel * ) const {
- return this->clone();
- }
-
- /** Checks if all elements are in valid range. Can just
- return true if you are not paranoid. For Clp I will
- probably expect no zeros. Code can modify matrix to get rid of
- small elements.
- check bits (can be turned off to save time) :
- 1 - check if matrix has gaps
- 2 - check if zero elements
- 4 - check and compress duplicates
- 8 - report on large and small
- */
- virtual bool allElementsInRange(ClpModel * ,
- double , double ,
- int = 15) {
- return true;
- }
- /** Set the dimensions of the matrix. In effect, append new empty
- columns/rows to the matrix. A negative number for either dimension
- means that that dimension doesn't change. Otherwise the new dimensions
- MUST be at least as large as the current ones otherwise an exception
- is thrown. */
- virtual void setDimensions(int numrows, int numcols);
- /** Returns largest and smallest elements of both signs.
- Largest refers to largest absolute value.
- If returns zeros then can't tell anything */
- virtual void rangeOfElements(double & smallestNegative, double & largestNegative,
- double & smallestPositive, double & largestPositive);
-
- /** Unpacks a column into an CoinIndexedvector
- */
- virtual void unpack(const ClpSimplex * model, CoinIndexedVector * rowArray,
- int column) const = 0;
- /** Unpacks a column into an CoinIndexedvector
- ** in packed format
- Note that model is NOT const. Bounds and objective could
- be modified if doing column generation (just for this variable) */
- virtual void unpackPacked(ClpSimplex * model,
- CoinIndexedVector * rowArray,
- int column) const = 0;
- /** Purely for column generation and similar ideas. Allows
- matrix and any bounds or costs to be updated (sensibly).
- Returns non-zero if any changes.
- */
- virtual int refresh(ClpSimplex * ) {
- return 0;
- }
-
- // Really scale matrix
- virtual void reallyScale(const double * rowScale, const double * columnScale);
- /** Given positive integer weights for each row fills in sum of weights
- for each column (and slack).
- Returns weights vector
- Default returns vector of ones
- */
- virtual CoinBigIndex * dubiousWeights(const ClpSimplex * model, int * inputWeights) const;
- /** Adds multiple of a column into an CoinIndexedvector
- You can use quickAdd to add to vector */
- virtual void add(const ClpSimplex * model, CoinIndexedVector * rowArray,
- int column, double multiplier) const = 0;
- /** Adds multiple of a column into an array */
- virtual void add(const ClpSimplex * model, double * array,
- int column, double multiplier) const = 0;
- /// Allow any parts of a created CoinPackedMatrix to be deleted
- virtual void releasePackedMatrix() const = 0;
- /// Says whether it can do partial pricing
- virtual bool canDoPartialPricing() const;
- /// Returns number of hidden rows e.g. gub
- virtual int hiddenRows() const;
- /// Partial pricing
- virtual void partialPricing(ClpSimplex * model, double start, double end,
- int & bestSequence, int & numberWanted);
- /** expands an updated column to allow for extra rows which the main
- solver does not know about and returns number added.
-
- This will normally be a no-op - it is in for GUB but may get extended to
- general non-overlapping and embedded networks.
-
- mode 0 - extend
- mode 1 - delete etc
- */
- virtual int extendUpdated(ClpSimplex * model, CoinIndexedVector * update, int mode);
- /**
- utility primal function for dealing with dynamic constraints
- mode=0 - Set up before "update" and "times" for primal solution using extended rows
- mode=1 - Cleanup primal solution after "times" using extended rows.
- mode=2 - Check (or report on) primal infeasibilities
- */
- virtual void primalExpanded(ClpSimplex * model, int mode);
- /**
- utility dual function for dealing with dynamic constraints
- mode=0 - Set up before "updateTranspose" and "transposeTimes" for duals using extended
- updates array (and may use other if dual values pass)
- mode=1 - Update dual solution after "transposeTimes" using extended rows.
- mode=2 - Compute all djs and compute key dual infeasibilities
- mode=3 - Report on key dual infeasibilities
- mode=4 - Modify before updateTranspose in partial pricing
- */
- virtual void dualExpanded(ClpSimplex * model, CoinIndexedVector * array,
- double * other, int mode);
- /**
- general utility function for dealing with dynamic constraints
- mode=0 - Create list of non-key basics in pivotVariable_ using
- number as numberBasic in and out
- mode=1 - Set all key variables as basic
- mode=2 - return number extra rows needed, number gives maximum number basic
- mode=3 - before replaceColumn
- mode=4 - return 1 if can do primal, 2 if dual, 3 if both
- mode=5 - save any status stuff (when in good state)
- mode=6 - restore status stuff
- mode=7 - flag given variable (normally sequenceIn)
- mode=8 - unflag all variables
- mode=9 - synchronize costs and bounds
- mode=10 - return 1 if there may be changing bounds on variable (column generation)
- mode=11 - make sure set is clean (used when a variable rejected - but not flagged)
- mode=12 - after factorize but before permute stuff
- mode=13 - at end of simplex to delete stuff
-
- */
- virtual int generalExpanded(ClpSimplex * model, int mode, int & number);
- /**
- update information for a pivot (and effective rhs)
- */
- virtual int updatePivot(ClpSimplex * model, double oldInValue, double oldOutValue);
- /** Creates a variable. This is called after partial pricing and may modify matrix.
- May update bestSequence.
- */
- virtual void createVariable(ClpSimplex * model, int & bestSequence);
- /** Just for debug if odd type matrix.
- Returns number of primal infeasibilities. */
- virtual int checkFeasible(ClpSimplex * model, double & sum) const ;
- /// Returns reduced cost of a variable
- double reducedCost(ClpSimplex * model, int sequence) const;
- /// Correct sequence in and out to give true value (if both -1 maybe do whole matrix)
- virtual void correctSequence(const ClpSimplex * model, int & sequenceIn, int & sequenceOut) ;
- //@}
-
- //---------------------------------------------------------------------------
- /**@name Matrix times vector methods
- They can be faster if scalar is +- 1
- Also for simplex I am not using basic/non-basic split */
- //@{
- /** Return <code>y + A * x * scalar</code> in <code>y</code>.
- @pre <code>x</code> must be of size <code>numColumns()</code>
- @pre <code>y</code> must be of size <code>numRows()</code> */
- virtual void times(double scalar,
- const double * COIN_RESTRICT x, double * COIN_RESTRICT y) const = 0;
- /** And for scaling - default aborts for when scaling not supported
- (unless pointers NULL when as normal)
- */
- virtual void times(double scalar,
- const double * COIN_RESTRICT x, double * COIN_RESTRICT y,
- const double * COIN_RESTRICT rowScale,
- const double * COIN_RESTRICT columnScale) const;
- /** Return <code>y + x * scalar * A</code> in <code>y</code>.
- @pre <code>x</code> must be of size <code>numRows()</code>
- @pre <code>y</code> must be of size <code>numColumns()</code> */
- virtual void transposeTimes(double scalar,
- const double * COIN_RESTRICT x, double * COIN_RESTRICT y) const = 0;
- /** And for scaling - default aborts for when scaling not supported
- (unless pointers NULL when as normal)
- */
- virtual void transposeTimes(double scalar,
- const double * COIN_RESTRICT x, double * COIN_RESTRICT y,
- const double * COIN_RESTRICT rowScale,
- const double * COIN_RESTRICT columnScale,
- double * COIN_RESTRICT spare = NULL) const;
-#if COIN_LONG_WORK
- // For long double versions (aborts if not supported)
- virtual void times(CoinWorkDouble scalar,
- const CoinWorkDouble * COIN_RESTRICT x, CoinWorkDouble * COIN_RESTRICT y) const ;
- virtual void transposeTimes(CoinWorkDouble scalar,
- const CoinWorkDouble * COIN_RESTRICT x, CoinWorkDouble * COIN_RESTRICT y) const ;
-#endif
- /** Return <code>x * scalar *A + y</code> in <code>z</code>.
- Can use y as temporary array (will be empty at end)
- Note - If x packed mode - then z packed mode
- Squashes small elements and knows about ClpSimplex */
- virtual void transposeTimes(const ClpSimplex * model, double scalar,
- const CoinIndexedVector * x,
- CoinIndexedVector * y,
- CoinIndexedVector * z) const = 0;
- /** Return <code>x *A</code> in <code>z</code> but
- just for indices in y.
- This is only needed for primal steepest edge.
- Note - z always packed mode */
- virtual void subsetTransposeTimes(const ClpSimplex * model,
- const CoinIndexedVector * x,
- const CoinIndexedVector * y,
- CoinIndexedVector * z) const = 0;
- /** Returns true if can combine transposeTimes and subsetTransposeTimes
- and if it would be faster */
- virtual bool canCombine(const ClpSimplex * ,
- const CoinIndexedVector * ) const {
- return false;
- }
- /// Updates two arrays for steepest and does devex weights (need not be coded)
- virtual void transposeTimes2(const ClpSimplex * model,
- const CoinIndexedVector * pi1, CoinIndexedVector * dj1,
- const CoinIndexedVector * pi2,
- CoinIndexedVector * spare,
- double referenceIn, double devex,
- // Array for exact devex to say what is in reference framework
- unsigned int * reference,
- double * weights, double scaleFactor);
- /// Updates second array for steepest and does devex weights (need not be coded)
- virtual void subsetTimes2(const ClpSimplex * model,
- CoinIndexedVector * dj1,
- const CoinIndexedVector * pi2, CoinIndexedVector * dj2,
- double referenceIn, double devex,
- // Array for exact devex to say what is in reference framework
- unsigned int * reference,
- double * weights, double scaleFactor);
- /** Return <code>x *A</code> in <code>z</code> but
- just for number indices in y.
- Default cheats with fake CoinIndexedVector and
- then calls subsetTransposeTimes */
- virtual void listTransposeTimes(const ClpSimplex * model,
- double * x,
- int * y,
- int number,
- double * z) const;
- //@}
- //@{
- ///@name Other
- /// Clone
- virtual ClpMatrixBase * clone() const = 0;
- /** Subset clone (without gaps). Duplicates are allowed
- and order is as given.
- Derived classes need not provide this as it may not always make
- sense */
- virtual ClpMatrixBase * subsetClone (
- int numberRows, const int * whichRows,
- int numberColumns, const int * whichColumns) const;
- /// Gets rid of any mutable by products
- virtual void backToBasics() {}
- /** Returns type.
- The types which code may need to know about are:
- 1 - ClpPackedMatrix
- 11 - ClpNetworkMatrix
- 12 - ClpPlusMinusOneMatrix
- */
- inline int type() const {
- return type_;
- }
- /// Sets type
- void setType(int newtype) {
- type_ = newtype;
- }
- /// Sets up an effective RHS
- void useEffectiveRhs(ClpSimplex * model);
- /** Returns effective RHS offset if it is being used. This is used for long problems
- or big gub or anywhere where going through full columns is
- expensive. This may re-compute */
- virtual double * rhsOffset(ClpSimplex * model, bool forceRefresh = false,
- bool check = false);
- /// If rhsOffset used this is iteration last refreshed
- inline int lastRefresh() const {
- return lastRefresh_;
- }
- /// If rhsOffset used this is refresh frequency (0==off)
- inline int refreshFrequency() const {
- return refreshFrequency_;
- }
- inline void setRefreshFrequency(int value) {
- refreshFrequency_ = value;
- }
- /// whether to skip dual checks most of time
- inline bool skipDualCheck() const {
- return skipDualCheck_;
- }
- inline void setSkipDualCheck(bool yes) {
- skipDualCheck_ = yes;
- }
- /** Partial pricing tuning parameter - minimum number of "objects" to scan.
- e.g. number of Gub sets but could be number of variables */
- inline int minimumObjectsScan() const {
- return minimumObjectsScan_;
- }
- inline void setMinimumObjectsScan(int value) {
- minimumObjectsScan_ = value;
- }
- /// Partial pricing tuning parameter - minimum number of negative reduced costs to get
- inline int minimumGoodReducedCosts() const {
- return minimumGoodReducedCosts_;
- }
- inline void setMinimumGoodReducedCosts(int value) {
- minimumGoodReducedCosts_ = value;
- }
- /// Current start of search space in matrix (as fraction)
- inline double startFraction() const {
- return startFraction_;
- }
- inline void setStartFraction(double value) {
- startFraction_ = value;
- }
- /// Current end of search space in matrix (as fraction)
- inline double endFraction() const {
- return endFraction_;
- }
- inline void setEndFraction(double value) {
- endFraction_ = value;
- }
- /// Current best reduced cost
- inline double savedBestDj() const {
- return savedBestDj_;
- }
- inline void setSavedBestDj(double value) {
- savedBestDj_ = value;
- }
- /// Initial number of negative reduced costs wanted
- inline int originalWanted() const {
- return originalWanted_;
- }
- inline void setOriginalWanted(int value) {
- originalWanted_ = value;
- }
- /// Current number of negative reduced costs which we still need
- inline int currentWanted() const {
- return currentWanted_;
- }
- inline void setCurrentWanted(int value) {
- currentWanted_ = value;
- }
- /// Current best sequence
- inline int savedBestSequence() const {
- return savedBestSequence_;
- }
- inline void setSavedBestSequence(int value) {
- savedBestSequence_ = value;
- }
- //@}
-
-
-protected:
-
- /**@name Constructors, destructor<br>
- <strong>NOTE</strong>: All constructors are protected. There's no need
- to expose them, after all, this is an abstract class. */
- //@{
- /** Default constructor. */
- ClpMatrixBase();
- /** Destructor (has to be public) */
-public:
- virtual ~ClpMatrixBase();
-protected:
- // Copy
- ClpMatrixBase(const ClpMatrixBase&);
- // Assignment
- ClpMatrixBase& operator=(const ClpMatrixBase&);
- //@}
-
-
-protected:
- /**@name Data members
- The data members are protected to allow access for derived classes. */
- //@{
- /** Effective RHS offset if it is being used. This is used for long problems
- or big gub or anywhere where going through full columns is
- expensive */
- double * rhsOffset_;
- /// Current start of search space in matrix (as fraction)
- double startFraction_;
- /// Current end of search space in matrix (as fraction)
- double endFraction_;
- /// Best reduced cost so far
- double savedBestDj_;
- /// Initial number of negative reduced costs wanted
- int originalWanted_;
- /// Current number of negative reduced costs which we still need
- int currentWanted_;
- /// Saved best sequence in pricing
- int savedBestSequence_;
- /// type (may be useful)
- int type_;
- /// If rhsOffset used this is iteration last refreshed
- int lastRefresh_;
- /// If rhsOffset used this is refresh frequency (0==off)
- int refreshFrequency_;
- /// Partial pricing tuning parameter - minimum number of "objects" to scan
- int minimumObjectsScan_;
- /// Partial pricing tuning parameter - minimum number of negative reduced costs to get
- int minimumGoodReducedCosts_;
- /// True sequence in (i.e. from larger problem)
- int trueSequenceIn_;
- /// True sequence out (i.e. from larger problem)
- int trueSequenceOut_;
- /// whether to skip dual checks most of time
- bool skipDualCheck_;
- //@}
-};
-// bias for free variables
-#define FREE_BIAS 1.0e1
-// Acceptance criteria for free variables
-#define FREE_ACCEPT 1.0e2
-
-#endif