00001
00002
00003
00004 #include "BCP_math.hpp"
00005 #include "BCP_message.hpp"
00006 #include "BCP_vector.hpp"
00007 #include "BCP_problem_core.hpp"
00008 #include "BCP_var.hpp"
00009 #include "BCP_cut.hpp"
00010 #include "BCP_cg.hpp"
00011 #include "BCP_cg_user.hpp"
00012
00013 #include "BCP_warmstart.hpp"
00014
00015 BCP_cg_prob::BCP_cg_prob(int my_id, int parent) :
00016 BCP_process(my_id, parent),
00017 user(0), msg_env(0), core(new BCP_problem_core),
00018 upper_bound(BCP_DBL_MAX), phase(0) {}
00019
00020
00021 BCP_cg_prob::~BCP_cg_prob()
00022 {
00023 delete user; user = 0;
00024 delete packer; packer = 0;
00025 delete core; core = 0;
00026 purge_ptr_vector(vars);
00027 }
00028
00029 bool
00030 BCP_cg_prob::probe_messages()
00031 {
00032 while (msg_env->probe(BCP_AnyProcess, BCP_Msg_UpperBound)) {
00033 msg_env->receive(BCP_AnyProcess, BCP_Msg_UpperBound, msg_buf, 0);
00034 double new_ub;
00035 msg_buf.unpack(new_ub);
00036 if (new_ub < upper_bound)
00037 upper_bound = new_ub;
00038 }
00039
00040 if (msg_env->probe(BCP_AnyProcess, BCP_Msg_ForCG_PrimalNonzeros))
00041 return true;
00042 if (msg_env->probe(BCP_AnyProcess, BCP_Msg_ForCG_PrimalFractions))
00043 return true;
00044 if (msg_env->probe(BCP_AnyProcess, BCP_Msg_ForCG_PrimalFull))
00045 return true;
00046 if (msg_env->probe(BCP_AnyProcess, BCP_Msg_ForCG_User))
00047 return true;
00048
00049 if (msg_env->probe(BCP_AnyProcess, BCP_Msg_FinishedBCP))
00050 return true;
00051 return false;
00052 }
00053
00054 BCP_var*
00055 BCP_cg_prob::unpack_var()
00056 {
00057 BCP_object_t obj_t;
00058 int bcpind;
00059 BCP_var_t var_t;
00060 double obj, lb, ub;
00061 BCP_obj_status stat;
00062 msg_buf.unpack(bcpind)
00063 .unpack(obj_t).unpack(stat)
00064 .unpack(var_t).unpack(obj).unpack(lb).unpack(ub);
00065
00066 BCP_var* var = 0;
00067 switch (obj_t) {
00068 case BCP_CoreObj:
00069 var = new BCP_var_core(var_t, obj, lb, ub);
00070 break;
00071 case BCP_AlgoObj:
00072 var = packer->unpack_var_algo(msg_buf);
00073 var->set_var_type(var_t);
00074 var->change_bounds(lb, ub);
00075 var->set_obj(obj);
00076 break;
00077 default:
00078 throw BCP_fatal_error("BCP_cg_prob::_unpack_var(): unexpected obj_t.\n");
00079 }
00080 var->set_bcpind(bcpind);
00081 var->set_status(stat);
00082
00083 return var;
00084 }