Skip to content

Commit

Permalink
remove f and c in structure
Browse files Browse the repository at this point in the history
  • Loading branch information
tmigot authored and abelsiqueira committed May 20, 2021
1 parent e9679e3 commit 8da9956
Show file tree
Hide file tree
Showing 7 changed files with 25 additions and 31 deletions.
20 changes: 7 additions & 13 deletions src/ad.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,44 +3,38 @@ struct ForwardDiffAD <: ADBackend
nnzh::Int
nnzj::Int
end
function ForwardDiffAD(f, c, x0::AbstractVector, ncon::Integer)
nvar = length(x0)
function ForwardDiffAD(nvar::Integer, ncon::Integer)
nnzh = nvar * (nvar + 1) / 2
nnzj = nvar * ncon
return ForwardDiffAD(nnzh, nnzj)
end
function ForwardDiffAD(f, x0::AbstractVector)
nvar = length(x0)
function ForwardDiffAD(nvar::Integer)
nnzh = nvar * (nvar + 1) / 2
return ForwardDiffAD(nnzh, 0)
end
struct ZygoteAD <: ADBackend
nnzh::Int
nnzj::Int
end
function ZygoteAD(f, c, x0::AbstractVector, ncon::Integer)
nvar = length(x0)
function ZygoteAD(nvar::Integer, ncon::Integer)
nnzh = nvar * (nvar + 1) / 2
nnzj = nvar * ncon
return ZygoteAD(nnzh, nnzj)
end
function ZygoteAD(f, x0::AbstractVector)
nvar = length(x0)
function ZygoteAD(nvar::Integer)
nnzh = nvar * (nvar + 1) / 2
return ZygoteAD(nnzh, 0)
end
struct ReverseDiffAD <: ADBackend
nnzh::Int
nnzj::Int
end
function ReverseDiffAD(f, c, x0::AbstractVector, ncon::Integer)
nvar = length(x0)
function ReverseDiffAD(nvar::Integer, ncon::Integer)
nnzh = nvar * (nvar + 1) / 2
nnzj = nvar * ncon
return ReverseDiffAD(nnzh, nnzj)
end
function ReverseDiffAD(f, x0::AbstractVector)
nvar = length(x0)
function ReverseDiffAD(nvar::Integer)
nnzh = nvar * (nvar + 1) / 2
return ReverseDiffAD(nnzh, 0)
end
Expand Down Expand Up @@ -127,7 +121,7 @@ end
return Zygote.jacobian(f, x)[1]
end
function hessian(b::ZygoteAD, f, x)
return jacobian(ForwardDiffAD(f, x), x -> gradient(b, f, x), x)
return jacobian(ForwardDiffAD(length(x)), x -> gradient(b, f, x), x)
end
function Jprod(::ZygoteAD, f, x, v)
return vec(Zygote.jacobian(t -> f(x + t * v), 0)[1])
Expand Down
8 changes: 4 additions & 4 deletions src/nlp.jl
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ function ADNLPModel(
f,
x0::AbstractVector{T};
name::String = "Generic",
adbackend = ForwardDiffAD(f, x0),
adbackend = ForwardDiffAD(length(x0)),
) where {T}
nvar = length(x0)
@lencheck nvar x0
Expand All @@ -57,7 +57,7 @@ function ADNLPModel(
lvar::AbstractVector,
uvar::AbstractVector;
name::String = "Generic",
adbackend = ForwardDiffAD(f, x0),
adbackend = ForwardDiffAD(length(x0)),
) where {T}
nvar = length(x0)
@lencheck nvar x0 lvar uvar
Expand Down Expand Up @@ -87,7 +87,7 @@ function ADNLPModel(
y0::AbstractVector = fill!(similar(lcon), zero(T)),
name::String = "Generic",
lin::AbstractVector{<:Integer} = Int[],
adbackend = ForwardDiffAD(f, c, x0, length(lcon)),
adbackend = ForwardDiffAD(length(x0), length(lcon)),
) where {T}
nvar = length(x0)
ncon = length(lcon)
Expand Down Expand Up @@ -129,7 +129,7 @@ function ADNLPModel(
y0::AbstractVector = fill!(similar(lcon), zero(T)),
name::String = "Generic",
lin::AbstractVector{<:Integer} = Int[],
adbackend = ForwardDiffAD(f, c, x0, length(lcon)),
adbackend = ForwardDiffAD(length(x0), length(lcon)),
) where {T}
nvar = length(x0)
ncon = length(lcon)
Expand Down
8 changes: 4 additions & 4 deletions src/nls.jl
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ function ADNLSModel(
nequ::Integer;
linequ::AbstractVector{<:Integer} = Int[],
name::String = "Generic",
adbackend = ForwardDiffAD(F, x0),
adbackend = ForwardDiffAD(length(x0)),
) where {T}
nvar = length(x0)

Expand All @@ -72,7 +72,7 @@ function ADNLSModel(
uvar::AbstractVector;
linequ::AbstractVector{<:Integer} = Int[],
name::String = "Generic",
adbackend = ForwardDiffAD(F, x0),
adbackend = ForwardDiffAD(length(x0)),
) where {T}
nvar = length(x0)
@lencheck nvar lvar uvar
Expand Down Expand Up @@ -102,7 +102,7 @@ function ADNLSModel(
lin::AbstractVector{<:Integer} = Int[],
linequ::AbstractVector{<:Integer} = Int[],
name::String = "Generic",
adbackend = ForwardDiffAD(F, c, x0, length(lcon)),
adbackend = ForwardDiffAD(length(x0), length(lcon)),
) where {T}
nvar = length(x0)
ncon = length(lcon)
Expand Down Expand Up @@ -148,7 +148,7 @@ function ADNLSModel(
lin::AbstractVector{<:Integer} = Int[],
linequ::AbstractVector{<:Integer} = Int[],
name::String = "Generic",
adbackend = ForwardDiffAD(F, c, x0, length(lcon)),
adbackend = ForwardDiffAD(length(x0), length(lcon)),
) where {T}
nvar = length(x0)
ncon = length(lcon)
Expand Down
10 changes: 5 additions & 5 deletions test/nlp/basic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -25,25 +25,25 @@ function test_autodiff_model()
for adbackend in (:ForwardDiffAD, :ZygoteAD, :ReverseDiffAD)
x0 = zeros(2)
f(x) = dot(x, x)
nlp = ADNLPModel(f, x0, adbackend = eval(adbackend)(f, x0))
nlp = ADNLPModel(f, x0, adbackend = eval(adbackend)(length(x0)))

c(x) = [sum(x) - 1]
nlp = ADNLPModel(f, x0, c, [0], [0], adbackend = eval(adbackend)(f, c, x0, 1))
nlp = ADNLPModel(f, x0, c, [0], [0], adbackend = eval(adbackend)(length(x0), 1))
@test obj(nlp, x0) == f(x0)

x = range(-1, stop = 1, length = 100)
y = 2x .+ 3 + randn(100) * 0.1
regr = LinearRegression(x, y)
nlp = ADNLPModel(regr, ones(2), adbackend = eval(adbackend)(regr, ones(2)))
nlp = ADNLPModel(regr, ones(2), adbackend = eval(adbackend)(2))
β = [ones(100) x] \ y
@test abs(obj(nlp, β) - norm(y .- β[1] - β[2] * x)^2 / 2) < 1e-12
@test norm(grad(nlp, β)) < 1e-12

@testset "Constructors for ADNLPModel" begin
lvar, uvar, lcon, ucon, y0 = -ones(2), ones(2), -ones(1), ones(1), zeros(1)
badlvar, baduvar, badlcon, baducon, bady0 = -ones(3), ones(3), -ones(2), ones(2), zeros(2)
unc_adbackend = eval(adbackend)(f, x0)
con_adbackend = eval(adbackend)(f, c, x0, 1)
unc_adbackend = eval(adbackend)(2)
con_adbackend = eval(adbackend)(2, 1)
nlp = ADNLPModel(f, x0, adbackend = unc_adbackend)
nlp = ADNLPModel(f, x0, lvar, uvar, adbackend = unc_adbackend)
nlp = ADNLPModel(f, x0, c, lcon, ucon, adbackend = con_adbackend)
Expand Down
2 changes: 1 addition & 1 deletion test/nlp/nlpmodelstest.jl
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
for problem in NLPModelsTest.nlp_problems
@testset "Checking NLPModelsTest tests on problem $problem" begin
nlp_ad = eval(Meta.parse(lowercase(problem) * "_autodiff"))()
nlp_ad.adbackend = eval(adbackend)(nlp_ad.f, nlp_ad.meta.x0)
nlp_ad.adbackend = eval(adbackend)(length(nlp_ad.meta.x0))
nlp_man = eval(Meta.parse(problem))()

show(IOBuffer(), nlp_ad)
Expand Down
6 changes: 3 additions & 3 deletions test/nls/basic.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ function autodiff_nls_test()
for adbackend in (:ForwardDiffAD, :ZygoteAD, :ReverseDiffAD)
@testset "autodiff_nls_test for $adbackend" begin
F(x) = [x[1] - 1; x[2] - x[1]^2]
nls = ADNLSModel(F, zeros(2), 2, adbackend = eval(adbackend)(F, zeros(2)))
nls = ADNLSModel(F, zeros(2), 2, adbackend = eval(adbackend)(2))

@test isapprox(residual(nls, ones(2)), zeros(2), rtol = 1e-8)
end
Expand All @@ -13,8 +13,8 @@ function autodiff_nls_test()
c(x) = [sum(x) - 1]
lvar, uvar, lcon, ucon, y0 = -ones(2), ones(2), -ones(1), ones(1), zeros(1)
badlvar, baduvar, badlcon, baducon, bady0 = -ones(3), ones(3), -ones(2), ones(2), zeros(2)
unc_adbackend = eval(adbackend)(F, x0)
con_adbackend = eval(adbackend)(F, c, x0, 1)
unc_adbackend = eval(adbackend)(2)
con_adbackend = eval(adbackend)(2, 1)
nlp = ADNLSModel(F, x0, 3, adbackend = unc_adbackend)
nlp = ADNLSModel(F, x0, 3, lvar, uvar, adbackend = unc_adbackend)
nlp = ADNLSModel(F, x0, 3, c, lcon, ucon, adbackend = con_adbackend)
Expand Down
2 changes: 1 addition & 1 deletion test/nls/nlpmodelstest.jl
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
for problem in NLPModelsTest.nls_problems
@testset "Checking NLPModelsTest tests on problem $problem" begin
nls_ad = eval(Meta.parse(lowercase(problem) * "_autodiff"))()
nls_ad.adbackend = eval(adbackend)(nls_ad.F, nls_ad.meta.x0)
nls_ad.adbackend = eval(adbackend)(length(nls_ad.meta.x0))
nls_man = eval(Meta.parse(problem))()

nlss = AbstractNLSModel[nls_ad]
Expand Down

0 comments on commit 8da9956

Please sign in to comment.