00001 // Copyright (C) 2000, International Business Machines 00002 // Corporation and others. All Rights Reserved. 00003 #include "CoinWarmStartDual.hpp" 00004 #include "BCP_warmstart_dual.hpp" 00005 00006 //############################################################################# 00007 00008 CoinWarmStart* 00009 BCP_warmstart_dual::convert_to_CoinWarmStart() const 00010 { 00011 if (storage() != BCP_Storage_Explicit) 00012 return NULL; 00013 00014 const BCP_vec<double>& dual = _dual.explicit_vector(); 00015 return new CoinWarmStartDual(dual.size(), dual.begin()); 00016 } 00017 00018 //############################################################################# 00019 00020 void 00021 BCP_warmstart_dual::update(const BCP_warmstart* const change) 00022 { 00023 const BCP_warmstart_dual* const dch = 00024 dynamic_cast<const BCP_warmstart_dual* const>(change); 00025 if (!dch) 00026 throw BCP_fatal_error("BCP_warmstart_dual::update\n \ 00027 Trying to update a BCP_warmstart_dual with a different warmstart!\n"); 00028 00029 _dual.update(dch->_dual); 00030 } 00031 00032 00033 //############################################################################# 00034 00035 BCP_warmstart* 00036 BCP_warmstart_dual::as_change(const BCP_warmstart* const old_ws, 00037 const BCP_vec<int>& del_vars, 00038 const BCP_vec<int>& del_cuts, 00039 const double petol, 00040 const double detol) const 00041 { 00042 const BCP_warmstart_dual* const ows = 00043 dynamic_cast<const BCP_warmstart_dual* const>(old_ws); 00044 if (!ows) 00045 throw BCP_fatal_error("\ 00046 Trying to describe a BCP_warmstart_dual as a change to a different ws!\n"); 00047 00048 if (storage() != BCP_Storage_Explicit) 00049 throw BCP_fatal_error("\ 00050 BCP_warmstart_dual::as_change : current data is not explicit!\n"); 00051 00052 if (ows->storage() == BCP_Storage_WrtParent) 00053 throw BCP_fatal_error("\ 00054 BCP_warmstart_dual::as_change : old_ws is WrtParent!\n"); 00055 00056 if (ows->storage() == BCP_Storage_NoData) 00057 return new BCP_warmstart_dual(*this); 00058 00059 // Both are explicit 00060 BCP_warmstart_dual* ws = new BCP_warmstart_dual(); 00061 new (&ws->_dual) BCP_vec_change<double>(ows->_dual, _dual, del_cuts, 1e-4); 00062 if (ws->_dual.storage_size() >= _dual.storage_size()) 00063 ws->_dual = _dual; 00064 00065 return ws; 00066 }