int lp_initialize(lp_prob *p, int master_tid) { #ifndef COMPILE_IN_LP int msgtag, bytes, r_bufid; #endif #if !defined(COMPILE_IN_TM) || !defined(COMPILE_IN_LP) int s_bufid; #endif int i; row_data *rows; var_desc **vars; int termcode = 0; #ifdef COMPILE_IN_LP p->master = master_tid; #else /* set stdout to be line buffered */ setvbuf(stdout, (char *)NULL, _IOLBF, 0); register_process(); /*------------------------------------------------------------------------*\ * Receive tid info; request and receive problem specific data \*------------------------------------------------------------------------*/ r_bufid = receive_msg(ANYONE, MASTER_TID_INFO); bufinfo(r_bufid, &bytes, &msgtag, &p->tree_manager); receive_int_array(&p->master, 1); receive_int_array(&p->proc_index, 1); freebuf(r_bufid); #endif p->lp_data = (LPdata *) calloc(1, sizeof(LPdata)); p->lp_data->mip = (MIPdesc *) calloc(1, sizeof(MIPdesc)); p->lp_data->par = p->par; #pragma omp critical (lp_solver) open_lp_solver(p->lp_data); (void) used_time(&p->tt); #if !defined(COMPILE_IN_TM) || !defined(COMPILE_IN_LP) s_bufid = init_send(DataInPlace); send_msg(p->master, REQUEST_FOR_LP_DATA); freebuf(s_bufid); CALL_WRAPPER_FUNCTION( receive_lp_data_u(p) ); #endif if (p->par.tailoff_gap_backsteps > 0 || p->par.tailoff_obj_backsteps > 1){ i = MAX(p->par.tailoff_gap_backsteps, p->par.tailoff_obj_backsteps); p->obj_history = (double *) malloc((i + 1) * DSIZE); } #ifndef COMPILE_IN_LP if (p->par.use_cg){ r_bufid = receive_msg(p->tree_manager, LP__CG_TID_INFO); receive_int_array(&p->cut_gen, 1); freebuf(r_bufid); } #endif p->lp_data->rows = (row_data *) malloc((p->base.cutnum + BB_BUNCH) * sizeof(row_data)); rows = p->lp_data->rows; for (i = p->base.cutnum - 1; i >= 0; i--){ ( rows[i].cut = (cut_data *) malloc(sizeof(cut_data)) )->coef = NULL; } if (p->base.varnum > 0){ vars = p->lp_data->vars = (var_desc **) malloc(p->base.varnum * sizeof(var_desc *)); for (i = p->base.varnum - 1; i >= 0; i--){ vars[i] = (var_desc *) malloc( sizeof(var_desc) ); vars[i]->userind = p->base.userind[i]; vars[i]->colind = i; } } /* Just to make sure this array is sufficently big */ p->lp_data->not_fixed = (int *) malloc(p->par.not_fixed_storage_size*ISIZE); p->lp_data->tmp.iv = (int *) malloc(p->par.not_fixed_storage_size* 2*ISIZE); p->lp_data->tmp.iv_size = 2*p->par.not_fixed_storage_size; #ifdef COMPILE_IN_CG if (!p->cgp){ p->cgp = (cg_prob *) calloc(1, sizeof(cg_prob)); } cg_initialize(p->cgp, p->master); #endif return(FUNCTION_TERMINATED_NORMALLY); }
int main(void) { int r_bufid = 0, s_bufid = 0; cg_prob *p; int num_cuts = 0; double elapsed; struct timeval tout = {15, 0}; p = (cg_prob *) calloc(1, sizeof(cg_prob)); cg_initialize(p, 0); /*------------------------------------------------------------------------*\ * The main loop -- executes continuously until the program exits \*------------------------------------------------------------------------*/ while (TRUE){ /* Wait until a message arrives */ do{ r_bufid = treceive_msg(ANYONE, ANYTHING, &tout); if (!r_bufid){ if (pstat(p->tree_manager) != PROCESS_OK){ printf("TM has died -- CG exiting\n\n"); exit(-401); } } }while (!r_bufid); if (cg_process_message(p, r_bufid) == USER_ERROR) p->msgtag = USER_ERROR; /* If there is still something in the queue, process it */ do{ r_bufid = nreceive_msg(ANYONE, ANYTHING); if (r_bufid > 0) if (cg_process_message(p, r_bufid) == USER_ERROR) p->msgtag = USER_ERROR; }while (r_bufid != 0); /*--------------------------------------------------------------------- * Now the message queue is empty. If the last message was NOT some * kind of LP_SOLUTION then we can't generate solutions now. * Otherwise, generate solutions! *---------------------------------------------------------------------*/ if (p->msgtag == LP_SOLUTION_NONZEROS || p->msgtag == LP_SOLUTION_USER || p->msgtag == LP_SOLUTION_FRACTIONS){ if (p->par.do_findcuts) if ((termcode = find_cuts_u(p, NULL, &num_cuts)) < 0) printf("Warning: User error detected in cut generator\n\n"); /*-- send signal back to the LP that the cut generator is done -----*/ s_bufid = init_send(DataInPlace); send_int_array(&num_cuts, 1); elapsed = used_time(&p->tt); send_dbl_array(&elapsed, 1); send_int_array(&p->cur_sol.xindex, 1); send_int_array(&p->cur_sol.xiter_num, 1); send_msg(p->cur_sol.lp, NO_MORE_CUTS); freebuf(s_bufid); FREE(p->cur_sol.xind); FREE(p->cur_sol.xval); } } return(0); }