SCIP-SDP  2.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 programms based on SCIP. */
5 /* */
6 /* Copyright (C) 2011-2013 Discrete Optimization, TU Darmstadt */
7 /* EDOM, FAU Erlangen-Nürnberg */
8 /* 2014-2016 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-2016 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 /*
39 #ifndef __SDPVARMAPPER_H__
40 #define __SDPVARMAPPER_H__
41 */
42 
43 #include "scip/scip.h"
44 #include "scip/type_misc.h" /* for SCIP Hashmap */
45 #include "SdpVarmapper.h"
46 
47 /* turn off lint warnings for whole file: */
48 /*lint --e{788,818}*/
49 
50 struct Sdpvarmapper
51 {
52  SCIP_VAR** sdptoscip;
53  SCIP_HASHMAP* sciptosdp;
54  int nvars;
55 };
56 
59  SCIP* scip,
60  SdpVarmapper** varmapper,
61  int size
62  )
63 {
64  assert ( scip != NULL );
65  assert ( varmapper != NULL );
66  assert ( size >= 0 );
67 
68  SCIP_CALL( SCIPallocBlockMemory(scip, varmapper) );
69  (*varmapper)->nvars = 0;
70  (*varmapper)->sdptoscip = NULL;
71 
72  if ( size == 0 )
73  {
74  SCIPdebugMessage("SCIPsdpVarmapperCreate called for size 0!\n");
75 
76  return SCIP_OKAY;
77  }
78 
79  SCIP_CALL( SCIPhashmapCreate(&((*varmapper)->sciptosdp), SCIPblkmem(scip), size) );
80 
81  return SCIP_OKAY;
82 }
83 
85 SCIP_RETCODE SCIPsdpVarmapperFree(
86  SCIP* scip,
87  SdpVarmapper** varmapper
88  )
89 {
90  int i;
91 
92  SCIPdebugMessage("Freeing SdpVarmapper \n");
93 
94  assert ( scip != NULL );
95  assert ( varmapper != NULL );
96 
97  /* release all vars */
98  for (i = 0; i < (*varmapper)->nvars; i++)
99  {
100  SCIP_CALL( SCIPreleaseVar(scip, &((*varmapper)->sdptoscip[i])) );
101  }
102 
103  if ( (*varmapper)->nvars )
104  SCIPhashmapFree(&((*varmapper)->sciptosdp));
105 
106  SCIPfreeBlockMemoryArray(scip, &(*varmapper)->sdptoscip, (*varmapper)->nvars);
107  SCIPfreeBlockMemory(scip, varmapper);
108 
109  return SCIP_OKAY;
110 }
111 
114  SCIP* scip,
115  SdpVarmapper* varmapper,
116  int nvars,
117  SCIP_VAR** vars
118  )
119 { /*lint --e{818}*/
120  int i;
121  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
122  * should reallocate later */
123  int allocsize;
124 
125  if ( nvars == 0 )
126  return SCIP_OKAY;
127 
128  assert ( scip != NULL );
129  assert ( varmapper != NULL );
130  assert ( nvars >= 0 );
131  assert ( vars != NULL );
132 
133  allocsize = varmapper->nvars + nvars;
134  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), varmapper->nvars, allocsize) );
135 
136  reallocneeded = FALSE;
137 
138  for (i = 0; i < nvars; i++)
139  {
140  if ( ! (SCIPhashmapExists(varmapper->sciptosdp, vars[i])) ) /* make sure, that there are no duplicates in the lists */
141  {
142  varmapper->sdptoscip[varmapper->nvars] = vars[i];
143  SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, (void*) vars[i], (void*) (size_t) varmapper->nvars) );
144  varmapper->nvars++;
145  SCIP_CALL( SCIPcaptureVar(scip, vars[i]) );
146  }
147  else
148  {
149  SCIPdebugMessage("variable %s was not added to the varmapper as it was already part of it \n", SCIPvarGetName(vars[i]));
150  reallocneeded = TRUE;
151  }
152  }
153 
154  if ( reallocneeded )
155  {
156  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), allocsize, varmapper->nvars) );
157  }
158 
159  return SCIP_OKAY;
160 }
161 
164  SCIP* scip,
165  SdpVarmapper* varmapper,
166  SCIP_VAR* var,
167  int pos
168  )
169 {
170  int i;
171 
172  assert ( scip != NULL );
173  assert ( varmapper != NULL );
174  assert ( var != NULL );
175  assert ( pos >= 0 );
176  assert ( pos <= varmapper->nvars );
177 
178  if ( ! SCIPhashmapExists(varmapper->sciptosdp, var) ) /* make sure, that there are no duplicates in the lists */
179  {
180  if ( pos == varmapper->nvars ) /* add it to the end */
181  {
182  SCIP_CALL(SCIPsdpVarmapperAddVars(scip, varmapper, 1, &var));
183  }
184  else
185  {
186  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars + 1) );
187 
188  /* move all variables after pos one spot to the right to make room for the new one */
189  for (i = varmapper->nvars - 1; i >= pos; i--)
190  {
191  varmapper->sdptoscip[i + 1] = varmapper->sdptoscip[i]; /*lint !e679*/
192  SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i + 1], (void*) (size_t) (i + 1)) );
193  }
194 
195  varmapper->sdptoscip[pos] = var;
196  SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, var, (void*) (size_t) pos) );
197  varmapper->nvars++;
198  SCIP_CALL( SCIPcaptureVar(scip, var) );
199  }
200  }
201  else
202  SCIPdebugMessage("variable %s was not added to the varmapper as it was already part of it.\n", SCIPvarGetName(var));
203 
204  return SCIP_OKAY;
205 }
206 
209  SdpVarmapper* varmapper
210  )
211 {
212  assert ( varmapper != NULL );
213 
214  return varmapper->nvars;
215 }
216 
219  SdpVarmapper* varmapper,
220  SCIP_VAR* var
221  )
222 {
223  assert ( varmapper != NULL );
224  assert ( var != NULL );
225 
226  return SCIPhashmapExists(varmapper->sciptosdp, var);
227 }
228 
231  SdpVarmapper* varmapper,
232  SCIP_VAR* var
233  )
234 {
235  assert ( varmapper != NULL );
236  assert ( var != NULL );
237 
238  return (int) (size_t) SCIPhashmapGetImage(varmapper->sciptosdp, (void*) var);
239 }
240 
243  SdpVarmapper* varmapper,
244  int ind
245  )
246 {
247  assert ( varmapper != NULL );
248  assert ( 0 <= ind && ind < varmapper->nvars );
249 
250  return varmapper->sdptoscip[ind];
251 }
252 
255  SCIP* scip,
256  SdpVarmapper* varmapper,
257  int ind
258  )
259 {
260  SCIP_VAR* var;
261  int i;
262 
263  assert ( scip != NULL );
264  assert ( varmapper != NULL );
265  assert ( 0 <= ind && ind < varmapper->nvars );
266 
267  var = varmapper->sdptoscip[ind];
268 
269  assert ( SCIPhashmapExists(varmapper->sciptosdp, var) );
270 
271  SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, var) );
272  SCIP_CALL( SCIPreleaseVar(scip, &(varmapper)->sdptoscip[ind]) );
273 
274  /* shift all entries of the sdptoscip-array behind ind one to the left and update their sciptosdp-entries */
275  for (i = ind + 1; i < varmapper->nvars; i++)
276  {
277  varmapper->sdptoscip[i - 1] = varmapper->sdptoscip[i];
278  SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i - 1], (void*) (size_t) (i - 1)) );
279  }
280 
281  /* reallocate memory */
282  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars - 1) );
283 
284  varmapper->nvars--;
285 
286  return SCIP_OKAY;
287 }
288 
291  SCIP* scip,
292  SdpVarmapper* varmapper
293  )
294 {
295  SCIP_VAR* var;
296  int k;
297 
298  assert ( scip != NULL );
299  assert ( varmapper != NULL );
300 
301  for (k = 0; k < varmapper->nvars; ++k)
302  {
303  SCIP_CALL( SCIPgetTransformedVar(scip, varmapper->sdptoscip[k], &var) );
304  SCIP_CALL( SCIPcaptureVar(scip, var) );
305 
306  SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, varmapper->sdptoscip[k]) );
307  SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, var, (void*) (size_t) k) );
308 
309  SCIP_CALL( SCIPreleaseVar(scip, &varmapper->sdptoscip[k]) );
310 
311  varmapper->sdptoscip[k] = var;
312  }
313 
314  return SCIP_OKAY;
315 }
316 
319  SCIP* scip,
320  SdpVarmapper* oldmapper,
321  SdpVarmapper* newmapper
322  )
323 {
324  int nvars;
325  int i;
326 
327  nvars = oldmapper->nvars;
328 
329  newmapper->nvars = nvars;
330 
331  /* allocate memory */
332  SCIP_CALL( SCIPallocBlockMemory(scip, &newmapper) );
333  SCIP_CALL( SCIPallocBlockMemoryArray(scip, &newmapper->sdptoscip, nvars) );
334 
335  /* copy entries */
336  for (i = 0; i < nvars; i++)
337  {
338  newmapper->sdptoscip[i] = oldmapper->sdptoscip[i];
339  SCIP_CALL( SCIPhashmapInsert(newmapper->sciptosdp, oldmapper->sdptoscip[i], (void*) (size_t) i) );
340  SCIP_CALL( SCIPcaptureVar(scip, newmapper->sdptoscip[i]) );
341  }
342 
343  return SCIP_OKAY;
344 }
SCIP_RETCODE SCIPsdpVarmapperAddVars(SCIP *scip, SdpVarmapper *varmapper, int nvars, SCIP_VAR **vars)
Definition: SdpVarmapper.c:113
SCIP_Bool SCIPsdpVarmapperExistsSCIPvar(SdpVarmapper *varmapper, SCIP_VAR *var)
Definition: SdpVarmapper.c:218
SCIP_RETCODE SCIPsdpVarmapperClone(SCIP *scip, SdpVarmapper *oldmapper, SdpVarmapper *newmapper)
Definition: SdpVarmapper.c:318
SCIP_VAR * SCIPsdpVarmapperGetSCIPvar(SdpVarmapper *varmapper, int ind)
Definition: SdpVarmapper.c:242
int SCIPsdpVarmapperGetNVars(SdpVarmapper *varmapper)
Definition: SdpVarmapper.c:208
SCIP_RETCODE SCIPsdpVarmapperCreate(SCIP *scip, SdpVarmapper **varmapper, int size)
Definition: SdpVarmapper.c:58
struct Sdpvarmapper SdpVarmapper
Definition: SdpVarmapper.h:48
int SCIPsdpVarmapperGetSdpIndex(SdpVarmapper *varmapper, SCIP_VAR *var)
Definition: SdpVarmapper.c:230
class that maps SCIP variables to SDP indices (the SCIP variables are given SDP indices in the order ...
SCIP_RETCODE SCIPsdpVarmapperTransform(SCIP *scip, SdpVarmapper *varmapper)
Definition: SdpVarmapper.c:290
SCIP_RETCODE SCIPsdpVarmapperInsertVar(SCIP *scip, SdpVarmapper *varmapper, SCIP_VAR *var, int pos)
Definition: SdpVarmapper.c:163
SCIP_RETCODE SCIPsdpVarmapperFree(SCIP *scip, SdpVarmapper **varmapper)
Definition: SdpVarmapper.c:85
SCIP_RETCODE SCIPsdpVarmapperRemoveSdpIndex(SCIP *scip, SdpVarmapper *varmapper, int ind)
Definition: SdpVarmapper.c:254