or-tools 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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