/home/coin/SVN-release/OS-2.4.1/Bcp/src/Member/BCP_warmstart_basis.cpp

Go to the documentation of this file.
00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
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   // The storage is WrtParent if at least one status set is WrtParent
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   // Otherwise Explicit if at least one status set is Explicit
00030   if (vst == BCP_Storage_Explicit || cst == BCP_Storage_Explicit)
00031     return BCP_Storage_Explicit;
00032   // Otherwise it must be NoData
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   // Both are explicit
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 }

Generated on Thu Nov 10 03:05:39 2011 by  doxygen 1.4.7