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