/** destructor of branching rule to free user data (called when SCIP is exiting) */ static SCIP_DECL_BRANCHFREE(branchFreeAllfullstrong) { /*lint --e{715}*/ SCIP_BRANCHRULEDATA* branchruledata; /* free branching rule data */ branchruledata = SCIPbranchruleGetData(branchrule); SCIPfreeMemoryArrayNull(scip, &branchruledata->skipdown); SCIPfreeMemoryArrayNull(scip, &branchruledata->skipup); SCIPfreeMemory(scip, &branchruledata); SCIPbranchruleSetData(branchrule, NULL); return SCIP_OKAY; }
/** reads the objective section */ static SCIP_RETCODE readObjective( SCIP* scip, /**< SCIP data structure */ LPINPUT* lpinput /**< LP reading data */ ) { char name[LP_MAX_LINELEN]; SCIP_VAR** vars; SCIP_Real* coefs; int ncoefs; SCIP_Bool newsection; assert(lpinput != NULL); /* read the objective coefficients */ SCIP_CALL( readCoefficients(scip, lpinput, TRUE, name, &vars, &coefs, &ncoefs, &newsection) ); if( !hasError(lpinput) ) { int i; SCIP_VAR** oldvars; /* set all linear coefficients to 0 */ oldvars = SCIPgetVars(scip); for( i = 0; i < SCIPgetNVars(scip); i++ ) { SCIP_CALL( SCIPchgVarObj(scip, oldvars[i], 0.0) ); } /* set the linear objective values */ for( i = 0; i < ncoefs; ++i ) { SCIP_CALL( SCIPchgVarObj(scip, vars[i], coefs[i]) ); } } /* free memory */ SCIPfreeMemoryArrayNull(scip, &vars); SCIPfreeMemoryArrayNull(scip, &coefs); return SCIP_OKAY; }
/** destructor of variable pricer to free user data (called when SCIP is exiting) */ static SCIP_DECL_PRICERFREE(pricerFreeBinpacking) { SCIP_PRICERDATA* pricerdata; assert(scip != NULL); assert(pricer != NULL); pricerdata = SCIPpricerGetData(pricer); if( pricerdata != NULL) { /* free memory */ SCIPfreeMemoryArrayNull(scip, &pricerdata->conss); SCIPfreeMemoryArrayNull(scip, &pricerdata->weights); SCIPfreeMemoryArrayNull(scip, &pricerdata->ids); SCIPfreeMemory(scip, &pricerdata); } return SCIP_OKAY; }
/** reads the blocks section */ static SCIP_RETCODE readBlock( SCIP* scip, /**< SCIP data structure */ DECINPUT* decinput, /**< DEC reading data */ SCIP_READERDATA* readerdata /**< reader data */ ) { int oldblock; int varidx; int consindex; int i; int blockid; int nvars; SCIP_CONS* cons; SCIP_VAR** vars; SCIP_Bool conshasvar; assert(decinput != NULL); assert(readerdata != NULL); while( getNextToken(decinput) ) { /* check if we reached a new section */ if( isNewSection(scip, decinput) ) break; /* the token must be the name of an existing cons */ cons = SCIPfindCons(scip, decinput->token); if( cons == NULL ) { syntaxError(scip, decinput, "unknown constraint in block section"); break; } conshasvar = FALSE; /* get all vars for the specific constraint */ nvars = SCIPgetNVarsXXX(scip, cons); vars = NULL; if( nvars > 0 ) { SCIP_CALL( SCIPallocMemoryArray(scip, &vars, nvars) ); SCIP_CALL( SCIPgetVarsXXX(scip, cons, vars, nvars) ); } blockid = decinput->blocknr; for( i = 0; i < nvars; i ++ ) { SCIP_VAR* var; assert(vars != NULL); /* for flexelint */ if( decinput->presolved ) { var = SCIPvarGetProbvar(vars[i]); if( !SCIPisVarRelevant(var) ) continue; } else var = vars[i]; conshasvar = TRUE; /* store for each var whether it is in none, one or more blocks */ varidx = SCIPvarGetProbindex(var); assert(varidx >= 0 && varidx < SCIPgetNVars(scip)); oldblock = readerdata->varstoblock[varidx]; assert(oldblock == NOVALUE || oldblock == LINKINGVALUE || (oldblock >= 0 && oldblock < decinput->nblocks)); /* variable was assigned to no block before, just assign it to the new block */ if( oldblock == NOVALUE ) { SCIPdebugMessage("\tVar %s temporary in block %d.\n", SCIPvarGetName(vars[i]), blockid); readerdata->varstoblock[varidx] = blockid; ++(readerdata->nblockvars[blockid]); } /* variable was assigned to another (non-linking) block before, so it becomes a linking variable, now */ else if( (oldblock != LINKINGVALUE) && oldblock != blockid ) { SCIPdebugMessage("\tVar %s is linking (old %d != %d new).\n", SCIPvarGetName(vars[i]), oldblock, blockid); assert(oldblock != blockid); readerdata->varstoblock[varidx] = LINKINGVALUE; /* decrease the value again if it is a linking var */ --(readerdata->nblockvars[oldblock]); ++(readerdata->nlinkingvars); } } SCIPfreeMemoryArrayNull(scip, &vars); if( !conshasvar ) { assert(!SCIPhashmapExists(readerdata->constoblock, cons)); SCIPwarningMessage(scip, "Cons <%s> has been deleted by presolving, skipping.\n", SCIPconsGetName(cons)); continue; } /* * saving block <-> constraint */ /** @todo check if linking constraints are not in the subscipcons */ consindex = readerdata->nblockconss[blockid]; readerdata->blockconss[blockid][consindex] = cons; ++(readerdata->nblockconss[blockid]); assert(SCIPhashmapGetImage(readerdata->constoblock, cons) == (void*)(size_t) LINKINGVALUE); SCIPdebugMessage("cons %s is in block %d\n", SCIPconsGetName(cons), blockid); SCIP_CALL( SCIPhashmapSetImage(readerdata->constoblock, cons, (void*) ((size_t) blockid)) ); --(readerdata->nlinkingconss); } return SCIP_OKAY; }