| 1787 | |
| 1788 | template <class Float> |
| 1789 | void ComputeDiagonalBlockP(size_t npt, float lambda1, float lambda2, |
| 1790 | const Float* jp, const int* pmap, Float* di, |
| 1791 | Float* bi, int mt) { |
| 1792 | if (mt > 1) { |
| 1793 | MYTHREAD threads[THREAD_NUM_MAX]; |
| 1794 | const size_t thread_num = std::min(mt, THREAD_NUM_MAX); |
| 1795 | for (size_t i = 0; i < thread_num; ++i) { |
| 1796 | size_t first = npt * i / thread_num; |
| 1797 | size_t last_ = npt * (i + 1) / thread_num; |
| 1798 | size_t last = std::min(last_, npt); |
| 1799 | RUN_THREAD(ComputeDiagonalBlockP, threads[i], (last - first), lambda1, |
| 1800 | lambda2, jp, pmap + first, di + POINT_ALIGN * first, |
| 1801 | bi + 6 * first); |
| 1802 | } |
| 1803 | WAIT_THREAD(threads, thread_num); |
| 1804 | } else { |
| 1805 | for (size_t i = 0; i < npt; ++i, ++pmap, di += POINT_ALIGN, bi += 6) { |
| 1806 | int idx1 = pmap[0], idx2 = pmap[1]; |
| 1807 | |
| 1808 | Float M00 = 0, M01 = 0, M02 = 0, M11 = 0, M12 = 0, M22 = 0; |
| 1809 | const Float *jxp = jp + idx1 * (POINT_ALIGN2), *jyp = jxp + POINT_ALIGN; |
| 1810 | for (int j = idx1; j < idx2; |
| 1811 | ++j, jxp += POINT_ALIGN2, jyp += POINT_ALIGN2) { |
| 1812 | M00 += (jxp[0] * jxp[0] + jyp[0] * jyp[0]); |
| 1813 | M01 += (jxp[0] * jxp[1] + jyp[0] * jyp[1]); |
| 1814 | M02 += (jxp[0] * jxp[2] + jyp[0] * jyp[2]); |
| 1815 | M11 += (jxp[1] * jxp[1] + jyp[1] * jyp[1]); |
| 1816 | M12 += (jxp[1] * jxp[2] + jyp[1] * jyp[2]); |
| 1817 | M22 += (jxp[2] * jxp[2] + jyp[2] * jyp[2]); |
| 1818 | } |
| 1819 | |
| 1820 | ///////////////////////////////// |
| 1821 | di[0] = M00; |
| 1822 | di[1] = M11; |
| 1823 | di[2] = M22; |
| 1824 | |
| 1825 | ///////////////////////////// |
| 1826 | M00 = M00 * lambda2 + lambda1; |
| 1827 | M11 = M11 * lambda2 + lambda1; |
| 1828 | M22 = M22 * lambda2 + lambda1; |
| 1829 | |
| 1830 | /////////////////////////////// |
| 1831 | Float det = (M00 * M11 - M01 * M01) * M22 + Float(2.0) * M01 * M12 * M02 - |
| 1832 | M02 * M02 * M11 - M12 * M12 * M00; |
| 1833 | if (det >= FLT_MAX || det <= FLT_MIN * 2.0f) { |
| 1834 | // SetVectorZero(bi, bi + 6); |
| 1835 | for (int j = 0; j < 6; ++j) bi[j] = 0; |
| 1836 | } else { |
| 1837 | bi[0] = (M11 * M22 - M12 * M12) / det; |
| 1838 | bi[1] = -(M01 * M22 - M12 * M02) / det; |
| 1839 | bi[2] = (M01 * M12 - M02 * M11) / det; |
| 1840 | bi[3] = (M00 * M22 - M02 * M02) / det; |
| 1841 | bi[4] = -(M00 * M12 - M01 * M02) / det; |
| 1842 | bi[5] = (M00 * M11 - M01 * M01) / det; |
| 1843 | } |
| 1844 | } |
| 1845 | } |
| 1846 | } |
no outgoing calls
no test coverage detected