| 4772 | |
| 4773 | |
| 4774 | shared_ptr<CoefficientFunction> DiffJacobi (const CoefficientFunction * var, T_DJC & cache) const override |
| 4775 | { |
| 4776 | auto thisptr = const_pointer_cast<CoefficientFunction>(this->shared_from_this()); |
| 4777 | if (cache.find(thisptr) != cache.end()) |
| 4778 | return cache[thisptr]; |
| 4779 | |
| 4780 | if (this == var) |
| 4781 | return IdentityCF(Dimensions()); |
| 4782 | |
| 4783 | Array<int> dimres { this->Dimensions() }; |
| 4784 | dimres += var->Dimensions(); |
| 4785 | |
| 4786 | auto diffc1 = c1->DiffJacobi (var, cache); |
| 4787 | |
| 4788 | int vardim = var->Dimension(); |
| 4789 | Array<int> vardims = Array<int> (var->Dimensions()); |
| 4790 | Array<int> dist(vardims.Size()); |
| 4791 | int prod = 1; |
| 4792 | for (int i = dist.Size()-1; i >= 0; i--) |
| 4793 | { |
| 4794 | dist[i] = prod; |
| 4795 | prod *= vardims[i]; |
| 4796 | } |
| 4797 | Array<int> firstdist { this -> dist }; |
| 4798 | for (auto & fd : firstdist) |
| 4799 | fd *= vardim; |
| 4800 | |
| 4801 | Array<int> alldist { firstdist + dist }; |
| 4802 | |
| 4803 | auto res = MakeSubTensorCoefficientFunction(diffc1, first*vardim, std::move(dimres), std::move(alldist)); |
| 4804 | cache[thisptr] = res; |
| 4805 | return res; |
| 4806 | } |
| 4807 | |
| 4808 | |
| 4809 | virtual void NonZeroPattern (const class ProxyUserData & ud, |
nothing calls this directly
no test coverage detected