00001
00002
00003 #include "CoinWarmStartBasis.hpp"
00004 #include "BCP_warmstart_basis.hpp"
00005
00006
00007
00008 CoinWarmStart*
00009 BCP_warmstart_basis::convert_to_CoinWarmStart() const
00010 {
00011 if (storage() != BCP_Storage_Explicit)
00012 return NULL;
00013
00014 const BCP_vec<char>& vst = _var_stat.explicit_vector();
00015 const BCP_vec<char>& cst = _cut_stat.explicit_vector();
00016 return
00017 new CoinWarmStartBasis(vst.size(), cst.size(), vst.begin(), cst.begin());
00018 }
00019
00020
00021
00022 BCP_storage_t
00023 BCP_warmstart_basis::storage() const {
00024
00025 const BCP_storage_t vst = _var_stat.storage();
00026 const BCP_storage_t cst = _cut_stat.storage();
00027 if (vst == BCP_Storage_WrtParent || cst == BCP_Storage_WrtParent)
00028 return BCP_Storage_WrtParent;
00029
00030 if (vst == BCP_Storage_Explicit || cst == BCP_Storage_Explicit)
00031 return BCP_Storage_Explicit;
00032
00033 return BCP_Storage_NoData;
00034 }
00035
00036
00037
00038 void
00039 BCP_warmstart_basis::update(const BCP_warmstart* const change)
00040 {
00041 const BCP_warmstart_basis* ch =
00042 dynamic_cast<const BCP_warmstart_basis*>(change);
00043 if (! ch)
00044 throw BCP_fatal_error("BCP_warmstart_basis::update\n \
00045 Can't update a BCP_warmstart_basis with a different warmstart.\n");
00046
00047 _var_stat.update(ch->_var_stat);
00048 _cut_stat.update(ch->_cut_stat);
00049 }
00050
00051
00052
00053
00054 BCP_warmstart*
00055 BCP_warmstart_basis::as_change(const BCP_warmstart* const old_ws,
00056 const BCP_vec<int>& del_vars,
00057 const BCP_vec<int>& del_cuts,
00058 const double petol,
00059 const double detol) const
00060 {
00061 const BCP_warmstart_basis* const ows =
00062 dynamic_cast<const BCP_warmstart_basis* const>(old_ws);
00063 if (!ows)
00064 throw BCP_fatal_error("BCP_warmstart_basis::as_change\n \
00065 trying to describe a BCP_warmstart_basis as a change to a different ws!\n");
00066
00067 if (storage() != BCP_Storage_Explicit)
00068 throw BCP_fatal_error("BCP_warmstart_basis::as_change\n \
00069 current data is not explicit!\n");
00070
00071 if (ows->storage() == BCP_Storage_WrtParent)
00072 throw BCP_fatal_error("\
00073 BCP_warmstart_dual::as_change : old_ws is WrtParent!\n");
00074
00075 if (ows->storage() == BCP_Storage_NoData)
00076 return new BCP_warmstart_basis(*this);
00077
00078
00079 BCP_warmstart_basis* ws = new BCP_warmstart_basis();
00080
00081 new (&ws->_var_stat) BCP_vec_change<char>(ows->_var_stat, _var_stat,
00082 del_vars);
00083 if (ws->_var_stat.storage_size() > ows->_var_stat.storage_size())
00084 ws->_var_stat = ows->_var_stat;
00085
00086 new (&ws->_cut_stat) BCP_vec_change<char>(ows->_cut_stat, _cut_stat,
00087 del_cuts);
00088 if (ws->_cut_stat.storage_size() > ows->_cut_stat.storage_size())
00089 ws->_cut_stat = ows->_cut_stat;
00090
00091 return ws;
00092 }