or-tools 0.7.2 → 0.7.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2a6d267706d117ea1b3e1e76b0c74f49d28fedb300e39243ccf9d5160bcc5c76
4
- data.tar.gz: 401e862ce8f7ae97608c746df879d7b43b39738bb45293097ef0dd61363b6491
3
+ metadata.gz: 976e5d3e7d64ac20e1d445baa12720acd4e91469d1fddbaf8c71cf32e1bb7be6
4
+ data.tar.gz: 38d1b76452dc3df179cc7536e466846bf6030dfcd1da283393cbfa3c9c68b4b6
5
5
  SHA512:
6
- metadata.gz: 34775f80be4bcf4fb0b039189365d66241821f9805ffa0e83f794a8c1fa00e5c3857ac90b2c98b2050004e92eb4b522155f11475b8335ac1f9f18666bd775503
7
- data.tar.gz: fb904b96d10d5e88e9cbdc2326b031f46a565589546786899797432a66487464afaf31ff86f2f3f751d24cdf1993f09a366b7f0e411f28004292de4a12272bf6
6
+ metadata.gz: 2612839346ab70b75cb4f307ae2116816a4638580a1e943e3c09247af4ff0e27177549ae2c170aa1b67d6453922883265c7c7c93d8dfbf573ec1bce650864bc6
7
+ data.tar.gz: 256087097f368c7c34d4affc531ef744184c897e99b0727f1c00a620644399de77b9c874e5cfc0f5a519552e965c55647146ad3b29346ebfd4ecc595a8d35068
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.7.3 (2022-07-23)
2
+
3
+ - Added more methods to `RoutingModel` and `RoutingDimension`
4
+
1
5
  ## 0.7.2 (2022-05-28)
2
6
 
3
7
  - Fixed library not loaded error on Mac
@@ -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,103 @@ 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
+ .define_method(
386
+ "solve",
387
+ [](RoutingModel& self) {
388
+ return self.Solve();
389
+ })
390
+ .define_method(
391
+ "solve_with_parameters",
392
+ [](RoutingModel& self, const RoutingSearchParameters& search_parameters) {
393
+ return self.SolveWithParameters(search_parameters);
394
+ })
395
+ .define_method("compute_lower_bound", &RoutingModel::ComputeLowerBound)
396
+ .define_method("status",
397
+ [](RoutingModel& self) {
288
398
  auto status = self.status();
289
399
 
290
400
  if (status == RoutingModel::ROUTING_NOT_SOLVED) {
@@ -301,30 +411,22 @@ void init_routing(Rice::Module& m) {
301
411
  throw std::runtime_error("Unknown solver status");
302
412
  }
303
413
  })
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)
414
+ .define_method("apply_locks", &RoutingModel::ApplyLocks)
415
+ .define_method("apply_locks_to_all_vehicles", &RoutingModel::ApplyLocksToAllVehicles)
416
+ .define_method("pre_assignment", &RoutingModel::PreAssignment)
417
+ .define_method("mutable_pre_assignment", &RoutingModel::MutablePreAssignment)
418
+ .define_method("write_assignment", &RoutingModel::WriteAssignment)
419
+ .define_method("read_assignment", &RoutingModel::ReadAssignment)
420
+ .define_method("restore_assignment", &RoutingModel::RestoreAssignment)
421
+ .define_method("read_assignment_from_routes", &RoutingModel::ReadAssignmentFromRoutes)
422
+ .define_method("routes_to_assignment", &RoutingModel::RoutesToAssignment)
423
+ .define_method("assignment_to_routes", &RoutingModel::AssignmentToRoutes)
424
+ .define_method("compact_assignment", &RoutingModel::CompactAssignment)
425
+ .define_method("compact_and_check_assignment", &RoutingModel::CompactAndCheckAssignment)
426
+ .define_method("add_to_assignment", &RoutingModel::AddToAssignment)
427
+ .define_method("add_interval_to_assignment", &RoutingModel::AddIntervalToAssignment)
428
+ // TODO PackCumulsOfOptimizerDimensionsFromAssignment
429
+ // TODO AddLocalSearchFilter
328
430
  .define_method("start", &RoutingModel::Start)
329
431
  .define_method("end", &RoutingModel::End)
330
432
  .define_method("start?", &RoutingModel::IsStart)
@@ -333,12 +435,23 @@ void init_routing(Rice::Module& m) {
333
435
  .define_method("next", &RoutingModel::Next)
334
436
  .define_method("vehicle_used?", &RoutingModel::IsVehicleUsed)
335
437
  .define_method("next_var", &RoutingModel::NextVar)
438
+ .define_method("active_var", &RoutingModel::ActiveVar)
439
+ .define_method("active_vehicle_var", &RoutingModel::ActiveVehicleVar)
440
+ .define_method("vehicle_route_considered_var", &RoutingModel::VehicleRouteConsideredVar)
441
+ .define_method("vehicle_var", &RoutingModel::VehicleVar)
442
+ .define_method("resource_var", &RoutingModel::ResourceVar)
443
+ .define_method("cost_var", &RoutingModel::CostVar)
336
444
  .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
- });
445
+ .define_method("costs_are_homogeneous_across_vehicles?", &RoutingModel::CostsAreHomogeneousAcrossVehicles)
446
+ .define_method("homogeneous_cost", &RoutingModel::GetHomogeneousCost)
447
+ .define_method("arc_cost_for_first_solution", &RoutingModel::GetArcCostForFirstSolution)
448
+ .define_method("cost_classes_count", &RoutingModel::GetCostClassesCount)
449
+ .define_method("non_zero_cost_classes_count", &RoutingModel::GetNonZeroCostClassesCount)
450
+ .define_method("vehicle_classes_count", &RoutingModel::GetVehicleClassesCount)
451
+ .define_method("arc_is_more_constrained_than_arc?", &RoutingModel::ArcIsMoreConstrainedThanArc)
452
+ .define_method("solver", &RoutingModel::solver)
453
+ .define_method("nodes", &RoutingModel::nodes)
454
+ .define_method("vehicles", &RoutingModel::vehicles)
455
+ .define_method("size", &RoutingModel::Size)
456
+ .define_method("matching_model?", &RoutingModel::IsMatchingModel);
344
457
  }
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.2"
2
+ VERSION = "0.7.3"
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.2
4
+ version: 0.7.3
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-07-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rice