Skip to content

Commit 64da046

Browse files
committed
Update tests
1 parent 06e91e6 commit 64da046

File tree

3 files changed

+149
-95
lines changed

3 files changed

+149
-95
lines changed

src/enzyme.jl

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,147 @@ function Hvprod!(
177177
)
178178
return Hv
179179
end
180+
181+
# Sparse Jacobian
182+
struct SparseEnzymeADJacobian{R, C, S} <: ADBackend
183+
nvar::Int
184+
ncon::Int
185+
rowval::Vector{Int}
186+
colptr::Vector{Int}
187+
nzval::Vector{R}
188+
result_coloring::C
189+
compressed_jacobian::S
190+
v::Vector{R}
191+
buffer::Vector{R}
192+
end
193+
194+
function SparseEnzymeADJacobian(
195+
nvar,
196+
f,
197+
ncon,
198+
c!;
199+
x0::AbstractVector = rand(nvar),
200+
coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}(),
201+
detector::AbstractSparsityDetector = TracerSparsityDetector(),
202+
kwargs...,
203+
)
204+
output = similar(x0, ncon)
205+
J = compute_jacobian_sparsity(c!, output, x0, detector = detector)
206+
SparseEnzymeADJacobian(nvar, f, ncon, c!, J; x0, coloring_algorithm, kwargs...)
207+
end
208+
209+
function SparseEnzymeADJacobian(
210+
nvar,
211+
f,
212+
ncon,
213+
c!,
214+
J::SparseMatrixCSC{Bool, Int};
215+
x0::AbstractVector{T} = rand(nvar),
216+
coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}(),
217+
kwargs...,
218+
) where {T}
219+
# We should support :row and :bidirectional in the future
220+
problem = ColoringProblem{:nonsymmetric, :column}()
221+
result_coloring = coloring(J, problem, coloring_algorithm, decompression_eltype = T)
222+
223+
rowval = J.rowval
224+
colptr = J.colptr
225+
nzval = T.(J.nzval)
226+
compressed_jacobian = similar(x0, ncon)
227+
v = similar(x0)
228+
buffer = zeros(T, ncon)
229+
230+
SparseEnzymeADJacobian(
231+
nvar,
232+
ncon,
233+
rowval,
234+
colptr,
235+
nzval,
236+
result_coloring,
237+
compressed_jacobian,
238+
v,
239+
buffer,
240+
)
241+
end
242+
243+
function sparse_jac_coord!(
244+
c!::Function,
245+
b::SparseEnzymeADJacobian,
246+
x::AbstractVector,
247+
vals::AbstractVector,
248+
)
249+
# SparseMatrixColorings.jl requires a SparseMatrixCSC for the decompression
250+
A = SparseMatrixCSC(b.ncon, b.nvar, b.colptr, b.rowval, b.nzval)
251+
252+
groups = column_groups(b.result_coloring)
253+
for (icol, cols) in enumerate(groups)
254+
# Update the seed
255+
b.v .= 0
256+
for col in cols
257+
b.v[col] = 1
258+
end
259+
260+
# b.compressed_jacobian is just a vector Jv here
261+
# We don't use the vector mode
262+
Enzyme.autodiff(Enzyme.Forward, Const(c!), Duplicated(b.buffer, b.compressed_jacobian), Duplicated(x, b.v))
263+
264+
# Update the columns of the Jacobian that have the color `icol`
265+
decompress_single_color!(A, b.compressed_jacobian, icol, b.result_coloring)
266+
end
267+
vals .= b.nzval
268+
return vals
269+
end
270+
271+
function get_nln_nnzj(b::SparseEnzymeADJacobian, nvar, ncon)
272+
length(b.rowval)
273+
end
274+
275+
function NLPModels.jac_structure!(
276+
b::SparseEnzymeADJacobian,
277+
nlp::ADModel,
278+
rows::AbstractVector{<:Integer},
279+
cols::AbstractVector{<:Integer},
280+
)
281+
rows .= b.rowval
282+
for i = 1:(nlp.meta.nvar)
283+
for j = b.colptr[i]:(b.colptr[i + 1] - 1)
284+
cols[j] = i
285+
end
286+
end
287+
return rows, cols
288+
end
289+
290+
function NLPModels.jac_coord!(
291+
b::SparseEnzymeADJacobian,
292+
nlp::ADModel,
293+
x::AbstractVector,
294+
vals::AbstractVector,
295+
)
296+
sparse_jac_coord!(nlp.c!, b, x, vals)
297+
return vals
298+
end
299+
300+
function NLPModels.jac_structure_residual!(
301+
b::SparseEnzymeADJacobian,
302+
nls::AbstractADNLSModel,
303+
rows::AbstractVector{<:Integer},
304+
cols::AbstractVector{<:Integer},
305+
)
306+
rows .= b.rowval
307+
for i = 1:(nls.meta.nvar)
308+
for j = b.colptr[i]:(b.colptr[i + 1] - 1)
309+
cols[j] = i
310+
end
311+
end
312+
return rows, cols
313+
end
314+
315+
function NLPModels.jac_coord_residual!(
316+
b::SparseEnzymeADJacobian,
317+
nls::AbstractADNLSModel,
318+
x::AbstractVector,
319+
vals::AbstractVector,
320+
)
321+
sparse_jac_coord!(nls.F!, b, x, vals)
322+
return vals
323+
end

src/sparse_jacobian.jl

Lines changed: 5 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -92,101 +92,12 @@ function sparse_jac_coord!(
9292
return vals
9393
end
9494

95-
struct SparseEnzymeADJacobian{R, C, S} <: ADBackend
96-
nvar::Int
97-
ncon::Int
98-
rowval::Vector{Int}
99-
colptr::Vector{Int}
100-
nzval::Vector{R}
101-
result_coloring::C
102-
compressed_jacobian::S
103-
v::Vector{R}
104-
buffer::Vector{R}
105-
end
106-
107-
function SparseEnzymeADJacobian(
108-
nvar,
109-
f,
110-
ncon,
111-
c!;
112-
x0::AbstractVector = rand(nvar),
113-
coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}(),
114-
detector::AbstractSparsityDetector = TracerSparsityDetector(),
115-
kwargs...,
116-
)
117-
output = similar(x0, ncon)
118-
J = compute_jacobian_sparsity(c!, output, x0, detector = detector)
119-
SparseEnzymeADJacobian(nvar, f, ncon, c!, J; x0, coloring_algorithm, kwargs...)
120-
end
121-
122-
function SparseEnzymeADJacobian(
123-
nvar,
124-
f,
125-
ncon,
126-
c!,
127-
J::SparseMatrixCSC{Bool, Int};
128-
x0::AbstractVector{T} = rand(nvar),
129-
coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}(),
130-
kwargs...,
131-
) where {T}
132-
# We should support :row and :bidirectional in the future
133-
problem = ColoringProblem{:nonsymmetric, :column}()
134-
result_coloring = coloring(J, problem, coloring_algorithm, decompression_eltype = T)
135-
136-
rowval = J.rowval
137-
colptr = J.colptr
138-
nzval = T.(J.nzval)
139-
compressed_jacobian = similar(x0, ncon)
140-
v = similar(x0)
141-
buffer = zeros(T, ncon)
142-
143-
SparseEnzymeADJacobian(
144-
nvar,
145-
ncon,
146-
rowval,
147-
colptr,
148-
nzval,
149-
result_coloring,
150-
compressed_jacobian,
151-
v,
152-
buffer,
153-
)
154-
end
155-
156-
function sparse_jac_coord!(
157-
c!::Function,
158-
b::SparseEnzymeADJacobian,
159-
x::AbstractVector,
160-
vals::AbstractVector,
161-
)
162-
# SparseMatrixColorings.jl requires a SparseMatrixCSC for the decompression
163-
A = SparseMatrixCSC(b.ncon, b.nvar, b.colptr, b.rowval, b.nzval)
164-
165-
groups = column_groups(b.result_coloring)
166-
for (icol, cols) in enumerate(groups)
167-
# Update the seed
168-
b.v .= 0
169-
for col in cols
170-
b.v[col] = 1
171-
end
172-
173-
# b.compressed_jacobian is just a vector Jv here
174-
# We don't use the vector mode
175-
Enzyme.autodiff(Enzyme.Forward, Const(c!), Duplicated(b.buffer, b.compressed_jacobian), Duplicated(x, b.v))
176-
177-
# Update the columns of the Jacobian that have the color `icol`
178-
decompress_single_color!(A, b.compressed_jacobian, icol, b.result_coloring)
179-
end
180-
vals .= b.nzval
181-
return vals
182-
end
183-
184-
function get_nln_nnzj(b::Union{SparseADJacobian, SparseEnzymeADJacobian}, nvar, ncon)
95+
function get_nln_nnzj(b::SparseADJacobian, nvar, ncon)
18596
length(b.rowval)
18697
end
18798

18899
function NLPModels.jac_structure!(
189-
b::Union{SparseADJacobian, SparseEnzymeADJacobian},
100+
b::SparseADJacobian,
190101
nlp::ADModel,
191102
rows::AbstractVector{<:Integer},
192103
cols::AbstractVector{<:Integer},
@@ -201,7 +112,7 @@ function NLPModels.jac_structure!(
201112
end
202113

203114
function NLPModels.jac_coord!(
204-
b::Union{SparseADJacobian, SparseEnzymeADJacobian},
115+
b::SparseADJacobian,
205116
nlp::ADModel,
206117
x::AbstractVector,
207118
vals::AbstractVector,
@@ -211,7 +122,7 @@ function NLPModels.jac_coord!(
211122
end
212123

213124
function NLPModels.jac_structure_residual!(
214-
b::Union{SparseADJacobian, SparseEnzymeADJacobian},
125+
b::SparseADJacobian,
215126
nls::AbstractADNLSModel,
216127
rows::AbstractVector{<:Integer},
217128
cols::AbstractVector{<:Integer},
@@ -226,7 +137,7 @@ function NLPModels.jac_structure_residual!(
226137
end
227138

228139
function NLPModels.jac_coord_residual!(
229-
b::Union{SparseADJacobian, SparseEnzymeADJacobian},
140+
b::SparseADJacobian,
230141
nls::AbstractADNLSModel,
231142
x::AbstractVector,
232143
vals::AbstractVector,

test/enzyme.jl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,3 @@ include("nlp/basic.jl")
9999
include("nls/basic.jl")
100100
include("nlp/nlpmodelstest.jl")
101101
include("nls/nlpmodelstest.jl")
102-

0 commit comments

Comments
 (0)