Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | Related Pages

CoinPackedVector Class Reference

#include <CoinPackedVector.hpp>

Inheritance diagram for CoinPackedVector:

CoinPackedVectorBase List of all members.

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).

CoinPackedVectoroperator= (const CoinPackedVector &)
CoinPackedVectoroperator= (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 ()

Detailed Description

Sparse Vector

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.


Constructor & Destructor Documentation

CoinPackedVector::CoinPackedVector bool  testForDuplicateIndex = true  ) 
 

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 }

CoinPackedVector::CoinPackedVector int  size,
const int *  inds,
const double *  elems,
bool  testForDuplicateIndex = true
 

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 }

CoinPackedVector::CoinPackedVector int  size,
const int *  inds,
double  element,
bool  testForDuplicateIndex = true
 

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 }

CoinPackedVector::CoinPackedVector int  size,
const double *  elements,
bool  testForDuplicateIndex = true
 

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 }

CoinPackedVector::CoinPackedVector const CoinPackedVector  ) 
 

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 }

CoinPackedVector::CoinPackedVector const CoinPackedVectorBase rhs  ) 
 

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 }

CoinPackedVector::~CoinPackedVector  )  [virtual]
 

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 }


Member Function Documentation

void CoinPackedVector::assignVector int  size,
int *&  inds,
double *&  elems,
bool  testForDuplicateIndex = true
 

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 }

int CoinPackedVector::capacity  )  const [inline]
 

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_; }

const int* CoinPackedVector::getOriginalPosition  )  const [inline]
 

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_; }

CoinPackedVector & CoinPackedVector::operator= const CoinPackedVectorBase rhs  ) 
 

Assignment operator from a CoinPackedVectorBase.
NOTE: This operator keeps the current testForDuplicateIndex setting, and affter copying the data it acts accordingly.

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 }

CoinPackedVector & CoinPackedVector::operator= const CoinPackedVector  ) 
 

Assignment operator.
NOTE: This operator keeps the current testForDuplicateIndex setting, and affter copying the data it acts accordingly.

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 }

void CoinPackedVector::reserve int  n  ) 
 

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 }

void CoinPackedVector::setConstant int  size,
const int *  inds,
double  elems,
bool  testForDuplicateIndex = true
throw (CoinError)
 

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 }

void CoinPackedVector::setElement int  index,
double  element
throw (CoinError)
 

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 }

void CoinPackedVector::setFull int  size,
const double *  elems,
bool  testForDuplicateIndex = true
 

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 }

void CoinPackedVector::setFullNonZero int  size,
const double *  elems,
bool  testForDuplicateIndex = true
 

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 }

void CoinPackedVector::setVector int  size,
const int *  inds,
const double *  elems,
bool  testForDuplicateIndex = true
throw (CoinError)
 

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 }

template<class CoinCompare3>
void CoinPackedVector::sort const CoinCompare3 &  tc  )  [inline]
 

Sort the packed storage vector. Typcical usages:

packedVector.sort(CoinIncrIndexOrdered()); //increasing indices packedVector.sort(CoinIncrElementOrdered()); // increasing elements

Definition at line 223 of file CoinPackedVector.hpp.

References elements_, indices_, nElements_, and origIndices_.

00224    { CoinSort_3(indices_, indices_ + nElements_, origIndices_, elements_,
00225                 tc); }

void CoinPackedVector::sortOriginalOrder  ) 
 

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 }

void CoinPackedVector::truncate int  newSize  )  throw (CoinError)
 

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 }


Friends And Related Function Documentation

void CoinPackedVectorUnitTest  )  [friend]
 

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 }


The documentation for this class was generated from the following files:
Generated on Wed Dec 3 14:34:29 2003 for Coin by doxygen 1.3.5