SciML / StochasticDiffEq.jl

Solvers for stochastic differential equations which connect with the scientific machine learning (SciML) ecosystem
Other
248 stars 66 forks source link

Problem with ArrayFire.jl #446

Closed JunTateiwa closed 2 years ago

JunTateiwa commented 2 years ago

I'm trying to optimize the calculation time of Stochastic SEIRV model using ArrayFire.jl.

using StaticArrays
using DifferentialEquations,ArrayFire

N = 10000000 #community size
E0 = 10 #init Exposed patients
beta = 0.00000004 #infection force
lp = 5.5 #latent period(days)
ip = 7 #indectious period(days)
ve = 0.9 #vaccine effectiveness
vr = 10000 #vaccination rate(per day)
idr = 365 #immunity duration for R(days)
idv = idr/2 #immunity duration for V(days)
function seirv2(du, u, p, t)
    S,E,I,R,V = u
    beta, lp, ip, ve, vr = p
    du[1] = -beta*S*I - vr + (1/idr)*R + (1/idv)*V
    du[2] = beta*S*I - (1/lp)*E + (1-ve)*beta*V*I
    du[3] = (1/lp)*E - (1/ip)*I
    du[4] = (1/ip)*I - (1/idr)*R
    du[5] = vr - (1-ve)*beta*V*I - (1/idv)*V
end

function seirv_noise(du, u, p, t)
    S,E,I,R,V = u
    beta, lp, ip, ve, vr = p
    du[1] = S/100
    du[2] = E/100
    du[3] = I/100
    du[4] = R/100
    du[5] = vr/20
end

seirv_prob_st = SDEProblem(seirv2,seirv_noise,AFArray([N-E0, E0, 0, 0, 0]),(0.0,1000.0), AFArray([beta, lp, ip, ve, vr]))

seirv_sol_st = DifferentialEquations.solve(seirv_prob_st, saveat = 0.25)

When I run the above code, I get the following error.

ERROR: LoadError: MethodError: no method matching /(::AFVector{Float64}, ::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, typeof(+), Tuple{Float64, Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, typeof(*), Tuple{Float64, Float64}}}})
Closest candidates are:
  /(::Any, ::ChainRulesCore.AbstractThunk) at C:\Users\tatei\.julia\packages\ChainRulesCore\1LqRD\src\differentials\thunks.jl:33
  /(::ChainRulesCore.AbstractThunk, ::Any) at C:\Users\tatei\.julia\packages\ChainRulesCore\1LqRD\src\differentials\thunks.jl:32
  /(::ChainRulesCore.AbstractZero, ::Any) at C:\Users\tatei\.julia\packages\ChainRulesCore\1LqRD\src\differentials\abstract_zero.jl:25
  ...
Stacktrace:
  [1] broadcasted(f::Function, A::AFVector{Float64}, Bs::Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, typeof(+), Tuple{Float64, Base.Broadcast.Broadcasted{Base.Broadcast.DefaultArrayStyle{0}, Nothing, typeof(*), Tuple{Float64, Float64}}}})
    @ ArrayFire C:\Users\tatei\.julia\packages\ArrayFire\U0hth\src\array.jl:220
  [2] sde_determine_initdt(u0::AFVector{Float64}, t::Float64, tdir::Float64, dtmax::Float64, abstol::Float64, reltol::Float64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), prob::SDEProblem{AFVector{Float64}, Tuple{Float64, Float64}, true, AFVector{Float64}, Nothing, SDEFunction{true, typeof(seirv2), typeof(seirv_noise), UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing}, typeof(seirv_noise), Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Nothing}, order::Rational{Int64}, integrator::StochasticDiffEq.SDEIntegrator{SOSRI, true, AFVector{Float64}, Float64, Float64, Float64, AFVector{Float64}, Float64, Float64, Float64, NoiseProcess{Float64, 2, Float64, AFVector{Float64}, AFVector{Float64}, Vector{AFVector{Float64}}, typeof(DiffEqNoiseProcess.INPLACE_WHITE_NOISE_DIST), typeof(DiffEqNoiseProcess.INPLACE_WHITE_NOISE_BRIDGE), true, ResettableStacks.ResettableStack{Tuple{Float64, AFVector{Float64}, AFVector{Float64}}, true}, ResettableStacks.ResettableStack{Tuple{Float64, AFVector{Float64}, AFVector{Float64}}, true}, RSWM{Float64}, Nothing, RandomNumbers.Xorshifts.Xoroshiro128Plus}, Nothing, AFVector{Float64}, RODESolution{Float64, 2, Vector{AFVector{Float64}}, Nothing, Nothing, Vector{Float64}, NoiseProcess{Float64, 2, Float64, AFVector{Float64}, AFVector{Float64}, Vector{AFVector{Float64}}, typeof(DiffEqNoiseProcess.INPLACE_WHITE_NOISE_DIST), typeof(DiffEqNoiseProcess.INPLACE_WHITE_NOISE_BRIDGE), true, ResettableStacks.ResettableStack{Tuple{Float64, AFVector{Float64}, AFVector{Float64}}, true}, ResettableStacks.ResettableStack{Tuple{Float64, AFVector{Float64}, AFVector{Float64}}, true}, RSWM{Float64}, Nothing, RandomNumbers.Xorshifts.Xoroshiro128Plus}, SDEProblem{AFVector{Float64}, Tuple{Float64, Float64}, true, AFVector{Float64}, Nothing, SDEFunction{true, typeof(seirv2), typeof(seirv_noise), UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing}, typeof(seirv_noise), Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Nothing}, SOSRI, StochasticDiffEq.LinearInterpolationData{Vector{AFVector{Float64}}, Vector{Float64}}, DiffEqBase.DEStats}, StochasticDiffEq.FourStageSRICache{AFVector{Float64}, AFVector{Float64}, StochasticDiffEq.FourStageSRIConstantCache{Float64, Float64}, AFVector{Float64}, AFVector{Float64}, AFVector{Float64}}, SDEFunction{true, typeof(seirv2), typeof(seirv_noise), UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing}, typeof(seirv_noise), Nothing, StochasticDiffEq.SDEOptions{Float64, Float64, PIController{Float64}, typeof(DiffEqBase.ODE_DEFAULT_NORM), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryMinHeap{Float64}, DataStructures.BinaryMinHeap{Float64}, Nothing, Nothing, Int64, Float64, Float64, Float64, Tuple{}, Float64, Tuple{}}, Nothing, Float64, Nothing, Nothing})
    @ StochasticDiffEq C:\Users\tatei\.julia\packages\StochasticDiffEq\Ysmjy\src\initdt.jl:11
  [3] auto_dt_reset!(integrator::StochasticDiffEq.SDEIntegrator{SOSRI, true, AFVector{Float64}, Float64, Float64, Float64, AFVector{Float64}, Float64, Float64, Float64, NoiseProcess{Float64, 2, Float64, AFVector{Float64}, AFVector{Float64}, Vector{AFVector{Float64}}, typeof(DiffEqNoiseProcess.INPLACE_WHITE_NOISE_DIST), typeof(DiffEqNoiseProcess.INPLACE_WHITE_NOISE_BRIDGE), true, ResettableStacks.ResettableStack{Tuple{Float64, AFVector{Float64}, AFVector{Float64}}, true}, ResettableStacks.ResettableStack{Tuple{Float64, AFVector{Float64}, AFVector{Float64}}, true}, RSWM{Float64}, Nothing, RandomNumbers.Xorshifts.Xoroshiro128Plus}, Nothing, AFVector{Float64}, RODESolution{Float64, 2, Vector{AFVector{Float64}}, Nothing, Nothing, Vector{Float64}, NoiseProcess{Float64, 2, Float64, AFVector{Float64}, AFVector{Float64}, Vector{AFVector{Float64}}, typeof(DiffEqNoiseProcess.INPLACE_WHITE_NOISE_DIST), typeof(DiffEqNoiseProcess.INPLACE_WHITE_NOISE_BRIDGE), true, ResettableStacks.ResettableStack{Tuple{Float64, AFVector{Float64}, AFVector{Float64}}, true}, ResettableStacks.ResettableStack{Tuple{Float64, AFVector{Float64}, AFVector{Float64}}, true}, RSWM{Float64}, Nothing, RandomNumbers.Xorshifts.Xoroshiro128Plus}, SDEProblem{AFVector{Float64}, Tuple{Float64, Float64}, true, AFVector{Float64}, Nothing, SDEFunction{true, typeof(seirv2), typeof(seirv_noise), UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing}, typeof(seirv_noise), Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Nothing}, SOSRI, StochasticDiffEq.LinearInterpolationData{Vector{AFVector{Float64}}, Vector{Float64}}, DiffEqBase.DEStats}, StochasticDiffEq.FourStageSRICache{AFVector{Float64}, AFVector{Float64}, StochasticDiffEq.FourStageSRIConstantCache{Float64, Float64}, AFVector{Float64}, AFVector{Float64}, AFVector{Float64}}, SDEFunction{true, typeof(seirv2), typeof(seirv_noise), UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing}, typeof(seirv_noise), Nothing, StochasticDiffEq.SDEOptions{Float64, Float64, PIController{Float64}, typeof(DiffEqBase.ODE_DEFAULT_NORM), Nothing, CallbackSet{Tuple{}, Tuple{}}, typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), DataStructures.BinaryMinHeap{Float64}, DataStructures.BinaryMinHeap{Float64}, Nothing, Nothing, Int64, Float64, Float64, Float64, Tuple{}, Float64, Tuple{}}, Nothing, Float64, Nothing, Nothing})
    @ StochasticDiffEq C:\Users\tatei\.julia\packages\StochasticDiffEq\Ysmjy\src\integrators\integrator_interface.jl:352
  [4] handle_dt!
    @ C:\Users\tatei\.julia\packages\StochasticDiffEq\Ysmjy\src\solve.jl:636 [inlined]
  [5] __init(_prob::SDEProblem{AFVector{Float64}, Tuple{Float64, Float64}, true, AFVector{Float64}, Nothing, SDEFunction{true, typeof(seirv2), typeof(seirv_noise), UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing}, typeof(seirv_noise), Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Nothing}, alg::SOSRI, timeseries_init::Vector{Any}, ts_init::Vector{Any}, ks_init::Type, recompile::Type{Val{true}}; saveat::Float64, tstops::Tuple{}, d_discontinuities::Tuple{}, save_idxs::Nothing, save_everystep::Bool, save_noise::Bool, save_on::Bool, save_start::Bool, save_end::Nothing, callback::Nothing, dense::Bool, calck::Bool, dt::Float64, adaptive::Bool, gamma::Rational{Int64}, abstol::Nothing, reltol::Nothing, qmin::Rational{Int64}, qmax::Rational{Int64}, qsteady_min::Int64, qsteady_max::Int64, beta2::Nothing, beta1::Nothing, qoldinit::Rational{Int64}, controller::Nothing, fullnormalize::Bool, failfactor::Int64, delta::Rational{Int64}, maxiters::Int64, dtmax::Float64, dtmin::Float64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), 
isoutofdomain::typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), unstable_check::typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), verbose::Bool, force_dtmin::Bool, timeseries_errors::Bool, dense_errors::Bool, advance_to_tstop::Bool, stop_at_next_tstop::Bool, initialize_save::Bool, progress::Bool, progress_steps::Int64, progress_name::String, progress_message::typeof(DiffEqBase.ODE_DEFAULT_PROG_MESSAGE), userdata::Nothing, initialize_integrator::Bool, seed::UInt64, alias_u0::Bool, alias_jumps::Bool, kwargs::Base.Iterators.Pairs{Symbol, Bool, Tuple{Symbol, Symbol}, NamedTuple{(:default_set, :second_time), Tuple{Bool, Bool}}})
    @ StochasticDiffEq C:\Users\tatei\.julia\packages\StochasticDiffEq\Ysmjy\src\solve.jl:589
  [6] #__solve#100
    @ C:\Users\tatei\.julia\packages\StochasticDiffEq\Ysmjy\src\solve.jl:6 [inlined]
  [7] __solve(::SDEProblem{AFVector{Float64}, Tuple{Float64, Float64}, true, AFVector{Float64}, Nothing, SDEFunction{true, typeof(seirv2), typeof(seirv_noise), UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing}, typeof(seirv_noise), Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), 
Tuple{}}}, Nothing}, ::Nothing; default_set::Bool, kwargs::Base.Iterators.Pairs{Symbol, Real, Tuple{Symbol, Symbol}, NamedTuple{(:second_time, :saveat), Tuple{Bool, Float64}}})
    @ DifferentialEquations C:\Users\tatei\.julia\packages\DifferentialEquations\el96s\src\default_solve.jl:7
  [8] #__solve#57
    @ C:\Users\tatei\.julia\packages\DiffEqBase\b1nST\src\solve.jl:291 [inlined]
  [9] #solve_call#42
    @ C:\Users\tatei\.julia\packages\DiffEqBase\b1nST\src\solve.jl:61 [inlined]
 [10] solve_up(::SDEProblem{AFVector{Int64}, Tuple{Float64, Float64}, true, AFVector{Float64}, Nothing, SDEFunction{true, typeof(seirv2), typeof(seirv_noise), UniformScaling{Bool}, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing}, typeof(seirv_noise), Base.Iterators.Pairs{Union{}, Union{}, Tuple{}, NamedTuple{(), Tuple{}}}, Nothing}, ::Nothing, ::AFVector{Int64}, ::AFVector{Float64}; kwargs::Base.Iterators.Pairs{Symbol, Float64, Tuple{Symbol}, NamedTuple{(:saveat,), Tuple{Float64}}})
    @ DiffEqBase C:\Users\tatei\.julia\packages\DiffEqBase\b1nST\src\solve.jl:90
 [11] #solve#43
    @ C:\Users\tatei\.julia\packages\DiffEqBase\b1nST\src\solve.jl:73 [inlined]
 [12] top-level scope
    @ c:\Users\tatei\Documents\理工学部4年\研究室\卒業研究\stochasticSEIRVmodel.jl:35
ChrisRackauckas commented 2 years ago

Solving one SDE like this will not be faster on GPUs. That's not how GPUs work. See https://github.com/SciML/DiffEqGPU.jl