revamp CP export model, swig it in c# + simple test
This commit is contained in:
@@ -318,7 +318,7 @@ int Run() {
|
||||
FLAGS_collect_variables) {
|
||||
Solver solver(model_proto.model());
|
||||
std::vector<SearchMonitor*> monitors;
|
||||
if (!solver.LoadModel(model_proto, &monitors)) {
|
||||
if (!solver.LoadModelWithSearchMonitors(model_proto, &monitors)) {
|
||||
LOG(INFO) << "Could not load model into the solver";
|
||||
return kProblem;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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\
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<SearchMonitor*>& monitors,
|
||||
CpModel* const proto) const;
|
||||
CpModel ExportModelWithSearchMonitors(
|
||||
const std::vector<SearchMonitor*>& 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<SearchMonitor*>& monitors,
|
||||
CpModel* const proto, DecisionBuilder* const db) const;
|
||||
CpModel ExportModelWithSearchMonitorsAndDecisionBuilder(
|
||||
const std::vector<SearchMonitor*>& 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<SearchMonitor*>* monitors);
|
||||
bool LoadModelWithSearchMonitors(
|
||||
const CpModel& proto, std::vector<SearchMonitor*>* monitors);
|
||||
// Upgrades the model to the latest version.
|
||||
static bool UpgradeModel(CpModel* const proto);
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -2434,39 +2434,34 @@ bool CpModelLoader::ScanOneArgument(int type_index, const CpArgument& arg_proto,
|
||||
|
||||
// ----- Solver API -----
|
||||
|
||||
void Solver::ExportModel(const std::vector<SearchMonitor*>& monitors,
|
||||
CpModel* const model_proto,
|
||||
DecisionBuilder* const db) const {
|
||||
CHECK(model_proto != nullptr);
|
||||
CpModel Solver::ExportModelWithSearchMonitorsAndDecisionBuilder(
|
||||
const std::vector<SearchMonitor*>& 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<SearchMonitor*>& 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<SearchMonitor*>& 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<SearchMonitor*> 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<SearchMonitor*>* monitors) {
|
||||
bool Solver::LoadModelWithSearchMonitors(
|
||||
const CpModel& model_proto,
|
||||
std::vector<SearchMonitor*>* monitors) {
|
||||
if (model_proto.version() > kModelVersion) {
|
||||
LOG(ERROR) << "Model protocol buffer version is greater than"
|
||||
<< " the one compiled in the reader (" << model_proto.version()
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user