@@ -74,42 +74,58 @@ Supported backends include `SparseADJacobian`, `SparseADHessian`, and `SparseRev
7474* `S`: A sparse matrix of type `SparseMatrixCSC{Bool,Int}` indicating the sparsity pattern of the requested derivative.
7575"""
7676function get_sparsity_pattern (model:: ADModel , derivative:: Symbol )
77- if (derivative != :jacobian ) && (derivative != :hessian )
78- if model isa AbstractADNLPModel
79- error (" The only supported sparse derivatives for an AbstractADNLPModel are `:jacobian` and `:hessian`." )
80- elseif (model isa AbstractADNLSModel) && (derivative != :jacobian_residual ) && (derivative != :hessian_resiual )
81- error (" The only supported sparse derivatives for an AbstractADNLSModel are `:jacobian`, `:jacobian_residual`, `:hessian` and `:hessian_resiual`." )
82- end
83- end
84- if (derivative == :jacobian ) || (derivative == :jacobian_residual )
85- backend = derivative == :jacobian ? model. adbackend. jacobian_backend : model. adbackend. jacobian_residual_backend
86- if backend isa SparseADJacobian
87- m = derivative == :jacobian ? model. meta. ncon : model. nls_meta. nequ
88- n = model. meta. nvar
89- colptr = backend. colptr
90- rowval = backend. rowval
91- nnzJ = length (rowval)
92- nzval = ones (Bool, nnzJ)
93- J = SparseMatrixCSC (m, n, colptr, rowval, nzval)
94- return J
95- else
96- B = typeof (backend)
97- error (" The current backend ($B ) doesn't compute a sparse Jacobian." )
98- end
99- end
100- if (derivative == :hessian ) || (derivative == :hessian_residual )
101- backend = derivative == :hessian ? model. adbackend. hessian_backend : model. adbackend. hessian_residual_backend
102- if (backend isa SparseADHessian) || (backend isa SparseReverseADHessian)
103- n = model. meta. nvar
104- colptr = backend. colptr
105- rowval = backend. rowval
106- nnzH = length (rowval)
107- nzval = ones (Bool, nnzH)
108- H = SparseMatrixCSC (n, n, colptr, rowval, nzval)
109- return H
110- else
111- B = typeof (backend)
112- error (" The current backend ($B ) doesn't compute a sparse Hessian." )
77+ get_sparsity_pattern (model, Val (derivative))
78+ end
79+
80+ function get_sparsity_pattern (model:: ADModel , :: Val{:jacobian} )
81+ backend = model. adbackend. jacobian_backend
82+ validate_sparse_backend (backend, SparseADJacobian, " Jacobian" )
83+ m = model. meta. ncon
84+ n = model. meta. nvar
85+ colptr = backend. colptr
86+ rowval = backend. rowval
87+ nnzJ = length (rowval)
88+ nzval = ones (Bool, nnzJ)
89+ SparseMatrixCSC (m, n, colptr, rowval, nzval)
90+ end
91+
92+ function get_sparsity_pattern (model:: ADModel , :: Val{:hessian} )
93+ backend = model. adbackend. hessian_backend
94+ validate_sparse_backend (backend, Union{SparseADHessian, SparseReverseADHessian}, " Hessian" )
95+ n = model. meta. nvar
96+ colptr = backend. colptr
97+ rowval = backend. rowval
98+ nnzH = length (rowval)
99+ nzval = ones (Bool, nnzH)
100+ SparseMatrixCSC (n, n, colptr, rowval, nzval)
101+ end
102+
103+ function get_sparsity_pattern (model:: AbstractADNLSModel , :: Val{:jacobian_residual} )
104+ backend = model. adbackend. jacobian_residual_backend
105+ validate_sparse_backend (backend, SparseADJacobian, " Jacobian of the residual" )
106+ m = model. nls_meta. nequ
107+ n = model. meta. nvar
108+ colptr = backend. colptr
109+ rowval = backend. rowval
110+ nnzJ = length (rowval)
111+ nzval = ones (Bool, nnzJ)
112+ SparseMatrixCSC (m, n, colptr, rowval, nzval)
113+ end
114+
115+ function get_sparsity_pattern (model:: AbstractADNLSModel , :: Val{:hessian_residual} )
116+ backend = model. adbackend. hessian_residual_backend
117+ validate_sparse_backend (backend, Union{SparseADHessian, SparseReverseADHessian}, " Hessian of the residual" )
118+ n = model. meta. nvar
119+ colptr = backend. colptr
120+ rowval = backend. rowval
121+ nnzH = length (rowval)
122+ nzval = ones (Bool, nnzH)
123+ SparseMatrixCSC (n, n, colptr, rowval, nzval)
124+ end
125+
126+ function validate_sparse_backend (backend:: ADBackend , expected_type, derivative_name:: String )
127+ if ! (backend isa expected_type)
128+ B = typeof (backend)
129+ error (" The current backend $B doesn't compute a sparse $derivative_name ." )
113130 end
114- end
115131end
0 commit comments