Cbc  2.10.5
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CoinPackedVectorBase.hpp
Go to the documentation of this file.
1 /* $Id: CoinPackedVectorBase.hpp 2083 2019-01-06 19:38:09Z unxusr $ */
2 // Copyright (C) 2000, 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 #ifndef CoinPackedVectorBase_H
7 #define CoinPackedVectorBase_H
8 
9 #include <set>
10 #include <map>
11 #include "CoinPragma.hpp"
12 #include "CoinError.hpp"
13 
14 class CoinPackedVector;
15 
24 
25 public:
28  virtual int getNumElements() const = 0;
31  virtual const int *getIndices() const = 0;
33  virtual const double *getElements() const = 0;
35 
51  void setTestForDuplicateIndex(bool test) const;
60  void setTestForDuplicateIndexWhenTrue(bool test) const;
65  inline void setTestsOff() const
66  {
67  testForDuplicateIndex_ = false;
68  testedDuplicateIndex_ = false;
69  }
71 
79  double *denseVector(int denseSize) const;
87  double operator[](int i) const;
89 
92  int getMaxIndex() const;
95  int getMinIndex() const;
96 
98  void duplicateIndex(const char *methodName = NULL,
99  const char *className = NULL) const;
100 
103  bool isExistingIndex(int i) const;
104 
107  int findIndex(int i) const;
108 
110 
115  bool operator==(const CoinPackedVectorBase &rhs) const;
117  bool operator!=(const CoinPackedVectorBase &rhs) const;
118 
119 #if 0
120  // LL: This should be implemented eventually. It is useful to have.
124  int lexCompare(const CoinPackedVectorBase& rhs);
125 #endif
126 
133  int compare(const CoinPackedVectorBase &rhs) const;
134 
142  template < class FloatEqual >
143  bool
144  isEquivalent(const CoinPackedVectorBase &rhs, const FloatEqual &eq) const
145  {
146  if (getNumElements() != rhs.getNumElements())
147  return false;
148 
149  duplicateIndex("equivalent", "CoinPackedVector");
150  rhs.duplicateIndex("equivalent", "CoinPackedVector");
151 
152  std::map< int, double > mv;
153  const int *inds = getIndices();
154  const double *elems = getElements();
155  int i;
156  for (i = getNumElements() - 1; i >= 0; --i) {
157  mv.insert(std::make_pair(inds[i], elems[i]));
158  }
159 
160  std::map< int, double > mvRhs;
161  inds = rhs.getIndices();
162  elems = rhs.getElements();
163  for (i = getNumElements() - 1; i >= 0; --i) {
164  mvRhs.insert(std::make_pair(inds[i], elems[i]));
165  }
166 
167  std::map< int, double >::const_iterator mvI = mv.begin();
168  std::map< int, double >::const_iterator mvIlast = mv.end();
169  std::map< int, double >::const_iterator mvIrhs = mvRhs.begin();
170  while (mvI != mvIlast) {
171  if (mvI->first != mvIrhs->first || !eq(mvI->second, mvIrhs->second))
172  return false;
173  ++mvI;
174  ++mvIrhs;
175  }
176  return true;
177  }
178 
179  bool isEquivalent(const CoinPackedVectorBase &rhs) const;
181 
184  double dotProduct(const double *dense) const;
186 
188  double oneNorm() const;
189 
191  double normSquare() const;
192 
194  double twoNorm() const;
195 
197  double infNorm() const;
198 
200  double sum() const;
202 
203 protected:
210 
211 public:
213  virtual ~CoinPackedVectorBase();
215 
216 private:
230 
231 protected:
234  void findMaxMinIndices() const;
236 
238  std::set< int > *indexSet(const char *methodName = NULL,
239  const char *className = NULL) const;
240 
242  void clearIndexSet() const;
243  void clearBase() const;
245  {
246  maxIndex_ = x.maxIndex_;
247  minIndex_ = x.minIndex_;
248  }
250 
251 private:
254  mutable int maxIndex_;
257  mutable int minIndex_;
261  mutable std::set< int > *indexSetPtr_;
267  mutable bool testedDuplicateIndex_;
269 };
270 
271 #endif
272 
273 /* vi: softtabstop=2 shiftwidth=2 expandtab tabstop=2
274 */
int minIndex_
Contains minimum index value or infinity.
bool operator!=(const CoinPackedVectorBase &rhs) const
Not equal.
bool testForDuplicateIndex_
True if the vector should be tested for duplicate indices when they can occur.
void setTestForDuplicateIndex(bool test) const
Set to the argument value whether to test for duplicate indices in the vector whenever they can occur...
double operator[](int i) const
Access the i&#39;th element of the full storage vector.
double sum() const
Sum elements of vector.
void copyMaxMinIndex(const CoinPackedVectorBase &x) const
bool isExistingIndex(int i) const
Return true if the i&#39;th element of the full storage vector exists in the packed storage vector...
int getMinIndex() const
Get value of minimum index.
std::set< int > * indexSetPtr_
Store the indices in a set.
int maxIndex_
Contains max index value or -infinity.
double twoNorm() const
Return the 2-norm of the vector.
bool isEquivalent(const CoinPackedVectorBase &rhs, const FloatEqual &eq) const
equivalent - If shallow packed vector A &amp; B are equivalent, then they are still equivalent no matter ...
virtual ~CoinPackedVectorBase()
Destructor.
double oneNorm() const
Return the 1-norm of the vector.
Abstract base class for various sparse vectors.
virtual const double * getElements() const =0
Get element values.
CoinPackedVectorBase()
Default constructor.
void findMaxMinIndices() const
Find Maximum and Minimum Indices.
bool testForDuplicateIndex() const
Returns true if the vector should be tested for duplicate indices when they can occur.
void setTestForDuplicateIndexWhenTrue(bool test) const
Set to the argument value whether to test for duplicate indices in the vector whenever they can occur...
CoinPackedVectorBase & operator=(const CoinPackedVectorBase &)
This class provides const access to packed vectors, so there&#39;s no need to provide an assignment opera...
virtual int getNumElements() const =0
Get length of indices and elements vectors.
int compare(const CoinPackedVectorBase &rhs) const
This method establishes an ordering on packed vectors.
void clearBase() const
bool testedDuplicateIndex_
True if the vector has already been tested for duplicate indices.
bool operator==(const CoinPackedVectorBase &rhs) const
Equal.
void duplicateIndex(const char *methodName=NULL, const char *className=NULL) const
Throw an exception if there are duplicate indices.
virtual const int * getIndices() const =0
Get indices of elements.
int findIndex(int i) const
Return the position of the i&#39;th element of the full storage vector.
std::set< int > * indexSet(const char *methodName=NULL, const char *className=NULL) const
Return indexSetPtr_ (create it if necessary).
double dotProduct(const double *dense) const
Create the dot product with a full vector.
double * denseVector(int denseSize) const
Get the vector as a dense vector.
Sparse Vector.
int getMaxIndex() const
Get value of maximum index.
void clearIndexSet() const
Delete the indexSet.
void setTestsOff() const
Just sets test stuff false without a try etc.
double normSquare() const
Return the square of the 2-norm of the vector.
double infNorm() const
Return the infinity-norm of the vector.