Scippy

GCG

Branch-and-Price & Column Generation for Everyone

gcgvar.c
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of the program */
4 /* GCG --- Generic Column Generation */
5 /* a Dantzig-Wolfe decomposition based extension */
6 /* of the branch-cut-and-price framework */
7 /* SCIP --- Solving Constraint Integer Programs */
8 /* */
9 /* Copyright (C) 2010-2021 Operations Research, RWTH Aachen University */
10 /* Zuse Institute Berlin (ZIB) */
11 /* */
12 /* This program is free software; you can redistribute it and/or */
13 /* modify it under the terms of the GNU Lesser General Public License */
14 /* as published by the Free Software Foundation; either version 3 */
15 /* of the License, or (at your option) any later version. */
16 /* */
17 /* This program is distributed in the hope that it will be useful, */
18 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
19 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
20 /* GNU Lesser General Public License for more details. */
21 /* */
22 /* You should have received a copy of the GNU Lesser General Public License */
23 /* along with this program; if not, write to the Free Software */
24 /* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.*/
25 /* */
26 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
27 
28 /**@file gcgvar.c
29  * @brief GCG variable access functions
30  * @author Martin Bergner
31  * @author Christian Puchert
32  *
33  * @todo capture and release variables stored in other variable's data?
34  */
35 
36 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
37 
38 #include "gcg.h"
39 #include "pub_gcgvar.h"
40 #include "struct_vardata.h"
41 #include "relax_gcg.h"
42 #include "scip_misc.h"
43 #include "scip/cons_linear.h"
44 
45 #define STARTMAXMASTERVARS 8
46 #define STARTMAXORIGVARS 1
47 
48 /*
49  * Vardata methods
50  */
51 
52 /** callback method called when an original GCG variable is deleted */
53 static
54 SCIP_DECL_VARDELORIG(GCGvarDelOrig)
55 {
56  if( *vardata == NULL )
57  return SCIP_OKAY;
58 
59  /*lint -e715 */
60  if( (*vardata)->vartype == GCG_VARTYPE_ORIGINAL )
61  {
62  if( (*vardata)->blocknr == -2 )
63  {
64  int nblocks;
65 
66  nblocks = GCGgetNPricingprobs(scip);
67  assert(nblocks > 0);
68 
69  assert((*vardata)->data.origvardata.linkingvardata != NULL);
70  if( (*vardata)->data.origvardata.linkingvardata->linkconss != NULL )
71  {
72  int i;
73  assert((*vardata)->data.origvardata.linkingvardata->pricingvars != NULL);
74 
75  for( i = 0; i < nblocks; i++ )
76  {
77  assert(((*vardata)->data.origvardata.linkingvardata->linkconss[i] == NULL)
78  == ((*vardata)->data.origvardata.linkingvardata->pricingvars[i] == NULL));
79  }
80 
81  SCIPfreeBlockMemoryArray(scip, &((*vardata)->data.origvardata.linkingvardata->linkconss), nblocks);
82  SCIPfreeBlockMemoryArray(scip, &((*vardata)->data.origvardata.linkingvardata->pricingvars), nblocks);
83  }
84  else if( (*vardata)->data.origvardata.linkingvardata->pricingvars != NULL )
85  SCIPfreeBlockMemoryArray(scip, &((*vardata)->data.origvardata.linkingvardata->pricingvars), nblocks);
86 
87  SCIPfreeBlockMemory(scip, &((*vardata)->data.origvardata.linkingvardata));
88  (*vardata)->data.origvardata.linkingvardata = NULL;
89  }
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);
95 
96  if( (*vardata)->data.origvardata.ncoefs > 0 )
97  {
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);
102  }
103  }
104  if( (*vardata)->vartype == GCG_VARTYPE_PRICING )
105  {
106  assert((*vardata)->data.pricingvardata.norigvars >= 1);
107  SCIPfreeBlockMemoryArray(scip, &((*vardata)->data.pricingvardata.origvars), (*vardata)->data.pricingvardata.maxorigvars);
108  }
109  assert((*vardata)->vartype != GCG_VARTYPE_MASTER);
110  SCIPfreeBlockMemory(scip, vardata);
111 
112  return SCIP_OKAY;
113 }
114 
115 
116 /** callback method called when a transformed GCG variable is deleted */
117 static
118 SCIP_DECL_VARDELTRANS(gcgvardeltrans)
119 {
120  /*lint -e715 */
121  assert((*vardata)->vartype == GCG_VARTYPE_MASTER);
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));
125 
126  SCIPfreeBlockMemory(scip, vardata);
127 
128  return SCIP_OKAY;
129 }
130 
131 
132 
133 /** returns TRUE or FALSE whether variable is a pricing variable or not */
134 SCIP_Bool GCGvarIsPricing(
135  SCIP_VAR* var /**< SCIP variable structure */
136  )
137 {
138  SCIP_VARDATA* vardata;
139  assert(var != NULL);
140 
141  vardata = SCIPvarGetData(var);
142  if( vardata == NULL )
143  return FALSE;
144 
145  return vardata->vartype == GCG_VARTYPE_PRICING;
146 }
147 
148 #ifndef NDEBUG
149 /** returns TRUE or FALSE whether variable is a master variable or not */
150 SCIP_Bool GCGvarIsMaster(
151  SCIP_VAR* var /**< SCIP variable structure */
152  )
153 {
154  SCIP_VARDATA* vardata;
155  assert(var != NULL);
156 
157  vardata = SCIPvarGetData(var);
158  assert(vardata != NULL);
159 
160  return vardata->vartype == GCG_VARTYPE_MASTER;
161 }
162 #endif
163 
164 #ifndef NDEBUG
165 /** returns TRUE or FALSE whether variable is a original variable or not */
167  SCIP_VAR* var /**< SCIP variable structure */
168  )
169 {
170  SCIP_VARDATA* vardata;
171  assert(var != NULL);
172 
173  vardata = SCIPvarGetData(var);
174  assert(vardata != NULL);
175 
176  return vardata->vartype == GCG_VARTYPE_ORIGINAL;
177 }
178 #endif
179 
180 #ifndef NDEBUG
181 /** returns TRUE or FALSE whether variable is a linking variable or not */
183  SCIP_VAR* var /**< SCIP variable structure */
184  )
185 {
186  SCIP_VARDATA* vardata;
187  assert(var != NULL);
188  assert(GCGvarIsOriginal(var));
189 
190  vardata = SCIPvarGetData(var);
191  assert(vardata != NULL);
192 
193  return vardata->blocknr == -2;
194 }
195 #endif
196 
197 #ifndef NDEBUG
198 /** returns TRUE or FALSE whether variable is a directly transferred variable or not */
200  SCIP_VAR* var /**< SCIP variable structure */
201  )
202 {
203  SCIP_VARDATA* vardata;
204  assert(var != NULL);
205  assert(GCGvarIsOriginal(var));
206 
207  vardata = SCIPvarGetData(var);
208  assert(vardata != NULL);
209 
210  return vardata->blocknr == -1;
211 }
212 #endif
213 
214 #ifndef NDEBUG
215 /** returns the pricing var of an original variable */
217  SCIP_VAR* var /**< SCIP variable structure */
218  )
219 {
220  SCIP_VARDATA* vardata;
221  assert(var != NULL);
222  assert(GCGvarIsOriginal(var));
223 
224  vardata = SCIPvarGetData(var);
225  assert(vardata != NULL);
226  assert(vardata->data.origvardata.linkingvardata == NULL);
227  assert(!GCGoriginalVarIsLinking(var));
228  if( vardata->data.origvardata.pricingvar != NULL )
229  assert(GCGvarIsPricing(vardata->data.origvardata.pricingvar));
230  return vardata->data.origvardata.pricingvar;
231 }
232 #endif
233 
234 /** returns the pricing var of an original variable */
236  SCIP_VAR* var, /**< SCIP variable structure */
237  SCIP_VAR* pricingvar /**< SCIP variable structure */
238  )
239 {
240  SCIP_VARDATA* vardata;
241  assert(var != NULL);
242  assert(pricingvar != NULL);
243  assert(GCGvarIsOriginal(var));
244  assert(GCGvarIsPricing(pricingvar));
245 
246  vardata = SCIPvarGetData(var);
247  assert(vardata != NULL);
248 
249  assert(vardata->data.origvardata.linkingvardata == NULL);
250  assert(!GCGoriginalVarIsLinking(var));
251  vardata->data.origvardata.pricingvar = pricingvar;
252 }
253 
254 /** creates the data for all variables of the original program */
256  SCIP* scip /**< SCIP data structure */
257  )
258 {
259  SCIP_VAR** vars;
260  int nvars;
261  int i;
262 
263  assert(scip != NULL);
264 
265  vars = SCIPgetOrigVars(scip);
266  nvars = SCIPgetNOrigVars(scip);
267 
268  /* loop over the variables in the original problem */
269  for( i = 0; i < nvars; i++ )
270  {
271  assert(vars[i] != NULL);
272  SCIP_CALL( GCGorigVarCreateData(scip, vars[i]) );
273  }
274 
275  return SCIP_OKAY;
276 }
277 
278 /** frees the data for all variables of the original program */
279 SCIP_RETCODE GCGfreeOrigVarsData(
280  SCIP* scip /**< SCIP data structure */
281  )
282 {
283  SCIP_VAR** vars;
284  int nvars;
285  int i;
286 
287  assert(scip != NULL);
288 
289  vars = SCIPgetOrigVars(scip);
290  nvars = SCIPgetNOrigVars(scip);
291 
292  /* loop over the variables in the original problem */
293  for( i = 0; i < nvars; i++ )
294  {
295  SCIP_VAR* var;
296  assert(vars[i] != NULL);
297  var = vars[i];
298 
299  if( SCIPvarGetData(var) != NULL )
300  {
301  SCIP_VARDATA* oldvardata;
302  oldvardata = SCIPvarGetData(var);
303 
304  SCIP_CALL( GCGvarDelOrig(scip, var, &oldvardata) );
305  SCIPvarSetData(var, NULL);
306  }
307  }
308 
309  return SCIP_OKAY;
310 }
311 
312 /** creates the data for a variable of the original program */
313 SCIP_RETCODE GCGorigVarCreateData(
314  SCIP* scip, /**< SCIP data structure */
315  SCIP_VAR* var /**< pointer to variable object */
316  )
317 {
318  SCIP_VARDATA* vardata;
319 
320  assert(scip != NULL);
321  assert(var != NULL);
322  assert(SCIPvarIsOriginal(var) || SCIPvarGetStatus(var) == SCIP_VARSTATUS_LOOSE);
323  /* create the vardata and initialize its values */
324  SCIP_CALL( SCIPallocBlockMemory(scip, &vardata) );
325  vardata->vartype = GCG_VARTYPE_ORIGINAL;
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) );
338 
339  if( SCIPvarGetData(var) != NULL )
340  {
341  SCIP_VARDATA* oldvardata;
342  oldvardata = SCIPvarGetData(var);
343 
344  SCIP_CALL( GCGvarDelOrig(scip, var, &oldvardata) );
345  }
346  SCIPvarSetData(var, vardata);
347  if( SCIPvarIsOriginal(var) )
348  {
349  SCIPvarSetDelorigData(var, GCGvarDelOrig);
350  if( SCIPvarGetTransVar(var) != NULL )
351  {
352  SCIPvarSetData(SCIPvarGetProbvar(SCIPvarGetTransVar(var)), vardata);
353  }
354  }
355  else
356  {
357  assert(SCIPvarIsTransformedOrigvar(var));
358  SCIPvarSetDeltransData(var, GCGvarDelOrig);
359  }
360 
361  return SCIP_OKAY;
362 }
363 
364 /** copies the pricing variable data to a master problem variable. This is used in the Benders' decomposition mode when
365  * subproblems are merged into the master problem.
366  */
368  SCIP* scip, /**< master SCIP data structure */
369  SCIP_VAR* pricingvar, /**< the pricing problem variable is copied from */
370  SCIP_VAR* mastervar /**< the master variable that the vardata is copied to */
371  )
372 {
373  SCIP_VARDATA* targetvardata;
374  SCIP_VAR* origvar;
375  assert(pricingvar != NULL);
376  assert(mastervar != NULL);
377  assert(GCGvarIsPricing(pricingvar));
378  /* we can't assert that mastervar is a master variable because it may not have the appropriate vardata yet */
379 
380  assert(GCGpricingVarGetNOrigvars(pricingvar) == 1);
381 
382  /* create vardata */
383  SCIP_CALL( SCIPallocBlockMemory(scip, &targetvardata) );
384  targetvardata->vartype = GCG_VARTYPE_MASTER;
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;
391 
392  /* save corresoponding origvar */
393  origvar = GCGpricingVarGetOrigvars(pricingvar)[0];
394  SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(targetvardata->data.mastervardata.origvars), 1) ); /*lint !e506*/
395  SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(targetvardata->data.mastervardata.origvals), 1) ); /*lint !e506*/
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);
400 
401  SCIPvarSetData(mastervar, targetvardata);
402  SCIPvarSetDeltransData(mastervar, gcgvardeltrans);
403 
404  return SCIP_OKAY;
405 }
406 
407 #ifndef NDEBUG
408 /** returns the pricing variables of an linking variable */
410  SCIP_VAR* var /**< SCIP variable structure */
411  )
412 {
413  SCIP_VARDATA* vardata;
414  assert(var != NULL);
415  assert(GCGoriginalVarIsLinking(var));
416 
417  vardata = SCIPvarGetData(var);
418  assert(vardata != NULL);
419  assert(vardata->data.origvardata.linkingvardata != NULL);
420  assert(vardata->data.origvardata.linkingvardata->pricingvars != NULL);
421 
422  return vardata->data.origvardata.linkingvardata->pricingvars;
423 }
424 #endif
425 
426 /** sets the pricing var of the corresponding linking variable at the specified position */
428  SCIP_VAR* origvar, /**< original variable */
429  int pricingprobnr, /**< number of pricing problem */
430  SCIP_VAR* var /**< pricing variable */
431  )
432 {
433  SCIP_VARDATA* vardata;
434  assert(origvar != NULL);
435  assert(var != NULL);
436  assert(pricingprobnr >= 0);
437 
438  assert(GCGoriginalVarIsLinking(origvar));
439  assert(GCGvarIsPricing(var));
440 
441  vardata = SCIPvarGetData(origvar);
442  assert(vardata != NULL);
443  assert(vardata->data.origvardata.linkingvardata != NULL);
444  assert(vardata->data.origvardata.linkingvardata->pricingvars != NULL);
445 
446  vardata->data.origvardata.linkingvardata->pricingvars[pricingprobnr] = var;
447 }
448 
449 /** returns the blocks the linking variable is in */
451  SCIP_VAR* var, /**< SCIP variable structure */
452  int nblocks, /**< size of array blocks */
453  int* blocks /**< array to store the blocks of the linking variable */
454  )
455 {
456  SCIP_VARDATA* vardata;
457  int i;
458  int j;
459 
460  assert(var != NULL);
461  assert(nblocks == 0 || blocks != NULL);
462 
463  assert(GCGoriginalVarIsLinking(var));
464  vardata = SCIPvarGetData(var);
465  assert(vardata != NULL);
466  assert(vardata->data.origvardata.linkingvardata != NULL);
467  assert(vardata->data.origvardata.linkingvardata->nblocks > 0);
468 
469  /* the blocks array must be large enough to hold all block numbers */
470  if( nblocks < vardata->data.origvardata.linkingvardata->nblocks )
471  {
472  SCIPerrorMessage("array too small to store all block numbers!\n");
473  return SCIP_INVALIDDATA;
474  }
475  assert(nblocks >= vardata->data.origvardata.linkingvardata->nblocks);
476 
477  /* fill the blocks array */
478  j = -1;
479  for( i = 0; i < vardata->data.origvardata.linkingvardata->nblocks; ++i )
480  {
481  /* search the next block the linking variable is contained in */
482  do
483  ++j;
484  while ( vardata->data.origvardata.linkingvardata->pricingvars[j] == NULL );
485  blocks[i] = j;
486  }
487 
488  return SCIP_OKAY;
489 }
490 
491 #ifndef NDEBUG
492 /** returns the number of blocks the linking variable is in */
494  SCIP_VAR* var /**< SCIP variable structure */
495  )
496 {
497  SCIP_VARDATA* vardata;
498  assert(var != NULL);
499 
500  assert(GCGoriginalVarIsLinking(var));
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;
506 }
507 #endif
508 
509 #ifndef NDEBUG
510 /** returns the original var of a pricing variable */
512  SCIP_VAR* var /**< SCIP variable structure */
513  )
514 {
515  SCIP_VARDATA* vardata;
516  assert(var != NULL);
517  assert(GCGvarIsPricing(var));
518 
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); /* variable belongs to exactly one block */
525 
526  return vardata->data.pricingvardata.origvars[0];
527 }
528 #endif
529 
530 /** adds the original var to the pricing variable */
532  SCIP* scip, /**< SCIP variable structure */
533  SCIP_VAR* pricingvar, /**< pricing variable */
534  SCIP_VAR* origvar /**< original pricing variable */
535  )
536 {
537  SCIP_VARDATA* vardata;
538  assert(pricingvar != NULL);
539  assert(origvar != NULL);
540  assert(GCGvarIsPricing(pricingvar));
541  assert(GCGvarIsOriginal(origvar));
542 
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); /* variable belongs to exactly one block */
549 
550  /* realloc origvars array of the pricing variable, if needed */
551  if( vardata->data.pricingvardata.maxorigvars == vardata->data.pricingvardata.norigvars )
552  {
553  int newsize = SCIPcalcMemGrowSize(scip, vardata->data.pricingvardata.norigvars+1);
554  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(vardata->data.pricingvardata.origvars), vardata->data.pricingvardata.maxorigvars,
555  newsize) );
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;
559  }
560 
561  vardata->data.pricingvardata.origvars[vardata->data.pricingvardata.norigvars] = origvar;
562  vardata->data.pricingvardata.norigvars++;
563 
564  return SCIP_OKAY;
565 }
566 
567 #ifndef NDEBUG
568 /** returns the number of master variables the original variable is contained in */
570  SCIP_VAR* var /**< SCIP variable structure */
571  )
572 {
573  SCIP_VARDATA* vardata;
574  assert(var != NULL);
575  assert(GCGvarIsOriginal(var));
576 
577  vardata = SCIPvarGetData(var);
578  assert(vardata != NULL);
579  assert(vardata->data.origvardata.nmastervars >= 0);
580 
581  return vardata->data.origvardata.nmastervars;
582 }
583 #endif
584 
585 #ifndef NDEBUG
586 /** returns the master variables the original variable is contained in */
588  SCIP_VAR* var /**< SCIP variable structure */
589  )
590 {
591  SCIP_VARDATA* vardata;
592  assert(var != NULL);
593  assert(GCGvarIsOriginal(var));
594 
595  vardata = SCIPvarGetData(var);
596  assert(vardata != NULL);
597 
598  assert(vardata->data.origvardata.mastervars != NULL);
599  return vardata->data.origvardata.mastervars;
600 }
601 #endif
602 
603 #ifndef NDEBUG
604 /** returns the fraction of master variables the original variable is contained in */
606  SCIP_VAR* var /**< SCIP variable structure */
607  )
608 {
609  SCIP_VARDATA* vardata;
610  assert(var != NULL);
611  assert(GCGvarIsOriginal(var));
612 
613  vardata = SCIPvarGetData(var);
614  assert(vardata != NULL);
615 
616  assert(vardata->data.origvardata.mastervals != NULL);
617  return vardata->data.origvardata.mastervals;
618 }
619 #endif
620 
621 #ifndef NDEBUG
622 /** returns the coefficients of master constraints the original variable is contained in */
624  SCIP_VAR* var /**< SCIP variable structure */
625  )
626 {
627  SCIP_VARDATA* vardata;
628  assert(var != NULL);
629  assert(GCGvarIsOriginal(var));
630 
631  vardata = SCIPvarGetData(var);
632  assert(vardata != NULL);
633 
634  assert(vardata->data.origvardata.coefs != NULL || vardata->data.origvardata.ncoefs == 0 );
635  return vardata->data.origvardata.coefs;
636 }
637 #endif
638 
639 #ifndef NDEBUG
640 /** returns the number of coefficients of master constraints the original variable is contained in */
642  SCIP_VAR* var /**< SCIP variable structure */
643  )
644 {
645  SCIP_VARDATA* vardata;
646  assert(var != NULL);
647  assert(GCGvarIsOriginal(var));
648 
649  vardata = SCIPvarGetData(var);
650  assert(vardata != NULL);
651 
652  assert(vardata->data.origvardata.coefs != NULL || vardata->data.origvardata.ncoefs == 0 );
653  return vardata->data.origvardata.ncoefs;
654 }
655 #endif
656 
657 /** sets the number of master variables the original variable is contained in */
659  SCIP_VAR* var, /**< SCIP variable structure */
660  int ncoefs /**< number of coefficient to set */
661  )
662 {
663  SCIP_VARDATA* vardata;
664  assert(var != NULL);
665  assert(ncoefs >= 0);
666  assert(GCGvarIsOriginal(var));
667 
668  vardata = SCIPvarGetData(var);
669  assert(vardata != NULL);
670 
671  assert(vardata->data.origvardata.coefs != NULL || vardata->data.origvardata.ncoefs == 0 );
672  if( ncoefs == 0 )
673  assert(vardata->data.origvardata.coefs == NULL);
674 
675  vardata->data.origvardata.ncoefs = ncoefs;
676 }
677 
678 /** adds a coefficient of the master variable to the coefs array for the resp. constraint */
680  SCIP* scip, /**< SCIP data structure */
681  SCIP_VAR* var, /**< variable to add coef */
682  SCIP_Real val, /**< coefficent to set */
683  SCIP_CONS* cons /**< constraint the variable is in */
684  )
685 {
686  SCIP_VARDATA* vardata;
687  assert(scip != NULL);
688  assert(var != NULL);
689  assert(!SCIPisZero(scip, val));
690  assert(cons != NULL);
691  assert(GCGvarIsOriginal(var));
692  vardata = SCIPvarGetData(var);
693  assert(vardata != NULL);
694 
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) );
697 
698  assert(vardata->data.origvardata.coefs != NULL);
699  assert(vardata->data.origvardata.masterconss != NULL);
700 
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++;
704 
705  return SCIP_OKAY;
706 }
707 
708 #ifndef NDEBUG
709 /** returns the fraction of master variables the original variable is contained in */
711  SCIP_VAR* var /**< SCIP variable structure */
712  )
713 {
714  SCIP_VARDATA* vardata;
715  assert(var != NULL);
716  assert(GCGvarIsOriginal(var));
717 
718  vardata = SCIPvarGetData(var);
719  assert(vardata != NULL);
720 
721  return vardata->data.origvardata.masterconss;
722 }
723 #endif
724 
725 /** adds variable to a new block, making a linkingvariable out of it, if necessary */
727  SCIP* scip, /**< SCIP data structure */
728  SCIP_VAR* var, /**< var that is added to a block */
729  int newblock, /**< the new block the variable will be in */
730  int nblocks, /**< total number of pricing problems */
731  DEC_DECMODE mode /**< the decomposition mode */
732  )
733 {
734  SCIP_VARDATA* vardata;
735  int blocknr;
736  assert(scip != NULL);
737  assert(var != NULL);
738  assert(GCGvarIsOriginal(var));
739 
740  vardata = SCIPvarGetData(var);
741  assert(vardata != NULL);
742 
743  assert(nblocks >= 0);
744  assert((newblock >= 0 && newblock < nblocks)
745  || (GCGgetDecompositionMode(scip) == DEC_DECMODE_BENDERS && newblock == -2));
746  blocknr = GCGvarGetBlock(var);
747  assert(newblock >= 0 || (newblock == -2 && blocknr > -1));
748  /* the variable was only in one block so far, so set up the linking variable data */
749  if( blocknr > -1 )
750  {
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);
754 
755  if( mode != DEC_DECMODE_BENDERS )
756  {
757  SCIP_CALL( SCIPallocBlockMemoryArray(scip, &vardata->data.origvardata.linkingvardata->linkconss, nblocks) );
758  BMSclearMemoryArray(vardata->data.origvardata.linkingvardata->linkconss, nblocks);
759  }
760  else
761  vardata->data.origvardata.linkingvardata->linkconss = NULL;
762 
763  /* store old block; store the original variable, it will be exchanged for the correct pricing variable later */
764  vardata->data.origvardata.linkingvardata->pricingvars[blocknr] = var;
765  vardata->data.origvardata.linkingvardata->nblocks = 1;
766 
767  vardata->blocknr = -2;
768  }
769  assert(GCGoriginalVarIsLinking(var));
770 
771  /* store new block. In the Benders' decomposition mode, it is possible to have linking variables that only correspond
772  * to a single block. In this case, we still want the variables in the master problem, but we need to ensure that the
773  * linking variables are added correctly
774  */
775  if( newblock >= 0 && vardata->data.origvardata.linkingvardata->pricingvars[newblock] == NULL )
776  {
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++;
780  }
781  assert(vardata->data.origvardata.linkingvardata->nblocks <= nblocks);
782  return SCIP_OKAY;
783 }
784 
785 #ifndef NDEBUG
786 /** returns the linking constraints */
788  SCIP_VAR* var /**< SCIP variable structure */
789  )
790 {
791  SCIP_VARDATA* vardata;
792  assert(var != NULL);
793  assert(GCGvarIsOriginal(var));
794  assert(GCGoriginalVarIsLinking(var));
795 
796  vardata = SCIPvarGetData(var);
797  assert(vardata != NULL);
798 
799  assert(vardata->data.origvardata.linkingvardata != NULL);
800  //assert(vardata->data.origvardata.linkingvardata->linkconss != NULL);
801  return vardata->data.origvardata.linkingvardata->linkconss;
802 }
803 #endif
804 
805 /** sets the linking constraints */
807  SCIP_VAR* var, /**< variable data structure */
808  SCIP_CONS* cons, /**< linking constraint */
809  int index /**< index of pricing problem */
810  )
811 {
812  SCIP_VARDATA* vardata;
813  assert(var != NULL);
814  assert(cons != NULL);
815  assert(index >= 0);
816  assert(GCGvarIsOriginal(var));
817  assert(GCGoriginalVarIsLinking(var));
818 
819  vardata = SCIPvarGetData(var);
820  assert(vardata != NULL);
821 
822  assert(vardata->data.origvardata.linkingvardata != NULL);
823  assert(vardata->data.origvardata.linkingvardata->linkconss != NULL);
824  vardata->data.origvardata.linkingvardata->linkconss[index] = cons;
825 }
826 
827 /** returns TRUE or FALSE whether a master variable is a direct copy of a linking variable or not */
829  SCIP_VAR* var /**< variable data structure */
830  )
831 {
832  assert(var != NULL);
833  assert(GCGvarIsMaster(var));
834 
835  /* the master variable is a direct copy from an original variable */
836  if( GCGvarGetBlock(var) == -1 )
837  {
838  SCIP_VAR** origvars;
839  origvars = GCGmasterVarGetOrigvars(var);
840 
841  if( GCGmasterVarIsArtificial(var) )
842  return FALSE;
843 
844  return GCGoriginalVarIsLinking(origvars[0]);
845  }
846  else
847  return FALSE;
848 }
849 
850 #ifndef NDEBUG
851 /** returns whether the master variable is a ray */
853  SCIP_VAR* var /**< variable data structure */
854  )
855 {
856  SCIP_VARDATA* vardata;
857  assert(var != NULL);
858  assert(GCGvarIsMaster(var));
859 
860  vardata = SCIPvarGetData(var);
861  assert(vardata != NULL);
862 
863  return vardata->data.mastervardata.isray;
864 }
865 #endif
866 
867 #ifndef NDEBUG
868 /** returns TRUE or FALSE whether a master variable is an artificial variable */
870  SCIP_VAR* var /**< variable data structure */
871  )
872 {
873  SCIP_VARDATA* vardata;
874  assert(var != NULL);
875  assert(GCGvarIsMaster(var));
876 
877  vardata = SCIPvarGetData(var);
878  assert(vardata != NULL);
879 
880  return vardata->data.mastervardata.isartificial;
881 }
882 #endif
883 
884 #ifndef NDEBUG
885 /** returns the number of original variables the master variable is contained in */
887  SCIP_VAR* var /**< SCIP variable structure */
888  )
889 {
890  SCIP_VARDATA* vardata;
891  assert(var != NULL);
892  assert(GCGvarIsMaster(var));
893 
894  vardata = SCIPvarGetData(var);
895  assert(vardata != NULL);
896 
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);
900 // assert(vardata->blocknr != -1 || vardata->data.mastervardata.norigvars == 1 );
901 
902  return vardata->data.mastervardata.norigvars;
903 }
904 #endif
905 
906 #ifndef NDEBUG
907 /** returns the original variables the master variable is contained in */
909  SCIP_VAR* var /**< SCIP variable structure */
910  )
911 {
912  SCIP_VARDATA* vardata;
913  assert(var != NULL);
914  assert(GCGvarIsMaster(var));
915 
916  vardata = SCIPvarGetData(var);
917  assert(vardata != NULL);
918 
919  assert(vardata->data.mastervardata.origvars != NULL || vardata->data.mastervardata.norigvars == 0);
920 // assert(vardata->blocknr != -1 || vardata->data.mastervardata.origvars != NULL);
921 // assert(vardata->blocknr != -1 || vardata->data.mastervardata.origvars[0] != NULL);
922 // assert(vardata->blocknr != -1 || GCGvarGetBlock(vardata->data.mastervardata.origvars[0]) == -1
923 // || GCGoriginalVarIsLinking(vardata->data.mastervardata.origvars[0]));
924 
925 
926  return vardata->data.mastervardata.origvars;
927 }
928 #endif
929 
930 #ifndef NDEBUG
931 /** returns the fraction of original variables the master variable is contained in */
933  SCIP_VAR* var /**< SCIP variable structure */
934  )
935 {
936  SCIP_VARDATA* vardata;
937  assert(var != NULL);
938  assert(GCGvarIsMaster(var));
939 
940  vardata = SCIPvarGetData(var);
941  assert(vardata != NULL);
942 
943  assert(vardata->data.mastervardata.origvals != NULL || vardata->data.mastervardata.norigvars == 0);
944  return vardata->data.mastervardata.origvals;
945 }
946 #endif
947 
948 /* returns the fraction of the original variable the master variable is contained in */
950  SCIP_VAR* mastervar, /**< master variable data structure */
951  SCIP_VAR* origvar /**< original variable data structure */
952  )
953 {
954  SCIP_VARDATA* vardata;
955  SCIP_Real origval;
956  assert(mastervar != NULL);
957  assert(GCGvarIsMaster(mastervar));
958 
959  vardata = SCIPvarGetData(mastervar);
960  assert(vardata != NULL);
961 
962  assert(vardata->data.mastervardata.origvar2val != NULL || vardata->data.mastervardata.norigvars == 0);
963 
964  if( vardata->data.mastervardata.origvar2val == NULL )
965  return SCIP_INVALID;
966  if( GCGoriginalVarIsLinking(origvar) )
967  {
968  if( !GCGisLinkingVarInBlock(origvar, vardata->blocknr))
969  return SCIP_INVALID;
970  }
971  else if( vardata->blocknr != GCGvarGetBlock(origvar) )
972  return SCIP_INVALID;
973 
974  origval = SCIPhashmapGetImageReal(vardata->data.mastervardata.origvar2val, origvar);
975  return origval == SCIP_INVALID ? 0.0 : origval;
976 }
977 
978 #ifndef NDEBUG
980  SCIP_VAR* var /**< master variable data structure */
981  )
982 {
983  SCIP_VARDATA* vardata;
984  assert(var != NULL);
985  assert(GCGvarIsMaster(var));
986 
987  vardata = SCIPvarGetData(var);
988  assert(vardata != NULL);
989 
990  assert(vardata->data.mastervardata.origvar2val != NULL || vardata->data.mastervardata.norigvars == 0);
991  return vardata->data.mastervardata.origvar2val;
992 }
993 #endif
994 
995 #ifndef NDEBUG
996 /** returns the number of original variables the pricing variable is contained in */
998  SCIP_VAR* var /**< SCIP variable structure */
999  )
1000 {
1001  SCIP_VARDATA* vardata;
1002  assert(var != NULL);
1003  assert(GCGvarIsPricing(var));
1004 
1005  vardata = SCIPvarGetData(var);
1006  assert(vardata != NULL);
1007 
1008  assert(vardata->data.pricingvardata.norigvars >= 0);
1009  return vardata->data.pricingvardata.norigvars;
1010 }
1011 #endif
1012 
1013 #ifndef NDEBUG
1014 /** returns the original variables the pricing variable is contained in */
1016  SCIP_VAR* var /**< SCIP variable structure */
1017  )
1018 {
1019  SCIP_VARDATA* vardata;
1020  assert(var != NULL);
1021  assert(GCGvarIsPricing(var));
1022 
1023  vardata = SCIPvarGetData(var);
1024  assert(vardata != NULL);
1025 
1026  assert(vardata->data.pricingvardata.origvars != NULL);
1027  return vardata->data.pricingvardata.origvars;
1028 }
1029 #endif
1030 
1031 #ifndef NDEBUG
1032 /** returns the block of the variable */
1034  SCIP_VAR* var /**< SCIP variable structure */
1035  )
1036 {
1037  SCIP_VARDATA* vardata;
1038  assert(var != NULL);
1039  vardata = SCIPvarGetData(var);
1040  assert(vardata != NULL);
1041 
1042  assert(vardata->blocknr >= -2);
1043  return vardata->blocknr;
1044 }
1045 #endif
1046 
1047 /** sets the block of the variable */
1049  SCIP_VAR* var, /**< variable to set block for */
1050  int block /**< block to set */
1051  )
1052 {
1053  SCIP_VARDATA* vardata;
1054  assert(var != NULL);
1055  assert(block >= -1);
1056 
1057  vardata = SCIPvarGetData(var);
1058  assert(vardata != NULL);
1059  vardata->blocknr = block;
1060 }
1061 
1062 #ifndef NDEBUG
1063 /** returns TRUE if the linking variable is in the block, FALSE otherwise */
1065  SCIP_VAR* var, /**< variabel data structure */
1066  int block /**< pricing problem number */
1067  )
1068 {
1069  SCIP_VAR** pricingvars;
1070 
1071  assert(var != NULL);
1072  assert(block >= 0);
1073 
1074  assert(GCGoriginalVarIsLinking(var));
1075  assert(GCGvarIsOriginal(var));
1076 
1077  pricingvars = GCGlinkingVarGetPricingVars(var);
1078 
1079  return pricingvars[block] != NULL;
1080 }
1081 #endif
1082 
1083 /** determines if the master variable is in the given block */
1085  SCIP_VAR* mastervar, /**< master variable */
1086  int block /**< block number to check */
1087  )
1088 {
1089  int varblock;
1090 
1091  assert(mastervar != NULL);
1092  assert(block >= 0);
1093 
1094  varblock = GCGvarGetBlock(mastervar);
1095 
1096  /* the master variable is a direct copy from an original variable */
1097  if( varblock == -1 )
1098  {
1099  SCIP_VAR** origvars;
1100 
1101  origvars = GCGmasterVarGetOrigvars(mastervar);
1102 
1103  if( GCGmasterVarIsArtificial(mastervar) )
1104  return FALSE;
1105 
1106  /* the corresponding original variable is a linking variable */
1107  if( GCGoriginalVarIsLinking(origvars[0]) )
1108  return GCGisLinkingVarInBlock(origvars[0], block);
1109  else
1110  return FALSE;
1111  }
1112  else
1113  return varblock == block;
1114 }
1115 
1116 /** informs an original variable, that a variable in the master problem was created,
1117  * that contains a part of the original variable.
1118  * Saves this information in the original variable's data
1119  * @todo this method needs a little love
1120  */
1122  SCIP* scip, /**< SCIP data structure */
1123  SCIP_VAR* origvar, /**< original variable */
1124  SCIP_VAR* var, /**< master variable */
1125  SCIP_Real val /**< fraction of the original variable */
1126  )
1127 {
1128  SCIP_VARDATA* vardata;
1129 
1130  assert(scip != NULL);
1131  assert(origvar != NULL);
1132  assert(var != NULL);
1133  assert(GCGisOriginal(scip));
1134  vardata = SCIPvarGetData(origvar);
1135 
1136  assert(vardata != NULL);
1137  assert(GCGvarIsOriginal(origvar));
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);
1142 
1143  /* realloc mastervars array of the original variable, if needed */
1144  if( vardata->data.origvardata.maxmastervars == vardata->data.origvardata.nmastervars )
1145  {
1146  int newsize = SCIPcalcMemGrowSize(scip, vardata->data.origvardata.nmastervars+1);
1147  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(vardata->data.origvardata.mastervars), vardata->data.origvardata.maxmastervars,
1148  newsize) );
1149  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(vardata->data.origvardata.mastervals), vardata->data.origvardata.maxmastervars,
1150  newsize) );
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;
1154  }
1155  /* add information to the original variable's vardata */
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++;
1159 
1160  return SCIP_OKAY;
1161 }
1162 
1163 /** informs an original variable, that a variable in the master problem was deleted,
1164  * that contains a part of the original variable.
1165  * Update the information in the original variable's data
1166  * @todo this method needs a little love
1167  */
1169  SCIP* scip, /**< SCIP data structure */
1170  SCIP_VAR* origvar, /**< original variable */
1171  SCIP_VAR* var /**< master variable */
1172  )
1173 {
1174  SCIP_VARDATA* vardata;
1175  int i;
1176 
1177  assert(scip != NULL);
1178  assert(origvar != NULL);
1179  assert(var != NULL);
1180 
1181  vardata = SCIPvarGetData(origvar);
1182 
1183  assert(vardata != NULL);
1184  assert(GCGvarIsOriginal(origvar));
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);
1189 
1190  for( i = 0; i < vardata->data.origvardata.nmastervars; ++i )
1191  {
1192  if( vardata->data.origvardata.mastervars[i] == var )
1193  {
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)--;
1197 
1198  break;
1199  }
1200  }
1201  assert(i <= vardata->data.origvardata.nmastervars);
1202 #ifndef NDEBUG
1203  for( ; i < vardata->data.origvardata.nmastervars; ++i )
1204  {
1205  assert(vardata->data.origvardata.mastervars[i] != var);
1206  }
1207 #endif
1208 
1209  return SCIP_OKAY;
1210 }
1211 
1212 /** creates the corresponding pricing variable for the given original variable */
1214  SCIP* scip, /**< SCIP data structure */
1215  SCIP_VAR* origvar, /**< original variable */
1216  SCIP_VAR** var /**< pricing variable */
1217  )
1218 {
1219  SCIP_VARDATA* vardata;
1220  char name[SCIP_MAXSTRLEN];
1221  int pricingprobnr;
1222  assert(scip != NULL);
1223  assert(origvar != NULL);
1224  assert(var != NULL);
1225  assert(GCGvarIsOriginal(origvar));
1226  assert(!GCGoriginalVarIsLinking(origvar));
1227  assert(GCGoriginalVarGetPricingVar(origvar) == NULL);
1228 
1229  /* get the number of the pricing block to which the variable belongs */
1230  pricingprobnr = GCGvarGetBlock(origvar);
1231 
1232  /* create variable data */
1233  SCIP_CALL( SCIPallocBlockMemory(scip, &vardata) );
1234  vardata->vartype = GCG_VARTYPE_PRICING;
1235  vardata->blocknr = pricingprobnr;
1236  vardata->data.pricingvardata.maxorigvars = STARTMAXORIGVARS;
1237  SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(vardata->data.pricingvardata.origvars), vardata->data.pricingvardata.maxorigvars) ); /*lint !e506*/
1238  vardata->data.pricingvardata.origvars[0] = origvar;
1239  vardata->data.pricingvardata.norigvars = 1;
1240 
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) );
1245 
1246  return SCIP_OKAY;
1247 }
1248 
1249 /** creates the corresponding pricing variable for the given original variable */
1251  SCIP* pricingscip, /**< pricing problem SCIP data structure */
1252  int pricingprobnr, /**< number of the pricing problem */
1253  SCIP_VAR* origvar, /**< original variable */
1254  SCIP_VAR** var /**< pointer to store new pricing variable */
1255  )
1256 {
1257  SCIP_VARDATA* vardata;
1258  char name[SCIP_MAXSTRLEN];
1259 
1260  assert(pricingscip != NULL);
1261  assert(pricingprobnr >= 0);
1262  assert(origvar != NULL);
1263  assert(GCGoriginalVarIsLinking(origvar));
1264  assert(var != NULL);
1265 
1266  /* create variable data */
1267  SCIP_CALL( SCIPallocBlockMemory(pricingscip, &vardata) );
1268  vardata->vartype = GCG_VARTYPE_PRICING;
1269  vardata->blocknr = pricingprobnr;
1270  vardata->data.pricingvardata.maxorigvars = STARTMAXORIGVARS;
1271  SCIP_CALL( SCIPallocBlockMemoryArray(pricingscip, &(vardata->data.pricingvardata.origvars), vardata->data.pricingvardata.maxorigvars) ); /*lint !e506*/
1272  vardata->data.pricingvardata.origvars[0] = origvar;
1273  vardata->data.pricingvardata.norigvars = 1;
1274 
1275  /* create and add variable */
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) );
1280 
1281  return SCIP_OKAY;
1282 }
1283 
1284 /** creates the corresponding constraint in the master problem for the linking variable */
1286  SCIP* masterscip, /**< msater problem SCIP data structure */
1287  int pricingprobnr, /**< number of the pricing problem */
1288  SCIP_VAR* origvar, /**< original variable */
1289  SCIP_CONS** linkcons /**< constraint linking pricing variables */
1290  )
1291 {
1292  char name[SCIP_MAXSTRLEN];
1293 
1294  assert(masterscip != NULL);
1295  assert(pricingprobnr >= 0);
1296  assert(origvar != NULL);
1297  assert(GCGoriginalVarIsLinking(origvar));
1298  assert(linkcons != NULL);
1299 
1300  /* add corresponding linking constraint to the master problem */
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) );
1304 
1305  return SCIP_OKAY;
1306 }
1307 
1308 /** creates the master var and initializes the vardata */
1309 SCIP_RETCODE GCGcreateMasterVar(
1310  SCIP* scip, /**< master SCIP data structure */
1311  SCIP* origscip, /**< original SCIP data structure */
1312  SCIP* pricingscip, /**< pricing problem SCIP data structure */
1313  SCIP_VAR** newvar, /**< pointer to store new master variable */
1314  const char* varname, /**< new variable name */
1315  SCIP_Real objcoeff, /**< new objective coefficient */
1316  SCIP_VARTYPE vartype, /**< new variable type */
1317  SCIP_Bool solisray, /**< indicates whether new variable is a ray */
1318  int prob, /**< number of pricing problem that created this variable */
1319  int nsolvars, /**< number of variables in the solution */
1320  SCIP_Real* solvals, /**< values of variables in the solution */
1321  SCIP_VAR** solvars, /**< variables with non zero coefficient in the solution */
1322  SCIP_Bool auxiliaryvar /**< is new variable an Benders' auxiliary variables? */
1323  )
1324 {
1325  SCIP_VARDATA* newvardata;
1326  SCIP_Real lb;
1327  int i;
1328  int j;
1329  SCIP_Bool trivialsol;
1330 
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);
1337  assert(prob >= 0);
1338  assert(nsolvars >= 0);
1339  assert(solvals != NULL || nsolvars == 0);
1340  assert(solvars != NULL || nsolvars == 0);
1341 
1342  trivialsol = FALSE;
1343 
1344  lb = 0.0;
1345  if( auxiliaryvar )
1346  lb = -SCIPinfinity(scip);
1347 
1348  /* create data for the new variable in the master problem */
1349  SCIP_CALL( SCIPallocBlockMemory(scip, &newvardata) );
1350  newvardata->vartype = GCG_VARTYPE_MASTER;
1351  newvardata->blocknr = prob;
1352  newvardata->data.mastervardata.index = -1;
1353 
1354  /* store whether the variable represents a ray */
1355  newvardata->data.mastervardata.isray = solisray;
1356  newvardata->data.mastervardata.isartificial = FALSE;
1357 
1358  /* create variable in the master problem */
1359  SCIP_CALL( SCIPcreateVar(scip, newvar, varname, lb, SCIPinfinity(scip), /* GCGrelaxGetNIdenticalBlocks(origprob, prob) */
1360  objcoeff, vartype, TRUE, TRUE, NULL, NULL, gcgvardeltrans, NULL, newvardata) );
1361 
1362  /* count number of non-zeros */
1363  newvardata->data.mastervardata.norigvars = 0;
1364  newvardata->data.mastervardata.maxorigvars = 0;
1365 
1366  for( i = 0; i < nsolvars; i++ )
1367  {
1368  assert(solvars != NULL);
1369  assert(solvals != NULL);
1370 
1371  assert(!SCIPisInfinity(scip, solvals[i]));
1372  if( !SCIPisZero(scip, solvals[i]) )
1373  {
1374  newvardata->data.mastervardata.norigvars++;
1375  }
1376  }
1377 
1378  /*
1379  * if we have not added any original variable to the mastervariable, all coefficients were 0.
1380  * In that case, we will add all variables in the pricing problem
1381  */
1382  if( newvardata->data.mastervardata.norigvars == 0 && !auxiliaryvar )
1383  {
1384  newvardata->data.mastervardata.norigvars = SCIPgetNOrigVars(pricingscip);
1385  trivialsol = TRUE;
1386  }
1387 
1388  if( newvardata->data.mastervardata.norigvars > 0 )
1389  {
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) );
1394  }
1395  else
1396  {
1397  newvardata->data.mastervardata.origvars = NULL;
1398  newvardata->data.mastervardata.origvals = NULL;
1399  newvardata->data.mastervardata.origvar2val = NULL;
1400  }
1401 
1402  /* number of original variables already saved in mastervardata */
1403  j = 0;
1404 
1405  /* update variable datas */
1406  for( i = 0; i < nsolvars && !trivialsol; i++ )
1407  {
1408  SCIP_Real solval;
1409 
1410  assert(solvars != NULL);
1411  assert(solvals != NULL);
1412 
1413  solval = solvals[i];
1414 
1415  if( !SCIPisZero(scip, solval) )
1416  {
1417  SCIP_VAR* origvar;
1418  assert(GCGvarIsPricing(solvars[i]));
1419 
1420  origvar = GCGpricingVarGetOrigvars(solvars[i])[0];
1421  assert(origvar != NULL);
1422 
1423  assert(newvardata->data.mastervardata.origvars != NULL);
1424  assert(newvardata->data.mastervardata.origvals != NULL);
1425  assert(GCGvarIsOriginal(origvar));
1426  assert(!solisray || vartype == SCIP_VARTYPE_CONTINUOUS || SCIPisIntegral(scip, solval) || SCIPvarGetType(solvars[i]) == SCIP_VARTYPE_CONTINUOUS);
1427 
1428  /* round solval if possible to avoid numerical troubles */
1429  if( SCIPvarIsIntegral(solvars[i]) && SCIPisIntegral(scip, solval) )
1430  solval = SCIPround(scip, solval);
1431 
1432  /* save in the master problem variable's data the quota of the corresponding original variable */
1433  newvardata->data.mastervardata.origvars[j] = origvar;
1434  newvardata->data.mastervardata.origvals[j] = solval;
1435  SCIPhashmapInsertReal(newvardata->data.mastervardata.origvar2val, origvar, solval);
1436  /* save the quota in the original variable's data */
1437  SCIP_CALL( GCGoriginalVarAddMasterVar(origscip, origvar, *newvar, solval) );
1438  j++;
1439  }
1440  }
1441  if( trivialsol )
1442  {
1443  SCIP_VAR** pricingvars;
1444  int npricingvars;
1445 
1446  pricingvars = SCIPgetOrigVars(pricingscip);
1447  npricingvars = SCIPgetNOrigVars(pricingscip);
1448  for( j = 0; j < npricingvars; ++j )
1449  {
1450  SCIP_VAR* origvar;
1451  assert(GCGvarIsPricing(pricingvars[j]));
1452 
1453  origvar = GCGpricingVarGetOrigvars(pricingvars[j])[0];
1454  assert(origvar != NULL);
1455 
1456  assert(newvardata->data.mastervardata.origvars != NULL);
1457  assert(newvardata->data.mastervardata.origvals != NULL);
1458  assert(GCGvarIsOriginal(origvar));
1459  /* save in the master problem variable's data the quota of the corresponding original variable */
1460  newvardata->data.mastervardata.origvars[j] = origvar;
1461  newvardata->data.mastervardata.origvals[j] = 0.0;
1462  SCIPhashmapInsertReal(newvardata->data.mastervardata.origvar2val, origvar, 0.0);
1463  /* save the quota in the original variable's data */
1464  SCIP_CALL( GCGoriginalVarAddMasterVar(origscip, origvar, *newvar, 0.0) );
1465  }
1466  }
1467  assert(j == newvardata->data.mastervardata.norigvars);
1468 return SCIP_OKAY;
1469 }
1470 
1471 /** creates initial master variables and the vardata */
1473  SCIP* scip, /**< SCIP data structure */
1474  SCIP_VAR* var, /**< original variable */
1475  SCIP_VAR** newvar /**< pointer to store new variable */
1476 
1477  )
1478 {
1479  SCIP_VARDATA* newvardata;
1480  int blocknr;
1481 
1482  blocknr = GCGvarGetBlock(var);
1483  assert( blocknr == -1 || blocknr == -2
1485 
1486  if( blocknr == -1 )
1487  {
1488  SCIPdebugMessage("var %s is in no block - copy it directly to the master\n", SCIPvarGetName(var));
1489  }
1490  else
1491  {
1492  SCIPdebugMessage("var %s is a linking variable - copy it directly to the master\n", SCIPvarGetName(var));
1493  }
1494 
1495  /* create vardata */
1496  SCIP_CALL( SCIPallocBlockMemory(scip, &newvardata) );
1497  newvardata->vartype = GCG_VARTYPE_MASTER;
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;
1504 
1505  /* save corresoponding origvar */
1506  SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(newvardata->data.mastervardata.origvars), 1) ); /*lint !e506*/
1507  SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(newvardata->data.mastervardata.origvals), 1) ); /*lint !e506*/
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);
1512 
1513  /* create variable in the master problem */
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) );
1517 
1518  return SCIP_OKAY;
1519 }
1520 
1521 /** creates artificial variable and the vardata */
1523  SCIP* scip, /**< SCIP data structure */
1524  SCIP_VAR** newvar, /**< pointer to store new variable */
1525  const char* name, /**< name of variable, or NULL for automatic name creation */
1526  SCIP_Real objcoef /**< objective coefficient of artificial variable */
1527  )
1528 {
1529  SCIP_VARDATA* newvardata;
1530 
1531  /* create vardata */
1532  SCIP_CALL( SCIPallocBlockMemory(scip, &newvardata) );
1533  newvardata->vartype = GCG_VARTYPE_MASTER;
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;
1539 
1540  newvardata->data.mastervardata.origvars = NULL;
1541  newvardata->data.mastervardata.origvals = NULL;
1542  newvardata->data.mastervardata.origvar2val = NULL;
1543  newvardata->data.mastervardata.index = -1;
1544 
1545  /* create variable in the master problem */
1546  SCIP_CALL( SCIPcreateVar(scip, newvar, name,
1547  0.0, SCIPinfinity(scip), objcoef, SCIP_VARTYPE_IMPLINT,
1548  TRUE, TRUE, NULL, NULL, gcgvardeltrans, NULL, newvardata) );
1549 
1550  return SCIP_OKAY;
1551 }
1552 
1553 /* adds the vardata to the auxiliary variable */
1555  SCIP* scip, /**< SCIP data structure */
1556  SCIP_VAR* auxiliaryvar, /**< the auxiliary variable */
1557  int probnumber /**< the subproblem number */
1558  )
1559 {
1560  SCIP_VARDATA* newvardata;
1561 
1562  assert(scip != NULL);
1563  assert(auxiliaryvar != NULL);
1564 
1565  /* create data for the new variable in the master problem */
1566  SCIP_CALL( SCIPallocBlockMemory(scip, &newvardata) );
1567  newvardata->vartype = GCG_VARTYPE_MASTER;
1568  newvardata->blocknr = probnumber;
1569 
1570  /* store whether the variable represents a ray */
1571  newvardata->data.mastervardata.isray = FALSE;
1572 
1573  /* count number of non-zeros */
1574  newvardata->data.mastervardata.norigvars = 0;
1575  newvardata->data.mastervardata.maxorigvars = 0;
1576 
1577  newvardata->data.mastervardata.origvars = NULL;
1578  newvardata->data.mastervardata.origvals = NULL;
1579  newvardata->data.mastervardata.origvar2val = NULL;
1580 
1581  /* setting the variable data */
1582  SCIPvarSetData(auxiliaryvar, newvardata);
1583 
1584  /* setting the deltrans callback */
1585  SCIPvarSetDeltransData(auxiliaryvar, gcgvardeltrans);
1586 
1587  return SCIP_OKAY;
1588 }
1589 
1590 /** set creation node of variable */
1592  SCIP_VAR* var, /**< variable data structure */
1593  SCIP_Longint creationNode /**< node in which the variable is created */
1594  )
1595 {
1596  SCIP_VARDATA* vardata;
1597  assert(var != NULL);
1598  assert(creationNode >= 0);
1599 
1600  vardata = SCIPvarGetData(var);
1601  vardata->creationnode = creationNode;
1602 }
1603 
1604 #ifndef NDEBUG
1605 /** return creation node of variable */
1606 long long int GCGgetCreationNode(
1607  SCIP_VAR* var /**< variable data structure */
1608  )
1609 {
1610  SCIP_VARDATA* vardata;
1611  assert(var != NULL);
1612 
1613  vardata = SCIPvarGetData(var);
1614  return vardata->creationnode;
1615 }
1616 #endif
1617 
1618 /** store creation time */
1620  SCIP_VAR* var, /**< variable data structure */
1621  SCIP_Real time /**< time at which the variable is created */
1622  )
1623 {
1624  SCIP_VARDATA* vardata;
1625  assert(var != NULL);
1626  assert(time >= 0.0);
1627 
1628  vardata = SCIPvarGetData(var);
1629  vardata->creationtime = time;
1630 }
1631 
1632 #ifndef NDEBUG
1633 /** return stored creation time */
1635  SCIP_VAR* var /**< variable data structure */
1636  )
1637 {
1638  SCIP_VARDATA* vardata;
1639  assert(var != NULL);
1640 
1641  vardata = SCIPvarGetData(var);
1642  return vardata->creationtime;
1643 }
1644 #endif
1645 
1646 /** store pricing reduced cost call */
1648  SCIP_VAR* var, /**< variable data structure */
1649  SCIP_Longint rootredcostcall /**< iteration at which the variable is created */
1650  )
1651 {
1652  SCIP_VARDATA* vardata;
1653  assert(var != NULL);
1654  assert(rootredcostcall >= -1);
1655 
1656  vardata = SCIPvarGetData(var);
1657  vardata->rootredcostcall = rootredcostcall;
1658 }
1659 
1660 #ifndef NDEBUG
1661 /** return stored pricing reduced cost call */
1663  SCIP_VAR* var /**< variable data structure */
1664  )
1665 {
1666  SCIP_VARDATA* vardata;
1667  assert(var != NULL);
1668 
1669  vardata = SCIPvarGetData(var);
1670  return vardata->rootredcostcall;
1671 }
1672 #endif
1673 
1674 /** store iteration */
1676  SCIP_VAR* var, /**< variable data structure */
1677  SCIP_Longint iteration /**< iteration at which the variable is created */
1678  )
1679 {
1680  SCIP_VARDATA* vardata;
1681  assert(var != NULL);
1682  assert(iteration >= 0);
1683 
1684  vardata = SCIPvarGetData(var);
1685  vardata->iteration = iteration;
1686 }
1687 
1688 #ifndef NDEBUG
1689 /** return stored iteration */
1690 SCIP_Longint GCGgetIteration(
1691  SCIP_VAR* var /**< variable data structure */
1692  )
1693 {
1694  SCIP_VARDATA* vardata;
1695  assert(var != NULL);
1696 
1697  vardata = SCIPvarGetData(var);
1698  return vardata->iteration;
1699 }
1700 #endif
1701 
1702 /** store gap */
1704  SCIP_VAR* var, /**< variable data structure */
1705  SCIP_Real gap /**< present gap when variable is created */
1706  )
1707 {
1708  SCIP_VARDATA* vardata;
1709  assert(var != NULL);
1710  assert(gap >= 0.0);
1711 
1712  vardata = SCIPvarGetData(var);
1713  vardata->gap = gap;
1714 }
1715 
1716 #ifndef NDEBUG
1717 /** return stored gap */
1718 SCIP_Real GCGgetVarGap(
1719  SCIP_VAR* var /**< variable data structure */
1720  )
1721 {
1722  SCIP_VARDATA* vardata;
1723  assert(var != NULL);
1724 
1725  vardata = SCIPvarGetData(var);
1726  return vardata->gap;
1727 }
1728 #endif
1729 
1730 /** store reduced cost */
1732  SCIP* scip, /**< master SCIP data structure */
1733  SCIP_VAR* var, /**< variable data structure */
1734  SCIP_Real redcost /**< reduced cost of the variable at creation */
1735  )
1736 {
1737  SCIP_VARDATA* vardata;
1738  assert(scip != NULL);
1739  assert(var != NULL);
1740  assert(SCIPisLE(scip, redcost, 0.0));
1741 
1742  vardata = SCIPvarGetData(var);
1743  vardata->redcost = redcost;
1744 }
1745 
1746 #ifndef NDEBUG
1747 /** return stored reduced cost */
1748 SCIP_Real GCGgetRedcost(
1749  SCIP_VAR* var /**< variable data structure */
1750  )
1751 {
1752  SCIP_VARDATA* vardata;
1753  assert(var != NULL);
1754 
1755  vardata = SCIPvarGetData(var);
1756  return vardata->redcost;
1757 }
1758 #endif
1759 
1760 /** updates the statistics part of the variable */
1762  SCIP* scip, /**< master SCIP data structure */
1763  SCIP* origprob, /**< original SCIP data structure */
1764  SCIP_VAR* newvar, /**< new variable for statistic update */
1765  SCIP_Real redcost /**< reduced cost of the variable */
1766  )
1767 {
1768  SCIP_Longint redcostcall;
1769  assert(scip != NULL);
1770  assert(GCGisMaster(scip));
1771  assert(origprob != NULL);
1772  assert(GCGisOriginal(origprob));
1773  assert(newvar != NULL);
1774 
1775  redcostcall = -1;
1776  GCGsetCreationNode(newvar, SCIPnodeGetNumber(SCIPgetCurrentNode(origprob)));
1777  GCGsetCreationTime(newvar, SCIPgetSolvingTime(scip));
1778 
1779  GCGsetRootRedcostCall(newvar, redcostcall);
1780  GCGsetIteration(newvar, SCIPgetNLPIterations(scip));
1781  GCGsetVarGap(newvar, MIN(SCIPgetGap(origprob), SCIPgetGap(scip))); /*lint !e666*/
1782  GCGsetRedcost(origprob, newvar, redcost);
1783 
1784 }
1785 
1786 /** prints the given variable: name, type (original, master or pricing) block number,
1787  * and the list of all variables related to the given variable
1788  */
1790  SCIP* scip, /**< SCIP data structure */
1791  FILE* file, /**< File to write information to, or NULL for stdout */
1792  SCIP_VAR* var /**< variable that should be printed */
1793  )
1794 {
1795  int i;
1796  int blocknr;
1797  assert(GCGvarIsOriginal(var) || GCGvarIsMaster(var) || GCGvarIsPricing(var));
1798 
1799  blocknr = GCGvarGetBlock(var);
1800 
1801  if( GCGvarIsOriginal(var) )
1802  {
1803  SCIP_VAR** mastervars;
1804  SCIP_Real* mastervals;
1805  int nmastervars;
1806 
1807  if( GCGoriginalVarIsLinking(var) )
1808  {
1809  SCIP_VAR** pricingvars;
1810  int nblocks;
1811  int j;
1812  pricingvars = GCGlinkingVarGetPricingVars(var);
1813  nblocks = GCGlinkingVarGetNBlocks(var);
1814  SCIPinfoMessage(scip, file, "Variable %s (linking): %d block%s (", SCIPvarGetName(var), nblocks, nblocks == 1 ? "":"s" );
1815  /*lint --e{440}*/
1816  for( i = 0, j = 0; j < nblocks; ++i )
1817  {
1818  if( pricingvars[i] != NULL )
1819  {
1820  SCIPinfoMessage(scip, file, "%d ", i);
1821  ++j;
1822  }
1823  }
1824  SCIPinfoMessage(scip, file, ")\n");
1825  }
1826  else
1827  {
1828  SCIPinfoMessage(scip, file, "Variable %s (original): block %d\n", SCIPvarGetName(var), blocknr);
1829  }
1830 
1831  mastervars = GCGoriginalVarGetMastervars(var);
1832  mastervals = GCGoriginalVarGetMastervals(var);
1833  nmastervars = GCGoriginalVarGetNMastervars(var);
1834  SCIPinfoMessage(scip, file, "mastervars:");
1835  for( i = 0; i < nmastervars-1; i++ )
1836  {
1837  SCIPinfoMessage(scip, file, "%s (%g), ", SCIPvarGetName(mastervars[i]), mastervals[i]);
1838  }
1839  SCIPinfoMessage(scip, file, "%s (%g)\n", SCIPvarGetName(mastervars[nmastervars-1]), mastervals[nmastervars-1]);
1840  }
1841  else if( GCGvarIsPricing(var) )
1842  {
1843  SCIP_VAR** origvars;
1844  int norigvars;
1845 
1846  origvars = GCGpricingVarGetOrigvars(var);
1847  norigvars = GCGpricingVarGetNOrigvars(var);
1848 
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++ )
1852  {
1853  SCIPinfoMessage(scip, file, "%s, ", SCIPvarGetName(origvars[i]));
1854  }
1855  SCIPinfoMessage(scip, file, "%s\n", SCIPvarGetName(origvars[norigvars-1]));
1856  }
1857  else if( GCGvarIsMaster(var) )
1858  {
1859  SCIP_VAR** origvars;
1860  int norigvars;
1861  SCIP_Real* origvals;
1862 
1863  origvars = GCGmasterVarGetOrigvars(var);
1864  norigvars = GCGmasterVarGetNOrigvars(var);
1865  origvals = GCGmasterVarGetOrigvals(var);
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++ )
1869  {
1870  SCIPinfoMessage(scip, file, "%s (%g), ", SCIPvarGetName(origvars[i]), origvals[i]);
1871  }
1872  SCIPinfoMessage(scip, file, "%s (%g)\n", SCIPvarGetName(origvars[norigvars-1]), origvals[norigvars-1]);
1873  }
1874 }
1875 
1876 #ifndef NDEBUG
1877 /* returns the index of the mater variable */
1879  SCIP_VAR* var /**< SCIP variable structure */
1880  )
1881 {
1882  SCIP_VARDATA* vardata;
1883  assert(var != NULL);
1884 
1885  vardata = SCIPvarGetData(var);
1886  return vardata->data.mastervardata.index;
1887 }
1888 #endif
1889 
1890 /* sets the index of the master variable */
1892  SCIP_VAR* var, /**< SCIP variable structure */
1893  int index /**< index */
1894  )
1895 {
1896  SCIP_VARDATA* vardata;
1897  assert(var != NULL);
1898 
1899  vardata = SCIPvarGetData(var);
1900  vardata->data.mastervardata.index = index;
1901 }
void GCGprintVar(SCIP *scip, FILE *file, SCIP_VAR *var)
Definition: gcgvar.c:1789
@ DEC_DECMODE_BENDERS
Definition: type_decomp.h:62
int GCGmasterVarGetNOrigvars(SCIP_VAR *var)
Definition: gcgvar.c:886
SCIP_RETCODE GCGoriginalVarAddBlock(SCIP *scip, SCIP_VAR *var, int newblock, int nblocks, DEC_DECMODE mode)
Definition: gcgvar.c:726
GCG interface methods.
SCIP_Bool GCGvarIsMaster(SCIP_VAR *var)
Definition: gcgvar.c:150
void GCGsetCreationNode(SCIP_VAR *var, SCIP_Longint creationNode)
Definition: gcgvar.c:1591
void GCGlinkingVarSetLinkingCons(SCIP_VAR *var, SCIP_CONS *cons, int index)
Definition: gcgvar.c:806
int GCGoriginalVarGetNCoefs(SCIP_VAR *var)
Definition: gcgvar.c:641
void GCGvarSetBlock(SCIP_VAR *var, int block)
Definition: gcgvar.c:1048
int GCGoriginalVarGetNMastervars(SCIP_VAR *var)
Definition: gcgvar.c:569
SCIP_VAR ** GCGoriginalVarGetMastervars(SCIP_VAR *var)
Definition: gcgvar.c:587
@ GCG_VARTYPE_MASTER
SCIP_RETCODE GCGoriginalVarAddCoef(SCIP *scip, SCIP_VAR *var, SCIP_Real val, SCIP_CONS *cons)
Definition: gcgvar.c:679
SCIP_Bool GCGisLinkingVarInBlock(SCIP_VAR *var, int block)
Definition: gcgvar.c:1064
SCIP_HASHMAP * GCGmasterVarGetOrigvalmap(SCIP_VAR *var)
Definition: gcgvar.c:979
SCIP_RETCODE GCGoriginalVarCreatePricingVar(SCIP *scip, SCIP_VAR *origvar, SCIP_VAR **var)
Definition: gcgvar.c:1213
SCIP_RETCODE GCGaddDataAuxiliaryVar(SCIP *scip, SCIP_VAR *auxiliaryvar, int probnumber)
Definition: gcgvar.c:1554
SCIP_VAR ** GCGmasterVarGetOrigvars(SCIP_VAR *var)
Definition: gcgvar.c:908
SCIP_Real * GCGmasterVarGetOrigvals(SCIP_VAR *var)
Definition: gcgvar.c:932
int GCGvarGetBlock(SCIP_VAR *var)
Definition: gcgvar.c:1033
int GCGlinkingVarGetNBlocks(SCIP_VAR *var)
Definition: gcgvar.c:493
void GCGsetVarGap(SCIP_VAR *var, SCIP_Real gap)
Definition: gcgvar.c:1703
SCIP_Bool GCGvarIsPricing(SCIP_VAR *var)
Definition: gcgvar.c:134
@ DEC_DECMODE_ORIGINAL
Definition: type_decomp.h:63
SCIP_Bool GCGmasterVarIsLinking(SCIP_VAR *var)
Definition: gcgvar.c:828
SCIP_Real * GCGoriginalVarGetMastervals(SCIP_VAR *var)
Definition: gcgvar.c:605
void GCGoriginalVarSetNCoefs(SCIP_VAR *var, int ncoefs)
Definition: gcgvar.c:658
SCIP_VAR * GCGoriginalVarGetPricingVar(SCIP_VAR *var)
Definition: gcgvar.c:216
int GCGgetNPricingprobs(SCIP *scip)
Definition: relax_gcg.c:3979
SCIP_RETCODE GCGcreateArtificialVar(SCIP *scip, SCIP_VAR **newvar, const char *name, SCIP_Real objcoef)
Definition: gcgvar.c:1522
SCIP_Bool GCGvarIsOriginal(SCIP_VAR *var)
Definition: gcgvar.c:166
various SCIP helper methods
SCIP_CONS ** GCGlinkingVarGetLinkingConss(SCIP_VAR *var)
Definition: gcgvar.c:787
SCIP_Real GCGmasterVarGetOrigval(SCIP_VAR *mastervar, SCIP_VAR *origvar)
Definition: gcgvar.c:949
void GCGsetRedcost(SCIP *scip, SCIP_VAR *var, SCIP_Real redcost)
Definition: gcgvar.c:1731
SCIP_VAR * GCGpricingVarGetOriginalVar(SCIP_VAR *var)
Definition: gcgvar.c:511
#define STARTMAXMASTERVARS
Definition: gcgvar.c:45
SCIP_Bool GCGoriginalVarIsTransVar(SCIP_VAR *var)
Definition: gcgvar.c:199
long long int GCGgetCreationNode(SCIP_VAR *var)
Definition: gcgvar.c:1606
void GCGoriginalVarSetPricingVar(SCIP_VAR *var, SCIP_VAR *pricingvar)
Definition: gcgvar.c:235
void GCGsetRootRedcostCall(SCIP_VAR *var, SCIP_Longint rootredcostcall)
Definition: gcgvar.c:1647
static SCIP_DECL_VARDELTRANS(gcgvardeltrans)
Definition: gcgvar.c:118
int GCGpricingVarGetNOrigvars(SCIP_VAR *var)
Definition: gcgvar.c:997
SCIP_Bool GCGisMaster(SCIP *scip)
Definition: misc.c:675
SCIP_RETCODE GCGoriginalVarAddMasterVar(SCIP *scip, SCIP_VAR *origvar, SCIP_VAR *var, SCIP_Real val)
Definition: gcgvar.c:1121
SCIP_RETCODE GCGlinkingVarCreatePricingVar(SCIP *pricingscip, int pricingprobnr, SCIP_VAR *origvar, SCIP_VAR **var)
Definition: gcgvar.c:1250
SCIP_Real * GCGoriginalVarGetCoefs(SCIP_VAR *var)
Definition: gcgvar.c:623
SCIP_RETCODE GCGcreateInitialMasterVar(SCIP *scip, SCIP_VAR *var, SCIP_VAR **newvar)
Definition: gcgvar.c:1472
DEC_DECMODE GCGgetMasterDecompMode(SCIP *masterprob)
Definition: relax_gcg.c:5144
SCIP_Bool GCGisOriginal(SCIP *scip)
Definition: misc.c:665
DEC_DECMODE GCGgetDecompositionMode(SCIP *scip)
Definition: relax_gcg.c:5123
SCIP_RETCODE GCGoriginalVarRemoveMasterVar(SCIP *scip, SCIP_VAR *origvar, SCIP_VAR *var)
Definition: gcgvar.c:1168
SCIP_RETCODE GCGcreateMasterVar(SCIP *scip, SCIP *origscip, SCIP *pricingscip, SCIP_VAR **newvar, const char *varname, SCIP_Real objcoeff, SCIP_VARTYPE vartype, SCIP_Bool solisray, int prob, int nsolvars, SCIP_Real *solvals, SCIP_VAR **solvars, SCIP_Bool auxiliaryvar)
Definition: gcgvar.c:1309
SCIP_CONS ** GCGoriginalVarGetMasterconss(SCIP_VAR *var)
Definition: gcgvar.c:710
enum Decmode DEC_DECMODE
Definition: type_decomp.h:68
SCIP_Longint GCGgetRootRedcostCall(SCIP_VAR *var)
Definition: gcgvar.c:1662
SCIP_Real GCGgetVarGap(SCIP_VAR *var)
Definition: gcgvar.c:1718
SCIP_Longint GCGgetIteration(SCIP_VAR *var)
Definition: gcgvar.c:1690
GCG relaxator.
SCIP_RETCODE GCGorigVarCreateData(SCIP *scip, SCIP_VAR *var)
Definition: gcgvar.c:313
SCIP_VAR ** GCGpricingVarGetOrigvars(SCIP_VAR *var)
Definition: gcgvar.c:1015
static SCIP_DECL_VARDELORIG(GCGvarDelOrig)
Definition: gcgvar.c:54
SCIP_RETCODE GCGpricingVarAddOrigVar(SCIP *scip, SCIP_VAR *pricingvar, SCIP_VAR *origvar)
Definition: gcgvar.c:531
int GCGmasterVarGetIndex(SCIP_VAR *var)
Definition: gcgvar.c:1878
@ GCG_VARTYPE_PRICING
SCIP_Bool GCGmasterVarIsArtificial(SCIP_VAR *var)
Definition: gcgvar.c:869
SCIP_RETCODE GCGlinkingVarCreateMasterCons(SCIP *masterscip, int pricingprobnr, SCIP_VAR *origvar, SCIP_CONS **linkcons)
Definition: gcgvar.c:1285
SCIP_Real GCGgetRedcost(SCIP_VAR *var)
Definition: gcgvar.c:1748
SCIP_RETCODE GCGfreeOrigVarsData(SCIP *scip)
Definition: gcgvar.c:279
SCIP_Bool GCGmasterVarIsRay(SCIP_VAR *var)
Definition: gcgvar.c:852
SCIP_Bool GCGoriginalVarIsLinking(SCIP_VAR *var)
Definition: gcgvar.c:182
void GCGsetCreationTime(SCIP_VAR *var, SCIP_Real time)
Definition: gcgvar.c:1619
#define STARTMAXORIGVARS
Definition: gcgvar.c:46
void GCGupdateVarStatistics(SCIP *scip, SCIP *origprob, SCIP_VAR *newvar, SCIP_Real redcost)
Definition: gcgvar.c:1761
public methods for GCG variables
@ GCG_VARTYPE_ORIGINAL
void GCGsetIteration(SCIP_VAR *var, SCIP_Longint iteration)
Definition: gcgvar.c:1675
void GCGlinkingVarSetPricingVar(SCIP_VAR *origvar, int pricingprobnr, SCIP_VAR *var)
Definition: gcgvar.c:427
SCIP_RETCODE GCGcopyPricingvarDataToMastervar(SCIP *scip, SCIP_VAR *pricingvar, SCIP_VAR *mastervar)
Definition: gcgvar.c:367
SCIP_Bool GCGisMasterVarInBlock(SCIP_VAR *mastervar, int block)
Definition: gcgvar.c:1084
SCIP_VAR ** GCGlinkingVarGetPricingVars(SCIP_VAR *var)
Definition: gcgvar.c:409
SCIP_Real GCGgetCreationTime(SCIP_VAR *var)
Definition: gcgvar.c:1634
data structures for GCG variable data
void GCGmasterVarSetIndex(SCIP_VAR *var, int index)
Definition: gcgvar.c:1891
SCIP_RETCODE GCGlinkingVarGetBlocks(SCIP_VAR *var, int nblocks, int *blocks)
Definition: gcgvar.c:450
SCIP_RETCODE GCGcreateOrigVarsData(SCIP *scip)
Definition: gcgvar.c:255