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

CoinPackedVectorTest.cpp

00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 #if defined(_MSC_VER)
00004 // Turn off compiler warning about long names
00005 #  pragma warning(disable:4786)
00006 #endif
00007 
00008 #include <cassert>
00009 
00010 #include "CoinPackedVector.hpp"
00011 #include "CoinShallowPackedVector.hpp"
00012 
00013 #ifdef NDEBUG
00014 #undef NDEBUG
00015 #endif
00016 
00017 //--------------------------------------------------------------------------
00018 void
00019 CoinPackedVectorUnitTest()
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 }
00904 

Generated on Wed Dec 3 14:34:21 2003 for Coin by doxygen 1.3.5