From da964ae8a60f3fdfd6e11283cfdcd7de396f77f3 Mon Sep 17 00:00:00 2001 From: Federico Battista Date: Sat, 6 Apr 2024 10:20:39 -0400 Subject: [PATCH] Fix cstat and rstat arrays in select_branching_object() cstat and rstat were initialized with tmp arrays in LPData and were occasionally overwritten during strong branching. Two fields have been added to LPData struct so that they are resized/freed similarly to other structures. --- include/sym_lp_solver.h | 3 +++ src/LP/lp_branch.c | 5 +++-- src/LP/lp_solver.c | 37 ++++++++++++++++++++++++++----------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/include/sym_lp_solver.h b/include/sym_lp_solver.h index 6f1432cd..be6d3a85 100644 --- a/include/sym_lp_solver.h +++ b/include/sym_lp_solver.h @@ -229,6 +229,9 @@ typedef struct LPDATA{ cgl_params cgl; int *frac_var_cnt; + // feb223 + int *cstat; /* to be used in branching to save the basis */ + int *rstat; }LPdata; diff --git a/src/LP/lp_branch.c b/src/LP/lp_branch.c index 5f455c25..72c77680 100644 --- a/src/LP/lp_branch.c +++ b/src/LP/lp_branch.c @@ -250,8 +250,9 @@ int select_branching_object(lp_prob *p, int *cuts, branch_obj **candidate) st_time = used_time(&total_time); total_iters = 0; - int *cstat = lp_data->tmp.i1; - int *rstat = lp_data->tmp.i2; + + int *cstat = lp_data->cstat; //lp_data->tmp.i1; + int *rstat = lp_data->rstat; //lp_data->tmp.i2; get_basis(lp_data, cstat, rstat); diff --git a/src/LP/lp_solver.c b/src/LP/lp_solver.c index 8a7394f6..85f3bd3a 100644 --- a/src/LP/lp_solver.c +++ b/src/LP/lp_solver.c @@ -58,6 +58,10 @@ void free_lp_arrays(LPdata *lp_data) //Anahita FREE(lp_data->raysol); FREE(lp_data->slacks); + // feb223 + FREE(lp_data->cstat); + FREE(lp_data->rstat); + FREE(lp_data->random_hash); FREE(lp_data->hashes); FREE(lp_data->accepted_ind); @@ -192,21 +196,26 @@ void size_lp_arrays(LPdata *lp_data, char do_realloc, char set_max, if (! do_realloc){ FREE(lp_data->dualsol); lp_data->dualsol = (double *) malloc(lp_data->maxm * DSIZE); - //Anahita + //Anahita FREE(lp_data->raysol); lp_data->raysol = (double *) malloc(lp_data->maxm * DSIZE); - // - FREE(lp_data->slacks); - lp_data->slacks = (double *) malloc(lp_data->maxm * DSIZE); + + FREE(lp_data->slacks); + lp_data->slacks = (double *) malloc(lp_data->maxm * DSIZE); + FREE(lp_data->rstat); + lp_data->rstat = (int *)malloc((lp_data->maxm) * ISIZE); }else{ lp_data->dualsol = (double *) realloc((char *)lp_data->dualsol, lp_data->maxm * DSIZE); - //Anahita - lp_data->raysol = (double *) realloc((char *)lp_data->raysol, - lp_data->maxm * DSIZE); - // - lp_data->slacks = (double *) realloc((void *)lp_data->slacks, - lp_data->maxm * DSIZE); + //Anahita + lp_data->raysol = (double *) realloc((char *)lp_data->raysol, + lp_data->maxm * DSIZE); + // + lp_data->slacks = (double *) realloc((void *)lp_data->slacks, + lp_data->maxm * DSIZE); + // feb223 + lp_data->rstat = (int *)realloc((void *)lp_data->rstat, + (lp_data->maxm) * ISIZE); } /* rows is realloc'd in either case just to keep the base constr */ lp_data->rows = (row_data *) realloc((char *)lp_data->rows, @@ -228,7 +237,10 @@ void size_lp_arrays(LPdata *lp_data, char do_realloc, char set_max, FREE(lp_data->heur_solution); lp_data->heur_solution = (double *) malloc(lp_data->maxn * DSIZE); FREE(lp_data->col_solution); - lp_data->col_solution = (double *) malloc(lp_data->maxn * DSIZE); + lp_data->col_solution = (double *)malloc(lp_data->maxn * DSIZE); + // feb223 + FREE(lp_data->cstat); + lp_data->cstat = (int *)malloc((lp_data->maxn) * ISIZE); #ifdef __CPLEX__ FREE(lp_data->lb); lp_data->lb = (double *) malloc(lp_data->maxn * DSIZE); @@ -248,6 +260,9 @@ void size_lp_arrays(LPdata *lp_data, char do_realloc, char set_max, lp_data->heur_solution, lp_data->maxn * DSIZE); lp_data->col_solution = (double *) realloc((char *) lp_data->col_solution, lp_data->maxn * DSIZE); + // feb223 + lp_data->cstat = (int *)realloc((void *)lp_data->cstat, + (lp_data->maxn) * ISIZE); #ifdef __CPLEX__ lp_data->lb = (double *) realloc((char *)lp_data->lb, lp_data->maxn * DSIZE);