#include <CoinPackedVector.hpp>
Inheritance diagram for CoinPackedVector:
Public Member Functions | |
Get methods. | |
virtual int | getNumElements () const |
Get the size. | |
virtual const int * | getIndices () const |
Get indices of elements. | |
virtual const double * | getElements () const |
Get element values. | |
int * | getIndices () |
Get indices of elements. | |
double * | getElements () |
Get element values. | |
const int * | getOriginalPosition () const |
Set methods | |
void | clear () |
Reset the vector (as if were just created an empty vector). | |
CoinPackedVector & | operator= (const CoinPackedVector &) |
CoinPackedVector & | operator= (const CoinPackedVectorBase &rhs) |
void | assignVector (int size, int *&inds, double *&elems, bool testForDuplicateIndex=true) |
void | setVector (int size, const int *inds, const double *elems, bool testForDuplicateIndex=true) throw (CoinError) |
void | setConstant (int size, const int *inds, double elems, bool testForDuplicateIndex=true) throw (CoinError) |
void | setFull (int size, const double *elems, bool testForDuplicateIndex=true) |
void | setFullNonZero (int size, const double *elems, bool testForDuplicateIndex=true) |
void | setElement (int index, double element) throw (CoinError) |
void | insert (int index, double element) throw (CoinError) |
Insert an element into the vector. | |
void | append (const CoinPackedVectorBase &caboose) throw (CoinError) |
Append a CoinPackedVector to the end. | |
void | swap (int i, int j) throw (CoinError) |
Swap values in positions i and j of indices and elements. | |
void | truncate (int newSize) throw (CoinError) |
Arithmetic operators. | |
void | operator+= (double value) |
add value to every entry | |
void | operator-= (double value) |
subtract value from every entry | |
void | operator *= (double value) |
multiply every entry by value | |
void | operator/= (double value) |
divide every entry by value | |
Sorting | |
template<class CoinCompare3> void | sort (const CoinCompare3 &tc) |
void | sortIncrIndex () |
void | sortDecrIndex () |
void | sortIncrElement () |
void | sortDecrElement () |
void | sortOriginalOrder () |
Memory usage | |
void | reserve (int n) |
int | capacity () const |
Constructors and destructors | |
CoinPackedVector (bool testForDuplicateIndex=true) | |
CoinPackedVector (int size, const int *inds, const double *elems, bool testForDuplicateIndex=true) | |
CoinPackedVector (int size, const int *inds, double element, bool testForDuplicateIndex=true) | |
CoinPackedVector (int size, const double *elements, bool testForDuplicateIndex=true) | |
CoinPackedVector (const CoinPackedVector &) | |
CoinPackedVector (const CoinPackedVectorBase &rhs) | |
virtual | ~CoinPackedVector () |
Private Member Functions | |
Private methods | |
void | gutsOfSetVector (int size, const int *inds, const double *elems, bool testForDuplicateIndex, const char *method) |
Copy internal date. | |
void | gutsOfSetConstant (int size, const int *inds, double value, bool testForDuplicateIndex, const char *method) |
Private Attributes | |
Private member data | |
int * | indices_ |
Vector indices. | |
double * | elements_ |
Vector elements. | |
int | nElements_ |
Size of indices and elements vectors. | |
int * | origIndices_ |
original unsorted indices | |
int | capacity_ |
Amount of memory allocated for indices_, origIndices_, and elements_. | |
Friends | |
void | CoinPackedVectorUnitTest () |
Stores vector of indices and associated element values. Supports sorting of vector while maintaining the original indices.
Here is a sample usage:
const int ne = 4; int inx[ne] = { 1, 4, 0, 2 }; double el[ne] = { 10., 40., 1., 50. }; // Create vector and set its value CoinPackedVector r(ne,inx,el); // access each index and element assert( r.indices ()[0]== 1 ); assert( r.elements()[0]==10. ); assert( r.indices ()[1]== 4 ); assert( r.elements()[1]==40. ); assert( r.indices ()[2]== 0 ); assert( r.elements()[2]== 1. ); assert( r.indices ()[3]== 2 ); assert( r.elements()[3]==50. ); // access original position of index assert( r.originalPosition()[0]==0 ); assert( r.originalPosition()[1]==1 ); assert( r.originalPosition()[2]==2 ); assert( r.originalPosition()[3]==3 ); // access as a full storage vector assert( r[ 0]==1. ); assert( r[ 1]==10.); assert( r[ 2]==50.); assert( r[ 3]==0. ); assert( r[ 4]==40.); // sort Elements in increasing order r.sortIncrElement(); // access each index and element assert( r.indices ()[0]== 0 ); assert( r.elements()[0]== 1. ); assert( r.indices ()[1]== 1 ); assert( r.elements()[1]==10. ); assert( r.indices ()[2]== 4 ); assert( r.elements()[2]==40. ); assert( r.indices ()[3]== 2 ); assert( r.elements()[3]==50. ); // access original position of index assert( r.originalPosition()[0]==2 ); assert( r.originalPosition()[1]==0 ); assert( r.originalPosition()[2]==1 ); assert( r.originalPosition()[3]==3 ); // access as a full storage vector assert( r[ 0]==1. ); assert( r[ 1]==10.); assert( r[ 2]==50.); assert( r[ 3]==0. ); assert( r[ 4]==40.); // Restore orignal sort order r.sortOriginalOrder(); assert( r.indices ()[0]== 1 ); assert( r.elements()[0]==10. ); assert( r.indices ()[1]== 4 ); assert( r.elements()[1]==40. ); assert( r.indices ()[2]== 0 ); assert( r.elements()[2]== 1. ); assert( r.indices ()[3]== 2 ); assert( r.elements()[3]==50. ); // Tests for equality and equivalence CoinPackedVector r1; r1=r; assert( r==r1 ); assert( r.equivalent(r1) ); r.sortIncrElement(); assert( r!=r1 ); assert( r.equivalent(r1) ); // Add packed vectors. // Similarly for subtraction, multiplication, // and division. CoinPackedVector add = r + r1; assert( add[0] == 1.+ 1. ); assert( add[1] == 10.+10. ); assert( add[2] == 50.+50. ); assert( add[3] == 0.+ 0. ); assert( add[4] == 40.+40. ); assert( r.sum() == 10.+40.+1.+50. );
Definition at line 113 of file CoinPackedVector.hpp.
|
Default constructor Definition at line 344 of file CoinPackedVector.cpp. References CoinPackedVectorBase::setTestForDuplicateIndex().
00344 : 00345 CoinPackedVectorBase(), 00346 indices_(NULL), 00347 elements_(NULL), 00348 nElements_(0), 00349 origIndices_(NULL), 00350 capacity_(0) 00351 { 00352 // This won't fail, the packed vector is empty. There can't be duplicate 00353 // indices. 00354 CoinPackedVectorBase::setTestForDuplicateIndex(testForDuplicateIndex); 00355 } |
|
Alternate Constructors - set elements to vector of doubles Definition at line 359 of file CoinPackedVector.cpp. References gutsOfSetVector().
00361 : 00362 CoinPackedVectorBase(), 00363 indices_(NULL), 00364 elements_(NULL), 00365 nElements_(0), 00366 origIndices_(NULL), 00367 capacity_(0) 00368 { 00369 gutsOfSetVector(size, inds, elems, testForDuplicateIndex, 00370 "constructor for array value"); 00371 } |
|
Alternate Constructors - set elements to same scalar value Definition at line 375 of file CoinPackedVector.cpp.
00377 : 00378 CoinPackedVectorBase(), 00379 indices_(NULL), 00380 elements_(NULL), 00381 nElements_(0), 00382 origIndices_(NULL), 00383 capacity_(0) 00384 { 00385 gutsOfSetConstant(size, inds, value, testForDuplicateIndex, 00386 "constructor for constant value"); 00387 } |
|
Alternate Constructors - construct full storage with indices 0 through size-1. Definition at line 391 of file CoinPackedVector.cpp. References setFull().
00392 : 00393 CoinPackedVectorBase(), 00394 indices_(NULL), 00395 elements_(NULL), 00396 nElements_(0), 00397 origIndices_(NULL), 00398 capacity_(0) 00399 { 00400 setFull(size, element, testForDuplicateIndex); 00401 } |
|
Copy constructor. Definition at line 419 of file CoinPackedVector.cpp. References gutsOfSetVector().
00419 : 00420 CoinPackedVectorBase(), 00421 indices_(NULL), 00422 elements_(NULL), 00423 nElements_(0), 00424 origIndices_(NULL), 00425 capacity_(0) 00426 { 00427 gutsOfSetVector(rhs.getNumElements(), rhs.getIndices(), rhs.getElements(), 00428 rhs.testForDuplicateIndex(), "copy constructor"); 00429 } |
|
Copy constructor from a PackedVectorBase. Definition at line 405 of file CoinPackedVector.cpp. References gutsOfSetVector().
00405 : 00406 CoinPackedVectorBase(), 00407 indices_(NULL), 00408 elements_(NULL), 00409 nElements_(0), 00410 origIndices_(NULL), 00411 capacity_(0) 00412 { 00413 gutsOfSetVector(rhs.getNumElements(), rhs.getIndices(), rhs.getElements(), 00414 rhs.testForDuplicateIndex(), "copy constructor from base"); 00415 } |
|
Destructor Definition at line 433 of file CoinPackedVector.cpp. References elements_, indices_, and origIndices_.
00434 { 00435 delete [] indices_; 00436 delete [] origIndices_; 00437 delete [] elements_; 00438 } |
|
Assign the ownership of the arguments to this vector. Size is the length of both the indices and elements vectors. The indices and elements vectors are copied into this class instance's member data. The last argument indicates whether this vector will have to be tested for duplicate indices. Definition at line 74 of file CoinPackedVector.cpp. References capacity_, clear(), elements_, indices_, nElements_, origIndices_, and CoinPackedVectorBase::setTestForDuplicateIndex().
00076 { 00077 clear(); 00078 // Allocate storage 00079 if ( size != 0 ) { 00080 //reserve(size); //This is a BUG!!! 00081 nElements_ = size; 00082 if (indices_ != NULL) delete[] indices_; 00083 indices_ = inds; inds = NULL; 00084 if (elements_ != NULL) delete[] elements_; 00085 elements_ = elems; elems = NULL; 00086 if (origIndices_ != NULL) delete[] origIndices_; 00087 origIndices_ = new int[size]; 00088 CoinIotaN(origIndices_, size, 0); 00089 capacity_ = size; 00090 } 00091 try { 00092 CoinPackedVectorBase::setTestForDuplicateIndex(testForDuplicateIndex); 00093 } 00094 catch (CoinError e) { 00095 throw CoinError("duplicate index", "assignVector", 00096 "CoinPackedVector"); 00097 } 00098 } |
|
capacity returns the size which could be accomodated without having to reallocate storage. Definition at line 261 of file CoinPackedVector.hpp. References capacity_.
00261 { return capacity_; } |
|
Get pointer to int * vector of original postions. If the packed vector has not been sorted then this function returns the vector: 0, 1, 2, ..., size()-1. Definition at line 132 of file CoinPackedVector.hpp. References origIndices_.
00132 { return origIndices_; } |
|
Assignment operator from a CoinPackedVectorBase. Reimplemented from CoinPackedVectorBase. Definition at line 39 of file CoinPackedVector.cpp. References clear(), CoinPackedVectorBase::getElements(), CoinPackedVectorBase::getIndices(), CoinPackedVectorBase::getNumElements(), gutsOfSetVector(), and CoinPackedVectorBase::testForDuplicateIndex().
00040 { 00041 if (this != &rhs) { 00042 clear(); 00043 gutsOfSetVector(rhs.getNumElements(), rhs.getIndices(), rhs.getElements(), 00044 CoinPackedVectorBase::testForDuplicateIndex(), 00045 "operator= from base"); 00046 } 00047 return *this; 00048 } |
|
Assignment operator. Definition at line 25 of file CoinPackedVector.cpp. References clear(), getElements(), getIndices(), getNumElements(), gutsOfSetVector(), and CoinPackedVectorBase::testForDuplicateIndex().
00026 { 00027 if (this != &rhs) { 00028 clear(); 00029 gutsOfSetVector(rhs.getNumElements(), rhs.getIndices(), rhs.getElements(), 00030 CoinPackedVectorBase::testForDuplicateIndex(), 00031 "operator="); 00032 } 00033 return *this; 00034 } |
|
Reserve space. If one knows the eventual size of the packed vector, then it may be more efficient to reserve the space. Definition at line 312 of file CoinPackedVector.cpp. References capacity_, elements_, indices_, nElements_, and origIndices_. Referenced by gutsOfSetVector(), setFull(), and setFullNonZero().
00313 { 00314 // don't make allocated space smaller 00315 if ( n <= capacity_ ) 00316 return; 00317 capacity_ = n; 00318 00319 // save pointers to existing data 00320 int * tempIndices = indices_; 00321 int * tempOrigIndices = origIndices_; 00322 double * tempElements = elements_; 00323 00324 // allocate new space 00325 indices_ = new int [capacity_]; 00326 origIndices_ = new int [capacity_]; 00327 elements_ = new double [capacity_]; 00328 00329 // copy data to new space 00330 if (nElements_ > 0) { 00331 CoinDisjointCopyN(tempIndices, nElements_, indices_); 00332 CoinDisjointCopyN(tempOrigIndices, nElements_, origIndices_); 00333 CoinDisjointCopyN(tempElements, nElements_, elements_); 00334 } 00335 00336 // free old data 00337 delete [] tempElements; 00338 delete [] tempOrigIndices; 00339 delete [] tempIndices; 00340 } |
|
Elements set to have the same scalar value Definition at line 115 of file CoinPackedVector.cpp.
00118 { 00119 clear(); 00120 gutsOfSetConstant(size, inds, value, testForDuplicateIndex, "setConstant"); 00121 } |
|
Set an existing element in the packed vector The first argument is the "index" into the elements() array Definition at line 176 of file CoinPackedVector.cpp.
00177 { 00178 if ( index >= nElements_ ) 00179 throw CoinError("index >= size()", "setElement", "CoinPackedVector"); 00180 if ( index < 0 ) 00181 throw CoinError("index < 0" , "setElement", "CoinPackedVector"); 00182 elements_[index] = element; 00183 } |
|
Indices are not specified and are taken to be 0,1,...,size-1 Definition at line 126 of file CoinPackedVector.cpp. References clear(), elements_, indices_, nElements_, origIndices_, reserve(), and CoinPackedVectorBase::setTestForDuplicateIndex(). Referenced by CoinPackedVector().
00128 { 00129 // Clear out any values presently stored 00130 clear(); 00131 00132 // Allocate storage 00133 if ( size!=0 ) { 00134 reserve(size); 00135 nElements_ = size; 00136 00137 CoinIotaN(origIndices_, size, 0); 00138 CoinIotaN(indices_, size, 0); 00139 CoinDisjointCopyN(elems, size, elements_); 00140 } 00141 CoinPackedVectorBase::setTestForDuplicateIndex(testForDuplicateIndex); 00142 } |
|
Indices are not specified and are taken to be 0,1,...,size-1, but only where non zero Definition at line 149 of file CoinPackedVector.cpp. References clear(), elements_, indices_, nElements_, origIndices_, reserve(), and CoinPackedVectorBase::setTestForDuplicateIndex().
00151 { 00152 // Clear out any values presently stored 00153 clear(); 00154 00155 // For now waste space 00156 // Allocate storage 00157 if ( size!=0 ) { 00158 reserve(size); 00159 nElements_ = 0; 00160 int i; 00161 for (i=0;i<size;i++) { 00162 if (elems[i]) { 00163 origIndices_[nElements_]= i; 00164 indices_[nElements_]= i; 00165 elements_[nElements_++] = elems[i]; 00166 } 00167 } 00168 } 00169 CoinPackedVectorBase::setTestForDuplicateIndex(testForDuplicateIndex); 00170 } |
|
Set vector size, indices, and elements. Size is the length of both the indices and elements vectors. The indices and elements vectors are copied into this class instance's member data. The last argument specifies whether this vector will have to be checked for duplicate indices whenever that can happen. Definition at line 104 of file CoinPackedVector.cpp.
00107 { 00108 clear(); 00109 gutsOfSetVector(size, inds, elems, testForDuplicateIndex, "setVector"); 00110 } |
|
Sort the packed storage vector. Typcical usages:
|
|
Sort in original order. If the vector has been sorted, then this method restores to its orignal sort order. Definition at line 305 of file CoinPackedVector.cpp. References elements_, indices_, nElements_, and origIndices_.
00305 { 00306 CoinSort_3(origIndices_, origIndices_ + nElements_, indices_, elements_); 00307 } |
|
Resize the packed vector to be the first newSize elements. Problem with truncate: what happens with origIndices_ ??? Definition at line 256 of file CoinPackedVector.cpp.
00257 { 00258 if ( n > nElements_ ) 00259 throw CoinError("n > size()","truncate","CoinPackedVector"); 00260 if ( n < 0 ) 00261 throw CoinError("n < 0","truncate","CoinPackedVector"); 00262 nElements_ = n; 00263 clearBase(); 00264 } |
|
A function that tests the methods in the CoinPackedVector class. The only reason for it not to be a member method is that this way it doesn't have to be compiled into the library. And that's a gain, because the library should be compiled with optimization on, but this method should be compiled with debugging. Definition at line 19 of file CoinPackedVectorTest.cpp.
00020 { 00021 00022 int i; 00023 // Test default constructor 00024 { 00025 CoinPackedVector r; 00026 assert( r.indices_==NULL ); 00027 assert( r.origIndices_==NULL ); 00028 assert( r.elements_==NULL ); 00029 assert( r.getNumElements()==0 ); 00030 assert( r.capacity_==0); 00031 } 00032 00033 // Test set and get methods 00034 const int ne = 4; 00035 int inx[ne] = { 1, 3, 4, 7 }; 00036 double el[ne] = { 1.2, 3.4, 5.6, 7.8 }; 00037 { 00038 CoinPackedVector r; 00039 assert( r.getNumElements()==0 ); 00040 00041 // Test setting/getting elements with int* & float* vectors 00042 r.setVector( ne, inx, el ); 00043 assert( r.getNumElements()==ne ); 00044 for ( i=0; i<ne; i++ ) { 00045 assert( r.getIndices()[i] == inx[i] ); 00046 assert( r.getOriginalPosition()[i] == i ); 00047 assert( r.getElements()[i] == el[i] ); 00048 } 00049 assert ( r.getMaxIndex()==7 ); 00050 assert ( r.getMinIndex()==1 ); 00051 00052 // Test setting/getting elements with indices out of order 00053 const int ne2 = 5; 00054 int inx2[ne2] = { 2, 4, 8, 14, 3 }; 00055 double el2[ne2] = { 2.2, 4.4, 6.6, 8.8, 3.3 }; 00056 00057 r.setVector(ne2,inx2,el2); 00058 00059 assert( r.getNumElements()==ne2 ); 00060 00061 assert( r.getIndices()[0]==inx2[0] ); 00062 assert( r.getOriginalPosition()[0]==0 ); 00063 assert( r.getElements()[0]==el2[0] ); 00064 00065 assert( r.getIndices()[1]==inx2[1] ); 00066 assert( r.getOriginalPosition()[1]==1 ); 00067 assert( r.getElements()[1]==el2[1] ); 00068 00069 assert( r.getIndices()[2]==inx2[2] ); 00070 assert( r.getOriginalPosition()[2]==2 ); 00071 assert( r.getElements()[2]==el2[2] ); 00072 00073 assert( r.getIndices()[3]==inx2[3] ); 00074 assert( r.getOriginalPosition()[3]==3 ); 00075 assert( r.getElements()[3]==el2[3] ); 00076 00077 assert( r.getIndices()[4]==inx2[4] ); 00078 assert( r.getOriginalPosition()[4]==4 ); 00079 assert( r.getElements()[4]==el2[4] ); 00080 00081 assert ( r.getMaxIndex()==14 ); 00082 assert ( r.getMinIndex()==2 ); 00083 assert ( r.getMaxIndex()==14 ); 00084 assert ( r.getMinIndex()==2 ); 00085 { 00086 bool errorThrown = false; 00087 try { 00088 r.duplicateIndex(); 00089 } 00090 catch (CoinError e) { 00091 errorThrown = true; 00092 } 00093 assert( !errorThrown ); 00094 } 00095 00096 CoinPackedVector r1(ne2,inx2,el2); 00097 assert( r == r1 ); 00098 00099 // Test operator[] where index is duplicated 00100 // Causes exception to be thrown 00101 { 00102 const int ne3 = 4; 00103 int inx3[ne3] = { 2, 4, 2, 3 }; 00104 double el3[ne3] = { 2.2, 4.4, 8.8, 6.6 }; 00105 bool errorThrown = false; 00106 try { 00107 r.setVector(ne3,inx3,el3); 00108 } 00109 catch (CoinError e) { 00110 errorThrown = true; 00111 } 00112 assert( errorThrown ); 00113 00114 errorThrown = false; 00115 try { 00116 r.duplicateIndex(); 00117 } 00118 catch (CoinError e) { 00119 errorThrown = true; 00120 } 00121 assert( errorThrown ); 00122 } 00123 00124 00125 00126 // Test sorting by increasing elements 00127 r.setVector(ne2,inx2,el2); 00128 bool incr=true; 00129 for ( i=1; i<ne2; i++ ) 00130 if ( r.getElements()[i-1]>r.getElements()[i] ) 00131 incr=false; 00132 assert( !incr ); 00133 r.sortIncrElement(); 00134 incr = true; 00135 for ( i=1; i<ne2; i++ ) 00136 if ( r.getElements()[i-1]>r.getElements()[i] ) 00137 incr=false; 00138 assert( incr ); 00139 00140 } 00141 00142 00143 { 00144 CoinPackedVector r; 00145 const int ne = 3; 00146 int inx[ne] = { 1, 2, 3 }; 00147 double el[ne] = { 2.2, 4.4, 8.8}; 00148 r.setVector(ne,inx,el); 00149 int c = r.capacity(); 00150 int max = r.getMaxIndex(); 00151 int min = r.getMinIndex(); 00152 // Test swap function 00153 r.swap(0,2); 00154 assert( r.getIndices()[0]==3 ); 00155 assert( r.getIndices()[1]==2 ); 00156 assert( r.getIndices()[2]==1 ); 00157 assert( r.getElements()[0]==8.8 ); 00158 assert( r.getElements()[1]==4.4 ); 00159 assert( r.getElements()[2]==2.2 ); 00160 assert( r.getMaxIndex() == max ); 00161 assert( r.getMinIndex() == min ); 00162 assert( r.capacity() == c ); 00163 00164 // Test the append function 00165 CoinPackedVector s; 00166 const int nes = 4; 00167 int inxs[nes] = { 11, 12, 13, 14 }; 00168 double els[nes] = { .122, 14.4, 18.8, 19.9}; 00169 s.setVector(nes,inxs,els); 00170 r.append(s); 00171 assert( r.getNumElements()==7 ); 00172 assert( r.getIndices()[0]==3 ); 00173 assert( r.getIndices()[1]==2 ); 00174 assert( r.getIndices()[2]==1 ); 00175 assert( r.getIndices()[3]==11 ); 00176 assert( r.getIndices()[4]==12 ); 00177 assert( r.getIndices()[5]==13 ); 00178 assert( r.getIndices()[6]==14 ); 00179 assert( r.getElements()[0]==8.8 ); 00180 assert( r.getElements()[1]==4.4 ); 00181 assert( r.getElements()[2]==2.2 ); 00182 assert( r.getElements()[3]==.122 ); 00183 assert( r.getElements()[4]==14.4 ); 00184 assert( r.getElements()[5]==18.8 ); 00185 assert( r.getElements()[6]==19.9 ); 00186 assert( r.getMaxIndex() == 14 ); 00187 assert( r.getMinIndex() == 1 ); 00188 00189 // Test the resize function 00190 c = r.capacity(); 00191 r.truncate(4); 00192 assert( r.getNumElements()==4 ); 00193 assert( r.getIndices()[0]==3 ); 00194 assert( r.getIndices()[1]==2 ); 00195 assert( r.getIndices()[2]==1 ); 00196 assert( r.getIndices()[3]==11 ); 00197 assert( r.getElements()[0]==8.8 ); 00198 assert( r.getElements()[1]==4.4 ); 00199 assert( r.getElements()[2]==2.2 ); 00200 assert( r.getElements()[3]==.122 ); 00201 assert( r.getMaxIndex() == 11 ); 00202 assert( r.getMinIndex() == 1 ); 00203 assert( r.capacity() == c ); 00204 } 00205 00206 00207 // Test copy constructor and assignment operator 00208 { 00209 CoinPackedVector rhs; 00210 { 00211 CoinPackedVector r; 00212 { 00213 CoinPackedVector rC1(r); 00214 assert( 0==r.getNumElements() ); 00215 assert( 0==rC1.getNumElements() ); 00216 00217 00218 r.setVector( ne, inx, el ); 00219 00220 assert( ne==r.getNumElements() ); 00221 assert( 0==rC1.getNumElements() ); 00222 } 00223 00224 CoinPackedVector rC2(r); 00225 00226 assert( ne==r.getNumElements() ); 00227 assert( ne==rC2.getNumElements() ); 00228 00229 for ( i=0; i<ne; i++ ) { 00230 assert( r.getIndices()[i] == rC2.getIndices()[i] ); 00231 assert( r.getOriginalPosition()[i] == rC2.getOriginalPosition()[i] ); 00232 assert( r.getElements()[i] == rC2.getElements()[i] ); 00233 } 00234 00235 rhs=rC2; 00236 } 00237 // Test that rhs has correct values even though lhs has gone out of scope 00238 assert( rhs.getNumElements()==ne ); 00239 00240 for ( i=0; i<ne; i++ ) { 00241 assert( inx[i] == rhs.getIndices()[i] ); 00242 assert( i == rhs.getOriginalPosition()[i] ); 00243 assert( el[i] == rhs.getElements()[i] ); 00244 } 00245 } 00246 00247 // Test operator== 00248 { 00249 CoinPackedVector v1,v2; 00250 assert( v1==v2 ); 00251 assert( v2==v1 ); 00252 assert( v1==v1 ); 00253 assert( !(v1!=v2) ); 00254 assert( v1.isEquivalent(v2) ); 00255 assert( v2.isEquivalent(v1) ); 00256 assert( v1.isEquivalent(v1) ); 00257 00258 v1.setVector( ne, inx, el ); 00259 assert ( !(v1==v2) ); 00260 assert ( v1!=v2 ); 00261 assert( !v1.isEquivalent(v2) ); 00262 00263 CoinPackedVector v3(v1); 00264 assert( v3==v1 ); 00265 assert( v3!=v2 ); 00266 assert( v1.isEquivalent(v3) ); 00267 assert( v3.isEquivalent(v1) ); 00268 00269 CoinPackedVector v4(v2); 00270 assert( v4!=v1 ); 00271 assert( v4==v2 ); 00272 } 00273 00274 { 00275 // Test sorting of packed vectors 00276 const int ne = 4; 00277 int inx[ne] = { 1, 4, 0, 2 }; 00278 double el[ne] = { 10., 40., 1., 20. }; 00279 double extSortKey[5] = { -20., 10., 5., 4., 20. }; 00280 CoinPackedVector r; 00281 r.setVector(ne,inx,el); 00282 00283 // Test that indices are in increasing order 00284 r.sortIncrIndex(); 00285 for ( i=1; i<ne; i++ ) assert( r.getIndices()[i-1] < r.getIndices()[i] ); 00286 00287 // Sort by element values; 00288 r.sortIncrElement(); 00289 for ( i=1; i<ne; i++ ) assert( r.getElements()[i-1] < r.getElements()[i] ); 00290 00291 // Sort using indices into an external sort vector 00292 CoinIncrSolutionOrdered pcSo(extSortKey); 00293 r.sort(pcSo); 00294 for ( i=1; i<ne; i++ ) 00295 assert( extSortKey[r.getIndices()[i-1]] < extSortKey[r.getIndices()[i]] ); 00296 00297 00298 // Now sort by indices. 00299 r.sortIncrIndex(); 00300 for ( i=1; i<ne; i++ ) assert( r.getIndices()[i-1] < r.getIndices()[i] ); 00301 } 00302 00303 00304 { 00305 // Test operator[] and indexExists() 00306 const int ne = 4; 00307 int inx[ne] = { 1, 4, 0, 2 }; 00308 double el[ne] = { 10., 40., 1., 50. }; 00309 CoinPackedVector r; 00310 assert( r[1]==0. ); 00311 00312 r.setVector(ne,inx,el); 00313 00314 assert( r[-1]==0. ); 00315 assert( r[ 0]==1. ); 00316 assert( r[ 1]==10.); 00317 assert( r[ 2]==50.); 00318 assert( r[ 3]==0. ); 00319 assert( r[ 4]==40.); 00320 assert( r[ 5]==0. ); 00321 assert( r.isExistingIndex(2) ); 00322 assert( !r.isExistingIndex(3) ); 00323 00324 r.sortIncrElement(); 00325 00326 assert( r[-1]==0. ); 00327 assert( r[ 0]==1. ); 00328 assert( r[ 1]==10.); 00329 assert( r[ 2]==50.); 00330 assert( r[ 3]==0. ); 00331 assert( r[ 4]==40.); 00332 assert( r[ 5]==0. ); 00333 assert( !r.isExistingIndex(-1) ); 00334 assert( r.isExistingIndex(0) ); 00335 assert( !r.isExistingIndex(3) ); 00336 assert( r.isExistingIndex(4) ); 00337 assert( !r.isExistingIndex(5) ); 00338 00339 assert ( r.getMaxIndex()==4 ); 00340 assert ( r.getMinIndex()==0 ); 00341 } 00342 00343 // Test that attemping to get min/max index of a 0, 00344 // length vector 00345 { 00346 CoinPackedVector nullVec; 00347 assert( nullVec.getMaxIndex() == 00348 /*std::numeric_limits<int>::max()*/INT_MIN/*0*/ ); 00349 assert( nullVec.getMinIndex() == 00350 /*std::numeric_limits<int>::min()*/INT_MAX/*0*/ ); 00351 } 00352 00353 // Test CoinFltEq with equivalent method 00354 { 00355 const int ne = 4; 00356 int inx1[ne] = { 1, 3, 4, 7 }; 00357 double el1[ne] = { 1.2, 3.4, 5.6, 7.8 }; 00358 int inx2[ne] = { 7, 4, 3, 1 }; 00359 double el2[ne] = { 7.8+.5, 5.6+.5, 3.4+.5, 1.2+.5 }; 00360 CoinPackedVector v1,v2; 00361 v1.setVector(ne,inx1,el1); 00362 v2.setVector(ne,inx2,el2); 00363 assert( !v1.isEquivalent(v2) ); 00364 assert( v1.isEquivalent(v2,CoinAbsFltEq(.6)) ); 00365 assert( v1.isEquivalent(v2,CoinRelFltEq(.6)) ); 00366 } 00367 00368 { 00369 // Test reserve 00370 CoinPackedVector v1,v2; 00371 assert( v1.capacity()==0 ); 00372 v1.reserve(6); 00373 assert( v1.capacity()==6 ); 00374 assert( v1.getNumElements()==0 ); 00375 v2=v1; 00376 assert( v2.capacity() == v2.getNumElements() ); 00377 assert( v2.getNumElements()==0 ); 00378 assert( v2==v1 ); 00379 v1.setVector(0,NULL,NULL); 00380 assert( v1.capacity()==6 ); 00381 assert( v1.getNumElements()==0 ); 00382 assert( v2==v1 ); 00383 v2=v1; 00384 assert( v2.capacity() == v2.getNumElements() ); 00385 assert( v2.getNumElements()==0 ); 00386 assert( v2==v1 ); 00387 00388 const int ne = 2; 00389 int inx[ne] = { 1, 3 }; 00390 double el[ne] = { 1.2, 3.4 }; 00391 v1.setVector(ne,inx,el); 00392 assert( v1.capacity()==6 ); 00393 assert( v1.getNumElements()==2 ); 00394 v2=v1; 00395 assert( v2.capacity()==v2.getNumElements() ); 00396 assert( v2.getNumElements()==2 ); 00397 assert( v2==v1 ); 00398 00399 const int ne1 = 5; 00400 int inx1[ne1] = { 1, 3, 4, 5, 6 }; 00401 double el1[ne1] = { 1.2, 3.4, 5., 6., 7. }; 00402 v1.setVector(ne1,inx1,el1); 00403 assert( v1.capacity()==6 ); 00404 assert( v1.getNumElements()==5 ); 00405 v2=v1; 00406 assert( v2.capacity()==v2.getNumElements() ); 00407 assert( v2.getNumElements()==5 ); 00408 assert( v2==v1 ); 00409 00410 const int ne2 = 8; 00411 int inx2[ne2] = { 1, 3, 4, 5, 6, 7, 8, 9 }; 00412 double el2[ne2] = { 1.2, 3.4, 5., 6., 7., 8., 9., 10. }; 00413 v1.setVector(ne2,inx2,el2); 00414 assert( v1.capacity()==8 ); 00415 assert( v1.getNumElements()==8 ); 00416 v2=v1; 00417 assert( v2.capacity()==v2.getNumElements() ); 00418 assert( v2.getNumElements()==8 ); 00419 assert( v2==v1 ); 00420 00421 v1.setVector(ne1,inx1,el1); 00422 assert( v1.capacity()==8 ); 00423 assert( v1.getNumElements()==5 ); 00424 v2=v1; 00425 assert( v2.capacity()==8 ); 00426 assert( v2.getNumElements()==5 ); 00427 assert( v2==v1 ); 00428 00429 v1.reserve(7); 00430 assert( v1.capacity()==8 ); 00431 assert( v1.getNumElements()==5 ); 00432 v2=v1; 00433 assert( v2.capacity()==8 ); 00434 assert( v2.getNumElements()==5 ); 00435 assert( v2==v1 ); 00436 00437 } 00438 00439 // Test the insert method 00440 { 00441 CoinPackedVector v1; 00442 assert( v1.getNumElements()==0 ); 00443 assert( v1.capacity()==0 ); 00444 00445 assert( !v1.isExistingIndex(1) ); 00446 v1.insert(1,1.); 00447 assert( v1.getNumElements()==1 ); 00448 assert( v1.capacity()==5 ); 00449 assert( v1.getIndices()[0] == 1 ); 00450 assert( v1.getElements()[0] == 1. ); 00451 assert( v1.isExistingIndex(1) ); 00452 00453 assert( !v1.isExistingIndex(10) ); 00454 v1.insert(10,10.); 00455 assert( v1.getNumElements()==2 ); 00456 assert( v1.capacity()==5 ); 00457 assert( v1.getIndices()[1] == 10 ); 00458 assert( v1.getElements()[1] == 10. ); 00459 assert( v1.isExistingIndex(1) ); 00460 assert( v1.isExistingIndex(10) ); 00461 00462 assert( !v1.isExistingIndex(20) ); 00463 v1.insert(20,20.); 00464 assert( v1.getNumElements()==3 ); 00465 assert( v1.capacity()==5 ); 00466 assert( v1.getIndices()[2] == 20 ); 00467 assert( v1.getElements()[2] == 20. ); 00468 assert( v1.isExistingIndex(20) ); 00469 00470 assert( !v1.isExistingIndex(30) ); 00471 v1.insert(30,30.); 00472 assert( v1.getNumElements()==4 ); 00473 assert( v1.capacity()==5 ); 00474 assert( v1.getIndices()[3] == 30 ); 00475 assert( v1.getElements()[3] == 30. ); 00476 assert( v1.isExistingIndex(30) ); 00477 00478 assert( !v1.isExistingIndex(40) ); 00479 v1.insert(40,40.); 00480 assert( v1.getNumElements()==5 ); 00481 assert( v1.capacity()==5 ); 00482 assert( v1.getIndices()[4] == 40 ); 00483 assert( v1.getElements()[4] == 40. ); 00484 assert( v1.isExistingIndex(40) ); 00485 00486 assert( !v1.isExistingIndex(50) ); 00487 v1.insert(50,50.); 00488 assert( v1.getNumElements()==6 ); 00489 assert( v1.capacity()==10 ); 00490 assert( v1.getIndices()[5] == 50 ); 00491 assert( v1.getElements()[5] == 50. ); 00492 assert( v1.isExistingIndex(50) ); 00493 00494 CoinPackedVector v2; 00495 const int ne1 = 3; 00496 int inx1[ne1] = { 1, 3, 4 }; 00497 double el1[ne1] = { 1.2, 3.4, 5. }; 00498 v2.setVector(ne1,inx1,el1); 00499 assert( v2.getNumElements()==3 ); 00500 assert( v2.capacity()==3 ); 00501 00502 } 00503 00504 { 00505 //Test setConstant and setElement 00506 CoinPackedVector v2; 00507 const int ne1 = 3; 00508 int inx1[ne1] = { 1, 3, 4 }; 00509 v2.setConstant(ne1,inx1,3.14); 00510 assert( v2.getNumElements()==3 ); 00511 assert( v2.capacity()==3 ); 00512 assert( v2.getIndices()[0]==1 ); 00513 assert( v2.getElements()[0]==3.14 ); 00514 assert( v2.getIndices()[1]==3 ); 00515 assert( v2.getElements()[1]==3.14 ); 00516 assert( v2.getIndices()[2]==4 ); 00517 assert( v2.getElements()[2]==3.14 ); 00518 00519 assert( v2[3] == 3.14 ); 00520 00521 CoinPackedVector v2X(ne1,inx1,3.14); 00522 assert( v2 == v2X ); 00523 00524 #if 0 00525 v2.setElement( 1 , 100. ); 00526 assert( v2.getNumElements()==3 ); 00527 assert( v2.capacity()==3 ); 00528 assert( v2.getIndices()[0]==1 ); 00529 assert( v2.getElements()[0]==3.14 ); 00530 assert( v2.getIndices()[1]==3 ); 00531 assert( v2.getElements()[1]==100. ); 00532 assert( v2.getIndices()[2]==4 ); 00533 assert( v2.getElements()[2]==3.14 ); 00534 00535 assert( v2[3] == 100. ); 00536 00537 bool errorThrown = false; 00538 try { 00539 v2.setElement( 100, 100. ); 00540 } 00541 catch (CoinError e) { 00542 errorThrown = true; 00543 } 00544 assert( errorThrown ); 00545 #endif 00546 } 00547 00548 { 00549 //Test setFull 00550 CoinPackedVector v2; 00551 const int ne2 = 3; 00552 double el2[ne2] = { 1., 3., 4. }; 00553 v2.setFull(ne2,el2); 00554 assert( v2.getNumElements()==3 ); 00555 assert( v2.capacity()==3 ); 00556 assert( v2.getIndices()[0]==0 ); 00557 assert( v2.getElements()[0]==1. ); 00558 assert( v2.getIndices()[1]==1 ); 00559 assert( v2.getElements()[1]==3. ); 00560 assert( v2.getIndices()[2]==2 ); 00561 assert( v2.getElements()[2]==4. ); 00562 00563 assert( v2[1] == 3. ); 00564 00565 CoinPackedVector v2X(ne2,el2); 00566 assert( v2 == v2X ); 00567 00568 v2.setFull(0,el2); 00569 assert( v2[2] == 0. ); 00570 00571 // Test setFullNonZero 00572 el2[1]=0.0; 00573 v2.setFullNonZero(ne2,el2); 00574 assert( v2.getNumElements()==2 ); 00575 assert( v2.capacity()==3 ); 00576 assert( v2.getIndices()[0]==0 ); 00577 assert( v2.getElements()[0]==1. ); 00578 assert( v2.getIndices()[1]==2 ); 00579 assert( v2.getElements()[1]==4. ); 00580 00581 assert( v2[1] == 0. ); 00582 00583 CoinPackedVector v2Y(ne2,el2); 00584 assert( v2 != v2Y ); 00585 assert( v2 != v2X ); 00586 00587 } 00588 00589 00590 #if 0 00591 // what happens when someone sets 00592 // the number of elements to be a negative number 00593 { 00594 const int ne = 4; 00595 int inx1[ne] = { 1, 3, 4, 7 }; 00596 double el1[ne] = { 1.2, 3.4, 5.6, 7.8 }; 00597 CoinPackedVector v1; 00598 v1.set(-ne,inx1,el1); 00599 } 00600 #endif 00601 00602 00603 // Test adding vectors 00604 { 00605 const int ne1 = 5; 00606 int inx1[ne1] = { 1, 3, 4, 7, 5 }; 00607 double el1[ne1] = { 1., 5., 6., 2., 9. }; 00608 const int ne2 = 4; 00609 int inx2[ne2] = { 7, 4, 2, 1 }; 00610 double el2[ne2] = { 7., 4., 2., 1. }; 00611 CoinPackedVector v1; 00612 v1.setVector(ne1,inx1,el1); 00613 CoinPackedVector v2; 00614 v2.setVector(ne2,inx2,el2); 00615 CoinPackedVector r = v1 + v2; 00616 00617 const int ner = 6; 00618 int inxr[ner] = { 1, 2, 3, 4, 5, 7 }; 00619 double elr[ner] = { 1.+1., 0.+2., 5.+0., 6.+4., 9.+0., 2.+7. }; 00620 CoinPackedVector rV; 00621 rV.setVector(ner,inxr,elr); 00622 assert( r.isEquivalent(rV) ); 00623 } 00624 00625 // Test subtracting vectors 00626 { 00627 const int ne1 = 5; 00628 int inx1[ne1] = { 1, 3, 4, 7, 5 }; 00629 double el1[ne1] = { 1., 5., 6., 2., 9. }; 00630 const int ne2 = 4; 00631 int inx2[ne2] = { 7, 4, 2, 1 }; 00632 double el2[ne2] = { 7., 4., 2., 1. }; 00633 CoinPackedVector v1; 00634 v1.setVector(ne1,inx1,el1); 00635 CoinPackedVector v2; 00636 v2.setVector(ne2,inx2,el2); 00637 CoinPackedVector r = v1 - v2; 00638 00639 const int ner = 6; 00640 int inxr[ner] = { 1, 2, 3, 4, 5, 7 }; 00641 double elr[ner] = { 1.-1., 0.-2., 5.-0., 6.-4., 9.-0., 2.-7. }; 00642 CoinPackedVector rV; 00643 rV.setVector(ner,inxr,elr); 00644 assert( r.isEquivalent(rV) ); 00645 } 00646 00647 // Test multiplying vectors 00648 { 00649 const int ne1 = 5; 00650 int inx1[ne1] = { 1, 3, 4, 7, 5 }; 00651 double el1[ne1] = { 1., 5., 6., 2., 9. }; 00652 const int ne2 = 4; 00653 int inx2[ne2] = { 7, 4, 2, 1 }; 00654 double el2[ne2] = { 7., 4., 2., 1. }; 00655 CoinPackedVector v1; 00656 v1.setVector(ne1,inx1,el1); 00657 CoinPackedVector v2; 00658 v2.setVector(ne2,inx2,el2); 00659 CoinPackedVector r = v1 * v2; 00660 00661 const int ner = 6; 00662 int inxr[ner] = { 1, 2, 3, 4, 5, 7 }; 00663 double elr[ner] = { 1.*1., 0.*2., 5.*0., 6.*4., 9.*0., 2.*7. }; 00664 CoinPackedVector rV; 00665 rV.setVector(ner,inxr,elr); 00666 assert( r.isEquivalent(rV) ); 00667 } 00668 00669 // Test dividing vectors 00670 { 00671 const int ne1 = 3; 00672 int inx1[ne1] = { 1, 4, 7 }; 00673 double el1[ne1] = { 1., 6., 2. }; 00674 const int ne2 = 4; 00675 int inx2[ne2] = { 7, 4, 2, 1 }; 00676 double el2[ne2] = { 7., 4., 2., 1. }; 00677 CoinPackedVector v1; 00678 v1.setVector(ne1,inx1,el1); 00679 CoinPackedVector v2; 00680 v2.setVector(ne2,inx2,el2); 00681 CoinPackedVector r = v1 / v2; 00682 00683 const int ner = 4; 00684 int inxr[ner] = { 1, 2, 4, 7 }; 00685 double elr[ner] = { 1./1., 0./2., 6./4., 2./7. }; 00686 CoinPackedVector rV; 00687 rV.setVector(ner,inxr,elr); 00688 assert( r.isEquivalent(rV) ); 00689 } 00690 00691 // Test sum 00692 { 00693 CoinPackedVector s; 00694 assert( s.sum() == 0 ); 00695 00696 s.insert(25,45.); 00697 assert(s.sum()==45.); 00698 00699 const int ne1 = 5; 00700 int inx1[ne1] = { 10, 3, 4, 7, 5 }; 00701 double el1[ne1] = { 1., 5., 6., 2., 9. }; 00702 s.setVector(ne1,inx1,el1); 00703 00704 assert(s.sum()==1.+5.+6.+2.+9.); 00705 } 00706 00707 // Just another interesting test 00708 { 00709 // Create numerator vector 00710 const int ne1 = 2; 00711 int inx1[ne1] = { 1, 4 }; 00712 double el1[ne1] = { 1., 6. }; 00713 CoinPackedVector v1(ne1,inx1,el1); 00714 00715 // create denominator vector 00716 const int ne2 = 3; 00717 int inx2[ne2] = { 1, 2, 4 }; 00718 double el2[ne2] = { 1., 7., 4.}; 00719 CoinPackedVector v2(ne2,inx2,el2); 00720 00721 // Compute ratio 00722 CoinPackedVector ratio = v1 / v2; 00723 00724 // Sort ratios 00725 ratio.sortIncrElement(); 00726 00727 // Test that the sort really worked 00728 assert( ratio.getElements()[0] == 0.0/7.0 ); 00729 assert( ratio.getElements()[1] == 1.0/1.0 ); 00730 assert( ratio.getElements()[2] == 6.0/4.0 ); 00731 00732 // Get numerator of of sorted ratio vector 00733 assert( v1[ ratio.getIndices()[0] ] == 0.0 ); 00734 assert( v1[ ratio.getIndices()[1] ] == 1.0 ); 00735 assert( v1[ ratio.getIndices()[2] ] == 6.0 ); 00736 00737 // Get denominator of of sorted ratio vector 00738 assert( v2[ ratio.getIndices()[0] ] == 7.0 ); 00739 assert( v2[ ratio.getIndices()[1] ] == 1.0 ); 00740 assert( v2[ ratio.getIndices()[2] ] == 4.0 ); 00741 } 00742 00743 // Test copy constructor from ShallowPackedVector 00744 { 00745 const int ne = 4; 00746 int inx[ne] = { 1, 4, 0, 2 }; 00747 double el[ne] = { 10., 40., 1., 50. }; 00748 CoinPackedVector std(ne,inx,el); 00749 CoinShallowPackedVector * spvP = new CoinShallowPackedVector(ne,inx,el); 00750 CoinPackedVector pv(*spvP); 00751 assert( pv == std ); 00752 assert( pv.isEquivalent(std) ); 00753 delete spvP; 00754 assert( pv == std ); 00755 assert( pv.isEquivalent(std) ); 00756 pv.sortIncrElement(); 00757 assert( pv != std ); 00758 assert( pv.isEquivalent(std) ); 00759 } 00760 00761 // Test assignment from ShallowPackedVector 00762 { 00763 const int ne = 4; 00764 int inx[ne] = { 1, 4, 0, 2 }; 00765 double el[ne] = { 10., 40., 1., 50. }; 00766 CoinPackedVector std(ne,inx,el); 00767 CoinShallowPackedVector * spvP = new CoinShallowPackedVector(ne,inx,el); 00768 CoinPackedVector pv; 00769 pv = *spvP; 00770 assert( pv == std ); 00771 assert( pv.isEquivalent(std) ); 00772 delete spvP; 00773 assert( pv == std ); 00774 assert( pv.isEquivalent(std) ); 00775 pv.sortIncrElement(); 00776 assert( pv != std ); 00777 assert( pv.isEquivalent(std) ); 00778 } 00779 00780 { 00781 // Test that sample usage works 00782 00783 const int ne = 4; 00784 int inx[ne] = { 1, 4, 0, 2 }; 00785 double el[ne] = { 10., 40., 1., 50. }; 00786 CoinPackedVector r(ne,inx,el); 00787 00788 assert( r.getIndices()[0]== 1 ); 00789 assert( r.getElements()[0]==10. ); 00790 assert( r.getIndices()[1]== 4 ); 00791 assert( r.getElements()[1]==40. ); 00792 assert( r.getIndices()[2]== 0 ); 00793 assert( r.getElements()[2]== 1. ); 00794 assert( r.getIndices()[3]== 2 ); 00795 assert( r.getElements()[3]==50. ); 00796 00797 assert( r.getOriginalPosition()[0]==0 ); 00798 assert( r.getOriginalPosition()[1]==1 ); 00799 assert( r.getOriginalPosition()[2]==2 ); 00800 assert( r.getOriginalPosition()[3]==3 ); 00801 00802 assert( r[ 0]==1. ); 00803 assert( r[ 1]==10.); 00804 assert( r[ 2]==50.); 00805 assert( r[ 3]==0. ); 00806 assert( r[ 4]==40.); 00807 00808 r.sortIncrElement(); 00809 00810 assert( r.getIndices()[0]== 0 ); 00811 assert( r.getElements()[0]== 1. ); 00812 assert( r.getIndices()[1]== 1 ); 00813 assert( r.getElements()[1]==10. ); 00814 assert( r.getIndices()[2]== 4 ); 00815 assert( r.getElements()[2]==40. ); 00816 assert( r.getIndices()[3]== 2 ); 00817 assert( r.getElements()[3]==50. ); 00818 00819 assert( r.getOriginalPosition()[0]==2 ); 00820 assert( r.getOriginalPosition()[1]==0 ); 00821 assert( r.getOriginalPosition()[2]==1 ); 00822 assert( r.getOriginalPosition()[3]==3 ); 00823 00824 assert( r[ 0]==1. ); 00825 assert( r[ 1]==10.); 00826 assert( r[ 2]==50.); 00827 assert( r[ 3]==0. ); 00828 assert( r[ 4]==40.); 00829 00830 r.sortOriginalOrder(); 00831 00832 assert( r.getIndices()[0]== 1 ); 00833 assert( r.getElements()[0]==10. ); 00834 assert( r.getIndices()[1]== 4 ); 00835 assert( r.getElements()[1]==40. ); 00836 assert( r.getIndices()[2]== 0 ); 00837 assert( r.getElements()[2]== 1. ); 00838 assert( r.getIndices()[3]== 2 ); 00839 assert( r.getElements()[3]==50. ); 00840 00841 CoinPackedVector r1; 00842 r1=r; 00843 assert( r==r1 ); 00844 assert( r.isEquivalent(r1) ); 00845 r.sortIncrElement(); 00846 assert( r!=r1 ); 00847 assert( r.isEquivalent(r1) ); 00848 00849 CoinPackedVector add = r + r1; 00850 assert( add[0] == 1.+ 1. ); 00851 assert( add[1] == 10.+10. ); 00852 assert( add[2] == 50.+50. ); 00853 assert( add[3] == 0.+ 0. ); 00854 assert( add[4] == 40.+40. ); 00855 00856 assert( r.sum() == 10.+40.+1.+50. ); 00857 } 00858 00859 { 00860 // Test findIndex 00861 const int ne = 4; 00862 int inx[ne] = { 1, -4, 0, 2 }; 00863 double el[ne] = { 10., 40., 1., 50. }; 00864 CoinPackedVector r(ne,inx,el); 00865 00866 assert( r.findIndex(2) == 3 ); 00867 assert( r.findIndex(0) == 2 ); 00868 assert( r.findIndex(-4) == 1 ); 00869 assert( r.findIndex(1) == 0 ); 00870 assert( r.findIndex(3) == -1 ); 00871 } 00872 #if 0 00873 { 00874 // Test construction with testing for duplicates as false 00875 const int ne = 4; 00876 int inx[ne] = { 1, -4, 0, 2 }; 00877 double el[ne] = { 10., 40., 1., 50. }; 00878 CoinPackedVector rT(ne,inx,el); 00879 CoinPackedVector r(false); 00880 00881 assert( !r.isExistingIndex(1) ); 00882 r.insert(1,10.); 00883 00884 assert( !r.isExistingIndex(-4) ); 00885 r.insert(-4,20.); 00886 00887 assert( !r.isExistingIndex(0) ); 00888 r.insert(0,1.); 00889 00890 assert( r.isExistingIndex(-4) ); // This line is failing!! 00891 // If r is constructed with true, 00892 // then it does not fail 00893 int neg4Index = r.findIndex(-4); 00894 assert( neg4Index == 1 ); 00895 r.setElement(neg4Index, r.getElements()[neg4Index] + 20); 00896 00897 assert( !r.isExistingIndex(2) ); 00898 r.insert(2,50.); 00899 00900 assert( r == rT ); 00901 } 00902 #endif 00903 } |