2025-01-10 11:35:44 +01:00
|
|
|
// Copyright 2010-2025 Google LLC
|
2020-03-10 08:38:00 +01:00
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
|
//
|
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
//
|
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
|
|
#include "ortools/linear_solver/linear_solver_callback.h"
|
|
|
|
|
|
2022-05-18 16:36:05 +02:00
|
|
|
#include <string>
|
2022-07-22 14:35:40 +02:00
|
|
|
#include <vector>
|
2022-05-18 16:36:05 +02:00
|
|
|
|
2020-03-10 08:38:00 +01:00
|
|
|
#include "ortools/base/logging.h"
|
|
|
|
|
|
|
|
|
|
namespace operations_research {
|
|
|
|
|
|
|
|
|
|
std::string ToString(MPCallbackEvent event) {
|
|
|
|
|
switch (event) {
|
2020-10-22 23:36:58 +02:00
|
|
|
case MPCallbackEvent::kMipSolution:
|
|
|
|
|
return "MIP_SOLUTION";
|
|
|
|
|
case MPCallbackEvent::kMip:
|
|
|
|
|
return "MIP";
|
|
|
|
|
case MPCallbackEvent::kMipNode:
|
|
|
|
|
return "MIP_NODE";
|
|
|
|
|
case MPCallbackEvent::kBarrier:
|
|
|
|
|
return "BARRIER";
|
|
|
|
|
case MPCallbackEvent::kMessage:
|
|
|
|
|
return "MESSAGE";
|
|
|
|
|
case MPCallbackEvent::kPresolve:
|
|
|
|
|
return "PRESOLVE";
|
|
|
|
|
case MPCallbackEvent::kPolling:
|
|
|
|
|
return "POLLING";
|
|
|
|
|
case MPCallbackEvent::kMultiObj:
|
|
|
|
|
return "MULTI_OBJ";
|
|
|
|
|
case MPCallbackEvent::kSimplex:
|
|
|
|
|
return "SIMPLEX";
|
|
|
|
|
case MPCallbackEvent::kUnknown:
|
|
|
|
|
return "UNKNOWN";
|
|
|
|
|
default:
|
|
|
|
|
LOG(FATAL) << "Unrecognized callback event: " << static_cast<int>(event);
|
2020-03-10 08:38:00 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
// Returns true if any of the callbacks in a list might add cuts.
|
2020-10-28 13:42:36 +01:00
|
|
|
bool CallbacksMightAddCuts(const std::vector<MPCallback*>& callbacks) {
|
|
|
|
|
for (MPCallback* callback : callbacks) {
|
2020-03-10 08:38:00 +01:00
|
|
|
if (callback->might_add_cuts()) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Returns true if any of the callbacks in a list might add lazy constraints.
|
2020-10-22 23:36:58 +02:00
|
|
|
bool CallbacksMightAddLazyConstraints(
|
2020-10-28 13:42:36 +01:00
|
|
|
const std::vector<MPCallback*>& callbacks) {
|
|
|
|
|
for (MPCallback* callback : callbacks) {
|
2020-03-10 08:38:00 +01:00
|
|
|
if (callback->might_add_lazy_constraints()) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-22 23:36:58 +02:00
|
|
|
} // namespace
|
2020-03-10 08:38:00 +01:00
|
|
|
|
2020-10-28 13:42:36 +01:00
|
|
|
MPCallbackList::MPCallbackList(const std::vector<MPCallback*>& callbacks)
|
2020-03-10 08:38:00 +01:00
|
|
|
: MPCallback(CallbacksMightAddCuts(callbacks),
|
|
|
|
|
CallbacksMightAddLazyConstraints(callbacks)),
|
|
|
|
|
callbacks_(callbacks) {}
|
|
|
|
|
|
2020-10-28 13:42:36 +01:00
|
|
|
void MPCallbackList::RunCallback(MPCallbackContext* context) {
|
|
|
|
|
for (MPCallback* callback : callbacks_) {
|
2020-03-10 08:38:00 +01:00
|
|
|
callback->RunCallback(context);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-10-22 23:36:58 +02:00
|
|
|
} // namespace operations_research
|