diff --git a/ortools/sat/go/cpmodel/BUILD.bazel b/ortools/sat/go/cpmodel/BUILD.bazel index 707ce53b2f..25b32f8db7 100644 --- a/ortools/sat/go/cpmodel/BUILD.bazel +++ b/ortools/sat/go/cpmodel/BUILD.bazel @@ -18,8 +18,8 @@ go_library( srcs = [ "cp_model.go", "cp_solver.go", - "cp_solver_c.cc", - "cp_solver_c.h", + #"cp_solver_c.cc", + #"cp_solver_c.h", "domain.go", ], cdeps = [":cp_solver_c"], @@ -57,12 +57,12 @@ cc_library( srcs = ["cp_solver_c.cc"], hdrs = ["cp_solver_c.h"], deps = [ + "//ortools/base:memutil", "//ortools/sat:cp_model_cc_proto", "//ortools/sat:cp_model_solver", + "//ortools/sat:model", "//ortools/sat:sat_parameters_cc_proto", "//ortools/util:time_limit", - "@com_google_absl//absl/log", - "@com_google_absl//absl/status", - "@com_google_absl//absl/strings", + "@com_google_absl//absl/log:check", ], ) diff --git a/ortools/sat/go/cpmodel/cp_model.go b/ortools/sat/go/cpmodel/cp_model.go index 1822f6c55f..195aa110cc 100644 --- a/ortools/sat/go/cpmodel/cp_model.go +++ b/ortools/sat/go/cpmodel/cp_model.go @@ -578,8 +578,8 @@ func (cp *Builder) NewOptionalIntervalVar(start, size, end LinearArgument, prese Start: start.asLinearExpressionProto(), Size: size.asLinearExpressionProto(), End: end.asLinearExpressionProto(), - }, - }}) + }}, + }) return IntervalVar{cpb: cp, ind: ind} } @@ -803,11 +803,10 @@ func (cp *Builder) AddMinEquality(target LinearArgument, exprs ...LinearArgument } return cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_LinMax{ - &cmpb.LinearArgumentProto{ - Target: asNegatedLinearExpressionProto(target), - Exprs: protos, - }}, + Constraint: &cmpb.ConstraintProto_LinMax{&cmpb.LinearArgumentProto{ + Target: asNegatedLinearExpressionProto(target), + Exprs: protos, + }}, }) } @@ -819,11 +818,10 @@ func (cp *Builder) AddMaxEquality(target LinearArgument, exprs ...LinearArgument } return cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_LinMax{ - &cmpb.LinearArgumentProto{ - Target: target.asLinearExpressionProto(), - Exprs: protos, - }}, + Constraint: &cmpb.ConstraintProto_LinMax{&cmpb.LinearArgumentProto{ + Target: target.asLinearExpressionProto(), + Exprs: protos, + }}, }) } @@ -835,53 +833,49 @@ func (cp *Builder) AddMultiplicationEquality(target LinearArgument, exprs ...Lin } return cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_IntProd{ - &cmpb.LinearArgumentProto{ - Target: target.asLinearExpressionProto(), - Exprs: protos, - }}, + Constraint: &cmpb.ConstraintProto_IntProd{&cmpb.LinearArgumentProto{ + Target: target.asLinearExpressionProto(), + Exprs: protos, + }}, }) } // AddDivisionEquality adds the constraint: target == num / denom. func (cp *Builder) AddDivisionEquality(target, num, denom LinearArgument) Constraint { return cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_IntDiv{ - &cmpb.LinearArgumentProto{ - Target: target.asLinearExpressionProto(), - Exprs: []*cmpb.LinearExpressionProto{ - num.asLinearExpressionProto(), - denom.asLinearExpressionProto(), - }, - }}, + Constraint: &cmpb.ConstraintProto_IntDiv{&cmpb.LinearArgumentProto{ + Target: target.asLinearExpressionProto(), + Exprs: []*cmpb.LinearExpressionProto{ + num.asLinearExpressionProto(), + denom.asLinearExpressionProto(), + }, + }}, }) } // AddAbsEquality adds the constraint: target == Abs(expr). func (cp *Builder) AddAbsEquality(target, expr LinearArgument) Constraint { return cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_LinMax{ - &cmpb.LinearArgumentProto{ - Target: target.asLinearExpressionProto(), - Exprs: []*cmpb.LinearExpressionProto{ - expr.asLinearExpressionProto(), - asNegatedLinearExpressionProto(expr), - }, - }}, + Constraint: &cmpb.ConstraintProto_LinMax{&cmpb.LinearArgumentProto{ + Target: target.asLinearExpressionProto(), + Exprs: []*cmpb.LinearExpressionProto{ + expr.asLinearExpressionProto(), + asNegatedLinearExpressionProto(expr), + }, + }}, }) } // AddModuloEquality adds the constraint: target == v % mod. func (cp *Builder) AddModuloEquality(target, v, mod LinearArgument) Constraint { return cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_IntMod{ - &cmpb.LinearArgumentProto{ - Target: target.asLinearExpressionProto(), - Exprs: []*cmpb.LinearExpressionProto{ - v.asLinearExpressionProto(), - mod.asLinearExpressionProto(), - }, - }}, + Constraint: &cmpb.ConstraintProto_IntMod{&cmpb.LinearArgumentProto{ + Target: target.asLinearExpressionProto(), + Exprs: []*cmpb.LinearExpressionProto{ + v.asLinearExpressionProto(), + mod.asLinearExpressionProto(), + }, + }}, }) } @@ -894,27 +888,24 @@ func (cp *Builder) AddNoOverlap(vars ...IntervalVar) Constraint { } return cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_NoOverlap{ - &cmpb.NoOverlapConstraintProto{ - Intervals: intervals, - }}, + Constraint: &cmpb.ConstraintProto_NoOverlap{&cmpb.NoOverlapConstraintProto{ + Intervals: intervals, + }}, }) } // AddNoOverlap2D adds a no_overlap2D constraint that prevents a set of boxes from overlapping. func (cp *Builder) AddNoOverlap2D() NoOverlap2DConstraint { return NoOverlap2DConstraint{cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_NoOverlap_2D{ - &cmpb.NoOverlap2DConstraintProto{}, - }})} + Constraint: &cmpb.ConstraintProto_NoOverlap_2D{&cmpb.NoOverlap2DConstraintProto{}, + }})} } // AddCircuitConstraint adds a circuit constraint to the model. The circuit constraint is // defined on a graph where the arcs are present if the corresponding literals are set to true. func (cp *Builder) AddCircuitConstraint() CircuitConstraint { return CircuitConstraint{cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_Circuit{ - &cmpb.CircuitConstraintProto{}, + Constraint: &cmpb.ConstraintProto_Circuit{&cmpb.CircuitConstraintProto{}, }})} } @@ -922,9 +913,8 @@ func (cp *Builder) AddCircuitConstraint() CircuitConstraint { // (Vehicle Routing Problem) constraint. func (cp *Builder) AddMultipleCircuitConstraint() MultipleCircuitConstraint { return MultipleCircuitConstraint{cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_Routes{ - &cmpb.RoutesConstraintProto{}, - }})} + Constraint: &cmpb.ConstraintProto_Routes{&cmpb.RoutesConstraintProto{}, + }})} } // AddAllowedAssignments adds an allowed assignments constraint to the model. When all variables @@ -937,9 +927,8 @@ func (cp *Builder) AddAllowedAssignments(vars ...IntVar) TableConstraint { } return TableConstraint{cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_Table{ - &cmpb.TableConstraintProto{Vars: varsInd}, - }})} + Constraint: &cmpb.ConstraintProto_Table{&cmpb.TableConstraintProto{Vars: varsInd}, + }})} } // AddReservoirConstraint adds a reservoir constraint with optional refill/emptying events. @@ -961,12 +950,10 @@ func (cp *Builder) AddAllowedAssignments(vars ...IntVar) TableConstraint { // optional events incrementally after construction. func (cp *Builder) AddReservoirConstraint(min, max int64) ReservoirConstraint { return ReservoirConstraint{ - cp.appendConstraint( - &cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_Reservoir{ - &cmpb.ReservoirConstraintProto{ - MinLevel: min, MaxLevel: max, - }}}, + cp.appendConstraint(&cmpb.ConstraintProto{ + Constraint: &cmpb.ConstraintProto_Reservoir{&cmpb.ReservoirConstraintProto{ + MinLevel: min, MaxLevel: max, + }}}, ), cp.NewConstant(1).Index()} } @@ -1001,12 +988,11 @@ func (cp *Builder) AddAutomaton(transitionVars []IntVar, startState int64, final transitions = append(transitions, int32(v.Index())) } return AutomatonConstraint{cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_Automaton{ - &cmpb.AutomatonConstraintProto{ - Vars: transitions, - StartingState: startState, - FinalStates: finalStates, - }}, + Constraint: &cmpb.ConstraintProto_Automaton{&cmpb.AutomatonConstraintProto{ + Vars: transitions, + StartingState: startState, + FinalStates: finalStates, + }}, })} } @@ -1015,11 +1001,10 @@ func (cp *Builder) AddAutomaton(transitionVars []IntVar, startState int64, final // capacity. func (cp *Builder) AddCumulative(capacity LinearArgument) CumulativeConstraint { return CumulativeConstraint{cp.appendConstraint(&cmpb.ConstraintProto{ - Constraint: &cmpb.ConstraintProto_Cumulative{ - &cmpb.CumulativeConstraintProto{ - Capacity: capacity.asLinearExpressionProto(), - }, - }})} + Constraint: &cmpb.ConstraintProto_Cumulative{&cmpb.CumulativeConstraintProto{ + Capacity: capacity.asLinearExpressionProto(), + }}, + })} } // Minimize adds a linear minimization objective. @@ -1141,7 +1126,7 @@ func (cp *Builder) AddDecisionStrategy(vars []IntVar, vs cmpb.DecisionStrategyPr Variables: indices, VariableSelectionStrategy: vs, DomainReductionStrategy: ds, - }) + }) } // Model returns the built CP model proto. The proto returned is a pointer to the proto in Builder, diff --git a/ortools/sat/go/cpmodel/cp_model_test.go b/ortools/sat/go/cpmodel/cp_model_test.go index ad91fefff0..d643c22774 100644 --- a/ortools/sat/go/cpmodel/cp_model_test.go +++ b/ortools/sat/go/cpmodel/cp_model_test.go @@ -20,10 +20,9 @@ import ( "sort" "testing" + log "github.com/golang/glog" "github.com/google/go-cmp/cmp" "google.golang.org/protobuf/testing/protocmp" - - log "github.com/golang/glog" cmpb "github.com/google/or-tools/ortools/sat/proto/cpmodel" ) diff --git a/ortools/sat/go/cpmodel/cp_solver.go b/ortools/sat/go/cpmodel/cp_solver.go index 752b5d0562..e50a1f2f5b 100644 --- a/ortools/sat/go/cpmodel/cp_solver.go +++ b/ortools/sat/go/cpmodel/cp_solver.go @@ -18,10 +18,10 @@ import ( "sync" "unsafe" + "google.golang.org/protobuf/proto" + cmpb "github.com/google/or-tools/ortools/sat/proto/cpmodel" sppb "github.com/google/or-tools/ortools/sat/proto/satparameters" - - "google.golang.org/protobuf/proto" ) /* diff --git a/ortools/sat/go/cpmodel/cp_solver_c.cc b/ortools/sat/go/cpmodel/cp_solver_c.cc index 1f5b36808f..e8bba37b13 100644 --- a/ortools/sat/go/cpmodel/cp_solver_c.cc +++ b/ortools/sat/go/cpmodel/cp_solver_c.cc @@ -14,13 +14,12 @@ #include "ortools/sat/go/cpmodel/cp_solver_c.h" #include -#include -#include "absl/status/status.h" -#include "absl/strings/internal/memutil.h" -#include "ortools/base/logging.h" +#include "absl/log/check.h" +#include "ortools/base/memutil.h" #include "ortools/sat/cp_model.pb.h" #include "ortools/sat/cp_model_solver.h" +#include "ortools/sat/model.h" #include "ortools/sat/sat_parameters.pb.h" #include "ortools/util/time_limit.h" @@ -28,13 +27,6 @@ namespace operations_research::sat { namespace { -char* memdup(const char* s, size_t slen) { - void* copy; - if ((copy = malloc(slen)) == nullptr) return nullptr; - memcpy(copy, s, slen); - return reinterpret_cast(copy); -} - CpSolverResponse solveWithParameters(std::atomic* const limit_reached, const CpModelProto& proto, const SatParameters& params) { @@ -81,7 +73,7 @@ void SolveCpInterruptible(void* const limit_reached, const void* creq, CHECK(res.SerializeToString(&res_str)); *cres_len = static_cast(res_str.size()); - *cres = memdup(res_str.data(), *cres_len); + *cres = strings::memdup(res_str.data(), *cres_len); CHECK(*cres != nullptr); }