| 87 | } |
| 88 | |
| 89 | Vector<bool> nonzero_pattern(CoefficientFunction *cf) { |
| 90 | Vector<AutoDiffDiff<1,NonZero>> nzvec_ad(cf->Dimension()); |
| 91 | Vector<NonZero> nzvec(cf->Dimension()); |
| 92 | nzvec = NonZero(false); |
| 93 | |
| 94 | ProxyUserData ud; |
| 95 | DummyFE<ET_TRIG> dummyfe; |
| 96 | ud.fel = &dummyfe; |
| 97 | ud.eval_deriv = 1; |
| 98 | |
| 99 | Array<ProxyFunction *> trial_proxies, test_proxies; |
| 100 | |
| 101 | cf->TraverseTree([&](CoefficientFunction &nodecf) { |
| 102 | auto proxy = dynamic_cast<ProxyFunction *>(&nodecf); |
| 103 | if (proxy) { |
| 104 | if (proxy->IsTestFunction()) { |
| 105 | if (!test_proxies.Contains(proxy)) { |
| 106 | test_proxies.Append(proxy); |
| 107 | } |
| 108 | } else if (!trial_proxies.Contains(proxy)) { |
| 109 | trial_proxies.Append(proxy); |
| 110 | } |
| 111 | } |
| 112 | }); |
| 113 | |
| 114 | cf->NonZeroPattern(ud, nzvec_ad); |
| 115 | for (size_t i: Range(nzvec_ad)) |
| 116 | nzvec[i] = nzvec[i] || nzvec_ad[i].Value(); |
| 117 | |
| 118 | if (test_proxies.Size() && !trial_proxies.Size()) { |
| 119 | for (auto test_proxy : test_proxies) |
| 120 | for (int k2 : Range(test_proxy->Dimension())) { |
| 121 | ud.testfunction = test_proxy; |
| 122 | ud.test_comp = k2; |
| 123 | cf->NonZeroPattern(ud, nzvec_ad); |
| 124 | for (size_t i: Range(nzvec_ad)) |
| 125 | nzvec[i] = nzvec[i] || nzvec_ad[i].Value(); |
| 126 | } |
| 127 | } else { |
| 128 | for (auto trial_proxy : trial_proxies) |
| 129 | for (auto l2 : Range(trial_proxy->Dimension())) { |
| 130 | ud.trialfunction = trial_proxy; |
| 131 | ud.trial_comp = l2; |
| 132 | cf->NonZeroPattern(ud, nzvec_ad); |
| 133 | for (size_t i: Range(nzvec_ad)) |
| 134 | nzvec[i] = nzvec[i] || nzvec_ad[i].Value(); |
| 135 | |
| 136 | for (auto test_proxy : test_proxies) |
| 137 | for (auto k2 : Range(test_proxy->Dimension())) { |
| 138 | ud.testfunction = test_proxy; |
| 139 | ud.test_comp = k2; |
| 140 | cf->NonZeroPattern(ud, nzvec_ad); |
| 141 | for (size_t i: Range(nzvec_ad)) |
| 142 | nzvec[i] = nzvec[i] || nzvec_ad[i].Value(); |
| 143 | } |
| 144 | } |
| 145 | } |
| 146 | return nzvec; |
no test coverage detected