cons_linear.c
Go to the documentation of this file.
17 * @brief Constraint handler for linear constraints in their most general form, \f$lhs <= a^T x <= rhs\f$.
47 /*---+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----0----+----1----+----2*/
92 #define CONSHDLR_ENFOPRIORITY -1000000 /**< priority of the constraint handler for constraint enforcing */
93 #define CONSHDLR_CHECKPRIORITY -1000000 /**< priority of the constraint handler for checking feasibility */
94 #define CONSHDLR_SEPAFREQ 0 /**< frequency for separating cuts; zero means to separate only in the root node */
95 #define CONSHDLR_PROPFREQ 1 /**< frequency for propagating domains; zero means only preprocessing propagation */
96 #define CONSHDLR_EAGERFREQ 100 /**< frequency for using all instead of only the useful constraints in separation,
98 #define CONSHDLR_MAXPREROUNDS -1 /**< maximal number of presolving rounds the constraint handler participates in (-1: no limit) */
99 #define CONSHDLR_DELAYSEPA FALSE /**< should separation method be delayed, if other separators found cuts? */
100 #define CONSHDLR_DELAYPROP FALSE /**< should propagation method be delayed, if other propagators found reductions? */
101 #define CONSHDLR_NEEDSCONS TRUE /**< should the constraint handler be skipped, if no constraints are available? */
103 #define CONSHDLR_PRESOLTIMING (SCIP_PRESOLTIMING_FAST | SCIP_PRESOLTIMING_EXHAUSTIVE) /**< presolving timing of the constraint handler (fast, medium, or exhaustive) */
113 #define DEFAULT_TIGHTENBOUNDSFREQ 1 /**< multiplier on propagation frequency, how often the bounds are tightened */
114 #define DEFAULT_MAXROUNDS 5 /**< maximal number of separation rounds per node (-1: unlimited) */
115 #define DEFAULT_MAXROUNDSROOT -1 /**< maximal number of separation rounds in the root node (-1: unlimited) */
117 #define DEFAULT_MAXSEPACUTSROOT 200 /**< maximal number of cuts separated per separation round in root node */
118 #define DEFAULT_PRESOLPAIRWISE TRUE /**< should pairwise constraint comparison be performed in presolving? */
119 #define DEFAULT_PRESOLUSEHASHING TRUE /**< should hash table be used for detecting redundant constraints in advance */
120 #define DEFAULT_NMINCOMPARISONS 200000 /**< number for minimal pairwise presolving comparisons */
121 #define DEFAULT_MINGAINPERNMINCOMP 1e-06 /**< minimal gain per minimal pairwise presolving comparisons to repeat pairwise
123 #define DEFAULT_SORTVARS TRUE /**< should variables be sorted after presolve w.r.t their coefficient absolute for faster
125 #define DEFAULT_CHECKRELMAXABS FALSE /**< should the violation for a constraint with side 0.0 be checked relative
127 #define DEFAULT_MAXAGGRNORMSCALE 0.0 /**< maximal allowed relative gain in maximum norm for constraint aggregation
129 #define DEFAULT_MAXEASYACTIVITYDELTA 1e6 /**< maximum activity delta to run easy propagation on linear constraint
131 #define DEFAULT_MAXCARDBOUNDDIST 0.0 /**< maximal relative distance from current node's dual bound to primal bound compared
133 #define DEFAULT_SEPARATEALL FALSE /**< should all constraints be subject to cardinality cut generation instead of only
135 #define DEFAULT_AGGREGATEVARIABLES TRUE /**< should presolving search for redundant variables in equations */
136 #define DEFAULT_SIMPLIFYINEQUALITIES TRUE /**< should presolving try to simplify inequalities */
138 #define DEFAULT_SINGLETONSTUFFING TRUE /**< should stuffing of singleton continuous variables be performed? */
139 #define DEFAULT_SINGLEVARSTUFFING FALSE /**< should single variable stuffing be performed, which tries to fulfill
141 #define DEFAULT_DETECTCUTOFFBOUND TRUE /**< should presolving try to detect constraints parallel to the objective
144 #define DEFAULT_DETECTLOWERBOUND TRUE /**< should presolving try to detect constraints parallel to the objective
147 #define DEFAULT_DETECTPARTIALOBJECTIVE TRUE/**< should presolving try to detect subsets of constraints parallel to the
150 #define DEFAULT_RANGEDROWARTCONS TRUE /**< should presolving and propagation extract sub-constraints from ranged rows and equations? */
154 #define DEFAULT_MULTAGGRREMOVE FALSE /**< should multi-aggregations only be performed if the constraint can be
159 #define MAXSCALEDCOEFINTEGER 0 /**< maximal coefficient value after scaling if all variables are of integral
163 #define MAXVALRECOMP 1e+06 /**< maximal abolsute value we trust without recomputing the activity */
164 #define MINVALRECOMP 1e-05 /**< minimal abolsute value we trust without recomputing the activity */
167 #define QUADCONSUPGD_PRIORITY 1000000 /**< priority of the constraint handler for upgrading of quadratic constraints */
168 #define NONLINCONSUPGD_PRIORITY 1000000 /**< priority of the constraint handler for upgrading of nonlinear constraints */
170 /* @todo add multi-aggregation of variables that are in exactly two equations (, if not numerically an issue),
182 SCIP_Real minactivity; /**< minimal value w.r.t. the variable's local bounds for the constraint's
184 SCIP_Real maxactivity; /**< maximal value w.r.t. the variable's local bounds for the constraint's
190 SCIP_Real glbminactivity; /**< minimal value w.r.t. the variable's global bounds for the constraint's
192 SCIP_Real glbmaxactivity; /**< maximal value w.r.t. the variable's global bounds for the constraint's
194 SCIP_Real lastglbminactivity; /**< last global minimal activity which was computed by complete summation
196 SCIP_Real lastglbmaxactivity; /**< last global maximal activity which was computed by complete summation
198 SCIP_Real maxactdelta; /**< maximal activity contribution of a single variable, or SCIP_INVALID if invalid */
199 SCIP_VAR* maxactdeltavar; /**< variable with maximal activity contribution, or NULL if invalid */
206 int minactivityneginf; /**< number of coefficients contributing with neg. infinite value to minactivity */
207 int minactivityposinf; /**< number of coefficients contributing with pos. infinite value to minactivity */
208 int maxactivityneginf; /**< number of coefficients contributing with neg. infinite value to maxactivity */
209 int maxactivityposinf; /**< number of coefficients contributing with pos. infinite value to maxactivity */
210 int minactivityneghuge; /**< number of coefficients contributing with huge neg. value to minactivity */
211 int minactivityposhuge; /**< number of coefficients contributing with huge pos. value to minactivity */
212 int maxactivityneghuge; /**< number of coefficients contributing with huge neg. value to maxactivity */
213 int maxactivityposhuge; /**< number of coefficients contributing with huge pos. value to maxactivity */
214 int glbminactivityneginf;/**< number of coefficients contrib. with neg. infinite value to glbminactivity */
215 int glbminactivityposinf;/**< number of coefficients contrib. with pos. infinite value to glbminactivity */
216 int glbmaxactivityneginf;/**< number of coefficients contrib. with neg. infinite value to glbmaxactivity */
217 int glbmaxactivityposinf;/**< number of coefficients contrib. with pos. infinite value to glbmaxactivity */
218 int glbminactivityneghuge;/**< number of coefficients contrib. with huge neg. value to glbminactivity */
219 int glbminactivityposhuge;/**< number of coefficients contrib. with huge pos. value to glbminactivity */
220 int glbmaxactivityneghuge;/**< number of coefficients contrib. with huge neg. value to glbmaxactivity */
221 int glbmaxactivityposhuge;/**< number of coefficients contrib. with huge pos. value to glbmaxactivity */
228 unsigned int rangedrowpropagated:2; /**< did we perform ranged row propagation on this constraint?
240 unsigned int changed:1; /**< was constraint changed since last aggregation round in preprocessing? */
243 unsigned int upgraded:1; /**< is the constraint upgraded and will it be removed after preprocessing? */
248 unsigned int binvarssorted:1; /**< are binary variables sorted w.r.t. the absolute of their coefficient? */
250 unsigned int hascontvar:1; /**< does the constraint contain at least one continuous variable? */
251 unsigned int hasnonbinvar:1; /**< does the constraint contain at least one non-binary variable? */
252 unsigned int hasnonbinvalid:1; /**< is the information stored in hasnonbinvar and hascontvar valid? */
253 unsigned int checkabsolute:1; /**< should the constraint be checked w.r.t. an absolute feasibilty tolerance? */
268 SCIP_LINCONSUPGRADE** linconsupgrades; /**< linear constraint upgrade methods for specializing linear constraints */
269 SCIP_Real maxaggrnormscale; /**< maximal allowed relative gain in maximum norm for constraint aggregation
271 SCIP_Real maxcardbounddist; /**< maximal relative distance from current node's dual bound to primal bound compared
273 SCIP_Real mingainpernmincomp; /**< minimal gain per minimal pairwise presolving comparisons to repeat pairwise comparison round */
274 SCIP_Real maxeasyactivitydelta;/**< maximum activity delta to run easy propagation on linear constraint
278 int tightenboundsfreq; /**< multiplier on propagation frequency, how often the bounds are tightened */
285 SCIP_Bool presolpairwise; /**< should pairwise constraint comparison be performed in presolving? */
286 SCIP_Bool presolusehashing; /**< should hash table be used for detecting redundant constraints in advance */
287 SCIP_Bool separateall; /**< should all constraints be subject to cardinality cut generation instead of only
289 SCIP_Bool aggregatevariables; /**< should presolving search for redundant variables in equations */
290 SCIP_Bool simplifyinequalities;/**< should presolving try to cancel down or delete coefficients in inequalities */
292 SCIP_Bool singletonstuffing; /**< should stuffing of singleton continuous variables be performed? */
293 SCIP_Bool singlevarstuffing; /**< should single variable stuffing be performed, which tries to fulfill
296 SCIP_Bool checkrelmaxabs; /**< should the violation for a constraint with side 0.0 be checked relative
298 SCIP_Bool detectcutoffbound; /**< should presolving try to detect constraints parallel to the objective
301 SCIP_Bool detectlowerbound; /**< should presolving try to detect constraints parallel to the objective
304 SCIP_Bool detectpartialobjective;/**< should presolving try to detect subsets of constraints parallel to
306 SCIP_Bool rangedrowpropagation;/**< should presolving and propagation try to improve bounds, detect
309 SCIP_Bool rangedrowartcons; /**< should presolving and propagation extract sub-constraints from ranged rows and equations?*/
312 SCIP_Bool multaggrremove; /**< should multi-aggregations only be performed if the constraint can be
335 PROPRULE_1_RANGEDROW = 3, /**< fixed variables and gcd of all left variables tighten bounds of a
338 };
350 } asbits;
352 } val;
415 /** constructs an inference information out of a propagation rule and a position number, returns info as int */
447 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &conshdlrdata->linconsupgrades, conshdlrdata->linconsupgradessize, newsize) );
449 }
476 SCIP_CALL( SCIPreallocBlockMemoryArray(scip, &consdata->eventdata, consdata->varssize, newsize) );
509 }
544 (*conshdlrdata)->eventhdlr = eventhdlr;
566 SCIPfreeBlockMemoryArrayNull(scip, &(*conshdlrdata)->linconsupgrades, (*conshdlrdata)->linconsupgradessize);
590 {
592 SCIPwarningMessage(scip, "Try to add already known upgrade message %p for constraint handler %s.\n", linconsupgd, conshdlrname);
615 SCIP_CALL( conshdlrdataEnsureLinconsupgradesSize(scip, conshdlrdata, conshdlrdata->nlinconsupgrades+1) );
620 conshdlrdata->linconsupgrades[i] = conshdlrdata->linconsupgrades[i-1];
633 /** installs rounding locks for the given variable associated to the given coefficient in the linear constraint */
666 /** removes rounding locks for the given variable associated to the given coefficient in the linear constraint */
908 if( SCIPisConsCompressionEnabled(scip) && SCIPisEQ(scip, SCIPvarGetLbGlobal(var), SCIPvarGetUbGlobal(var)) )
950 /* due to compressed copying, we may have fixed variables contributing to the left and right hand side */
1021 SCIP_CALL( SCIPgetTransformedVars(scip, (*consdata)->nvars, (*consdata)->vars, (*consdata)->vars) );
1093 SCIP_CALL( SCIPwriteVarsLinearsum(scip, file, consdata->vars, consdata->vals, consdata->nvars, TRUE) );
1126 SCIPmessageFPrintInfo(SCIPgetMessagehdlr(scip), file, " [%s] <%s>: ", SCIPconshdlrGetName(SCIPconsGetHdlr(cons)), SCIPconsGetName(cons));
1246 {
1248 bound = (SCIPvarGetBestBoundType(consdata->vars[i]) == SCIP_BOUNDTYPE_LOWER) ? SCIPvarGetLbLocal(consdata->vars[i]) : SCIPvarGetUbLocal(consdata->vars[i]);
1294 bound = (consdata->vals[i] > 0.0 ) ? SCIPvarGetLbLocal(consdata->vars[i]) : SCIPvarGetUbLocal(consdata->vars[i]);
1296 && !SCIPisHugeValue(scip, consdata->vals[i] * bound) && !SCIPisHugeValue(scip, -consdata->vals[i] * bound) )
1321 bound = (consdata->vals[i] > 0.0 ) ? SCIPvarGetUbLocal(consdata->vars[i]) : SCIPvarGetLbLocal(consdata->vars[i]);
1323 && !SCIPisHugeValue(scip, consdata->vals[i] * bound) && !SCIPisHugeValue(scip, -consdata->vals[i] * bound) )
1348 bound = (consdata->vals[i] > 0.0 ) ? SCIPvarGetLbGlobal(consdata->vars[i]) : SCIPvarGetUbGlobal(consdata->vars[i]);
1350 && !SCIPisHugeValue(scip, consdata->vals[i] * bound) && !SCIPisHugeValue(scip, -consdata->vals[i] * bound) )
1375 bound = (consdata->vals[i] > 0.0 ) ? SCIPvarGetUbGlobal(consdata->vars[i]) : SCIPvarGetLbGlobal(consdata->vars[i]);
1377 && !SCIPisHugeValue(scip, consdata->vals[i] * bound) && !SCIPisHugeValue(scip, -consdata->vals[i] * bound) )
1441 /** checks the type of all variables of the constraint and sets hasnonbinvar and hascontvar flags accordingly */
1536 {
1590 SCIP_Bool checkreliability /**< should the reliability of the recalculated activity be checked? */
1642 * lower bound + neg. coef: update maxactivity, positive and negative infinity counters have to be switched
1644 * upper bound + neg. coef: update minactivity, positive and negative infinity counters have to be switched
1698 * lower bound + neg. coef: update maxactivity, positive and negative infinity counters have to be switched
1700 * upper bound + neg. coef: update minactivity, positive and negative infinity counters have to be switched
1768 /* if the bound changed to -infinity, increase the counter for negative infinite contributions */
1796 /* if the bound changed to +infinity, increase the counter for positive infinite contributions */
1821 * but checking here that the bound is not huge again would not handle a change from a huge to an infinite bound
1827 /* if the bound changed to +infinity, increase the counter for positive infinite contributions */
1830 /* if the bound changed to -infinity, increase the counter for negative infinite contributions */
1836 /* if the contribution of this variable is too large and positive, increase the corresponding counter */
1839 /* if the contribution of this variable is too large and negative, increase the corresponding counter */
1854 * but checking here that the bound is not huge again would not handle a change from a huge to an infinite bound
1860 /* if the bound changed to +infinity, increase the counter for positive infinite contributions */
1863 /* if the bound changed to -infinity, increase the counter for negative infinite contributions */
1869 /* if the contribution of this variable is too large and positive, increase the corresponding counter */
1872 /* if the contribution of this variable is too large and negative, increase the corresponding counter */
1924 /* update the activity, if the current value is valid and there was a change in the finite part */
1973 SCIP_Bool checkreliability /**< should the reliability of the recalculated activity be checked? */
1982 consdataUpdateActivities(scip, consdata, var, oldlb, newlb, val, SCIP_BOUNDTYPE_LOWER, FALSE, checkreliability);
1984 assert(!SCIPisInfinity(scip, -consdata->minactivity) && !SCIPisInfinity(scip, consdata->minactivity));
1985 assert(!SCIPisInfinity(scip, -consdata->maxactivity) && !SCIPisInfinity(scip, consdata->maxactivity));
1998 SCIP_Bool checkreliability /**< should the reliability of the recalculated activity be checked? */
2007 consdataUpdateActivities(scip, consdata, var, oldub, newub, val, SCIP_BOUNDTYPE_UPPER, FALSE, checkreliability);
2009 assert(!SCIPisInfinity(scip, -consdata->minactivity) && !SCIPisInfinity(scip, consdata->minactivity));
2010 assert(!SCIPisInfinity(scip, -consdata->maxactivity) && !SCIPisInfinity(scip, consdata->maxactivity));
2022 SCIP_Bool checkreliability /**< should the reliability of the recalculated activity be checked? */
2030 consdataUpdateActivities(scip, consdata, NULL, oldlb, newlb, val, SCIP_BOUNDTYPE_LOWER, TRUE, checkreliability);
2032 assert(!SCIPisInfinity(scip, -consdata->glbminactivity) && !SCIPisInfinity(scip, consdata->glbminactivity));
2033 assert(!SCIPisInfinity(scip, -consdata->glbmaxactivity) && !SCIPisInfinity(scip, consdata->glbmaxactivity));
2045 SCIP_Bool checkreliability /**< should the reliability of the recalculated activity be checked? */
2053 consdataUpdateActivities(scip, consdata, NULL, oldub, newub, val, SCIP_BOUNDTYPE_UPPER, TRUE, checkreliability);
2055 assert(!SCIPisInfinity(scip, -consdata->glbminactivity) && !SCIPisInfinity(scip, consdata->glbminactivity));
2056 assert(!SCIPisInfinity(scip, -consdata->glbmaxactivity) && !SCIPisInfinity(scip, consdata->glbmaxactivity));
2060 /** updates minimum and maximum activity and maximum absolute value for coefficient addition */
2067 SCIP_Bool checkreliability /**< should the reliability of the recalculated activity be checked? */
2103 consdataUpdateActivitiesLb(scip, consdata, var, 0.0, SCIPvarGetLbLocal(var), val, checkreliability);
2104 consdataUpdateActivitiesUb(scip, consdata, var, 0.0, SCIPvarGetUbLocal(var), val, checkreliability);
2105 consdataUpdateActivitiesGlbLb(scip, consdata, 0.0, SCIPvarGetLbGlobal(var), val, checkreliability);
2106 consdataUpdateActivitiesGlbUb(scip, consdata, 0.0, SCIPvarGetUbGlobal(var), val, checkreliability);
2110 /** updates minimum and maximum activity for coefficient deletion, invalidates maximum absolute value if necessary */
2117 SCIP_Bool checkreliability /**< should the reliability of the recalculated activity be checked? */
2160 consdataUpdateActivitiesLb(scip, consdata, var, SCIPvarGetLbLocal(var), 0.0, val, checkreliability);
2161 consdataUpdateActivitiesUb(scip, consdata, var, SCIPvarGetUbLocal(var), 0.0, val, checkreliability);
2162 consdataUpdateActivitiesGlbLb(scip, consdata, SCIPvarGetLbGlobal(var), 0.0, val, checkreliability);
2163 consdataUpdateActivitiesGlbUb(scip, consdata, SCIPvarGetUbGlobal(var), 0.0, val, checkreliability);
2167 /** updates minimum and maximum activity for coefficient change, invalidates maximum absolute value if necessary */
2175 SCIP_Bool checkreliability /**< should the reliability of the recalculated activity be checked? */
2255 /* reset maximal activity delta, so that it will be recalculated on the next real propagation */
2261 /* @todo do something more clever here, e.g. if oldval * newval >= 0, do the update directly */
2360 /** gets minimal activity for constraint and given values of counters for infinite and huge contributions
2361 * and (if needed) delta to subtract from stored finite part of activity in case of a residual activity
2374 SCIP_Bool goodrelax, /**< should a good relaxation be computed or are relaxed acticities ignored, anyway? */
2378 SCIP_Bool* issettoinfinity /**< pointer to store whether minactivity was set to infinity or calculated */
2405 /* if we have neg. huge contributions, we only know that -infty is a relaxation of the minactivity */
2412 /* we do not need a good relaxation and we have positve huge contributions, so we just return -infty as activity */
2443 * times the minimum value counting as "huge" plus finite (and non-huge) part of minactivity - delta
2461 /** gets maximal activity for constraint and given values of counters for infinite and huge contributions
2462 * and (if needed) delta to subtract from stored finite part of activity in case of a residual activity
2475 SCIP_Bool goodrelax, /**< should a good relaxation be computed or are relaxed acticities ignored, anyway? */
2479 SCIP_Bool* issettoinfinity /**< pointer to store whether maxactivity was set to infinity or calculated */
2506 /* if we have pos. huge contributions, we only know that +infty is a relaxation of the maxactivity */
2513 /* we do not need a good relaxation and we have positve huge contributions, so we just return +infty as activity */
2544 * times the minimum value counting as "huge" plus the finite (and non-huge) part of maxactivity minus delta
2571 SCIP_Bool* minisrelax, /**< pointer to store whether the returned minactivity is just a relaxation,
2574 SCIP_Bool* maxisrelax /**< pointer to store whether the returned maxactivity is just a relaxation,
2700 SCIP_Bool* minisrelax, /**< pointer to store whether the returned residual minactivity is just a
2703 SCIP_Bool* maxisrelax, /**< pointer to store whether the returned residual maxactivity is just a
2706 SCIP_Bool* isminsettoinfinity, /**< pointer to store whether minresactivity was set to infinity or calculated */
2707 SCIP_Bool* ismaxsettoinfinity /**< pointer to store whether maxresactivity was set to infinity or calculated */
2708 )
2755 /* get/compute minactivity by calling getMinActivity() with updated counters for infinite and huge values
2756 * and contribution of variable set to zero that has to be subtracted from finite part of activity
2793 consdata->minactivityposhuge, consdata->minactivityneghuge, absval * minactbound, FALSE, goodrelax,
2797 /* get/compute maxactivity by calling getMaxActivity() with updated counters for infinite and huge values
2798 * and contribution of variable set to zero that has to be subtracted from finite part of activity
2835 consdata->maxactivityposhuge, consdata->maxactivityneghuge, absval * maxactbound, FALSE, goodrelax,
2847 SCIP_Real* glbminactivity, /**< pointer to store the minimal activity, or NULL, if not needed */
2848 SCIP_Real* glbmaxactivity, /**< pointer to store the maximal activity, or NULL, if not needed */
2849 SCIP_Bool* minisrelax, /**< pointer to store whether the returned minactivity is just a relaxation,
2852 SCIP_Bool* maxisrelax, /**< pointer to store whether the returned maxactivity is just a relaxation,
2855 SCIP_Bool* isminsettoinfinity, /**< pointer to store whether minresactivity was set to infinity or calculated */
2856 SCIP_Bool* ismaxsettoinfinity /**< pointer to store whether maxresactivity was set to infinity or calculated */
2911 SCIP_Real* minresactivity, /**< pointer to store the minimal residual activity, or NULL, if not needed */
2912 SCIP_Real* maxresactivity, /**< pointer to store the maximal residual activity, or NULL, if not needed */
2913 SCIP_Bool* minisrelax, /**< pointer to store whether the returned residual minactivity is just a
2916 SCIP_Bool* maxisrelax, /**< pointer to store whether the returned residual maxactivity is just a
2919 SCIP_Bool* isminsettoinfinity, /**< pointer to store whether minresactivity was set to infinity or calculated */
2920 SCIP_Bool* ismaxsettoinfinity /**< pointer to store whether maxresactivity was set to infinity or calculated */
2921 )
2962 /* get/compute minactivity by calling getMinActivity() with updated counters for infinite and huge values
2963 * and contribution of variable set to zero that has to be subtracted from finite part of activity
2969 getMinActivity(scip, consdata, consdata->glbminactivityposinf - 1, consdata->glbminactivityneginf,
2977 getMinActivity(scip, consdata, consdata->glbminactivityposinf, consdata->glbminactivityneginf - 1,
3010 /* get/compute maxactivity by calling getMaxActivity() with updated counters for infinite and huge values
3011 * and contribution of variable set to zero that has to be subtracted from finite part of activity
3017 getMaxActivity(scip, consdata, consdata->glbmaxactivityposinf, consdata->glbmaxactivityneginf - 1,
3025 getMaxActivity(scip, consdata, consdata->glbmaxactivityposinf - 1, consdata->glbmaxactivityneginf,
3092 else if( (SCIPisInfinity(scip, solval) && negsign) || (SCIPisInfinity(scip, -solval) && !negsign) )
3099 SCIPdebugMsg(scip, "activity of linear constraint: %.15g, %d positive infinity values, %d negative infinity values \n", activity, nposinf, nneginf);
3141 }
3188 /** index comparison method of linear constraints: compares two indices of the variable set in the linear constraint */
3207 )
3325 /* count binary variables and permute variables such that binaries appear first in the sorted vars array */
3374 assert((v >= consdata->nbinvars && !SCIPvarIsBinary(vars[v])) || (v < consdata->nbinvars && SCIPvarIsBinary(vars[v])));
3471 /* the left hand side switched from -infinity to a non-infinite value -> install rounding locks */
3496 /* the left hand side switched from a non-infinite value to -infinity -> remove rounding locks */
3517 /* check whether the left hand side is increased, if and only if that's the case we maybe can propagate, tighten and add more cliques */
3599 /* the right hand side switched from infinity to a non-infinite value -> install rounding locks */
3624 /* the right hand side switched from a non-infinite value to infinity -> remove rounding locks */
3645 /* check whether the right hand side is decreased, if and only if that's the case we maybe can propagate, tighten and add more cliques */
3803 && (SCIPvarCompare(consdata->vars[consdata->nvars-2], consdata->vars[consdata->nvars-1]) <= 0);
3849 var = consdata->vars[pos];
3890 consdata->sorted = consdata->sorted && (pos + 2 >= consdata->nvars || (SCIPvarCompare(consdata->vars[pos], consdata->vars[pos + 1]) <= 0));
3894 /* if at most one variable is left, the activities should be recalculated (to correspond exactly to the bounds
3906 /* if the variable defining the maximal activity delta was removed from the constraint, the maximal activity
4050 /* because SCIPisScalingIntegral uses another integrality check as SCIPfeasFloor, we add an additional 0.5 before
4058 SCIPwarningMessage(scip, "coefficient %.15g of variable <%s> in linear constraint <%s> scaled to zero (scalar: %.15g)\n",
4080 /* because SCIPisScalingIntegral uses another integrality check as SCIPfeasFloor, we add an additional 0.5 before
4092 /* because SCIPisScalingIntegral uses another integrality check as SCIPfeasCeil, we subtract 0.5 before ceiling up
4154 * Apply the following rules in the given order, until the sign of the factor is determined. Later rules only apply,
4159 * 4. the number of positive coefficients must not be smaller than the number of negative coefficients
4162 * Try to identify a rational representation of the fractional coefficients, and multiply all coefficients
4252 SCIPdebugMsg(scip, "divide linear constraint with %g, because all coefficients are in absolute value the same\n", maxabsval);
4294 epsilon = SCIPepsilon(scip) * 0.9; /* slightly decrease epsilon to be safe in rational conversion below */
4303 maxmult = MIN(maxmult, (SCIP_Longint) (MAXSCALEDCOEFINTEGER / MAX(maxabsval, 1.0))); /*lint !e835*/
4329 /* 3. the absolute value of the right hand side must be greater than that of the left hand side */
4338 /* 4. the number of positive coefficients must not be smaller than the number of negative coefficients */
4391 /* it might be that we have really big coefficients, but all are integral, in that case we want to divide them by
4411 SCIPdebugMsg(scip, "scale linear constraint with %" SCIP_LONGINT_FORMAT " to make coefficients integral\n", scm);
4460 /* since the lhs/rhs is not respected for gcd calculation it can happen that we detect infeasibility */
4463 if( SCIPisEQ(scip, consdata->lhs, consdata->rhs) && !SCIPisFeasIntegral(scip, consdata->rhs / gcd) )
4475 SCIPdebugMsg(scip, "divide linear constraint by greatest common divisor %" SCIP_LONGINT_FORMAT "\n", gcd);
4548 /* if the variable defining the maximal activity delta was removed from the constraint, the maximal activity
4759 if( SCIPisEQ(scip, lhssubtrahend, consdata->lhs) && SCIPisFeasGE(scip, REALABS(lhssubtrahend), 1.0) )
4775 if( SCIPisEQ(scip, rhssubtrahend, consdata->rhs ) && SCIPisFeasGE(scip, REALABS(rhssubtrahend), 1.0) )
4790 /* if aggregated variables have been replaced, multiple entries of the same variable are possible and we have
4809 /** for each variable in the linear constraint, except the inferred variable, adds one bound to the conflict analysis'
4810 * candidate store (bound depends on sign of coefficient and whether the left or right hand side was the reason for the
4811 * inference variable's bound change); the conflict analysis can be initialized with the linear constraint being the
4819 SCIP_BDCHGIDX* bdchgidx, /**< bound change index (time stamp of bound change), or NULL for current time */
4848 /* for each variable, add the bound to the conflict queue, that is responsible for the minimal or maximal
4849 * residual value, depending on whether the left or right hand side is responsible for the bound change:
4854 /* if the variable is integral we only need to add reason bounds until the propagation could be applied */
4867 /* calculate the minimal and maximal global activity of all other variables involved in the constraint */
4872 consdataGetGlbActivityResiduals(scip, consdata, infervar, vals[inferpos], FALSE, &minresactivity, NULL,
4875 consdataGetGlbActivityResiduals(scip, consdata, infervar, vals[inferpos], FALSE, NULL, &maxresactivity,
4889 if( (reasonisrhs && !isminsettoinfinity && !minisrelax) || (!reasonisrhs && !ismaxsettoinfinity && !maxisrelax) ) /*lint !e644*/
4896 /* calculate the residual capacity that would be left, if the variable would be set to one more / one less
4951 /* rhs is reason and coeff is positive, or lhs is reason and coeff is negative -> lower bound */
4953 rescap -= vals[i] * (SCIPgetVarLbAtIndex(scip, vars[i], bdchgidx, FALSE) - SCIPvarGetLbGlobal(vars[i]));
4957 /* lhs is reason and coeff is positive, or rhs is reason and coeff is negative -> upper bound */
4959 rescap -= vals[i] * (SCIPgetVarUbAtIndex(scip, vars[i], bdchgidx, FALSE) - SCIPvarGetUbGlobal(vars[i]));
4979 /* rhs is reason and coeff is positive, or lhs is reason and coeff is negative -> lower bound is responsible */
4984 /* lhs is reason and coeff is positive, or rhs is reason and coeff is negative -> upper bound is responsible */
4992 /** for each variable in the linear ranged row constraint, except the inferred variable, adds the bounds of all fixed
4993 * variables to the conflict analysis' candidate store; the conflict analysis can be initialized
4994 * with the linear constraint being the conflict detecting constraint by using NULL as inferred variable
5001 SCIP_BDCHGIDX* bdchgidx, /**< bound change index (time stamp of bound change), or NULL for current time */
5033 if( !SCIPisEQ(scip, SCIPgetVarLbAtIndex(scip, vars[v], bdchgidx, FALSE), SCIPvarGetLbGlobal(vars[v])) )
5039 if( !SCIPisEQ(scip, SCIPgetVarUbAtIndex(scip, vars[v], bdchgidx, FALSE), SCIPvarGetUbGlobal(vars[v])) )
5049 if( SCIPisEQ(scip, SCIPgetVarLbAtIndex(scip, vars[v], bdchgidx, FALSE), SCIPgetVarUbAtIndex(scip, vars[v], bdchgidx, FALSE)) )
5051 /* add all bounds of fixed variables which lead to the boundchange of the given inference variable */
5108 /** resolves a propagation on the given variable by supplying the variables needed for applying the corresponding
5119 SCIP_BDCHGIDX* bdchgidx, /**< bound change index (time stamp of bound change), or NULL for current time */
5120 SCIP_RESULT* result /**< pointer to store the result of the propagation conflict resolving call */
5161 /* the bound of the variable was tightened, because the minimal or maximal residual activity of the linear
5162 * constraint (only taking the other variables into account) didn't leave enough space for a larger
5171 /* the bound of the variable was tightened, because the minimal or maximal residual activity of the linear
5172 * constraint (only taking the other variables into account) didn't leave enough space for a larger
5181 /* the bound of the variable was tightened, because some variables were already fixed and the leftover only allow
5193 SCIPerrorMessage("invalid inference information %d in linear constraint <%s> at position %d for %s bound of variable <%s>\n",
5204 /** analyzes conflicting bounds on given constraint, and adds conflict constraint to problem */
5213 if( (SCIPgetStage(scip) != SCIP_STAGE_SOLVING && !SCIPinProbing(scip)) || !SCIPisConflictAnalysisApplicable(scip) )
5219 /* add the conflicting bound for each variable of infeasible constraint to conflict candidate queue */
5247 + consdata->maxactivityposinf
5268 SCIP_Bool force /**< should a possible bound change be forced even if below bound strengthening tolerance */
5292 SCIPdebugMsg(scip, "linear constraint <%s>: tighten <%s>, old bds=[%.15g,%.15g], val=%.15g, activity=[%.15g,%.15g], sides=[%.15g,%.15g] -> newub=%.15g\n",
5293 SCIPconsGetName(cons), SCIPvarGetName(var), lb, oldub, consdata->vals[pos], consdata->minactivity, consdata->maxactivity, consdata->lhs, consdata->rhs, newub);
5298 SCIP_CALL( SCIPinferVarUbCons(scip, var, newub, cons, getInferInt(proprule, pos), force, &infeasible, &tightened) );
5337 SCIP_Bool force /**< should a possible bound change be forced even if below bound strengthening tolerance */
5361 SCIPdebugMsg(scip, "linear constraint <%s>: tighten <%s>, old bds=[%.15g,%.15g], val=%.15g, activity=[%.15g,%.15g], sides=[%.15g,%.15g] -> newlb=%.15g\n",
5362 SCIPconsGetName(cons), SCIPvarGetName(var), oldlb, ub, consdata->vals[pos], consdata->minactivity, consdata->maxactivity, consdata->lhs, consdata->rhs, newlb);
5367 SCIP_CALL( SCIPinferVarLbCons(scip, var, newlb, cons, getInferInt(proprule, pos), force, &infeasible, &tightened) );
5403 SCIP_Bool force /**< should a possible bound change be forced even if below bound strengthening tolerance */
5466 /* if the minactivity is larger than the right hand side by feasibility epsilon, the constraint is infeasible */
5478 /* if the slack is zero in tolerances (or negative, but not enough to make the constraint infeasible), we set
5515 /* if the maxactivity is smaller than the left hand side by feasibility epsilon, the constraint is infeasible */
5527 /* if the slack is zero in tolerances (or negative, but not enough to make the constraint infeasible), we set
5563 /* if the minactivity is larger than the right hand side by feasibility epsilon, the constraint is infeasible */
5575 /* if the slack is zero in tolerances (or negative, but not enough to make the constraint infeasible), we set
5611 /* if the maxactivity is smaller than the left hand side by feasibility epsilon, the constraint is infeasible */
5623 /* if the slack is zero in tolerances (or negative, but not enough to make the constraint infeasible), we set
5655 /** analyzes conflicting bounds on given ranged row constraint, and adds conflict constraint to problem */
5678 if( (SCIPgetStage(scip) != SCIP_STAGE_SOLVING && !SCIPinProbing(scip)) || !SCIPisConflictAnalysisApplicable(scip) )
5684 /* add the conflicting fixed variables of this ranged row constraint to conflict candidate queue */
5698 * Check ranged rows for possible solutions, possibly detect infeasibility, fix variables due to having only one possible
5699 * solution, tighten bounds if having only two possible solutions or add constraints which propagate a subset of
5784 addartconss = conshdlrdata->rangedrowartcons && SCIPgetDepth(scip) < 1 && !SCIPinProbing(scip) && !SCIPinRepropagation(scip);
5789 /* we are not allowed to add artificial constraints during propagation; if nothing changed on this constraint since
5790 * the last rangedrowpropagation, we can stop; otherwise, we mark this constraint to be rangedrowpropagated without
5808 if( SCIPisEQ(scip, SCIPvarGetLbLocal(consdata->vars[v]), SCIPvarGetUbLocal(consdata->vars[v])) )
5837 * coefficient so that all variables in this group will have a gcd greater than 1, this group will be implicitly
5840 * the second group will contain all left unfixed variables and will be saved as infcheckvars with corresponding
5841 * coefficients as infcheckvals, the order of these variables should be the same as in the consdata object
5844 /* find first integral variables with integral coefficient greater than 1, thereby collecting all other unfixed
5854 /* partition the variables, do not change the order of collection, because it might be used later on */
5858 if( !SCIPisEQ(scip, SCIPvarGetLbLocal(consdata->vars[v]), SCIPvarGetUbLocal(consdata->vars[v])) )
5886 while( v < consdata->nvars && SCIPisEQ(scip, SCIPvarGetLbLocal(consdata->vars[v]), SCIPvarGetUbLocal(consdata->vars[v])) );
5900 assert(!SCIPisEQ(scip, SCIPvarGetLbLocal(consdata->vars[v]), SCIPvarGetUbLocal(consdata->vars[v])));
5901 assert(SCIPisIntegral(scip, consdata->vals[v]) && SCIPvarGetType(consdata->vars[v]) != SCIP_VARTYPE_CONTINUOUS && REALABS(consdata->vals[v]) > 1.5);
5908 /* go on to partition the variables, do not change the order of collection, because it might be used later on;
5912 if( SCIPisEQ(scip, SCIPvarGetLbLocal(consdata->vars[v]), SCIPvarGetUbLocal(consdata->vars[v])) )
5925 if( !SCIPisIntegral(scip, consdata->vals[v]) || SCIPvarGetType(consdata->vars[v]) == SCIP_VARTYPE_CONTINUOUS ||
5964 /* it should not happen that all variables are of integral type and have a gcd >= 2, this should be done by
6023 SCIPdebugMsg(scip, "minactinfvarsinvalid = %u, minactinfvars = %g, maxactinfvarsinvalid = %u, maxactinfvars = %g, gcd = %lld, ninfcheckvars = %d, ncontvars = %d\n",
6024 minactinfvarsinvalid, minactinfvars, maxactinfvarsinvalid, maxactinfvars, gcd, ninfcheckvars, ncontvars);
6026 /* @todo maybe we took the wrong variables as infcheckvars we could try to exchange integer variables */
6027 /* @todo if minactinfvarsinvalid or maxactinfvarsinvalid are true, try to exchange both partitions to maybe get valid
6029 /* @todo calculate minactivity and maxactivity for all non-intcheckvars, and use this for better bounding,
6031 * that therefore the conflict variables in addConflictFixedVars() need to be extended by all variables which
6035 /* check if between left hand side and right hand side exist a feasible point, if not the constraint leads to
6040 SCIPdebugMsg(scip, "no feasible value exist, constraint <%s> lead to infeasibility", SCIPconsGetName(cons));
6045 SCIP_CALL( analyzeConflictRangedRow(scip, cons, infcheckvars, ninfcheckvars, NULL, SCIP_INVALID) );