| Quintiq file version 2.0 | 
| #parent: #root | 
| Method InitConstraintsGoalsForDriverLot ( | 
|   CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, | 
|   const RunContextForCapacityPlanning runcontext, | 
|   const LibOpt_Scope scope | 
| ) const | 
| { | 
|   Description: 'Init constraints goals for account depends on lotsize.' | 
|   TextBody: | 
|   [* | 
|     // Lot accounts | 
|      | 
|     if( runcontext.UseLotCost() ) | 
|     { | 
|       driver := select( this, MacroPlan.AccountCostDriver, driver, driver.Name() = Translations::MP_AccountAssignmentCostDriverLot() ); | 
|       traverse( scope.GetAccountsInOptimizerRunConst(), Elements, account, account.HasLotAssignment() ) | 
|       { | 
|         // Get mathematical program variable names | 
|         driverlot_varname := typeof( MPDriverLotVariable ); | 
|         ptnroflots_varname := typeof( MPPTNrOfLotsVariable ); | 
|         operationinputnroflotsvarname := typeof(  MPOperationInputNrOfLotsVariable ); | 
|         tripnroflots_varname := typeof( MPTripNrOfLotsVariable ); | 
|         // Get the name of the constraints | 
|         driverlot_constname := typeof( MPDriverLotConstraint ); | 
|         // Get the constraint term scale factors | 
|         scale_dcconst_ptnroflotsvar := this.ScaleConstraintTerm( ptnroflots_varname, driverlot_constname ); | 
|         scale_dcconst_tripnroflotsvar := this.ScaleConstraintTerm( tripnroflots_varname, driverlot_constname ); | 
|         scale_dcconst_operationinputnroflotsvar := this.ScaleConstraintTerm( operationinputnroflotsvarname, driverlot_constname ); | 
|         scale_driverlotvar_driverlotconstr := this.ScaleConstraintTerm( driverlot_varname, driverlot_constname ) | 
|          | 
|         // dcconst constraint UoM: Monetary | 
|         dcconst := program.DriverLotConstraints().New( account, driver ); | 
|         dcconst.Sense( '=' ); | 
|         dcconst.RHSValue( this.ScaleConstraintRHS( driverlot_constname, 0.0 ) ); | 
|         // Term UoM: Monetary | 
|         dcconst.NewTerm( 1.0 * scale_driverlotvar_driverlotconstr, program.DriverLotVariables().Get( account, driver ) ); | 
|        | 
|         traverse( account, AccountAssignment, aa, aa.AccountCostDriver() = driver and aa.AccountCost( relsize ) > 0  ) | 
|         { | 
|           // Operation (only include those that are part of this optimizer run and related to a unit period that is part of this optimizer run) | 
|           traverse( aa, astype( UnitAccount ).UnitAccountInPeriodForLot.UnitPeriod, up, scope.Contains( up.UnitPeriodInOptimizerRun() ) ) | 
|           { | 
|             period := up.Period_MP(); | 
|              | 
|             traverse( up, Unit.OperationForOptimizationInScope, operation )  | 
|             { | 
|               cost := operation.GetBaseCostPerLot( aa, up );  | 
|                | 
|               ptnroflotsvar := program.PTNrOfLotsVariables().Find( operation, up.Period_MP() ); | 
|               if( not isnull( ptnroflotsvar ) ) | 
|               { | 
|                 dcconst.NewTerm( -cost * scale_dcconst_ptnroflotsvar, ptnroflotsvar );           | 
|               } | 
|                | 
|               // Input lot terms | 
|               if ( operation.HasInputLotSize() )  | 
|               { | 
|                 periodsfordd := construct( Period_MPs, constcontent ); // periods for dependent demand | 
|                  | 
|                 // Consider all relevant periods for the dependent demand | 
|                 if ( this.GetPeriodsFromPeriodTaskOperation() )  | 
|                 { | 
|                   traverse( operation, PeriodTaskOperationInScope.DependentDemand.ProductInStockingPointInPeriodPlanningLeaf.Period_MP, ddperiod ) | 
|                   { | 
|                     periodsfordd.Add(  ddperiod ); | 
|                   } | 
|                 } | 
|                 else | 
|                 { | 
|                   CapacityPlanningSuboptimizer::GetOperationDependentDemandPeriods( period, operation, &periodsfordd, this.GetPeriodsFromPeriodTaskOperation() ); // period may be included twice  | 
|                 } | 
|                 periodsfordd := periodsfordd.Unique(); | 
|                  | 
|                 traverse( periodsfordd, Elements, ddperiod, | 
|                           ddperiod.IsWithinLotSizeHorizon() ) | 
|                 { | 
|                   traverse( operation,  | 
|                             OperationInput,  | 
|                             input, | 
|                             input.ProductInStockingPoint_MP().HasInputLotSize() | 
|                             and ( input.HasRegularProductforOptimizer() or input.GetIsProductInOptimizerRun( runcontext.IsPostProcessing() ) ) )  | 
|                   { | 
|                     operationinputnroflotsvar := program.OperationInputNrOfLotsVariables().Find( input, period ); | 
|                     if( not isnull( operationinputnroflotsvar ) ) | 
|                     { | 
|                       dcconst.NewTerm( -cost * scale_dcconst_operationinputnroflotsvar, operationinputnroflotsvar ); | 
|                     } | 
|                   } | 
|                 } | 
|               }     | 
|             } | 
|           } | 
|        | 
|           // Trip | 
|           traverse( aa, astype( UnitAccount ).Unit.LaneLegForOptimization.Trip, trip, trip.HasValidDeparture()  | 
|                                                                                       and scope.Contains(  trip.TripInOptimizerRun() ) | 
|                                                                                       and trip.DepartureUnitPeriod().HasLotSize() | 
|                                                                                       and trip.DepartureUnitPeriod().Period_MP().IsWithinLotSizeHorizon() ) | 
|           { | 
|             laneleg := trip.LaneLeg(); | 
|             cost := laneleg.GetBaseCostPerLot( aa, trip.DepartureUnitPeriod() ); | 
|             tripnroflotsvar := program.TripNrOfLotsVariables().Find( trip ); | 
|             if( not isnull( tripnroflotsvar ) ) | 
|             { | 
|               dcconst.NewTerm( -cost * scale_dcconst_tripnroflotsvar, tripnroflotsvar ); | 
|             } | 
|           } | 
|         } | 
|       } | 
|     } | 
|   *] | 
| } |