SCIP-SDP  2.0.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-2015 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-2015 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 struct Sdpvarmapper
48 {
49  SCIP_VAR** sdptoscip;
50  SCIP_HASHMAP* sciptosdp;
51  int nvars;
52 };
53 
56  SCIP* scip,
57  SdpVarmapper** varmapper,
58  int size
59  )
60 {
61  assert ( scip != NULL );
62  assert ( varmapper != NULL );
63  assert ( size >= 0 );
64 
65  if ( size == 0 )
66  {
67  SCIPdebugMessage("SCIPsdpVarmapperCreate called for size 0!\n");
68  return SCIP_OKAY;
69  }
70 
71  SCIP_CALL( SCIPallocBlockMemory(scip, varmapper) );
72  SCIP_CALL( SCIPhashmapCreate(&((*varmapper)->sciptosdp), SCIPblkmem(scip), size) );
73  (*varmapper)->nvars = 0;
74  (*varmapper)->sdptoscip = NULL;
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  SCIPhashmapFree(&((*varmapper)->sciptosdp));
99  SCIPfreeBlockMemoryArray(scip, &(*varmapper)->sdptoscip, (*varmapper)->nvars);
100  SCIPfreeBlockMemory(scip, varmapper);
101 
102  return SCIP_OKAY;
103 }
104 
107  SCIP* scip,
108  SdpVarmapper* varmapper,
109  int nvars,
110  SCIP_VAR** vars
111  )
112 {
113  int i;
114  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
115  * should reallocate later */
116  int allocsize;
117 
118  if ( nvars == 0 )
119  return SCIP_OKAY;
120 
121  assert ( scip != NULL );
122  assert ( varmapper != NULL );
123  assert ( nvars >= 0 );
124  assert ( vars != NULL );
125 
126  allocsize = varmapper->nvars + nvars;
127  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), varmapper->nvars, allocsize) );
128 
129  reallocneeded = FALSE;
130 
131  for (i = 0; i < nvars; i++)
132  {
133  if ( ! (SCIPhashmapExists(varmapper->sciptosdp, vars[i])) ) /* make sure, that there are no duplicates in the lists */
134  {
135  varmapper->sdptoscip[varmapper->nvars] = vars[i];
136  SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, (void*) vars[i], (void*) (size_t) varmapper->nvars) );
137  varmapper->nvars++;
138  SCIP_CALL( SCIPcaptureVar(scip, vars[i]) );
139  }
140  else
141  {
142  SCIPdebugMessage("variable %s was not added to the varmapper as it was already part of it \n", SCIPvarGetName(vars[i]));
143  reallocneeded = TRUE;
144  }
145  }
146 
147  if ( reallocneeded )
148  {
149  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), allocsize, varmapper->nvars) );
150  }
151 
152  return SCIP_OKAY;
153 }
154 
157  SCIP* scip,
158  SdpVarmapper* varmapper,
159  SCIP_VAR* var,
160  int pos
161  )
162 {
163  int i;
164 
165  assert ( scip != NULL );
166  assert ( varmapper != NULL );
167  assert ( var != NULL );
168  assert ( pos >= 0 );
169  assert ( pos <= varmapper->nvars );
170 
171  if ( ! (SCIPhashmapExists(varmapper->sciptosdp, var)) ) /* make sure, that there are no duplicates in the lists */
172  {
173  if ( pos == varmapper->nvars ) /* add it to the end */
174  {
175  SCIP_CALL(SCIPsdpVarmapperAddVars(scip, varmapper, 1, &var));
176  }
177  else
178  {
179  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars + 1) );
180 
181  /* move all variables after pos one spot to the right to make room for the new one */
182  for (i = varmapper->nvars - 1; i >= pos; i--)
183  {
184  varmapper->sdptoscip[i + 1] = varmapper->sdptoscip[i]; /*lint !e679*/
185  SCIP_CALL(SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i + 1], (void*) (size_t) (i + 1)));
186  }
187 
188  varmapper->sdptoscip[pos] = var;
189  SCIP_CALL(SCIPhashmapInsert(varmapper->sciptosdp, var, (void*) (size_t) pos));
190  varmapper->nvars++;
191  }
192  }
193  else
194  SCIPdebugMessage("variable %s was not added to the varmapper as it was already part of it \n", SCIPvarGetName(var));
195 
196  return SCIP_OKAY;
197 }
198 
201  SdpVarmapper* varmapper
202  )
203 {
204  assert ( varmapper != NULL );
205 
206  return varmapper->nvars;
207 }
208 
211  SdpVarmapper* varmapper,
212  SCIP_VAR* var
213  )
214 {
215  assert ( varmapper != NULL );
216  assert ( var != NULL );
217 
218  return SCIPhashmapExists(varmapper->sciptosdp, var);
219 }
220 
223  SdpVarmapper* varmapper,
224  SCIP_VAR* var
225  )
226 {
227  assert ( varmapper != NULL );
228  assert ( var != NULL );
229 
230  return (int) (size_t) SCIPhashmapGetImage(varmapper->sciptosdp, (void*) var);
231 }
232 
235  SdpVarmapper* varmapper,
236  int ind
237  )
238 {
239  assert ( varmapper != NULL );
240  assert ( 0 <= ind && ind < varmapper->nvars );
241 
242  return varmapper->sdptoscip[ind];
243 }
244 
247  SCIP* scip,
248  SdpVarmapper* varmapper,
249  int ind
250  )
251 {
252  SCIP_VAR* var;
253  int i;
254 
255  assert ( scip != NULL );
256  assert ( varmapper != NULL );
257  assert ( 0 <= ind && ind < varmapper->nvars );
258 
259  var = varmapper->sdptoscip[ind];
260 
261  assert ( SCIPhashmapExists(varmapper->sciptosdp, var) );
262 
263  SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, var) );
264 
265  /* shift all entries of the sdptoscip-array behind ind one to the left and update their sciptosdp-entries */
266  for (i = ind + 1; i < varmapper->nvars; i++)
267  {
268  varmapper->sdptoscip[i - 1] = varmapper->sdptoscip[i];
269  SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i - 1], (void*) (size_t) (i - 1)) );
270  }
271 
272  /* reallocate memory */
273  SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars - 1) );
274 
275  varmapper->nvars--;
276 
277  return SCIP_OKAY;
278 }
279 
282  SCIP* scip,
283  SdpVarmapper* varmapper
284  )
285 {
286  int k;
287  SCIP_VAR* var;
288 
289  assert ( scip != NULL );
290  assert ( varmapper != NULL );
291 
292  for (k = 0; k < varmapper->nvars; ++k)
293  {
294  SCIP_CALL(SCIPgetTransformedVar(scip, varmapper->sdptoscip[k], &var));
295  SCIP_CALL(SCIPcaptureVar(scip, var));
296 
297  SCIP_CALL(SCIPhashmapRemove(varmapper->sciptosdp, varmapper->sdptoscip[k]));
298  SCIP_CALL(SCIPhashmapInsert(varmapper->sciptosdp, var, (void*) (size_t) k));
299 
300  SCIP_CALL(SCIPreleaseVar(scip, &varmapper->sdptoscip[k]));
301 
302  varmapper->sdptoscip[k] = var;
303  }
304 
305  return SCIP_OKAY;
306 }
307 
310  SCIP* scip,
311  SdpVarmapper* oldmapper,
312  SdpVarmapper* newmapper
313  )
314 {
315  int nvars;
316  int i;
317 
318  nvars = oldmapper->nvars;
319 
320  newmapper->nvars = nvars;
321 
322  /* allocate memory */
323  SCIP_CALL( SCIPallocBlockMemory(scip, &newmapper) );
324  SCIP_CALL( SCIPallocBlockMemoryArray(scip, &newmapper->sdptoscip, nvars) );
325 
326  /* copy entries */
327  for (i = 0; i < nvars; i++)
328  {
329  newmapper->sdptoscip[i] = oldmapper->sdptoscip[i];
330  SCIP_CALL(SCIPhashmapInsert(newmapper->sciptosdp, oldmapper->sdptoscip[i], (void*) (size_t) i));
331  }
332 
333  return SCIP_OKAY;
334 }
SCIP_RETCODE SCIPsdpVarmapperAddVars(SCIP *scip, SdpVarmapper *varmapper, int nvars, SCIP_VAR **vars)
Definition: SdpVarmapper.c:106
SCIP_Bool SCIPsdpVarmapperExistsSCIPvar(SdpVarmapper *varmapper, SCIP_VAR *var)
Definition: SdpVarmapper.c:210
SCIP_RETCODE SCIPsdpVarmapperClone(SCIP *scip, SdpVarmapper *oldmapper, SdpVarmapper *newmapper)
Definition: SdpVarmapper.c:309
SCIP_VAR * SCIPsdpVarmapperGetSCIPvar(SdpVarmapper *varmapper, int ind)
Definition: SdpVarmapper.c:234
int SCIPsdpVarmapperGetNVars(SdpVarmapper *varmapper)
Definition: SdpVarmapper.c:200
SCIP_RETCODE SCIPsdpVarmapperCreate(SCIP *scip, SdpVarmapper **varmapper, int size)
Definition: SdpVarmapper.c:55
struct Sdpvarmapper SdpVarmapper
Definition: SdpVarmapper.h:48
int SCIPsdpVarmapperGetSdpIndex(SdpVarmapper *varmapper, SCIP_VAR *var)
Definition: SdpVarmapper.c:222
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:281
SCIP_RETCODE SCIPsdpVarmapperInsertVar(SCIP *scip, SdpVarmapper *varmapper, SCIP_VAR *var, int pos)
Definition: SdpVarmapper.c:156
SCIP_RETCODE SCIPsdpVarmapperFree(SCIP *scip, SdpVarmapper **varmapper)
Definition: SdpVarmapper.c:80
SCIP_RETCODE SCIPsdpVarmapperRemoveSdpIndex(SCIP *scip, SdpVarmapper *varmapper, int ind)
Definition: SdpVarmapper.c:246