or-tools 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a0af0b1dc8198bf30ff09350e3c4da587735d5ece10204bf19c6dfc8916e2135
4
- data.tar.gz: 6b685437c9d8cefcb91d52b24d090179a0884ad9a8edf966131493f3c8bc1dbf
3
+ metadata.gz: dba74899e2a57b086643657e5093f12e67fd4fcdda7e22c2b533911f9991e43a
4
+ data.tar.gz: 963c0b75f55b4b772ead3a8402ec8bb4b90570c23de1c7dc3a437758e8949af2
5
5
  SHA512:
6
- metadata.gz: 80ed4a17f6079d997ef42b8659cea3879f4b0935e8bbfa7e566a76937b2ea0f86f906b3bb236bd43f17cecb6364c3025916074438f768c7853e60a87a025d150
7
- data.tar.gz: 9b9e085b2cf01a3dc7d1f77363c903dfb7d6e41280626c37408da9889534ac7c5c85d49c73714022461ae55df36abb10932b4ae9272d10d910e95a6681cddad6
6
+ metadata.gz: a5dc8662ec580c97a905817867346615e2fbb187d5b75d6b2b839a86e7385a20b2ed4f9f4c13ed536079c6141cdd0bf95bfad7ea6408d4eb81d8f0ed09e32a68
7
+ data.tar.gz: 195967d1e662ba05751ff31fbec3c96ebac519cd58a343ca551f9ba6c12304542b7f4127a37f88e99cda6b214d42089df7ed9b5a3134c0ec1eb978ea72a95be4
@@ -1,3 +1,8 @@
1
+ ## 0.3.4 (2021-01-14)
2
+
3
+ - Added support for time limit for `CpSolver`
4
+ - Added `add_dimension_with_vehicle_transits` and `status` methods to `RoutingModel`
5
+
1
6
  ## 0.3.3 (2020-10-12)
2
7
 
3
8
  - Added support for start and end points for routing
data/NOTICE.txt CHANGED
@@ -1,5 +1,5 @@
1
1
  Copyright 2010-2018 Google LLC
2
- Copyright 2020 Andrew Kane
2
+ Copyright 2020-2021 Andrew Kane
3
3
 
4
4
  Licensed under the Apache License, Version 2.0 (the "License");
5
5
  you may not use this file except in compliance with the License.
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [OR-Tools](https://github.com/google/or-tools) - operations research tools - for Ruby
4
4
 
5
- [![Build Status](https://travis-ci.org/ankane/or-tools.svg?branch=master)](https://travis-ci.org/ankane/or-tools)
5
+ [![Build Status](https://github.com/ankane/or-tools/workflows/build/badge.svg?branch=master)](https://github.com/ankane/or-tools/actions)
6
6
 
7
7
  ## Installation
8
8
 
@@ -267,6 +267,7 @@ Constraint Optimization
267
267
  - [Solving an Optimization Problem](#solving-an-optimization-problem)
268
268
  - [Cryptarithmetic](#cryptarithmetic)
269
269
  - [The N-queens Problem](#the-n-queens-problem)
270
+ - [Setting Solver Limits](#setting-solver-limits) [master]
270
271
 
271
272
  Assignment
272
273
 
@@ -578,6 +579,39 @@ puts
578
579
  puts "Solutions found : %i" % solution_printer.solution_count
579
580
  ```
580
581
 
582
+ ### Setting Solver Limits
583
+
584
+ [Guide](https://developers.google.com/optimization/cp/cp_tasks)
585
+
586
+ ```ruby
587
+ # create the model
588
+ model = ORTools::CpModel.new
589
+
590
+ # create the variables
591
+ num_vals = 3
592
+ x = model.new_int_var(0, num_vals - 1, "x")
593
+ y = model.new_int_var(0, num_vals - 1, "y")
594
+ z = model.new_int_var(0, num_vals - 1, "z")
595
+
596
+ # add an all-different constraint
597
+ model.add(x != y)
598
+
599
+ # create the solver
600
+ solver = ORTools::CpSolver.new
601
+
602
+ # set a time limit of 10 seconds.
603
+ solver.parameters.max_time_in_seconds = 10
604
+
605
+ # solve the model
606
+ status = solver.solve(model)
607
+
608
+ # display the first solution
609
+ if status == :optimal
610
+ puts "x = #{solver.value(x)}"
611
+ puts "y = #{solver.value(y)}"
612
+ puts "z = #{solver.value(z)}"
613
+ end
614
+ ```
581
615
 
582
616
  ### Assignment
583
617
 
@@ -638,18 +638,24 @@ void Init_ext()
638
638
  self.Minimize(expr);
639
639
  });
640
640
 
641
+ define_class_under<SatParameters>(rb_mORTools, "SatParameters")
642
+ .define_constructor(Constructor<SatParameters>())
643
+ .define_method("max_time_in_seconds=",
644
+ *[](SatParameters& self, double value) {
645
+ self.set_max_time_in_seconds(value);
646
+ });
647
+
641
648
  define_class_under(rb_mORTools, "CpSolver")
642
649
  .define_method(
643
650
  "_solve_with_observer",
644
- *[](Object self, CpModelBuilder& model, Object callback, bool all_solutions) {
651
+ *[](Object self, CpModelBuilder& model, SatParameters& parameters, Object callback, bool all_solutions) {
645
652
  operations_research::sat::Model m;
646
653
 
647
654
  if (all_solutions) {
648
655
  // set parameters for SearchForAllSolutions
649
- SatParameters parameters;
650
656
  parameters.set_enumerate_all_solutions(true);
651
- m.Add(NewSatParameters(parameters));
652
657
  }
658
+ m.Add(NewSatParameters(parameters));
653
659
 
654
660
  m.Add(NewFeasibleSolutionObserver(
655
661
  [callback](const CpSolverResponse& r) {
@@ -662,8 +668,10 @@ void Init_ext()
662
668
  })
663
669
  .define_method(
664
670
  "_solve",
665
- *[](Object self, CpModelBuilder& model) {
666
- return Solve(model.Build());
671
+ *[](Object self, CpModelBuilder& model, SatParameters& parameters) {
672
+ operations_research::sat::Model m;
673
+ m.Add(NewSatParameters(parameters));
674
+ return SolveCpModel(model.Build(), &m);
667
675
  })
668
676
  .define_method(
669
677
  "_solution_integer_value",
@@ -701,6 +709,8 @@ void Init_ext()
701
709
  return Symbol("infeasible");
702
710
  } else if (status == CpSolverStatus::MODEL_INVALID) {
703
711
  return Symbol("model_invalid");
712
+ } else if (status == CpSolverStatus::UNKNOWN) {
713
+ return Symbol("unknown");
704
714
  } else {
705
715
  throw std::runtime_error("Unknown solver status");
706
716
  }
@@ -806,6 +816,23 @@ void Init_ext()
806
816
  })
807
817
  .define_method("depot", &RoutingModel::GetDepot)
808
818
  .define_method("size", &RoutingModel::Size)
819
+ .define_method("status", *[](RoutingModel& self) {
820
+ auto status = self.status();
821
+
822
+ if (status == RoutingModel::ROUTING_NOT_SOLVED) {
823
+ return Symbol("not_solved");
824
+ } else if (status == RoutingModel::ROUTING_SUCCESS) {
825
+ return Symbol("success");
826
+ } else if (status == RoutingModel::ROUTING_FAIL) {
827
+ return Symbol("fail");
828
+ } else if (status == RoutingModel::ROUTING_FAIL_TIMEOUT) {
829
+ return Symbol("fail_timeout");
830
+ } else if (status == RoutingModel::ROUTING_INVALID) {
831
+ return Symbol("invalid");
832
+ } else {
833
+ throw std::runtime_error("Unknown solver status");
834
+ }
835
+ })
809
836
  .define_method("vehicle_var", &RoutingModel::VehicleVar)
810
837
  .define_method("set_arc_cost_evaluator_of_all_vehicles", &RoutingModel::SetArcCostEvaluatorOfAllVehicles)
811
838
  .define_method("set_arc_cost_evaluator_of_vehicle", &RoutingModel::SetArcCostEvaluatorOfVehicle)
@@ -822,6 +849,15 @@ void Init_ext()
822
849
  }
823
850
  self.AddDimensionWithVehicleCapacity(evaluator_index, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name);
824
851
  })
852
+ .define_method(
853
+ "add_dimension_with_vehicle_transits",
854
+ *[](RoutingModel& self, Array rb_indices, int64 slack_max, int64 capacity, bool fix_start_cumul_to_zero, const std::string& name) {
855
+ std::vector<int> evaluator_indices;
856
+ for (std::size_t i = 0; i < rb_indices.size(); ++i) {
857
+ evaluator_indices.push_back(from_ruby<int>(rb_indices[i]));
858
+ }
859
+ self.AddDimensionWithVehicleTransits(evaluator_indices, slack_max, capacity, fix_start_cumul_to_zero, name);
860
+ })
825
861
  .define_method(
826
862
  "add_disjunction",
827
863
  *[](RoutingModel& self, Array rb_indices, int64 penalty) {
@@ -7,7 +7,7 @@ module ORTools
7
7
  def_delegators :@response, :objective_value, :num_conflicts, :num_branches, :wall_time
8
8
 
9
9
  def solve(model)
10
- @response = _solve(model)
10
+ @response = _solve(model, parameters)
11
11
  @response.status
12
12
  end
13
13
 
@@ -20,13 +20,17 @@ module ORTools
20
20
  end
21
21
 
22
22
  def solve_with_solution_callback(model, observer)
23
- @response = _solve_with_observer(model, observer, false)
23
+ @response = _solve_with_observer(model, parameters, observer, false)
24
24
  @response.status
25
25
  end
26
26
 
27
27
  def search_for_all_solutions(model, observer)
28
- @response = _solve_with_observer(model, observer, true)
28
+ @response = _solve_with_observer(model, parameters, observer, true)
29
29
  @response.status
30
30
  end
31
+
32
+ def parameters
33
+ @parameters ||= SatParameters.new
34
+ end
31
35
  end
32
36
  end
@@ -1,3 +1,3 @@
1
1
  module ORTools
2
- VERSION = "0.3.3"
2
+ VERSION = "0.3.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.3.3
4
+ version: 0.3.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-13 00:00:00.000000000 Z
11
+ date: 2021-01-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rice
@@ -80,7 +80,7 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '5'
83
- description:
83
+ description:
84
84
  email: andrew@chartkick.com
85
85
  executables: []
86
86
  extensions:
@@ -118,7 +118,7 @@ homepage: https://github.com/ankane/or-tools
118
118
  licenses:
119
119
  - MIT
120
120
  metadata: {}
121
- post_install_message:
121
+ post_install_message:
122
122
  rdoc_options: []
123
123
  require_paths:
124
124
  - lib
@@ -133,8 +133,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
133
  - !ruby/object:Gem::Version
134
134
  version: '0'
135
135
  requirements: []
136
- rubygems_version: 3.1.2
137
- signing_key:
136
+ rubygems_version: 3.2.3
137
+ signing_key:
138
138
  specification_version: 4
139
139
  summary: Operations research tools for Ruby
140
140
  test_files: []