1#ifndef CPPAD_CG_SPARSITY_INCLUDED
2#define CPPAD_CG_SPARSITY_INCLUDED
21template<
class VectorBool,
class Base>
22inline VectorBool jacobianForwardSparsity(ADFun<Base>& fun) {
23 size_t n = fun.Domain();
26 for (
size_t j = 0; j < n; j++) {
27 for (
size_t k = 0; k < n; k++)
31 return fun.ForSparseJac(n, r);
35template<
class VectorBool,
class Base>
36inline VectorBool jacobianReverseSparsity(ADFun<Base>& fun) {
37 size_t m = fun.Range();
40 for (
size_t i = 0; i < m; i++) {
41 for (
size_t k = 0; k < m; k++)
45 return fun.RevSparseJac(m, s);
48template<
class VectorSet,
class Base>
49inline VectorSet jacobianForwardSparsitySet(ADFun<Base>& fun) {
50 size_t n = fun.Domain();
53 for (
size_t i = 0; i < n; i++)
56 return fun.ForSparseJac(n, r);
59template<
class VectorSet,
class Base>
60inline VectorSet jacobianReverseSparsitySet(ADFun<Base>& fun) {
61 size_t m = fun.Range();
64 for (
size_t i = 0; i < m; i++)
67 return fun.RevSparseJac(m, s_s);
76template<
class VectorBool,
class Base>
77inline VectorBool jacobianSparsity(ADFun<Base>& fun) {
78 size_t m = fun.Range();
79 size_t n = fun.Domain();
83 return jacobianForwardSparsity<VectorBool, Base> (fun);
86 return jacobianReverseSparsity<VectorBool, Base> (fun);
96template<
class VectorSet,
class Base>
97inline VectorSet jacobianSparsitySet(ADFun<Base>& fun) {
98 size_t m = fun.Range();
99 size_t n = fun.Domain();
103 return jacobianForwardSparsitySet<VectorSet, Base> (fun);
106 return jacobianReverseSparsitySet<VectorSet, Base> (fun);
116inline bool estimateBestJacobianADMode(
const std::vector<size_t>& jacRows,
117 const std::vector<size_t>& jacCols) {
118 std::set<size_t> rows, cols;
119 rows.insert(jacRows.begin(), jacRows.end());
120 size_t workReverse = rows.size();
121 cols.insert(jacCols.begin(), jacCols.end());
122 size_t workForward = cols.size();
124 return workForward <= workReverse;
134template<
class VectorBool,
class Base>
135inline VectorBool hessianSparsity(ADFun<Base>& fun,
136 bool transpose =
false) {
137 size_t m = fun.Range();
138 size_t n = fun.Domain();
144 for (
size_t j = 0; j < n; j++) {
145 for (
size_t k = 0; k < n; k++)
146 r[j * n + k] =
false;
149 fun.ForSparseJac(n, r);
152 for (
size_t i = 0; i < m; i++)
154 return fun.RevSparseHes(n, s, transpose);
157template<
class VectorSet,
class Base>
158inline VectorSet hessianSparsitySet(ADFun<Base>& fun,
159 const std::set<size_t>& w,
160 bool transpose =
false) {
161 size_t n = fun.Domain();
167 for (
size_t j = 0; j < n; j++)
169 fun.ForSparseJac(n, r);
174 return fun.RevSparseHes(n, s, transpose);
177template<
class VectorSet,
class Base>
178inline VectorSet hessianSparsitySet(ADFun<Base>& fun,
bool transpose =
false) {
179 size_t m = fun.Range();
182 for (
size_t i = 0; i < m; i++) {
185 return hessianSparsitySet<VectorSet, Base>(fun, w, transpose);
196template<
class VectorBool,
class Base>
197inline VectorBool hessianSparsity(ADFun<Base>& fun,
199 bool transpose =
false) {
200 size_t m = fun.Range();
201 size_t n = fun.Domain();
207 for (
size_t j = 0; j < n; j++) {
208 for (
size_t k = 0; k < n; k++)
209 r[j * n + k] =
false;
212 fun.ForSparseJac(n, r);
215 for (
size_t ii = 0; ii < m; ii++)
218 return fun.RevSparseHes(n, s, transpose);
221template<
class VectorSet,
class Base>
222inline VectorSet hessianSparsitySet(ADFun<Base>& fun,
224 bool transpose =
false) {
225 size_t n = fun.Domain();
228 for (
size_t j = 0; j < n; j++)
230 fun.ForSparseJac(n, r);
235 return fun.RevSparseHes(n, s, transpose);
238template<
class VectorBool,
class VectorSize>
239inline void generateSparsityIndexes(
const VectorBool& sparsity,
244 assert(sparsity.size() == m * n);
248 for (
size_t i = 0; i < sparsity.size(); i++) {
258 for (
size_t i = 0; i < m; i++) {
259 for (
size_t j = 0; j < n; j++) {
260 if (sparsity[i * n + j]) {
268 assert(nnz == row.size());
271template<
class VectorSet,
class VectorSize>
272inline void generateSparsityIndexes(
const VectorSet& sparsity,
275 size_t m = sparsity.size();
279 for (
size_t i = 0; i < m; i++) {
280 nnz += sparsity[i].size();
290 for (
size_t i = 0; i < m; i++) {
291 const std::set<size_t>& rowSparsity = sparsity[i];
292 size_t rowNnz = rowSparsity.size();
293 std::fill(&row[0] + nnz, &row[0] + nnz + rowNnz, i);
294 std::copy(rowSparsity.begin(), rowSparsity.end(), &col[0] + nnz);
299template<
class VectorSet,
class VectorSize>
300inline void generateSparsitySet(
const VectorSize& row,
301 const VectorSize& col,
302 VectorSet& sparsity) {
303 assert(row.size() == col.size());
305 size_t nnz = row.size();
306 for (
size_t e = 0; e < nnz; e++) {
307 sparsity[row[e]].insert(col[e]);