bool solve_mip(MyData *node1, struct MyData *node2) { glp_prob *mip; int ia[1+4], ja[1+4]; double ar[1+4], z, x1, x2, size1, size2; bool res = false; mip = glp_create_prob(); glp_set_prob_name(mip, "overlap"); glp_set_obj_dir(mip, GLP_MIN); glp_add_rows(mip, 1); glp_set_row_name(mip, 1, "c0"); long int diff = node1->start - node2->start; glp_set_row_bnds(mip, 1, GLP_FX, -1 * diff, -1 * diff); glp_add_cols(mip, 4); glp_set_col_name(mip, 1, "x1"); glp_set_col_bnds(mip, 1, GLP_DB, 0.0, node1->count); glp_set_obj_coef(mip, 1, node1->diff); glp_set_col_kind(mip, 1, GLP_IV); glp_set_col_name(mip, 2, "x2"); glp_set_col_bnds(mip, 2, GLP_DB, 0.0, node2->count); glp_set_obj_coef(mip, 2, node2->diff); glp_set_col_kind(mip, 2, GLP_IV); glp_set_col_name(mip, 3, "size1"); glp_set_col_bnds(mip, 3, GLP_DB, 0.0, (1 << (node1->size_type >> 4)) - 1); glp_set_col_kind(mip, 3, GLP_IV); glp_set_col_name(mip, 4, "size2"); glp_set_col_bnds(mip, 4, GLP_DB, 0.0, (1 << (node2->size_type >> 4)) - 1); glp_set_col_kind(mip, 4, GLP_IV); ia[1] = 1, ja[1] = 1, ar[1] = node1->diff; ia[2] = 1, ja[2] = 2, ar[2] = node2->diff; ar[2] *= -1; ia[3] = 1, ja[3] = 3, ar[3] = 1.0; ia[4] = 1, ja[4] = 4, ar[4] = -1.0; glp_load_matrix(mip, 4, ia, ja, ar); std::string filename = "ilp_problem" + std::to_string(rand()) + ".lp"; glp_iocp parm; glp_init_iocp(&parm); parm.presolve = GLP_ON; glp_term_out(GLP_OFF); glp_intopt(mip, &parm); int ret = glp_mip_status(mip); if(ret != GLP_NOFEAS) res = true; glp_delete_prob(mip); glp_free_env(); return res; }