SciML / JumpProcesses.jl

Build and simulate jump equations like Gillespie simulations and jump diffusions with constant and state-dependent rates and mix with differential equations and scientific machine learning (SciML)
https://docs.sciml.ai/JumpProcesses/stable/
Other
136 stars 35 forks source link

Callback broken with `Coevolve` #324

Closed gaurav-arya closed 1 year ago

gaurav-arya commented 1 year ago

MWE on v9.6.3

using JumpProcesses

rate(u, p, t; debug=true) = 5.0
function affect!(integrator)
    integrator.u[1] += 1
    nothing
end
jump = VariableRateJump(rate, affect!; urate=(u,p,t)->10.0, rateinterval=(u,p,t)->0.1)

prob = DiscreteProblem([0.0], (0.0, 2.0), [1.0])
jump_prob_c = JumpProblem(prob, Coevolve(), jump; dep_graph=[[1]])
sol_c = solve(jump_prob_c, SSAStepper()) # this line has to exist, else we don't error at the end...

function terminate_condition(u, t, integrator)
    return u[1] >= 1
end

function terminate_affect!(integrator)
    terminate!(integrator)
end

terminate_cb = DiscreteCallback(terminate_condition, terminate_affect!)
solve(jump_prob_c, SSAStepper(); callback=terminate_cb)

Error:

ERROR: Error, invalid affects! type. Expected a vector of function wrappers and got Vector{FunctionWrappers.FunctionWrapper{Nothing, Tuple{JumpProcesses.SSAIntegrator{DiscreteFunction{true, SciMLBase.FullSpecialize, SciMLBase.var"#200#201", Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Vector{Float64}, Float64, Float64, Vector{Float64}, ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Nothing, DiscreteProblem{Vector{Float64}, Tuple{Float64, Float64}, true, Vector{Float64}, DiscreteFunction{true, SciMLBase.FullSpecialize, SciMLBase.var"#200#201", Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}}, SSAStepper, SciMLBase.ConstantInterpolation{Vector{Float64}, Vector{Vector{Float64}}}, DiffEqBase.Stats, Nothing}, DiscreteCallback{JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}, Nothing, NamedTuple{(:callback,), Tuple{CallbackSet{Tuple{}, Tuple{}}}}, Vector{Float64}}}}}
Stacktrace:
 [1] error(s::String)
   @ Base ./error.jl:35
 [2] (::JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}})(integrator::JumpProcesses.SSAIntegrator{DiscreteFunction{true, SciMLBase.FullSpecialize, SciMLBase.var"#200#201", Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Vector{Float64}, Float64, Float64, Vector{Float64}, ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Nothing, DiscreteProblem{Vector{Float64}, Tuple{Float64, Float64}, true, Vector{Float64}, DiscreteFunction{true, SciMLBase.FullSpecialize, SciMLBase.var"#200#201", Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}}, SSAStepper, SciMLBase.ConstantInterpolation{Vector{Float64}, Vector{Vector{Float64}}}, DiffEqBase.Stats, Nothing}, DiscreteCallback{JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}, Nothing, NamedTuple{(:callback,), Tuple{CallbackSet{Tuple{}, Tuple{DiscreteCallback{typeof(terminate_condition), typeof(terminate_affect!), typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(SciMLBase.FINALIZE_DEFAULT)}}}}}, Vector{Float64}})
   @ JumpProcesses ~/.julia/dev/JumpProcesses/src/aggregators/ssajump.jl:74
 [3] step!(integrator::JumpProcesses.SSAIntegrator{DiscreteFunction{true, SciMLBase.FullSpecialize, SciMLBase.var"#200#201", Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Vector{Float64}, Float64, Float64, Vector{Float64}, ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Nothing, DiscreteProblem{Vector{Float64}, Tuple{Float64, Float64}, true, Vector{Float64}, DiscreteFunction{true, SciMLBase.FullSpecialize, SciMLBase.var"#200#201", Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}}, SSAStepper, SciMLBase.ConstantInterpolation{Vector{Float64}, Vector{Vector{Float64}}}, DiffEqBase.Stats, Nothing}, DiscreteCallback{JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}, Nothing, NamedTuple{(:callback,), Tuple{CallbackSet{Tuple{}, Tuple{DiscreteCallback{typeof(terminate_condition), typeof(terminate_affect!), typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(SciMLBase.FINALIZE_DEFAULT)}}}}}, Vector{Float64}})
   @ JumpProcesses ~/.julia/dev/JumpProcesses/src/SSA_stepper.jl:262
 [4] solve!(integrator::JumpProcesses.SSAIntegrator{DiscreteFunction{true, SciMLBase.FullSpecialize, SciMLBase.var"#200#201", Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Vector{Float64}, Float64, Float64, Vector{Float64}, ODESolution{Float64, 2, Vector{Vector{Float64}}, Nothing, Nothing, Vector{Float64}, Nothing, DiscreteProblem{Vector{Float64}, Tuple{Float64, Float64}, true, Vector{Float64}, DiscreteFunction{true, SciMLBase.FullSpecialize, SciMLBase.var"#200#201", Nothing, Nothing, Nothing, Nothing, typeof(SciMLBase.DEFAULT_OBSERVED), Nothing}, Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}}, SSAStepper, SciMLBase.ConstantInterpolation{Vector{Float64}, Vector{Vector{Float64}}}, DiffEqBase.Stats, Nothing}, DiscreteCallback{JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, JumpProcesses.CoevolveJumpAggregation{Float64, Nothing, Vector{FunctionWrappers.FunctionWrapper{Float64, Tuple{Vector{Float64}, Vector{Float64}, Float64}}}, Any, Random.TaskLocalRNG, Vector{Vector{Int64}}, DataStructures.MutableBinaryMinHeap{Float64}}, typeof(SciMLBase.FINALIZE_DEFAULT)}, Nothing, NamedTuple{(:callback,), Tuple{CallbackSet{Tuple{}, Tuple{DiscreteCallback{typeof(terminate_condition), typeof(terminate_affect!), typeof(SciMLBase.INITIALIZE_DEFAULT), typeof(SciMLBase.FINALIZE_DEFAULT)}}}}}, Vector{Float64}})
   @ JumpProcesses ~/.julia/dev/JumpProcesses/src/SSA_stepper.jl:109
 [5] #__solve#218
   @ ~/.julia/dev/JumpProcesses/src/SSA_stepper.jl:102 [inlined]
 [6] __solve
   @ ~/.julia/dev/JumpProcesses/src/SSA_stepper.jl:98 [inlined]
 [7] #solve#34
   @ ~/.julia/packages/DiffEqBase/tVuJP/src/solve.jl:1005 [inlined]