diff --git a/src/initialization.jl b/src/initialization.jl index 53fcd63f0..9ba8d0832 100644 --- a/src/initialization.jl +++ b/src/initialization.jl @@ -301,11 +301,11 @@ end function initialization_status(prob::AbstractSciMLProblem) has_initialization_data(prob.f) || return nothing - sys = prob.f.initialization_data.initializeprob.f.sys - isnothing(sys) && return nothing + iprob = prob.f.initialization_data.initializeprob + isnothing(prob) && return nothing - neqs = length(equations(sys)) - nunknowns = length(unknowns(sys)) + neqs = length(iprob.f(iprob.u0, iprob.p)) + nunknowns = length(iprob.u0) if neqs > nunknowns return OVERDETERMINED diff --git a/src/problems/problem_utils.jl b/src/problems/problem_utils.jl index ad23cea6a..b9b3eaf46 100644 --- a/src/problems/problem_utils.jl +++ b/src/problems/problem_utils.jl @@ -29,9 +29,15 @@ function Base.summary(io::IO, prob::AbstractDEProblem) no_color, ". In-place: ", type_color, isinplace(prob), no_color) init = initialization_status(prob) - !isnothing(init) && print(io, "Initialization status: ", type_color, initialization_status(prob), no_color) - println(io) - print(io, "Non-trivial mass matrix: ", type_color, !(prob.f.mass_matrix isa LinearAlgebra.UniformScaling{Bool}), no_color) + !isnothing(init) && begin + println(io) + print(io, "Initialization status: ", type_color, initialization_status(prob), no_color) + end + + hasproperty(prob.f, :mass_matrix) && begin + println(io) + print(io, "Non-trivial mass matrix: ", type_color, !(prob.f.mass_matrix isa LinearAlgebra.UniformScaling{Bool}), no_color) + end end function Base.summary(io::IO, prob::AbstractLinearProblem) diff --git a/test/downstream/initialization.jl b/test/downstream/initialization.jl index 97ae851dd..0101d3cb9 100644 --- a/test/downstream/initialization.jl +++ b/test/downstream/initialization.jl @@ -58,3 +58,21 @@ end @test getp(sys, p)(pobj) ≈ 1.0 @test getp(sys, q)(pobj) ≈ sqrt(2) end + +@testset "Initialization info printed" begin + @parameters g + @variables x(t) y(t) [state_priority = 10] λ(t) + eqs = [D(D(x)) ~ λ * x + D(D(y)) ~ λ * y - g + x^2 + y^2 ~ 1] + @mtkbuild pend = ODESystem(eqs, t) + + prob = ODEProblem(pend, [x => 1, y => 0], (0.0, 1.5), [g => 1], guesses = [λ => 1]) + @test occursin("Initialization status: FULLY_DETERMINED", sprint(summary, prob)) + + prob = ODEProblem(pend, [], (0.0, 1.5), [g => 1], guesses = [λ => 1, x => 1, y => 0]) + @test occursin("Initialization status: UNDERDETERMINED", sprint(summary, prob)) + + prob = ODEProblem(pend, [x => 1, y => 0, λ => 2], (0.0, 1.5), [g => 1]) + @test occursin("Initialization status: OVERDETERMINED", sprint(summary, prob)) +end