Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions benchmarks/Project.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[deps]
ADNLPModels = "54578032-b7ea-4c30-94aa-7cbd1cce6c9a"
BundleAdjustmentModels = "0bf3e898-7c79-4b38-9ca6-2d9cc6573905"
MatrixMarket = "4d4711f2-db25-561a-b6b3-d35e7d4047d3"
NLPModels = "a4795742-8479-5a88-8948-cc11e1c8c1a6"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"
SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf"
74 changes: 74 additions & 0 deletions benchmarks/benchmarks.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using BundleAdjustmentModels
using ADNLPModels
using NLPModels
using Printf

debug = false
check_jacobian = false
df = problems_df()
# df = df[ ( df.nequ .≤ 600000 ) .& ( df.nvar .≤ 100000 ), :]
nproblems = size(df)[1]

@printf("| %21s | %7s | %7s | %22s | %15s |\n", "problem", "nequ", "nvar", "backend", "coord_residual")
for i = 1:nproblems
name_pb = df[i, :name]

# Smaller problem of the collection
debug && (i == 1) && (name_pb = "problem-49-7776-pre")
debug && (i ≠ 1) && continue

## BundleAdjustementModels
nls = BundleAdjustmentModel(name_pb)
meta_nls = nls_meta(nls)
Fx = similar(nls.meta.x0, meta_nls.nequ)
rows = Vector{Int}(undef, meta_nls.nnzj)
cols = Vector{Int}(undef, meta_nls.nnzj)
vals = similar(nls.meta.x0, meta_nls.nnzj)
x = rand(nls.meta.nvar) # nls.meta.x0

# warm-start
residual(nls, nls.meta.x0)
residual!(nls, nls.meta.x0, Fx)
jac_structure_residual!(nls, rows, cols)
jac_coord_residual!(nls, x, vals)

# benchmarks
start_timer = time()
jac_coord_residual!(nls, x, vals)
end_timer = time()
timer_coord_residual = end_timer - start_timer
@printf("| %21s | %7s | %7s | %22s | %6.5f seconds |\n", name_pb, nls.nls_meta.nequ, nls.meta.nvar, "BundleAdjustmentModels", timer_coord_residual)

## ADNLPModels
function F!(Fx, x)
residual!(nls, x, Fx)
end
nls2 = ADNLSModel!(F!, nls.meta.x0, meta_nls.nequ, nls.meta.lvar, nls.meta.uvar, jacobian_residual_backend = ADNLPModels.SparseADJacobian,
jacobian_backend = ADNLPModels.EmptyADbackend,
hessian_backend = ADNLPModels.EmptyADbackend,
hessian_residual_backend = ADNLPModels.EmptyADbackend)
meta_nls2 = nls_meta(nls2)
rows2 = Vector{Int}(undef, meta_nls2.nnzj)
cols2 = Vector{Int}(undef, meta_nls2.nnzj)
vals2 = similar(nls2.meta.x0, meta_nls2.nnzj)

# Warm-start
jac_structure_residual!(nls2, rows2, cols2)
jac_coord_residual!(nls2, x, vals2)

# benchmarks
start_timer = time()
jac_coord_residual!(nls2, x, vals2)
end_timer = time()
timer2_coord_residual = end_timer - start_timer
@printf("| %21s | %7s | %7s | %22s | %6.5f seconds |\n", name_pb, nls2.nls_meta.nequ, nls2.meta.nvar, "ADNLPModels", timer2_coord_residual)

if check_jacobian
println(meta_nls.nnzj)
println(meta_nls2.nnzj)
J_nls = sparse(rows, cols, vals)
J_nls2 = sparse(rows2, cols2, vals2)
norm(J_nls - J_nls2) |> println
norm(J_nls - J_nls2, Inf) |> println
end
end
23 changes: 23 additions & 0 deletions benchmarks/sparsity_patterns.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using BundleAdjustmentModels
using ADNLPModels
using NLPModels
using Printf
using SparseArrays
using MatrixMarket

df = problems_df()
num_pb = size(df, 1)
for i = num_pb:-1:num_pb-9
name_pb = df[i, :name]
println("Problem $i / $(num_pb) -- $(name_pb)")

## BundleAdjustementModels
nls = BundleAdjustmentModel(name_pb)
meta_nls = nls_meta(nls)
m, n = meta_nls.nequ, meta_nls.nvar
rows, cols = jac_structure_residual(nls)
vals = ones(Bool, meta_nls.nnzj)
J = sparse(rows, cols, vals, m, n)
display(J)
mmwrite(name_pb * ".mtx", J)
end
3 changes: 1 addition & 2 deletions src/BundleAdjustmentNLSFunctions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -144,8 +144,7 @@ function projection!(
f,
r2::AbstractVector,
)
# θ = norm(r)
θ = sqrt(dot(r, r))
θ = norm(r)

# k .= r ./ θ
k1 = r[1] / θ
Expand Down