or-tools 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
data/ext/or-tools/ext.cpp CHANGED
@@ -117,7 +117,7 @@ operations_research::sat::LinearExpr from_ruby<operations_research::sat::LinearE
117
117
  Object o = cvar[0];
118
118
  std::string type = ((String) o.call("class").call("name")).str();
119
119
  if (type == "ORTools::BoolVar") {
120
- expr.AddVar(from_ruby<operations_research::sat::BoolVar>(cvar[0]));
120
+ expr.AddTerm(from_ruby<operations_research::sat::BoolVar>(cvar[0]), from_ruby<int64>(cvar[1]));
121
121
  } else if (type == "Integer") {
122
122
  expr.AddConstant(from_ruby<int64>(cvar[0]));
123
123
  } else {
@@ -125,7 +125,12 @@ operations_research::sat::LinearExpr from_ruby<operations_research::sat::LinearE
125
125
  }
126
126
  }
127
127
  } else {
128
- expr = from_ruby<operations_research::sat::IntVar>(x);
128
+ std::string type = ((String) x.call("class").call("name")).str();
129
+ if (type == "ORTools::BoolVar") {
130
+ expr = from_ruby<operations_research::sat::BoolVar>(x);
131
+ } else {
132
+ expr = from_ruby<operations_research::sat::IntVar>(x);
133
+ }
129
134
  }
130
135
 
131
136
  return expr;
@@ -239,6 +244,50 @@ IntVarSpan from_ruby<IntVarSpan>(Object x)
239
244
  return IntVarSpan(x);
240
245
  }
241
246
 
247
+ // need a wrapper class since absl::Span doesn't own
248
+ class IntervalVarSpan {
249
+ std::vector<operations_research::sat::IntervalVar> vec;
250
+ public:
251
+ IntervalVarSpan(Object x) {
252
+ Array a = Array(x);
253
+ for (std::size_t i = 0; i < a.size(); ++i) {
254
+ vec.push_back(from_ruby<operations_research::sat::IntervalVar>(a[i]));
255
+ }
256
+ }
257
+ operator absl::Span<const operations_research::sat::IntervalVar>() {
258
+ return absl::Span<const operations_research::sat::IntervalVar>(vec);
259
+ }
260
+ };
261
+
262
+ template<>
263
+ inline
264
+ IntervalVarSpan from_ruby<IntervalVarSpan>(Object x)
265
+ {
266
+ return IntervalVarSpan(x);
267
+ }
268
+
269
+ // need a wrapper class since absl::Span doesn't own
270
+ class BoolVarSpan {
271
+ std::vector<operations_research::sat::BoolVar> vec;
272
+ public:
273
+ BoolVarSpan(Object x) {
274
+ Array a = Array(x);
275
+ for (std::size_t i = 0; i < a.size(); ++i) {
276
+ vec.push_back(from_ruby<operations_research::sat::BoolVar>(a[i]));
277
+ }
278
+ }
279
+ operator absl::Span<const operations_research::sat::BoolVar>() {
280
+ return absl::Span<const operations_research::sat::BoolVar>(vec);
281
+ }
282
+ };
283
+
284
+ template<>
285
+ inline
286
+ BoolVarSpan from_ruby<BoolVarSpan>(Object x)
287
+ {
288
+ return BoolVarSpan(x);
289
+ }
290
+
242
291
  extern "C"
243
292
  void Init_ext()
244
293
  {
@@ -338,10 +387,15 @@ void Init_ext()
338
387
  .define_method("solution_value", &MPVariable::solution_value)
339
388
  .define_method(
340
389
  "+",
341
- *[](MPVariable& self, MPVariable& other) {
390
+ *[](MPVariable& self, LinearExpr& other) {
342
391
  LinearExpr s(&self);
343
- LinearExpr o(&other);
344
- return s + o;
392
+ return s + other;
393
+ })
394
+ .define_method(
395
+ "-",
396
+ *[](MPVariable& self, LinearExpr& other) {
397
+ LinearExpr s(&self);
398
+ return s - other;
345
399
  })
346
400
  .define_method(
347
401
  "*",
@@ -368,6 +422,17 @@ void Init_ext()
368
422
  LinearExpr o(&other);
369
423
  return self + o;
370
424
  })
425
+ .define_method(
426
+ "_gte_double",
427
+ *[](LinearExpr& self, double other) {
428
+ LinearExpr o(other);
429
+ return self >= o;
430
+ })
431
+ .define_method(
432
+ "_gte_linear_expr",
433
+ *[](LinearExpr& self, LinearExpr& other) {
434
+ return self >= other;
435
+ })
371
436
  .define_method(
372
437
  "_lte_double",
373
438
  *[](LinearExpr& self, double other) {
@@ -422,6 +487,11 @@ void Init_ext()
422
487
  .define_method("iterations", &MPSolver::iterations)
423
488
  .define_method("nodes", &MPSolver::nodes)
424
489
  .define_method("objective", &MPSolver::MutableObjective)
490
+ .define_method(
491
+ "maximize",
492
+ *[](MPSolver& self, LinearExpr& expr) {
493
+ return self.MutableObjective()->MaximizeLinearExpr(expr);
494
+ })
425
495
  .define_method(
426
496
  "minimize",
427
497
  *[](MPSolver& self, LinearExpr& expr) {
@@ -461,13 +531,18 @@ void Init_ext()
461
531
  }
462
532
  });
463
533
 
464
- // not to be confused with operations_research::IntVar
465
534
  define_class_under<operations_research::sat::IntVar>(rb_mORTools, "SatIntVar")
466
535
  .define_method("name", &operations_research::sat::IntVar::Name);
467
536
 
537
+ define_class_under<operations_research::sat::IntervalVar>(rb_mORTools, "SatIntervalVar")
538
+ .define_method("name", &operations_research::sat::IntervalVar::Name);
539
+
540
+ define_class_under<operations_research::sat::Constraint>(rb_mORTools, "SatConstraint");
541
+
468
542
  define_class_under<BoolVar>(rb_mORTools, "BoolVar")
469
543
  .define_method("name", &BoolVar::Name)
470
544
  .define_method("index", &BoolVar::index)
545
+ .define_method("not", &BoolVar::Not)
471
546
  .define_method(
472
547
  "inspect",
473
548
  *[](BoolVar& self) {
@@ -488,6 +563,11 @@ void Init_ext()
488
563
  *[](CpModelBuilder& self, std::string name) {
489
564
  return self.NewBoolVar().WithName(name);
490
565
  })
566
+ .define_method(
567
+ "new_interval_var",
568
+ *[](CpModelBuilder& self, operations_research::sat::IntVar start, operations_research::sat::IntVar size, operations_research::sat::IntVar end, std::string name) {
569
+ return self.NewIntervalVar(start, size, end).WithName(name);
570
+ })
491
571
  .define_method(
492
572
  "add_equality",
493
573
  *[](CpModelBuilder& self, operations_research::sat::LinearExpr x, operations_research::sat::LinearExpr y) {
@@ -523,6 +603,22 @@ void Init_ext()
523
603
  *[](CpModelBuilder& self, IntVarSpan vars) {
524
604
  self.AddAllDifferent(vars);
525
605
  })
606
+ .define_method(
607
+ "add_max_equality",
608
+ *[](CpModelBuilder& self, operations_research::sat::IntVar target, IntVarSpan vars) {
609
+ self.AddMaxEquality(target, vars);
610
+ })
611
+ .define_method(
612
+ "add_no_overlap",
613
+ *[](CpModelBuilder& self, IntervalVarSpan vars) {
614
+ self.AddNoOverlap(vars);
615
+ })
616
+ .define_method(
617
+ "add_bool_or",
618
+ *[](CpModelBuilder& self, BoolVarSpan literals) {
619
+ self.AddBoolOr(literals);
620
+ })
621
+ .define_method("add_implication", &CpModelBuilder::AddImplication)
526
622
  .define_method(
527
623
  "maximize",
528
624
  *[](CpModelBuilder& self, operations_research::sat::LinearExpr expr) {
@@ -537,13 +633,15 @@ void Init_ext()
537
633
  define_class_under(rb_mORTools, "CpSolver")
538
634
  .define_method(
539
635
  "_solve_with_observer",
540
- *[](Object self, CpModelBuilder& model, Object callback) {
636
+ *[](Object self, CpModelBuilder& model, Object callback, bool all_solutions) {
541
637
  operations_research::sat::Model m;
542
638
 
543
- // set parameters for SearchForAllSolutions
544
- SatParameters parameters;
545
- parameters.set_enumerate_all_solutions(true);
546
- m.Add(NewSatParameters(parameters));
639
+ if (all_solutions) {
640
+ // set parameters for SearchForAllSolutions
641
+ SatParameters parameters;
642
+ parameters.set_enumerate_all_solutions(true);
643
+ m.Add(NewSatParameters(parameters));
644
+ }
547
645
 
548
646
  m.Add(NewFeasibleSolutionObserver(
549
647
  [callback](const CpSolverResponse& r) {
data/lib/or-tools.rb CHANGED
@@ -4,6 +4,7 @@ require "or_tools/ext"
4
4
  # modules
5
5
  require "or_tools/comparison"
6
6
  require "or_tools/comparison_operators"
7
+ require "or_tools/bool_var"
7
8
  require "or_tools/cp_model"
8
9
  require "or_tools/cp_solver"
9
10
  require "or_tools/cp_solver_solution_callback"
@@ -0,0 +1,9 @@
1
+ module ORTools
2
+ class BoolVar
3
+ include ComparisonOperators
4
+
5
+ def *(other)
6
+ SatLinearExpr.new([[self, other]])
7
+ end
8
+ end
9
+ end
@@ -15,8 +15,13 @@ module ORTools
15
15
  _solution_integer_value(@response, var)
16
16
  end
17
17
 
18
+ def solve_with_solution_callback(model, observer)
19
+ @response = _solve_with_observer(model, observer, false)
20
+ @response.status
21
+ end
22
+
18
23
  def search_for_all_solutions(model, observer)
19
- @response = _solve_with_observer(model, observer)
24
+ @response = _solve_with_observer(model, observer, true)
20
25
  @response.status
21
26
  end
22
27
  end
@@ -12,5 +12,9 @@ module ORTools
12
12
  raise "Unsupported type"
13
13
  end
14
14
  end
15
+
16
+ def objective_value
17
+ @response.objective_value
18
+ end
15
19
  end
16
20
  end
Binary file
@@ -8,6 +8,14 @@ module ORTools
8
8
  end
9
9
  end
10
10
 
11
+ def >=(other)
12
+ if other.is_a?(LinearExpr)
13
+ _gte_linear_expr(other)
14
+ else
15
+ _gte_double(other)
16
+ end
17
+ end
18
+
11
19
  def <=(other)
12
20
  if other.is_a?(LinearExpr)
13
21
  _lte_linear_expr(other)
@@ -1,3 +1,3 @@
1
1
  module ORTools
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: or-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-03-24 00:00:00.000000000 Z
11
+ date: 2020-04-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rice
@@ -94,6 +94,7 @@ files:
94
94
  - ext/or-tools/ext.cpp
95
95
  - ext/or-tools/extconf.rb
96
96
  - lib/or-tools.rb
97
+ - lib/or_tools/bool_var.rb
97
98
  - lib/or_tools/comparison.rb
98
99
  - lib/or_tools/comparison_operators.rb
99
100
  - lib/or_tools/cp_model.rb