Skip to content

Can't --trim with AutoForwardDiff, but can with AutoFiniteDiff #816

@RomeoV

Description

@RomeoV

I'm trying to make a simple C-library using SimpleNonlinearSolve.jl and the Julia 1.12 --trim feature.
However, I'm running into issues with the jacobian computation when I use AutoForwardDiff.

Here's a MWE:

# main.jl
module MyModule
using DifferentiationInterface
using FiniteDiff
using ForwardDiff
using LinearAlgebra

function f!(du, u, p)
    du .= p.λ * u
end

function main=1.0)
    # J = jacobian(u->f(u, p), AutoForwardDiff(), [1.0; 1.0])
    f!_ = (du, u)->f!(du, u, (; λ=ξ))
    # autodiff = AutoFiniteDiff()
    autodiff = AutoForwardDiff()
    Jprep = prepare_jacobian(f!_, zeros(2),        autodiff, zeros(2))
    J =             jacobian(f!_, zeros(2), Jprep, autodiff, zeros(2))
    return sum(J)
end

Base.@ccallable function main(argc::Cint, argv::Ptr{Ptr{Int8}})::Cint
    cstr = unsafe_load(argv, 2)
    jlstr = unsafe_string(cstr)
    λ = parse(Float64, jlstr)
    sol = main(λ)
    println(Core.stdout, sum(sol))
    return 0
end
end

To compile:

juliaup add 1.12
juliaup override set 1.12
julia --project=. -e 'import Pkg; Pkg.add("DifferentiationInterface", "FiniteDiff", "ForwardDiff")'
julia --project=. --depwarn=error ~/.julia/juliaup/julia-1.12.0-beta4+0.x64.linux.gnu/share/julia/juliac.jl --experimental --trim=unsafe-warn --output-exe main_mwe --compile-ccallable --relative-rpath main.jl

This fails when using AutoForwardDiff, but works fine with AutoFiniteDiff.

The error Verifier error #1: unresolved call from statement MyModule.jacobian(%new()::MyModule.var"#main##0#main##1"{Float64}, %new()::Vector{Float64}, Dif ferentiationInterface.prepare_jacobian_nokwarg($(QuoteNode(Val{true}())), %new()::MyModule.var"#main##0#main##1"{Float64}, %new()::Vector{Float64 }, $(QuoteNode(ADTypes.AutoForwardDiff{nothing, Nothing}(nothing))), %new()::Vector{Float64})::DifferentiationInterfaceForwardDiffExt.ForwardDiff TwoArgJacobianPrep{Tuple{MyModule.var"#main##0#main##1"{Float64}, Vector{Float64}, ADTypes.AutoForwardDiff{nothing, Nothing}, Vector{Float64}, Tu ple{}}, C, Tuple{}} where C<:(ForwardDiff.JacobianConfig{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A, <:Tuple{ Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where _A, Array{ForwardDiff.Dual{Forwa rdDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where _A}} where _A), $(QuoteNode(ADTypes.AutoForwardDiff{nothing, Nothing}(nothing))), %new()::Vector{Float64})::Matrix{Float64} Stacktrace: [1] main(ξ::Float64) @ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:17 [2] main(argc::Int32, argv::Ptr{Ptr{Int8}}) @ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:25

Verifier error #2: unresolved call from statement DifferentiationInterfaceForwardDiffExt.JacobianConfig(DifferentiationInterfaceForwardDiffExt.no
thing, y::Vector{Float64}, x::Vector{Float64}, φ ()::ForwardDiff.Chunk, $(QuoteNode(ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Floa
t64}())))::ForwardDiff.JacobianConfig{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A, <:Tuple{Array{ForwardDiff.D
ual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where _A, Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule
.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where _A}} where _A
Stacktrace:
[1] prepare_jacobian_nokwarg(::Val{true}, ::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothi
ng}, ::Vector{Float64})
@ DifferentiationInterfaceForwardDiffExt ~/.julia/packages/DifferentiationInterface/alBlj/ext/DifferentiationInterfaceForwardDiffExt/twoarg.jl
:386
[2] prepare_jacobian(::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothing}, ::Vector{Float64
}; strict::Val{true})
@ DifferentiationInterface ~/.julia/packages/DifferentiationInterface/alBlj/src/first_order/jacobian.jl:18 [inlined]
[3] prepare_jacobian(::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothing}, ::Vector{Float64
})
@ DifferentiationInterface ~/.julia/packages/DifferentiationInterface/alBlj/src/first_order/jacobian.jl:15 [inlined]
[4] main(ξ::Float64)
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:16
[5] main(argc::Int32, argv::Ptr{Ptr{Int8}})
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:25

Verifier error #3: unresolved call from statement DifferentiationInterfaceForwardDiffExt.ForwardDiffTwoArgJacobianPrep($(QuoteNode(Val{Tuple{MyMo
dule.var"#main##0#main##1"{Float64}, Vector{Float64}, ADTypes.AutoForwardDiff{nothing, Nothing}, Vector{Float64}, Tuple{}}}())), DifferentiationI
nterfaceForwardDiffExt.JacobianConfig(DifferentiationInterfaceForwardDiffExt.nothing, y::Vector{Float64}, x::Vector{Float64}, φ ()::ForwardDiff.C
hunk, $(QuoteNode(ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}())))::ForwardDiff.JacobianConfig{ForwardDiff.Tag{MyModule.var
"#main##0#main##1"{Float64}, Float64}, Float64, _A, <:Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float
64}, Float64, _A}, 1} where _A, Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where
_A}} where _A, ()::Tuple{})::DifferentiationInterfaceForwardDiffExt.ForwardDiffTwoArgJacobianPrep{Tuple{MyModule.var"#main##0#main##1"{Float64},
Vector{Float64}, ADTypes.AutoForwardDiff{nothing, Nothing}, Vector{Float64}, Tuple{}}, C, Tuple{}} where C<:(ForwardDiff.JacobianConfig{ForwardDi
ff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A, <:Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main#
#1"{Float64}, Float64}, Float64, _A}, 1} where _A, Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Floa
t64, _A}, 1} where _A}} where _A)
Stacktrace:
[1] prepare_jacobian_nokwarg(::Val{true}, ::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothi
ng}, ::Vector{Float64})
@ DifferentiationInterfaceForwardDiffExt ~/.julia/packages/DifferentiationInterface/alBlj/ext/DifferentiationInterfaceForwardDiffExt/twoarg.jl
:388
[2] prepare_jacobian(::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothing}, ::Vector{Float64
}; strict::Val{true})
@ DifferentiationInterface ~/.julia/packages/DifferentiationInterface/alBlj/src/first_order/jacobian.jl:18 [inlined]
[3] prepare_jacobian(::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothing}, ::Vector{Float64
})
@ DifferentiationInterface ~/.julia/packages/DifferentiationInterface/alBlj/src/first_order/jacobian.jl:15 [inlined]
[4] main(ξ::Float64)
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:16
[5] main(argc::Int32, argv::Ptr{Ptr{Int8}})
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:25

Verifier error #4: unresolved call from statement MyModule.jacobian(%new()::MyModule.var"#main##0#main##1"{Float64}, %new()::Vector{Float64}, Dif
ferentiationInterface.prepare_jacobian_nokwarg($(QuoteNode(Val{true}())), %new()::MyModule.var"#main##0#main##1"{Float64}, %new()::Vector{Float64
}, $(QuoteNode(ADTypes.AutoForwardDiff{nothing, Nothing}(nothing))), %new()::Vector{Float64})::DifferentiationInterfaceForwardDiffExt.ForwardDiff
TwoArgJacobianPrep{Tuple{MyModule.var"#main##0#main##1"{Float64}, Vector{Float64}, ADTypes.AutoForwardDiff{nothing, Nothing}, Vector{Float64}, Tu
ple{}}, C, Tuple{}} where C<:(ForwardDiff.JacobianConfig{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A, <:Tuple{
Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where _A, Array{ForwardDiff.Dual{Forwa
rdDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where _A}} where _A), $(QuoteNode(ADTypes.AutoForwardDiff{nothing,
Nothing}(nothing))), %new()::Vector{Float64})::Matrix{Float64}
Stacktrace:
[1] main(ξ::Float64)
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:17
[2] main(argc::Int32, argv::Ptr{Ptr{Int8}})
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:25

Verifier error #5: unresolved call from statement DifferentiationInterfaceForwardDiffExt.JacobianConfig(DifferentiationInterfaceForwardDiffExt.no
thing, y::Vector{Float64}, x::Vector{Float64}, φ ()::ForwardDiff.Chunk, $(QuoteNode(ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Floa
t64}())))::ForwardDiff.JacobianConfig{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A, <:Tuple{Array{ForwardDiff.D
ual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where _A, Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule
.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where _A}} where _A
Stacktrace:
[1] prepare_jacobian_nokwarg(::Val{true}, ::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothi
ng}, ::Vector{Float64})
@ DifferentiationInterfaceForwardDiffExt ~/.julia/packages/DifferentiationInterface/alBlj/ext/DifferentiationInterfaceForwardDiffExt/twoarg.jl
:386
[2] prepare_jacobian(::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothing}, ::Vector{Float64
}; strict::Val{true})
@ DifferentiationInterface ~/.julia/packages/DifferentiationInterface/alBlj/src/first_order/jacobian.jl:18 [inlined]
[3] prepare_jacobian(::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothing}, ::Vector{Float64
})
@ DifferentiationInterface ~/.julia/packages/DifferentiationInterface/alBlj/src/first_order/jacobian.jl:15 [inlined]
[4] main(ξ::Float64)
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:16
[5] main(argc::Int32, argv::Ptr{Ptr{Int8}})
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:25

Verifier error #6: unresolved call from statement DifferentiationInterfaceForwardDiffExt.ForwardDiffTwoArgJacobianPrep($(QuoteNode(Val{Tuple{MyMo
dule.var"#main##0#main##1"{Float64}, Vector{Float64}, ADTypes.AutoForwardDiff{nothing, Nothing}, Vector{Float64}, Tuple{}}}())), DifferentiationI
nterfaceForwardDiffExt.JacobianConfig(DifferentiationInterfaceForwardDiffExt.nothing, y::Vector{Float64}, x::Vector{Float64}, φ ()::ForwardDiff.C
hunk, $(QuoteNode(ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}())))::ForwardDiff.JacobianConfig{ForwardDiff.Tag{MyModule.var
"#main##0#main##1"{Float64}, Float64}, Float64, _A, <:Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float
64}, Float64, _A}, 1} where _A, Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A}, 1} where
_A}} where _A, ()::Tuple{})::DifferentiationInterfaceForwardDiffExt.ForwardDiffTwoArgJacobianPrep{Tuple{MyModule.var"#main##0#main##1"{Float64},
Vector{Float64}, ADTypes.AutoForwardDiff{nothing, Nothing}, Vector{Float64}, Tuple{}}, C, Tuple{}} where C<:(ForwardDiff.JacobianConfig{ForwardDi
ff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Float64, _A, <:Tuple{Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main#
#1"{Float64}, Float64}, Float64, _A}, 1} where _A, Array{ForwardDiff.Dual{ForwardDiff.Tag{MyModule.var"#main##0#main##1"{Float64}, Float64}, Floa
t64, _A}, 1} where _A}} where _A)
Stacktrace:
[1] prepare_jacobian_nokwarg(::Val{true}, ::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothi
ng}, ::Vector{Float64})
@ DifferentiationInterfaceForwardDiffExt ~/.julia/packages/DifferentiationInterface/alBlj/ext/DifferentiationInterfaceForwardDiffExt/twoarg.jl
:388
[2] prepare_jacobian(::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothing}, ::Vector{Float64
}; strict::Val{true})
@ DifferentiationInterface ~/.julia/packages/DifferentiationInterface/alBlj/src/first_order/jacobian.jl:18 [inlined]
[3] prepare_jacobian(::MyModule.var"#main##0#main##1"{Float64}, ::Vector{Float64}, ::ADTypes.AutoForwardDiff{nothing, Nothing}, ::Vector{Float64
})
@ DifferentiationInterface ~/.julia/packages/DifferentiationInterface/alBlj/src/first_order/jacobian.jl:15 [inlined]
[4] main(ξ::Float64)
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:16
[5] main(argc::Int32, argv::Ptr{Ptr{Int8}})
@ MyModule ~/Documents/julia_playground/trim_simplenonlinearsolve/main_DI.jl:25

Trim verify finished with 6 errors, 0 warnings.

PS: When compiled with AutoForwardDiff, this can be run with LD_LIBRARY_PATH=~/.julia/juliaup/julia-1.12.0-beta4+0.x64.linux.gnu/lib/julia/ ./main_mwe 5.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions