| Quintiq file version 2.0 | 
| #parent: #root | 
| Method UpdateMinMaxBound ( | 
|   Real bound, | 
|   MPVariable variable | 
| ) | 
| { | 
|   Description: 'Updates the minimum lowerbound and maximum upperbound of the scaling type' | 
|   TextBody: | 
|   [* | 
|     // Select the scaling type associated with this variable | 
|      | 
|     scalingtypename := CapacityPlanningSuboptimizer::GetVariableScaleType( typeofexpression( variable ).ShortName() ); | 
|      | 
|     algorithmrun := this.MacroPlan().GetLastAlgorithmRun();  | 
|     scalingtype := algorithmrun.GetScalingType( scalingtypename ); | 
|      | 
|     // Update the minimum/maximum bound of this scaling type | 
|     newbound := abs( bound ); | 
|     if( newbound <> 0 and newbound.IsFinite() ) | 
|     { | 
|        //'moving all updates on variables into the handle feasible, so methods can be read only. Originally we call with the unscaled(non cplex value) then divide to get cplex bound | 
|        //  so now we start with the actual cplex bound in the call so no need to scale by dividing. Only difference would be squashing tiny values. Hence commenting out following:   | 
|       /* >>                              | 
|       varscalefactor := CapacityPlanningSuboptimizer::GetVariableScaleFactor( typeofexpression( variable ) );  | 
|       newbound := newbound / varscalefactor; | 
|       <<*/ | 
|        | 
|       if( newbound < scalingtype.MinBound() ) | 
|       { | 
|         scalingtype.MinBound( newbound ); | 
|         scalingtype.VariableNameMinBound( variable.Name() ); | 
|       } | 
|       if( newbound > scalingtype.MaxBound() ) | 
|       { | 
|         scalingtype.MaxBound( newbound ); | 
|         scalingtype.VariableNameMaxBound( variable.Name() ); | 
|       } | 
|     } | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |