1 #ifndef CPPAD_CG_ATOMIC_FUN_BRIDGE_INCLUDED 2 #define CPPAD_CG_ATOMIC_FUN_BRIDGE_INCLUDED 37 bool cacheSparsities_;
40 std::map<size_t, CppAD::vector<std::set<size_t> > > hess_;
57 bool standAlone =
false,
58 bool cacheSparsities =
true) :
61 cacheSparsities_(cacheSparsities) {
62 this->option(CppAD::atomic_base<CGB>::set_sparsity_enum);
70 template <
class ADVector>
71 void operator()(
const ADVector& ax, ADVector& ay,
size_t id = 0) {
75 template<
class VectorSize>
76 inline void setCustomSparseJacobianElements(
const VectorSize& row,
77 const VectorSize& col) {
78 custom_jac_ =
CustomPosition(fun_.Range(), fun_.Domain(), row, col);
81 template<
class VectorSet>
82 inline void setCustomSparseJacobianElements(
const VectorSet& elements) {
83 custom_jac_ =
CustomPosition(fun_.Range(), fun_.Domain(), elements);
86 template<
class VectorSize>
87 inline void setCustomSparseHessianElements(
const VectorSize& row,
88 const VectorSize& col) {
89 size_t n = fun_.Domain();
93 template<
class VectorSet>
94 inline void setCustomSparseHessianElements(
const VectorSet& elements) {
95 size_t n = fun_.Domain();
99 bool for_sparse_jac(
size_t q,
103 return for_sparse_jac(q, r, s);
106 bool for_sparse_jac(
size_t q,
111 if (cacheSparsities_ || custom_jac_.isFilterDefined()) {
112 size_t n = fun_.Domain();
113 size_t m = fun_.Range();
114 if (!custom_jac_.isFullDefined()) {
115 custom_jac_.setFullElements(jacobianForwardSparsitySet<std::vector<std::set<size_t> > >(fun_));
116 fun_.size_forward_set(0);
119 for (
size_t i = 0; i < s.size(); i++) {
122 CppAD::cg::multMatrixMatrixSparsity(custom_jac_.getFullElements(), r, s, m, n, q);
124 s = fun_.ForSparseJac(q, r);
125 fun_.size_forward_set(0);
131 bool rev_sparse_jac(
size_t q,
135 return rev_sparse_jac(q, rt, st);
138 bool rev_sparse_jac(
size_t q,
143 if (cacheSparsities_ || custom_jac_.isFilterDefined()) {
144 size_t n = fun_.Domain();
145 size_t m = fun_.Range();
146 if (!custom_jac_.isFullDefined()) {
147 custom_jac_.setFullElements(jacobianReverseSparsitySet<std::vector<std::set<size_t> > >(fun_));
150 for (
size_t i = 0; i < st.size(); i++) {
153 CppAD::cg::multMatrixMatrixSparsityTrans(rt, custom_jac_.getFullElements(), st, m, n, q);
155 st = fun_.RevSparseJac(q, rt,
true);
169 return rev_sparse_hes(vx, s, t, q, r, u, v);
181 if (cacheSparsities_ || custom_jac_.isFilterDefined() || custom_hess_.isFilterDefined()) {
182 size_t n = fun_.Domain();
183 size_t m = fun_.Range();
185 for (
size_t i = 0; i < n; i++) {
189 if (!custom_jac_.isFullDefined()) {
190 custom_jac_.setFullElements(jacobianSparsitySet<std::vector<std::set<size_t> > >(fun_));
192 const std::vector<std::set<size_t> >& jacSparsity = custom_jac_.getFullElements();
198 CppAD::cg::multMatrixTransMatrixSparsity(jacSparsity, u, v, m, n, q);
201 bool allSelected =
true;
202 for (
size_t i = 0; i < m; i++) {
210 if (!custom_hess_.isFullDefined()) {
211 custom_hess_.setFullElements(hessianSparsitySet<std::vector<std::set<size_t> > >(fun_));
213 const std::vector<std::set<size_t> >& sF2 = custom_hess_.getFullElements();
214 CppAD::cg::multMatrixTransMatrixSparsity(sF2, r, v, n, n, q);
217 for (
size_t i = 0; i < m; i++) {
219 const auto itH = hess_.find(i);
221 if (itH == hess_.end()) {
224 custom_hess_.filter(hi);
226 spari = &itH->second;
228 CppAD::cg::addMatrixSparsity(*spari, sparsitySF2R);
231 CppAD::cg::multMatrixTransMatrixSparsity(sparsitySF2R, r, v, n, n, q);
237 for (
size_t i = 0; i < m; i++) {
239 for (
size_t j : jacSparsity[i]) {
245 size_t m = fun_.Range();
246 size_t n = fun_.Domain();
248 t = fun_.RevSparseJac(1, s);
253 for (
size_t i = 0; i < m; i++) {
258 fun_.ForSparseJac(q, r);
259 v = fun_.RevSparseHes(q, set_s,
true);
261 for (
size_t i = 0; i < n; i++) {
262 for (
size_t j : a[i]) {
263 CPPAD_ASSERT_UNKNOWN(j < q)
268 fun_.size_forward_set(0);
279 CppAD::cg::zeroOrderDependency(fun_, vx, vy);
294 fun_.capacity_order(0);
312 fun_.Forward(p, txcg);
317 fun_.capacity_order(0);
325 CPPAD_ASSERT_UNKNOWN(from.size() == to.size())
327 for (
size_t i = 0; i < from.size(); i++) {
334 CPPAD_ASSERT_UNKNOWN(from.size() == to.size())
336 for (
size_t i = 0; i < from.size(); i++) {
337 CPPADCG_ASSERT_KNOWN(from[i].isValueDefined(),
"No value defined")
338 to[i] = from[i].getValue();
bool atomicForward(size_t q, size_t p, const CppAD::vector< Base > &tx, CppAD::vector< Base > &ty) override
CGAtomicFunBridge(const std::string &name, CppAD::ADFun< CGB > &fun, bool standAlone=false, bool cacheSparsities=true)
bool rev_sparse_hes(const CppAD::vector< bool > &vx, const CppAD::vector< bool > &s, CppAD::vector< bool > &t, size_t q, const CppAD::vector< std::set< size_t > > &r, const CppAD::vector< std::set< size_t > > &u, CppAD::vector< std::set< size_t > > &v) override
bool atomicReverse(size_t p, const CppAD::vector< Base > &tx, const CppAD::vector< Base > &ty, CppAD::vector< Base > &px, const CppAD::vector< Base > &py) override