/** create a vardata */ static SCIP_RETCODE vardataCreate( SCIP* scip, /**< SCIP data structure */ SCIP_VARDATA** vardata, /**< pointer to vardata */ int* consids, /**< array of constraints ids */ int nconsids, /**< number of constraints */ int* oriFlowVars, int nOriFlowVars ) { SCIP_CALL( SCIPallocBlockMemory(scip, vardata) ); SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(*vardata)->consids, consids, nconsids) ); SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(*vardata)->oriFlowVars, oriFlowVars, nOriFlowVars) ); SCIPsortInt((*vardata)->consids, nconsids); (*vardata)->nconsids = nconsids; (*vardata)->nOriFlowVars = nOriFlowVars; return SCIP_OKAY; }
/** creates disjunction constraint data, captures initial constraints of disjunction */ static SCIP_RETCODE consdataCreate( SCIP* scip, /**< SCIP data structure */ SCIP_CONSDATA** consdata, /**< pointer to constraint data */ SCIP_CONS** conss, /**< initial constraint in disjunction */ int nconss /**< number of initial constraints in disjunction */ ) { assert(scip != NULL); assert(consdata != NULL); SCIP_CALL( SCIPallocBlockMemory(scip, consdata) ); if( nconss > 0 ) { assert(conss != NULL); SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(*consdata)->conss, conss, nconss) ); (*consdata)->consssize = nconss; (*consdata)->nconss = nconss; /* we need to capture the constraints to avoid that SCIP deletes them since they are not (yet) added to the * problem */ if( SCIPisTransformed(scip) ) { SCIP_CALL( SCIPtransformConss(scip, nconss, (*consdata)->conss, (*consdata)->conss) ); } else { int c; for( c = 0; c < nconss; ++c ) { assert(conss[c] != NULL); SCIP_CALL( SCIPcaptureCons(scip, conss[c]) ); } } } else { (*consdata)->conss = NULL; (*consdata)->consssize = 0; (*consdata)->nconss = 0; } return SCIP_OKAY; }
/** pass partial solution for indicator variables to heuristic */ SCIP_RETCODE SCIPheurPassIndicator( SCIP* scip, /**< SCIP data structure */ SCIP_HEUR* heur, /**< indicator heuristic */ int nindconss, /**< number of indicator constraints */ SCIP_CONS** indconss, /**< indicator constraints */ SCIP_Bool* solcand /**< values for indicator variables in partial solution */ ) { SCIP_HEURDATA* heurdata; assert( scip != NULL ); assert( heur != NULL ); assert( strcmp(SCIPheurGetName(heur), HEUR_NAME) == 0 ); assert( nindconss > 0 ); assert( indconss != NULL ); assert( solcand != NULL ); /* get heuristic's data */ heurdata = SCIPheurGetData(heur); assert( heurdata != NULL ); /* copy indicator information */ if ( heurdata->indconss != NULL ) SCIPfreeBlockMemoryArray(scip, &(heurdata->indconss), heurdata->nindconss); SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(heurdata->indconss), indconss, nindconss) ); heurdata->nindconss = nindconss; /* copy partial solution */ if ( heurdata->solcand != NULL ) BMScopyMemoryArray(heurdata->solcand, solcand, nindconss); else SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(heurdata->solcand), solcand, nindconss) ); return SCIP_OKAY; }
/** creates conjunction constraint data, captures initial constraints of conjunction */ static SCIP_RETCODE consdataCreate( SCIP* scip, /**< SCIP data structure */ SCIP_CONSDATA** consdata, /**< pointer to constraint data */ SCIP_CONS** conss, /**< initial constraint in conjunction */ int nconss /**< number of initial constraints in conjunction */ ) { assert(consdata != NULL); SCIP_CALL( SCIPallocBlockMemory(scip, consdata) ); if( nconss > 0 ) { SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(*consdata)->conss, conss, nconss) ); (*consdata)->consssize = nconss; (*consdata)->nconss = nconss; if( SCIPisTransformed(scip) ) { SCIP_CALL( SCIPtransformConss(scip, nconss, (*consdata)->conss, (*consdata)->conss) ); } else { int c; for( c = 0; c < nconss; ++c ) { SCIP_CALL( SCIPcaptureCons(scip, conss[c]) ); } } } else { (*consdata)->conss = NULL; (*consdata)->consssize = 0; (*consdata)->nconss = 0; } return SCIP_OKAY; }