ControlSystems.jl icon indicating copy to clipboard operation
ControlSystems.jl copied to clipboard

Differentiable control design

Open baggepinnen opened this issue 2 years ago • 1 comments

A number of functions in this package and in RobustAndOptimalControl.jl fail when trying to compute gradients through them using ForwardDiff or Zygote. This issue tries to summarize the current status

Problematic functions

Function AD package Comment
c2d ForwardDiff :zoh requires exp!(::Matrix{Dual}). ForwardDiffChainRules buggy, but manual implementation possible. #844
feedback Zygote try/catch and @warn
are All Handled through ImplicitDiff #844
hinfnorm ForwardDiff Non-smooth. Works for Zygote. See tests for comments and comment. ForwardDiff in #844 but not for MIMO
svd/qr/schur ForwardDiff DifferentiableFactorizations.jl may be helpful
hessenberg ForwardDiff, ReverseDiff GenericLinearAlgebra.Hessenberg has different fieldnames from LinearAlgebra.Hessenberg

c2d example failing

foo(x) = sum(exp(reshape(x, 2, 2)))
v = randn(4)
using ForwardDiff
ForwardDiff.gradient(foo, v)

ERROR: MethodError: no method matching exp(::Matrix{ForwardDiff.Dual...

Related issues:

  • https://github.com/JuliaControl/ControlSystems.jl/pull/596
  • https://github.com/JuliaControl/RobustAndOptimalControl.jl/issues/57

baggepinnen avatar Jan 04 '23 13:01 baggepinnen

With in-place exp!

using ForwardDiff
using ForwardDiffChainRules
@ForwardDiff_frule LinearAlgebra.exp!(x1::AbstractMatrix{<:ForwardDiff.Dual})
foo(x) = sum(LinearAlgebra.exp!(reshape(x, 2, 2)))
v = randn(4)
ForwardDiff.gradient(foo, v)
julia> ForwardDiff.gradient(foo, v)
4-element Vector{Float64}:
 1.1002741981700268
 1.0554893997879182
 0.7951393746830535
 0.7605002893053368

baggepinnen avatar Feb 08 '23 12:02 baggepinnen