43 #include "scip/scip.h"
44 #include "scip/type_misc.h"
53 SCIP_HASHMAP* sciptosdp;
64 assert ( scip != NULL );
65 assert ( varmapper != NULL );
68 SCIP_CALL( SCIPallocBlockMemory(scip, varmapper) );
69 (*varmapper)->nvars = 0;
70 (*varmapper)->sdptoscip = NULL;
74 SCIPdebugMessage(
"SCIPsdpVarmapperCreate called for size 0!\n");
79 SCIP_CALL( SCIPhashmapCreate(&((*varmapper)->sciptosdp), SCIPblkmem(scip), size) );
92 SCIPdebugMessage(
"Freeing SdpVarmapper \n");
94 assert ( scip != NULL );
95 assert ( varmapper != NULL );
98 for (i = 0; i < (*varmapper)->nvars; i++)
100 SCIP_CALL( SCIPreleaseVar(scip, &((*varmapper)->sdptoscip[i])) );
103 if ( (*varmapper)->nvars )
104 SCIPhashmapFree(&((*varmapper)->sciptosdp));
106 SCIPfreeBlockMemoryArray(scip, &(*varmapper)->sdptoscip, (*varmapper)->nvars);
107 SCIPfreeBlockMemory(scip, varmapper);
121 SCIP_Bool reallocneeded;
128 assert ( scip != NULL );
129 assert ( varmapper != NULL );
130 assert ( nvars >= 0 );
131 assert ( vars != NULL );
133 allocsize = varmapper->nvars + nvars;
134 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), varmapper->nvars, allocsize) );
136 reallocneeded = FALSE;
138 for (i = 0; i < nvars; i++)
140 if ( ! (SCIPhashmapExists(varmapper->sciptosdp, vars[i])) )
142 varmapper->sdptoscip[varmapper->nvars] = vars[i];
143 SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, (
void*) vars[i], (
void*) (
size_t) varmapper->nvars) );
145 SCIP_CALL( SCIPcaptureVar(scip, vars[i]) );
149 SCIPdebugMessage(
"variable %s was not added to the varmapper as it was already part of it \n", SCIPvarGetName(vars[i]));
150 reallocneeded = TRUE;
156 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), allocsize, varmapper->nvars) );
172 assert ( scip != NULL );
173 assert ( varmapper != NULL );
174 assert ( var != NULL );
176 assert ( pos <= varmapper->nvars );
178 if ( ! SCIPhashmapExists(varmapper->sciptosdp, var) )
180 if ( pos == varmapper->nvars )
186 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars + 1) );
189 for (i = varmapper->nvars - 1; i >= pos; i--)
191 varmapper->sdptoscip[i + 1] = varmapper->sdptoscip[i];
192 SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i + 1], (
void*) (
size_t) (i + 1)) );
195 varmapper->sdptoscip[pos] = var;
196 SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, var, (
void*) (
size_t) pos) );
198 SCIP_CALL( SCIPcaptureVar(scip, var) );
202 SCIPdebugMessage(
"variable %s was not added to the varmapper as it was already part of it.\n", SCIPvarGetName(var));
212 assert ( varmapper != NULL );
214 return varmapper->nvars;
223 assert ( varmapper != NULL );
224 assert ( var != NULL );
226 return SCIPhashmapExists(varmapper->sciptosdp, var);
235 assert ( varmapper != NULL );
236 assert ( var != NULL );
238 return (
int) (size_t) SCIPhashmapGetImage(varmapper->sciptosdp, (
void*) var);
247 assert ( varmapper != NULL );
248 assert ( 0 <= ind && ind < varmapper->nvars );
250 return varmapper->sdptoscip[ind];
263 assert ( scip != NULL );
264 assert ( varmapper != NULL );
265 assert ( 0 <= ind && ind < varmapper->nvars );
267 var = varmapper->sdptoscip[ind];
269 assert ( SCIPhashmapExists(varmapper->sciptosdp, var) );
271 SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, var) );
272 SCIP_CALL( SCIPreleaseVar(scip, &(varmapper)->sdptoscip[ind]) );
275 for (i = ind + 1; i < varmapper->nvars; i++)
277 varmapper->sdptoscip[i - 1] = varmapper->sdptoscip[i];
278 SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i - 1], (
void*) (
size_t) (i - 1)) );
282 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars - 1) );
298 assert ( scip != NULL );
299 assert ( varmapper != NULL );
301 for (k = 0; k < varmapper->nvars; ++k)
303 SCIP_CALL( SCIPgetTransformedVar(scip, varmapper->sdptoscip[k], &var) );
304 SCIP_CALL( SCIPcaptureVar(scip, var) );
306 SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, varmapper->sdptoscip[k]) );
307 SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, var, (
void*) (
size_t) k) );
309 SCIP_CALL( SCIPreleaseVar(scip, &varmapper->sdptoscip[k]) );
311 varmapper->sdptoscip[k] = var;
327 nvars = oldmapper->nvars;
329 newmapper->nvars = nvars;
332 SCIP_CALL( SCIPallocBlockMemory(scip, &newmapper) );
333 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &newmapper->sdptoscip, nvars) );
336 for (i = 0; i < nvars; i++)
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]) );
SCIP_RETCODE SCIPsdpVarmapperAddVars(SCIP *scip, SdpVarmapper *varmapper, int nvars, SCIP_VAR **vars)
SCIP_Bool SCIPsdpVarmapperExistsSCIPvar(SdpVarmapper *varmapper, SCIP_VAR *var)
SCIP_RETCODE SCIPsdpVarmapperClone(SCIP *scip, SdpVarmapper *oldmapper, SdpVarmapper *newmapper)
SCIP_VAR * SCIPsdpVarmapperGetSCIPvar(SdpVarmapper *varmapper, int ind)
int SCIPsdpVarmapperGetNVars(SdpVarmapper *varmapper)
SCIP_RETCODE SCIPsdpVarmapperCreate(SCIP *scip, SdpVarmapper **varmapper, int size)
struct Sdpvarmapper SdpVarmapper
int SCIPsdpVarmapperGetSdpIndex(SdpVarmapper *varmapper, SCIP_VAR *var)
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)
SCIP_RETCODE SCIPsdpVarmapperInsertVar(SCIP *scip, SdpVarmapper *varmapper, SCIP_VAR *var, int pos)
SCIP_RETCODE SCIPsdpVarmapperFree(SCIP *scip, SdpVarmapper **varmapper)
SCIP_RETCODE SCIPsdpVarmapperRemoveSdpIndex(SCIP *scip, SdpVarmapper *varmapper, int ind)