43 #include "scip/scip.h"
44 #include "scip/type_misc.h"
50 SCIP_HASHMAP* sciptosdp;
61 assert ( scip != NULL );
62 assert ( varmapper != NULL );
67 SCIPdebugMessage(
"SCIPsdpVarmapperCreate called for size 0!\n");
71 SCIP_CALL( SCIPallocBlockMemory(scip, varmapper) );
72 SCIP_CALL( SCIPhashmapCreate(&((*varmapper)->sciptosdp), SCIPblkmem(scip), size) );
73 (*varmapper)->nvars = 0;
74 (*varmapper)->sdptoscip = NULL;
87 SCIPdebugMessage(
"Freeing SdpVarmapper \n");
89 assert ( scip != NULL );
90 assert ( varmapper != NULL );
93 for (i = 0; i < (*varmapper)->nvars; i++)
95 SCIP_CALL( SCIPreleaseVar(scip, &((*varmapper)->sdptoscip[i])) );
98 SCIPhashmapFree(&((*varmapper)->sciptosdp));
99 SCIPfreeBlockMemoryArray(scip, &(*varmapper)->sdptoscip, (*varmapper)->nvars);
100 SCIPfreeBlockMemory(scip, varmapper);
114 SCIP_Bool reallocneeded;
121 assert ( scip != NULL );
122 assert ( varmapper != NULL );
123 assert ( nvars >= 0 );
124 assert ( vars != NULL );
126 allocsize = varmapper->nvars + nvars;
127 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), varmapper->nvars, allocsize) );
129 reallocneeded = FALSE;
131 for (i = 0; i < nvars; i++)
133 if ( ! (SCIPhashmapExists(varmapper->sciptosdp, vars[i])) )
135 varmapper->sdptoscip[varmapper->nvars] = vars[i];
136 SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, (
void*) vars[i], (
void*) (
size_t) varmapper->nvars) );
138 SCIP_CALL( SCIPcaptureVar(scip, vars[i]) );
142 SCIPdebugMessage(
"variable %s was not added to the varmapper as it was already part of it \n", SCIPvarGetName(vars[i]));
143 reallocneeded = TRUE;
149 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), allocsize, varmapper->nvars) );
165 assert ( scip != NULL );
166 assert ( varmapper != NULL );
167 assert ( var != NULL );
169 assert ( pos <= varmapper->nvars );
171 if ( ! (SCIPhashmapExists(varmapper->sciptosdp, var)) )
173 if ( pos == varmapper->nvars )
179 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars + 1) );
182 for (i = varmapper->nvars - 1; i >= pos; i--)
184 varmapper->sdptoscip[i + 1] = varmapper->sdptoscip[i];
185 SCIP_CALL(SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i + 1], (
void*) (
size_t) (i + 1)));
188 varmapper->sdptoscip[pos] = var;
189 SCIP_CALL(SCIPhashmapInsert(varmapper->sciptosdp, var, (
void*) (
size_t) pos));
194 SCIPdebugMessage(
"variable %s was not added to the varmapper as it was already part of it \n", SCIPvarGetName(var));
204 assert ( varmapper != NULL );
206 return varmapper->nvars;
215 assert ( varmapper != NULL );
216 assert ( var != NULL );
218 return SCIPhashmapExists(varmapper->sciptosdp, var);
227 assert ( varmapper != NULL );
228 assert ( var != NULL );
230 return (
int) (size_t) SCIPhashmapGetImage(varmapper->sciptosdp, (
void*) var);
239 assert ( varmapper != NULL );
240 assert ( 0 <= ind && ind < varmapper->nvars );
242 return varmapper->sdptoscip[ind];
255 assert ( scip != NULL );
256 assert ( varmapper != NULL );
257 assert ( 0 <= ind && ind < varmapper->nvars );
259 var = varmapper->sdptoscip[ind];
261 assert ( SCIPhashmapExists(varmapper->sciptosdp, var) );
263 SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, var) );
266 for (i = ind + 1; i < varmapper->nvars; i++)
268 varmapper->sdptoscip[i - 1] = varmapper->sdptoscip[i];
269 SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i - 1], (
void*) (
size_t) (i - 1)) );
273 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars - 1) );
289 assert ( scip != NULL );
290 assert ( varmapper != NULL );
292 for (k = 0; k < varmapper->nvars; ++k)
294 SCIP_CALL(SCIPgetTransformedVar(scip, varmapper->sdptoscip[k], &var));
295 SCIP_CALL(SCIPcaptureVar(scip, var));
297 SCIP_CALL(SCIPhashmapRemove(varmapper->sciptosdp, varmapper->sdptoscip[k]));
298 SCIP_CALL(SCIPhashmapInsert(varmapper->sciptosdp, var, (
void*) (
size_t) k));
300 SCIP_CALL(SCIPreleaseVar(scip, &varmapper->sdptoscip[k]));
302 varmapper->sdptoscip[k] = var;
318 nvars = oldmapper->nvars;
320 newmapper->nvars = nvars;
323 SCIP_CALL( SCIPallocBlockMemory(scip, &newmapper) );
324 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &newmapper->sdptoscip, nvars) );
327 for (i = 0; i < nvars; i++)
329 newmapper->sdptoscip[i] = oldmapper->sdptoscip[i];
330 SCIP_CALL(SCIPhashmapInsert(newmapper->sciptosdp, oldmapper->sdptoscip[i], (
void*) (
size_t) 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)