/home/coin/SVN-release/OS-2.1.1/Bcp/src/CG/BCP_cg.cpp

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

Generated on Mon May 3 03:05:10 2010 by  doxygen 1.4.7