Skip to content

Error when running example on latest version #47

@TorkelE

Description

@TorkelE

I tried using this with the latest package versions:

  [b2108857] Lux v1.7.0
  [961ee093] ModelingToolkit v9.63.0
  [f162e290] ModelingToolkitNeuralNets v1.5.0
  [16a59e39] ModelingToolkitStandardLibrary v2.19.0
  [7f7a1694] Optimization v4.1.1
  [42dfb2eb] OptimizationOptimisers v0.3.7
  [1dea7af3] OrdinaryDiffEq v6.91.0
  [91a5bcdd] Plots v1.40.9
  [53ae85a6] SciMLStructures v1.6.1
  [860ef19b] StableRNGs v1.0.2
  [2efcf032] SymbolicIndexingInterface v0.3.37

However, this code (copied directly from https://sciml.github.io/ModelingToolkitNeuralNets.jl/dev/friction/):

# Fetch packages.
using Catalyst
using ModelingToolkitNeuralNets
using ModelingToolkit
import ModelingToolkit.t_nounits as t
import ModelingToolkit.D_nounits as Dt
using ModelingToolkitStandardLibrary.Blocks
using OrdinaryDiffEq
using Optimization
using OptimizationOptimisers: Adam
using SciMLStructures
using SciMLStructures: Tunable
using SymbolicIndexingInterface
using StableRNGs
using Lux
using Plots

Fbrk = 100.0
vbrk = 10.0
Fc = 80.0
vst = vbrk / 10
vcol = vbrk * sqrt(2)
function friction(v)
    sqrt(2 * MathConstants.e) * (Fbrk - Fc) * exp(-(v / vst)^2) * (v / vst) +
    Fc * tanh(v / vcol)
end

function friction_true()
    @variables y(t) = 0.0
    @constants Fu = 120.0
    eqs = [
        Dt(y) ~ Fu - friction(y)
    ]
    return ODESystem(eqs, t, name = :friction_true)
end

model_true = structural_simplify(friction_true())
prob_true = ODEProblem(model_true, [], (0, 0.1), [])
sol_ref = solve(prob_true, Rodas4(); saveat = 0.001)

scatter(sol_ref, label = "velocity")
scatter(sol_ref.t, friction.(first.(sol_ref.u)), label = "friction force")

function friction_ude(Fu)
    @variables y(t) = 0.0
    @constants Fu = Fu
    @named nn_in = RealInputArray(nin = 1)
    @named nn_out = RealOutputArray(nout = 1)
    eqs = [Dt(y) ~ Fu - nn_in.u[1]
           y ~ nn_out.u[1]]
    return ODESystem(eqs, t, name = :friction, systems = [nn_in, nn_out])
end

Fu = 120.0
model = friction_ude(Fu)

chain = Lux.Chain(
    Lux.Dense(1 => 10, Lux.mish, use_bias = false),
    Lux.Dense(10 => 10, Lux.mish, use_bias = false),
    Lux.Dense(10 => 1, use_bias = false)
)
@named nn = NeuralNetworkBlock(1, 1; chain = chain, rng = StableRNG(1111))

eqs = [connect(model.nn_in, nn.output)
       connect(model.nn_out, nn.input)]

ude_sys = complete(ODESystem(eqs, t, systems = [model, nn], name = :ude_sys))
sys = structural_simplify(ude_sys)





function loss(x, (prob, sol_ref, get_vars, get_refs))
    new_p = SciMLStructures.replace(Tunable(), prob.p, x)
    new_prob = remake(prob, p = new_p, u0 = eltype(x).(prob.u0))
    ts = sol_ref.t
    new_sol = solve(new_prob, Rodas4(), saveat = ts, abstol = 1e-8, reltol = 1e-8)
    loss = zero(eltype(x))
    for i in eachindex(new_sol.u)
        loss += sum(abs2.(get_vars(new_sol, i) .- get_refs(sol_ref, i)))
    end
    if SciMLBase.successful_retcode(new_sol)
        loss
    else
        Inf
    end
end

of = OptimizationFunction{true}(loss, AutoForwardDiff())

prob = ODEProblem(sys, [], (0, 0.1), [])
get_vars = getu(sys, [sys.friction.y])
get_refs = getu(model_true, [model_true.y])
x0 = reduce(vcat, getindex.((default_values(sys),), tunable_parameters(sys)))

cb = (opt_state, loss) -> begin
    @info "step $(opt_state.iter), loss: $loss"
    return false
end

op = OptimizationProblem(of, x0, (prob, sol_ref, get_vars, get_refs))
res = solve(op, Adam(5e-3); maxiters = 10000, callback = cb)

generates a

ERROR: MethodError: no method matching one(::Type{Any})
This error has been manually thrown, explicitly, so the method may exist but be intentionally marked as unimplemented.

Closest candidates are:
  one(::Type{Union{Missing, T}}) where T
   @ Base missing.jl:105
  one(::Type{Union{}}, Any...)
   @ Base number.jl:349
  one(::Type{ModelingToolkitStandardLibrary.Electrical.Logic})
   @ ModelingToolkitStandardLibrary ~/.julia/packages/ModelingToolkitStandardLibrary/x7wQe/src/Electrical/Digital/logic.jl:40
  ...

Stacktrace:
  [1] one(::Type{Any})
    @ Base ./missing.jl:106
  [2] macro expansion
    @ ~/.julia/packages/ForwardDiff/UBbGT/src/partials.jl:0 [inlined]
  [3] single_seed(::Type{ForwardDiff.Partials{12, Any}}, ::Val{1})
    @ ForwardDiff ~/.julia/packages/ForwardDiff/UBbGT/src/partials.jl:9
  [4] macro expansion
    @ ~/.julia/packages/ForwardDiff/UBbGT/src/apiutils.jl:0 [inlined]
  [5] construct_seeds(::Type{ForwardDiff.Partials{12, Any}})
    @ ForwardDiff ~/.julia/packages/ForwardDiff/UBbGT/src/apiutils.jl:39
  [6] ForwardDiff.GradientConfig(f::DifferentiationInterface.FixTail{…}, x::Vector{…}, ::ForwardDiff.Chunk{…}, ::ForwardDiff.Tag{…})
    @ ForwardDiff ~/.julia/packages/ForwardDiff/UBbGT/src/config.jl:121
  [7] prepare_gradient(f::typeof(loss), backend::AutoForwardDiff{…}, x::Vector{…}, contexts::DifferentiationInterface.Constant{…})
    @ DifferentiationInterfaceForwardDiffExt ~/.julia/packages/DifferentiationInterface/srtnM/ext/DifferentiationInterfaceForwardDiffExt/onearg.jl:317
  [8] instantiate_function(f::OptimizationFunction{…}, x::Vector{…}, adtype::AutoForwardDiff{…}, p::Tuple{…}, num_cons::Int64; g::Bool, h::Bool, hv::Bool, fg::Bool, fgh::Bool, cons_j::Bool, cons_vjp::Bool, cons_jvp::Bool, cons_h::Bool, lag_h::Bool)
    @ OptimizationBase ~/.julia/packages/OptimizationBase/gvXsf/src/OptimizationDIExt.jl:26
  [9] instantiate_function
    @ ~/.julia/packages/OptimizationBase/gvXsf/src/OptimizationDIExt.jl:17 [inlined]
 [10] #instantiate_function#40
    @ ~/.julia/packages/OptimizationBase/gvXsf/src/OptimizationDIExt.jl:274 [inlined]
 [11] instantiate_function
    @ ~/.julia/packages/OptimizationBase/gvXsf/src/OptimizationDIExt.jl:267 [inlined]
 [12] OptimizationCache(prob::OptimizationProblem{…}, opt::Adam; callback::Function, maxiters::Int64, maxtime::Nothing, abstol::Nothing, reltol::Nothing, progress::Bool, structural_analysis::Bool, manifold::Nothing, kwargs::@Kwargs{…})
    @ OptimizationBase ~/.julia/packages/OptimizationBase/gvXsf/src/cache.jl:60
 [13] OptimizationCache
    @ ~/.julia/packages/OptimizationBase/gvXsf/src/cache.jl:25 [inlined]
 [14] #__init#1
    @ ~/.julia/packages/OptimizationOptimisers/xC7Ic/src/OptimizationOptimisers.jl:15 [inlined]
 [15] __init
    @ ~/.julia/packages/OptimizationOptimisers/xC7Ic/src/OptimizationOptimisers.jl:11 [inlined]
 [16] #init#728
    @ ~/.julia/packages/SciMLBase/YTOjh/src/solve.jl:173 [inlined]
 [17] init
    @ ~/.julia/packages/SciMLBase/YTOjh/src/solve.jl:171 [inlined]
 [18] solve(::OptimizationProblem{…}, ::Adam; kwargs::@Kwargs{…})
    @ SciMLBase ~/.julia/packages/SciMLBase/YTOjh/src/solve.jl:95
 [19] top-level scope
    @ ~/Path/file.jl:103
Some type information was truncated. Use `show(err)` to see complete types.

on the last line

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions