SciML / SteadyStateDiffEq.jl

Solvers for steady states in scientific machine learning (SciML)
Other
30 stars 22 forks source link

DynamicSS crashes #6

Closed hronellenfitsch closed 6 years ago

hronellenfitsch commented 6 years ago

Consider the following snippet:

function f(u, p, t)
    return -u
end

prob = ODEProblem(f, ones(5), (0.0, 100.0))
prob = SteadyStateProblem(prob)
 solve(prob, DynamicSS(Tsit5()))

This should be the most straightforward possible. However, it crashes with the following error message:

type Tsit5ConstantCache has no field tmp

Stacktrace:
 [1] allDerivPass at /home/henrik/.julia/v0.6/DiffEqCallbacks/src/terminatesteadystate.jl:11 [inlined]
 [2] #48 at /home/henrik/.julia/v0.6/DiffEqCallbacks/src/terminatesteadystate.jl:25 [inlined]
 [3] apply_discrete_callback! at /home/henrik/.julia/v0.6/OrdinaryDiffEq/src/callbacks.jl:189 [inlined]
 [4] handle_callbacks!(::OrdinaryDiffEq.ODEIntegrator{OrdinaryDiffEq.Tsit5,Array{Float64,1},Float64,Void,Float64,Float64,Float64,Array{Array{Float64,1},1},DiffEqBase.ODESolution{Float64,2,Array{Array{Float64,1},1},Void,Void,Array{Float64,1},Array{Array{Array{Float64,1},1},1},DiffEqBase.ODEProblem{Array{Float64,1},Float64,false,Void,#f,Void,Void,UniformScaling{Int64},DiffEqBase.StandardODEProblem},OrdinaryDiffEq.Tsit5,OrdinaryDiffEq.InterpolationData{#f,Array{Array{Float64,1},1},Array{Float64,1},Array{Array{Array{Float64,1},1},1},OrdinaryDiffEq.Tsit5ConstantCache{Float64,Float64}}},#f,Void,OrdinaryDiffEq.Tsit5ConstantCache{Float64,Float64},OrdinaryDiffEq.DEOptions{Float64,Float64,Float64,Float64,DiffEqBase.#ODE_DEFAULT_NORM,DiffEqBase.CallbackSet{Tuple{},Tuple{DiffEqBase.DiscreteCallback{DiffEqCallbacks.##48#50{Float64,Float64,DiffEqCallbacks.#allDerivPass},DiffEqCallbacks.##49#51,DiffEqBase.#INITIALIZE_DEFAULT}}},DiffEqBase.#ODE_DEFAULT_ISOUTOFDOMAIN,DiffEqBase.#ODE_DEFAULT_PROG_MESSAGE,DiffEqBase.#ODE_DEFAULT_UNSTABLE_CHECK,DataStructures.BinaryHeap{Float64,DataStructures.LessThan},DataStructures.BinaryHeap{Float64,DataStructures.LessThan},Void,Void,Int64,Array{Float64,1},Array{Float64,1},Array{Float64,1}},Array{Float64,1}}) at /home/henrik/.julia/v0.6/OrdinaryDiffEq/src/integrators/integrator_utils.jl:306
 [5] loopfooter!(::OrdinaryDiffEq.ODEIntegrator{OrdinaryDiffEq.Tsit5,Array{Float64,1},Float64,Void,Float64,Float64,Float64,Array{Array{Float64,1},1},DiffEqBase.ODESolution{Float64,2,Array{Array{Float64,1},1},Void,Void,Array{Float64,1},Array{Array{Array{Float64,1},1},1},DiffEqBase.ODEProblem{Array{Float64,1},Float64,false,Void,#f,Void,Void,UniformScaling{Int64},DiffEqBase.StandardODEProblem},OrdinaryDiffEq.Tsit5,OrdinaryDiffEq.InterpolationData{#f,Array{Array{Float64,1},1},Array{Float64,1},Array{Array{Array{Float64,1},1},1},OrdinaryDiffEq.Tsit5ConstantCache{Float64,Float64}}},#f,Void,OrdinaryDiffEq.Tsit5ConstantCache{Float64,Float64},OrdinaryDiffEq.DEOptions{Float64,Float64,Float64,Float64,DiffEqBase.#ODE_DEFAULT_NORM,DiffEqBase.CallbackSet{Tuple{},Tuple{DiffEqBase.DiscreteCallback{DiffEqCallbacks.##48#50{Float64,Float64,DiffEqCallbacks.#allDerivPass},DiffEqCallbacks.##49#51,DiffEqBase.#INITIALIZE_DEFAULT}}},DiffEqBase.#ODE_DEFAULT_ISOUTOFDOMAIN,DiffEqBase.#ODE_DEFAULT_PROG_MESSAGE,DiffEqBase.#ODE_DEFAULT_UNSTABLE_CHECK,DataStructures.BinaryHeap{Float64,DataStructures.LessThan},DataStructures.BinaryHeap{Float64,DataStructures.LessThan},Void,Void,Int64,Array{Float64,1},Array{Float64,1},Array{Float64,1}},Array{Float64,1}}) at /home/henrik/.julia/v0.6/OrdinaryDiffEq/src/integrators/integrator_utils.jl:264
 [6] solve!(::OrdinaryDiffEq.ODEIntegrator{OrdinaryDiffEq.Tsit5,Array{Float64,1},Float64,Void,Float64,Float64,Float64,Array{Array{Float64,1},1},DiffEqBase.ODESolution{Float64,2,Array{Array{Float64,1},1},Void,Void,Array{Float64,1},Array{Array{Array{Float64,1},1},1},DiffEqBase.ODEProblem{Array{Float64,1},Float64,false,Void,#f,Void,Void,UniformScaling{Int64},DiffEqBase.StandardODEProblem},OrdinaryDiffEq.Tsit5,OrdinaryDiffEq.InterpolationData{#f,Array{Array{Float64,1},1},Array{Float64,1},Array{Array{Array{Float64,1},1},1},OrdinaryDiffEq.Tsit5ConstantCache{Float64,Float64}}},#f,Void,OrdinaryDiffEq.Tsit5ConstantCache{Float64,Float64},OrdinaryDiffEq.DEOptions{Float64,Float64,Float64,Float64,DiffEqBase.#ODE_DEFAULT_NORM,DiffEqBase.CallbackSet{Tuple{},Tuple{DiffEqBase.DiscreteCallback{DiffEqCallbacks.##48#50{Float64,Float64,DiffEqCallbacks.#allDerivPass},DiffEqCallbacks.##49#51,DiffEqBase.#INITIALIZE_DEFAULT}}},DiffEqBase.#ODE_DEFAULT_ISOUTOFDOMAIN,DiffEqBase.#ODE_DEFAULT_PROG_MESSAGE,DiffEqBase.#ODE_DEFAULT_UNSTABLE_CHECK,DataStructures.BinaryHeap{Float64,DataStructures.LessThan},DataStructures.BinaryHeap{Float64,DataStructures.LessThan},Void,Void,Int64,Array{Float64,1},Array{Float64,1},Array{Float64,1}},Array{Float64,1}}) at /home/henrik/.julia/v0.6/OrdinaryDiffEq/src/solve.jl:342
 [7] #solve#1263(::Array{Any,1}, ::Function, ::DiffEqBase.ODEProblem{Array{Float64,1},Float64,false,Void,#f,Void,Void,UniformScaling{Int64},DiffEqBase.StandardODEProblem}, ::OrdinaryDiffEq.Tsit5, ::Array{Any,1}, ::Array{Any,1}, ::Array{Any,1}, ::Type{Val{true}}) at /home/henrik/.julia/v0.6/OrdinaryDiffEq/src/solve.jl:7
 [8] (::DiffEqBase.#kw##solve)(::Array{Any,1}, ::DiffEqBase.#solve, ::DiffEqBase.ODEProblem{Array{Float64,1},Float64,false,Void,#f,Void,Void,UniformScaling{Int64},DiffEqBase.StandardODEProblem}, ::OrdinaryDiffEq.Tsit5, ::Array{Any,1}, ::Array{Any,1}, ::Array{Any,1}, ::Type{Val{true}}) at ./<missing>:0 (repeats 2 times)
 [9] #solve#16(::Array{Any,1}, ::Function, ::DiffEqBase.SteadyStateProblem{Array{Float64,1},false,Void,Void,#f,UniformScaling{Int64}}, ::SteadyStateDiffEq.DynamicSS{OrdinaryDiffEq.Tsit5,Float64,Float64}) at /home/henrik/.julia/v0.6/SteadyStateDiffEq/src/solve.jl:45
 [10] solve(::DiffEqBase.SteadyStateProblem{Array{Float64,1},false,Void,Void,#f,UniformScaling{Int64}}, ::SteadyStateDiffEq.DynamicSS{OrdinaryDiffEq.Tsit5,Float64,Float64}) at /home/henrik/.julia/v0.6/SteadyStateDiffEq/src/solve.jl:42`
ChrisRackauckas commented 6 years ago

oh, we need an alternative route for out-of-place functions. In-place functions work.

hronellenfitsch commented 6 years ago

Yes, using inplace f(du, u, p, t) works :) Thank you!

ChrisRackauckas commented 6 years ago

I'll fix this up in a little bit too. It shouldn't be difficult.

ChrisRackauckas commented 6 years ago

Fixed by https://github.com/JuliaDiffEq/DiffEqCallbacks.jl/commit/14b80f06c29edc08cb328e5a4d0351d3ab99015c

ChrisRackauckas commented 6 years ago

I'll release that patch in a bit.