Quintiq file version 2.0 
 | 
#parent: #root 
 | 
Method InitVariablesForCampaignCombiSelection ( 
 | 
  CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm program, 
 | 
  const RunContextForCapacityPlanning runcontext, 
 | 
  const LibOpt_Scope scope 
 | 
) const 
 | 
{ 
 | 
  Description: 'init variables method for campaign sequencing optimizer' 
 | 
  TextBody: 
 | 
  [* 
 | 
    if( runcontext.UseCampaignSequenceOptimizer() and runcontext.UseCampaign() ) 
 | 
    { 
 | 
      operationsinscope := scope.GetOperationInOptimizerRunConst(); 
 | 
      computenvar := this.MacroPlan().Optimization().DebugMode();  
 | 
     
 | 
      program.RegisterTypeDescriptor( attribute( OptCampaignUnitSubPeriod, Name ) ); 
 | 
      program.RegisterTypeDescriptor( attribute( OptCampaignCombi, Name ) ); 
 | 
      program.RegisterTypeDescriptor( attribute( OptCampaignCombiElement, Name ) ); 
 | 
      program.RegisterTypeDescriptor( attribute( OptCampaignElementType, Name ) ); 
 | 
      program.RegisterTypeDescriptor( attribute( OptCampaignUnit, UnitID ) ); 
 | 
      program.RegisterTypeDescriptor( attribute( OptCampaignOperationInElementType, Name ) ); 
 | 
     
 | 
      traverse( scope.GetUnitPeriodInOptimizerRunConst(), Elements.OptCampaignUnitSubPeriod, ocusp )  
 | 
      { 
 | 
        assert( forall( ocusp, OptCampaignCombiSelected, combiselected, combiselected.IsActive() ), 'failed assertion: selected combi is not active ' );  
 | 
        program.UnderSelectionOfCampaignCombiVariables().New( ocusp )  
 | 
        program.IsIncompatibleWithPrevOptSubUnitPeriodLastElementVariables().New( ocusp ) 
 | 
         
 | 
        traverse( ocusp, OptCampaignCombiActive, combi ) 
 | 
        {  
 | 
          var := program.IsCampaignCombiSelectedVariables().New( combi ); 
 | 
          var.StartValue( ifexpr( combi.IsSelectedByOptimizer(), 1.0, 0.0 ) );  
 | 
          if ( combi.DebugIsFixedPlanned() )  
 | 
          { 
 | 
            valueplanned := ifexpr( combi.IsSelectedByOptimizer(), 1.0, 0.0 ); 
 | 
            var.UpperBound( valueplanned );  
 | 
            var.LowerBound( valueplanned );  
 | 
          } 
 | 
        } 
 | 
        traverse( ocusp, OptCampaignCombiElement.OptCampaignElementType, ocet )  
 | 
        { 
 | 
          //If this is a transition, we want these constraints to be hard ones 
 | 
          if( not ocet.istype( OptCampaignTransitionType ) ) 
 | 
          { 
 | 
            program.MinCampaignElementTypeQtyUnderWithinVariables().New( ocet, ocusp ); 
 | 
            program.MinCampaignElementTypeQtyUnderMultiVariables().New( ocet, ocusp ); 
 | 
             
 | 
            program.MinCampaignElementTypeDurUnderWithinVariables().New( ocet, ocusp ); 
 | 
            program.MinCampaignElementTypeDurUnderMultiVariables().New( ocet, ocusp ); 
 | 
             
 | 
            program.MaxCampaignElementTypeQtyOverWithinVariables().New( ocet, ocusp ); 
 | 
            if ( isnull( ocusp.NextSubPeriod() ) )  
 | 
            { 
 | 
              program.MaxCampaignElementTypeQtyOverWithinLastVariables().New( ocet, ocusp );  
 | 
            } 
 | 
            program.MaxCampaignElementTypeQtyOverMultiPeriodVariables().New( ocet, ocusp ); 
 | 
             
 | 
            program.MaxCampaignElementTypeDurOverWithinVariables().New( ocet, ocusp ); 
 | 
            program.MaxCampaignElementTypeDurOverMultiVariables().New( ocet, ocusp ); 
 | 
          } 
 | 
           
 | 
          program.CampaignElementTypePeriodOverloadedStartVariables().New( ocet, ocusp ); 
 | 
          program.CampaignElementTypePeriodOverloadedMidVariables().New( ocet, ocusp ); 
 | 
          program.CampaignElementTypePeriodOverloadedEndVariables().New( ocet, ocusp ); 
 | 
           
 | 
          program.CampaignElementTypePeriodUnderloadedStartVariables().New( ocet, ocusp ); 
 | 
          program.CampaignElementTypePeriodUnderloadedMidVariables().New( ocet, ocusp ); 
 | 
          program.CampaignElementTypePeriodUnderloadedEndVariables().New( ocet, ocusp ); 
 | 
           
 | 
          program.DurationOfCampaignElementTypeMidVariables().New( ocet, ocusp ); 
 | 
          program.DurationOfCampaignElementTypeEndVariables().New( ocet, ocusp ); 
 | 
          program.DurationOfCampaignElementTypeStartVariables().New( ocet, ocusp ); 
 | 
                
 | 
          program.NrOfCampaignElementWithinUnitSubPeriodVariables().New( ocet, ocusp ) 
 | 
           
 | 
          program.IsFirstCampaignElementTypeVariables().New( ocet, ocusp ) 
 | 
          program.IsLastCampaignElementTypeVariables().New( ocet, ocusp ) 
 | 
           
 | 
          program.IsMultiPeriodsFirstCampaignElementTypeFirstPeriodVariables().New( ocet, ocusp ) 
 | 
           
 | 
          traverse( ocet, OptCampaignOperationInElementType, ocoet ) 
 | 
          { 
 | 
            varstart := program.PTQtyInCampaignElementTypeStartVariables().New( ocoet, ocusp ); 
 | 
            varmid := program.PTQtyInCampaignElementTypeMidVariables().New( ocoet, ocusp ); 
 | 
            varend := program.PTQtyInCampaignElementTypeEndVariables().New( ocoet, ocusp );  
 | 
               
 | 
            if( operationsinscope.Find( ocoet.Operation() ) < 0 ) 
 | 
            { 
 | 
              varstart.UpperBound( 0.0 ); 
 | 
              varmid.UpperBound( 0.0 ); 
 | 
              varend.UpperBound( 0.0 ); 
 | 
            } 
 | 
          } 
 | 
        } 
 | 
      }   
 | 
       
 | 
      // fixing debug values  
 | 
      traverse( scope.GetUnitPeriodInOptimizerRunConst(), Elements.OptCampaignUnitSubPeriod, ocusp )  
 | 
      { 
 | 
        traverse( ocusp, OptCampaignCombiActive, combi )  
 | 
        { 
 | 
          traverse( combi, OptCampaignCombiElement, occelt )  
 | 
          { 
 | 
            ocet := occelt.OptCampaignElementType();  
 | 
            subperiod := occelt.OptCampaignUnitSubPeriod();  
 | 
            midvar := program.DurationOfCampaignElementTypeMidVariables().Get( ocet, subperiod ); 
 | 
            endvar := program.DurationOfCampaignElementTypeEndVariables().Get( ocet, subperiod ); 
 | 
            startvar := program.DurationOfCampaignElementTypeStartVariables().Get( ocet, subperiod ); 
 | 
            
 | 
            // note that these variables are shared among combi elements with the same type and sub period.  
 | 
            // in the handle feasible we write back duplicated to the combi element objects 
 | 
            // here we only set for the combi that has been fixed - which for normal debugging it would mean we only set 
 | 
            // values ones because there will be at most 1 combi per unit period 
 | 
             
 | 
            if ( occelt.DebugFixStartDuration() )  
 | 
            { 
 | 
              startvar.LowerBound( occelt.DebugDurationOfCampaignElementTypeStartVariables() );  
 | 
              startvar.UpperBound( startvar.LowerBound() );  
 | 
               
 | 
              if ( startvar.UpperBound() = 0.0 )  
 | 
              { 
 | 
                traverse( ocet, OptCampaignOperationInElementType, ocoet ) 
 | 
                {  
 | 
                  program.PTQtyInCampaignElementTypeStartVariables().Get( ocoet, subperiod ).UpperBound ( 0.0 );  
 | 
                } 
 | 
              } 
 | 
            } 
 | 
            if ( occelt.DebugFixMidDuration() )  
 | 
            { 
 | 
              midvar.LowerBound( occelt.DebugDurationOfCampaignElementTypeMidVariables() );  
 | 
              midvar.UpperBound( midvar.LowerBound() );  
 | 
               
 | 
              if ( midvar.UpperBound() = 0.0 )  
 | 
              { 
 | 
                traverse( ocet, OptCampaignOperationInElementType, ocoet ) 
 | 
                {  
 | 
                  program.PTQtyInCampaignElementTypeMidVariables().Get( ocoet, subperiod ).UpperBound ( 0.0 );  
 | 
                } 
 | 
              } 
 | 
            } 
 | 
            if ( occelt.DebugFixEndDuration() )  
 | 
            { 
 | 
              endvar.LowerBound( occelt.DebugDurationOfCampaignElementTypeEndVariables() );  
 | 
              endvar.UpperBound( endvar.LowerBound() );  
 | 
               
 | 
              if ( endvar.UpperBound() = 0.0 )  
 | 
              { 
 | 
                traverse( ocet, OptCampaignOperationInElementType, ocoet ) 
 | 
                {  
 | 
                  program.PTQtyInCampaignElementTypeEndVariables().Get( ocoet, subperiod ).UpperBound ( 0.0 );  
 | 
                } 
 | 
              } 
 | 
            }  
 | 
          } 
 | 
        } 
 | 
      } 
 | 
       
 | 
      // Creating Goal variables 
 | 
      program.TotalUnitPeriodCampaignUtilizationSlackVariables().New(); 
 | 
      program.TotalCampaignSequencingCombiSlackVariables().New(); 
 | 
      program.TotalCampaignMinQtyUnderVariables().New(); 
 | 
      program.TotalCampaignMaxQtyOverVariables().New(); 
 | 
      program.TotalCampaignMinDurationUnderVariables().New(); 
 | 
      program.TotalCampaignMaxDurationOverVariables().New(); 
 | 
       
 | 
      if( computenvar ) 
 | 
      { 
 | 
        periods := counter( scope.GetUnitPeriodInOptimizerRunConst(), Elements.OptCampaignUnitSubPeriod, ocusp, true ); 
 | 
        debuginfo( " -Number of campaign subunitperiods: ", periods );  
 | 
        combis := sum( scope.GetUnitPeriodInOptimizerRunConst(), Elements.OptCampaignUnitSubPeriod, ocusp, true, counter( ocusp, OptCampaignCombiActive, combi, true ) ); 
 | 
        debuginfo( " -Number of campaign combis ", combis   )   
 | 
      } 
 | 
    } 
 | 
  *] 
 | 
} 
 |