Skip to content

Commit

Permalink
use inplace keyword in constructors from NLSolversBase. (#617)
Browse files Browse the repository at this point in the history
* use inplace keyword in constructors from NLSolversBase.

* Require the patched version of NLSolversBase.

* Fix some things.
  • Loading branch information
pkofod committed Jun 13, 2018
1 parent db93fc1 commit 7efe461
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 47 deletions.
2 changes: 1 addition & 1 deletion REQUIRE
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ julia 0.6.0
PositiveFactorizations
Compat 0.18.0
LineSearches 6.0.1
NLSolversBase 6.0.0
NLSolversBase 6.1.1
ForwardDiff 0.5.0
DiffEqDiffTools 0.4.0
Calculus # TODO: Remove when DiffEqDiffTools release Hessian PR
Expand Down
66 changes: 29 additions & 37 deletions src/multivariate/optimize/interface.jl
Original file line number Diff line number Diff line change
Expand Up @@ -34,51 +34,48 @@ fallback_method(d::OnceDifferentiable) = LBFGS()
fallback_method(d::TwiceDifferentiable) = Newton()

# promote the objective (tuple of callables or an AbstractObjective) according to method requirement
promote_objtype(method, initial_x, autodiff::Symbol, args...) = error("No default objective type for $method and $args.")
promote_objtype(method, initial_x, autodiff::Symbol, inplace::Bool, args...) = error("No default objective type for $method and $args.")
# actual promotions, notice that (args...) captures FirstOrderOptimizer and NonDifferentiable, etc
promote_objtype(method::ZerothOrderOptimizer, x, autodiff::Symbol, args...) = NonDifferentiable(args..., x, real(zero(eltype(x))))
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, f) = OnceDifferentiable(f, x, real(zero(eltype(x))); autodiff = autodiff)
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, args...) = OnceDifferentiable(args..., x, real(zero(eltype(x))))
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, f, g!, h!) = OnceDifferentiable(f, g!, x, real(zero(eltype(x))))
promote_objtype(method::SecondOrderOptimizer, x, autodiff::Symbol, f) = TwiceDifferentiable(f, x, real(zero(eltype(x))); autodiff = autodiff)
promote_objtype(method::SecondOrderOptimizer, x, autodiff::Symbol, f, g) = TwiceDifferentiable(f, g, x, real(zero(eltype(x))); autodiff = autodiff)
promote_objtype(method::SecondOrderOptimizer, x, autodiff::Symbol, f, g, h) = TwiceDifferentiable(f, g, h, x, real(zero(eltype(x))))
promote_objtype(method::ZerothOrderOptimizer, x, autodiff::Symbol, inplace::Bool, args...) = NonDifferentiable(args..., x, real(zero(eltype(x))))
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, inplace::Bool, f) = OnceDifferentiable(f, x, real(zero(eltype(x))); autodiff = autodiff)
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, inplace::Bool, args...) = OnceDifferentiable(args..., x, real(zero(eltype(x))); inplace = inplace)
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, inplace::Bool, f, g, h) = OnceDifferentiable(f, g, x, real(zero(eltype(x))); inplace = inplace)
promote_objtype(method::SecondOrderOptimizer, x, autodiff::Symbol, inplace::Bool, f) = TwiceDifferentiable(f, x, real(zero(eltype(x))); autodiff = autodiff)
promote_objtype(method::SecondOrderOptimizer, x, autodiff::Symbol, inplace::Bool, f, g) = TwiceDifferentiable(f, g, x, real(zero(eltype(x))); inplace = inplace, autodiff = autodiff)
promote_objtype(method::SecondOrderOptimizer, x, autodiff::Symbol, inplace::Bool, f, g, h) = TwiceDifferentiable(f, g, h, x, real(zero(eltype(x))); inplace = inplace)
# no-op
promote_objtype(method::ZerothOrderOptimizer, x, autodiff::Symbol, nd::NonDifferentiable) = nd
promote_objtype(method::ZerothOrderOptimizer, x, autodiff::Symbol, od::OnceDifferentiable) = od
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, od::OnceDifferentiable) = od
promote_objtype(method::ZerothOrderOptimizer, x, autodiff::Symbol, td::TwiceDifferentiable) = td
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, td::TwiceDifferentiable) = td
promote_objtype(method::SecondOrderOptimizer, x, autodiff::Symbol, td::TwiceDifferentiable) = td

# if on method or options are present
promote_objtype(method::ZerothOrderOptimizer, x, autodiff::Symbol, inplace::Bool, nd::NonDifferentiable) = nd
promote_objtype(method::ZerothOrderOptimizer, x, autodiff::Symbol, inplace::Bool, od::OnceDifferentiable) = od
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, inplace::Bool, od::OnceDifferentiable) = od
promote_objtype(method::ZerothOrderOptimizer, x, autodiff::Symbol, inplace::Bool, td::TwiceDifferentiable) = td
promote_objtype(method::FirstOrderOptimizer, x, autodiff::Symbol, inplace::Bool, td::TwiceDifferentiable) = td
promote_objtype(method::SecondOrderOptimizer, x, autodiff::Symbol, inplace::Bool, td::TwiceDifferentiable) = td

# if no method or options are present
function optimize(f, initial_x::AbstractArray; inplace = true, autodiff = :finite, kwargs...)
method = fallback_method(f)
checked_kwargs, method = check_kwargs(kwargs, method)
d = promote_objtype(method, initial_x, autodiff, f)
d = promote_objtype(method, initial_x, autodiff, inplace, f)
add_default_opts!(checked_kwargs, method)

options = Options(; checked_kwargs...)
optimize(d, initial_x, method, options)
end
function optimize(f, g, initial_x::AbstractArray; inplace = true, autodiff = :finite, kwargs...)
g! = inplace ? g : (G, x) -> copy!(G, g(x))

method = fallback_method(f)
checked_kwargs, method = check_kwargs(kwargs, method)
d = promote_objtype(method, initial_x, autodiff, f, g!)
d = promote_objtype(method, initial_x, autodiff, inplace, f, g)
add_default_opts!(checked_kwargs, method)

options = Options(; checked_kwargs...)
optimize(d, initial_x, method, options)
end
function optimize(f, g, h, initial_x::AbstractArray; inplace = true, autodiff = :finite, kwargs...)
g! = inplace ? g : (G, x) -> copy!(G, g(x))
h! = inplace ? h : (H, x) -> copy!(H, h(x))

method = fallback_method(f, g!, h!)
method = fallback_method(f, g, h)
checked_kwargs, method = check_kwargs(kwargs, method)
d = promote_objtype(method, initial_x, autodiff, f, g!, h!)
d = promote_objtype(method, initial_x, autodiff, inplace, f, g, h)
add_default_opts!(checked_kwargs, method)

options = Options(; checked_kwargs...)
Expand All @@ -92,21 +89,19 @@ end
# no method supplied with inplace and autodiff keywords becauase objective is not supplied
function optimize(f, initial_x::AbstractArray, options::Options; inplace = true, autodiff = :finite)
method = fallback_method(f)
d = promote_objtype(method, initial_x, autodiff, f)
d = promote_objtype(method, initial_x, autodiff, inplace, f)
optimize(d, initial_x, method, options)
end
function optimize(f, g, initial_x::AbstractArray, options::Options; inplace = true, autodiff = :finite)
g! = inplace ? g : (G, x) -> copy!(G, g(x))

method = fallback_method(f, g!)
d = promote_objtype(method, initial_x, autodiff, f, g!)
d = promote_objtype(method, initial_x, autodiff, inplace, f, g)
optimize(d, initial_x, method, options)
end
function optimize(f, g, h, initial_x::AbstractArray, options::Options; inplace = true, autodiff = :finite)

g! = inplace ? g : (G, x) -> copy!(G, g(x))
h! = inplace ? h : (H, x) -> copy!(H, h(x))
method = fallback_method(f, g!, h!)
d = promote_objtype(method, initial_x, method, autodiff, f, g!, h!)
d = promote_objtype(method, initial_x, autodiff, inplace, f, g, h)

optimize(d, initial_x, method, options)
end
Expand All @@ -115,29 +110,26 @@ end
function optimize(f, initial_x::AbstractArray, method::AbstractOptimizer,
options::Options = Options(;default_options(method)...); inplace = true, autodiff = :finite)

d = promote_objtype(method, initial_x, autodiff, f)
d = promote_objtype(method, initial_x, autodiff, inplace, f)
optimize(d, initial_x, method, options)
end
function optimize(f, g, initial_x::AbstractArray, method::AbstractOptimizer,
options::Options = Options(;default_options(method)...); inplace = true, autodiff = :finite)

g! = inplace ? g : (G, x) -> copy!(G, g(x))
d = promote_objtype(method, initial_x, autodiff, f, g!)
d = promote_objtype(method, initial_x, autodiff, inplace, f, g)

optimize(d, initial_x, method, options)
end
function optimize(f, g, h, initial_x::AbstractArray{T}, method::AbstractOptimizer,
options::Options = Options(;default_options(method)...); inplace = true, autodiff = :finite) where T

g! = inplace ? g : (G, x) -> copy!(G, g(x))
h! = inplace ? h : (H, x) -> copy!(H, h(x))
d = promote_objtype(method, initial_x, autodiff, f, g!, h!)
d = promote_objtype(method, initial_x, autodiff, inplace, f, g, h)

optimize(d, initial_x, method, options)
end

function optimize(d::D, initial_x::AbstractArray, method::SecondOrderOptimizer,
options::Options = Options(;default_options(method)...); autodiff = :finite) where {D <: Union{NonDifferentiable, OnceDifferentiable}}
d = promote_objtype(method, initial_x, autodiff, d)
options::Options = Options(;default_options(method)...); autodiff = :finite, inplace = true) where {D <: Union{NonDifferentiable, OnceDifferentiable}}
d = promote_objtype(method, initial_x, autodiff, inplace, d)
optimize(d, initial_x, method, options)
end
9 changes: 0 additions & 9 deletions src/multivariate/solvers/constrained/fminbox.jl
Original file line number Diff line number Diff line change
Expand Up @@ -129,15 +129,6 @@ barrier_method(m::GradientDescent, P, precondprep) =
barrier_method(m::Union{NelderMead, SimulatedAnnealing, ParticleSwarm, BFGS, AbstractNGMRES},
P, precondprep) = m # use `m` as is

function optimize(obj,
l::AbstractArray{T},
u::AbstractArray{T},
initial_x::AbstractArray{T},
F::Fminbox = Fminbox()) where T<:AbstractFloat
od = OnceDifferentiable(obj, initial_x, zero(T))
optimize(od, l, u, initial_x, F)
end

function optimize(f,
g,
l::AbstractArray{T},
Expand Down

0 comments on commit 7efe461

Please sign in to comment.