diff --git a/examples/cpp/model_util.cc b/examples/cpp/model_util.cc index 8e572f3b2e..6b186f7092 100644 --- a/examples/cpp/model_util.cc +++ b/examples/cpp/model_util.cc @@ -318,7 +318,7 @@ int Run() { FLAGS_collect_variables) { Solver solver(model_proto.model()); std::vector monitors; - if (!solver.LoadModel(model_proto, &monitors)) { + if (!solver.LoadModelWithSearchMonitors(model_proto, &monitors)) { LOG(INFO) << "Could not load model into the solver"; return kProblem; } diff --git a/examples/tests/testcp.cs b/examples/tests/testcp.cs index 9695772663..7b49cfae81 100644 --- a/examples/tests/testcp.cs +++ b/examples/tests/testcp.cs @@ -595,6 +595,16 @@ public class CsTestCpOperator "GetHoles() iterator, or the WhenDomain() demon invocation."); } + static void CpModelTest() { + Solver solver = new Solver("TestConstraint"); + IntVar x = solver.MakeIntVar(0, 10, "x"); + IntVar y = solver.MakeIntVar(0, 10, "y"); + solver.Add(x + y == 5); + CpModel model = solver.ExportModel(); + + Console.WriteLine(model); + } + static void Main() { ConstructorsTest(); ConstraintWithExprTest(); @@ -607,6 +617,7 @@ public class CsTestCpOperator FailingConstraintTest(); DomainIteratorTest(); HoleIteratorTest(); + CpModelTest(); if (error_count_ != 0) { Console.WriteLine("Found " + error_count_ + " errors."); Environment.Exit(1); diff --git a/makefiles/Makefile.csharp.mk b/makefiles/Makefile.csharp.mk index 347b4b778d..bde7d6aef7 100755 --- a/makefiles/Makefile.csharp.mk +++ b/makefiles/Makefile.csharp.mk @@ -204,6 +204,9 @@ $(GEN_DIR)/com/google/ortools/constraintsolver/SearchLimit.g.cs: $(SRC_DIR)/cons $(GEN_DIR)/com/google/ortools/constraintsolver/SolverParameters.g.cs: $(SRC_DIR)/constraint_solver/solver_parameters.proto $(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sconstraint_solver$Ssolver_parameters.proto +$(GEN_DIR)/com/google/ortools/constraintsolver/Model.g.cs: $(SRC_DIR)/constraint_solver/solver_parameters.proto + $(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sconstraint_solver$Smodel.proto + $(GEN_DIR)/com/google/ortools/constraintsolver/RoutingParameters.g.cs: $(SRC_DIR)/constraint_solver/routing_parameters.proto $(PROTOBUF_DIR)/bin/protoc --proto_path=$(SRC_DIR) --csharp_out=$(GEN_DIR)$Scom$Sgoogle$Sortools$Sconstraintsolver --csharp_opt=file_extension=.g.cs $(SRC_DIR)$Sconstraint_solver$Srouting_parameters.proto @@ -239,6 +242,7 @@ $(BIN_DIR)/$(CLR_ORTOOLS_DLL_NAME)$(DLL): \ $(SRC_DIR)/com/google/ortools/linearsolver/VariableHelper.cs \ $(SRC_DIR)/com/google/ortools/util/NestedArrayHelper.cs \ $(SRC_DIR)/com/google/ortools/util/ProtoHelper.cs \ + $(GEN_DIR)/com/google/ortools/constraintsolver/Model.g.cs\ $(GEN_DIR)/com/google/ortools/constraintsolver/SearchLimit.g.cs\ $(GEN_DIR)/com/google/ortools/constraintsolver/SolverParameters.g.cs\ $(GEN_DIR)/com/google/ortools/constraintsolver/RoutingParameters.g.cs\ diff --git a/src/constraint_solver/constraint_solver.cc b/src/constraint_solver/constraint_solver.cc index 243d3f6398..b30d8771a0 100644 --- a/src/constraint_solver/constraint_solver.cc +++ b/src/constraint_solver/constraint_solver.cc @@ -1671,8 +1671,7 @@ void Solver::ProcessConstraints() { if (!file::Open(export_file, "wb", &file, file::Defaults()).ok()) { LOG(WARNING) << "Cannot open " << export_file; } else { - CpModel export_proto; - ExportModel(&export_proto); + CpModel export_proto = ExportModel(); VLOG(1) << export_proto.DebugString(); RecordWriter writer(file); writer.WriteProtocolMessage(export_proto); diff --git a/src/constraint_solver/constraint_solver.h b/src/constraint_solver/constraint_solver.h index b08450b352..b2c40c370c 100644 --- a/src/constraint_solver/constraint_solver.h +++ b/src/constraint_solver/constraint_solver.h @@ -982,20 +982,22 @@ class Solver { // Exports the model to protobuf. This code will be called // from inside the solver during the start of the search. - void ExportModel(CpModel* const proto) const; + CpModel ExportModel() const; // Exports the model to protobuf. Search monitors are useful to pass // the objective and limits to the protobuf. - void ExportModel(const std::vector& monitors, - CpModel* const proto) const; + CpModel ExportModelWithSearchMonitors( + const std::vector& monitors) const; // Exports the model to protobuf. Search monitors are useful to pass // the objective and limits to the protobuf. - void ExportModel(const std::vector& monitors, - CpModel* const proto, DecisionBuilder* const db) const; + CpModel ExportModelWithSearchMonitorsAndDecisionBuilder( + const std::vector& monitors, + DecisionBuilder* const db) const; // Loads the model into the solver, and returns true upon success. bool LoadModel(const CpModel& proto); // Loads the model into the solver, appends search monitors to monitors, // and returns true upon success. - bool LoadModel(const CpModel& proto, std::vector* monitors); + bool LoadModelWithSearchMonitors( + const CpModel& proto, std::vector* monitors); // Upgrades the model to the latest version. static bool UpgradeModel(CpModel* const proto); diff --git a/src/constraint_solver/csharp/constraint_solver.swig b/src/constraint_solver/csharp/constraint_solver.swig index d468900030..1022638a36 100644 --- a/src/constraint_solver/csharp/constraint_solver.swig +++ b/src/constraint_solver/csharp/constraint_solver.swig @@ -36,11 +36,6 @@ class SearchLimitParameters; %module(directors="1", allprotected="1") operations_research; #pragma SWIG nowarn=473 -%typemap(javaimports) operations_research::Solver %{ -import com.google.ortools.constraintsolver.ConstraintSolverParameters; -import com.google.ortools.constraintsolver.SearchLimitParameters; -%} - %feature("director") BaseLns; %feature("director") Decision; %feature("director") DecisionBuilder; @@ -878,6 +873,12 @@ PROTO_INPUT(operations_research::SearchLimitParameters, PROTO2_RETURN(operations_research::SearchLimitParameters, Google.OrTools.ConstraintSolver.SearchLimitParameters) +PROTO_INPUT(operations_research::CpModel, + Google.OrTools.ConstraintSolver.CpModel, + proto) +PROTO2_RETURN(operations_research::CpModel, + Google.OrTools.ConstraintSolver.CpModel) + // Wrap cp includes %include "constraint_solver/constraint_solver.h" %include "constraint_solver/constraint_solveri.h" diff --git a/src/constraint_solver/io.cc b/src/constraint_solver/io.cc index 4c67037c5b..1f0568d36c 100644 --- a/src/constraint_solver/io.cc +++ b/src/constraint_solver/io.cc @@ -2434,39 +2434,34 @@ bool CpModelLoader::ScanOneArgument(int type_index, const CpArgument& arg_proto, // ----- Solver API ----- -void Solver::ExportModel(const std::vector& monitors, - CpModel* const model_proto, - DecisionBuilder* const db) const { - CHECK(model_proto != nullptr); +CpModel Solver::ExportModelWithSearchMonitorsAndDecisionBuilder( + const std::vector& monitors, + DecisionBuilder* const db) const { + CpModel model_proto; FirstPassVisitor first_pass; Accept(&first_pass, monitors, db); - SecondPassVisitor second_pass(first_pass, model_proto); + SecondPassVisitor second_pass(first_pass, &model_proto); Accept(&second_pass, monitors, db); + return model_proto; } -void Solver::ExportModel(const std::vector& monitors, - CpModel* const model_proto) const { - CHECK(model_proto != nullptr); - FirstPassVisitor first_pass; - Accept(&first_pass, monitors); - SecondPassVisitor second_pass(first_pass, model_proto); - Accept(&second_pass, monitors); +CpModel Solver::ExportModelWithSearchMonitors( + const std::vector& monitors) const { + return ExportModelWithSearchMonitorsAndDecisionBuilder(monitors, nullptr); } -void Solver::ExportModel(CpModel* const model_proto) const { - CHECK(model_proto != nullptr); - FirstPassVisitor first_pass; - Accept(&first_pass); - SecondPassVisitor second_pass(first_pass, model_proto); - Accept(&second_pass); +CpModel Solver::ExportModel() const { + std::vector monitors; + return ExportModelWithSearchMonitorsAndDecisionBuilder(monitors, nullptr); } bool Solver::LoadModel(const CpModel& model_proto) { - return LoadModel(model_proto, nullptr); + return LoadModelWithSearchMonitors(model_proto, nullptr); } -bool Solver::LoadModel(const CpModel& model_proto, - std::vector* monitors) { +bool Solver::LoadModelWithSearchMonitors( + const CpModel& model_proto, + std::vector* monitors) { if (model_proto.version() > kModelVersion) { LOG(ERROR) << "Model protocol buffer version is greater than" << " the one compiled in the reader (" << model_proto.version() diff --git a/src/constraint_solver/model.proto b/src/constraint_solver/model.proto index 8b3130e154..854c951e14 100644 --- a/src/constraint_solver/model.proto +++ b/src/constraint_solver/model.proto @@ -15,6 +15,10 @@ syntax = "proto3"; import "constraint_solver/search_limit.proto"; +option java_package = "com.google.ortools.constraintsolver"; +option java_multiple_files = true; +option csharp_namespace = "Google.OrTools.ConstraintSolver"; + package operations_research; message CpIntegerMatrix {