chenqinghong
2024-05-07 3ec06a830367465068963156dcc1d8e522571c13
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Quintiq file version 2.0
#parent: #root
Method SetCPLEXParametersHierarchicalGoal (
  MathematicalProgram program,
  const StrategyLevelMacroPlan runlevel,
  MPGoal goal
) const
{
  Description: 'Set the parameters (time limit, gap, etc) of the optimizer, according to setting per iteration'
  TextBody:
  [*
    goal.ParameterSet().Flush(); 
    runcontext := this.GetRunContextConst(); 
    
    // set runlevel abs / rel gap 
    if ( not runcontext.IsMetaIteration() ) 
    {
      if( runlevel.UseAbsoluteGap() )
      {
        goal.ParameterSet().Set( 2008, runlevel.AbsoluteGap() );      // absolute gap tolerance
        goal.ParameterSet().Set( 2009, 0.0 ); // explicitly must set rel gap to 0, otherwise solver can still terminate early based on that 
      }
      else
      {
        goal.ParameterSet().Set( 2009, runlevel.RelativeGap() );      // relative gap tolerance
        goal.ParameterSet().Set( 2008, 0.0 ); // explicitly must set abs gap to 0, otherwise solver can still terminate early based on that 
      }
    }
      
    // set specific setting from solver settings object
    this.ActivateSolverSettingsHierarchical( program, runlevel, goal, runcontext );        // activate the solver settings for the next level
    
    // set time limit  
    timelimit := [Real]runlevel.TimeLimit();
    timelimitcplexparamnumber := 1039; 
    if ( runcontext.IsMetaIteration() ) 
    {
      rcm := this.GetRunContextMeta();
      timelimit := 2 * rcm.OptionMaxTimePerIterationSeconds(); // set time out to be twice the target time used for tuning
    }
    goal.ParameterSet().Set( timelimitcplexparamnumber, timelimit );
    
    // set AbsTol, RelTol
    if ( runlevel.UseHierarchicalSolverRelTolerance() ) 
    {
      goal.RelTolerance( runlevel.HierarchicalCPLEXRelTolerance() ); // note solver documentation. Not used for LP. 
    }
    if ( runlevel.UseHierarchicalSolverAbsTolerance() ) 
    {
      goal.AbsTolerance( runlevel.HierarchicalCPLEXAbsTolerance() ); 
    }
  *]
  InterfaceProperties { Accessibility: 'Module' }
}