@@ -1019,6 +1019,70 @@ SCIP_RETCODE separateInequalities(
10191019}
10201020
10211021
1022+ /** replace aggregated variables by active variables */
1023+ static
1024+ SCIP_RETCODE replaceAggregatedVarsOrbisack (
1025+ SCIP * scip , /**< SCIP data structure */
1026+ SCIP_CONS * cons /**< constraint to be processed */
1027+ )
1028+ {
1029+ SCIP_CONSDATA * consdata ;
1030+ SCIP_VAR * * vars1 ;
1031+ SCIP_VAR * * vars2 ;
1032+ int i ;
1033+ int nrows ;
1034+
1035+ assert ( scip != NULL );
1036+ assert ( cons != NULL );
1037+
1038+ /* get data of constraint */
1039+ consdata = SCIPconsGetData (cons );
1040+ assert ( consdata != NULL );
1041+ assert ( consdata -> vars1 != NULL );
1042+ assert ( consdata -> vars2 != NULL );
1043+ assert ( consdata -> nrows > 0 );
1044+
1045+ nrows = consdata -> nrows ;
1046+ vars1 = consdata -> vars1 ;
1047+ vars2 = consdata -> vars2 ;
1048+
1049+ /* loop through all variables */
1050+ for (i = 0 ; i < nrows ; ++ i )
1051+ {
1052+ SCIP_VAR * var ;
1053+ SCIP_Bool negated ;
1054+
1055+ /* treat first column */
1056+ assert ( SCIPvarGetStatus (vars1 [i ]) != SCIP_VARSTATUS_MULTAGGR ); /* variables are marked as not to be multi-aggregated */
1057+
1058+ SCIP_CALL ( SCIPgetBinvarRepresentative (scip , vars1 [i ], & var , & negated ) );
1059+ SCIP_UNUSED ( negated );
1060+ assert ( SCIPvarIsActive (var ) || SCIPvarGetStatus (var ) == SCIP_VARSTATUS_NEGATED || SCIPvarGetStatus (var ) == SCIP_VARSTATUS_FIXED );
1061+ if ( var != vars1 [i ] )
1062+ {
1063+ SCIP_CALL ( SCIPreleaseVar (scip , & vars1 [i ]) );
1064+ vars1 [i ] = var ;
1065+ SCIP_CALL ( SCIPcaptureVar (scip , var ) );
1066+ }
1067+
1068+ /* treat second column */
1069+ assert ( SCIPvarGetStatus (vars2 [i ]) != SCIP_VARSTATUS_MULTAGGR ); /* variables are marked as not to be multi-aggregated */
1070+
1071+ SCIP_CALL ( SCIPgetBinvarRepresentative (scip , vars2 [i ], & var , & negated ) );
1072+ SCIP_UNUSED ( negated );
1073+ assert ( SCIPvarIsActive (var ) || SCIPvarGetStatus (var ) == SCIP_VARSTATUS_NEGATED || SCIPvarGetStatus (var ) == SCIP_VARSTATUS_FIXED );
1074+ if ( var != vars2 [i ] )
1075+ {
1076+ SCIP_CALL ( SCIPreleaseVar (scip , & vars2 [i ]) );
1077+ vars2 [i ] = var ;
1078+ SCIP_CALL ( SCIPcaptureVar (scip , var ) );
1079+ }
1080+ }
1081+
1082+ return SCIP_OKAY ;
1083+ }
1084+
1085+
10221086/*--------------------------------------------------------------------------------------------
10231087 *--------------------------------- SCIP functions -------------------------------------------
10241088 *--------------------------------------------------------------------------------------------*/
@@ -1753,6 +1817,25 @@ SCIP_DECL_CONSRESPROP(consRespropOrbisack)
17531817}
17541818
17551819
1820+ /** presolving deinitialization method of constraint handler (called after presolving has been finished) */
1821+ static
1822+ SCIP_DECL_CONSEXITPRE (consExitpreOrbisack )
1823+ {
1824+ int c ;
1825+
1826+ assert ( scip != NULL );
1827+ assert ( conshdlr != NULL );
1828+ assert ( strcmp (SCIPconshdlrGetName (conshdlr ), CONSHDLR_NAME ) == 0 );
1829+
1830+ for (c = 0 ; c < nconss ; ++ c )
1831+ {
1832+ /* replace aggregated variables by active variables */
1833+ SCIP_CALL ( replaceAggregatedVarsOrbisack (scip , conss [c ]) );
1834+ }
1835+ return SCIP_OKAY ;
1836+ }
1837+
1838+
17561839/** Lock variables
17571840 *
17581841 * We assume we have only one global (void) constraint and lock all variables.
@@ -2182,6 +2265,7 @@ SCIP_RETCODE SCIPincludeConshdlrOrbisack(
21822265 SCIP_CALL ( SCIPsetConshdlrPrint (scip , conshdlr , consPrintOrbisack ) );
21832266 SCIP_CALL ( SCIPsetConshdlrProp (scip , conshdlr , consPropOrbisack , CONSHDLR_PROPFREQ , CONSHDLR_DELAYPROP , CONSHDLR_PROP_TIMING ) );
21842267 SCIP_CALL ( SCIPsetConshdlrResprop (scip , conshdlr , consRespropOrbisack ) );
2268+ SCIP_CALL ( SCIPsetConshdlrExitpre (scip , conshdlr , consExitpreOrbisack ) );
21852269 SCIP_CALL ( SCIPsetConshdlrSepa (scip , conshdlr , consSepalpOrbisack , consSepasolOrbisack , CONSHDLR_SEPAFREQ , CONSHDLR_SEPAPRIORITY , CONSHDLR_DELAYSEPA ) );
21862270 SCIP_CALL ( SCIPsetConshdlrTrans (scip , conshdlr , consTransOrbisack ) );
21872271 SCIP_CALL ( SCIPsetConshdlrInitlp (scip , conshdlr , consInitlpOrbisack ) );
0 commit comments