59 #include "scip/cons_linear.h"
60 #include "scip/scip.h"
69 #define CONSHDLR_NAME "SDP"
70 #define CONSHDLR_DESC "SDP constraints of the form \\sum_{j} A_j y_j - A_0 psd"
71 #define CONSHDLR_SEPAPRIORITY +1000000
72 #define CONSHDLR_ENFOPRIORITY -2000000
73 #define CONSHDLR_CHECKPRIORITY -2000000
74 #define CONSHDLR_SEPAFREQ 1
75 #define CONSHDLR_EAGERFREQ 100
77 #define CONSHDLR_MAXPREROUNDS -1
78 #define CONSHDLR_DELAYSEPA FALSE
79 #define CONSHDLR_NEEDSCONS TRUE
81 #define CONSHDLR_PRESOLTIMING SCIP_PRESOLTIMING_FAST
82 #define PARSE_STARTSIZE 1
83 #define PARSE_SIZEFACTOR 10
85 #define DEFAULT_NTHREADS 1
103 SCIP_Real maxrhsentry;
107 struct SCIP_ConshdlrData
131 return i*(i+1)/2 + j;
134 #define compLowerTriangPos(i, j) (i*(i+1)/2 + j)
150 assert( symMat != NULL );
151 assert( fullMat != NULL );
154 for (i = 0; i < size; i++)
156 for (j = 0; j <= i; j++)
159 fullMat[i*size + j] = symMat[ind];
160 fullMat[j*size + i] = symMat[ind];
179 SCIP_CONSDATA* consdata;
186 assert( cons != NULL );
187 assert( matrix != NULL );
189 consdata = SCIPconsGetData(cons);
190 nvars = consdata->nvars;
191 blocksize = consdata->blocksize;
194 for (i = 0; i < (blocksize * (blocksize + 1))/2; i++)
198 for (i = 0; i < nvars; i++)
200 yval = SCIPgetSolVal(scip, y, consdata->vars[i]);
201 for (ind = 0; ind < consdata->nvarnonz[i]; ind++)
202 matrix[
compLowerTriangPos(consdata->row[i][ind], consdata->col[i][ind])] += yval * consdata->val[i][ind];
206 for (ind = 0; ind < consdata->constnnonz; ind++)
207 matrix[
compLowerTriangPos(consdata->constrow[ind], consdata->constcol[ind])] -= consdata->constval[ind];
221 SCIP_CONSDATA* consdata;
224 assert( cons != NULL );
226 assert( vAv != NULL );
228 consdata = SCIPconsGetData(cons);
229 assert( consdata != NULL );
231 assert( j < consdata->nvars );
236 for (i = 0; i < consdata->nvarnonz[j]; i++)
238 if (consdata->col[j][i] == consdata->row[j][i])
239 *vAv += v[consdata->col[j][i]] * consdata->val[j][i] * v[consdata->row[j][i]];
243 *vAv += 2.0 * v[consdata->col[j][i]] * consdata->val[j][i] * v[consdata->row[j][i]];
258 SCIP_CONSDATA* consdata;
262 consdata = SCIPconsGetData(cons);
263 assert( consdata != NULL );
269 for (i = 0; i < consdata->constnnonz; i++)
271 if ( REALABS(consdata->constval[i]) > max )
272 max = REALABS(consdata->constval[i]);
275 consdata->maxrhsentry = max;
295 SCIP_CONSDATA* consdata;
296 SCIP_Real* eigenvalues = NULL;
297 SCIP_Real* matrix = NULL;
298 SCIP_Real* fullmatrix = NULL;
299 SCIP_Real* fullconstmatrix = NULL;
300 SCIP_Real* eigenvector = NULL;
301 SCIP_Real* output_vector = NULL;
305 assert( cons != NULL );
306 assert( lhs != NULL );
310 consdata = SCIPconsGetData(cons);
311 assert( consdata != NULL );
313 blocksize = consdata->blocksize;
315 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvalues, blocksize) );
316 SCIP_CALL( SCIPallocBufferArray(scip, &matrix, (blocksize * (blocksize+1))/2 ) );
317 SCIP_CALL( SCIPallocBufferArray(scip, &fullmatrix, blocksize * blocksize ) );
318 SCIP_CALL( SCIPallocBufferArray(scip, &fullconstmatrix, blocksize * blocksize) );
319 SCIP_CALL( SCIPallocBufferArray(scip, &eigenvector, blocksize) );
320 SCIP_CALL( SCIPallocBufferArray(scip, &output_vector, blocksize) );
336 for (j = 0; j < blocksize; ++j)
337 *lhs += eigenvector[j] * output_vector[j];
340 for (j = 0; j < consdata->nvars; ++j)
345 SCIPfreeBufferArray(scip, &output_vector);
346 SCIPfreeBufferArray(scip, &eigenvector);
347 SCIPfreeBufferArray(scip, &fullconstmatrix);
348 SCIPfreeBufferArray(scip, &fullmatrix);
349 SCIPfreeBufferArray(scip, &matrix);
350 SCIPfreeBufferArray(scip, &eigenvalues);
360 SCIP_Bool checkintegrality,
361 SCIP_Bool checklprows,
362 SCIP_Bool printreason,
366 SCIP_CONSDATA* consdata;
368 SCIP_Real check_value;
369 SCIP_Real eigenvalue;
370 SCIP_Real* matrix = NULL;
371 SCIP_Real* fullmatrix = NULL;
373 assert( scip != NULL );
374 assert( cons != NULL );
375 assert( result != NULL );
376 assert( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(cons)),
"SDP") == 0);
378 consdata = SCIPconsGetData(cons);
379 assert( consdata != NULL );
380 blocksize = consdata->blocksize;
382 SCIP_CALL( SCIPallocBufferArray(scip, &matrix, (blocksize * (blocksize+1)) / 2) );
383 SCIP_CALL( SCIPallocBufferArray(scip, &fullmatrix, blocksize * blocksize) );
392 check_value = (-eigenvalue) / (1.0 + consdata->maxrhsentry);
394 check_value = -eigenvalue;
397 if ( SCIPisFeasLE(scip, check_value, 0.0) )
398 *result = SCIP_FEASIBLE;
401 *result = SCIP_INFEASIBLE;
405 SCIP_CALL( SCIPprintCons(scip, cons, NULL) );
406 SCIP_CALL( SCIPprintSol(scip, sol, NULL, FALSE) );
407 SCIPinfoMessage(scip, NULL,
"non psd matrix (eigenvalue %f, dimacs error norm = %f).\n", eigenvalue, check_value);
412 SCIPfreeBufferArray(scip, &fullmatrix);
413 SCIPfreeBufferArray(scip, &matrix);
422 SCIP_CONSHDLR* conshdlr,
428 char cutname[SCIP_MAXSTRLEN];
429 SCIP_CONSDATA* consdata;
430 SCIP_CONSHDLRDATA* conshdlrdata;
432 SCIP_Real* coeff = NULL;
443 assert( cons != NULL );
445 consdata = SCIPconsGetData(cons);
446 assert( consdata != NULL );
448 nvars = consdata->nvars;
449 SCIP_CALL( SCIPallocBufferArray(scip, &coeff, nvars ) );
453 SCIP_CALL( SCIPallocBufferArray(scip, &cols, nvars ) );
454 SCIP_CALL( SCIPallocBufferArray(scip, &vals, nvars ) );
457 for (j = 0; j < nvars; ++j)
459 if ( SCIPisZero(scip, coeff[j]) )
462 cols[len] = SCIPvarGetCol(SCIPvarGetProbvar(consdata->vars[j]));
463 vals[len] = coeff[j];
467 conshdlrdata = SCIPconshdlrGetData(conshdlr);
468 assert( conshdlrdata != NULL );
471 snprintfreturn = SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"sepa_eig_sdp_%d", ++(conshdlrdata->neigveccuts));
472 assert( snprintfreturn < SCIP_MAXSTRLEN );
474 (void) SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"sepa_eig_sdp_%d", ++(conshdlrdata->neigveccuts));
476 SCIP_CALL( SCIPcreateRowCons(scip, &row, conshdlr, cutname , len, cols, vals, lhs, SCIPinfinity(scip), FALSE, FALSE, TRUE) );
478 if ( SCIPisCutEfficacious(scip, sol, row) )
480 SCIP_Bool infeasible;
481 #ifdef SCIP_MORE_DEBUG
482 SCIPinfoMessage(scip, NULL,
"Added cut %s: ", cutname);
483 SCIPinfoMessage(scip, NULL,
"%f <= ", lhs);
484 for (j = 0; j < len; j++)
485 SCIPinfoMessage(scip, NULL,
"+ (%f)*%s", vals[j], SCIPvarGetName(SCIPcolGetVar(cols[j])));
486 SCIPinfoMessage(scip, NULL,
"\n");
489 SCIP_CALL( SCIPaddCut(scip, sol, row, FALSE, &infeasible) );
491 *result = SCIP_CUTOFF;
493 *result = SCIP_SEPARATED;
494 SCIP_CALL( SCIPresetConsAge(scip, cons) );
497 SCIP_CALL( SCIPreleaseRow(scip, &row) );
499 SCIPfreeBufferArray(scip, &vals);
500 SCIPfreeBufferArray(scip, &cols);
501 SCIPfreeBufferArray(scip, &coeff);
517 char cutname[SCIP_MAXSTRLEN];
518 SCIP_CONSDATA* consdata;
520 SCIP_Real* cons_array;
521 SCIP_Real* lhs_array;
533 for (c = 0; c < nconss; ++c)
535 SCIP_CONSHDLR* conshdlr;
537 conshdlr = SCIPconsGetHdlr(conss[c]);
538 assert( conshdlr != NULL );
540 assert( strcmp(SCIPconshdlrGetName(conshdlr),
"SDP") == 0);
543 consdata = SCIPconsGetData(conss[c]);
544 assert( consdata != NULL );
546 blocksize = consdata->blocksize;
547 nvars = consdata->nvars;
548 rhs = SCIPinfinity(scip);
550 SCIP_CALL( SCIPallocBufferArray(scip, &matrix, (blocksize * (blocksize + 1)) / 2) );
553 SCIP_CALL( SCIPallocBufferArray(scip, &cons_array, blocksize * nvars) );
554 SCIP_CALL( SCIPallocBufferArray(scip, &lhs_array, blocksize) );
557 for (k = 0; k < blocksize; ++k)
561 for (j = 0; j < nvars; ++j)
563 for (k = 0; k < blocksize; ++k)
566 cons_array[k * nvars + j] = 0.0;
570 for (i = 0; i < consdata->nvarnonz[j]; i++)
572 if ( consdata->col[j][i] == consdata->row[j][i] )
573 cons_array[consdata->col[j][i] * nvars + j] = consdata->val[j][i];
578 for (k = 0; k < blocksize; ++k)
581 SCIP_CONSHDLRDATA* conshdlrdata;
583 conshdlrdata = SCIPconshdlrGetData(conshdlr);
585 snprintfreturn = SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"diag_ge_zero_%d", ++(conshdlrdata->ndiaggezerocuts));
586 assert( snprintfreturn < SCIP_MAXSTRLEN );
588 (void) SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"diag_ge_zero_%d", ++(conshdlrdata->ndiaggezerocuts));
591 #ifdef SCIP_MORE_DEBUG
592 SCIPinfoMessage(scip, NULL,
"Added lp-constraint %s: ", cutname);
593 SCIPinfoMessage(scip, NULL,
"%f <= ", lhs_array[k]);
594 for (i = 0; i < consdata->nvars; i++)
596 if ( ! SCIPisZero(scip, cons_array[k * consdata->nvars + i]) )
597 SCIPinfoMessage(scip, NULL,
"+ (%f)*%s", cons_array[k * consdata->nvars + i], SCIPvarGetName(consdata->vars[i]));
599 SCIPinfoMessage(scip, NULL,
"\n");
602 SCIP_CALL( SCIPcreateConsLinear(scip, &cons, cutname, consdata->nvars, consdata->vars, cons_array + k * consdata->nvars, lhs_array[k], rhs,
603 TRUE, TRUE, FALSE, FALSE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE) );
605 SCIP_CALL( SCIPaddCons(scip, cons) );
606 SCIP_CALL( SCIPreleaseCons(scip, &cons) );
610 SCIPfreeBufferArray(scip, &lhs_array);
611 SCIPfreeBufferArray(scip, &cons_array);
612 SCIPfreeBufferArray(scip, &matrix);
628 SCIP_RETCODE diagDominant(
635 char cutname[SCIP_MAXSTRLEN];
636 SCIP_Bool* nonzerorows;
637 SCIP_CONSHDLRDATA* conshdlrdata;
650 assert( scip != NULL );
651 assert( conss != NULL );
652 assert( nconss >= 0 );
653 assert( naddconss != NULL );
655 for (i = 0; i < nconss; ++i)
657 assert( conss[i] != NULL );
658 assert( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[i])),
"SDP") == 0 );
660 SCIP_CONSDATA* consdata = SCIPconsGetData(conss[i]);
661 assert( consdata != NULL );
663 blocksize = consdata->blocksize;
664 nvars = consdata->nvars;
665 SCIP_CALL( SCIPallocBufferArray(scip, &nonzerorows, blocksize) );
668 for (j = 0; j < blocksize; j++)
669 nonzerorows[j] = FALSE;
672 for (j = 0; j < consdata->constnnonz; j++)
674 if ( consdata->constcol[j] != consdata->constrow[j] )
676 assert( ! SCIPisEQ(scip, consdata->constval[j], 0.0) );
677 nonzerorows[consdata->constcol[j]] = TRUE;
678 nonzerorows[consdata->constrow[j]] = TRUE;
684 SCIP_CALL( SCIPallocBufferArray(scip, &diagvars, blocksize) );
685 SCIP_CALL( SCIPallocBufferArray(scip, &ndiagvars, blocksize) );
686 for (j = 0; j < blocksize; ++j)
689 if ( nonzerorows[j] )
691 SCIP_CALL( SCIPallocBufferArray(scip, &(diagvars[j]), nvars) );
696 for (var = 0; var < nvars; var++)
698 for (j = 0; j < consdata->nvarnonz[var]; j++)
700 if ( consdata->col[var][j] == consdata->row[var][j] && nonzerorows[consdata->row[var][j]])
702 assert( ! SCIPisEQ(scip, consdata->val[var][j], 0.0) );
703 diagvars[consdata->col[var][j]][ndiagvars[consdata->col[var][j]]] = var;
704 ndiagvars[consdata->col[var][j]]++;
712 for (j = 0; j < blocksize; ++j)
714 if ( nonzerorows[j] )
716 SCIP_CALL( SCIPallocBufferArray(scip, &vals, ndiagvars[j]) );
717 SCIP_CALL( SCIPallocBufferArray(scip, &vars, ndiagvars[j]) );
720 for (var = 0; var < ndiagvars[j]; ++var)
722 vars[var] = consdata->vars[diagvars[j][var]];
726 conshdlrdata = SCIPconshdlrGetData(SCIPconsGetHdlr(conss[i]));
728 snprintfreturn = SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"diag_dom_%d", ++(conshdlrdata->ndiagdomcuts));
729 assert( snprintfreturn < SCIP_MAXSTRLEN );
731 (void) SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"diag_dom_%d", ++(conshdlrdata->ndiagdomcuts));
734 #ifdef SCIP_MORE_DEBUG
735 SCIPinfoMessage(scip, NULL,
"Added lp-constraint %s: ", cutname);
736 SCIPinfoMessage(scip, NULL,
"1 <= ");
737 for (i = 0; i < ndiagvars[j]; i++)
738 SCIPinfoMessage(scip, NULL,
"+ (%f)*%s", vals[i], SCIPvarGetName(vars[i]));
739 SCIPinfoMessage(scip, NULL,
"\n");
743 SCIP_CALL(SCIPcreateConsLinear(scip, &cons, cutname , ndiagvars[j], vars, vals, 1.0, SCIPinfinity(scip), TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE));
744 SCIP_CALL(SCIPaddCons(scip, cons));
745 SCIP_CALL(SCIPreleaseCons(scip, &cons));
748 SCIPfreeBufferArray(scip, &vars);
749 SCIPfreeBufferArray(scip, &vals);
750 SCIPfreeBufferArray(scip, &diagvars[j]);
754 SCIPfreeBufferArray(scip, &ndiagvars);
755 SCIPfreeBufferArray(scip, &diagvars);
756 SCIPfreeBufferArray(scip, &nonzerorows);
774 char cutname[SCIP_MAXSTRLEN];
776 SCIP_CONSDATA* consdata;
777 SCIP_CONSHDLRDATA* conshdlrdata;
792 assert( result != NULL );
793 *result = SCIP_SUCCESS;
795 for (i = 0; i < nconss; ++i)
797 hdlr = SCIPconsGetHdlr(conss[i]);
798 assert(hdlr != NULL);
801 assert( strcmp(SCIPconshdlrGetName(hdlr),
"SDP") == 0);
804 consdata = SCIPconsGetData(conss[i]);
805 assert( consdata != NULL );
808 if ( consdata->blocksize == 1 )
810 nvars = consdata->nvars;
811 nnonz = consdata->nnonz;
812 SCIP_CALL( SCIPallocBufferArray(scip, &vars, nvars) );
813 SCIP_CALL( SCIPallocBufferArray(scip, &coeffs, nnonz) );
818 for (var = 0; var < nvars; var++)
820 assert( consdata->nvarnonz[var] <= 1 );
822 for (j = 0; j < consdata->nvarnonz[var]; j++)
824 assert( consdata->col[var][j] == 0 && consdata->row[var][j] == 0 );
825 coeffs[count] = consdata->val[var][j];
826 vars[count] = consdata->vars[var];
832 assert( consdata->constnnonz <= 1 );
834 rhs = (consdata->constnnonz == 1) ? consdata->constval[0] : 0.0;
840 conshdlrdata = SCIPconshdlrGetData(hdlr);
842 snprintfreturn = SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"1x1block_%d", ++(conshdlrdata->n1x1blocks));
843 assert( snprintfreturn < SCIP_MAXSTRLEN );
845 (void) SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"1x1block_%d", ++(conshdlrdata->n1x1blocks));
848 #ifdef SCIP_MORE_DEBUG
849 SCIPinfoMessage(scip, NULL,
"Added lp-constraint %s: ", cutname);
850 for (i = 0; i < consdata->nvars; i++)
851 SCIPinfoMessage(scip, NULL,
"+ (%f)*%s", coeffs[i], SCIPvarGetName(vars[i]));
852 SCIPinfoMessage(scip, NULL,
" <= %f \n", rhs);
855 SCIP_CALL( SCIPcreateConsLinear(scip, &cons, cutname, consdata->nvars, vars, coeffs, rhs, SCIPinfinity(scip),
856 TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE, TRUE, FALSE) );
858 SCIP_CALL( SCIPaddCons(scip, cons) );
859 SCIP_CALL( SCIPreleaseCons(scip, &cons) );
867 if ( coeffs[0] > 0.0 )
870 if ( SCIPisFeasGT(scip, rhs / coeffs[0], SCIPvarGetLbLocal(vars[0])) )
873 if( SCIPisFeasGT(scip, rhs / coeffs[0], SCIPvarGetUbLocal(vars[0])) )
875 SCIPdebugMessage(
"Problem detected to be infeasible during presolving, 1x1-SDP-constraint %s caused change"
876 "of lower bound for variable %s from %f to %f, which is bigger than upper bound of %f\n",
877 SCIPconsGetName(conss[i]), SCIPvarGetName(vars[0]), SCIPvarGetLbLocal(vars[0]), rhs / coeffs[0],
878 SCIPvarGetUbLocal(vars[0]));
880 *result = SCIP_CUTOFF;
883 SCIP_CALL( SCIPdelCons(scip, conss[i]) );
886 SCIPfreeBufferArray(scip, &coeffs);
887 SCIPfreeBufferArray(scip, &vars);
892 SCIPdebugMessage(
"Changing lower bound of variable %s from %f to %f because of 1x1-SDP-constraint %s!\n",
893 SCIPvarGetName(vars[0]), SCIPvarGetLbLocal(vars[0]), rhs / coeffs[0], SCIPconsGetName(conss[i]));
894 SCIP_CALL( SCIPchgVarLb(scip, vars[0], rhs / coeffs[0]) );
898 SCIPdebugMessage(
"Deleting 1x1-SDP-constraint %s, new lower bound %f for variable %s no improvement over old bound %f!\n",
899 SCIPconsGetName(conss[i]), rhs / coeffs[0], SCIPvarGetName(vars[0]), SCIPvarGetLbLocal(vars[0]));
902 else if ( coeffs[0] < 0.0 )
905 if (SCIPisFeasLT(scip, rhs / coeffs[0], SCIPvarGetUbLocal(vars[0])))
908 if( SCIPisFeasLT(scip, rhs / coeffs[0], SCIPvarGetLbLocal(vars[0])) )
910 SCIPdebugMessage(
"Problem detected to be infeasible during presolving, 1x1-SDP-constraint %s caused change"
911 "of upper bound for variable %s from %f to %f, which is less than lower bound of %f\n",
912 SCIPconsGetName(conss[i]), SCIPvarGetName(vars[0]), SCIPvarGetUbLocal(vars[0]), rhs / coeffs[0],
913 SCIPvarGetLbLocal(vars[0]));
915 *result = SCIP_CUTOFF;
918 SCIP_CALL( SCIPdelCons(scip, conss[i]) );
921 SCIPfreeBufferArray(scip, &coeffs);
922 SCIPfreeBufferArray(scip, &vars);
927 SCIPdebugMessage(
"Changing upper bound of variable %s from %f to %f because of 1x1-SDP-constraint %s!\n",
928 SCIPvarGetName(vars[0]), SCIPvarGetUbLocal(vars[0]), -rhs / coeffs[0], SCIPconsGetName(conss[i]));
929 SCIP_CALL( SCIPchgVarUb(scip, vars[0], rhs / coeffs[0]) );
933 SCIPdebugMessage(
"Deleting 1x1-SDP-constraint %s, new upper bound %f for variable %s no improvement over old bound %f!\n",
934 SCIPconsGetName(conss[i]), rhs / coeffs[0], SCIPvarGetName(vars[0]), SCIPvarGetUbLocal(vars[0]));
939 SCIPdebugMessage(
"Detected 1x1 SDP-block without any nonzero coefficients \n");
940 if ( SCIPisFeasGT(scip, rhs, 0.0) )
942 SCIPdebugMessage(
"Detected infeasibility in 1x1 SDP-block without any nonzero coefficients but with strictly positive rhs\n");
943 *result = SCIP_CUTOFF;
946 SCIP_CALL( SCIPdelCons(scip, conss[i]) );
949 SCIPfreeBufferArray(scip, &coeffs);
950 SCIPfreeBufferArray(scip, &vars);
958 SCIP_CALL( SCIPdelCons(scip, conss[i]) );
961 SCIPfreeBufferArray(scip, &coeffs);
962 SCIPfreeBufferArray(scip, &vars);
986 SCIP_CONSDATA* consdata;
989 int aggrtargetlength;
994 assert( scip != NULL );
995 assert( cons != NULL );
996 assert( scalars != NULL );
997 assert( naggrvars > 0 );
998 assert( savedcol != NULL );
999 assert( savedrow != NULL );
1000 assert( savedval != NULL );
1001 assert( nfixednonz != NULL );
1003 consdata = SCIPconsGetData(cons);
1004 assert( consdata != NULL );
1006 SCIP_CALL( SCIPgetRealParam(scip,
"numerics/feastol", &feastol) );
1009 startind = *nfixednonz;
1011 if ( SCIPisEQ(scip, constant, 0.0) )
1017 for (i = 0; i < consdata->nvarnonz[*v]; i++)
1019 savedcol[*nfixednonz] = consdata->col[*v][i];
1020 savedrow[*nfixednonz] = consdata->row[*v][i];
1021 savedval[*nfixednonz] = consdata->val[*v][i];
1027 for (i = 0; i < consdata->nvarnonz[*v]; i++)
1029 savedcol[*nfixednonz] = consdata->col[*v][i];
1030 savedrow[*nfixednonz] = consdata->row[*v][i];
1031 savedval[*nfixednonz] = consdata->val[*v][i] * constant;
1035 assert( *nfixednonz - startind == consdata->nvarnonz[*v] );
1043 SCIP_CALL( SCIPreleaseVar(scip, &consdata->vars[*v]) );
1044 consdata->col[*v] = consdata->col[consdata->nvars - 1];
1045 consdata->row[*v] = consdata->row[consdata->nvars - 1];
1046 consdata->val[*v] = consdata->val[consdata->nvars - 1];
1047 consdata->nvarnonz[*v] = consdata->nvarnonz[consdata->nvars - 1];
1048 consdata->vars[*v] = consdata->vars[consdata->nvars - 1];
1049 (consdata->nvars)--;
1053 for (aggrind = 0; aggrind < naggrvars; aggrind++)
1057 for (i = 0; i < consdata->nvars; i++)
1059 if ( consdata->vars[i] == aggrvars[aggrind] )
1066 if ( aggrconsind > -1 )
1071 aggrtargetlength = consdata->nvarnonz[aggrconsind] + *nfixednonz - startind;
1072 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->row[aggrconsind]), consdata->nvarnonz[aggrconsind], aggrtargetlength) );
1073 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->col[aggrconsind]), consdata->nvarnonz[aggrconsind], aggrtargetlength) );
1074 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->val[aggrconsind]), consdata->nvarnonz[aggrconsind], aggrtargetlength) );
1076 if ( SCIPisEQ(scip, constant, 0.0) )
1080 SCIP_CALL(
SCIPsdpVarfixerMergeArrays(SCIPblkmem(scip), feastol, savedrow + startind, savedcol + startind, savedval + startind,
1081 *nfixednonz - startind, TRUE, scalars[aggrind], consdata->row[aggrconsind], consdata->col[aggrconsind],
1082 consdata->val[aggrconsind], &(consdata->nvarnonz[aggrconsind]), aggrtargetlength) );
1088 SCIP_CALL(
SCIPsdpVarfixerMergeArrays(SCIPblkmem(scip), feastol, savedrow + startind, savedcol + startind, savedval + startind,
1089 *nfixednonz - startind, TRUE, scalars[aggrind] / constant, consdata->row[aggrconsind], consdata->col[aggrconsind],
1090 consdata->val[aggrconsind], &(consdata->nvarnonz[aggrconsind]), aggrtargetlength) );
1094 assert( consdata->nvarnonz[aggrconsind] <= aggrtargetlength );
1095 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->row[aggrconsind]), aggrtargetlength, consdata->nvarnonz[aggrconsind]) );
1096 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->col[aggrconsind]), aggrtargetlength, consdata->nvarnonz[aggrconsind]) );
1097 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->val[aggrconsind]), aggrtargetlength, consdata->nvarnonz[aggrconsind]) );
1103 SCIPdebugMessage(
"adding variable %s to SDP constraint %s because of (multi-)aggregation\n", SCIPvarGetName(aggrvars[aggrind]), SCIPconsGetName(cons));
1106 if ( consdata->nvars == *vararraylength )
1108 globalnvars = SCIPgetNVars(scip);
1111 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->col, *vararraylength, globalnvars) );
1112 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->row, *vararraylength, globalnvars) );
1113 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->val, *vararraylength, globalnvars) );
1114 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->nvarnonz, *vararraylength, globalnvars) );
1115 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->vars, *vararraylength, globalnvars) );
1116 *vararraylength = globalnvars;
1120 SCIP_CALL( SCIPcaptureVar(scip, aggrvars[aggrind]) );
1121 consdata->vars[consdata->nvars] = aggrvars[aggrind];
1124 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(consdata->col[consdata->nvars]), savedcol + startind, *nfixednonz - startind) );
1125 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(consdata->row[consdata->nvars]), savedrow + startind, *nfixednonz - startind) );
1131 if ( SCIPisEQ(scip, scalars[aggrind], constant) || SCIPisEQ(scip, constant, 0.0) )
1133 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(consdata->val[consdata->nvars]), savedval + startind, *nfixednonz - startind) );
1134 consdata->nvarnonz[consdata->nvars] = *nfixednonz - startind;
1141 SCIP_CALL( SCIPgetRealParam(scip,
"numerics/epsilon", &epsilon) );
1143 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(consdata->val[consdata->nvars]), *nfixednonz - startind) );
1145 consdata->nvarnonz[consdata->nvars] = 0;
1147 for (i = 0; i < *nfixednonz - startind; i++)
1150 if ( (scalars[i] / constant) * savedval[startind + i] >= epsilon )
1152 consdata->val[consdata->nvars][consdata->nvarnonz[consdata->nvars]] = (scalars[i] / constant) * savedval[startind + i];
1153 consdata->nvarnonz[consdata->nvars]++;
1158 if ( consdata->nvarnonz[consdata->nvars] > 0 )
1165 if ( SCIPisEQ(scip, constant, 0.0) )
1166 *nfixednonz = startind;
1181 SCIP_CONSDATA* consdata;
1186 SCIP_Real* savedval;
1191 SCIP_VAR** aggrvars;
1208 assert( scip != NULL );
1209 assert( conss != NULL );
1210 assert( nconss >= 0 );
1212 SCIPdebugMessage(
"Calling fixAndAggrVars with aggregate = %u\n", aggregate);
1214 SCIP_CALL( SCIPgetRealParam(scip,
"numerics/feastol", &feastol) );
1216 for (c = 0; c < nconss; ++c)
1218 assert( conss[c] != NULL );
1219 assert( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(conss[c])),
"SDP") == 0);
1221 consdata = SCIPconsGetData(conss[c]);
1222 assert( consdata != NULL );
1225 SCIP_CALL( SCIPallocBufferArray(scip, &savedcol, consdata->nnonz) );
1226 SCIP_CALL( SCIPallocBufferArray(scip, &savedrow, consdata->nnonz) );
1227 SCIP_CALL( SCIPallocBufferArray(scip, &savedval, consdata->nnonz) );
1232 vararraylength = consdata->nvars;
1233 globalnvars = SCIPgetNVars(scip);
1235 for (v = 0; v < consdata->nvars; v++)
1239 if ( SCIPvarIsBinary(consdata->vars[v]) && SCIPvarIsNegated(consdata->vars[v]) )
1242 var = SCIPvarGetNegationVar(consdata->vars[v]);
1245 var = consdata->vars[v];
1248 if ( SCIPvarGetStatus(var) == SCIP_VARSTATUS_FIXED || SCIPisEQ(scip, SCIPvarGetLbGlobal(var), SCIPvarGetUbGlobal(var)))
1250 assert( SCIPisEQ(scip, SCIPvarGetLbGlobal(var), SCIPvarGetUbGlobal(var)) );
1252 SCIPdebugMessage(
"Globally fixing Variable %s to value %f !\n", SCIPvarGetName(var), SCIPvarGetLbGlobal(var));
1254 if ( ((! negated) && (! SCIPisEQ(scip, SCIPvarGetLbGlobal(var), 0.0))) || (negated && SCIPisEQ(scip, SCIPvarGetLbGlobal(var), 0.0)) )
1259 for (i = 0; i < consdata->nvarnonz[v]; i++)
1261 savedcol[nfixednonz] = consdata->col[v][i];
1262 savedrow[nfixednonz] = consdata->row[v][i];
1265 savedval[nfixednonz] = consdata->val[v][i] * SCIPvarGetLbGlobal(var);
1267 savedval[nfixednonz] = consdata->val[v][i];
1276 consdata->nnonz -= consdata->nvarnonz[v];
1279 SCIP_CALL( SCIPreleaseVar(scip, &(consdata->vars[v])) );
1280 consdata->col[v] = consdata->col[consdata->nvars - 1];
1281 consdata->row[v] = consdata->row[consdata->nvars - 1];
1282 consdata->val[v] = consdata->val[consdata->nvars - 1];
1283 consdata->nvarnonz[v] = consdata->nvarnonz[consdata->nvars - 1];
1284 consdata->vars[v] = consdata->vars[consdata->nvars - 1];
1288 else if ( (SCIPvarGetStatus(var) == SCIP_VARSTATUS_AGGREGATED ||
1289 SCIPvarGetStatus(var) == SCIP_VARSTATUS_MULTAGGR)
1292 SCIP_CALL( SCIPallocBufferArray(scip, &aggrvars, globalnvars) );
1293 SCIP_CALL( SCIPallocBufferArray(scip, &scalars, globalnvars) );
1298 aggrvars[0] = consdata->vars[v];
1306 aggrvars[0] = consdata->vars[v];
1313 SCIP_CALL( SCIPgetProbvarLinearSum(scip, aggrvars, scalars, &naggrvars, globalnvars, &constant, &requiredsize, TRUE) );
1314 assert( requiredsize <= globalnvars );
1319 if ( SCIPvarGetStatus(consdata->vars[v]) == SCIP_VARSTATUS_AGGREGATED )
1320 SCIPdebugMessage(
"aggregating variable %s to ", SCIPvarGetName(var));
1322 SCIPdebugMessage(
"multiaggregating variable %s to ", SCIPvarGetName(var));
1323 for (i = 0; i < naggrvars; i++)
1324 SCIPdebugMessage(
"+ (%f2) * %s ", scalars[i], SCIPvarGetName(aggrvars[i]));
1325 SCIPdebugMessage(
"+ (%f2) \n", constant);
1330 SCIP_CALL(
multiaggrVar(scip, conss[c], &v, aggrvars, scalars, naggrvars, constant, savedcol, savedrow, savedval, &nfixednonz, &vararraylength) );
1332 SCIPfreeBufferArray(scip, &aggrvars);
1333 SCIPfreeBufferArray(scip, &scalars);
1335 else if ( negated && (SCIPvarGetStatus(var) == SCIP_VARSTATUS_LOOSE || SCIPvarGetStatus(var) == SCIP_VARSTATUS_COLUMN)
1340 SCIPdebugMessage(
"Changing variable %s to negation of variable %s !\n", SCIPvarGetName(consdata->vars[v]), SCIPvarGetName(var));
1344 SCIP_CALL(
multiaggrVar(scip, conss[c], &v, &var, &scalar, 1, 1.0, savedcol, savedrow, savedval, &nfixednonz, &vararraylength) );
1349 assert( consdata->nvars <= vararraylength );
1350 if ( consdata->nvars < vararraylength )
1352 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->col, vararraylength, consdata->nvars) );
1353 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->row, vararraylength, consdata->nvars) );
1354 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->val, vararraylength, consdata->nvars) );
1355 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->nvarnonz, vararraylength, consdata->nvars) );
1356 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->vars, vararraylength, consdata->nvars) );
1360 arraylength = consdata->constnnonz + nfixednonz;
1361 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->constcol), consdata->constnnonz, arraylength) );
1362 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->constrow), consdata->constnnonz, arraylength) );
1363 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->constval), consdata->constnnonz, arraylength) );
1366 SCIP_CALL(
SCIPsdpVarfixerMergeArrays(SCIPblkmem(scip), feastol, savedrow, savedcol, savedval, nfixednonz, FALSE, -1.0, consdata->constrow,
1367 consdata->constcol, consdata->constval, &(consdata->constnnonz), arraylength) );
1369 assert( consdata->constnnonz <= arraylength );
1372 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->constcol), arraylength, consdata->constnnonz) );
1373 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->constrow), arraylength, consdata->constnnonz) );
1374 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &(consdata->constval), arraylength, consdata->constnnonz) );
1377 SCIPfreeBufferArray(scip, &savedval);
1378 SCIPfreeBufferArray(scip, &savedrow);
1379 SCIPfreeBufferArray(scip, &savedcol);
1382 consdata->nnonz = 0;
1383 for (v = 0; v < consdata->nvars; v++)
1384 consdata->nnonz += consdata->nvarnonz[v];
1394 SCIP_CONSHDLRDATA* conshdlrdata;
1396 assert( conshdlr != NULL );
1398 conshdlrdata = SCIPconshdlrGetData(conshdlr);
1399 assert( conshdlrdata != NULL );
1401 conshdlrdata->neigveccuts = 0;
1402 conshdlrdata->ndiaggezerocuts = 0;
1403 conshdlrdata->ndiagdomcuts = 0;
1404 conshdlrdata->n1x1blocks = 0;
1414 SCIP_CONSDATA* consdata;
1418 SCIP_Real eigenvalue;
1420 consdata = SCIPconsGetData(cons);
1421 assert( consdata != NULL );
1422 blocksize = consdata->blocksize;
1423 nvars = consdata->nvars;
1425 SCIP_CALL( SCIPallocBufferArray(scip, &Aj, blocksize * blocksize) );
1427 for (var = 0; var < nvars; var++)
1433 if ( SCIPisNegative(scip, eigenvalue) )
1437 SCIP_CALL( SCIPaddVarLocks(scip, consdata->vars[var], nlocksneg, nlockspos) );
1441 if ( SCIPisPositive(scip, eigenvalue) )
1445 SCIP_CALL( SCIPaddVarLocks(scip, consdata->vars[var], nlockspos, nlocksneg) );
1451 if ( SCIPisPositive(scip, eigenvalue) )
1455 SCIP_CALL( SCIPaddVarLocks(scip, consdata->vars[var], nlockspos, nlocksneg) );
1460 SCIPfreeBufferArray(scip, &Aj);
1469 assert( scip != NULL );
1471 if ( conss == NULL )
1483 assert( result != 0 );
1487 SCIP_CALL(
diagGEzero(scip, conss, nconss, naddconss) );
1494 SCIP_CALL( diagDominant(scip, conss, nconss, naddconss) );
1505 SCIP_CONSDATA* sourcedata;
1506 SCIP_CONSDATA* targetdata;
1508 SCIP_CONSHDLRDATA* conshdlrdata;
1512 sourcedata = SCIPconsGetData(sourcecons);
1513 assert( sourcedata != NULL );
1516 conshdlrdata = SCIPconshdlrGetData(conshdlr);
1517 SCIPdebugMessage(
"Setting number of threads to %d via OpenMP in Openblas.\n", conshdlrdata->nthreads);
1518 omp_set_num_threads(conshdlrdata->nthreads);
1521 SCIP_CALL( SCIPallocBlockMemory(scip, &targetdata) );
1524 targetdata->nvars = sourcedata->nvars;
1525 targetdata->nnonz = sourcedata->nnonz;
1526 targetdata->blocksize = sourcedata->blocksize;
1528 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(targetdata->nvarnonz), sourcedata->nvarnonz, sourcedata->nvars) );
1531 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(targetdata->col), sourcedata->nvars) );
1532 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(targetdata->row), sourcedata->nvars) );
1533 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(targetdata->val), sourcedata->nvars) );
1535 for (i = 0; i < sourcedata->nvars; i++)
1537 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(targetdata->col[i]), sourcedata->col[i], sourcedata->nvarnonz[i]) );
1538 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(targetdata->row[i]), sourcedata->row[i], sourcedata->nvarnonz[i]) );
1539 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(targetdata->val[i]), sourcedata->val[i], sourcedata->nvarnonz[i]) );
1541 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(targetdata->vars), sourcedata->nvars));
1544 for (i = 0; i < sourcedata->nvars; i++)
1546 targetdata->vars[i] = SCIPvarGetTransVar(sourcedata->vars[i]);
1547 SCIP_CALL( SCIPcaptureVar(scip, targetdata->vars[i]) );
1551 targetdata->constnnonz = sourcedata->constnnonz;
1553 if ( sourcedata->constnnonz > 0 )
1555 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(targetdata->constcol), sourcedata->constcol, sourcedata->constnnonz));
1556 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(targetdata->constrow), sourcedata->constrow, sourcedata->constnnonz));
1557 SCIP_CALL( SCIPduplicateBlockMemoryArray(scip, &(targetdata->constval), sourcedata->constval, sourcedata->constnnonz));
1561 targetdata->constcol = NULL;
1562 targetdata->constrow = NULL;
1563 targetdata->constval = NULL;
1567 targetdata->maxrhsentry = sourcedata->maxrhsentry;
1570 SCIP_CALL( SCIPcreateCons(scip, targetcons, SCIPconsGetName(sourcecons), conshdlr, targetdata,
1571 SCIPconsIsInitial(sourcecons), SCIPconsIsSeparated(sourcecons), SCIPconsIsEnforced(sourcecons),
1572 SCIPconsIsChecked(sourcecons), SCIPconsIsPropagated(sourcecons), SCIPconsIsLocal(sourcecons),
1573 SCIPconsIsModifiable(sourcecons), SCIPconsIsDynamic(sourcecons), SCIPconsIsRemovable(sourcecons),
1574 SCIPconsIsStickingAtNode(sourcecons)) );
1585 assert( scip != NULL );
1586 assert( result != NULL );
1588 *result = SCIP_FEASIBLE;
1590 for (i = 0; i < nconss; ++i)
1592 SCIP_CALL(
SCIPconsSdpCheckSdpCons(scip, conss[i], sol, checkintegrality, checklprows, printreason, result) );
1593 if ( *result == SCIP_INFEASIBLE )
1609 assert( scip != NULL );
1610 assert( result != NULL );
1611 assert( conss != NULL );
1613 *result = SCIP_DIDNOTRUN;
1615 if ( objinfeasible )
1617 SCIPdebugMessage(
"-> pseudo solution is objective infeasible, return.\n");
1621 for (i = 0; i < nconss; ++i)
1625 if (*result == SCIP_INFEASIBLE)
1628 SCIPdebugMessage(
"-> pseudo solution infeasible for SDP-constraint %s, return.\n", SCIPconsGetName(conss[i]));
1633 SCIPdebugMessage(
"-> pseudo solution feasible for all SDP-constraints.\n");
1646 char cutname[SCIP_MAXSTRLEN];
1647 SCIP_CONSDATA* consdata;
1648 SCIP_CONSHDLRDATA* conshdlrdata;
1649 SCIP_Bool all_feasible = TRUE;
1650 SCIP_Bool separated = FALSE;
1652 SCIP_Bool infeasible;
1663 assert( result != NULL );
1664 *result = SCIP_FEASIBLE;
1666 for (i = 0; i < nconss; ++i)
1668 consdata = SCIPconsGetData(conss[i]);
1670 if ( *result == SCIP_FEASIBLE )
1673 all_feasible = FALSE;
1675 nvars = consdata->nvars;
1679 SCIP_CALL( SCIPallocBufferArray(scip, &coeff, nvars) );
1682 rhs = SCIPinfinity(scip);
1683 conshdlrdata = SCIPconshdlrGetData(conshdlr);
1686 snprintfreturn = SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"sepa_eig_sdp_%d", ++(conshdlrdata->neigveccuts));
1687 assert( snprintfreturn < SCIP_MAXSTRLEN );
1689 (void) SCIPsnprintf(cutname, SCIP_MAXSTRLEN,
"sepa_eig_sdp_%d", ++(conshdlrdata->neigveccuts));
1692 SCIP_CALL( SCIPcreateEmptyRowCons(scip, &row, conshdlr, cutname , lhs, rhs, FALSE, FALSE, TRUE) );
1693 SCIP_CALL( SCIPcacheRowExtensions(scip, row) );
1695 for (j = 0; j < nvars; ++j)
1697 SCIP_CALL( SCIPaddVarToRow(scip, row, consdata->vars[j], coeff[j]) );
1700 SCIP_CALL( SCIPflushRowExtensions(scip, row) );
1702 #ifdef SCIP_MORE_DEBUG
1703 SCIPinfoMessage(scip, NULL,
"Added cut %s: ", cutname);
1704 SCIPinfoMessage(scip, NULL,
"%f <= ", lhs);
1705 for (j = 0; j < nvars; j++)
1706 SCIPinfoMessage(scip, NULL,
"+ (%f)*%s", coeff[j], SCIPvarGetName(consdata->vars[j]));
1707 SCIPinfoMessage(scip, NULL,
"\n");
1710 SCIP_CALL( SCIPaddCut(scip, NULL, row, FALSE, &infeasible) );
1713 *result = SCIP_CUTOFF;
1716 SCIP_CALL( SCIPaddPoolCut(scip, row) );
1718 SCIP_CALL( SCIPresetConsAge(scip, conss[i]) );
1719 *result = SCIP_SEPARATED;
1722 SCIP_CALL( SCIPreleaseRow(scip, &row) );
1723 SCIPfreeBufferArray(scip, &coeff);
1730 *result = SCIP_SEPARATED;
1741 assert( result != NULL );
1742 *result = SCIP_DIDNOTFIND;
1744 for (i = 0; i < nusefulconss; ++i)
1746 SCIP_CALL(
separateSol(scip, conshdlr, conss[i], sol, result) );
1758 assert( result != NULL );
1759 *result = SCIP_DIDNOTFIND;
1761 for (i = 0; i < nusefulconss; ++i)
1763 SCIP_CALL(
separateSol(scip, conshdlr, conss[i], NULL, result) );
1775 assert( cons != NULL );
1776 assert( consdata != NULL );
1778 SCIPdebugMessage(
"deleting SDP constraint <%s>.\n", SCIPconsGetName(cons));
1780 for (i = 0; i < (*consdata)->nvars; i++)
1782 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->val[i], (*consdata)->nvarnonz[i]);
1783 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->row[i], (*consdata)->nvarnonz[i]);
1784 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->col[i], (*consdata)->nvarnonz[i]);
1788 for (i = 0; i < (*consdata)->nvars; i++)
1790 SCIP_CALL( SCIPreleaseVar(scip, &((*consdata)->vars[i])) );
1793 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->vars, (*consdata)->nvars);
1794 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->constval, (*consdata)->constnnonz);
1795 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->constrow, (*consdata)->constnnonz);
1796 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->constcol, (*consdata)->constnnonz);
1797 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->val, (*consdata)->nvars);
1798 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->row, (*consdata)->nvars);
1799 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->col, (*consdata)->nvars);
1800 SCIPfreeBlockMemoryArrayNull(scip, &(*consdata)->nvarnonz, (*consdata)->nvars);
1801 SCIPfreeBlockMemory(scip, consdata);
1810 SCIP_CONSHDLRDATA* conshdlrdata;
1812 conshdlrdata = SCIPconshdlrGetData(conshdlr);
1813 assert( conshdlrdata != NULL );
1815 SCIPfreeMemory(scip, &conshdlrdata);
1816 SCIPconshdlrSetData(conshdlr, NULL);
1825 assert(scip != NULL);
1826 assert(conshdlr != NULL);
1827 assert(strcmp(SCIPconshdlrGetName(conshdlr),
CONSHDLR_NAME) == 0);
1840 SCIP_CONSDATA* sourcedata;
1842 SCIP_VAR** targetvars;
1846 assert( scip != NULL );
1847 assert( sourcescip != NULL );
1848 assert( sourcecons != NULL );
1849 assert( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(sourcecons)),
CONSHDLR_NAME) == 0 );
1850 assert( valid != NULL );
1852 SCIPdebugMessage(
"Copying SDP constraint %s\n", SCIPconsGetName(sourcecons));
1858 if ( SCIPgetStage(sourcescip) <= SCIP_STAGE_EXITPRESOLVE )
1863 sourcedata = SCIPconsGetData(sourcecons);
1864 assert( sourcedata != NULL );
1866 SCIP_CALL( SCIPallocBufferArray(scip, &targetvars, sourcedata->nvars) );
1869 for (i = 0; i < sourcedata->nvars; i++)
1871 SCIP_CALL( SCIPgetVarCopy(sourcescip, scip, sourcedata->vars[i], &var, varmap, consmap, global, &success) );
1874 targetvars[i] = var;
1875 SCIP_CALL( SCIPcaptureVar(scip, targetvars[i]) );
1884 SCIP_CALL(
SCIPcreateConsSdp( scip, cons, name, sourcedata->nvars, sourcedata->nnonz, sourcedata->blocksize, sourcedata->nvarnonz,
1885 sourcedata->col, sourcedata->row, sourcedata->val, targetvars, sourcedata->constnnonz,
1886 sourcedata->constcol, sourcedata->constrow, sourcedata->constval) );
1890 SCIP_CALL(
SCIPcreateConsSdp( scip, cons, SCIPconsGetName(sourcecons), sourcedata->nvars, sourcedata->nnonz, sourcedata->blocksize,
1891 sourcedata->nvarnonz, sourcedata->col, sourcedata->row, sourcedata->val, targetvars, sourcedata->constnnonz,
1892 sourcedata->constcol, sourcedata->constrow, sourcedata->constval) );
1895 SCIPfreeBufferArray(scip, &targetvars);
1904 #ifdef PRINT_HUMAN_READABLE
1905 SCIP_CONSDATA* consdata;
1906 SCIP_Real* fullmatrix;
1911 assert( scip != NULL );
1912 assert( cons != NULL );
1914 consdata = SCIPconsGetData(cons);
1915 assert( consdata != NULL );
1917 SCIP_CALL( SCIPallocBufferArray(scip, &fullmatrix, consdata->blocksize * consdata->blocksize) );
1920 for (v = 0; v < consdata->nvars; v++)
1925 for (i = 0; i < consdata->blocksize; i++)
1927 for (j = 0; j < consdata->blocksize; j++)
1928 fullmatrix[i * consdata->blocksize + j] = 0.0;
1932 for (i = 0; i < consdata->nvarnonz[v]; i++)
1934 fullmatrix[consdata->row[v][i] * consdata->blocksize + consdata->col[v][i]] = consdata->val[v][i];
1935 fullmatrix[consdata->col[v][i] * consdata->blocksize + consdata->row[v][i]] = consdata->val[v][i];
1939 SCIPinfoMessage(scip, file,
"+\n");
1940 for (i = 0; i < consdata->blocksize; i++)
1942 SCIPinfoMessage(scip, file,
"( ");
1943 for (j = 0; j < consdata->blocksize; j++)
1944 SCIPinfoMessage(scip, file,
"%f ", fullmatrix[i * consdata->blocksize + j]);
1945 SCIPinfoMessage(scip, file,
")\n");
1947 SCIPinfoMessage(scip, file,
"* %s\n", SCIPvarGetName(consdata->vars[v]));
1955 for (i = 0; i < consdata->blocksize; i++)
1957 for (j = 0; j < consdata->blocksize; j++)
1958 fullmatrix[i * consdata->blocksize + j] = 0.0;
1962 for (i = 0; i < consdata->constnnonz; i++)
1964 fullmatrix[consdata->constrow[i] * consdata->blocksize + consdata->constcol[i]] = consdata->constval[i];
1965 fullmatrix[consdata->constcol[i] * consdata->blocksize + consdata->constrow[i]] = consdata->constval[i];
1969 SCIPinfoMessage(scip, file,
"-\n");
1970 for (i = 0; i < consdata->blocksize; i++)
1972 SCIPinfoMessage(scip, file,
"( ");
1973 for (j = 0; j < consdata->blocksize; j++)
1974 SCIPinfoMessage(scip, file,
"%f ", fullmatrix[i * consdata->blocksize + j]);
1975 SCIPinfoMessage(scip, file,
")\n");
1977 SCIPinfoMessage(scip, file,
">=0\n");
1979 SCIPfreeBufferArray(scip, &fullmatrix);
1983 SCIP_CONSDATA* consdata;
1987 assert( scip != NULL );
1988 assert( cons != NULL );
1990 consdata = SCIPconsGetData(cons);
1993 SCIPinfoMessage(scip, file,
"%d\n", consdata->blocksize);
1996 if ( consdata->constnnonz > 0 )
1998 SCIPinfoMessage(scip, file,
"A_0: ");
2000 for (i = 0; i < consdata->constnnonz; i++)
2002 SCIPinfoMessage(scip, file,
"(%d,%d):%f, ", consdata->constrow[i], consdata->constcol[i], consdata->constval[i]);
2004 SCIPinfoMessage(scip, file,
"\n");
2008 for (v = 0; v < consdata->nvars; v++)
2010 SCIPinfoMessage(scip, file,
"<%s>: ", SCIPvarGetName(consdata->vars[v]));
2011 for (i = 0; i < consdata->nvarnonz[v]; i++)
2013 SCIPinfoMessage(scip, file,
"(%d,%d):%f, ", consdata->row[v][i], consdata->col[v][i], consdata->val[v][i]);
2016 if (v < consdata->nvars - 1)
2018 SCIPinfoMessage(scip, file,
"\n");
2030 SCIP_Bool parsesuccess;
2031 SCIP_CONSDATA* consdata = NULL;
2037 assert( scip != NULL );
2038 assert( str != NULL );
2040 nvars = SCIPgetNVars(scip);
2042 assert( success != NULL );
2046 SCIP_CALL( SCIPallocBlockMemory(scip, &consdata) );
2047 consdata->nvars = 0;
2048 consdata->nnonz = 0;
2049 consdata->constnnonz = 0;
2050 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->nvarnonz, nvars) );
2051 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->col, nvars) );
2052 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->row, nvars) );
2053 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->val, nvars) );
2054 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->vars, nvars));
2055 consdata->constcol = NULL;
2056 consdata->constrow = NULL;
2057 consdata->constval = NULL;
2060 parsesuccess = SCIPstrToIntValue(str, &(consdata->blocksize), &pos);
2061 *success = *success && parsesuccess;
2064 while( isspace((
unsigned char)*pos) )
2068 if ( pos[0] ==
'A' && pos[1] ==
'_' && pos[2] ==
'0' )
2072 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->constcol,
PARSE_STARTSIZE) );
2073 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->constrow,
PARSE_STARTSIZE) );
2074 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->constval,
PARSE_STARTSIZE) );
2079 while (pos[0] ==
'(')
2084 if ( consdata->constnnonz == currentsize )
2086 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->constcol, currentsize,
PARSE_SIZEFACTOR * currentsize) );
2087 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->constrow, currentsize,
PARSE_SIZEFACTOR * currentsize) );
2088 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->constval, currentsize,
PARSE_SIZEFACTOR * currentsize) );
2092 parsesuccess = SCIPstrToIntValue(pos, &(consdata->constrow[consdata->constnnonz]), &pos);
2093 *success = *success && parsesuccess;
2094 assert( consdata->constrow[consdata->constnnonz] < consdata->blocksize );
2096 parsesuccess = SCIPstrToIntValue(pos, &(consdata->constcol[consdata->constnnonz]), &pos);
2097 *success = *success && parsesuccess;
2098 assert( consdata->constcol[consdata->constnnonz] < consdata->blocksize );
2100 parsesuccess = SCIPstrToRealValue(pos, &(consdata->constval[consdata->constnnonz]), &pos);
2101 *success = *success && parsesuccess;
2105 if ( consdata->constcol[consdata->constnnonz] > consdata->constrow[consdata->constnnonz] )
2107 i = consdata->constcol[consdata->constnnonz];
2108 consdata->constcol[consdata->constnnonz] = consdata->constrow[consdata->constnnonz];
2109 consdata->constrow[consdata->constnnonz] = i;
2112 consdata->constnnonz++;
2115 while( isspace((
unsigned char)*pos) )
2120 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->constcol, currentsize, consdata->constnnonz) );
2121 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->constrow, currentsize, consdata->constnnonz) );
2122 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->constval, currentsize, consdata->constnnonz) );
2126 while( isspace((
unsigned char)*pos) )
2132 while (pos[0] ==
'<')
2135 SCIP_CALL( SCIPparseVarName(scip, pos, &(consdata->vars[consdata->nvars]), &pos) );
2136 SCIP_CALL( SCIPcaptureVar(scip, consdata->vars[consdata->nvars]) );
2138 consdata->nvarnonz[consdata->nvars] = 0;
2139 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(consdata->col[consdata->nvars]),
PARSE_STARTSIZE));
2140 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(consdata->row[consdata->nvars]),
PARSE_STARTSIZE));
2141 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &(consdata->val[consdata->nvars]),
PARSE_STARTSIZE));
2148 while (pos[0] ==
'(')
2153 if ( consdata->nvarnonz[consdata->nvars - 1] == currentsize )
2155 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->col[consdata->nvars - 1], currentsize,
PARSE_SIZEFACTOR * currentsize) );
2156 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->row[consdata->nvars - 1], currentsize,
PARSE_SIZEFACTOR * currentsize) );
2157 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->val[consdata->nvars - 1], currentsize,
PARSE_SIZEFACTOR * currentsize) );
2161 parsesuccess = SCIPstrToIntValue(pos, &(consdata->row[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]]), &pos);
2162 *success = *success && parsesuccess;
2163 assert( consdata->row[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]] < consdata->blocksize );
2165 parsesuccess = SCIPstrToIntValue(pos, &(consdata->col[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]]), &pos);
2166 *success = *success && parsesuccess;
2167 assert( consdata->col[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]] < consdata->blocksize );
2169 parsesuccess = SCIPstrToRealValue(pos, &(consdata->val[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]]), &pos);
2170 *success = *success && parsesuccess;
2174 if ( consdata->col[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]] >
2175 consdata->row[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]] )
2177 i = consdata->col[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]];
2178 consdata->col[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]] =
2179 consdata->row[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]];
2180 consdata->row[consdata->nvars - 1][consdata->nvarnonz[consdata->nvars - 1]] = i;
2183 consdata->nvarnonz[consdata->nvars - 1]++;
2186 while( isspace((
unsigned char)*pos) )
2191 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->col[consdata->nvars - 1], currentsize, consdata->nvarnonz[consdata->nvars - 1]) );
2192 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->row[consdata->nvars - 1], currentsize, consdata->nvarnonz[consdata->nvars - 1]) );
2193 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->val[consdata->nvars - 1], currentsize, consdata->nvarnonz[consdata->nvars - 1]) );
2196 while( isspace((
unsigned char)*pos) )
2201 SCIP_CALL( SCIPcreateCons(scip, cons, name, conshdlr, consdata, initial, separate, enforce, check, propagate, local, modifiable,
2202 dynamic, removable, stickingatnode) );
2207 #ifdef SCIP_MORE_DEBUG
2208 SCIP_CALL( SCIPprintCons(scip, *cons, NULL) );
2218 SCIP_CONSDATA* consdata;
2222 assert( scip != NULL );
2223 assert( cons != NULL );
2224 assert( vars != NULL );
2225 assert( success != NULL );
2226 assert( varssize >= 0 );
2228 consdata = SCIPconsGetData(cons);
2229 assert( consdata != NULL );
2231 nvars = consdata->nvars;
2233 if ( nvars > varssize )
2235 SCIPdebugMessage(
"consGetVarsIndicator called for array of size %d, needed size %d.\n", varssize, nvars);
2240 for (i = 0; i < nvars; i++)
2241 vars[i] = consdata->vars[i];
2252 SCIP_CONSDATA* consdata;
2254 assert( scip != NULL );
2255 assert( cons != NULL );
2256 assert( nvars != NULL );
2257 assert( success != NULL );
2259 consdata = SCIPconsGetData(cons);
2260 assert( consdata != NULL );
2262 *nvars = consdata->nvars;
2273 SCIP_CONSHDLR* conshdlr = NULL;
2274 SCIP_CONSHDLRDATA* conshdlrdata = NULL;
2276 assert( scip != 0 );
2279 SCIP_CALL( SCIPallocMemory(scip, &conshdlrdata) );
2284 consEnfolpSdp, consEnfopsSdp, consCheckSdp, consLockSdp, conshdlrdata) );
2286 assert( conshdlr != NULL );
2289 SCIP_CALL( SCIPsetConshdlrDelete(scip, conshdlr, consDeleteSdp) );
2290 SCIP_CALL( SCIPsetConshdlrFree(scip, conshdlr, consFreeSdp) );
2291 SCIP_CALL( SCIPsetConshdlrCopy(scip, conshdlr, conshdlrCopySdp, consCopySdp) );
2292 SCIP_CALL( SCIPsetConshdlrInitpre(scip, conshdlr,consInitpreSdp) );
2293 SCIP_CALL( SCIPsetConshdlrExitpre(scip, conshdlr, consExitpreSdp) );
2295 SCIP_CALL( SCIPsetConshdlrSepa(scip, conshdlr, consSepalpSdp, consSepasolSdp,
CONSHDLR_SEPAFREQ,
2297 SCIP_CALL( SCIPsetConshdlrTrans(scip, conshdlr, consTransSdp) );
2298 SCIP_CALL( SCIPsetConshdlrPrint(scip, conshdlr, consPrintSdp) );
2299 SCIP_CALL( SCIPsetConshdlrParse(scip, conshdlr, consParseSdp) );
2300 SCIP_CALL( SCIPsetConshdlrGetVars(scip, conshdlr, consGetVarsSdp) );
2301 SCIP_CALL( SCIPsetConshdlrGetNVars(scip, conshdlr, consGetNVarsSdp) );
2305 SCIP_CALL( SCIPaddIntParam(scip,
"constraints/SDP/threads",
"number of threads used for OpenBLAS",
2306 &(conshdlrdata->nthreads), TRUE, DEFAULT_NTHREADS, 1, INT_MAX, NULL, NULL) );
2338 SCIP_CONSDATA* consdata;
2342 assert( scip != NULL );
2343 assert( cons != NULL );
2344 assert( nvars != NULL );
2345 assert( nnonz != NULL );
2346 assert( blocksize != NULL );
2347 assert( arraylength != NULL );
2348 assert( nvarnonz != NULL );
2349 assert( col != NULL );
2350 assert( row != NULL );
2351 assert( val != NULL );
2352 assert( vars != NULL );
2353 assert( constnnonz != NULL );
2355 consdata = SCIPconsGetData(cons);
2356 name = SCIPconsGetName(cons);
2358 assert( consdata->constnnonz == 0 || ( constcol != NULL && constrow != NULL && constval != NULL ) );
2360 *nvars = consdata->nvars;
2361 *nnonz = consdata->nnonz;
2362 *blocksize = consdata->blocksize;
2364 for (i = 0; i < consdata->nvars; i++)
2365 vars[i] = consdata->vars[i];
2368 if ( *arraylength < consdata->nvars )
2370 SCIPdebugMessage(
"nvarnonz, col, row and val arrays were not long enough to store the information for cons %s, they need to be at least"
2371 "size %d, given was only length %d! \n", name, consdata->nvars, *arraylength);
2372 *arraylength = consdata->nvars;
2376 for (i = 0; i < consdata->nvars; i++)
2378 nvarnonz[i] = consdata->nvarnonz[i];
2380 col[i] = consdata->col[i];
2381 row[i] = consdata->row[i];
2382 val[i] = consdata->val[i];
2387 if ( consdata->constnnonz > 0 )
2389 if ( consdata->constnnonz > *constnnonz )
2391 SCIPdebugMessage(
"The constant nonzeros arrays were not long enough to store the information for cons %s, they need to be at least"
2392 "size %d, given was only length %d! \n", name, consdata->constnnonz, *constnnonz);
2396 for (i = 0; i < consdata->constnnonz; i++)
2398 constcol[i] = consdata->constcol[i];
2399 constrow[i] = consdata->constrow[i];
2400 constval[i] = consdata->constval[i];
2405 *constnnonz = consdata->constnnonz;
2421 SCIP_CONSDATA* consdata;
2423 assert( scip != NULL );
2424 assert( cons != NULL );
2426 consdata = SCIPconsGetData(cons);
2427 assert( consdata != NULL );
2429 if ( nnonz != NULL )
2430 *nnonz = consdata->nnonz;
2432 if ( constnnonz != NULL )
2433 *constnnonz = consdata->constnnonz;
2446 SCIP_CONSDATA* consdata;
2450 assert( scip != NULL );
2451 assert( cons != NULL );
2453 assert( Aj != NULL );
2455 consdata = SCIPconsGetData(cons);
2456 assert( consdata != NULL );
2457 blocksize = consdata->blocksize;
2459 assert( j < consdata->nvars );
2461 for (i = 0; i < blocksize * blocksize; i++)
2464 for (i = 0; i < consdata->nvarnonz[j]; i++)
2466 Aj[consdata->col[j][i] * blocksize + consdata->row[j][i]] = consdata->val[j][i];
2467 Aj[consdata->row[j][i] * blocksize + consdata->col[j][i]] = consdata->val[j][i];
2480 SCIP_CONSDATA* consdata;
2485 assert( scip != NULL );
2486 assert( cons != NULL );
2487 assert( mat != NULL );
2489 consdata = SCIPconsGetData(cons);
2490 blocksize = consdata->blocksize;
2492 for (i = 0; i < blocksize; i++)
2494 for (j = 0; j < blocksize; j++)
2495 mat[i * blocksize + j] = 0.0;
2498 for (i = 0; i < consdata->constnnonz; i++)
2500 mat[consdata->constcol[i] * blocksize + consdata->constrow[i]] = consdata->constval[i];
2501 mat[consdata->constrow[i] * blocksize + consdata->constcol[i]] = consdata->constval[i];
2514 SCIP_CONSDATA* consdata;
2518 assert( scip != NULL );
2519 assert( cons != NULL );
2520 assert( mat != NULL );
2522 consdata = SCIPconsGetData(cons);
2523 assert( consdata != NULL );
2525 blocksize = consdata->blocksize;
2528 for (i = 0; i < (blocksize * (blocksize + 1)) / 2; i++)
2531 for (i = 0; i < consdata->constnnonz; i++)
2532 mat[
compLowerTriangPos(consdata->constrow[i], consdata->constcol[i])] = consdata->constval[i];
2550 SCIP_Real* lambdastar
2553 SCIP_CONSDATA* consdata;
2555 SCIP_Real maxinfnorm;
2557 SCIP_Real mininfnorm;
2560 SCIP_Real primalguess;
2561 SCIP_Real dualguess;
2567 assert( scip != NULL );
2568 assert( cons != NULL );
2569 assert( lambdastar != NULL );
2570 assert( strcmp(SCIPconshdlrGetName(SCIPconsGetHdlr(cons)),
CONSHDLR_NAME) == 0 );
2572 consdata = SCIPconsGetData(cons);
2573 assert( consdata != NULL );
2575 blocksize = consdata->blocksize;
2577 sparsity = consdata->nnonz / (0.5 * blocksize * (blocksize + 1));
2581 mininfnorm = SCIPinfinity(scip);
2582 for (v = 0; v < consdata->nvars; v++)
2584 for (i = 0; i < consdata->nvarnonz[v]; i++)
2586 if ( SCIPisGT(scip, REALABS(consdata->val[v][i]), maxinfnorm ) )
2587 maxinfnorm = REALABS(consdata->val[v][i]);
2588 if ( SCIPisLT(scip, REALABS(consdata->val[v][i]), mininfnorm) )
2589 mininfnorm = REALABS(consdata->val[v][i]);
2593 for (i = 0; i < consdata->constnnonz; i++)
2595 if ( SCIPisGT(scip, REALABS(consdata->constval[i]), maxconst ) )
2596 maxconst = REALABS(consdata->constval[i]);
2599 assert( SCIPisGT(scip, mininfnorm, 0.0) );
2604 for (v = 0; v < consdata->nvars; v++)
2606 if ( SCIPisGT(scip, REALABS(SCIPvarGetObj(consdata->vars[v])), maxobj) )
2607 maxobj = REALABS(SCIPvarGetObj(consdata->vars[v]));
2608 compval = SCIPisInfinity(scip, REALABS(SCIPvarGetUbGlobal(consdata->vars[v]))) ? 1e+6 : REALABS(SCIPvarGetUbGlobal(consdata->vars[v]));
2609 if ( SCIPisGT(scip, compval, maxbound) )
2611 compval = SCIPisInfinity(scip, REALABS(SCIPvarGetLbGlobal(consdata->vars[v]))) ? 1e+6 : REALABS(SCIPvarGetUbGlobal(consdata->vars[v]));
2612 if ( SCIPisGT(scip, compval, maxbound) )
2617 if ( SCIPisEQ(scip, maxbound, 0.0) )
2621 primalguess = maxobj / (sparsity * mininfnorm);
2622 dualguess = sparsity * maxinfnorm * maxbound + maxconst;
2624 if ( SCIPisGT(scip, primalguess, dualguess) )
2625 *lambdastar = primalguess;
2627 *lambdastar = dualguess;
2651 SCIP_CONSHDLR* conshdlr;
2652 SCIP_CONSDATA* consdata = NULL;
2656 assert( scip != NULL );
2657 assert( cons != NULL );
2658 assert( name != NULL );
2659 assert( nvars >= 0 );
2660 assert( nnonz >= 0 );
2661 assert( blocksize >= 0 );
2662 assert( constnnonz >= 0 );
2663 assert( nvars == 0 || vars != NULL );
2664 assert( nnonz == 0 || (nvarnonz != NULL && col != NULL && row != NULL && val != NULL ));
2665 assert( constnnonz == 0 || (constcol != NULL && constrow != NULL && constval != NULL ));
2667 conshdlr = SCIPfindConshdlr(scip,
"SDP");
2668 if ( conshdlr == NULL )
2670 SCIPerrorMessage(
"SDP constraint handler not found\n");
2671 return SCIP_PLUGINNOTFOUND;
2675 SCIP_CALL( SCIPallocBlockMemory(scip, &consdata) );
2676 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->nvarnonz, nvars) );
2677 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->col, nvars) );
2678 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->row, nvars) );
2679 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->val, nvars) );
2680 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->constcol, constnnonz) );
2681 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->constrow, constnnonz) );
2682 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->constval, constnnonz) );
2683 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->vars, nvars));
2685 for (i = 0; i < nvars; i++)
2687 assert( nvarnonz[i] >= 0 );
2689 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->col[i], nvarnonz[i]));
2690 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->row[i], nvarnonz[i]));
2691 SCIP_CALL( SCIPallocBlockMemoryArray(scip, &consdata->val[i], nvarnonz[i]));
2694 consdata->nvars = nvars;
2695 consdata->nnonz = nnonz;
2696 consdata->constnnonz = constnnonz;
2697 consdata->blocksize = blocksize;
2699 for (i = 0; i < nvars; i++)
2701 consdata->nvarnonz[i] = nvarnonz[i];
2703 for (j = 0; j < nvarnonz[i]; j++)
2705 assert( col[i][j] >= 0 );
2706 assert( col[i][j] < blocksize );
2707 assert( row[i][j] >= 0 );
2708 assert( row[i][j] < blocksize );
2710 consdata->col[i][j] = col[i][j];
2711 consdata->row[i][j] = row[i][j];
2712 consdata->val[i][j] = val[i][j];
2716 for (i = 0; i < constnnonz; i++)
2718 consdata->constcol[i] = constcol[i];
2719 consdata->constrow[i] = constrow[i];
2720 consdata->constval[i] = constval[i];
2723 for (i = 0; i < nvars; i++)
2725 consdata->vars[i] = vars[i];
2726 SCIP_CALL( SCIPcaptureVar(scip, consdata->vars[i]) );
2730 SCIP_CALL( SCIPcreateCons(scip, cons, name, conshdlr, consdata, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) );
static SCIP_DECL_CONSTRANS(consTransSdp)
EXTERN SCIP_RETCODE SCIPlapackMatrixVectorMult(int nrows, int ncols, SCIP_Real *matrix, SCIP_Real *vector, SCIP_Real *result)
static SCIP_RETCODE separateSol(SCIP *scip, SCIP_CONSHDLR *conshdlr, SCIP_CONS *cons, SCIP_SOL *sol, SCIP_RESULT *result)
SCIP_RETCODE SCIPconsSdpGetFullAj(SCIP *scip, SCIP_CONS *cons, int j, SCIP_Real *Aj)
void SCIPsdpVarfixerSortRowCol(int *row, int *col, SCIP_Real *val, int length)
#define CONSHDLR_PRESOLTIMING
SCIP_RETCODE SCIPincludeConshdlrSdp(SCIP *scip)
static SCIP_RETCODE multiplyConstraintMatrix(SCIP_CONS *cons, int j, SCIP_Real *v, SCIP_Real *vAv)
#define CONSHDLR_NEEDSCONS
static SCIP_RETCODE diagGEzero(SCIP *scip, SCIP_CONS **conss, int nconss, int *naddconss)
static SCIP_DECL_CONSDELETE(consDeleteSdp)
#define CONSHDLR_SEPAFREQ
#define CONSHDLR_DELAYSEPA
static SCIP_RETCODE computeSdpMatrix(SCIP *scip, SCIP_CONS *cons, SCIP_SOL *y, SCIP_Real *matrix)
#define CONSHDLR_EAGERFREQ
static SCIP_RETCODE move_1x1_blocks_to_lp(SCIP *scip, SCIP_CONS **conss, int nconss, int *naddconss, int *ndelconss, SCIP_RESULT *result)
SCIP_RETCODE SCIPconsSdpGetLowerTriangConstMatrix(SCIP *scip, SCIP_CONS *cons, SCIP_Real *mat)
static SCIP_DECL_CONSSEPALP(consSepalpSdp)
static SCIP_RETCODE setMaxRhsEntry(SCIP_CONS *cons)
static SCIP_RETCODE multiaggrVar(SCIP *scip, SCIP_CONS *cons, int *v, SCIP_VAR **aggrvars, SCIP_Real *scalars, int naggrvars, SCIP_Real constant, int *savedcol, int *savedrow, SCIP_Real *savedval, int *nfixednonz, int *vararraylength)
static SCIP_DECL_CONSCHECK(consCheckSdp)
Constraint handler for SDP-constraints.
static SCIP_RETCODE expandSymMatrix(int size, SCIP_Real *symMat, SCIP_Real *fullMat)
class that maps SCIP variables to SDP indices (the SCIP variables are given SDP indices in the order ...
SCIP_RETCODE SCIPconsSdpGetFullConstMatrix(SCIP *scip, SCIP_CONS *cons, SCIP_Real *mat)
SCIP_RETCODE SCIPcreateConsSdp(SCIP *scip, SCIP_CONS **cons, const char *name, int nvars, int nnonz, int blocksize, int *nvarnonz, int **col, int **row, SCIP_Real **val, SCIP_VAR **vars, int constnnonz, int *constcol, int *constrow, SCIP_Real *constval)
SCIP_RETCODE SCIPconsSdpGetData(SCIP *scip, SCIP_CONS *cons, int *nvars, int *nnonz, int *blocksize, int *arraylength, int *nvarnonz, int **col, int **row, SCIP_Real **val, SCIP_VAR **vars, int *constnnonz, int *constcol, int *constrow, SCIP_Real *constval)
#define CONSHDLR_CHECKPRIORITY
SCIP_RETCODE SCIPsdpVarfixerMergeArrays(BMS_BLKMEM *blkmem, SCIP_Real feastol, int *originrow, int *origincol, SCIP_Real *originval, int originlength, SCIP_Bool originsorted, SCIP_Real scalar, int *targetrow, int *targetcol, SCIP_Real *targetval, int *targetlength, int targetmemory)
static SCIP_DECL_CONSENFOPS(consEnfopsSdp)
static int compLowerTriangPos(int i, int j)
adds the main functionality to fix/unfix/(multi-)aggregate variables by merging two three-tuple-array...
#define CONSHDLR_ENFOPRIORITY
static SCIP_DECL_CONSFREE(consFreeSdp)
static SCIP_DECL_CONSPRESOL(consPresolSdp)
static SCIP_DECL_CONSEXITPRE(consExitpreSdp)
static SCIP_DECL_CONSPRINT(consPrintSdp)
static SCIP_DECL_CONSHDLRCOPY(conshdlrCopySdp)
#define CONSHDLR_MAXPREROUNDS
static SCIP_DECL_CONSINITPRE(consInitpreSdp)
static SCIP_DECL_CONSPARSE(consParseSdp)
SCIP_RETCODE SCIPconsSdpCheckSdpCons(SCIP *scip, SCIP_CONS *cons, SCIP_SOL *sol, SCIP_Bool checkintegrality, SCIP_Bool checklprows, SCIP_Bool printreason, SCIP_RESULT *result)
static SCIP_DECL_CONSSEPASOL(consSepasolSdp)
static SCIP_DECL_CONSGETVARS(consGetVarsSdp)
#define CONSHDLR_SEPAPRIORITY
SCIP_RETCODE SCIPconsSdpGetNNonz(SCIP *scip, SCIP_CONS *cons, int *nnonz, int *constnnonz)
static SCIP_RETCODE fixAndAggrVars(SCIP *scip, SCIP_CONS **conss, int nconss, SCIP_Bool aggregate)
static SCIP_DECL_CONSLOCK(consLockSdp)
static SCIP_DECL_CONSGETNVARS(consGetNVarsSdp)
static SCIP_DECL_CONSCOPY(consCopySdp)
interface methods for eigenvector computation and matrix multiplication using different versions of L...
SCIP_RETCODE SCIPconsSdpGuessInitialPoint(SCIP *scip, SCIP_CONS *cons, SCIP_Real *lambdastar)
static SCIP_RETCODE cutUsingEigenvector(SCIP *scip, SCIP_CONS *cons, SCIP_SOL *sol, SCIP_Real *coeff, SCIP_Real *lhs)
static SCIP_DECL_CONSENFOLP(consEnfolpSdp)
EXTERN SCIP_RETCODE SCIPlapackComputeIthEigenvalue(BMS_BLKMEM *blkmem, SCIP_Bool geteigenvectors, int n, SCIP_Real *A, int i, SCIP_Real *eigenvalue, SCIP_Real *eigenvector)