// Copyright (C) 2003, International Business Machines // Corporation and others. All Rights Reserved. #ifndef ClpDummyMatrix_H #define ClpDummyMatrix_H #include "CoinPragma.hpp" #include "ClpMatrixBase.hpp" /** This implements a dummy matrix as derived from ClpMatrixBase. This is so you can do ClpPdco but may come in useful elsewhere. It just has dimensions but no data */ class ClpDummyMatrix : public ClpMatrixBase { public: /**@name Useful methods */ //@{ /// Return a complete CoinPackedMatrix virtual CoinPackedMatrix * getPackedMatrix() const; /** Whether the packed matrix is column major ordered or not. */ virtual bool isColOrdered() const { return true; } /** Number of entries in the packed matrix. */ virtual CoinBigIndex getNumElements() const { return numberElements_; } /** Number of columns. */ virtual int getNumCols() const { return numberColumns_; } /** Number of rows. */ virtual int getNumRows() const { return numberRows_; } /** 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; /** 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; virtual const CoinBigIndex * getVectorStarts() const; /** The lengths of the major-dimension vectors. */ virtual const int * getVectorLengths() const; /** Delete the columns whose indices are listed in indDel. */ virtual void deleteCols(const int numDel, const int * indDel); /** Delete the rows whose indices are listed in indDel. */ virtual void deleteRows(const int numDel, const int * indDel); /** Returns a new matrix in reverse order without gaps */ virtual ClpMatrixBase * reverseOrderedCopy() const; /// Returns number of elements in column part of basis virtual CoinBigIndex countBasis(ClpSimplex * model, const int * whichColumn, int numberRowBasic, int & numberColumnBasic); /// Fills in column part of basis virtual void fillBasis(ClpSimplex * model, const int * whichColumn, int & numberColumnBasic, int * row, int * start, int * rowCount, int * columnCount, double * element); /** Unpacks a column into an CoinIndexedvector */ virtual void unpack(const ClpSimplex * model,CoinIndexedVector * rowArray, int column) const ; /** Unpacks a column into an CoinIndexedvector ** in packed foramt 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; /** 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 ; /** Adds multiple of a column into an array */ virtual void add(const ClpSimplex * model,double * array, int column, double multiplier) const; /// Allow any parts of a created CoinMatrix to be deleted /// Allow any parts of a created CoinPackedMatrix to be deleted virtual void releasePackedMatrix() const {} //@} /**@name Matrix times vector methods */ //@{ /** Return y + A * scalar *x in y. @pre x must be of size numColumns() @pre y must be of size numRows() */ virtual void times(double scalar, const double * x, double * y) const; /// And for scaling virtual void times(double scalar, const double * x, double * y, const double * rowScale, const double * columnScale) const; /** Return y + x * scalar * A in y. @pre x must be of size numRows() @pre y must be of size numColumns() */ virtual void transposeTimes(double scalar, const double * x, double * y) const; /// And for scaling virtual void transposeTimes(double scalar, const double * x, double * y, const double * rowScale, const double * columnScale) const; using ClpMatrixBase::transposeTimes ; /** Return x * scalar * A + y in z. Can use y as temporary array (will be empty at end) Note - If x packed mode - then z packed mode */ virtual void transposeTimes(const ClpSimplex * model, double scalar, const CoinIndexedVector * x, CoinIndexedVector * y, CoinIndexedVector * z) const; /** Return x *A in z but just for indices in y. Note - If x packed mode - then z packed mode Squashes small elements and knows about ClpSimplex */ virtual void subsetTransposeTimes(const ClpSimplex * model, const CoinIndexedVector * x, const CoinIndexedVector * y, CoinIndexedVector * z) const; //@} /**@name Other */ //@{ //@} /**@name Constructors, destructor */ //@{ /** Default constructor. */ ClpDummyMatrix(); /// Constructor with data ClpDummyMatrix(int numberColumns, int numberRows, int numberElements); /** Destructor */ virtual ~ClpDummyMatrix(); //@} /**@name Copy method */ //@{ /** The copy constructor. */ ClpDummyMatrix(const ClpDummyMatrix&); /** The copy constructor from an CoinDummyMatrix. */ ClpDummyMatrix(const CoinPackedMatrix&); ClpDummyMatrix& operator=(const ClpDummyMatrix&); /// Clone virtual ClpMatrixBase * clone() const ; //@} protected: /**@name Data members The data members are protected to allow access for derived classes. */ //@{ /// Number of rows int numberRows_; /// Number of columns int numberColumns_; /// Number of elements int numberElements_; //@} }; #endif