LotSizingDataModel.Solver.Cplex 2.0.1
IBM ILOG CPLEX adapter and installation discovery integration.
Loading...
Searching...
No Matches
CplexParameterMapper.cs
Go to the documentation of this file.
1using System;
2using System.Collections.Generic;
3using ILOG.CPLEX;
4using NativeCplex = global::ILOG.CPLEX.Cplex;
5using LotSizingDataModel.Solver.Configuration;
6
8
9/// <summary>
10/// Maps normalized solver parameters to stable CPLEX
11/// parameters.
12/// </summary>
13public sealed class CplexParameterMapper
14{
15 /// <summary>
16 /// Applies normalized parameters and returns diagnostics for
17 /// parameters intentionally deferred to later adapter
18 /// versions.
19 /// </summary>
20 /// <param name="cplex">
21 /// Native CPLEX model.
22 /// </param>
23 /// <param name="parameters">
24 /// Normalized solver parameters.
25 /// </param>
26 /// <returns>
27 /// Diagnostic messages for parameters not translated by this
28 /// adapter version.
29 /// </returns>
30 public IReadOnlyList<string> Apply(
31 NativeCplex cplex,
32 SolverParameters parameters)
33 {
34 ArgumentNullException.ThrowIfNull(cplex);
35 ArgumentNullException.ThrowIfNull(parameters);
36
37 parameters.EnsureValid();
38
39 var diagnostics =
40 new List<string>();
41
42 if (parameters.TimeLimitSeconds.HasValue)
43 {
44 cplex.SetParam(
45 NativeCplex.Param.TimeLimit,
46 parameters.TimeLimitSeconds.Value);
47 }
48
49 if (parameters.ThreadCount.HasValue)
50 {
51 cplex.SetParam(
52 NativeCplex.Param.Threads,
53 parameters.ThreadCount.Value);
54 }
55
56 if (parameters.RelativeMipGap.HasValue)
57 {
58 cplex.SetParam(
59 NativeCplex.Param.MIP.Tolerances.MIPGap,
60 parameters.RelativeMipGap.Value);
61 }
62
63 if (parameters.AbsoluteMipGap.HasValue)
64 {
65 cplex.SetParam(
66 NativeCplex.Param.MIP.Tolerances.AbsMIPGap,
67 parameters.AbsoluteMipGap.Value);
68 }
69
70 if (parameters.NodeLimit.HasValue)
71 {
72 cplex.SetParam(
73 NativeCplex.Param.MIP.Limits.Nodes,
74 parameters.NodeLimit.Value);
75 }
76
77 if (parameters.SolutionLimit.HasValue)
78 {
79 cplex.SetParam(
80 NativeCplex.Param.MIP.Limits.Solutions,
81 (long)parameters.SolutionLimit.Value);
82 }
83
84 AddDeferredDiagnostic(
85 diagnostics,
86 parameters.RandomSeed.HasValue,
87 nameof(parameters.RandomSeed));
88
89 AddDeferredDiagnostic(
90 diagnostics,
91 parameters.IterationLimit.HasValue,
92 nameof(parameters.IterationLimit));
93
94 AddDeferredDiagnostic(
95 diagnostics,
96 parameters.MemoryLimitMegabytes.HasValue,
97 nameof(parameters.MemoryLimitMegabytes));
98
99 AddDeferredDiagnostic(
100 diagnostics,
101 parameters.EnablePresolve.HasValue,
102 nameof(parameters.EnablePresolve));
103
104 AddDeferredDiagnostic(
105 diagnostics,
106 parameters.EnableCuts.HasValue,
107 nameof(parameters.EnableCuts));
108
109 AddDeferredDiagnostic(
110 diagnostics,
111 parameters.EnableHeuristics.HasValue,
112 nameof(parameters.EnableHeuristics));
113
114 AddDeferredDiagnostic(
115 diagnostics,
116 parameters.DeterministicMode,
117 nameof(parameters.DeterministicMode));
118
119 if (parameters.NativeParameters.Count > 0)
120 {
121 diagnostics.Add(
122 "CPLEX native string parameters are not yet " +
123 "translated by this adapter version.");
124 }
125
126 return diagnostics;
127 }
128
129 private static void AddDeferredDiagnostic(
130 ICollection<string> diagnostics,
131 bool condition,
132 string parameterName)
133 {
134 if (!condition)
135 {
136 return;
137 }
138
139 diagnostics.Add(
140 $"Generic parameter '{parameterName}' is valid but " +
141 "is not yet translated by this CPLEX adapter version.");
142 }
143}
global::ILOG.CPLEX.Cplex NativeCplex
Maps normalized solver parameters to stable CPLEX parameters.
IReadOnlyList< string > Apply(NativeCplex cplex, SolverParameters parameters)
Applies normalized parameters and returns diagnostics for parameters intentionally deferred to later ...