or-tools 0.7.2 → 0.7.3

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: 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