SCIP-SDP  3.1.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SdpVarmapper.c
Go to the documentation of this file.
1 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2 /* */
3 /* This file is part of SCIPSDP - a solving framework for mixed-integer */
4 /* semidefinite programs based on SCIP. */
5 /* */
6 /* Copyright (C) 2011-2013 Discrete Optimization, TU Darmstadt */
7 /* EDOM, FAU Erlangen-Nürnberg */
8 /* 2014-2017 Discrete Optimization, TU Darmstadt */
9 /* */
10 /* */
11 /* This program is free software; you can redistribute it and/or */
12 /* modify it under the terms of the GNU Lesser General Public License */
13 /* as published by the Free Software Foundation; either version 3 */
14 /* of the License, or (at your option) any later version. */
15 /* */
16 /* This program is distributed in the hope that it will be useful, */
17 /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
18 /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
19 /* GNU Lesser General Public License for more details. */
20 /* */
21 /* You should have received a copy of the GNU Lesser General Public License */
22 /* along with this program; if not, write to the Free Software */
23 /* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.*/
24 /* */
25 /* */
26 /* Based on SCIP - Solving Constraint Integer Programs */
27 /* Copyright (C) 2002-2017 Zuse Institute Berlin */
28 /* SCIP is distributed under the terms of the SCIP Academic Licence, */
29 /* see file COPYING in the SCIP distribution. */
30 /* */
31 /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
32 
38 #include "scip/scip.h"
39 #include "scip/type_misc.h" /* for SCIP Hashmap */
40 #include "SdpVarmapper.h"
41 
42 /* turn off lint warnings for whole file: */
43 /*lint --e{788,818}*/
44 
45 struct Sdpvarmapper
46 {
47  SCIP_VAR** sdptoscip;
48  SCIP_HASHMAP* sciptosdp;
49  int nvars;
50 };
51 
54  SCIP* scip,
55  SdpVarmapper** varmapper,
56  int size
57  )
58 {
59  assert ( scip != NULL );
60  assert ( varmapper != NULL );
61  assert ( size >= 0 );
62 
63  SCIP_CALL( SCIPallocBlockMemory(scip, varmapper) );
64  (*varmapper)->nvars = 0;
65  (*varmapper)->sdptoscip = NULL;
66 
67  if ( size == 0 )
68  {
69  SCIPdebugMessage("SCIPsdpVarmapperCreate called for size 0!\n");
70 
71  return SCIP_OKAY;
72  }
73 
74  SCIP_CALL( SCIPhashmapCreate(&((*varmapper)->sciptosdp), SCIPblkmem(scip), size) );
75 
76  return SCIP_OKAY;
77 }
78 
80 SCIP_RETCODE SCIPsdpVarmapperFree(
81  SCIP* scip,
82  SdpVarmapper** varmapper
83  )
84 {
85  int i;
86 
87  SCIPdebugMessage("Freeing SdpVarmapper \n");
88 
89  assert ( scip != NULL );
90  assert ( varmapper != NULL );
91 
92  /* release all vars */
93  for (i = 0; i < (*varmapper)->nvars; i++)
94  {
95  SCIP_CALL( SCIPreleaseVar(scip, &((*varmapper)->sdptoscip[i])) );
96  }
97 
98  if ( (*varmapper)->nvars )
99  SCIPhashmapFree(&((*varmapper)->sciptosdp));
100 
101  SCIPfreeBlockMemoryArrayNull(scip, &(*varmapper)->sdptoscip, (*varmapper)->nvars);
102  SCIPfreeBlockMemory(scip, varmapper);
103 
104  return SCIP_OKAY;
105 }
106 
109  SCIP* scip,
110  SdpVarmapper* varmapper,
111  int nvars,
112  SCIP_VAR** vars
113  )
114 { /*lint --e{818}*/
115  int i;
116  SCIP_Bool reallocneeded; /* we allocate memory to add nvars variables, but if some of them already existed in the varmapper, we don't add them and
117  * should reallocate later */
118  int allocsize;
119 
120  if ( nvars == 0 )
121  return SCIP_OKAY;
122 
123  assert ( scip != NULL );
124  assert ( varmapper != NULL );
125  assert ( nvars >= 0 );
126  assert ( vars != NULL );
127 
128  allocsize = varmapper->nvars + nvars;
129  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), varmapper->nvars, allocsize) );
130 
131  reallocneeded = FALSE;
132 
133  for (i = 0; i < nvars; i++)
134  {
135  if ( ! (SCIPhashmapExists(varmapper->sciptosdp, vars[i])) ) /* make sure, that there are no duplicates in the lists */
136  {
137  varmapper->sdptoscip[varmapper->nvars] = vars[i];
138  SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, (void*) vars[i], (void*) (size_t) varmapper->nvars) );
139  varmapper->nvars++;
140  SCIP_CALL( SCIPcaptureVar(scip, vars[i]) );
141  }
142  else
143  {
144  SCIPdebugMessage("variable %s was not added to the varmapper as it was already part of it \n", SCIPvarGetName(vars[i]));
145  reallocneeded = TRUE;
146  }
147  }
148 
149  if ( reallocneeded )
150  {
151  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), allocsize, varmapper->nvars) );
152  }
153 
154  return SCIP_OKAY;
155 }
156 
159  SCIP* scip,
160  SdpVarmapper* varmapper,
161  SCIP_VAR* var,
162  int pos
163  )
164 {
165  int i;
166 
167  assert ( scip != NULL );
168  assert ( varmapper != NULL );
169  assert ( var != NULL );
170  assert ( pos >= 0 );
171  assert ( pos <= varmapper->nvars );
172 
173  if ( ! SCIPhashmapExists(varmapper->sciptosdp, var) ) /* make sure, that there are no duplicates in the lists */
174  {
175  if ( pos == varmapper->nvars ) /* add it to the end */
176  {
177  SCIP_CALL(SCIPsdpVarmapperAddVars(scip, varmapper, 1, &var));
178  }
179  else
180  {
181  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars + 1) );
182 
183  /* move all variables after pos one spot to the right to make room for the new one */
184  for (i = varmapper->nvars - 1; i >= pos; i--)
185  {
186  varmapper->sdptoscip[i + 1] = varmapper->sdptoscip[i]; /*lint !e679*/
187  SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i + 1], (void*) (size_t) (i + 1)) );
188  }
189 
190  varmapper->sdptoscip[pos] = var;
191  SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, var, (void*) (size_t) pos) );
192  varmapper->nvars++;
193  SCIP_CALL( SCIPcaptureVar(scip, var) );
194  }
195  }
196  else
197  SCIPdebugMessage("variable %s was not added to the varmapper as it was already part of it.\n", SCIPvarGetName(var));
198 
199  return SCIP_OKAY;
200 }
201 
204  SdpVarmapper* varmapper
205  )
206 {
207  assert ( varmapper != NULL );
208 
209  return varmapper->nvars;
210 }
211 
214  SdpVarmapper* varmapper,
215  SCIP_VAR* var
216  )
217 {
218  assert ( varmapper != NULL );
219  assert ( var != NULL );
220 
221  return SCIPhashmapExists(varmapper->sciptosdp, var);
222 }
223 
226  SdpVarmapper* varmapper,
227  SCIP_VAR* var
228  )
229 {
230  assert ( varmapper != NULL );
231  assert ( var != NULL );
232 
233  return (int) (size_t) SCIPhashmapGetImage(varmapper->sciptosdp, (void*) var);
234 }
235 
238  SdpVarmapper* varmapper,
239  int ind
240  )
241 {
242  assert ( varmapper != NULL );
243  assert ( 0 <= ind && ind < varmapper->nvars );
244 
245  return varmapper->sdptoscip[ind];
246 }
247 
250  SCIP* scip,
251  SdpVarmapper* varmapper,
252  int ind
253  )
254 {
255  SCIP_VAR* var;
256  int i;
257 
258  assert ( scip != NULL );
259  assert ( varmapper != NULL );
260  assert ( 0 <= ind && ind < varmapper->nvars );
261 
262  var = varmapper->sdptoscip[ind];
263 
264  assert ( SCIPhashmapExists(varmapper->sciptosdp, var) );
265 
266  SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, var) );
267  SCIP_CALL( SCIPreleaseVar(scip, &(varmapper)->sdptoscip[ind]) );
268 
269  /* shift all entries of the sdptoscip-array behind ind one to the left and update their sciptosdp-entries */
270  for (i = ind + 1; i < varmapper->nvars; i++)
271  {
272  varmapper->sdptoscip[i - 1] = varmapper->sdptoscip[i];
273  SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i - 1], (void*) (size_t) (i - 1)) );
274  }
275 
276  /* reallocate memory */
277  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars - 1) );
278 
279  varmapper->nvars--;
280 
281  return SCIP_OKAY;
282 }
283 
286  SCIP* scip,
287  SdpVarmapper* varmapper
288  )
289 {
290  SCIP_VAR* var;
291  int k;
292 
293  assert ( scip != NULL );
294  assert ( varmapper != NULL );
295 
296  for (k = 0; k < varmapper->nvars; ++k)
297  {
298  SCIP_CALL( SCIPgetTransformedVar(scip, varmapper->sdptoscip[k], &var) );
299  SCIP_CALL( SCIPcaptureVar(scip, var) );
300 
301  SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, varmapper->sdptoscip[k]) );
302  SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, var, (void*) (size_t) k) );
303 
304  SCIP_CALL( SCIPreleaseVar(scip, &varmapper->sdptoscip[k]) );
305 
306  varmapper->sdptoscip[k] = var;
307  }
308 
309  return SCIP_OKAY;
310 }
311 
314  SCIP* scip,
315  SdpVarmapper* oldmapper,
316  SdpVarmapper* newmapper
317  )
318 {
319  int nvars;
320  int i;
321 
322  nvars = oldmapper->nvars;
323 
324  newmapper->nvars = nvars;
325 
326  /* allocate memory */
327  SCIP_CALL( SCIPallocBlockMemory(scip, &newmapper) );
328  SCIP_CALL( SCIPallocBlockMemoryArray(scip, &newmapper->sdptoscip, nvars) );
329 
330  /* copy entries */
331  for (i = 0; i < nvars; i++)
332  {
333  newmapper->sdptoscip[i] = oldmapper->sdptoscip[i];
334  SCIP_CALL( SCIPhashmapInsert(newmapper->sciptosdp, oldmapper->sdptoscip[i], (void*) (size_t) i) );
335  SCIP_CALL( SCIPcaptureVar(scip, newmapper->sdptoscip[i]) );
336  }
337 
338  return SCIP_OKAY;
339 }
SCIP_RETCODE SCIPsdpVarmapperAddVars(SCIP *scip, SdpVarmapper *varmapper, int nvars, SCIP_VAR **vars)
Definition: SdpVarmapper.c:108
SCIP_Bool SCIPsdpVarmapperExistsSCIPvar(SdpVarmapper *varmapper, SCIP_VAR *var)
Definition: SdpVarmapper.c:213
SCIP_RETCODE SCIPsdpVarmapperClone(SCIP *scip, SdpVarmapper *oldmapper, SdpVarmapper *newmapper)
Definition: SdpVarmapper.c:313
SCIP_VAR * SCIPsdpVarmapperGetSCIPvar(SdpVarmapper *varmapper, int ind)
Definition: SdpVarmapper.c:237
int SCIPsdpVarmapperGetNVars(SdpVarmapper *varmapper)
Definition: SdpVarmapper.c:203
SCIP_RETCODE SCIPsdpVarmapperCreate(SCIP *scip, SdpVarmapper **varmapper, int size)
Definition: SdpVarmapper.c:53
struct Sdpvarmapper SdpVarmapper
Definition: SdpVarmapper.h:48
int SCIPsdpVarmapperGetSdpIndex(SdpVarmapper *varmapper, SCIP_VAR *var)
Definition: SdpVarmapper.c:225
maps SCIP variables to SDP indices (the SCIP variables are given SDP indices in the order in which th...
SCIP_RETCODE SCIPsdpVarmapperTransform(SCIP *scip, SdpVarmapper *varmapper)
Definition: SdpVarmapper.c:285
SCIP_RETCODE SCIPsdpVarmapperInsertVar(SCIP *scip, SdpVarmapper *varmapper, SCIP_VAR *var, int pos)
Definition: SdpVarmapper.c:158
SCIP_RETCODE SCIPsdpVarmapperFree(SCIP *scip, SdpVarmapper **varmapper)
Definition: SdpVarmapper.c:80
SCIP_RETCODE SCIPsdpVarmapperRemoveSdpIndex(SCIP *scip, SdpVarmapper *varmapper, int ind)
Definition: SdpVarmapper.c:249