Quintiq file version 2.0
|
#parent: #root
|
Method FixVariableStyleGuide (
|
MPVariable var,
|
Real bound,
|
Boolean setuppperbound,
|
Boolean setlowerbound,
|
Boolean applyscaling
|
) const
|
{
|
Description: 'fixing cplex variables according to modeling style guide'
|
TextBody:
|
[*
|
if (applyscaling )
|
{
|
bound := this.ScaleVariable( var, bound ); // scale the bound
|
}
|
|
if( var.VariableType() = 'Binary' or var.VariableType() = 'Integer' )
|
{
|
if ( setlowerbound )
|
{
|
var.LowerBound( bound - 0.1 );
|
}
|
if ( setuppperbound )
|
{
|
var.UpperBound( bound + 0.1 );
|
}
|
}
|
else
|
{
|
// Scale everything by a big factor to avoid the epsilon arithmetic of Quill
|
big := 1e+10;
|
// guard against a MaxReal upper bound, or MinReal lower bound from the init variables
|
lb := Real::MinReal();
|
ub := Real::MaxReal();
|
if( var.LowerBound().IsFinite() )
|
{
|
lb := var.LowerBound() * big;
|
}
|
if( var.UpperBound().IsFinite() )
|
{
|
ub := var.UpperBound() * big;
|
}
|
opt := bound * big;
|
|
lb := maxvalue( lb, minvalue( ub, opt ) )
|
ub := minvalue( ub, maxvalue( lb, opt ) )
|
|
// Avoid very small range between lb and ub:
|
// Compare the bound range to 1e-10, also using scaling
|
if( ub - lb <= 1e-10 * big )
|
{
|
ub := lb;
|
}
|
|
// Unscale the values and apply them
|
if ( setlowerbound )
|
{
|
var.LowerBound( lb / big );
|
}
|
if ( setuppperbound )
|
{
|
var.UpperBound( ub / big );
|
}
|
}
|
*]
|
InterfaceProperties { Accessibility: 'Module' }
|
}
|