00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "BCP_tm.hpp"
00013 #include "CoinHelperFunctions.hpp"
00014 #include "AAP_tm.hpp"
00015 #include "AAP_var.hpp"
00016 #include "AAP_init.hpp"
00017 #include "AAP_user_data.hpp"
00018
00019
00020 void AAP_tm::pack_module_data(BCP_buffer & buf, BCP_process_t ptype){
00021
00022 lp_par.pack(buf);
00023 aap->pack(buf);
00024 }
00025
00026
00027 void AAP_tm::pack_var_algo(const BCP_var_algo* var, BCP_buffer& buf){
00028
00029 {
00030 const AAP_var * mvar = dynamic_cast<const AAP_var*>(var);
00031 if(mvar){
00032 mvar->pack(buf);
00033 return;
00034 }
00035 }
00036 throw BCP_fatal_error("AAP_tm::pack_var_algo() : unknown cut type!\n");
00037 }
00038
00039
00040 BCP_var_algo* AAP_tm::unpack_var_algo(BCP_buffer& buf){
00041
00042 return new AAP_var(buf);
00043 }
00044
00045
00046 void AAP_tm::pack_user_data(const BCP_user_data* ud, BCP_buffer& buf){
00047
00048 {
00049 const AAP_user_data * data = dynamic_cast<const AAP_user_data*>(ud);
00050 if(data){
00051 data->pack(buf);
00052 return;
00053 }
00054 }
00055 throw BCP_fatal_error("AAP_tm::pack_user_data() : cast failed!\n");
00056 }
00057
00058
00059 BCP_user_data * AAP_tm::unpack_user_data(BCP_buffer& buf){
00060 return new AAP_user_data(buf);
00061 }
00062
00063
00064 void AAP_tm::display_feasible_solution(const BCP_solution * sol){
00065
00066
00067 #ifdef DBG_PRINT
00068 const BCP_solution_generic* gsol =
00069 dynamic_cast<const BCP_solution_generic*>(sol);
00070 if(gsol){
00071 const int varnum = gsol->_vars.size();
00072 for (int c = 0; c < varnum; ++c) {
00073 const AAP_var* mvar = dynamic_cast<const AAP_var*>(gsol->_vars[c]);
00074 if(mvar){
00075 cout << "Column " << gsol->_vars[c]->bcpind() << " : "
00076 << gsol->_values[c] << endl;
00077 mvar->print(aap->getDimension());
00078 }
00079 }
00080 }
00081 #else
00082 BCP_tm_user::display_feasible_solution(sol);
00083 #endif
00084 }
00085
00086
00087 void AAP_tm::initialize_core(BCP_vec<BCP_var_core*>& vars,
00088 BCP_vec<BCP_cut_core*>& cuts,
00089 BCP_lp_relax*& matrix) {
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112 const int n_cuts = aap->getDimension() + 1;
00113 cuts.reserve(n_cuts);
00114
00115
00116 for(int r = 0; r < n_cuts; r++)
00117 cuts.unchecked_push_back(new BCP_cut_core(1.0, 1.0));
00118 }
00119
00120
00121 void AAP_tm::create_root(BCP_vec<BCP_var*>& added_vars,
00122 BCP_vec<BCP_cut*>& added_cuts,
00123 BCP_user_data * & user_data,
00124 BCP_pricing_status& pricing_status){
00125
00126
00127
00128
00129
00130
00131 pricing_status = BCP_PriceAlgoVars;
00132
00133
00134 user_data = new AAP_user_data();
00135
00136
00137
00138
00139
00140
00141
00142 int i, index;
00143
00144 const double * assigncost = aap->getAssignCost();
00145 const int n = aap->getDimension();
00146
00147 vector<int> ap;
00148 ap.reserve(n);
00149
00150 double cost = 0.0;
00151 for(i = 0; i < n; i++){
00152 index = index3(i,i,i,n);
00153 ap.push_back(index);
00154 cost += assigncost[index];
00155 }
00156
00157 added_vars.push_back(new AAP_var(ap, cost));
00158 }
00159
00160
00161 void AAP_tm::init_new_phase(int phase, BCP_column_generation & colgen) {
00162
00163 colgen = BCP_GenerateColumns;
00164 }
00165