| Quintiq file version 2.0 | 
| #parent: #root | 
| Method InitConstraintsGoalsForStockingPointInPeriods ( | 
|   CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, | 
|   const RunContextForCapacityPlanning runcontext, | 
|   const LibOpt_Scope scope | 
| ) const | 
| { | 
|   Description: 'Init constraints goals for stocking point in periods' | 
|   TextBody: | 
|   [* | 
|     collectvaluesmodel := runcontext.IsMetaIteration();  | 
|      | 
|     totalstockingpointviolation := 0.0;  | 
|      | 
|     totalstockingpointcapacity_varname := typeof( MPTotalStockingPointCapacityVariable ); | 
|     stockingpointcapacityoverloaded_varname := typeof( MPStockingPointCapacityOverloadedVariable ); | 
|      | 
|     totalstockingpointcapacity_constname := typeof( MPTotalStockingPointCapacityConstraint ); | 
|      | 
|     scalefactor_totalstockingpointcapacity_const := this.ScaleConstraintTerm( totalstockingpointcapacity_varname, totalstockingpointcapacity_constname ); | 
|     scalefactor_stockingpointcapacityoverloaded_const := this.ScaleConstraintTerm( stockingpointcapacityoverloaded_varname , totalstockingpointcapacity_constname ); | 
|     scalefactor_overmaxvar := CapacityPlanningSuboptimizer::GetVariableScaleFactor( stockingpointcapacityoverloaded_varname );  | 
|      | 
|     // stocking point capacity overloaded | 
|     // const constraint UoM: SP --> Please note that this means that if different SP have a different UoM, | 
|     //                              their SPCapacityOverloaded will have a different weight in the goal | 
|     const := program.TotalStockingPointCapacityConstraints().New(); | 
|     const.Sense( '=' ); | 
|     // using default RHS 0.0  | 
|     // Term UoM: SP | 
|     const.NewTerm( 1.0 * scalefactor_totalstockingpointcapacity_const, program.TotalStockingPointCapacityVariables().Get() ); | 
|      | 
|     constmeta := null(  MPConstraint );  | 
|     if ( runcontext.IsMetaIteration() )  | 
|     { | 
|       constmeta := program.TotalStockingPointCapacityMetaConstraints().New(); | 
|       constmeta.Sense( '=' ); | 
|       // using default RHS 0.0  | 
|       // Term UoM: SP | 
|       constmeta.NewTerm( 1.0 * scalefactor_totalstockingpointcapacity_const, program.TotalStockingPointCapacityMetaVariables().Get() ); | 
|     } | 
|      | 
|     // Overloaded capacity | 
|     traverse( scope.GetStockingPointInPeriodInOptimizerRunConst(),  | 
|               Elements,  | 
|               spip, | 
|               not spip.StockingPoint_MP().IsPlannedInfinite()  | 
|               and not spip.IsPeriodFrozen() ) | 
|     { | 
|       // Term UoM: SP | 
|       coefficient := scalefactor_stockingpointcapacityoverloaded_const;  | 
|        | 
|      | 
|       const.NewTerm( -1.0 * coefficient, program.StockingPointCapacityOverloadedVariables().Get( spip ) ); | 
|        | 
|       if ( runcontext.IsMetaIteration() )  | 
|       { | 
|         constmeta.NewTerm( -1.0 * coefficient, program.StockingPointCapacityOverloadedMetaVariables().Get( spip ) ); | 
|       } | 
|        | 
|       if ( collectvaluesmodel )  | 
|       { | 
|         change_inventory := program.Variable(  'UnscaledRHSModificationSPInPeriodInventoryLevelConstraints', spip ).UpperBound();  // we filter RHS of this constraints to remove noise. Need to take this into account to compute existing violation  | 
|         totalstockingpointviolation := totalstockingpointviolation +  coefficient * maxvalue(  0.0, (spip.InventoryLevelEnd() + change_inventory) - spip.MaxCapacity() ) / scalefactor_overmaxvar;  | 
|       } | 
|     } | 
|      | 
|     // workaround because cannot write to attribute | 
|     this.StoreValueInProgram( program,'collect_values_model_TotalStockingPointCapacityVariables', totalstockingpointviolation ); | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |