Closed JunTateiwa closed 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
Solving one SDE like this will not be faster on GPUs. That's not how GPUs work. See https://github.com/SciML/DiffEqGPU.jl
I'm trying to optimize the calculation time of Stochastic SEIRV model using ArrayFire.jl.
When I run the above code, I get the following error.