diff --git a/src/enzyme.jl b/src/enzyme.jl index 2469fb1a..3f4b391b 100644 --- a/src/enzyme.jl +++ b/src/enzyme.jl @@ -111,6 +111,7 @@ function SparseEnzymeADJacobian( c!; x0::AbstractVector = rand(nvar), coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}( + decompression_uplo = :L, postprocessing = true, ), detector::AbstractSparsityDetector = TracerSparsityDetector(), @@ -133,6 +134,7 @@ function SparseEnzymeADJacobian( J::SparseMatrixCSC{Bool, Int}; x0::AbstractVector{T} = rand(nvar), coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}( + decompression_uplo = :L, postprocessing = true, ), show_time::Bool = false, @@ -192,6 +194,7 @@ function SparseEnzymeADHessian( c!; x0::AbstractVector = rand(nvar), coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:substitution}( + decompression_uplo = :L, postprocessing = true, ), detector::AbstractSparsityDetector = TracerSparsityDetector(), @@ -213,6 +216,7 @@ function SparseEnzymeADHessian( H::SparseMatrixCSC{Bool, Int}; x0::AbstractVector{T} = rand(nvar), coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:substitution}( + decompression_uplo = :L, postprocessing = true, ), show_time::Bool = false, @@ -533,14 +537,14 @@ end if b.coloring_mode == :direct # Update the coefficients of the lower triangular part of the Hessian that are related to the color `icol` - decompress_single_color!(A, b.compressed_hessian_icol, icol, b.result_coloring, :L) + decompress_single_color!(A, b.compressed_hessian_icol, icol, b.result_coloring) end if b.coloring_mode == :substitution view(b.compressed_hessian, :, icol) .= b.compressed_hessian_icol end end if b.coloring_mode == :substitution - decompress!(A, b.compressed_hessian, b.result_coloring, :L) + decompress!(A, b.compressed_hessian, b.result_coloring) end vals .= b.nzval return vals diff --git a/src/sparse_hessian.jl b/src/sparse_hessian.jl index e9fd3479..c73b4953 100644 --- a/src/sparse_hessian.jl +++ b/src/sparse_hessian.jl @@ -22,9 +22,7 @@ function SparseADHessian( ncon, c!; x0::AbstractVector = rand(nvar), - coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}( - postprocessing = true, - ), + coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}(decompression_uplo=:L, postprocessing=true), detector::AbstractSparsityDetector = TracerSparsityDetector(), show_time::Bool = false, kwargs..., @@ -43,9 +41,7 @@ function SparseADHessian( c!, H::SparseMatrixCSC{Bool, Int64}; x0::S = rand(nvar), - coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}( - postprocessing = true, - ), + coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:direct}(decompression_uplo=:L, postprocessing=true), show_time::Bool = false, kwargs..., ) where {S} @@ -147,9 +143,7 @@ function SparseReverseADHessian( ncon, c!; x0::AbstractVector = rand(nvar), - coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:substitution}( - postprocessing = true, - ), + coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:substitution}(decompression_uplo=:L, postprocessing=true), detector::AbstractSparsityDetector = TracerSparsityDetector(), show_time::Bool = false, kwargs..., @@ -168,9 +162,7 @@ function SparseReverseADHessian( c!, H::SparseMatrixCSC{Bool, Int}; x0::AbstractVector{T} = rand(nvar), - coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:substitution}( - postprocessing = true, - ), + coloring_algorithm::AbstractColoringAlgorithm = GreedyColoringAlgorithm{:substitution}(decompression_uplo=:L, postprocessing=true), show_time::Bool = false, kwargs..., ) where {T} @@ -315,11 +307,11 @@ function sparse_hess_coord!( compressed_hessian_icol .= view(b.Hvp, (ncon + 1):(ncon + b.nvar)) if b.coloring_mode == :direct # Update the coefficients of the lower triangular part of the Hessian that are related to the color `icol` - decompress_single_color!(A, compressed_hessian_icol, icol, b.result_coloring, :L) + decompress_single_color!(A, compressed_hessian_icol, icol, b.result_coloring) end end if b.coloring_mode == :substitution - decompress!(A, b.compressed_hessian, b.result_coloring, :L) + decompress!(A, b.compressed_hessian, b.result_coloring) end vals .= b.nzval return vals @@ -362,11 +354,11 @@ function sparse_hess_coord!( if b.coloring_mode == :direct # Update the coefficients of the lower triangular part of the Hessian that are related to the color `icol` - decompress_single_color!(A, compressed_hessian_icol, icol, b.result_coloring, :L) + decompress_single_color!(A, compressed_hessian_icol, icol, b.result_coloring) end end if b.coloring_mode == :substitution - decompress!(A, b.compressed_hessian, b.result_coloring, :L) + decompress!(A, b.compressed_hessian, b.result_coloring) end vals .= b.nzval return vals diff --git a/test/runtests.jl b/test/runtests.jl index 21f8dfa4..0830f08a 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -39,47 +39,48 @@ list_sparse_jac_backend = end list_sparse_hess_backend = ( - ( - ADNLPModels.SparseADHessian, + (ADNLPModels.SparseADHessian, "star coloring with postprocessing", - Dict(:coloring_algorithm => GreedyColoringAlgorithm{:direct}(postprocessing = true)), + Dict(:coloring_algorithm => GreedyColoringAlgorithm{:direct}(decompression_uplo=:L, postprocessing=true)), ), - ( - ADNLPModels.SparseADHessian, + (ADNLPModels.SparseADHessian, "star coloring without postprocessing", - Dict(:coloring_algorithm => GreedyColoringAlgorithm{:direct}(postprocessing = false)), + Dict(:coloring_algorithm => GreedyColoringAlgorithm{:direct}(decompression_uplo=:L, postprocessing=false)), ), ( ADNLPModels.SparseADHessian, "acyclic coloring with postprocessing", - Dict(:coloring_algorithm => GreedyColoringAlgorithm{:substitution}(postprocessing = true)), + Dict(:coloring_algorithm => GreedyColoringAlgorithm{:substitution}(decompression_uplo=:L, postprocessing=true)), ), ( ADNLPModels.SparseADHessian, "acyclic coloring without postprocessing", - Dict(:coloring_algorithm => GreedyColoringAlgorithm{:substitution}(postprocessing = false)), + Dict(:coloring_algorithm => GreedyColoringAlgorithm{:substitution}(decompression_uplo=:L, postprocessing=false)), ), ( ADNLPModels.SparseReverseADHessian, "star coloring with postprocessing", - Dict(:coloring_algorithm => GreedyColoringAlgorithm{:direct}(postprocessing = true)), + Dict(:coloring_algorithm => GreedyColoringAlgorithm{:direct}(decompression_uplo=:L, postprocessing=true)), ), ( ADNLPModels.SparseReverseADHessian, "star coloring without postprocessing", - Dict(:coloring_algorithm => GreedyColoringAlgorithm{:direct}(postprocessing = false)), + Dict(:coloring_algorithm => GreedyColoringAlgorithm{:direct}(decompression_uplo=:L, postprocessing=false)), ), ( ADNLPModels.SparseReverseADHessian, "acyclic coloring with postprocessing", - Dict(:coloring_algorithm => GreedyColoringAlgorithm{:substitution}(postprocessing = true)), + Dict(:coloring_algorithm => GreedyColoringAlgorithm{:substitution}(decompression_uplo=:L, postprocessing=true)), ), ( ADNLPModels.SparseReverseADHessian, "acyclic coloring without postprocessing", - Dict(:coloring_algorithm => GreedyColoringAlgorithm{:substitution}(postprocessing = false)), + Dict(:coloring_algorithm => GreedyColoringAlgorithm{:substitution}(decompression_uplo=:L, postprocessing=false)), + ), + (ADNLPModels.ForwardDiffADHessian, + "default", + Dict(), ), - (ADNLPModels.ForwardDiffADHessian, "default", Dict()), ) @testset "Sparse Hessian" begin