ablaom / TumorGrowth.jl

Simple predictive models for tumor growth, and tools to apply them to clinical data
MIT License
0 stars 0 forks source link

Calibration not working for `bertalanffy_numerical` #18

Closed ablaom closed 2 months ago

ablaom commented 7 months ago
julia> data = patient_data();
julia> record = data[16]
julia> times = record.T_weeks
julia> volumes = record.Lesion_normvol  # volumes normalized by max over dataset
julia> problem = CalibrationProblem(times, volumes, bertalanffy_numerical)
CalibrationProblem: 
  model: bertalanffy_numerical
  current solution: v0=0.0133  v∞=0.0148  ω=0.0421  λ=0.333

julia> solve!(problem, 1)
ERROR: MethodError: no method matching (::SciMLSensitivity.var"#df_oop#309"{…})(::SubArray{…}, ::Float64, ::Vector{…}, ::Float64, ::Int64)

Closest candidates are:
  (::SciMLSensitivity.var"#df_oop#309")(::Any, ::Any, ::Any, ::Any; outtype)
   @ SciMLSensitivity ~/.julia/packages/SciMLSensitivity/swmp8/src/concrete_solve.jl:471

Stacktrace:
  [1] (::SciMLSensitivity.ReverseLossCallback{…})(integrator::OrdinaryDiffEq.ODEIntegrator{…})                                                                                        
    @ SciMLSensitivity ~/.julia/packages/SciMLSensitivity/swmp8/src/adjoint_common.jl:514
  [2] (::DiffEqCallbacks.var"#112#115"{…})(c::SciMLBase.DiscreteCallback{…}, u::Vector{…}, t
::Float64, integrator::OrdinaryDiffEq.ODEIntegrator{…})                                    
    @ DiffEqCallbacks ~/.julia/packages/DiffEqCallbacks/uVI0B/src/preset_time.jl:52
  [3] initialize!
    @ ~/.julia/packages/DiffEqBase/eLhx9/src/callbacks.jl:18 [inlined]
  [4] initialize!
    @ ~/.julia/packages/DiffEqBase/eLhx9/src/callbacks.jl:7 [inlined]
  [5] initialize_callbacks!(integrator::OrdinaryDiffEq.ODEIntegrator{…}, initialize_save::Bool)                                                                                       
    @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/D4BiZ/src/solve.jl:648
  [6] __init(prob::SciMLBase.ODEProblem{…}, alg::OrdinaryDiffEq.Tsit5{…}, timeseries_init::Tuple{}, ts_init::Tuple{}, ks_init::Tuple{}, recompile::Type{…}; saveat::Vector{…}, tstops::Vector{…}, d_discontinuities::Tuple{}, save_idxs::Nothing, save_everystep::Bool, save_on::Bool, save_start::Bool, save_end::Nothing, callback::SciMLBase.CallbackSet{…}, dense::Bool, calck::Bool, dt::Float64, dtmin::Float64, dtmax::Float64, force_dtmin::Bool, adaptive::Bool, gamma::Rational{…}, abstol::Float64, reltol::Float64, qmin::Rational{…}, qmax::Int64, qsteady_min::Int64, qsteady_max::Int64, beta1::Nothing, beta2::Nothing, qoldinit::Rational{…}, controller::Nothing, fullnormalize::Bool, failfactor::Int64, maxiters::Int64, internalnorm::typeof(DiffEqBase.ODE_DEFAULT_NORM), internalopnorm::typeof(LinearAlgebra.opnorm), isoutofdomain::typeof(DiffEqBase.ODE_DEFAULT_ISOUTOFDOMAIN), unstable_check::typeof(DiffEqBase.ODE_DEFAULT_UNSTABLE_CHECK), verbose::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), 
progress_id::Symbol, userdata::Nothing, allow_extrapolation::Bool, initialize_integrator::Bool, alias_u0::Bool, alias_du0::Bool, initializealg::OrdinaryDiffEq.DefaultInit, kwargs::@Kwargs{})                                                                                  
    @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/D4BiZ/src/solve.jl:511
  [7] kwcall(::NamedTuple, ::typeof(SciMLBase.__init), prob::Union{…}, alg::Union{…}, timeseries_init::Any, ts_init::Any, ks_init::Any, recompile::Type{…}) where recompile_flag (repeats 5 times)                                                                          
    @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/D4BiZ/src/solve.jl:10 [inlined]
  [8] __solve(prob::Union{…}, alg::Union{…}, args::Vararg{…}; kwargs...)
    @ OrdinaryDiffEq ~/.julia/packages/OrdinaryDiffEq/D4BiZ/src/solve.jl:5 [inlined]
  [9] __solve
    @ ~/.julia/packages/OrdinaryDiffEq/D4BiZ/src/solve.jl:1 [inlined]
 [10] solve_call(_prob::SciMLBase.ODEProblem{…}, args::OrdinaryDiffEq.Tsit5{…}; merge_callbacks::Bool, kwargshandle::Nothing, kwargs::@Kwargs{…})                           
    @ DiffEqBase ~/.julia/packages/DiffEqBase/eLhx9/src/solve.jl:609
 [11] solve_call
    @ DiffEqBase ~/.julia/packages/DiffEqBase/eLhx9/src/solve.jl:567 [inlined]
 [12] #solve_up#42
    @ DiffEqBase ~/.julia/packages/DiffEqBase/eLhx9/src/solve.jl:1058 [inlined]
 [13] solve_up
    @ DiffEqBase ~/.julia/packages/DiffEqBase/eLhx9/src/solve.jl:1044 [inlined]
 [14] #solve#40
    @ DiffEqBase ~/.julia/packages/DiffEqBase/eLhx9/src/solve.jl:981 [inlined]
 [15] _adjoint_sensitivities(sol::SciMLBase.ODESolution{…}, sensealg::SciMLSensitivity.InterpolatingAdjoint{…}, alg::OrdinaryDiffEq.Tsit5{…}; t::Vector{…}, dgdu_discrete::Function, dgdp_discrete::Nothing, dgdu_continuous::Nothing, dgdp_continuous::Nothing, g::Nothing, abstol::Float64, reltol::Float64, checkpoints::Vector{…}, corfunc_analytical::Nothing, callback::Nothing, kwargs::@Kwargs{…})                                                                
    @ SciMLSensitivity ~/.julia/packages/SciMLSensitivity/swmp8/src/sensitivity_interface.jl:432                                                                
 [16] _adjoint_sensitivities
    @ SciMLSensitivity ~/.julia/packages/SciMLSensitivity/swmp8/src/sensitivity_interface.jl:390 [inlined]                                                      
 [17] #adjoint_sensitivities#63
    @ SciMLSensitivity ~/.julia/packages/SciMLSensitivity/swmp8/src/sensitivity_interface.jl:386 [inlined]                                                      
 [18] (::SciMLSensitivity.var"#adjoint_sensitivity_backpass#307"{…})(Δ::SciMLBase.ODESolution{…})                                                                   
    @ SciMLSensitivity ~/.julia/packages/SciMLSensitivity/swmp8/src/concrete_solve.jl:542
 [19] ZBack
    @ ~/.julia/packages/Zygote/jxHJc/src/compiler/chainrules.jl:211 [inlined]
 [20] (::Zygote.var"#kw_zpullback#53"{…})(dy::SciMLBase.ODESolution{…})
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/chainrules.jl:237
 [21] #291
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/lib/lib.jl:206 [inlined]
 [22] (::Zygote.var"#2169#back#293"{…})(Δ::SciMLBase.ODESolution{…})
    @ Zygote ~/.julia/packages/ZygoteRules/M4xmc/src/adjoint.jl:72
 [23] #solve#40
    @ ~/.julia/packages/DiffEqBase/eLhx9/src/solve.jl:981 [inlined]
 [24] (::Zygote.Pullback{…})(Δ::SciMLBase.ODESolution{…})
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface2.jl:0
 [25] #291
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/lib/lib.jl:206 [inlined]
 [26] (::Zygote.var"#2169#back#293"{…})(Δ::SciMLBase.ODESolution{…})
    @ Zygote ~/.julia/packages/ZygoteRules/M4xmc/src/adjoint.jl:72
 [27] solve
    @ ~/.julia/packages/DiffEqBase/eLhx9/src/solve.jl:971 [inlined]
 [28] (::Zygote.Pullback{…})(Δ::SciMLBase.ODESolution{…})
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface2.jl:0
 [29] #bertalanffy_numerical#9
    @ ~/Julia/TumorGrowth/src/solutions.jl:73 [inlined]
 [30] (::Zygote.Pullback{Tuple{…}, Tuple{…}})(Δ::Vector{Float64})
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface2.jl:0
 [31] bertalanffy_numerical
    @ ~/Julia/TumorGrowth/src/solutions.jl:57 [inlined]
 [32] (::Zygote.Pullback{Tuple{…}, Tuple{…}})(Δ::Vector{Float64})
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface2.jl:0
 [33] f
    @ ~/Julia/TumorGrowth/src/optimisers.jl:133 [inlined]
 [34] (::Zygote.Pullback{Tuple{TumorGrowth.var"#f#28"{…}, ComponentArrays.ComponentVector{…}}, Any})(Δ::Float64)
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface2.jl:0
 [35] (::Zygote.var"#75#76"{Zygote.Pullback{Tuple{…}, Any}})(Δ::Float64)
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface.jl:91
 [36] gradient(f::Function, args::ComponentArrays.ComponentVector{Float64, Vector{Float64}, Tuple{ComponentArrays.Axis{…}}})                                 
    @ Zygote ~/.julia/packages/Zygote/jxHJc/src/compiler/interface.jl:148
 [37] train!(problem::TumorGrowth.OptimisationProblem{…}, n::Int64)
    @ TumorGrowth ~/Julia/TumorGrowth/src/optimisers.jl:70
 [38] train!
    @ TumorGrowth ~/Julia/TumorGrowth/src/optimisers.jl:144 [inlined]
 [39] train!(c::CalibrationProblem{Float64, typeof(bertalanffy_numerical), TumorGrowth.CurveOptimisationProblem{…}}, n::Int64)
    @ TumorGrowth ~/Julia/TumorGrowth/src/calibration.jl:339
 [40] solve!(::CalibrationProblem{…}, ::Vararg{…}; kwargs::@Kwargs{})
    @ TumorGrowth ~/Julia/TumorGrowth/src/optimisers.jl:169
 [41] top-level scope
    @ REPL[127]:1
Some type information was truncated. Use `show(err)` to see complete types.
ablaom commented 7 months ago

Maybe we need to make the scalar volume a 1-d vector, like we do for neural.