From 2ec19afc11215b89a2b3047f3b933658c1b66747 Mon Sep 17 00:00:00 2001 From: Andrew Kane Date: Thu, 1 Oct 2026 20:42:12 -0700 Subject: [PATCH 1/2] Added ImprovementSearchLimitParameters - resolves #85 Co-authored-by: Eric Kreutzer --- ext/or-tools/routing.cpp | 7 +++++++ test/routing_test.rb | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/ext/or-tools/routing.cpp b/ext/or-tools/routing.cpp index 611a083..ba3c233 100644 --- a/ext/or-tools/routing.cpp +++ b/ext/or-tools/routing.cpp @@ -136,6 +136,12 @@ void init_routing(Rice::Module& m) { m.define_singleton_function("default_routing_search_parameters", &DefaultRoutingSearchParameters); + Rice::define_class_under(rb_cRoutingSearchParameters, "ImprovementSearchLimitParameters") + .define_method("improvement_rate_coefficient", &RoutingSearchParameters::ImprovementSearchLimitParameters::improvement_rate_coefficient) + .define_method("improvement_rate_coefficient=", &RoutingSearchParameters::ImprovementSearchLimitParameters::set_improvement_rate_coefficient) + .define_method("improvement_rate_solutions_distance", &RoutingSearchParameters::ImprovementSearchLimitParameters::improvement_rate_solutions_distance) + .define_method("improvement_rate_solutions_distance=", &RoutingSearchParameters::ImprovementSearchLimitParameters::set_improvement_rate_solutions_distance); + rb_cRoutingSearchParameters .define_method("christofides_use_minimum_matching", &RoutingSearchParameters::christofides_use_minimum_matching) .define_method("christofides_use_minimum_matching=", &RoutingSearchParameters::set_christofides_use_minimum_matching) @@ -257,6 +263,7 @@ void init_routing(Rice::Module& m) { return self.set_local_search_metaheuristic(v); }) + .define_method("improvement_limit_parameters", &RoutingSearchParameters::mutable_improvement_limit_parameters) .define_method( "time_limit=", [](RoutingSearchParameters& self, int64_t value) { diff --git a/test/routing_test.rb b/test/routing_test.rb index 9f9fe7c..06a27ff 100644 --- a/test/routing_test.rb +++ b/test/routing_test.rb @@ -907,6 +907,14 @@ def test_search_parameters search_parameters.first_solution_strategy = :path_cheapest_arc search_parameters.local_search_metaheuristic = :guided_local_search search_parameters.log_search = true + + assert_equal 0, search_parameters.improvement_limit_parameters.improvement_rate_coefficient + search_parameters.improvement_limit_parameters.improvement_rate_coefficient = 0.5 + assert_equal 0.5, search_parameters.improvement_limit_parameters.improvement_rate_coefficient + + assert_equal 0, search_parameters.improvement_limit_parameters.improvement_rate_solutions_distance + search_parameters.improvement_limit_parameters.improvement_rate_solutions_distance = 1 + assert_equal 1, search_parameters.improvement_limit_parameters.improvement_rate_solutions_distance end def test_set_allowed_vehicles_for_index From 07cfcf8c3997458c3eb7fd2f916b3c696e950681 Mon Sep 17 00:00:00 2001 From: Eric Kreutzer Date: Fri, 2 Oct 2026 05:01:34 -0600 Subject: [PATCH 2/2] fix(routing): Retain parent for improvement parameters --- ext/or-tools/routing.cpp | 2 +- test/routing_test.rb | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/ext/or-tools/routing.cpp b/ext/or-tools/routing.cpp index 2f1fa96..73ec71d 100644 --- a/ext/or-tools/routing.cpp +++ b/ext/or-tools/routing.cpp @@ -481,7 +481,7 @@ void init_routing(Rice::Module& m) { return self.set_local_search_metaheuristic(v); }) - .define_method("improvement_limit_parameters", &RoutingSearchParameters::mutable_improvement_limit_parameters) + .define_method("improvement_limit_parameters", &RoutingSearchParameters::mutable_improvement_limit_parameters, Rice::Return().keepAlive()) .define_method( "time_limit=", [](RoutingSearchParameters& self, int64_t value) { diff --git a/test/routing_test.rb b/test/routing_test.rb index 06a27ff..94431ad 100644 --- a/test/routing_test.rb +++ b/test/routing_test.rb @@ -1,4 +1,5 @@ require_relative "test_helper" +require "weakref" class RoutingTest < Minitest::Test # https://developers.google.com/optimization/routing/tsp @@ -917,6 +918,20 @@ def test_search_parameters assert_equal 1, search_parameters.improvement_limit_parameters.improvement_rate_solutions_distance end + def test_improvement_parameters_retain_search_parameters + search_parameters = ORTools.default_routing_search_parameters + parent = WeakRef.new(search_parameters) + limits = search_parameters.improvement_limit_parameters + search_parameters = nil + 3.times { GC.start } + + assert parent.weakref_alive? + limits.improvement_rate_coefficient = 0.5 + limits.improvement_rate_solutions_distance = 1 + assert_equal 0.5, limits.improvement_rate_coefficient + assert_equal 1, limits.improvement_rate_solutions_distance + end + def test_set_allowed_vehicles_for_index manager = ORTools::RoutingIndexManager.new(1, 1, 0) routing = ORTools::RoutingModel.new(manager)