OR-Tools  9.6
cp_sat_solver.h
Go to the documentation of this file.
1 // Copyright 2010-2022 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 #ifndef OR_TOOLS_MATH_OPT_SOLVERS_CP_SAT_SOLVER_H_
15 #define OR_TOOLS_MATH_OPT_SOLVERS_CP_SAT_SOLVER_H_
16 
17 #include <cstdint>
18 #include <memory>
19 #include <vector>
20 
21 #include "absl/status/status.h"
22 #include "absl/status/statusor.h"
23 #include "absl/types/span.h"
24 #include "ortools/linear_solver/linear_solver.pb.h"
25 #include "ortools/math_opt/callback.pb.h"
29 #include "ortools/math_opt/model.pb.h"
30 #include "ortools/math_opt/model_parameters.pb.h"
31 #include "ortools/math_opt/model_update.pb.h"
32 #include "ortools/math_opt/parameters.pb.h"
33 #include "ortools/math_opt/result.pb.h"
34 #include "ortools/math_opt/sparse_containers.pb.h"
35 
36 namespace operations_research {
37 namespace math_opt {
38 
39 class CpSatSolver : public SolverInterface {
40  public:
41  static absl::StatusOr<std::unique_ptr<SolverInterface>> New(
42  const ModelProto& model, const InitArgs& init_args);
43 
44  absl::StatusOr<SolveResultProto> Solve(
45  const SolveParametersProto& parameters,
46  const ModelSolveParametersProto& model_parameters,
47  MessageCallback message_cb,
48  const CallbackRegistrationProto& callback_registration, Callback cb,
49  SolveInterrupter* interrupter) override;
50  absl::StatusOr<bool> Update(const ModelUpdateProto& model_update) override;
51 
52  private:
53  CpSatSolver(MPModelProto cp_sat_model, std::vector<int64_t> variable_ids,
54  std::vector<int64_t> linear_constraint_ids);
55 
56  // Extract the solution from CP-SAT's response.
57  SparseDoubleVectorProto ExtractSolution(
58  absl::Span<const double> cp_sat_variable_values,
59  const SparseVectorFilterProto& filter) const;
60 
61  // Returns the ids of variables and linear constraints with inverted bounds.
62  InvertedBounds ListInvertedBounds() const;
63 
64  const MPModelProto cp_sat_model_;
65 
66  // For the i-th variable in `cp_sat_model_`, `variable_ids_[i]` contains the
67  // corresponding id in the input `Model`.
68  const std::vector<int64_t> variable_ids_;
69 
70  // For the i-th linear constraint in `cp_sat_model_`,
71  // `linear_constraint_ids_[i]` contains the corresponding id in the input
72  // `Model`.
73  const std::vector<int64_t> linear_constraint_ids_;
74 };
75 
76 } // namespace math_opt
77 } // namespace operations_research
78 
79 #endif // OR_TOOLS_MATH_OPT_SOLVERS_CP_SAT_SOLVER_H_
absl::StatusOr< bool > Update(const ModelUpdateProto &model_update) override
static absl::StatusOr< std::unique_ptr< SolverInterface > > New(const ModelProto &model, const InitArgs &init_args)
absl::StatusOr< SolveResultProto > Solve(const SolveParametersProto &parameters, const ModelSolveParametersProto &model_parameters, MessageCallback message_cb, const CallbackRegistrationProto &callback_registration, Callback cb, SolveInterrupter *interrupter) override
std::function< void(const std::vector< std::string > &)> MessageCallback
std::function< absl::StatusOr< CallbackResultProto >(const CallbackDataProto &)> Callback
SatParameters parameters
absl::Span< const int64_t > variable_ids
GRBmodel * model
Collection of objects used to extend the Constraint Solver library.