1 // Copyright 2010-2021 Google LLC
2 // Licensed under the Apache License, Version 2.0 (the "License");
3 // you may not use this file except in compliance with the License.
4 // You may obtain a copy of the License at
5 //
6 //     http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13 
14 #include "ortools/gscip/gscip_parameters.h"
15 
16 #include "ortools/base/logging.h"
17 
18 namespace operations_research {
19 
20 // NOTE(user): the open source build for proto is less accepting of
21 // absl::string_view than internally, so we do more conversions than would
22 // appear necessary.
23 namespace {
24 constexpr absl::string_view kLimitsTime = "limits/time";
25 constexpr absl::string_view kParallelMaxNThreads = "parallel/maxnthreads";
26 constexpr absl::string_view kDisplayVerbLevel = "display/verblevel";
27 constexpr absl::string_view kRandomSeedParam = "randomization/randomseedshift";
28 constexpr absl::string_view kCatchCtrlCParam = "misc/catchctrlc";
29 }  // namespace
30 
GScipSetTimeLimit(absl::Duration time_limit,GScipParameters * parameters)31 void GScipSetTimeLimit(absl::Duration time_limit, GScipParameters* parameters) {
32   if (time_limit < absl::Seconds(1e20) && time_limit > absl::Duration()) {
33     (*parameters->mutable_real_params())[std::string(kLimitsTime)] =
34         absl::ToDoubleSeconds(time_limit);
35   } else {
36     parameters->mutable_real_params()->erase(std::string(kLimitsTime));
37   }
38 }
39 
GScipTimeLimit(const GScipParameters & parameters)40 absl::Duration GScipTimeLimit(const GScipParameters& parameters) {
41   if (parameters.real_params().contains(std::string(kLimitsTime))) {
42     const double scip_limit =
43         parameters.real_params().at(std::string(kLimitsTime));
44     if (scip_limit >= 1e20) {
45       return absl::InfiniteDuration();
46     } else if (scip_limit <= 0.0) {
47       return absl::Duration();
48     } else {
49       return absl::Seconds(scip_limit);
50     }
51   }
52   return absl::InfiniteDuration();
53 }
54 
GScipTimeLimitSet(const GScipParameters & parameters)55 bool GScipTimeLimitSet(const GScipParameters& parameters) {
56   return parameters.real_params().contains(std::string(kLimitsTime));
57 }
58 
GScipSetMaxNumThreads(int num_threads,GScipParameters * parameters)59 void GScipSetMaxNumThreads(int num_threads, GScipParameters* parameters) {
60   CHECK_GE(num_threads, 1);
61   (*parameters->mutable_int_params())[std::string(kParallelMaxNThreads)] =
62       num_threads;
63 }
64 
GScipMaxNumThreads(const GScipParameters & parameters)65 int GScipMaxNumThreads(const GScipParameters& parameters) {
66   if (parameters.int_params().contains(std::string(kParallelMaxNThreads))) {
67     return parameters.int_params().at(std::string(kParallelMaxNThreads));
68   }
69   return 1;
70 }
71 
GScipMaxNumThreadsSet(const GScipParameters & parameters)72 bool GScipMaxNumThreadsSet(const GScipParameters& parameters) {
73   return parameters.int_params().contains(std::string(kParallelMaxNThreads));
74 }
75 
GScipSetLogLevel(GScipParameters * parameters,int log_level)76 void GScipSetLogLevel(GScipParameters* parameters, int log_level) {
77   CHECK_GE(log_level, 0);
78   CHECK_LE(log_level, 5);
79   (*parameters->mutable_int_params())[std::string(kDisplayVerbLevel)] =
80       log_level;
81 }
82 
GScipLogLevel(const GScipParameters & parameters)83 int GScipLogLevel(const GScipParameters& parameters) {
84   return parameters.int_params().contains(std::string(kDisplayVerbLevel))
85              ? parameters.int_params().at(std::string(kDisplayVerbLevel))
86              : 4;
87 }
GScipLogLevelSet(const GScipParameters & parameters)88 bool GScipLogLevelSet(const GScipParameters& parameters) {
89   return parameters.int_params().contains(std::string(kDisplayVerbLevel));
90 }
91 
GScipSetOutputEnabled(GScipParameters * parameters,bool output_enabled)92 void GScipSetOutputEnabled(GScipParameters* parameters, bool output_enabled) {
93   if (output_enabled) {
94     parameters->mutable_int_params()->erase(std::string(kDisplayVerbLevel));
95   } else {
96     (*parameters->mutable_int_params())[std::string(kDisplayVerbLevel)] = 0;
97   }
98 }
GScipOutputEnabled(const GScipParameters & parameters)99 bool GScipOutputEnabled(const GScipParameters& parameters) {
100   return !parameters.int_params().contains(std::string(kDisplayVerbLevel)) ||
101          (parameters.int_params().at(std::string(kDisplayVerbLevel)) > 0);
102 }
103 
GScipOutputEnabledSet(const GScipParameters & parameters)104 bool GScipOutputEnabledSet(const GScipParameters& parameters) {
105   return GScipLogLevelSet(parameters);
106 }
107 
GScipSetRandomSeed(GScipParameters * parameters,int random_seed)108 void GScipSetRandomSeed(GScipParameters* parameters, int random_seed) {
109   random_seed = std::max(0, random_seed);
110   (*parameters->mutable_int_params())[std::string(kRandomSeedParam)] =
111       random_seed;
112 }
113 
GScipRandomSeed(const GScipParameters & parameters)114 int GScipRandomSeed(const GScipParameters& parameters) {
115   if (GScipRandomSeedSet(parameters)) {
116     return parameters.int_params().at(std::string(kRandomSeedParam));
117   }
118   return -1;  // Unset value.
119 }
120 
GScipRandomSeedSet(const GScipParameters & parameters)121 bool GScipRandomSeedSet(const GScipParameters& parameters) {
122   return parameters.int_params().contains(std::string(kRandomSeedParam));
123 }
124 
GScipSetCatchCtrlC(const bool catch_ctrl_c,GScipParameters * const parameters)125 void GScipSetCatchCtrlC(const bool catch_ctrl_c,
126                         GScipParameters* const parameters) {
127   (*parameters->mutable_bool_params())[std::string(kCatchCtrlCParam)] =
128       catch_ctrl_c;
129 }
130 
GScipCatchCtrlC(const GScipParameters & parameters)131 bool GScipCatchCtrlC(const GScipParameters& parameters) {
132   if (GScipCatchCtrlCSet(parameters)) {
133     return parameters.bool_params().at(std::string(kCatchCtrlCParam));
134   }
135   return true;
136 }
137 
GScipCatchCtrlCSet(const GScipParameters & parameters)138 bool GScipCatchCtrlCSet(const GScipParameters& parameters) {
139   return parameters.bool_params().contains(std::string(kCatchCtrlCParam));
140 }
141 
142 }  // namespace operations_research
143