/home/coin/SVN-release/OS-2.0.0/Bcp/src/Member/BCP_warmstart_primaldual.cpp

Go to the documentation of this file.
00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
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   // Both are explicit
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 }

Generated on Mon Aug 3 03:02:15 2009 by  doxygen 1.4.7