Skip to content

Commit cab5246

Browse files
Merge pull request #941 from AayushSabharwal/as/initstatus
fix: fix and test `initialization_status`
2 parents 4e76d51 + b749552 commit cab5246

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

src/initialization.jl

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,12 @@ function initialization_status(prob::AbstractSciMLProblem)
304304
iprob = prob.f.initialization_data.initializeprob
305305
isnothing(prob) && return nothing
306306

307-
neqs = length(iprob.f(iprob.u0, iprob.p))
308-
nunknowns = length(iprob.u0)
307+
nunknowns = iprob.u0 === nothing ? 0 : length(iprob.u0)
308+
neqs = if __has_resid_prototype(iprob.f) && iprob.f.resid_prototype !== nothing
309+
length(iprob.f.resid_prototype)
310+
else
311+
nunknowns
312+
end
309313

310314
if neqs > nunknowns
311315
return OVERDETERMINED

test/initialization.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ end
126126

127127
@testset "No-op without `initialization_data`" begin
128128
prob = ODEProblem(rhs2, [1.0, 2.0], (0.0, 1.0), 1.0)
129+
@test SciMLBase.initialization_status(prob) === nothing
129130
integ = init(prob)
130131
integ.u[2] = 3.0
131132
u0, p, success = SciMLBase.get_initial_values(
@@ -153,6 +154,7 @@ end
153154
initprob, update_initializeprob!, initprobmap, initprobpmap)
154155
fn = ODEFunction(rhs2; initialization_data)
155156
prob = ODEProblem(fn, [2.0, 0.0], (0.0, 1.0), 0.0)
157+
@test SciMLBase.initialization_status(prob) == SciMLBase.FULLY_DETERMINED
156158
integ = init(prob; initializealg = NoInit())
157159

158160
@testset "Errors without `nlsolve_alg`" begin
@@ -279,6 +281,7 @@ end
279281
initprob, update_initializeprob!, initprobmap, initprobpmap)
280282
fn = ODEFunction(rhs2; initialization_data)
281283
prob = ODEProblem(fn, [2.0, 0.0], (0.0, 1.0), 0.0)
284+
@test SciMLBase.initialization_status(prob) == SciMLBase.FULLY_DETERMINED
282285
integ = init(prob; initializealg = NoInit())
283286

284287
u0, p, success = SciMLBase.get_initial_values(
@@ -293,6 +296,30 @@ end
293296
@test_nowarn remake(prob)
294297
end
295298
end
299+
300+
@testset "Initialization status for overdetermined case" begin
301+
initfn = NonlinearFunction(; resid_prototype = ones(3)) do u, p
302+
return [u[1] - 1.0, u[2] - 1.0, u[1] * u[2] - 1.0]
303+
end
304+
initprob = NonlinearLeastSquaresProblem(initfn, ones(2))
305+
initialization_data = SciMLBase.OverrideInitData(
306+
initprob, nothing, nothing, nothing)
307+
fn = ODEFunction(rhs2; initialization_data)
308+
prob = ODEProblem(fn, [2.0, 0.0], (0.0, 1.0), 0.0)
309+
@test SciMLBase.initialization_status(prob) == SciMLBase.OVERDETERMINED
310+
end
311+
312+
@testset "Initialization status for underdetermined case" begin
313+
initfn = NonlinearFunction(; resid_prototype = ones(1)) do u, p
314+
return [u[1] - 1.0]
315+
end
316+
initprob = NonlinearLeastSquaresProblem(initfn, ones(2))
317+
initialization_data = SciMLBase.OverrideInitData(
318+
initprob, nothing, nothing, nothing)
319+
fn = ODEFunction(rhs2; initialization_data)
320+
prob = ODEProblem(fn, [2.0, 0.0], (0.0, 1.0), 0.0)
321+
@test SciMLBase.initialization_status(prob) == SciMLBase.UNDERDETERMINED
322+
end
296323
end
297324

298325
@testset "NoInit" begin

0 commit comments

Comments
 (0)