Functor usage for Optim.jl

This solved my question. The functor type is not supported in univariate analysis of Optim.jl
I’ve extended my functor to multivariate input, and it works with Optim.jl now.
Here is my code:

using Optim

"Model parameter"
struct y
  p
end

"Univariable Functor"
function (s::y)(x)
  return x*s.p
end

"Multivariable Functor with array input"
function (s::y)(x_v)
  return x_v[1]*s.p
end


model = y(1.0)

Optim.optimize(model, -1, 2, [1.]) #PASS
Optim.optimize(model, -1, 2, 1.) #ERROR

REPL output

julia> using Optim

julia> "Model parameter"
       struct y
         p
       end
y

julia> "Univariable Functor"
       function (s::y)(x)
         return x*s.p
       end
y

julia> "Multivariable Functor with array input"
       function (s::y)(x_v)
         return x_v[1]*s.p
       end
y

julia> model = y(1.0);

julia> Optim.optimize(model, -1, 2, [1.]); #PASS

julia> Optim.optimize(model, -1, 2, 1.); #ERROR
ERROR: MethodError: no method matching optimize(::y, ::Int64, ::Int64, ::Float64)
Closest candidates are:
  optimize(::Any, ::Any, ::Number, ::Number, ::AbstractArray{T,N} where N, ::Optim.Options; kwargs...) where T at /Users/stevenchiu/.julia/packages/Optim/TNmSw/src/multivariate/solvers/constrained/fminbox.jl:164
  optimize(::Any, ::Number, ::Number, ::AbstractArray{T,N} where N; kwargs...) where T at /Users/stevenchiu/.julia/packages/Optim/TNmSw/src/multivariate/solvers/constrained/fminbox.jl:156
  optimize(::Any, ::Number, ::Number, ::AbstractArray{T,N} where N, ::Optim.AbstractConstrainedOptimizer) where T at /Users/stevenchiu/.julia/packages/Optim/TNmSw/src/multivariate/solvers/constrained/fminbox.jl:160
  ...
Stacktrace:
 [1] top-level scope at none:1

julia> 

Thank you! @Tamas_Papp and @liuyxpp

1 Like