Lai,Risheng
2023-11-02 30c02e0c981b16be0918483543f4b812956c45d4
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
Quintiq file version 2.0
#parent: #root
Method CanRescueSolution (
  MathematicalProgram program,
  LibOpt_Task task
) as Boolean
{
  Description: 'In MathematicalProgram Handle Infeasible tab, this method can be called to check if your infeasible solution has sufficient quality to try using it despite the reported infeasibility with CPLEX default settings.'
  TextBody:
  [*
    // lauri Feb-24-2014 (created)
    statistics := program.Statistics();
    feasabilitytolerance := 100 * guard( select( this.CurrentSubOptimizerLevel().GetStrategyLevelMacroPlan(), SolverSettingGroupMacroPlan.SolverSettingMacroPlan, s, s.ParameterNumber() = 1016 ).ParameterValue(), 
                                        1e-6 ); // cplex default if 1016 is not set
    
    info( 'goal value:', guard( [String]program.GoalValue(), 'not available' ) ); 
    info(  'Feasibility tolerance = ', feasabilitytolerance ); 
    info( 'Solver has the following bound violation statistics:' );
    info( 'primal infeasibility: ', statistics.MaxPrimalInfeasibility().Format( 'N(Scientific)' ), 'scaled:', statistics.MaxScaledPrimalInfeasibility().Format( 'N(Scientific)' ) );
    info( 'primal residual: ', statistics.MaxPrimalResidual().Format( 'N(Scientific)' ), 'scaled:', statistics.MaxScaledPrimalResidual().Format( 'N(Scientific)' ) );
    
    info( 'dual infeasibility: ', statistics.MaxDualInfeasibility().Format( 'N(Scientific)' ), 'scaled:', statistics.MaxScaledDualInfeasibility().Format( 'N(Scientific)' ) );
    info( 'dual residual: ', statistics.MaxDualResidual().Format( 'N(Scientific)' ), 'scaled:', statistics.MaxScaledDualResidual().Format( 'N(Scientific)' ) );
    
    info( 'max integer infeasibility: ', statistics.MaxIntInfeasibility().Format( 'N(Scientific)' ), '[tolerance=', program.MIPIntegralityTolerance(), ']' );
    
    maxboundviolation := maxvalue( statistics.MaxScaledPrimalInfeasibility(),
                                   statistics.MaxScaledPrimalResidual(),
                                   statistics.MaxScaledDualInfeasibility(),   //only for LP
                                   statistics.MaxScaledDualResidual() );         //only for LP
    
    
    
    
    canberescued := program.HasSolution() and maxboundviolation <= feasabilitytolerance and statistics.MaxIntInfeasibility() <= program.MIPIntegralityTolerance();
    
    task.Log( 'hassoln=' + [String] program.HasSolution() + 'feas(scaled)='+ [String] maxboundviolation + 'intfeas=' + [String] statistics.MaxIntInfeasibility() ); 
    
    info(  ifexpr(  canberescued, 'Solution accepted', 'Solution discarded' ) ); 
    
    if(  not canberescued 
         and this.GetRunContextConst().IsMetaIteration() 
         and this.GetRunContextMeta().OptionDebugCPLEXVariablesConstraints() ) 
    {
      snapshot := task.Run().Snapshot( relnew, SnapshotMacroPlannerOptimizer ); 
      OptimizerDebugCPLEXLogEntry::CheckVariables( snapshot, program.astype( CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm ) ); 
      OptimizerDebugCPLEXLogEntry::CheckConstraints( snapshot, program.astype( CapacityPlanningSuboptimizer_CapacityPlanningAlgorithm ) ); 
    }
    
    return canberescued;
  *]
  InterfaceProperties { Accessibility: 'Module' }
}