revamp CP export model, swig it in c# + simple test

This commit is contained in:
Laurent Perron
2017-03-24 14:10:29 -04:00
parent 83106a9823
commit 15bc5959cd
8 changed files with 51 additions and 35 deletions

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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\

View File

@@ -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);

View File

@@ -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);

View File

@@ -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"

View File

@@ -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()

View File

@@ -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 {