From 6a73faf8171d03bbce4da7df0b166292019fee9f Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 15 Jul 2026 04:40:21 -0400 Subject: [PATCH] Fix strict Kantorovich step acceptance Co-Authored-By: Chris Rackauckas --- lib/ImplicitDiscreteSolve/Project.toml | 2 +- lib/ImplicitDiscreteSolve/src/controller.jl | 10 +++++----- lib/ImplicitDiscreteSolve/test/runtests.jl | 14 ++++++++++++++ 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/lib/ImplicitDiscreteSolve/Project.toml b/lib/ImplicitDiscreteSolve/Project.toml index a12aaced1c5..274e6b949eb 100644 --- a/lib/ImplicitDiscreteSolve/Project.toml +++ b/lib/ImplicitDiscreteSolve/Project.toml @@ -1,7 +1,7 @@ name = "ImplicitDiscreteSolve" uuid = "3263718b-31ed-49cf-8a0f-35a466e8af96" authors = ["vyudu "] -version = "2.1.3" +version = "2.1.4" [deps] CommonSolve = "38540f10-b2f7-11e9-35d8-d573e4eb0ff2" diff --git a/lib/ImplicitDiscreteSolve/src/controller.jl b/lib/ImplicitDiscreteSolve/src/controller.jl index 77ffd180ee6..619212dea03 100644 --- a/lib/ImplicitDiscreteSolve/src/controller.jl +++ b/lib/ImplicitDiscreteSolve/src/controller.jl @@ -112,14 +112,14 @@ function OrdinaryDiffEqCore.step_reject_controller!( return end +function _accept_kantorovich_step(controller, Θks) + return !controller.strict || all(Θk -> Θk <= controller.Θreject, Θks) +end + function OrdinaryDiffEqCore.accept_step_controller(integrator, cache::KantorovichTypeControllerCache, alg) (; controller) = cache (; Θks) = integrator.cache - if controller.strict - return all(controller.Θreject .< Θks) - else - return true - end + return _accept_kantorovich_step(controller, Θks) end function OrdinaryDiffEqCore.sync_controllers!(cache1::KantorovichTypeControllerCache, cache2::KantorovichTypeControllerCache) diff --git a/lib/ImplicitDiscreteSolve/test/runtests.jl b/lib/ImplicitDiscreteSolve/test/runtests.jl index a3ed609a380..1e4562ed34c 100644 --- a/lib/ImplicitDiscreteSolve/test/runtests.jl +++ b/lib/ImplicitDiscreteSolve/test/runtests.jl @@ -92,6 +92,20 @@ if TEST_GROUP != "QA" @test idsol.retcode == ReturnCode.Success end + @testset "Kantorovich strict acceptance" begin + strict = ImplicitDiscreteSolve.KantorovichTypeController(; + Θmin = 1 // 8, p = 1 + ) + @test ImplicitDiscreteSolve._accept_kantorovich_step(strict, Float64[]) + @test ImplicitDiscreteSolve._accept_kantorovich_step(strict, [0.2, 0.95]) + @test !ImplicitDiscreteSolve._accept_kantorovich_step(strict, [0.2, 0.951]) + + nonstrict = ImplicitDiscreteSolve.KantorovichTypeController(; + Θmin = 1 // 8, p = 1, strict = false + ) + @test ImplicitDiscreteSolve._accept_kantorovich_step(nonstrict, [Inf]) + end + @testset "Handle nothing in u0" begin emptyiip(residual, u_next, u, p, t) = nothing emptyoop(u_next, u, p, t) = nothing