43 #include "scip/cons_linear.h"
45 #define STARTMAXMASTERVARS 8
46 #define STARTMAXORIGVARS 1
56 if( *vardata == NULL )
62 if( (*vardata)->blocknr == -2 )
69 assert((*vardata)->data.origvardata.linkingvardata != NULL);
70 if( (*vardata)->data.origvardata.linkingvardata->linkconss != NULL )
73 assert((*vardata)->data.origvardata.linkingvardata->pricingvars != NULL);
75 for( i = 0; i < nblocks; i++ )
77 assert(((*vardata)->data.origvardata.linkingvardata->linkconss[i] == NULL)
78 == ((*vardata)->data.origvardata.linkingvardata->pricingvars[i] == NULL));
81 SCIPfreeBlockMemoryArray(scip, &((*vardata)->data.origvardata.linkingvardata->linkconss), nblocks);
82 SCIPfreeBlockMemoryArray(scip, &((*vardata)->data.origvardata.linkingvardata->pricingvars), nblocks);
84 else if( (*vardata)->data.origvardata.linkingvardata->pricingvars != NULL )
85 SCIPfreeBlockMemoryArray(scip, &((*vardata)->data.origvardata.linkingvardata->pricingvars), nblocks);
87 SCIPfreeBlockMemory(scip, &((*vardata)->data.origvardata.linkingvardata));
88 (*vardata)->data.origvardata.linkingvardata = NULL;
90 assert((*vardata)->data.origvardata.linkingvardata == NULL);
91 assert((*vardata)->data.origvardata.mastervars != NULL);
92 assert((*vardata)->data.origvardata.mastervals != NULL);
93 SCIPfreeBlockMemoryArrayNull(scip, &((*vardata)->data.origvardata.mastervars), (*vardata)->data.origvardata.maxmastervars);
94 SCIPfreeBlockMemoryArrayNull(scip, &((*vardata)->data.origvardata.mastervals), (*vardata)->data.origvardata.maxmastervars);
96 if( (*vardata)->data.origvardata.ncoefs > 0 )
98 assert((*vardata)->data.origvardata.coefs != NULL);
99 assert((*vardata)->data.origvardata.masterconss != NULL);
100 SCIPfreeBlockMemoryArrayNull(scip, &((*vardata)->data.origvardata.coefs), (*vardata)->data.origvardata.ncoefs);
101 SCIPfreeBlockMemoryArrayNull(scip, &((*vardata)->data.origvardata.masterconss), (*vardata)->data.origvardata.ncoefs);
106 assert((*vardata)->data.pricingvardata.norigvars >= 1);
107 SCIPfreeBlockMemoryArray(scip, &((*vardata)->data.pricingvardata.origvars), (*vardata)->data.pricingvardata.maxorigvars);
110 SCIPfreeBlockMemory(scip, vardata);
122 SCIPfreeBlockMemoryArrayNull(scip, &((*vardata)->data.mastervardata.origvals), (*vardata)->data.mastervardata.maxorigvars);
123 SCIPfreeBlockMemoryArrayNull(scip, &((*vardata)->data.mastervardata.origvars), (*vardata)->data.mastervardata.maxorigvars);
124 SCIPhashmapFree(&((*vardata)->data.mastervardata.origvar2val));
126 SCIPfreeBlockMemory(scip, vardata);
138 SCIP_VARDATA* vardata;
141 vardata = SCIPvarGetData(var);
142 if( vardata == NULL )
154 SCIP_VARDATA* vardata;
157 vardata = SCIPvarGetData(var);
158 assert(vardata != NULL);
170 SCIP_VARDATA* vardata;
173 vardata = SCIPvarGetData(var);
174 assert(vardata != NULL);
186 SCIP_VARDATA* vardata;
190 vardata = SCIPvarGetData(var);
191 assert(vardata != NULL);
193 return vardata->blocknr == -2;
203 SCIP_VARDATA* vardata;
207 vardata = SCIPvarGetData(var);
208 assert(vardata != NULL);
210 return vardata->blocknr == -1;
220 SCIP_VARDATA* vardata;
224 vardata = SCIPvarGetData(var);
225 assert(vardata != NULL);
226 assert(vardata->data.origvardata.linkingvardata == NULL);
228 if( vardata->data.origvardata.pricingvar != NULL )
230 return vardata->data.origvardata.pricingvar;
240 SCIP_VARDATA* vardata;
242 assert(pricingvar != NULL);
246 vardata = SCIPvarGetData(var);
247 assert(vardata != NULL);
249 assert(vardata->data.origvardata.linkingvardata == NULL);
251 vardata->data.origvardata.pricingvar = pricingvar;
263 assert(scip != NULL);
265 vars = SCIPgetOrigVars(scip);
266 nvars = SCIPgetNOrigVars(scip);
269 for( i = 0; i < nvars; i++ )
271 assert(vars[i] != NULL);
287 assert(scip != NULL);
289 vars = SCIPgetOrigVars(scip);
290 nvars = SCIPgetNOrigVars(scip);
293 for( i = 0; i < nvars; i++ )
296 assert(vars[i] != NULL);
299 if( SCIPvarGetData(var) != NULL )
301 SCIP_VARDATA* oldvardata;
302 oldvardata = SCIPvarGetData(var);
304 SCIP_CALL( GCGvarDelOrig(scip, var, &oldvardata) );
305 SCIPvarSetData(var, NULL);
318 SCIP_VARDATA* vardata;
320 assert(scip != NULL);
322 assert(SCIPvarIsOriginal(var) || SCIPvarGetStatus(var) == SCIP_VARSTATUS_LOOSE);
324 SCIP_CALL( SCIPallocBlockMemory(scip, &vardata) );
326 vardata->blocknr = -1;
327 vardata->data.origvardata.pricingvar = NULL;
328 vardata->data.origvardata.coefs = NULL;
329 vardata->data.origvardata.masterconss = NULL;
330 vardata->data.origvardata.ncoefs = 0;
331 vardata->data.origvardata.nmastervars = 0;
332 vardata->data.origvardata.maxmastervars = SCIPcalcMemGrowSize(scip,
STARTMAXMASTERVARS);
333 vardata->data.origvardata.linkingvardata = NULL;
334 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(vardata->data.origvardata.mastervars),
335 vardata->data.origvardata.maxmastervars) );
336 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(vardata->data.origvardata.mastervals),
337 vardata->data.origvardata.maxmastervars) );
339 if( SCIPvarGetData(var) != NULL )
341 SCIP_VARDATA* oldvardata;
342 oldvardata = SCIPvarGetData(var);
344 SCIP_CALL( GCGvarDelOrig(scip, var, &oldvardata) );
346 SCIPvarSetData(var, vardata);
347 if( SCIPvarIsOriginal(var) )
349 SCIPvarSetDelorigData(var, GCGvarDelOrig);
350 if( SCIPvarGetTransVar(var) != NULL )
352 SCIPvarSetData(SCIPvarGetProbvar(SCIPvarGetTransVar(var)), vardata);
357 assert(SCIPvarIsTransformedOrigvar(var));
358 SCIPvarSetDeltransData(var, GCGvarDelOrig);
369 SCIP_VAR* pricingvar,
373 SCIP_VARDATA* targetvardata;
375 assert(pricingvar != NULL);
376 assert(mastervar != NULL);
383 SCIP_CALL( SCIPallocBlockMemory(scip, &targetvardata) );
385 targetvardata->blocknr = -1;
386 targetvardata->data.mastervardata.isray = FALSE;
387 targetvardata->data.mastervardata.isartificial = FALSE;
388 targetvardata->data.mastervardata.norigvars = 1;
389 targetvardata->data.mastervardata.maxorigvars = 1;
390 targetvardata->data.mastervardata.index = -1;
394 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(targetvardata->data.mastervardata.origvars), 1) );
395 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(targetvardata->data.mastervardata.origvals), 1) );
396 SCIP_CALL( SCIPhashmapCreate(&(targetvardata->data.mastervardata.origvar2val), SCIPblkmem(scip), 1));
397 targetvardata->data.mastervardata.origvars[0] = origvar;
398 targetvardata->data.mastervardata.origvals[0] = 1.0;
399 SCIPhashmapInsertReal(targetvardata->data.mastervardata.origvar2val, origvar, 1.0);
401 SCIPvarSetData(mastervar, targetvardata);
402 SCIPvarSetDeltransData(mastervar, gcgvardeltrans);
413 SCIP_VARDATA* vardata;
417 vardata = SCIPvarGetData(var);
418 assert(vardata != NULL);
419 assert(vardata->data.origvardata.linkingvardata != NULL);
420 assert(vardata->data.origvardata.linkingvardata->pricingvars != NULL);
422 return vardata->data.origvardata.linkingvardata->pricingvars;
433 SCIP_VARDATA* vardata;
434 assert(origvar != NULL);
436 assert(pricingprobnr >= 0);
441 vardata = SCIPvarGetData(origvar);
442 assert(vardata != NULL);
443 assert(vardata->data.origvardata.linkingvardata != NULL);
444 assert(vardata->data.origvardata.linkingvardata->pricingvars != NULL);
446 vardata->data.origvardata.linkingvardata->pricingvars[pricingprobnr] = var;
456 SCIP_VARDATA* vardata;
461 assert(nblocks == 0 || blocks != NULL);
464 vardata = SCIPvarGetData(var);
465 assert(vardata != NULL);
466 assert(vardata->data.origvardata.linkingvardata != NULL);
467 assert(vardata->data.origvardata.linkingvardata->nblocks > 0);
470 if( nblocks < vardata->data.origvardata.linkingvardata->nblocks )
472 SCIPerrorMessage(
"array too small to store all block numbers!\n");
473 return SCIP_INVALIDDATA;
475 assert(nblocks >= vardata->data.origvardata.linkingvardata->nblocks);
479 for( i = 0; i < vardata->data.origvardata.linkingvardata->nblocks; ++i )
484 while ( vardata->data.origvardata.linkingvardata->pricingvars[j] == NULL );
497 SCIP_VARDATA* vardata;
501 vardata = SCIPvarGetData(var);
502 assert(vardata != NULL);
503 assert(vardata->data.origvardata.linkingvardata != NULL);
504 assert(vardata->data.origvardata.linkingvardata->nblocks > 0);
505 return vardata->data.origvardata.linkingvardata->nblocks;
515 SCIP_VARDATA* vardata;
519 vardata = SCIPvarGetData(var);
520 assert(vardata != NULL);
521 assert(vardata->data.pricingvardata.norigvars >= 0);
522 assert(vardata->data.pricingvardata.origvars != NULL);
523 assert(vardata->data.pricingvardata.origvars[0] != NULL);
524 assert(vardata->blocknr >= 0);
526 return vardata->data.pricingvardata.origvars[0];
533 SCIP_VAR* pricingvar,
537 SCIP_VARDATA* vardata;
538 assert(pricingvar != NULL);
539 assert(origvar != NULL);
543 vardata = SCIPvarGetData(pricingvar);
544 assert(vardata != NULL);
545 assert(vardata->data.pricingvardata.norigvars >= 0);
546 assert(vardata->data.pricingvardata.origvars != NULL);
547 assert(vardata->data.pricingvardata.origvars[0] != NULL);
548 assert(vardata->blocknr >= 0);
551 if( vardata->data.pricingvardata.maxorigvars == vardata->data.pricingvardata.norigvars )
553 int newsize = SCIPcalcMemGrowSize(scip, vardata->data.pricingvardata.norigvars+1);
554 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(vardata->data.pricingvardata.origvars), vardata->data.pricingvardata.maxorigvars,
556 SCIPdebugMessage(
"origvars array of var %s resized from %d to %d\n", SCIPvarGetName(origvar),
557 vardata->data.pricingvardata.maxorigvars, newsize);
558 vardata->data.pricingvardata.maxorigvars = newsize;
561 vardata->data.pricingvardata.origvars[vardata->data.pricingvardata.norigvars] = origvar;
562 vardata->data.pricingvardata.norigvars++;
573 SCIP_VARDATA* vardata;
577 vardata = SCIPvarGetData(var);
578 assert(vardata != NULL);
579 assert(vardata->data.origvardata.nmastervars >= 0);
581 return vardata->data.origvardata.nmastervars;
591 SCIP_VARDATA* vardata;
595 vardata = SCIPvarGetData(var);
596 assert(vardata != NULL);
598 assert(vardata->data.origvardata.mastervars != NULL);
599 return vardata->data.origvardata.mastervars;
609 SCIP_VARDATA* vardata;
613 vardata = SCIPvarGetData(var);
614 assert(vardata != NULL);
616 assert(vardata->data.origvardata.mastervals != NULL);
617 return vardata->data.origvardata.mastervals;
627 SCIP_VARDATA* vardata;
631 vardata = SCIPvarGetData(var);
632 assert(vardata != NULL);
634 assert(vardata->data.origvardata.coefs != NULL || vardata->data.origvardata.ncoefs == 0 );
635 return vardata->data.origvardata.coefs;
645 SCIP_VARDATA* vardata;
649 vardata = SCIPvarGetData(var);
650 assert(vardata != NULL);
652 assert(vardata->data.origvardata.coefs != NULL || vardata->data.origvardata.ncoefs == 0 );
653 return vardata->data.origvardata.ncoefs;
663 SCIP_VARDATA* vardata;
668 vardata = SCIPvarGetData(var);
669 assert(vardata != NULL);
671 assert(vardata->data.origvardata.coefs != NULL || vardata->data.origvardata.ncoefs == 0 );
673 assert(vardata->data.origvardata.coefs == NULL);
675 vardata->data.origvardata.ncoefs = ncoefs;
686 SCIP_VARDATA* vardata;
687 assert(scip != NULL);
689 assert(!SCIPisZero(scip, val));
690 assert(cons != NULL);
692 vardata = SCIPvarGetData(var);
693 assert(vardata != NULL);
695 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(vardata->data.origvardata.coefs), (
size_t)vardata->data.origvardata.ncoefs, (
size_t)vardata->data.origvardata.ncoefs+1) );
696 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(vardata->data.origvardata.masterconss), (
size_t)vardata->data.origvardata.ncoefs, (
size_t)vardata->data.origvardata.ncoefs+1) );
698 assert(vardata->data.origvardata.coefs != NULL);
699 assert(vardata->data.origvardata.masterconss != NULL);
701 vardata->data.origvardata.coefs[vardata->data.origvardata.ncoefs] = val;
702 vardata->data.origvardata.masterconss[vardata->data.origvardata.ncoefs] = cons;
703 vardata->data.origvardata.ncoefs++;
714 SCIP_VARDATA* vardata;
718 vardata = SCIPvarGetData(var);
719 assert(vardata != NULL);
721 return vardata->data.origvardata.masterconss;
734 SCIP_VARDATA* vardata;
736 assert(scip != NULL);
740 vardata = SCIPvarGetData(var);
741 assert(vardata != NULL);
743 assert(nblocks >= 0);
744 assert((newblock >= 0 && newblock < nblocks)
747 assert(newblock >= 0 || (newblock == -2 && blocknr > -1));
751 SCIP_CALL( SCIPallocBlockMemory(scip, &vardata->data.origvardata.linkingvardata) );
752 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vardata->data.origvardata.linkingvardata->pricingvars, nblocks) );
753 BMSclearMemoryArray(vardata->data.origvardata.linkingvardata->pricingvars, nblocks);
757 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vardata->data.origvardata.linkingvardata->linkconss, nblocks) );
758 BMSclearMemoryArray(vardata->data.origvardata.linkingvardata->linkconss, nblocks);
761 vardata->data.origvardata.linkingvardata->linkconss = NULL;
764 vardata->data.origvardata.linkingvardata->pricingvars[blocknr] = var;
765 vardata->data.origvardata.linkingvardata->nblocks = 1;
767 vardata->blocknr = -2;
775 if( newblock >= 0 && vardata->data.origvardata.linkingvardata->pricingvars[newblock] == NULL )
777 assert(mode ==
DEC_DECMODE_BENDERS || vardata->data.origvardata.linkingvardata->linkconss[newblock] == NULL);
778 vardata->data.origvardata.linkingvardata->pricingvars[newblock] = var;
779 vardata->data.origvardata.linkingvardata->nblocks++;
781 assert(vardata->data.origvardata.linkingvardata->nblocks <= nblocks);
791 SCIP_VARDATA* vardata;
796 vardata = SCIPvarGetData(var);
797 assert(vardata != NULL);
799 assert(vardata->data.origvardata.linkingvardata != NULL);
801 return vardata->data.origvardata.linkingvardata->linkconss;
812 SCIP_VARDATA* vardata;
814 assert(cons != NULL);
819 vardata = SCIPvarGetData(var);
820 assert(vardata != NULL);
822 assert(vardata->data.origvardata.linkingvardata != NULL);
823 assert(vardata->data.origvardata.linkingvardata->linkconss != NULL);
824 vardata->data.origvardata.linkingvardata->linkconss[index] = cons;
856 SCIP_VARDATA* vardata;
860 vardata = SCIPvarGetData(var);
861 assert(vardata != NULL);
863 return vardata->data.mastervardata.isray;
873 SCIP_VARDATA* vardata;
877 vardata = SCIPvarGetData(var);
878 assert(vardata != NULL);
880 return vardata->data.mastervardata.isartificial;
890 SCIP_VARDATA* vardata;
894 vardata = SCIPvarGetData(var);
895 assert(vardata != NULL);
897 assert(vardata->data.mastervardata.norigvars >= 0);
898 assert(vardata->data.mastervardata.origvars != NULL || vardata->data.mastervardata.norigvars == 0);
899 assert(vardata->data.mastervardata.origvals != NULL || vardata->data.mastervardata.norigvars == 0);
902 return vardata->data.mastervardata.norigvars;
912 SCIP_VARDATA* vardata;
916 vardata = SCIPvarGetData(var);
917 assert(vardata != NULL);
919 assert(vardata->data.mastervardata.origvars != NULL || vardata->data.mastervardata.norigvars == 0);
926 return vardata->data.mastervardata.origvars;
936 SCIP_VARDATA* vardata;
940 vardata = SCIPvarGetData(var);
941 assert(vardata != NULL);
943 assert(vardata->data.mastervardata.origvals != NULL || vardata->data.mastervardata.norigvars == 0);
944 return vardata->data.mastervardata.origvals;
954 SCIP_VARDATA* vardata;
956 assert(mastervar != NULL);
959 vardata = SCIPvarGetData(mastervar);
960 assert(vardata != NULL);
962 assert(vardata->data.mastervardata.origvar2val != NULL || vardata->data.mastervardata.norigvars == 0);
964 if( vardata->data.mastervardata.origvar2val == NULL )
974 origval = SCIPhashmapGetImageReal(vardata->data.mastervardata.origvar2val, origvar);
975 return origval == SCIP_INVALID ? 0.0 : origval;
983 SCIP_VARDATA* vardata;
987 vardata = SCIPvarGetData(var);
988 assert(vardata != NULL);
990 assert(vardata->data.mastervardata.origvar2val != NULL || vardata->data.mastervardata.norigvars == 0);
991 return vardata->data.mastervardata.origvar2val;
1001 SCIP_VARDATA* vardata;
1002 assert(var != NULL);
1005 vardata = SCIPvarGetData(var);
1006 assert(vardata != NULL);
1008 assert(vardata->data.pricingvardata.norigvars >= 0);
1009 return vardata->data.pricingvardata.norigvars;
1019 SCIP_VARDATA* vardata;
1020 assert(var != NULL);
1023 vardata = SCIPvarGetData(var);
1024 assert(vardata != NULL);
1026 assert(vardata->data.pricingvardata.origvars != NULL);
1027 return vardata->data.pricingvardata.origvars;
1037 SCIP_VARDATA* vardata;
1038 assert(var != NULL);
1039 vardata = SCIPvarGetData(var);
1040 assert(vardata != NULL);
1042 assert(vardata->blocknr >= -2);
1043 return vardata->blocknr;
1053 SCIP_VARDATA* vardata;
1054 assert(var != NULL);
1055 assert(block >= -1);
1057 vardata = SCIPvarGetData(var);
1058 assert(vardata != NULL);
1059 vardata->blocknr = block;
1069 SCIP_VAR** pricingvars;
1071 assert(var != NULL);
1079 return pricingvars[block] != NULL;
1085 SCIP_VAR* mastervar,
1091 assert(mastervar != NULL);
1097 if( varblock == -1 )
1099 SCIP_VAR** origvars;
1113 return varblock == block;
1128 SCIP_VARDATA* vardata;
1130 assert(scip != NULL);
1131 assert(origvar != NULL);
1132 assert(var != NULL);
1134 vardata = SCIPvarGetData(origvar);
1136 assert(vardata != NULL);
1138 assert(vardata->data.origvardata.mastervars != NULL);
1139 assert(vardata->data.origvardata.mastervals != NULL);
1140 assert(vardata->data.origvardata.nmastervars >= 0);
1141 assert(vardata->data.origvardata.maxmastervars >= vardata->data.origvardata.nmastervars);
1144 if( vardata->data.origvardata.maxmastervars == vardata->data.origvardata.nmastervars )
1146 int newsize = SCIPcalcMemGrowSize(scip, vardata->data.origvardata.nmastervars+1);
1147 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(vardata->data.origvardata.mastervars), vardata->data.origvardata.maxmastervars,
1149 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(vardata->data.origvardata.mastervals), vardata->data.origvardata.maxmastervars,
1151 SCIPdebugMessage(
"mastervars array of var %s resized from %d to %d\n", SCIPvarGetName(origvar),
1152 vardata->data.origvardata.maxmastervars, newsize);
1153 vardata->data.origvardata.maxmastervars = newsize;
1156 vardata->data.origvardata.mastervars[vardata->data.origvardata.nmastervars] = var;
1157 vardata->data.origvardata.mastervals[vardata->data.origvardata.nmastervars] = val;
1158 vardata->data.origvardata.nmastervars++;
1174 SCIP_VARDATA* vardata;
1177 assert(scip != NULL);
1178 assert(origvar != NULL);
1179 assert(var != NULL);
1181 vardata = SCIPvarGetData(origvar);
1183 assert(vardata != NULL);
1185 assert(vardata->data.origvardata.mastervars != NULL);
1186 assert(vardata->data.origvardata.mastervals != NULL);
1187 assert(vardata->data.origvardata.nmastervars > 0);
1188 assert(vardata->data.origvardata.maxmastervars >= vardata->data.origvardata.nmastervars);
1190 for( i = 0; i < vardata->data.origvardata.nmastervars; ++i )
1192 if( vardata->data.origvardata.mastervars[i] == var )
1194 vardata->data.origvardata.mastervars[i] = vardata->data.origvardata.mastervars[vardata->data.origvardata.nmastervars - 1];
1195 vardata->data.origvardata.mastervals[i] = vardata->data.origvardata.mastervals[vardata->data.origvardata.nmastervars - 1];
1196 (vardata->data.origvardata.nmastervars)--;
1201 assert(i <= vardata->data.origvardata.nmastervars);
1203 for( ; i < vardata->data.origvardata.nmastervars; ++i )
1205 assert(vardata->data.origvardata.mastervars[i] != var);
1219 SCIP_VARDATA* vardata;
1220 char name[SCIP_MAXSTRLEN];
1222 assert(scip != NULL);
1223 assert(origvar != NULL);
1224 assert(var != NULL);
1233 SCIP_CALL( SCIPallocBlockMemory(scip, &vardata) );
1235 vardata->blocknr = pricingprobnr;
1237 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(vardata->data.pricingvardata.origvars), vardata->data.pricingvardata.maxorigvars) );
1238 vardata->data.pricingvardata.origvars[0] = origvar;
1239 vardata->data.pricingvardata.norigvars = 1;
1241 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN,
"pr%d_%s", pricingprobnr, SCIPvarGetName(origvar));
1242 SCIP_CALL( SCIPcreateVar(scip, var, name, SCIPvarGetLbGlobal(origvar),
1243 SCIPvarGetUbGlobal(origvar), 0.0, SCIPvarGetType(origvar),
1244 TRUE, FALSE, GCGvarDelOrig, NULL, NULL, NULL, vardata) );
1257 SCIP_VARDATA* vardata;
1258 char name[SCIP_MAXSTRLEN];
1260 assert(pricingscip != NULL);
1261 assert(pricingprobnr >= 0);
1262 assert(origvar != NULL);
1264 assert(var != NULL);
1267 SCIP_CALL( SCIPallocBlockMemory(pricingscip, &vardata) );
1269 vardata->blocknr = pricingprobnr;
1271 SCIP_CALL( SCIPallocBlockMemoryArray(pricingscip, &(vardata->data.pricingvardata.origvars), vardata->data.pricingvardata.maxorigvars) );
1272 vardata->data.pricingvardata.origvars[0] = origvar;
1273 vardata->data.pricingvardata.norigvars = 1;
1276 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN,
"pr%d_%s", pricingprobnr, SCIPvarGetName(origvar));
1277 SCIP_CALL( SCIPcreateVar(pricingscip, var, name, SCIPvarGetLbGlobal(origvar),
1278 SCIPvarGetUbGlobal(origvar), 0.0, SCIPvarGetType(origvar),
1279 TRUE, FALSE, GCGvarDelOrig, NULL, NULL, NULL, vardata) );
1289 SCIP_CONS** linkcons
1292 char name[SCIP_MAXSTRLEN];
1294 assert(masterscip != NULL);
1295 assert(pricingprobnr >= 0);
1296 assert(origvar != NULL);
1298 assert(linkcons != NULL);
1301 (void) SCIPsnprintf(name, SCIP_MAXSTRLEN,
"l_%s_%d", SCIPvarGetName(origvar), pricingprobnr);
1302 SCIP_CALL( SCIPcreateConsLinear(masterscip, linkcons, name, 0, NULL, NULL, 0.0, 0.0,
1303 TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE, FALSE, FALSE) );
1314 const char* varname,
1316 SCIP_VARTYPE vartype,
1322 SCIP_Bool auxiliaryvar
1325 SCIP_VARDATA* newvardata;
1329 SCIP_Bool trivialsol;
1331 assert(scip != NULL);
1332 assert(pricingscip != NULL);
1333 assert(newvar != NULL);
1334 assert(varname != NULL);
1335 assert(!SCIPisInfinity(pricingscip, ABS(objcoeff)));
1336 assert(vartype == SCIP_VARTYPE_INTEGER || vartype == SCIP_VARTYPE_CONTINUOUS);
1338 assert(nsolvars >= 0);
1339 assert(solvals != NULL || nsolvars == 0);
1340 assert(solvars != NULL || nsolvars == 0);
1346 lb = -SCIPinfinity(scip);
1349 SCIP_CALL( SCIPallocBlockMemory(scip, &newvardata) );
1351 newvardata->blocknr = prob;
1352 newvardata->data.mastervardata.index = -1;
1355 newvardata->data.mastervardata.isray = solisray;
1356 newvardata->data.mastervardata.isartificial = FALSE;
1359 SCIP_CALL( SCIPcreateVar(scip, newvar, varname, lb, SCIPinfinity(scip),
1360 objcoeff, vartype, TRUE, TRUE, NULL, NULL, gcgvardeltrans, NULL, newvardata) );
1363 newvardata->data.mastervardata.norigvars = 0;
1364 newvardata->data.mastervardata.maxorigvars = 0;
1366 for( i = 0; i < nsolvars; i++ )
1368 assert(solvars != NULL);
1369 assert(solvals != NULL);
1371 assert(!SCIPisInfinity(scip, solvals[i]));
1372 if( !SCIPisZero(scip, solvals[i]) )
1374 newvardata->data.mastervardata.norigvars++;
1382 if( newvardata->data.mastervardata.norigvars == 0 && !auxiliaryvar )
1384 newvardata->data.mastervardata.norigvars = SCIPgetNOrigVars(pricingscip);
1388 if( newvardata->data.mastervardata.norigvars > 0 )
1390 newvardata->data.mastervardata.maxorigvars = SCIPcalcMemGrowSize(scip, newvardata->data.mastervardata.norigvars);
1391 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(newvardata->data.mastervardata.origvars), newvardata->data.mastervardata.maxorigvars) );
1392 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(newvardata->data.mastervardata.origvals), newvardata->data.mastervardata.maxorigvars) );
1393 SCIP_CALL( SCIPhashmapCreate(&(newvardata->data.mastervardata.origvar2val), SCIPblkmem(scip), newvardata->data.mastervardata.norigvars) );
1397 newvardata->data.mastervardata.origvars = NULL;
1398 newvardata->data.mastervardata.origvals = NULL;
1399 newvardata->data.mastervardata.origvar2val = NULL;
1406 for( i = 0; i < nsolvars && !trivialsol; i++ )
1410 assert(solvars != NULL);
1411 assert(solvals != NULL);
1413 solval = solvals[i];
1415 if( !SCIPisZero(scip, solval) )
1421 assert(origvar != NULL);
1423 assert(newvardata->data.mastervardata.origvars != NULL);
1424 assert(newvardata->data.mastervardata.origvals != NULL);
1426 assert(!solisray || vartype == SCIP_VARTYPE_CONTINUOUS || SCIPisIntegral(scip, solval) || SCIPvarGetType(solvars[i]) == SCIP_VARTYPE_CONTINUOUS);
1429 if( SCIPvarIsIntegral(solvars[i]) && SCIPisIntegral(scip, solval) )
1430 solval = SCIPround(scip, solval);
1433 newvardata->data.mastervardata.origvars[j] = origvar;
1434 newvardata->data.mastervardata.origvals[j] = solval;
1435 SCIPhashmapInsertReal(newvardata->data.mastervardata.origvar2val, origvar, solval);
1443 SCIP_VAR** pricingvars;
1446 pricingvars = SCIPgetOrigVars(pricingscip);
1447 npricingvars = SCIPgetNOrigVars(pricingscip);
1448 for( j = 0; j < npricingvars; ++j )
1454 assert(origvar != NULL);
1456 assert(newvardata->data.mastervardata.origvars != NULL);
1457 assert(newvardata->data.mastervardata.origvals != NULL);
1460 newvardata->data.mastervardata.origvars[j] = origvar;
1461 newvardata->data.mastervardata.origvals[j] = 0.0;
1462 SCIPhashmapInsertReal(newvardata->data.mastervardata.origvar2val, origvar, 0.0);
1467 assert(j == newvardata->data.mastervardata.norigvars);
1479 SCIP_VARDATA* newvardata;
1483 assert( blocknr == -1 || blocknr == -2
1488 SCIPdebugMessage(
"var %s is in no block - copy it directly to the master\n", SCIPvarGetName(var));
1492 SCIPdebugMessage(
"var %s is a linking variable - copy it directly to the master\n", SCIPvarGetName(var));
1496 SCIP_CALL( SCIPallocBlockMemory(scip, &newvardata) );
1498 newvardata->blocknr = -1;
1499 newvardata->data.mastervardata.isray = FALSE;
1500 newvardata->data.mastervardata.isartificial = FALSE;
1501 newvardata->data.mastervardata.norigvars = 1;
1502 newvardata->data.mastervardata.maxorigvars = 1;
1503 newvardata->data.mastervardata.index = -1;
1506 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(newvardata->data.mastervardata.origvars), 1) );
1507 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(newvardata->data.mastervardata.origvals), 1) );
1508 SCIP_CALL( SCIPhashmapCreate(&(newvardata->data.mastervardata.origvar2val), SCIPblkmem(scip), 1) );
1509 newvardata->data.mastervardata.origvars[0] = var;
1510 newvardata->data.mastervardata.origvals[0] = 1.0;
1511 SCIPhashmapInsertReal(newvardata->data.mastervardata.origvar2val, var, 1.0);
1514 SCIP_CALL( SCIPcreateVar(scip, newvar, SCIPvarGetName(var),
1515 SCIPvarGetLbGlobal(var), SCIPvarGetUbGlobal(var), SCIPvarGetObj(var), SCIPvarGetType(var),
1516 TRUE, TRUE, NULL, NULL, gcgvardeltrans, NULL, newvardata) );
1529 SCIP_VARDATA* newvardata;
1532 SCIP_CALL( SCIPallocBlockMemory(scip, &newvardata) );
1534 newvardata->blocknr = -1;
1535 newvardata->data.mastervardata.isray = FALSE;
1536 newvardata->data.mastervardata.norigvars = 0;
1537 newvardata->data.mastervardata.maxorigvars = 0;
1538 newvardata->data.mastervardata.isartificial = TRUE;
1540 newvardata->data.mastervardata.origvars = NULL;
1541 newvardata->data.mastervardata.origvals = NULL;
1542 newvardata->data.mastervardata.origvar2val = NULL;
1543 newvardata->data.mastervardata.index = -1;
1546 SCIP_CALL( SCIPcreateVar(scip, newvar, name,
1547 0.0, SCIPinfinity(scip), objcoef, SCIP_VARTYPE_IMPLINT,
1548 TRUE, TRUE, NULL, NULL, gcgvardeltrans, NULL, newvardata) );
1556 SCIP_VAR* auxiliaryvar,
1560 SCIP_VARDATA* newvardata;
1562 assert(scip != NULL);
1563 assert(auxiliaryvar != NULL);
1566 SCIP_CALL( SCIPallocBlockMemory(scip, &newvardata) );
1568 newvardata->blocknr = probnumber;
1571 newvardata->data.mastervardata.isray = FALSE;
1574 newvardata->data.mastervardata.norigvars = 0;
1575 newvardata->data.mastervardata.maxorigvars = 0;
1577 newvardata->data.mastervardata.origvars = NULL;
1578 newvardata->data.mastervardata.origvals = NULL;
1579 newvardata->data.mastervardata.origvar2val = NULL;
1582 SCIPvarSetData(auxiliaryvar, newvardata);
1585 SCIPvarSetDeltransData(auxiliaryvar, gcgvardeltrans);
1593 SCIP_Longint creationNode
1596 SCIP_VARDATA* vardata;
1597 assert(var != NULL);
1598 assert(creationNode >= 0);
1600 vardata = SCIPvarGetData(var);
1601 vardata->creationnode = creationNode;
1610 SCIP_VARDATA* vardata;
1611 assert(var != NULL);
1613 vardata = SCIPvarGetData(var);
1614 return vardata->creationnode;
1624 SCIP_VARDATA* vardata;
1625 assert(var != NULL);
1626 assert(time >= 0.0);
1628 vardata = SCIPvarGetData(var);
1629 vardata->creationtime = time;
1638 SCIP_VARDATA* vardata;
1639 assert(var != NULL);
1641 vardata = SCIPvarGetData(var);
1642 return vardata->creationtime;
1649 SCIP_Longint rootredcostcall
1652 SCIP_VARDATA* vardata;
1653 assert(var != NULL);
1654 assert(rootredcostcall >= -1);
1656 vardata = SCIPvarGetData(var);
1657 vardata->rootredcostcall = rootredcostcall;
1666 SCIP_VARDATA* vardata;
1667 assert(var != NULL);
1669 vardata = SCIPvarGetData(var);
1670 return vardata->rootredcostcall;
1677 SCIP_Longint iteration
1680 SCIP_VARDATA* vardata;
1681 assert(var != NULL);
1682 assert(iteration >= 0);
1684 vardata = SCIPvarGetData(var);
1685 vardata->iteration = iteration;
1694 SCIP_VARDATA* vardata;
1695 assert(var != NULL);
1697 vardata = SCIPvarGetData(var);
1698 return vardata->iteration;
1708 SCIP_VARDATA* vardata;
1709 assert(var != NULL);
1712 vardata = SCIPvarGetData(var);
1722 SCIP_VARDATA* vardata;
1723 assert(var != NULL);
1725 vardata = SCIPvarGetData(var);
1726 return vardata->gap;
1737 SCIP_VARDATA* vardata;
1738 assert(scip != NULL);
1739 assert(var != NULL);
1740 assert(SCIPisLE(scip, redcost, 0.0));
1742 vardata = SCIPvarGetData(var);
1743 vardata->redcost = redcost;
1752 SCIP_VARDATA* vardata;
1753 assert(var != NULL);
1755 vardata = SCIPvarGetData(var);
1756 return vardata->redcost;
1768 SCIP_Longint redcostcall;
1769 assert(scip != NULL);
1771 assert(origprob != NULL);
1773 assert(newvar != NULL);
1781 GCGsetVarGap(newvar, MIN(SCIPgetGap(origprob), SCIPgetGap(scip)));
1803 SCIP_VAR** mastervars;
1804 SCIP_Real* mastervals;
1809 SCIP_VAR** pricingvars;
1814 SCIPinfoMessage(scip, file,
"Variable %s (linking): %d block%s (", SCIPvarGetName(var), nblocks, nblocks == 1 ?
"":
"s" );
1816 for( i = 0, j = 0; j < nblocks; ++i )
1818 if( pricingvars[i] != NULL )
1820 SCIPinfoMessage(scip, file,
"%d ", i);
1824 SCIPinfoMessage(scip, file,
")\n");
1828 SCIPinfoMessage(scip, file,
"Variable %s (original): block %d\n", SCIPvarGetName(var), blocknr);
1834 SCIPinfoMessage(scip, file,
"mastervars:");
1835 for( i = 0; i < nmastervars-1; i++ )
1837 SCIPinfoMessage(scip, file,
"%s (%g), ", SCIPvarGetName(mastervars[i]), mastervals[i]);
1839 SCIPinfoMessage(scip, file,
"%s (%g)\n", SCIPvarGetName(mastervars[nmastervars-1]), mastervals[nmastervars-1]);
1843 SCIP_VAR** origvars;
1849 SCIPinfoMessage(scip, file,
"Variable %s (pricing): block %d\n", SCIPvarGetName(var), blocknr);
1850 SCIPinfoMessage(scip, file,
"origvars:");
1851 for( i = 0; i < norigvars-1; i++ )
1853 SCIPinfoMessage(scip, file,
"%s, ", SCIPvarGetName(origvars[i]));
1855 SCIPinfoMessage(scip, file,
"%s\n", SCIPvarGetName(origvars[norigvars-1]));
1859 SCIP_VAR** origvars;
1861 SCIP_Real* origvals;
1866 SCIPinfoMessage(scip, file,
"Variable %s (master): block %d\n", SCIPvarGetName(var), blocknr);
1867 SCIPinfoMessage(scip, file,
"origvars:");
1868 for( i = 0; i < norigvars-1; i++ )
1870 SCIPinfoMessage(scip, file,
"%s (%g), ", SCIPvarGetName(origvars[i]), origvals[i]);
1872 SCIPinfoMessage(scip, file,
"%s (%g)\n", SCIPvarGetName(origvars[norigvars-1]), origvals[norigvars-1]);
1882 SCIP_VARDATA* vardata;
1883 assert(var != NULL);
1885 vardata = SCIPvarGetData(var);
1886 return vardata->data.mastervardata.index;
1896 SCIP_VARDATA* vardata;
1897 assert(var != NULL);
1899 vardata = SCIPvarGetData(var);
1900 vardata->data.mastervardata.index = index;