diff --git a/CHANGELOG.md b/CHANGELOG.md index 8760b7c..45b6fa9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,7 @@ ## 0.18.1 (unreleased) - Added support for breaks for routing +- Added `fix_variables_to_their_hinted_value`, `log_search_progress`, and `max_deterministic_time` to `SatParameters` ## 0.18.0 (2026-07-06) diff --git a/ext/or-tools/constraint.cpp b/ext/or-tools/constraint.cpp index 312c70c..933bff1 100644 --- a/ext/or-tools/constraint.cpp +++ b/ext/or-tools/constraint.cpp @@ -141,8 +141,14 @@ void init_constraint(Rice::Module& m) { .define_method("cp_model_presolve=", &SatParameters::set_cp_model_presolve) .define_method("enumerate_all_solutions", &SatParameters::enumerate_all_solutions) .define_method("enumerate_all_solutions=", &SatParameters::set_enumerate_all_solutions) + .define_method("fix_variables_to_their_hinted_value", &SatParameters::fix_variables_to_their_hinted_value) + .define_method("fix_variables_to_their_hinted_value=", &SatParameters::set_fix_variables_to_their_hinted_value) .define_method("linearization_level", &SatParameters::linearization_level) .define_method("linearization_level=", &SatParameters::set_linearization_level) + .define_method("log_search_progress", &SatParameters::log_search_progress) + .define_method("log_search_progress=", &SatParameters::set_log_search_progress) + .define_method("max_deterministic_time", &SatParameters::max_deterministic_time) + .define_method("max_deterministic_time=", &SatParameters::set_max_deterministic_time) .define_method("max_time_in_seconds", &SatParameters::max_time_in_seconds) .define_method("max_time_in_seconds=", &SatParameters::set_max_time_in_seconds) .define_method("num_workers", &SatParameters::num_workers) diff --git a/test/constraint_test.rb b/test/constraint_test.rb index f419898..354944f 100644 --- a/test/constraint_test.rb +++ b/test/constraint_test.rb @@ -234,6 +234,50 @@ def test_time_limit assert_equal :unknown, status end + def test_max_deterministic_time + model = ORTools::CpModel.new + num_vals = 3 + x = model.new_int_var(0, num_vals - 1, "x") + y = model.new_int_var(0, num_vals - 1, "y") + model.add(x != y) + + solver = ORTools::CpSolver.new + solver.parameters.max_deterministic_time = 0 + assert_equal 0, solver.parameters.max_deterministic_time + + status = solver.solve(model) + assert_equal :unknown, status + end + + def test_fix_variables_to_their_hinted_value + model = ORTools::CpModel.new + x = model.new_int_var(0, 10, "x") + model.add_hint(x, 7) + model.minimize(x) + + solver = ORTools::CpSolver.new + solver.parameters.fix_variables_to_their_hinted_value = true + assert solver.parameters.fix_variables_to_their_hinted_value + + assert_equal :optimal, solver.solve(model) + assert_equal 7, solver.value(x) + end + + def test_log_search_progress + model = ORTools::CpModel.new + x = model.new_int_var(0, 10, "x") + model.minimize(x) + + solver = ORTools::CpSolver.new + solver.parameters.log_search_progress = true + assert solver.parameters.log_search_progress + + stdout, _ = capture_subprocess_io do + assert_equal :optimal, solver.solve(model) + end + assert_match "Starting CP-SAT solver", stdout + end + def test_infeasible_value model = ORTools::CpModel.new