/** transforms given values of the given original variables into values of the given master variables */ void GCGrelaxTransformOrigvalsToMastervals( SCIP* scip, /**< SCIP data structure */ SCIP_VAR** origvars, /**< array with (subset of the) original variables */ SCIP_Real* origvals, /**< array with values (coefs) for the given original variables */ int norigvars, /**< number of given original variables */ SCIP_VAR** mastervars, /**< array of (all present) master variables */ SCIP_Real* mastervals, /**< array to store the values of the master variables */ int nmastervars /**< number of master variables */ ) { int i; int j; int k; assert(scip != NULL); assert(origvars != NULL); assert(origvals != NULL); assert(mastervars != NULL); assert(mastervals != NULL); assert(nmastervars >= 0); /* set all values to 0 initially */ for( i = 0; i < nmastervars; i++ ) mastervals[i] = 0.0; /* iterate over all original variables */ for( i = 0; i < norigvars; i++ ) { SCIP_VAR** varmastervars; SCIP_Real* varmastervals; int blocknr; assert(GCGvarIsOriginal(origvars[i])); varmastervars = GCGoriginalVarGetMastervars(origvars[i]); varmastervals = GCGoriginalVarGetMastervals(origvars[i]); blocknr = GCGvarGetBlock(origvars[i]); /* variable belongs to no block (or is a linking variable), so it was transferred directly to the master problem, * hence, we transfer the value directly to the corresponding master variabe */ if( blocknr < 0 ) { assert(blocknr == -1 || blocknr == -2); assert(SCIPvarIsOriginal(varmastervars[0])); assert(SCIPvarGetTransVar(varmastervars[0]) != NULL); for( k = 0; k < nmastervars; k++ ) { if( mastervars[k] == SCIPvarGetTransVar(varmastervars[0]) ) { mastervals[k] += (varmastervals[0] * origvals[i]); break; } } assert(k < nmastervars); } /* variable belongs to exactly one block, so we have to look at all master variables and increase their values * if they contain the original variable */ else { SCIP_VAR* pricingvar; SCIP_VAR* origvar; SCIP_VAR** curmastervars; SCIP_Real* curmastervals; int ncurmastervars; pricingvar = GCGoriginalVarGetPricingVar(origvars[i]); assert(GCGvarIsPricing(pricingvar)); origvar = GCGpricingVarGetOriginalVar(pricingvar); assert(GCGvarIsOriginal(origvar)); curmastervars = GCGoriginalVarGetMastervars(origvar); curmastervals = GCGoriginalVarGetMastervals(origvar); ncurmastervars = GCGoriginalVarGetNMastervars(origvar); for( j = 0; j < ncurmastervars; j++ ) { assert(SCIPvarIsTransformed(curmastervars[j])); for( k = 0; k < nmastervars; k++ ) if( mastervars[k] == curmastervars[j] ) { mastervals[k] += (curmastervals[j] * origvals[i]); break; } assert(k < nmastervars); } } } }
/** gets value of given variable in debugging solution */ static SCIP_RETCODE getSolutionValue( SCIP_SET* set, /**< global SCIP settings */ SCIP_VAR* var, /**< variable to get solution value for */ SCIP_Real* val /**< pointer to store solution value */ ) { SCIP_VAR* solvar; SCIP_Real scalar; SCIP_Real constant; const char* name; int left; int right; int middle; int cmp; assert(set != NULL); assert(var != NULL); assert(val != NULL); SCIP_CALL( readSolution(set) ); SCIPdebugMessage("Now handling variable <%s>, which has status %d, is of type %d, and was deleted: %d, negated: %d, transformed: %d\n", SCIPvarGetName(var), SCIPvarGetStatus(var), SCIPvarGetType(var), SCIPvarIsDeleted(var), SCIPvarIsNegated(var),SCIPvarIsTransformedOrigvar(var)); /* ignore deleted variables */ if( SCIPvarIsDeleted(var) ) { SCIPdebugMessage("**** unknown solution value for deleted variable <%s>\n", SCIPvarGetName(var)); *val = SCIP_UNKNOWN; return SCIP_OKAY; } /* retransform variable onto original variable space */ solvar = var; scalar = 1.0; constant = 0.0; if( SCIPvarIsNegated(solvar) ) { scalar = -1.0; constant = SCIPvarGetNegationConstant(solvar); solvar = SCIPvarGetNegationVar(solvar); } if( SCIPvarIsTransformed(solvar) ) { SCIP_CALL( SCIPvarGetOrigvarSum(&solvar, &scalar, &constant) ); if( solvar == NULL ) { /* if no original counterpart, then maybe someone added a value for the transformed variable, so search for var (or its negation) */ SCIPdebugMessage("variable <%s> has no original counterpart\n", SCIPvarGetName(var)); solvar = var; scalar = 1.0; constant = 0.0; if( SCIPvarIsNegated(solvar) ) { scalar = -1.0; constant = SCIPvarGetNegationConstant(solvar); solvar = SCIPvarGetNegationVar(solvar); } } } /* perform a binary search for the variable */ name = SCIPvarGetName(solvar); left = 0; right = nsolvals-1; while( left <= right ) { middle = (left+right)/2; cmp = strcmp(name, solnames[middle]); if( cmp < 0 ) right = middle-1; else if( cmp > 0 ) left = middle+1; else { *val = scalar * solvals[middle] + constant; return SCIP_OKAY; } } *val = constant; if( *val < SCIPvarGetLbGlobal(var) - 1e-06 || *val > SCIPvarGetUbGlobal(var) + 1e-06 ) { SCIPwarningMessage("invalid solution value %.15g for variable <%s>[%.15g,%.15g]\n", *val, SCIPvarGetName(var), SCIPvarGetLbGlobal(var), SCIPvarGetUbGlobal(var)); } return SCIP_OKAY; }