Files
ortools-clone/ortools/constraint_solver/visitor.cc

260 lines
8.4 KiB
C++
Raw Normal View History

2025-01-10 11:35:44 +01:00
// Copyright 2010-2025 Google LLC
// 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 <cstddef>
2021-04-01 12:13:35 +02:00
#include <cstdint>
2018-06-08 16:40:43 +02:00
#include <string>
2022-07-22 14:35:40 +02:00
#include <utility>
#include <vector>
dotnet: Remove reference to dotnet release command - Currently not implemented... Add abseil patch - Add patches/absl-config.cmake Makefile: Add abseil-cpp on unix - Force abseil-cpp SHA1 to 45221cc note: Just before the PR #136 which break all CMake Makefile: Add abseil-cpp on windows - Force abseil-cpp SHA1 to 45221cc note: Just before the PR #136 which break all CMake CMake: Add abseil-cpp - Force abseil-cpp SHA1 to 45221cc note: Just before the PR #136 which break all CMake port to absl: C++ Part - Fix warning with the use of ABSL_MUST_USE_RESULT > The macro must appear as the very first part of a function declaration or definition: ... Note: past advice was to place the macro after the argument list. src: dependencies/sources/abseil-cpp-master/absl/base/attributes.h:418 - Rename enum after windows clash - Remove non compact table constraints - Change index type from int64 to int in routing library - Fix file_nonport compilation on windows - Fix another naming conflict with windows (NO_ERROR is a macro) - Cleanup hash containers; work on sat internals - Add optional_boolean sub-proto Sync cpp examples with internal code - reenable issue173 after reducing number of loops port to absl: Python Part - Add back cp_model.INT32_MIN|MAX for examples Update Python examples - Add random_tsp.py - Run words_square example - Run magic_square in python tests port to absl: Java Part - Fix compilation of the new routing parameters in java - Protect some code from SWIG parsing Update Java Examples port to absl: .Net Part Update .Net examples work on sat internals; Add C++ CP-SAT CpModelBuilder API; update sample code and recipes to use the new API; sync with internal code Remove VS 2015 in Appveyor-CI - abseil-cpp does not support VS 2015... improve tables upgrade C++ sat examples to use the new API; work on sat internals update license dates rewrite jobshop_ft06_distance.py to use the CP-SAT solver rename last example revert last commit more work on SAT internals fix
2018-10-31 16:18:18 +01:00
#include "absl/container/flat_hash_map.h"
#include "absl/log/check.h"
#include "ortools/base/map_util.h"
#include "ortools/constraint_solver/constraint_solver.h"
#include "ortools/constraint_solver/constraint_solveri.h"
#include "ortools/util/tuple_set.h"
namespace operations_research {
// ---------- ArgumentHolder ----------
2020-10-29 14:25:39 +01:00
const std::string& ArgumentHolder::TypeName() const { return type_name_; }
2020-10-29 14:25:39 +01:00
void ArgumentHolder::SetTypeName(const std::string& type_name) {
type_name_ = type_name;
}
2020-10-29 14:25:39 +01:00
void ArgumentHolder::SetIntegerArgument(const std::string& arg_name,
2021-04-01 12:13:35 +02:00
int64_t value) {
integer_argument_[arg_name] = value;
}
2021-04-01 12:13:35 +02:00
void ArgumentHolder::SetIntegerArrayArgument(
const std::string& arg_name, const std::vector<int64_t>& values) {
integer_array_argument_[arg_name] = values;
}
2020-10-29 14:25:39 +01:00
void ArgumentHolder::SetIntegerMatrixArgument(const std::string& arg_name,
const IntTupleSet& values) {
matrix_argument_.insert(std::make_pair(arg_name, values));
}
2020-10-29 14:25:39 +01:00
void ArgumentHolder::SetIntegerExpressionArgument(const std::string& arg_name,
IntExpr* const expr) {
integer_expression_argument_[arg_name] = expr;
}
void ArgumentHolder::SetIntegerVariableArrayArgument(
2020-10-29 14:25:39 +01:00
const std::string& arg_name, const std::vector<IntVar*>& vars) {
integer_variable_array_argument_[arg_name] = vars;
}
2020-10-29 14:25:39 +01:00
void ArgumentHolder::SetIntervalArgument(const std::string& arg_name,
IntervalVar* const var) {
interval_argument_[arg_name] = var;
}
void ArgumentHolder::SetIntervalArrayArgument(
2020-10-29 14:25:39 +01:00
const std::string& arg_name, const std::vector<IntervalVar*>& vars) {
interval_array_argument_[arg_name] = vars;
}
2020-10-29 14:25:39 +01:00
void ArgumentHolder::SetSequenceArgument(const std::string& arg_name,
SequenceVar* const var) {
sequence_argument_[arg_name] = var;
}
void ArgumentHolder::SetSequenceArrayArgument(
2020-10-29 14:25:39 +01:00
const std::string& arg_name, const std::vector<SequenceVar*>& vars) {
sequence_array_argument_[arg_name] = vars;
}
bool ArgumentHolder::HasIntegerExpressionArgument(
2020-10-29 14:25:39 +01:00
const std::string& arg_name) const {
return integer_expression_argument_.contains(arg_name);
}
bool ArgumentHolder::HasIntegerVariableArrayArgument(
2020-10-29 14:25:39 +01:00
const std::string& arg_name) const {
return integer_variable_array_argument_.contains(arg_name);
}
2021-04-01 12:13:35 +02:00
int64_t ArgumentHolder::FindIntegerArgumentWithDefault(
const std::string& arg_name, int64_t def) const {
return gtl::FindWithDefault(integer_argument_, arg_name, def);
}
2021-04-01 12:13:35 +02:00
int64_t ArgumentHolder::FindIntegerArgumentOrDie(
2020-10-29 14:25:39 +01:00
const std::string& arg_name) const {
return gtl::FindOrDie(integer_argument_, arg_name);
}
2021-04-01 12:13:35 +02:00
const std::vector<int64_t>& ArgumentHolder::FindIntegerArrayArgumentOrDie(
2020-10-29 14:25:39 +01:00
const std::string& arg_name) const {
return gtl::FindOrDie(integer_array_argument_, arg_name);
}
2020-10-29 14:25:39 +01:00
IntExpr* ArgumentHolder::FindIntegerExpressionArgumentOrDie(
const std::string& arg_name) const {
return gtl::FindOrDie(integer_expression_argument_, arg_name);
}
2020-10-29 14:25:39 +01:00
const std::vector<IntVar*>&
ArgumentHolder::FindIntegerVariableArrayArgumentOrDie(
const std::string& arg_name) const {
return gtl::FindOrDie(integer_variable_array_argument_, arg_name);
}
2020-10-29 14:25:39 +01:00
const IntTupleSet& ArgumentHolder::FindIntegerMatrixArgumentOrDie(
const std::string& arg_name) const {
return gtl::FindOrDie(matrix_argument_, arg_name);
}
// ---------- ModelParser ---------
ModelParser::ModelParser() {}
ModelParser::~ModelParser() { CHECK(holders_.empty()); }
2020-10-29 14:25:39 +01:00
void ModelParser::BeginVisitModel(const std::string& solver_name) {
PushArgumentHolder();
}
2020-10-29 14:25:39 +01:00
void ModelParser::EndVisitModel(const std::string& solver_name) {
PopArgumentHolder();
}
2020-10-29 14:25:39 +01:00
void ModelParser::BeginVisitConstraint(const std::string& type_name,
const Constraint* const constraint) {
PushArgumentHolder();
}
2020-10-29 14:25:39 +01:00
void ModelParser::EndVisitConstraint(const std::string& type_name,
const Constraint* const constraint) {
// Constraint parsing is usually done here.
PopArgumentHolder();
}
2020-10-29 14:25:39 +01:00
void ModelParser::BeginVisitIntegerExpression(const std::string& type_name,
const IntExpr* const expr) {
PushArgumentHolder();
}
2020-10-29 14:25:39 +01:00
void ModelParser::EndVisitIntegerExpression(const std::string& type_name,
const IntExpr* const expr) {
// Expression parsing is usually done here.
PopArgumentHolder();
}
2020-10-29 14:25:39 +01:00
void ModelParser::VisitIntegerVariable(const IntVar* const variable,
IntExpr* const delegate) {
// Usual place for parsing.
}
2020-10-29 14:25:39 +01:00
void ModelParser::VisitIntegerVariable(const IntVar* const variable,
const std::string& operation,
2021-04-01 12:13:35 +02:00
int64_t value, IntVar* const delegate) {
delegate->Accept(this);
// Usual place for parsing.
}
2020-10-29 14:25:39 +01:00
void ModelParser::VisitIntervalVariable(const IntervalVar* const variable,
const std::string& operation,
2021-04-01 12:13:35 +02:00
int64_t value,
2020-10-29 14:25:39 +01:00
IntervalVar* const delegate) {
if (delegate != nullptr) {
delegate->Accept(this);
}
// Usual place for parsing.
}
2020-10-29 14:25:39 +01:00
void ModelParser::VisitSequenceVariable(const SequenceVar* const variable) {
// Usual place for parsing.
}
// Integer arguments
2020-10-29 14:25:39 +01:00
void ModelParser::VisitIntegerArgument(const std::string& arg_name,
2021-04-01 12:13:35 +02:00
int64_t value) {
Top()->SetIntegerArgument(arg_name, value);
}
2021-04-01 12:13:35 +02:00
void ModelParser::VisitIntegerArrayArgument(
const std::string& arg_name, const std::vector<int64_t>& values) {
Top()->SetIntegerArrayArgument(arg_name, values);
}
2020-10-29 14:25:39 +01:00
void ModelParser::VisitIntegerMatrixArgument(const std::string& arg_name,
const IntTupleSet& values) {
Top()->SetIntegerMatrixArgument(arg_name, values);
}
// Variables.
2020-10-29 14:25:39 +01:00
void ModelParser::VisitIntegerExpressionArgument(const std::string& arg_name,
IntExpr* const argument) {
Top()->SetIntegerExpressionArgument(arg_name, argument);
argument->Accept(this);
}
void ModelParser::VisitIntegerVariableArrayArgument(
2020-10-29 14:25:39 +01:00
const std::string& arg_name, const std::vector<IntVar*>& arguments) {
Top()->SetIntegerVariableArrayArgument(arg_name, arguments);
for (int i = 0; i < arguments.size(); ++i) {
arguments[i]->Accept(this);
}
}
// Visit interval argument.
2020-10-29 14:25:39 +01:00
void ModelParser::VisitIntervalArgument(const std::string& arg_name,
IntervalVar* const argument) {
Top()->SetIntervalArgument(arg_name, argument);
argument->Accept(this);
}
void ModelParser::VisitIntervalArrayArgument(
2020-10-29 14:25:39 +01:00
const std::string& arg_name, const std::vector<IntervalVar*>& arguments) {
Top()->SetIntervalArrayArgument(arg_name, arguments);
for (int i = 0; i < arguments.size(); ++i) {
arguments[i]->Accept(this);
}
}
// Visit sequence argument.
2020-10-29 14:25:39 +01:00
void ModelParser::VisitSequenceArgument(const std::string& arg_name,
SequenceVar* const argument) {
Top()->SetSequenceArgument(arg_name, argument);
argument->Accept(this);
}
void ModelParser::VisitSequenceArrayArgument(
2020-10-29 14:25:39 +01:00
const std::string& arg_name, const std::vector<SequenceVar*>& arguments) {
Top()->SetSequenceArrayArgument(arg_name, arguments);
for (int i = 0; i < arguments.size(); ++i) {
arguments[i]->Accept(this);
}
}
void ModelParser::PushArgumentHolder() {
holders_.push_back(new ArgumentHolder);
}
void ModelParser::PopArgumentHolder() {
CHECK(!holders_.empty());
delete holders_.back();
holders_.pop_back();
}
2020-10-29 14:25:39 +01:00
ArgumentHolder* ModelParser::Top() const {
CHECK(!holders_.empty());
return holders_.back();
}
2020-10-22 23:36:58 +02:00
} // namespace operations_research