1 #ifndef CPPAD_CG_SPARSITY_INCLUDED
2 #define CPPAD_CG_SPARSITY_INCLUDED
21 template<
class VectorBool,
class Base>
22 inline 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);
35 template<
class VectorBool,
class Base>
36 inline 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);
48 template<
class VectorSet,
class Base>
49 inline 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);
59 template<
class VectorSet,
class Base>
60 inline 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);
76 template<
class VectorBool,
class Base>
77 inline 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);
96 template<
class VectorSet,
class Base>
97 inline 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);
116 inline 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;
134 template<
class VectorBool,
class Base>
135 inline 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);
157 template<
class VectorSet,
class Base>
158 inline 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);
177 template<
class VectorSet,
class Base>
178 inline 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);
196 template<
class VectorBool,
class Base>
197 inline 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);
221 template<
class VectorSet,
class Base>
222 inline 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);
238 template<
class VectorBool,
class VectorSize>
239 inline 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());
271 template<
class VectorSet,
class VectorSize>
272 inline 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);
299 template<
class VectorSet,
class VectorSize>
300 inline 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]);