00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "BonFilterWarmStart.hpp"
00011
00012
00013 namespace Bonmin
00014 {
00015
00016 FilterWarmStart:: FilterWarmStart(const fint xSize ,
00017 const real* xArray ,
00018 const fint lamSize ,
00019 const real* lamArray ,
00020 const fint lwsSize ,
00021 const fint *lwsArray ,
00022 const fint istat[14] )
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
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 }
00141