or-tools 0.7.1 → 0.8.0

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: d3cfb5b8fd7f6a4563b2d50a2357e4bfc72fc5ef69e2c7c1a6ad7e7736a66235
4
- data.tar.gz: a1e2307c4a94495f9fe28e85e68171a9a3474a45ed98344250920360adffbd0f
3
+ metadata.gz: 0b7f1f552804f88337c4d277ac7062a984c13ea67e43a8cd5567e8c0b8f1b3c6
4
+ data.tar.gz: 5bd93184a59799ef541745a8f4498f4cf25c525c290c3c2c7fbe2d5e5494c942
5
5
  SHA512:
6
- metadata.gz: 8b62fd4b68b1a3b119d8da2987d263ad2fb0c4ca4d1062ef274f3dea440db62414af6188b769180a740a22898d26657569e71fefd0af9e754442061bcf481a1a
7
- data.tar.gz: c4fbe636cd22654c867f25c954d1652540b54239a9427a7795033027a60ca7538b864e74c0134296040f57bf945750dbc80384965e7d449f9a5fb1474163ce9d
6
+ metadata.gz: 91077d2961b42021ee98f580d132f99a84128354bd054053de600510c4aba7343e1da9696a5d08a7c214742b92cac45200f85aa136d3e092d77b25ceb4033cdc
7
+ data.tar.gz: 316c4c0423522a2bdb78e006d38c412aa94cbaa14b4a37ebd3c04f340752d5f2adc5a3a9f5cf4adbd6968627a8e0504b58ae77d1d0876eb46cab783843957ead
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ ## 0.8.0 (2022-08-21)
2
+
3
+ - Updated OR-Tools to 9.4
4
+ - Added binary installation for Mac ARM
5
+ - Restored support for Debian 10
6
+ - Dropped support for Ruby < 2.7
7
+
8
+ ## 0.7.3 (2022-07-23)
9
+
10
+ - Added more methods to `RoutingModel` and `RoutingDimension`
11
+
12
+ ## 0.7.2 (2022-05-28)
13
+
14
+ - Fixed library not loaded error on Mac
15
+
1
16
  ## 0.7.1 (2022-05-27)
2
17
 
3
18
  - Added support for time limit for `Solver`
data/README.md CHANGED
@@ -12,7 +12,7 @@ Add this line to your application’s Gemfile:
12
12
  gem "or-tools"
13
13
  ```
14
14
 
15
- Installation can take a few minutes as OR-Tools downloads and builds. For Mac ARM, also follow [these instructions](#additional-instructions).
15
+ Installation can take a few minutes as OR-Tools downloads and builds.
16
16
 
17
17
  ## Guides
18
18
 
@@ -2263,17 +2263,6 @@ possible_tables.each do |table|
2263
2263
  end
2264
2264
  ```
2265
2265
 
2266
- ## Additional Instructions
2267
-
2268
- ### Mac ARM
2269
-
2270
- ARM binaries are not available for Mac yet, so use Homebrew to install OR-Tools before installing the gem.
2271
-
2272
- ```sh
2273
- brew install or-tools
2274
- bundle config build.or-tools --with-or-tools-dir=/opt/homebrew
2275
- ```
2276
-
2277
2266
  ## History
2278
2267
 
2279
2268
  View the [changelog](https://github.com/ankane/or-tools-ruby/blob/master/CHANGELOG.md)
data/ext/or-tools/ext.cpp CHANGED
@@ -18,13 +18,7 @@ void Init_ext()
18
18
  {
19
19
  auto m = Rice::define_module("ORTools");
20
20
 
21
- // TODO use operations_research::OrToolsVersionString() in 0.8.0
22
- m.define_singleton_function(
23
- "lib_version",
24
- []() {
25
- return std::to_string(operations_research::OrToolsMajorVersion()) + "."
26
- + std::to_string(operations_research::OrToolsMinorVersion());
27
- });
21
+ m.define_singleton_function("lib_version", &operations_research::OrToolsVersionString);
28
22
 
29
23
  init_assignment(m);
30
24
  init_bin_packing(m);
@@ -23,8 +23,9 @@ else
23
23
  rpath = "'#{rpath_prefix}/../../tmp/or-tools/lib'"
24
24
  end
25
25
 
26
+ # find_header and find_library first check without adding path
27
+ # which can cause them to find system library
26
28
  $INCFLAGS << " -I#{inc}"
27
-
28
29
  $LDFLAGS.prepend("-Wl,-rpath,#{rpath} -L#{lib} ")
29
30
  raise "OR-Tools not found" unless have_library("ortools")
30
31
 
@@ -9,6 +9,7 @@ using operations_research::DefaultRoutingSearchParameters;
9
9
  using operations_research::FirstSolutionStrategy;
10
10
  using operations_research::LocalSearchMetaheuristic;
11
11
  using operations_research::RoutingDimension;
12
+ using operations_research::RoutingDisjunctionIndex;
12
13
  using operations_research::RoutingIndexManager;
13
14
  using operations_research::RoutingModel;
14
15
  using operations_research::RoutingModelParameters;
@@ -55,6 +56,19 @@ namespace Rice::detail
55
56
  };
56
57
  }
57
58
 
59
+ namespace Rice::detail
60
+ {
61
+ template<class T, class U>
62
+ class To_Ruby<std::pair<T, U>>
63
+ {
64
+ public:
65
+ VALUE convert(std::pair<T, U> const & x)
66
+ {
67
+ return rb_ary_new3(2, To_Ruby<T>().convert(x.first), To_Ruby<U>().convert(x.second));
68
+ }
69
+ };
70
+ }
71
+
58
72
  void init_routing(Rice::Module& m) {
59
73
  auto rb_cRoutingSearchParameters = Rice::define_class_under<RoutingSearchParameters>(m, "RoutingSearchParameters");
60
74
  auto rb_cIntVar = Rice::define_class_under<operations_research::IntVar>(m, "IntVar");
@@ -198,8 +212,28 @@ void init_routing(Rice::Module& m) {
198
212
  .define_method("old_end_max", &operations_research::IntervalVar::OldEndMax);
199
213
 
200
214
  Rice::define_class_under<RoutingDimension>(m, "RoutingDimension")
215
+ .define_method("transit_value", &RoutingDimension::GetTransitValue)
216
+ // TODO GetTransitValueFromClass
217
+ .define_method("cumul_var", &RoutingDimension::CumulVar)
218
+ .define_method("transit_var", &RoutingDimension::TransitVar)
219
+ .define_method("fixed_transit_var", &RoutingDimension::FixedTransitVar)
220
+ .define_method("slack_var", &RoutingDimension::SlackVar)
221
+ .define_method("set_span_upper_bound_for_vehicle", &RoutingDimension::SetSpanUpperBoundForVehicle)
222
+ .define_method("set_span_cost_coefficient_for_vehicle", &RoutingDimension::SetSpanCostCoefficientForVehicle)
223
+ .define_method("set_span_cost_coefficient_for_all_vehicles", &RoutingDimension::SetSpanCostCoefficientForAllVehicles)
224
+ .define_method("set_global_span_cost_coefficient", &RoutingDimension::SetGlobalSpanCostCoefficient)
225
+ // alias
201
226
  .define_method("global_span_cost_coefficient=", &RoutingDimension::SetGlobalSpanCostCoefficient)
202
- .define_method("cumul_var", &RoutingDimension::CumulVar);
227
+ .define_method("set_cumul_var_soft_upper_bound", &RoutingDimension::SetCumulVarSoftUpperBound)
228
+ .define_method("cumul_var_soft_upper_bound?", &RoutingDimension::HasCumulVarSoftUpperBound)
229
+ .define_method("cumul_var_soft_upper_bound", &RoutingDimension::GetCumulVarSoftUpperBound)
230
+ .define_method("cumul_var_soft_upper_bound_coefficient", &RoutingDimension::GetCumulVarSoftUpperBoundCoefficient)
231
+ .define_method("set_cumul_var_soft_lower_bound", &RoutingDimension::SetCumulVarSoftLowerBound)
232
+ .define_method("cumul_var_soft_lower_bound?", &RoutingDimension::HasCumulVarSoftLowerBound)
233
+ .define_method("cumul_var_soft_lower_bound", &RoutingDimension::GetCumulVarSoftLowerBound)
234
+ .define_method("cumul_var_soft_lower_bound_coefficient", &RoutingDimension::GetCumulVarSoftLowerBoundCoefficient);
235
+
236
+ Rice::define_class_under<RoutingDisjunctionIndex>(m, "RoutingDisjunctionIndex");
203
237
 
204
238
  Rice::define_class_under<operations_research::Constraint>(m, "Constraint")
205
239
  .define_method("post", &operations_research::Constraint::Post)
@@ -264,27 +298,99 @@ void init_routing(Rice::Module& m) {
264
298
 
265
299
  Rice::define_class_under<RoutingModel>(m, "RoutingModel")
266
300
  .define_constructor(Rice::Constructor<RoutingModel, RoutingIndexManager, RoutingModelParameters>(), Rice::Arg("index_manager"), Rice::Arg("parameters") = operations_research::DefaultRoutingModelParameters())
301
+ .define_method("register_unary_transit_vector", &RoutingModel::RegisterUnaryTransitVector)
267
302
  .define_method(
268
- "register_transit_callback",
303
+ "register_unary_transit_callback",
269
304
  [](RoutingModel& self, Object callback) {
270
- return self.RegisterTransitCallback(
271
- [callback](int64_t from_index, int64_t to_index) -> int64_t {
272
- return Rice::detail::From_Ruby<int64_t>().convert(callback.call("call", from_index, to_index));
305
+ return self.RegisterUnaryTransitCallback(
306
+ [callback](int64_t from_index) -> int64_t {
307
+ return Rice::detail::From_Ruby<int64_t>().convert(callback.call("call", from_index));
273
308
  }
274
309
  );
275
310
  })
311
+ .define_method("register_transit_matrix", &RoutingModel::RegisterTransitMatrix)
276
312
  .define_method(
277
- "register_unary_transit_callback",
313
+ "register_transit_callback",
278
314
  [](RoutingModel& self, Object callback) {
279
- return self.RegisterUnaryTransitCallback(
280
- [callback](int64_t from_index) -> int64_t {
281
- return Rice::detail::From_Ruby<int64_t>().convert(callback.call("call", from_index));
315
+ return self.RegisterTransitCallback(
316
+ [callback](int64_t from_index, int64_t to_index) -> int64_t {
317
+ return Rice::detail::From_Ruby<int64_t>().convert(callback.call("call", from_index, to_index));
282
318
  }
283
319
  );
284
320
  })
321
+ .define_method("add_dimension", &RoutingModel::AddDimension)
322
+ .define_method("add_dimension_with_vehicle_transits", &RoutingModel::AddDimensionWithVehicleTransits)
323
+ .define_method("add_dimension_with_vehicle_capacity", &RoutingModel::AddDimensionWithVehicleCapacity)
324
+ .define_method("add_dimension_with_vehicle_transit_and_capacity", &RoutingModel::AddDimensionWithVehicleTransitAndCapacity)
325
+ .define_method("add_constant_dimension_with_slack", &RoutingModel::AddConstantDimensionWithSlack)
326
+ .define_method("add_constant_dimension", &RoutingModel::AddConstantDimension)
327
+ .define_method("add_vector_dimension", &RoutingModel::AddVectorDimension)
328
+ .define_method("add_matrix_dimension", &RoutingModel::AddMatrixDimension)
329
+ // TODO AddDimensionDependentDimensionWithVehicleCapacity
330
+ // .define_method("make_path_spans_and_total_slacks", &RoutingModel::MakePathSpansAndTotalSlacks)
331
+ .define_method("all_dimension_names", &RoutingModel::GetAllDimensionNames)
332
+ // .define_method("dimensions", &RoutingModel::GetDimensions)
333
+ // .define_method("dimensions_with_soft_or_span_costs", &RoutingModel::GetDimensionsWithSoftOrSpanCosts)
334
+ .define_method("dimension?", &RoutingModel::HasDimension)
335
+ // .define_method("dimension_or_die", &RoutingModel::GetDimensionOrDie)
336
+ .define_method("mutable_dimension", &RoutingModel::GetMutableDimension)
337
+ .define_method("set_primary_constrained_dimension", &RoutingModel::SetPrimaryConstrainedDimension)
338
+ .define_method("primary_constrained_dimension", &RoutingModel::GetPrimaryConstrainedDimension)
339
+ .define_method("add_resource_group", &RoutingModel::AddResourceGroup)
340
+ .define_method("dimension_resource_group_indices", &RoutingModel::GetDimensionResourceGroupIndices)
341
+ .define_method("dimension_resource_group_index", &RoutingModel::GetDimensionResourceGroupIndex)
342
+ .define_method("add_disjunction", &RoutingModel::AddDisjunction, Rice::Arg("indices"), Rice::Arg("penalty"), Rice::Arg("max_cardinality") = (int64_t)1)
343
+ .define_method("disjunction_indices", &RoutingModel::GetDisjunctionIndices)
344
+ .define_method("disjunction_penalty", &RoutingModel::GetDisjunctionPenalty)
345
+ .define_method("disjunction_max_cardinality", &RoutingModel::GetDisjunctionMaxCardinality)
346
+ .define_method("number_of_disjunctions", &RoutingModel::GetNumberOfDisjunctions)
347
+ .define_method("mandatory_disjunctions?", &RoutingModel::HasMandatoryDisjunctions)
348
+ .define_method("max_cardinality_constrained_disjunctions?", &RoutingModel::HasMaxCardinalityConstrainedDisjunctions)
349
+ .define_method("perfect_binary_disjunctions", &RoutingModel::GetPerfectBinaryDisjunctions)
350
+ .define_method("ignore_disjunctions_already_forced_to_zero", &RoutingModel::IgnoreDisjunctionsAlreadyForcedToZero)
351
+ .define_method("add_soft_same_vehicle_constraint", &RoutingModel::AddSoftSameVehicleConstraint)
352
+ .define_method("set_allowed_vehicles_for_index", &RoutingModel::SetAllowedVehiclesForIndex)
353
+ .define_method("vehicle_allowed_for_index?", &RoutingModel::IsVehicleAllowedForIndex)
354
+ .define_method("add_pickup_and_delivery", &RoutingModel::AddPickupAndDelivery)
355
+ .define_method("add_pickup_and_delivery_sets", &RoutingModel::AddPickupAndDeliverySets)
356
+ .define_method("pickup_index_pairs", &RoutingModel::GetPickupIndexPairs)
357
+ .define_method("delivery_index_pairs", &RoutingModel::GetDeliveryIndexPairs)
358
+ // TODO SetPickupAndDeliveryPolicyOfAllVehicles
359
+ // TODO SetPickupAndDeliveryPolicyOfVehicle
360
+ // TODO GetPickupAndDeliveryPolicyOfVehicle
361
+ .define_method("num_of_singleton_nodes", &RoutingModel::GetNumOfSingletonNodes)
362
+ .define_method("unperformed_penalty", &RoutingModel::UnperformedPenalty)
363
+ .define_method("unperformed_penalty_or_value", &RoutingModel::UnperformedPenaltyOrValue)
285
364
  .define_method("depot", &RoutingModel::GetDepot)
286
- .define_method("size", &RoutingModel::Size)
287
- .define_method("status", [](RoutingModel& self) {
365
+ .define_method("set_maximum_number_of_active_vehicles", &RoutingModel::SetMaximumNumberOfActiveVehicles)
366
+ .define_method("maximum_number_of_active_vehicles", &RoutingModel::GetMaximumNumberOfActiveVehicles)
367
+ .define_method("set_arc_cost_evaluator_of_all_vehicles", &RoutingModel::SetArcCostEvaluatorOfAllVehicles)
368
+ .define_method("set_arc_cost_evaluator_of_vehicle", &RoutingModel::SetArcCostEvaluatorOfVehicle)
369
+ .define_method("set_fixed_cost_of_all_vehicles", &RoutingModel::SetFixedCostOfAllVehicles)
370
+ .define_method("set_fixed_cost_of_vehicle", &RoutingModel::SetFixedCostOfVehicle)
371
+ .define_method("fixed_cost_of_vehicle", &RoutingModel::GetFixedCostOfVehicle)
372
+ .define_method("set_amortized_cost_factors_of_all_vehicles", &RoutingModel::SetAmortizedCostFactorsOfAllVehicles)
373
+ .define_method("set_amortized_cost_factors_of_vehicle", &RoutingModel::SetAmortizedCostFactorsOfVehicle)
374
+ .define_method("amortized_linear_cost_factor_of_vehicles", &RoutingModel::GetAmortizedLinearCostFactorOfVehicles)
375
+ .define_method("amortized_quadratic_cost_factor_of_vehicles", &RoutingModel::GetAmortizedQuadraticCostFactorOfVehicles)
376
+ .define_method("set_vehicle_used_when_empty", &RoutingModel::SetVehicleUsedWhenEmpty)
377
+ .define_method("vehicle_used_when_empty?", &RoutingModel::IsVehicleUsedWhenEmpty)
378
+ .define_method("add_variable_minimized_by_finalizer", &RoutingModel::AddVariableMinimizedByFinalizer)
379
+ .define_method("add_variable_maximized_by_finalizer", &RoutingModel::AddVariableMaximizedByFinalizer)
380
+ .define_method("add_weighted_variable_minimized_by_finalizer", &RoutingModel::AddWeightedVariableMinimizedByFinalizer)
381
+ .define_method("add_weighted_variable_maximized_by_finalizer", &RoutingModel::AddWeightedVariableMaximizedByFinalizer)
382
+ .define_method("add_variable_target_to_finalizer", &RoutingModel::AddVariableTargetToFinalizer)
383
+ .define_method("add_weighted_variable_target_to_finalizer", &RoutingModel::AddWeightedVariableTargetToFinalizer)
384
+ .define_method("close_model", &RoutingModel::CloseModel)
385
+ // solve defined in Ruby
386
+ .define_method(
387
+ "solve_with_parameters",
388
+ [](RoutingModel& self, const RoutingSearchParameters& search_parameters) {
389
+ return self.SolveWithParameters(search_parameters);
390
+ })
391
+ .define_method("compute_lower_bound", &RoutingModel::ComputeLowerBound)
392
+ .define_method("status",
393
+ [](RoutingModel& self) {
288
394
  auto status = self.status();
289
395
 
290
396
  if (status == RoutingModel::ROUTING_NOT_SOLVED) {
@@ -301,30 +407,22 @@ void init_routing(Rice::Module& m) {
301
407
  throw std::runtime_error("Unknown solver status");
302
408
  }
303
409
  })
304
- .define_method("vehicle_var", &RoutingModel::VehicleVar)
305
- .define_method("set_arc_cost_evaluator_of_all_vehicles", &RoutingModel::SetArcCostEvaluatorOfAllVehicles)
306
- .define_method("set_arc_cost_evaluator_of_vehicle", &RoutingModel::SetArcCostEvaluatorOfVehicle)
307
- .define_method("set_fixed_cost_of_all_vehicles", &RoutingModel::SetFixedCostOfAllVehicles)
308
- .define_method("set_fixed_cost_of_vehicle", &RoutingModel::SetFixedCostOfVehicle)
309
- .define_method("fixed_cost_of_vehicle", &RoutingModel::GetFixedCostOfVehicle)
310
- .define_method("add_dimension", &RoutingModel::AddDimension)
311
- .define_method(
312
- "add_dimension_with_vehicle_capacity",
313
- [](RoutingModel& self, int evaluator_index, int64_t slack_max, std::vector<int64_t> vehicle_capacities, bool fix_start_cumul_to_zero, const std::string& name) {
314
- self.AddDimensionWithVehicleCapacity(evaluator_index, slack_max, vehicle_capacities, fix_start_cumul_to_zero, name);
315
- })
316
- .define_method(
317
- "add_dimension_with_vehicle_transits",
318
- [](RoutingModel& self, std::vector<int> evaluator_indices, int64_t slack_max, int64_t capacity, bool fix_start_cumul_to_zero, const std::string& name) {
319
- self.AddDimensionWithVehicleTransits(evaluator_indices, slack_max, capacity, fix_start_cumul_to_zero, name);
320
- })
321
- .define_method(
322
- "add_disjunction",
323
- [](RoutingModel& self, std::vector<int64_t> indices, int64_t penalty) {
324
- self.AddDisjunction(indices, penalty);
325
- })
326
- .define_method("add_pickup_and_delivery", &RoutingModel::AddPickupAndDelivery)
327
- .define_method("solver", &RoutingModel::solver)
410
+ .define_method("apply_locks", &RoutingModel::ApplyLocks)
411
+ .define_method("apply_locks_to_all_vehicles", &RoutingModel::ApplyLocksToAllVehicles)
412
+ .define_method("pre_assignment", &RoutingModel::PreAssignment)
413
+ .define_method("mutable_pre_assignment", &RoutingModel::MutablePreAssignment)
414
+ .define_method("write_assignment", &RoutingModel::WriteAssignment)
415
+ .define_method("read_assignment", &RoutingModel::ReadAssignment)
416
+ .define_method("restore_assignment", &RoutingModel::RestoreAssignment)
417
+ .define_method("read_assignment_from_routes", &RoutingModel::ReadAssignmentFromRoutes)
418
+ .define_method("routes_to_assignment", &RoutingModel::RoutesToAssignment)
419
+ .define_method("assignment_to_routes", &RoutingModel::AssignmentToRoutes)
420
+ .define_method("compact_assignment", &RoutingModel::CompactAssignment)
421
+ .define_method("compact_and_check_assignment", &RoutingModel::CompactAndCheckAssignment)
422
+ .define_method("add_to_assignment", &RoutingModel::AddToAssignment)
423
+ .define_method("add_interval_to_assignment", &RoutingModel::AddIntervalToAssignment)
424
+ // TODO PackCumulsOfOptimizerDimensionsFromAssignment
425
+ // TODO AddLocalSearchFilter
328
426
  .define_method("start", &RoutingModel::Start)
329
427
  .define_method("end", &RoutingModel::End)
330
428
  .define_method("start?", &RoutingModel::IsStart)
@@ -333,12 +431,23 @@ void init_routing(Rice::Module& m) {
333
431
  .define_method("next", &RoutingModel::Next)
334
432
  .define_method("vehicle_used?", &RoutingModel::IsVehicleUsed)
335
433
  .define_method("next_var", &RoutingModel::NextVar)
434
+ .define_method("active_var", &RoutingModel::ActiveVar)
435
+ .define_method("active_vehicle_var", &RoutingModel::ActiveVehicleVar)
436
+ .define_method("vehicle_route_considered_var", &RoutingModel::VehicleRouteConsideredVar)
437
+ .define_method("vehicle_var", &RoutingModel::VehicleVar)
438
+ .define_method("resource_var", &RoutingModel::ResourceVar)
439
+ .define_method("cost_var", &RoutingModel::CostVar)
336
440
  .define_method("arc_cost_for_vehicle", &RoutingModel::GetArcCostForVehicle)
337
- .define_method("mutable_dimension", &RoutingModel::GetMutableDimension)
338
- .define_method("add_variable_minimized_by_finalizer", &RoutingModel::AddVariableMinimizedByFinalizer)
339
- .define_method(
340
- "solve_with_parameters",
341
- [](RoutingModel& self, const RoutingSearchParameters& search_parameters) {
342
- return self.SolveWithParameters(search_parameters);
343
- });
441
+ .define_method("costs_are_homogeneous_across_vehicles?", &RoutingModel::CostsAreHomogeneousAcrossVehicles)
442
+ .define_method("homogeneous_cost", &RoutingModel::GetHomogeneousCost)
443
+ .define_method("arc_cost_for_first_solution", &RoutingModel::GetArcCostForFirstSolution)
444
+ .define_method("cost_classes_count", &RoutingModel::GetCostClassesCount)
445
+ .define_method("non_zero_cost_classes_count", &RoutingModel::GetNonZeroCostClassesCount)
446
+ .define_method("vehicle_classes_count", &RoutingModel::GetVehicleClassesCount)
447
+ .define_method("arc_is_more_constrained_than_arc?", &RoutingModel::ArcIsMoreConstrainedThanArc)
448
+ .define_method("solver", &RoutingModel::solver)
449
+ .define_method("nodes", &RoutingModel::nodes)
450
+ .define_method("vehicles", &RoutingModel::vehicles)
451
+ .define_method("size", &RoutingModel::Size)
452
+ .define_method("matching_model?", &RoutingModel::IsMatchingModel);
344
453
  }
@@ -4,21 +4,15 @@ require "fileutils"
4
4
  require "net/http"
5
5
  require "tmpdir"
6
6
 
7
- version = "9.3.10497"
7
+ version = "9.4.1874"
8
8
 
9
9
  if RbConfig::CONFIG["host_os"] =~ /darwin/i
10
10
  if RbConfig::CONFIG["host_cpu"] =~ /arm|aarch64/i
11
- raise <<~MSG
12
- Binary installation not available for this platform: Mac ARM
13
-
14
- Run:
15
- brew install or-tools
16
- bundle config build.or-tools --with-or-tools-dir=/opt/homebrew
17
-
18
- MSG
11
+ filename = "or-tools_arm64_MacOsX-12.5_cpp_v#{version}.tar.gz"
12
+ checksum = "ebc185bcb0a056a2704fb1c5175d5c11cc21a7e0634be65139cea55bb6a021ce"
19
13
  else
20
- filename = "or-tools_MacOsX-12.2.1_v#{version}.tar.gz"
21
- checksum = "33941702c59983897935eef06d91aca6c89ed9a8f5f4de3a9dfe489e97d7ca8c"
14
+ filename = "or-tools_x86_64_MacOsX-12.5_cpp_v#{version}.tar.gz"
15
+ checksum = "d03c706b51a6ef7aa77886dc3f135baaac52c00803bb548c286fbdeb4a419acd"
22
16
  end
23
17
  else
24
18
  # try /etc/os-release with fallback to /usr/lib/os-release
@@ -32,21 +26,23 @@ else
32
26
  os_version = os_info["VERSION_ID"]
33
27
 
34
28
  if os == "ubuntu" && os_version == "20.04"
35
- # TODO remove sub in v9.4
36
- filename = "or-tools_amd64_ubuntu-20.04_v#{version.sub(".10497", ".10502")}.tar.gz"
37
- checksum = "3d1979967a2c9358b5bc956f2e6b608b00e89e13c71d48d075475ce4138b6d1c"
29
+ filename = "or-tools_amd64_ubuntu-20.04_cpp_v#{version}.tar.gz"
30
+ checksum = "1b09f0f60b5aab83aeec468842e4a166cd3a4e7910e807f55bc7f96d5dffabdb"
38
31
  elsif os == "ubuntu" && os_version == "18.04"
39
- filename = "or-tools_amd64_ubuntu-18.04_v#{version}.tar.gz"
40
- checksum = "6ba5cc153417267e8f8e15f8b6390b17f22de07bacc61f3740a4172ccd56c274"
32
+ filename = "or-tools_amd64_ubuntu-18.04_cpp_v#{version}.tar.gz"
33
+ checksum = "ef73ebd4ca0f82a1179fdb2aded3c2a85dfe2ab275d91b8a5b147a653ca861ab"
41
34
  elsif os == "debian" && os_version == "11"
42
- filename = "or-tools_amd64_debian-11_v#{version}.tar.gz"
43
- checksum = "db0636bab909eabf06a7004f7572dca6fa152f3823c1365b0b7428405bf250e6"
35
+ filename = "or-tools_amd64_debian-11_cpp_v#{version}.tar.gz"
36
+ checksum = "651c62147f231fb90635c522e0a2c799e3de3991c2c75f7c6acb721e7b78946c"
37
+ elsif os == "debian" && os_version == "10"
38
+ filename = "or-tools_amd64_debian-10_cpp_v#{version}.tar.gz"
39
+ checksum = "36088bc6c6fbb96539245db7cddf498f77ae3e7b7c2cc8f6d7d89d76f90751fb"
44
40
  elsif os == "centos" && os_version == "8"
45
- filename = "or-tools_amd64_centos-8_v#{version}.tar.gz"
46
- checksum = "e5649069fd7a3e8228cc18b91e265a90562c5d03a0c962b0346911aada0aedc9"
41
+ filename = "or-tools_amd64_centos-8_cpp_v#{version}.tar.gz"
42
+ checksum = "da2cb303ae332d207592f21bb504e4e2e33dc1b1e8f5747d413c082d9d05504a"
47
43
  elsif os == "centos" && os_version == "7"
48
- filename = "or-tools_amd64_centos-7_v#{version}.tar.gz"
49
- checksum = "3bffdec8c09fc1345dcbd6a553437e2894014093fafb53e50adc7d4d776bb08b"
44
+ filename = "or-tools_amd64_centos-7_cpp_v#{version}.tar.gz"
45
+ checksum = "9eaf0178467f4d2fdbe496f62223809aa43e313548cc6cb716e661c00472b4ff"
50
46
  else
51
47
  platform =
52
48
  if Gem.win_platform?
@@ -142,12 +138,11 @@ Dir.mktmpdir do |extract_path|
142
138
 
143
139
  # shared library
144
140
  FileUtils.mkdir(File.join(path, "lib"))
145
- Dir.glob("lib/libortools.{dylib,so.9}", base: extract_path) do |file|
146
- FileUtils.cp(File.join(extract_path, file), File.join(path, file))
147
- end
148
- so_path = File.join(path, "lib/libortools.so.9")
149
- if File.exist?(so_path)
150
- File.symlink(so_path, File.join(path, "lib/libortools.so"))
141
+ Dir.glob("lib/libortools.{9.dylib,so.9}", base: extract_path) do |file|
142
+ so_path = File.join(path, file)
143
+ FileUtils.cp(File.join(extract_path, file), so_path)
144
+ ext = file.end_with?(".dylib") ? "dylib" : "so"
145
+ File.symlink(so_path, File.join(path, "lib/libortools.#{ext}"))
151
146
  end
152
147
  end
153
148
 
data/lib/or_tools/tsp.rb CHANGED
@@ -22,13 +22,7 @@ module ORTools
22
22
  manager = ORTools::RoutingIndexManager.new(locations.size, 1, 0)
23
23
  routing = ORTools::RoutingModel.new(manager)
24
24
 
25
- distance_callback = lambda do |from_index, to_index|
26
- from_node = manager.index_to_node(from_index)
27
- to_node = manager.index_to_node(to_index)
28
- distance_matrix[from_node][to_node]
29
- end
30
-
31
- transit_callback_index = routing.register_transit_callback(distance_callback)
25
+ transit_callback_index = routing.register_transit_matrix(distance_matrix)
32
26
  routing.set_arc_cost_evaluator_of_all_vehicles(transit_callback_index)
33
27
  assignment = routing.solve(first_solution_strategy: :path_cheapest_arc)
34
28
 
@@ -1,3 +1,3 @@
1
1
  module ORTools
2
- VERSION = "0.7.1"
2
+ VERSION = "0.8.0"
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.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kane
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-28 00:00:00.000000000 Z
11
+ date: 2022-08-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rice
@@ -85,7 +85,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - ">="
87
87
  - !ruby/object:Gem::Version
88
- version: '2.6'
88
+ version: '2.7'
89
89
  required_rubygems_version: !ruby/object:Gem::Requirement
90
90
  requirements:
91
91
  - - ">="