| Quintiq file version 2.0 | 
| #parent: #root | 
| Method Debug_FreezeDecisionVariables ( | 
|   CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, | 
|   const Period_MP start, | 
|   const Period_MP end, | 
|   const LibOpt_Scope scope, | 
|   Boolean unfreeze | 
| ) const | 
| { | 
|   Description: | 
|   [* | 
|     Freeze the decision variables for debugging purpose | 
|     To check if the current planning is feasible in optimizer | 
|     Update this code if the initialization of period tasks and pispips change. | 
|   *] | 
|   TextBody: | 
|   [* | 
|      | 
|     // Note: | 
|     // 1. Does not support the freezing of postponed sales demands as they will be merged back to the original one. | 
|     // Possible infeasible due to common violation of hard constraints such as: | 
|     // 1. Some of the dependent demands are not fulfilled. | 
|     // 2. The hard constraints found in optimizer setting if activated, such as lot sizes. | 
|      | 
|     // Freeze the variables to its current value if it is within the selected optimization horizon | 
|     // periodtaskqtyvarname := AlgorithmNameVariable::PTQty(); | 
|      | 
|     runcontext := this.GetRunContextConst();  | 
|     epsilonfreeze := 0.0;  | 
|      | 
|     traverse( scope.GetPeriodInOptimizerRunConst(), Elements, period )  | 
|     { | 
|       traverse( period, UnitPeriod, unitperiod, scope.Contains( unitperiod.UnitPeriodInOptimizerRun() ) ) | 
|       { | 
|         operations := this.GetOperationsForUnitPeriod( scope, unitperiod ); | 
|         traverse( operations, Elements, operation, | 
|                   not operation.IsFrozenInPeriod( period ) ) | 
|         { | 
|           // period task | 
|           pt := PeriodTaskOperation::FindPeriodTaskOperationTypeIndex( period.Start(), operation.ID() ); | 
|           quantity := guard( pt.Quantity(), 0.0 ); | 
|           var := program.PTQtyVariables().Get( operation, period ); | 
|           if ( unfreeze )  | 
|           { | 
|             this.SetPTQtyVariableProperties( scope, runcontext, operation, period, var, false /*set start value*/, program ); | 
|           } | 
|           else | 
|           { | 
|             nonegative := true;  | 
|             this.FreezeIt( var, quantity, nonegative, epsilonfreeze );  | 
|           } | 
|      | 
|      | 
|         // Dependent demand input group | 
|         /* | 
|           traverse( pt, DependentDemandInputGroup, ddig ) | 
|           { | 
|             if( operation.HasLeadTime() )     // Get the dependent demands that is located at different period from the period of period task. | 
|             { | 
|               pispipperiods := construct(  Period_MPs );  | 
|               CapacityPlanningSuboptimizer::GetOperationDependentDemandPeriods( period, operation, pispipperiods ); | 
|      | 
|               traverse( pispipperiods, Elements, pispipperiod ) | 
|               { | 
|      | 
|                 traverse( ddig, DependentDemand, dd, dd.ProductInStockingPointInPeriodPlanningLeaf().Period_MP() = pispipperiod ) | 
|                 { | 
|                   input := dd.ProcessInput(); | 
|                   varpartialoperationdemandqty := program.PartialOperationDemandQtyVariables().Find( input.astype( OperationInput ), pispipperiod, period ); | 
|                   if ( not isnull( varpartialoperationdemandqty ) )  | 
|                   { | 
|                     quantity := dd.FulfilledQuantity(); | 
|                     if ( unfreeze )  | 
|                     { | 
|                       varpartialoperationdemandqty.LowerBound( 100.0 );  | 
|                       varpartialoperationdemandqty.LowerBound( 0.0 );  | 
|                       varpartialoperationdemandqty.UpperBound( 100.0 );  | 
|                       varpartialoperationdemandqty.UpperBound( Real::MaxReal() );  | 
|                     } | 
|                     else | 
|                     { | 
|                       this.FreezeIt( varpartialoperationdemandqty, quantity ); | 
|                     } | 
|                   } | 
|                 }                                                            | 
|               } | 
|             } | 
|             else | 
|             { | 
|               quantity := ddig.OptimizerFulfilledQuantity(); | 
|               error('Nikolay Kosarev: Is it unreachable? (should always be 2 indices') | 
|               //operationdemandqtyvar := program.FindVariable( operationdemandqtyvarname, period ); | 
|               //if( not isnull( var ) ) | 
|               //{ | 
|               // this.FreezeVariableWithSlack( operationdemandqtyvar, quantity ); | 
|               //}    | 
|             } | 
|           }*/ | 
|         } | 
|       }  | 
|        | 
|      | 
|       traverse( scope.GetProductInTripInOptimizerRunConst(), Elements, productintrip,  | 
|                 not productintrip.Trip().DepartureUnitPeriod().IsPeriodFrozen() ) | 
|       { | 
|         var := program.TripNewSupplyVariables().Get( productintrip ); | 
|         if ( unfreeze )  | 
|         { | 
|           var.LowerBound( -100.0 );  | 
|           var.UpperBound( -100.0 );  | 
|           var.LowerBound( productintrip.PITVarInitLowerBound() );  | 
|           var.UpperBound( productintrip.PITVarInitUpperBound() );  | 
|         } | 
|         else | 
|         { | 
|           qty := productintrip.Quantity();  | 
|           nonegative := true;  | 
|           this.FreezeIt( var, qty, nonegative, epsilonfreeze ); | 
|         } | 
|       } | 
|     } | 
|     /* | 
|     // Freeze variables for SalesDemands | 
|     traverse( scope.GetLeafSalesDemandInPeriodInRun(),  | 
|               Elements,  | 
|               lsdip,  | 
|               lsdip.AsSalesDemandInPeriodBase().Period_MP().IsAvailableForOptimization( start, end ) ) | 
|     { | 
|         var := program.SalesDemandQtyVariables().Get( lsdip );      // Fulfilled quantity | 
|         if ( unfreeze )  | 
|         { | 
|           var.LowerBound( -100.0 );  | 
|           var.LowerBound( lsdip.SalesDemandQtyVarInitLowerBound() );  | 
|           var.UpperBound(  -100.0 );  | 
|           var.UpperBound( lsdip.SalesDemandQtyVarInitUpperBound() );  | 
|         } | 
|         else | 
|         { | 
|           qty := lsdip.FulfilledQuantity() ;  | 
|           nonnegative := true;  | 
|           this.FreezeIt( var, qty, nonnegative ); | 
|         } | 
|     }  | 
|      | 
|     traverse( scope.GetAggregatedSalesDemandInPeriodInRun(), Elements, asdip, asdip.AsSalesDemandInPeriodBase().Period_MP().IsAvailableForOptimization( start, end ) ) | 
|     { | 
|         traverse ( asdip,  | 
|                    DisaggregatedSalesDemandInPeriod,  | 
|                    dasdip, | 
|                    not dasdip.IsPostponed() | 
|                    and scope.Contains(  dasdip.AsPlanningBaseSalesDemandInPeriod().PISPIPInOptimizerRun() ) ) | 
|         { | 
|            var := program.DisaggregatedSalesDemandQtyVariables().Get( dasdip ); | 
|            if ( unfreeze )  | 
|            { | 
|              var.LowerBound( -100.0);  | 
|              var.LowerBound( dasdip.SalesDemandQtyVarInitLowerBound() );  | 
|              var.UpperBound( -100.0 );  | 
|              var.UpperBound( dasdip.SalesDemandQtyVarInitUpperBound() );  | 
|            } | 
|            else | 
|            { | 
|              qty := dasdip.FulfilledQuantity();  | 
|              nonneg := true;  | 
|              this.FreezeIt( var, qty, nonneg );  | 
|            } | 
|         } | 
|     } | 
|     */ | 
|      | 
|     // Freeze the variables to its current value if it is within the selected optimization horizon | 
|     /* | 
|     traverse( scope.GetPISPIPInOptimizerRun(), Elements.astype(  ProductInStockingPointInPeriodPlanningLeaf), pispip )  | 
|     { | 
|       traverse( pispip, DependentDemand, dd, isnull( dd.ProductInTrip() ) ) | 
|       { | 
|         operationdemandqtyvar := program.OperationDemandQtyVariables().Find( dd.ProcessInput(), pispip.Period_MP() );  // Fulfilled quantity | 
|         if ( not isnull( operationdemandqtyvar ) )  | 
|         { | 
|           if ( unfreeze )  | 
|           { | 
|             operationdemandqtyvar.LowerBound( -100.0 );  | 
|             operationdemandqtyvar.LowerBound( 0.0 );  | 
|             operationdemandqtyvar.UpperBound( -100.0 );  | 
|             operationdemandqtyvar.UpperBound( Real::MaxReal() );  | 
|           } | 
|           else | 
|           { | 
|             this.FreezeIt( operationdemandqtyvar, dd.FulfilledQuantity() ); | 
|           } | 
|         } | 
|       } | 
|     } | 
|     */ | 
|   *] | 
|   InterfaceProperties { Accessibility: 'Module' } | 
| } |