00001
00002
00003 #include "CoinWarmStartPrimalDual.hpp"
00004 #include "BCP_warmstart_primaldual.hpp"
00005
00006
00007
00008 CoinWarmStart*
00009 BCP_warmstart_primaldual::convert_to_CoinWarmStart() const
00010 {
00011 if (storage() != BCP_Storage_Explicit)
00012 return NULL;
00013
00014 const BCP_vec<double>& primal = _primal.explicit_vector();
00015 const BCP_vec<double>& dual = _dual.explicit_vector();
00016 return new CoinWarmStartPrimalDual(primal.size(), dual.size(),
00017 &primal[0], &dual[0]);
00018 }
00019
00020
00021
00022 void
00023 BCP_warmstart_primaldual::update(const BCP_warmstart* const change)
00024 {
00025 const BCP_warmstart_primaldual* const pdch =
00026 dynamic_cast<const BCP_warmstart_primaldual* const>(change);
00027 if (!pdch)
00028 throw BCP_fatal_error("BCP_warmstart_primaldual::update\n \
00029 Trying to update a BCP_warmstart_primaldual with a different warmstart!\n");
00030
00031 _primal.update(pdch->_primal);
00032 _dual.update(pdch->_dual);
00033 }
00034
00035
00036
00037
00038 BCP_warmstart*
00039 BCP_warmstart_primaldual::as_change(const BCP_warmstart* const old_ws,
00040 const BCP_vec<int>& del_vars,
00041 const BCP_vec<int>& del_cuts,
00042 const double petol,
00043 const double detol) const
00044 {
00045 const BCP_warmstart_primaldual* const ows =
00046 dynamic_cast<const BCP_warmstart_primaldual* const>(old_ws);
00047 if (!ows)
00048 throw BCP_fatal_error("\
00049 Trying to describe a BCP_warmstart_primaldual as a change to a different ws!\n");
00050
00051 if (storage() != BCP_Storage_Explicit)
00052 throw BCP_fatal_error("\
00053 BCP_warmstart_primaldual::as_change : current data is not explicit!\n");
00054
00055 if (ows->storage() == BCP_Storage_WrtParent)
00056 throw BCP_fatal_error("\
00057 BCP_warmstart_primaldual::as_change : old_ws is WrtParent!\n");
00058
00059 if (ows->storage() == BCP_Storage_NoData)
00060 return new BCP_warmstart_primaldual(*this);
00061
00062
00063 BCP_warmstart_primaldual* ws = new BCP_warmstart_primaldual();
00064 new (&ws->_primal) BCP_vec_change<double>(ows->_primal, _primal,
00065 del_vars, petol);
00066 if (ws->_primal.storage_size() >= _primal.storage_size())
00067 ws->_primal = _primal;
00068
00069 new (&ws->_dual) BCP_vec_change<double>(ows->_dual, _dual, del_cuts, detol);
00070 if (ws->_dual.storage_size() >= _dual.storage_size())
00071 ws->_dual = _dual;
00072
00073 return ws;
00074 }