/home/coin/SVN-release/OS-2.2.0/Bonmin/src/Interfaces/Filter/BonFilterWarmStart.cpp

Go to the documentation of this file.
00001 // (C) Copyright International Business Machines Corporation, 2006
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // Authors :
00006 // Pierre Bonami, International Business Machines Corporation
00007 //
00008 // Date : 11/21/2006
00009 
00010 #include "BonFilterWarmStart.hpp"
00011 
00012 
00013 namespace Bonmin
00014 {
00015 
00016   FilterWarmStart:: FilterWarmStart(const fint xSize /*= 0*/,
00017       const real* xArray /*= NULL*/,
00018       const fint lamSize /*= 0*/,
00019       const real* lamArray /*= NULL*/,
00020       const fint lwsSize /*= 0*/,
00021       const fint *lwsArray /*= NULL*/,
00022       const fint istat[14] /*= def_istat*/)
00023     :
00024     CoinWarmStartPrimalDual(xSize, lamSize, xArray, lamArray),
00025     CoinWarmStartBasis(),
00026     lwsSize_(lwsSize),
00027     lwsArray_(NULL),
00028     empty_(false)
00029   {
00030     assert(lwsSize > 0 || !lwsArray);
00031     if (lwsSize_ > 0) {
00032       lwsArray_ = new fint[lwsSize];
00033       assert(lwsArray);
00034       CoinCopyN(lwsArray, lwsSize, lwsArray_);
00035     }
00036     for (int i = 0 ; i < 14 ; i ++) {
00037       istat_[i] = istat[i];
00038     }
00039   }
00040 
00041   /* Copy constructor */
00042   FilterWarmStart::FilterWarmStart(const FilterWarmStart & other)
00043     :
00044     CoinWarmStartPrimalDual(other),
00045     CoinWarmStartBasis(other),
00046     lwsSize_(other.lwsSize_),
00047     lwsArray_(NULL),
00048     empty_(other.empty_)
00049   {
00050     assert(lwsSize_ > 0 || !lwsArray_);
00051     if (lwsSize_ > 0) {
00052       lwsArray_ = new fint[lwsSize_];
00053       assert(other.lwsArray_);
00054       CoinCopyN(other.lwsArray_, lwsSize_, lwsArray_);
00055     }
00056     for (int i = 0 ; i < 14 ; i ++) {
00057       istat_[i] = other.istat_[i];
00058     }
00059   }
00060 
00061   FilterWarmStart::~FilterWarmStart()
00062   {
00063     delete [] lwsArray_;
00064   }
00065 
00066   CoinWarmStartDiff *
00067   FilterWarmStart::generateDiff(const CoinWarmStart * const oldOne) const
00068   {
00069     const FilterWarmStart * old =
00070       dynamic_cast<const FilterWarmStart*> (oldOne);
00071     assert(old);
00072 
00073     CoinWarmStartDiff * diff = CoinWarmStartPrimalDual::generateDiff(old);
00074 
00075     CoinWarmStartPrimalDualDiff * pdDiff =
00076       dynamic_cast<CoinWarmStartPrimalDualDiff*>(diff);
00077 
00078     FilterWarmStartDiff* retval =
00079       new FilterWarmStartDiff(pdDiff, lwsSize_);
00080     delete diff;
00081 
00082     for (fint i = 0 ; i < lwsSize_ ; i++) {
00083       if (lwsArray_[i] != old->lwsArray_[i]) {
00084         retval->differences.push_back(FilterWarmStartDiff::OneDiff(i, lwsArray_[i] - old->lwsArray_[i]));
00085       }
00086     }
00087 
00088     retval->differences.resize(retval->differences.size());
00089 
00090     for (int i = 0 ; i < 14 ; i++) {
00091       retval->istat_[i] = istat_[i];
00092     }
00093 
00094     return retval;
00095   }
00096 
00097   void
00098   FilterWarmStart::applyDiff(const CoinWarmStartDiff * diff)
00099   {
00100     const FilterWarmStartDiff * diffF =
00101       dynamic_cast<const FilterWarmStartDiff *>(diff);
00102     assert(diffF);
00103     CoinWarmStartPrimalDual::applyDiff(diffF);
00104 
00105     fint end = diffF->differences.size();
00106     for (fint i = 0 ; i < end ; i++) {
00107       lwsArray_[diffF->differences[i].first] += diffF->differences[i].second;
00108     }
00109 
00110     for (int i = 0 ; i < 14 ; i++)
00111       istat_[i] = diffF->istat_[i];
00112   }
00113 
00114   void
00115   FilterWarmStart::flushPoint()
00116   {
00117     delete [] lwsArray_;
00118   }
00119 
00120   FilterWarmStartDiff::FilterWarmStartDiff(CoinWarmStartPrimalDualDiff * diff,
00121                                            fint capacity)
00122       :
00123       CoinWarmStartPrimalDualDiff()
00124   {
00125     CoinWarmStartPrimalDualDiff::swap(*diff);
00126     differences.reserve(capacity);
00127   }
00128 
00129   void
00130   FilterWarmStartDiff::flushPoint()
00131   {
00132     CoinWarmStartPrimalDualDiff::clear();
00133     differences.clear();
00134   }
00135 
00136   FilterTypes::fint
00137   FilterWarmStart::def_istat[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
00138 
00139 
00140 } /* End namespace Bonmin */
00141 

Generated on Thu Aug 5 03:02:55 2010 by  doxygen 1.4.7