- java.lang.Object
-
- org.ojalgo.optimisation.ModelEntity<Expression>
-
- org.ojalgo.optimisation.Expression
-
- All Implemented Interfaces:
java.lang.Comparable<Expression>,Optimisation,Optimisation.Constraint,Optimisation.Objective
public final class Expression extends ModelEntity<Expression>
Expression represents a mathematical expression in the optimization model that can serve as either a constraint or a component of the objective function.An Expression can be:
- Linear: Contains only linear terms (variable coefficients)
- Quadratic: Contains quadratic terms (products of variables)
- Compound: Contains both linear and quadratic terms
Basic usage:
- Set coefficients for variables with
set(Variable, Comparable)oradd(Variable, Comparable)methods - Create quadratic terms with
set(Variable, Variable, Comparable)methods - Create constraints by setting lower/upper bounds using
ModelEntity.lower(Comparable),ModelEntity.upper(Comparable), orModelEntity.level(Comparable)for equality constraints - Contribute to the objective function by setting a weight using
ModelEntity.weight(Comparable)
Advanced features include:
- Integer expression handling with automatic detection and constraint tightening
- Support for binary variables with specialized methods for detecting binary constraints
- Expression evaluation at specific variable values using
evaluate(Access1D) - Compensation for fixed variables to simplify expressions during solving
- Numerical scaling for improved solver stability
- Convenient methods for creating common expression types (sums, distances, etc.)
- Conversion to various function types for integration with different solvers
The Expression class provides a fluent interface for building expressions with method chaining. It also supports automatic handling of numerical stability issues through scaling adjustments.
Note that while the Expression class supports quadratic terms in constraints, some solvers may only support linear constraints. Quadratic, linear, or compound expressions can typically be used in the objective function depending on the solver capabilities.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface org.ojalgo.optimisation.Optimisation
Optimisation.Constraint, Optimisation.ConstraintType, Optimisation.Integration<M extends Optimisation.Model,S extends Optimisation.Solver>, Optimisation.Model, Optimisation.Objective, Optimisation.Options, Optimisation.ProblemStructure, Optimisation.Result, Optimisation.Sense, Optimisation.Solver, Optimisation.State
-
-
Field Summary
Fields Modifier and Type Field Description private java.math.BigDecimalmyConstantprivate booleanmyInfeasibleprivate java.lang.BooleanmyIntegerprivate java.util.Map<Structure1D.IntIndex,java.math.BigDecimal>myLinearprivate ExpressionsBasedModelmyModelprivate java.util.Map<Structure2D.IntRowColumn,java.math.BigDecimal>myQuadraticprivate booleanmyRedundantprivate booleanmyShallowCopyA shallow copy (typically created by presolver or integer solver) shares the Map:s holding the paramaters with other Expressions.-
Fields inherited from class org.ojalgo.optimisation.ModelEntity
PRINT, RANGE
-
-
Constructor Summary
Constructors Modifier Constructor Description (package private)Expression(java.lang.String name, ExpressionsBasedModel model)privateExpression(Expression entityToCopy)protectedExpression(Expression expressionToCopy, ExpressionsBasedModel destinationModel, boolean deep)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description Expressionadd(int index, double value)Expressionadd(int row, int column, double value)Expressionadd(int row, int column, long value)Expressionadd(int row, int column, java.lang.Comparable<?> value)Expressionadd(int index, long value)Expressionadd(int index, java.lang.Comparable<?> value)Expressionadd(Variable variable, double value)Expressionadd(Variable variable, long value)Expressionadd(Variable variable, java.lang.Comparable<?> value)Will add the value to this variable's factor.Expressionadd(Variable variable1, Variable variable2, double value)Expressionadd(Variable variable1, Variable variable2, long value)Expressionadd(Variable variable1, Variable variable2, java.lang.Comparable<?> value)(package private) voidaddAll(java.util.Set<Structure1D.IntIndex> referenced)Add all indices of referenced variables to the suppliedSet.(package private) voidaddObjectiveConstant(java.math.BigDecimal value)voidaddTo(Expression target, java.math.BigDecimal scale)protected voidappendMiddlePart(java.lang.StringBuilder builder, Access1D<java.math.BigDecimal> solution, NumberContext display)(package private) voidappendToString(java.lang.StringBuilder builder, Access1D<java.math.BigDecimal> solution, NumberContext display)(package private) java.math.BigDecimalcalculateSetValue(java.util.Collection<Structure1D.IntIndex> subset)Calculates this expression's value - the subset variables' part of this expression.intcompareTo(Expression obj)Expressioncompensate(java.util.Set<Structure1D.IntIndex> fixedVariables)Will return an Expression with factors corresponding to fixed variables removed, and lower/upper limits compensated for the fixed part of the expression.private java.math.BigDecimalconvert(java.math.BigDecimal value, boolean adjusted)(package private) Expressioncopy(ExpressionsBasedModel destinationModel, boolean deep)(package private) longcountIntegerFactors()(package private) intcountLinearFactors()(package private) intcountQuadraticFactors()(package private) intderiveAdjustmentExponent()protected voiddestroy()private ExpressiondoAdd(Structure1D.IntIndex key, java.math.BigDecimal value)private ExpressiondoAdd(Structure2D.IntRowColumn key, java.math.BigDecimal value)(package private) voiddoIntegerRounding()Assumes at least 1 variable, and all variables integer!(package private) voiddoIntegerRounding(java.util.Set<Structure1D.IntIndex> remaining, java.math.BigDecimal lower, java.math.BigDecimal upper)(package private) ExpressiondoMixedIntegerRounding()(package private) ExpressiondoSet(Structure1D.IntIndex key, java.math.BigDecimal value)(package private) ExpressiondoSet(Structure2D.IntRowColumn key, java.math.BigDecimal value)doubledoubleValue(Structure1D.IntIndex key, boolean adjusted)doubledoubleValue(Structure2D.IntRowColumn key, boolean adjusted)voidenforce(NumberContext enforcer)booleanequals(java.lang.Object obj)java.math.BigDecimalevaluate(Access1D<java.math.BigDecimal> point)java.math.BigDecimalget(Variable variable)java.math.BigDecimalget(Structure1D.IntIndex key)java.math.BigDecimalget(Structure1D.IntIndex key, boolean adjusted)java.math.BigDecimalget(Structure2D.IntRowColumn key)java.math.BigDecimalget(Structure2D.IntRowColumn key, boolean adjusted)MatrixStore<java.lang.Double>getAdjustedGradient(Access1D<?> point)MatrixStore<java.lang.Double>getAdjustedHessian()(package private) java.util.Set<Variable>getBinaryVariables(java.util.Set<Structure1D.IntIndex> subset)private java.math.BigDecimalgetConstant()(package private) java.util.Map<Structure1D.IntIndex,java.math.BigDecimal>getLinear()java.util.Set<java.util.Map.Entry<Structure1D.IntIndex,java.math.BigDecimal>>getLinearEntrySet()java.util.Set<Structure1D.IntIndex>getLinearKeySet()(package private) ExpressionsBasedModelgetModel()(package private) java.util.Map<Structure2D.IntRowColumn,java.math.BigDecimal>getQuadratic()java.util.Set<java.util.Map.Entry<Structure2D.IntRowColumn,java.math.BigDecimal>>getQuadraticEntrySet()java.util.Set<Structure2D.IntRowColumn>getQuadraticKeySet()inthashCode()(package private) booleanincludes(Variable variable)booleanisAnyLinearFactorNonZero()booleanisAnyQuadraticFactorNonZero()(package private) booleanisConstantSet()booleanisFunctionConstant()booleanisFunctionLinear()booleanisFunctionPureQuadratic()booleanisFunctionQuadratic()(package private) booleanisInfeasible()booleanisInteger()Is this entity (all involved variables) integer?booleanisLinearAndAllBinary()booleanisLinearAndAllInteger()booleanisLinearAndAnyBinary()booleanisLinearAndAnyInteger()(package private) booleanisNegativeOn(java.util.Set<Structure1D.IntIndex> subset)(package private) booleanisPositiveOn(java.util.Set<Structure1D.IntIndex> subset)(package private) booleanisRedundant()private AffineFunction<java.lang.Double>makeAffineFunction()private ConstantFunction<java.lang.Double>makeConstantFunction()private PureQuadraticFunction<java.lang.Double>makePureQuadraticFunction()private QuadraticFunction<java.lang.Double>makeQuadraticFunction()(package private) Variableresolve(Structure1D.IntIndex index)Expressionset(int index, double value)Expressionset(int row, int column, double value)Expressionset(int row, int column, long value)Expressionset(int row, int column, java.lang.Comparable<?> value)Expressionset(int index, long value)Expressionset(int index, java.lang.Comparable<?> value)Expressionset(Variable variable, double value)Expressionset(Variable variable, long value)Expressionset(Variable variable, java.lang.Comparable<?> value)Will set (replace) the variable's factor to this valueExpressionset(Variable variable1, Variable variable2, double value)Expressionset(Variable variable1, Variable variable2, long value)Expressionset(Variable variable1, Variable variable2, java.lang.Comparable<?> value)voidsetCompoundFactorsOffset(java.util.List<Variable> variables, Access1D<?> point)Will set the quadratic and linear factors to an expression that measures (the square of) the distance from the given point.(package private) voidsetConstant(double value)(package private) voidsetConstant(long value)(package private) voidsetConstant(java.lang.Comparable<?> value)(package private) voidsetInfeasible()(package private) voidsetInteger()voidsetLinearFactors(java.util.List<Variable> variables, Access1D<?> factors)voidsetLinearFactorsSimple(java.util.List<Variable> variables)Will set the linear factors to a simple sum expression - all factors equal 1.0.voidsetQuadraticFactors(java.util.List<Variable> variables, Access2D<?> factors)(package private) voidsetRedundant()voidtighten()Will attempt to exploit integer property to tighten the lower and/or upper limits (integer rounding).MultiaryFunction.TwiceDifferentiable<java.lang.Double>toFunction()private Structure1D.IntIndextoIntIndex(int index)private Structure1D.IntIndextoIntIndex(Variable variable)private Structure2D.IntRowColumntoIntRowColumn(int row, int column)private Structure2D.IntRowColumntoIntRowColumn(Variable variable1, Variable variable2)private java.math.BigDecimaltoPositiveFraction(java.math.BigDecimal noninteger)-
Methods inherited from class org.ojalgo.optimisation.ModelEntity
adjust, appendLeftPart, appendMiddlePart, appendRightPart, appendToString, deriveAdjustmentExponent, getAdjustmentExponent, getAdjustmentExponentValue, getAdjustmentFactor, getCompensatedLowerLimit, getCompensatedLowerLimit, getCompensatedUpperLimit, getCompensatedUpperLimit, getContributionWeight, getLowerLimit, getLowerLimit, getLowerLimit, getName, getUpperLimit, getUpperLimit, getUpperLimit, isClosedRange, isConstraint, isContributionWeightSet, isEqualityConstraint, isInfeasible, isLowerConstraint, isLowerLimitSet, isObjective, isUpperConstraint, isUpperLimitSet, level, level, level, lower, lower, lower, reverseAdjustment, shift, toAdjusted, toBigDecimal, toString, toUnadjusted, upper, upper, upper, validate, validate, weight, weight, weight
-
-
-
-
Field Detail
-
myConstant
private java.math.BigDecimal myConstant
-
myInfeasible
private transient boolean myInfeasible
-
myInteger
private transient java.lang.Boolean myInteger
-
myLinear
private final java.util.Map<Structure1D.IntIndex,java.math.BigDecimal> myLinear
-
myModel
private final ExpressionsBasedModel myModel
-
myQuadratic
private final java.util.Map<Structure2D.IntRowColumn,java.math.BigDecimal> myQuadratic
-
myRedundant
private transient boolean myRedundant
-
myShallowCopy
private final boolean myShallowCopy
A shallow copy (typically created by presolver or integer solver) shares the Map:s holding the paramaters with other Expressions. They will only differ on the lower/upper limits and on meta data like flags indicating redundancy or infeasibility.
-
-
Constructor Detail
-
Expression
private Expression(Expression entityToCopy)
-
Expression
protected Expression(Expression expressionToCopy, ExpressionsBasedModel destinationModel, boolean deep)
-
Expression
Expression(java.lang.String name, ExpressionsBasedModel model)
-
-
Method Detail
-
add
public Expression add(int index, java.lang.Comparable<?> value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(int index, double value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(int row, int column, java.lang.Comparable<?> value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(int row, int column, double value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(int row, int column, long value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(int index, long value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(Variable variable, java.lang.Comparable<?> value)
Will add the value to this variable's factor.
-
add
public Expression add(Variable variable, double value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(Variable variable, long value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(Variable variable1, Variable variable2, java.lang.Comparable<?> value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(Variable variable1, Variable variable2, double value)
- See Also:
add(Variable, Comparable)
-
add
public Expression add(Variable variable1, Variable variable2, long value)
- See Also:
add(Variable, Comparable)
-
addTo
public void addTo(Expression target, java.math.BigDecimal scale)
Description copied from class:ModelEntity- Specified by:
addToin classModelEntity<Expression>- Parameters:
target- The targetExpressionscale- The scaling factor
-
compareTo
public int compareTo(Expression obj)
-
compensate
public Expression compensate(java.util.Set<Structure1D.IntIndex> fixedVariables)
Will return an Expression with factors corresponding to fixed variables removed, and lower/upper limits compensated for the fixed part of the expression. Factors corresponding to bilinear variables, where one is fixed and the other is not, are linearized.- Parameters:
fixedVariables- A set of (by the presolver) fixed variable indices- Returns:
- The reduced/modified expression
-
doubleValue
public double doubleValue(Structure1D.IntIndex key, boolean adjusted)
-
doubleValue
public double doubleValue(Structure2D.IntRowColumn key, boolean adjusted)
-
enforce
public void enforce(NumberContext enforcer)
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equalsin classModelEntity<Expression>
-
evaluate
public java.math.BigDecimal evaluate(Access1D<java.math.BigDecimal> point)
-
get
public java.math.BigDecimal get(Structure1D.IntIndex key)
-
get
public java.math.BigDecimal get(Structure1D.IntIndex key, boolean adjusted)
-
get
public java.math.BigDecimal get(Structure2D.IntRowColumn key)
-
get
public java.math.BigDecimal get(Structure2D.IntRowColumn key, boolean adjusted)
-
get
public java.math.BigDecimal get(Variable variable)
-
getAdjustedGradient
public MatrixStore<java.lang.Double> getAdjustedGradient(Access1D<?> point)
-
getAdjustedHessian
public MatrixStore<java.lang.Double> getAdjustedHessian()
-
getLinearEntrySet
public java.util.Set<java.util.Map.Entry<Structure1D.IntIndex,java.math.BigDecimal>> getLinearEntrySet()
-
getLinearKeySet
public java.util.Set<Structure1D.IntIndex> getLinearKeySet()
-
getQuadraticEntrySet
public java.util.Set<java.util.Map.Entry<Structure2D.IntRowColumn,java.math.BigDecimal>> getQuadraticEntrySet()
-
getQuadraticKeySet
public java.util.Set<Structure2D.IntRowColumn> getQuadraticKeySet()
-
hashCode
public int hashCode()
- Overrides:
hashCodein classModelEntity<Expression>
-
isAnyLinearFactorNonZero
public boolean isAnyLinearFactorNonZero()
-
isAnyQuadraticFactorNonZero
public boolean isAnyQuadraticFactorNonZero()
-
isFunctionConstant
public boolean isFunctionConstant()
-
isFunctionLinear
public boolean isFunctionLinear()
-
isFunctionPureQuadratic
public boolean isFunctionPureQuadratic()
-
isFunctionQuadratic
public boolean isFunctionQuadratic()
-
isInteger
public boolean isInteger()
Description copied from class:ModelEntityIs this entity (all involved variables) integer?- Specified by:
isIntegerin classModelEntity<Expression>
-
isLinearAndAllBinary
public boolean isLinearAndAllBinary()
- Returns:
- Are all the (linear) variables binary
-
isLinearAndAllInteger
public boolean isLinearAndAllInteger()
- Returns:
- Are all the (linear) variables integer
-
isLinearAndAnyBinary
public boolean isLinearAndAnyBinary()
- Returns:
- Are any of the (linear) variables binary
-
isLinearAndAnyInteger
public boolean isLinearAndAnyInteger()
- Returns:
- Are any of the (linear) variables integer
-
set
public Expression set(int index, java.lang.Comparable<?> value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(int index, double value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(int row, int column, java.lang.Comparable<?> value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(int row, int column, double value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(int row, int column, long value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(int index, long value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(Variable variable, java.lang.Comparable<?> value)
Will set (replace) the variable's factor to this value
-
set
public Expression set(Variable variable, double value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(Variable variable, long value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(Variable variable1, Variable variable2, java.lang.Comparable<?> value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(Variable variable1, Variable variable2, double value)
- See Also:
set(Variable, Comparable)
-
set
public Expression set(Variable variable1, Variable variable2, long value)
- See Also:
set(Variable, Comparable)
-
setCompoundFactorsOffset
public void setCompoundFactorsOffset(java.util.List<Variable> variables, Access1D<?> point)
Will set the quadratic and linear factors to an expression that measures (the square of) the distance from the given point.- Parameters:
variables- The relevant variablespoint- The point to measure from
-
setLinearFactors
public void setLinearFactors(java.util.List<Variable> variables, Access1D<?> factors)
-
setLinearFactorsSimple
public void setLinearFactorsSimple(java.util.List<Variable> variables)
Will set the linear factors to a simple sum expression - all factors equal 1.0.- Parameters:
variables- The relevant variables
-
setQuadraticFactors
public void setQuadraticFactors(java.util.List<Variable> variables, Access2D<?> factors)
-
tighten
public void tighten()
Will attempt to exploit integer property to tighten the lower and/or upper limits (integer rounding).
-
toFunction
public MultiaryFunction.TwiceDifferentiable<java.lang.Double> toFunction()
-
convert
private java.math.BigDecimal convert(java.math.BigDecimal value, boolean adjusted)
-
doAdd
private Expression doAdd(Structure1D.IntIndex key, java.math.BigDecimal value)
-
doAdd
private Expression doAdd(Structure2D.IntRowColumn key, java.math.BigDecimal value)
-
getConstant
private java.math.BigDecimal getConstant()
-
makeAffineFunction
private AffineFunction<java.lang.Double> makeAffineFunction()
-
makeConstantFunction
private ConstantFunction<java.lang.Double> makeConstantFunction()
-
makePureQuadraticFunction
private PureQuadraticFunction<java.lang.Double> makePureQuadraticFunction()
-
makeQuadraticFunction
private QuadraticFunction<java.lang.Double> makeQuadraticFunction()
-
toIntIndex
private Structure1D.IntIndex toIntIndex(int index)
-
toIntIndex
private Structure1D.IntIndex toIntIndex(Variable variable)
-
toIntRowColumn
private Structure2D.IntRowColumn toIntRowColumn(int row, int column)
-
toIntRowColumn
private Structure2D.IntRowColumn toIntRowColumn(Variable variable1, Variable variable2)
-
toPositiveFraction
private java.math.BigDecimal toPositiveFraction(java.math.BigDecimal noninteger)
-
appendMiddlePart
protected void appendMiddlePart(java.lang.StringBuilder builder, Access1D<java.math.BigDecimal> solution, NumberContext display)
-
destroy
protected void destroy()
- Overrides:
destroyin classModelEntity<Expression>
-
addAll
void addAll(java.util.Set<Structure1D.IntIndex> referenced)
Add all indices of referenced variables to the suppliedSet.
-
addObjectiveConstant
void addObjectiveConstant(java.math.BigDecimal value)
-
appendToString
void appendToString(java.lang.StringBuilder builder, Access1D<java.math.BigDecimal> solution, NumberContext display)
-
calculateSetValue
java.math.BigDecimal calculateSetValue(java.util.Collection<Structure1D.IntIndex> subset)
Calculates this expression's value - the subset variables' part of this expression. Will never return null.
-
copy
Expression copy(ExpressionsBasedModel destinationModel, boolean deep)
-
countIntegerFactors
long countIntegerFactors()
-
countLinearFactors
int countLinearFactors()
-
countQuadraticFactors
int countQuadraticFactors()
-
deriveAdjustmentExponent
int deriveAdjustmentExponent()
- Specified by:
deriveAdjustmentExponentin classModelEntity<Expression>
-
doIntegerRounding
void doIntegerRounding()
Assumes at least 1 variable, and all variables integer!- Specified by:
doIntegerRoundingin classModelEntity<Expression>- See Also:
ModelEntity.doIntegerRounding()
-
doIntegerRounding
void doIntegerRounding(java.util.Set<Structure1D.IntIndex> remaining, java.math.BigDecimal lower, java.math.BigDecimal upper)
-
doMixedIntegerRounding
Expression doMixedIntegerRounding()
-
doSet
Expression doSet(Structure1D.IntIndex key, java.math.BigDecimal value)
-
doSet
Expression doSet(Structure2D.IntRowColumn key, java.math.BigDecimal value)
-
getBinaryVariables
java.util.Set<Variable> getBinaryVariables(java.util.Set<Structure1D.IntIndex> subset)
-
getLinear
java.util.Map<Structure1D.IntIndex,java.math.BigDecimal> getLinear()
-
getModel
ExpressionsBasedModel getModel()
-
getQuadratic
java.util.Map<Structure2D.IntRowColumn,java.math.BigDecimal> getQuadratic()
-
includes
boolean includes(Variable variable)
-
isConstantSet
boolean isConstantSet()
-
isInfeasible
boolean isInfeasible()
- Overrides:
isInfeasiblein classModelEntity<Expression>
-
isNegativeOn
boolean isNegativeOn(java.util.Set<Structure1D.IntIndex> subset)
- Parameters:
subset- The indices of a variable subset- Returns:
- true if none of the variables in the subset can make a positve contribution to the expression value
-
isPositiveOn
boolean isPositiveOn(java.util.Set<Structure1D.IntIndex> subset)
- Parameters:
subset- The indices of a variable subset- Returns:
- true if none of the variables in the subset can make a negative contribution to the expression value
-
isRedundant
boolean isRedundant()
-
resolve
Variable resolve(Structure1D.IntIndex index)
-
setConstant
void setConstant(java.lang.Comparable<?> value)
-
setConstant
void setConstant(double value)
-
setConstant
void setConstant(long value)
-
setInfeasible
void setInfeasible()
-
setInteger
void setInteger()
-
setRedundant
void setRedundant()
-
-