38 #include "scip/scip.h"
39 #include "scip/type_misc.h"
48 SCIP_HASHMAP* sciptosdp;
59 assert ( scip != NULL );
60 assert ( varmapper != NULL );
63 SCIP_CALL( SCIPallocBlockMemory(scip, varmapper) );
64 (*varmapper)->nvars = 0;
65 (*varmapper)->sdptoscip = NULL;
69 SCIPdebugMessage(
"SCIPsdpVarmapperCreate called for size 0!\n");
74 SCIP_CALL( SCIPhashmapCreate(&((*varmapper)->sciptosdp), SCIPblkmem(scip), size) );
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 if ( (*varmapper)->nvars )
99 SCIPhashmapFree(&((*varmapper)->sciptosdp));
101 SCIPfreeBlockMemoryArrayNull(scip, &(*varmapper)->sdptoscip, (*varmapper)->nvars);
102 SCIPfreeBlockMemory(scip, varmapper);
116 SCIP_Bool reallocneeded;
123 assert ( scip != NULL );
124 assert ( varmapper != NULL );
125 assert ( nvars >= 0 );
126 assert ( vars != NULL );
128 allocsize = varmapper->nvars + nvars;
129 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), varmapper->nvars, allocsize) );
131 reallocneeded = FALSE;
133 for (i = 0; i < nvars; i++)
135 if ( ! (SCIPhashmapExists(varmapper->sciptosdp, vars[i])) )
137 varmapper->sdptoscip[varmapper->nvars] = vars[i];
138 SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, (
void*) vars[i], (
void*) (
size_t) varmapper->nvars) );
140 SCIP_CALL( SCIPcaptureVar(scip, vars[i]) );
144 SCIPdebugMessage(
"variable %s was not added to the varmapper as it was already part of it \n", SCIPvarGetName(vars[i]));
145 reallocneeded = TRUE;
151 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(varmapper->sdptoscip), allocsize, varmapper->nvars) );
167 assert ( scip != NULL );
168 assert ( varmapper != NULL );
169 assert ( var != NULL );
171 assert ( pos <= varmapper->nvars );
173 if ( ! SCIPhashmapExists(varmapper->sciptosdp, var) )
175 if ( pos == varmapper->nvars )
181 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars + 1) );
184 for (i = varmapper->nvars - 1; i >= pos; i--)
186 varmapper->sdptoscip[i + 1] = varmapper->sdptoscip[i];
187 SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i + 1], (
void*) (
size_t) (i + 1)) );
190 varmapper->sdptoscip[pos] = var;
191 SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, var, (
void*) (
size_t) pos) );
193 SCIP_CALL( SCIPcaptureVar(scip, var) );
197 SCIPdebugMessage(
"variable %s was not added to the varmapper as it was already part of it.\n", SCIPvarGetName(var));
207 assert ( varmapper != NULL );
209 return varmapper->nvars;
218 assert ( varmapper != NULL );
219 assert ( var != NULL );
221 return SCIPhashmapExists(varmapper->sciptosdp, var);
230 assert ( varmapper != NULL );
231 assert ( var != NULL );
233 return (
int) (size_t) SCIPhashmapGetImage(varmapper->sciptosdp, (
void*) var);
242 assert ( varmapper != NULL );
243 assert ( 0 <= ind && ind < varmapper->nvars );
245 return varmapper->sdptoscip[ind];
258 assert ( scip != NULL );
259 assert ( varmapper != NULL );
260 assert ( 0 <= ind && ind < varmapper->nvars );
262 var = varmapper->sdptoscip[ind];
264 assert ( SCIPhashmapExists(varmapper->sciptosdp, var) );
266 SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, var) );
267 SCIP_CALL( SCIPreleaseVar(scip, &(varmapper)->sdptoscip[ind]) );
270 for (i = ind + 1; i < varmapper->nvars; i++)
272 varmapper->sdptoscip[i - 1] = varmapper->sdptoscip[i];
273 SCIP_CALL( SCIPhashmapSetImage(varmapper->sciptosdp, varmapper->sdptoscip[i - 1], (
void*) (
size_t) (i - 1)) );
277 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &varmapper->sdptoscip, varmapper->nvars, varmapper->nvars - 1) );
293 assert ( scip != NULL );
294 assert ( varmapper != NULL );
296 for (k = 0; k < varmapper->nvars; ++k)
298 SCIP_CALL( SCIPgetTransformedVar(scip, varmapper->sdptoscip[k], &var) );
299 SCIP_CALL( SCIPcaptureVar(scip, var) );
301 SCIP_CALL( SCIPhashmapRemove(varmapper->sciptosdp, varmapper->sdptoscip[k]) );
302 SCIP_CALL( SCIPhashmapInsert(varmapper->sciptosdp, var, (
void*) (
size_t) k) );
304 SCIP_CALL( SCIPreleaseVar(scip, &varmapper->sdptoscip[k]) );
306 varmapper->sdptoscip[k] = var;
322 nvars = oldmapper->nvars;
324 newmapper->nvars = nvars;
327 SCIP_CALL( SCIPallocBlockMemory(scip, &newmapper) );
328 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &newmapper->sdptoscip, nvars) );
331 for (i = 0; i < nvars; i++)
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]) );
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)