4#ifndef ROOT_Math_CholeskyDecomp
5#define ROOT_Math_CholeskyDecomp
46namespace CholeskyDecompHelpers {
48template <
class F,
class M>
50template <
class F,
unsigned N,
class M>
52template <
class F,
class M>
54template <
class F,
unsigned N,
class M>
56template <
class F,
class V>
58template <
class F,
unsigned N,
class V>
94template <
class F,
unsigned N>
117 fOk = _decomposer<F, N, M>()(
fL,
m);
131 template <
typename G>
136 fOk = _decomposer<F, N, PackedArrayAdapter<G>>()(
fL, PackedArrayAdapter<G>(
m));
159 _solver<F, N, V>()(rhs,
fL);
174 _inverter<F, N, M>()(
m,
fL);
188 template <
typename G>
194 PackedArrayAdapter<G> adapted(
m);
195 _inverter<F, N, PackedArrayAdapter<G>>()(adapted,
fL);
211 for (
unsigned i = 0; i <
N; ++i) {
213 for (
unsigned j = i + 1; j <
N; ++j)
216 for (
unsigned j = 0; j <= i; ++j)
217 m(i, j) =
fL[i * (i + 1) / 2 + j];
220 m(i, i) =
F(1) /
m(i, i);
233 template <
typename G>
239 for (
unsigned i = 0; i < (
N * (
N + 1)) / 2; ++i)
243 for (
unsigned i = 0; i <
N; ++i)
244 m[(i * (i + 1)) / 2 + i] =
F(1) /
fL[(i * (i + 1)) / 2 + i];
259 for (
unsigned i = 0; i <
N; ++i) {
261 for (
unsigned j = i + 1; j <
N; ++j)
264 for (
unsigned j = 0; j <= i; ++j)
265 m(j, i) =
fL[i * (i + 1) / 2 + j];
268 for (
unsigned i = 1; i <
N; ++i) {
269 for (
unsigned j = 0; j < i; ++j) {
270 typename M::value_type tmp =
F(0);
271 for (
unsigned k = i; k-- > j;)
272 tmp -=
m(k, i) *
m(j, k);
273 m(j, i) = tmp *
m(i, i);
287 template <
typename G>
293 for (
unsigned i = 0; i < (
N * (
N + 1)) / 2; ++i)
297 for (
unsigned i = 1; i <
N; base1 += ++i) {
298 for (
unsigned j = 0; j < i; ++j) {
300 const G *base2 = &
m[(i * (i - 1)) / 2];
301 for (
unsigned k = i; k-- > j; base2 -= k)
302 tmp -= base1[k] * base2[j];
303 base1[j] = tmp * base1[i];
372 if (
fL.size() <
fN * (
fN + 1) / 2)
373 fL.resize(
fN * (
fN + 1) / 2);
374 fOk = _decomposerGenDim<F, M>()(
fL.data(),
m,
fN);
393 template <
typename G>
398 if (
fL.size() <
fN * (
fN + 1) / 2)
399 fL.resize(
fN * (
fN + 1) / 2);
400 fOk = _decomposerGenDim<F, PackedArrayAdapter<G>>()(
fL.data(), PackedArrayAdapter<G>(
m),
fN);
440 return std::move(
fL);
463 _solverGenDim<F, V>()(rhs,
fL.data(),
fN);
479 _inverterGenDim<F, M>()(
m,
fN, wksp.data());
494 template <
typename G>
501 PackedArrayAdapter<G> adapted(
m);
502 _inverterGenDim<F, PackedArrayAdapter<G>>()(adapted,
fN, wksp.data());
518 const F *L =
fL.data();
519 for (
unsigned i = 0; i <
fN; ++i) {
521 for (
unsigned j = i + 1; j <
fN; ++j)
524 for (
unsigned j = 0; j <= i; ++j)
525 m(i, j) = L[i * (i + 1) / 2 + j];
528 m(i, i) =
F(1) /
m(i, i);
541 template <
typename G>
546 const F *L =
fL.data();
548 for (
unsigned i = 0; i < (
fN * (
fN + 1)) / 2; ++i)
552 for (
unsigned i = 0; i <
fN; ++i)
553 m[(i * (i + 1)) / 2 + i] =
F(1) / L[(i * (i + 1)) / 2 + i];
568 const F *L =
fL.data();
569 for (
unsigned i = 0; i <
fN; ++i) {
571 for (
unsigned j = i + 1; j <
fN; ++j)
574 for (
unsigned j = 0; j <= i; ++j)
575 m(j, i) = L[i * (i + 1) / 2 + j];
578 for (
unsigned i = 1; i <
fN; ++i) {
579 for (
unsigned j = 0; j < i; ++j) {
580 typename M::value_type tmp =
F(0);
581 for (
unsigned k = i; k-- > j;)
582 tmp -=
m(k, i) *
m(j, k);
583 m(j, i) = tmp *
m(i, i);
597 template <
typename G>
602 const F *L =
fL.data();
604 for (
unsigned i = 0; i < (
fN * (
fN + 1)) / 2; ++i)
608 for (
unsigned i = 1; i <
fN; base1 += ++i) {
609 for (
unsigned j = 0; j < i; ++j) {
611 const G *base2 = &
m[(i * (i - 1)) / 2];
612 for (
unsigned k = i; k-- > j; base2 -= k)
613 tmp -= base1[k] * base2[j];
614 base1[j] = tmp * base1[i];
621namespace CholeskyDecompHelpers {
631 const G operator()(
unsigned i,
unsigned j)
const {
return fArr[((i * (i + 1)) / 2) + j]; }
636template <
class F,
class M>
655 for (
unsigned i = 0; i <
N; base1 += ++i) {
659 for (
unsigned j = 0; j < i; base2 += ++j) {
661 for (
unsigned k = j; k--;)
662 tmp -= base1[k] * base2[k];
663 base1[j] = tmp *= base2[j];
665 tmpdiag += tmp * tmp;
668 tmpdiag =
src(i, i) - tmpdiag;
670 if (tmpdiag <=
F(0.0))
673 base1[i] = std::sqrt(
F(1.0) / tmpdiag);
680template <
class F,
unsigned N,
class M>
688template <
class F,
class M>
695 for (
unsigned i = 1; i <
N; base1 += ++i) {
696 for (
unsigned j = 0; j < i; ++j) {
698 const F *base2 = &wksp[(i * (i - 1)) / 2];
699 for (
unsigned k = i; k-- > j; base2 -= k)
700 tmp -= base1[k] * base2[j];
701 base1[j] = tmp * base1[i];
706 for (
unsigned i =
N; i--;) {
707 for (
unsigned j = i + 1; j--;) {
709 base1 = &wksp[(
N * (
N - 1)) / 2];
710 for (
unsigned k =
N; k-- > i; base1 -= k)
711 tmp += base1[i] * base1[j];
719template <
class F,
unsigned N,
class M>
725 F wksp[
N * (
N + 1) / 2];
726 std::copy(
src,
src + ((
N * (
N + 1)) / 2), wksp);
732template <
class F,
class V>
738 for (
unsigned k = 0; k <
N; ++k) {
739 const unsigned base = (k * (k + 1)) / 2;
741 for (
unsigned i = k; i--;)
742 sum += rhs[i] *
l[base + i];
744 rhs[k] = (rhs[k] -
sum) *
l[base + k];
747 for (
unsigned k =
N; k--;) {
749 for (
unsigned i =
N; --i > k;)
750 sum += rhs[i] *
l[(i * (i + 1)) / 2 + k];
752 rhs[k] = (rhs[k] -
sum) *
l[(k * (k + 1)) / 2 + k];
758template <
class F,
unsigned N,
class V>
765template <
class F,
class M>
770 if (
src(0, 0) <=
F(0.0))
772 dst[0] = std::sqrt(
F(1.0) /
src(0, 0));
773 dst[1] =
src(1, 0) * dst[0];
774 dst[2] =
src(1, 1) - dst[1] * dst[1];
775 if (dst[2] <=
F(0.0))
778 dst[2] = std::sqrt(
F(1.0) / dst[2]);
779 dst[3] =
src(2, 0) * dst[0];
780 dst[4] = (
src(2, 1) - dst[1] * dst[3]) * dst[2];
781 dst[5] =
src(2, 2) - (dst[3] * dst[3] + dst[4] * dst[4]);
782 if (dst[5] <=
F(0.0))
785 dst[5] = std::sqrt(
F(1.0) / dst[5]);
786 dst[6] =
src(3, 0) * dst[0];
787 dst[7] = (
src(3, 1) - dst[1] * dst[6]) * dst[2];
788 dst[8] = (
src(3, 2) - dst[3] * dst[6] - dst[4] * dst[7]) * dst[5];
789 dst[9] =
src(3, 3) - (dst[6] * dst[6] + dst[7] * dst[7] + dst[8] * dst[8]);
790 if (dst[9] <=
F(0.0))
793 dst[9] = std::sqrt(
F(1.0) / dst[9]);
794 dst[10] =
src(4, 0) * dst[0];
795 dst[11] = (
src(4, 1) - dst[1] * dst[10]) * dst[2];
796 dst[12] = (
src(4, 2) - dst[3] * dst[10] - dst[4] * dst[11]) * dst[5];
797 dst[13] = (
src(4, 3) - dst[6] * dst[10] - dst[7] * dst[11] - dst[8] * dst[12]) * dst[9];
798 dst[14] =
src(4, 4) - (dst[10] * dst[10] + dst[11] * dst[11] + dst[12] * dst[12] + dst[13] * dst[13]);
799 if (dst[14] <=
F(0.0))
802 dst[14] = std::sqrt(
F(1.0) / dst[14]);
803 dst[15] =
src(5, 0) * dst[0];
804 dst[16] = (
src(5, 1) - dst[1] * dst[15]) * dst[2];
805 dst[17] = (
src(5, 2) - dst[3] * dst[15] - dst[4] * dst[16]) * dst[5];
806 dst[18] = (
src(5, 3) - dst[6] * dst[15] - dst[7] * dst[16] - dst[8] * dst[17]) * dst[9];
807 dst[19] = (
src(5, 4) - dst[10] * dst[15] - dst[11] * dst[16] - dst[12] * dst[17] - dst[13] * dst[18]) * dst[14];
808 dst[20] =
src(5, 5) -
809 (dst[15] * dst[15] + dst[16] * dst[16] + dst[17] * dst[17] + dst[18] * dst[18] + dst[19] * dst[19]);
810 if (dst[20] <=
F(0.0))
813 dst[20] = std::sqrt(
F(1.0) / dst[20]);
818template <
class F,
class M>
823 if (
src(0, 0) <=
F(0.0))
825 dst[0] = std::sqrt(
F(1.0) /
src(0, 0));
826 dst[1] =
src(1, 0) * dst[0];
827 dst[2] =
src(1, 1) - dst[1] * dst[1];
828 if (dst[2] <=
F(0.0))
831 dst[2] = std::sqrt(
F(1.0) / dst[2]);
832 dst[3] =
src(2, 0) * dst[0];
833 dst[4] = (
src(2, 1) - dst[1] * dst[3]) * dst[2];
834 dst[5] =
src(2, 2) - (dst[3] * dst[3] + dst[4] * dst[4]);
835 if (dst[5] <=
F(0.0))
838 dst[5] = std::sqrt(
F(1.0) / dst[5]);
839 dst[6] =
src(3, 0) * dst[0];
840 dst[7] = (
src(3, 1) - dst[1] * dst[6]) * dst[2];
841 dst[8] = (
src(3, 2) - dst[3] * dst[6] - dst[4] * dst[7]) * dst[5];
842 dst[9] =
src(3, 3) - (dst[6] * dst[6] + dst[7] * dst[7] + dst[8] * dst[8]);
843 if (dst[9] <=
F(0.0))
846 dst[9] = std::sqrt(
F(1.0) / dst[9]);
847 dst[10] =
src(4, 0) * dst[0];
848 dst[11] = (
src(4, 1) - dst[1] * dst[10]) * dst[2];
849 dst[12] = (
src(4, 2) - dst[3] * dst[10] - dst[4] * dst[11]) * dst[5];
850 dst[13] = (
src(4, 3) - dst[6] * dst[10] - dst[7] * dst[11] - dst[8] * dst[12]) * dst[9];
851 dst[14] =
src(4, 4) - (dst[10] * dst[10] + dst[11] * dst[11] + dst[12] * dst[12] + dst[13] * dst[13]);
852 if (dst[14] <=
F(0.0))
855 dst[14] = std::sqrt(
F(1.0) / dst[14]);
860template <
class F,
class M>
865 if (
src(0, 0) <=
F(0.0))
867 dst[0] = std::sqrt(
F(1.0) /
src(0, 0));
868 dst[1] =
src(1, 0) * dst[0];
869 dst[2] =
src(1, 1) - dst[1] * dst[1];
870 if (dst[2] <=
F(0.0))
873 dst[2] = std::sqrt(
F(1.0) / dst[2]);
874 dst[3] =
src(2, 0) * dst[0];
875 dst[4] = (
src(2, 1) - dst[1] * dst[3]) * dst[2];
876 dst[5] =
src(2, 2) - (dst[3] * dst[3] + dst[4] * dst[4]);
877 if (dst[5] <=
F(0.0))
880 dst[5] = std::sqrt(
F(1.0) / dst[5]);
881 dst[6] =
src(3, 0) * dst[0];
882 dst[7] = (
src(3, 1) - dst[1] * dst[6]) * dst[2];
883 dst[8] = (
src(3, 2) - dst[3] * dst[6] - dst[4] * dst[7]) * dst[5];
884 dst[9] =
src(3, 3) - (dst[6] * dst[6] + dst[7] * dst[7] + dst[8] * dst[8]);
885 if (dst[9] <=
F(0.0))
888 dst[9] = std::sqrt(
F(1.0) / dst[9]);
893template <
class F,
class M>
898 if (
src(0, 0) <=
F(0.0))
900 dst[0] = std::sqrt(
F(1.0) /
src(0, 0));
901 dst[1] =
src(1, 0) * dst[0];
902 dst[2] =
src(1, 1) - dst[1] * dst[1];
903 if (dst[2] <=
F(0.0))
906 dst[2] = std::sqrt(
F(1.0) / dst[2]);
907 dst[3] =
src(2, 0) * dst[0];
908 dst[4] = (
src(2, 1) - dst[1] * dst[3]) * dst[2];
909 dst[5] =
src(2, 2) - (dst[3] * dst[3] + dst[4] * dst[4]);
910 if (dst[5] <=
F(0.0))
913 dst[5] = std::sqrt(
F(1.0) / dst[5]);
918template <
class F,
class M>
923 if (
src(0, 0) <=
F(0.0))
925 dst[0] = std::sqrt(
F(1.0) /
src(0, 0));
926 dst[1] =
src(1, 0) * dst[0];
927 dst[2] =
src(1, 1) - dst[1] * dst[1];
928 if (dst[2] <=
F(0.0))
931 dst[2] = std::sqrt(
F(1.0) / dst[2]);
936template <
class F,
class M>
941 if (
src(0, 0) <=
F(0.0))
943 dst[0] = std::sqrt(
F(1.0) /
src(0, 0));
948template <
class F,
class M>
956template <
class F,
class M>
1001 dst(0, 0) = li61 * li61 + li51 * li51 + li41 * li41 + li31 * li31 + li21 * li21 +
src[0] *
src[0];
1002 dst(1, 0) = li61 * li62 + li51 * li52 + li41 * li42 + li31 * li32 + li21 *
src[2];
1003 dst(1, 1) = li62 * li62 + li52 * li52 + li42 * li42 + li32 * li32 +
src[2] *
src[2];
1004 dst(2, 0) = li61 * li63 + li51 * li53 + li41 * li43 + li31 *
src[5];
1005 dst(2, 1) = li62 * li63 + li52 * li53 + li42 * li43 + li32 *
src[5];
1006 dst(2, 2) = li63 * li63 + li53 * li53 + li43 * li43 +
src[5] *
src[5];
1007 dst(3, 0) = li61 * li64 + li51 * li54 + li41 *
src[9];
1008 dst(3, 1) = li62 * li64 + li52 * li54 + li42 *
src[9];
1009 dst(3, 2) = li63 * li64 + li53 * li54 + li43 *
src[9];
1010 dst(3, 3) = li64 * li64 + li54 * li54 +
src[9] *
src[9];
1011 dst(4, 0) = li61 * li65 + li51 *
src[14];
1012 dst(4, 1) = li62 * li65 + li52 *
src[14];
1013 dst(4, 2) = li63 * li65 + li53 *
src[14];
1014 dst(4, 3) = li64 * li65 + li54 *
src[14];
1015 dst(4, 4) = li65 * li65 +
src[14] *
src[14];
1016 dst(5, 0) = li61 *
src[20];
1017 dst(5, 1) = li62 *
src[20];
1018 dst(5, 2) = li63 *
src[20];
1019 dst(5, 3) = li64 *
src[20];
1020 dst(5, 4) = li65 *
src[20];
1021 dst(5, 5) =
src[20] *
src[20];
1025template <
class F,
class M>
1049 dst(0, 0) = li51 * li51 + li41 * li41 + li31 * li31 + li21 * li21 +
src[0] *
src[0];
1050 dst(1, 0) = li51 * li52 + li41 * li42 + li31 * li32 + li21 *
src[2];
1051 dst(1, 1) = li52 * li52 + li42 * li42 + li32 * li32 +
src[2] *
src[2];
1052 dst(2, 0) = li51 * li53 + li41 * li43 + li31 *
src[5];
1053 dst(2, 1) = li52 * li53 + li42 * li43 + li32 *
src[5];
1054 dst(2, 2) = li53 * li53 + li43 * li43 +
src[5] *
src[5];
1055 dst(3, 0) = li51 * li54 + li41 *
src[9];
1056 dst(3, 1) = li52 * li54 + li42 *
src[9];
1057 dst(3, 2) = li53 * li54 + li43 *
src[9];
1058 dst(3, 3) = li54 * li54 +
src[9] *
src[9];
1059 dst(4, 0) = li51 *
src[14];
1060 dst(4, 1) = li52 *
src[14];
1061 dst(4, 2) = li53 *
src[14];
1062 dst(4, 3) = li54 *
src[14];
1063 dst(4, 4) =
src[14] *
src[14];
1067template <
class F,
class M>
1081 dst(0, 0) = li41 * li41 + li31 * li31 + li21 * li21 +
src[0] *
src[0];
1082 dst(1, 0) = li41 * li42 + li31 * li32 + li21 *
src[2];
1083 dst(1, 1) = li42 * li42 + li32 * li32 +
src[2] *
src[2];
1084 dst(2, 0) = li41 * li43 + li31 *
src[5];
1085 dst(2, 1) = li42 * li43 + li32 *
src[5];
1086 dst(2, 2) = li43 * li43 +
src[5] *
src[5];
1087 dst(3, 0) = li41 *
src[9];
1088 dst(3, 1) = li42 *
src[9];
1089 dst(3, 2) = li43 *
src[9];
1090 dst(3, 3) =
src[9] *
src[9];
1094template <
class F,
class M>
1103 dst(0, 0) = li31 * li31 + li21 * li21 +
src[0] *
src[0];
1104 dst(1, 0) = li31 * li32 + li21 *
src[2];
1105 dst(1, 1) = li32 * li32 +
src[2] *
src[2];
1106 dst(2, 0) = li31 *
src[5];
1107 dst(2, 1) = li32 *
src[5];
1108 dst(2, 2) =
src[5] *
src[5];
1112template <
class F,
class M>
1119 dst(0, 0) = li21 * li21 +
src[0] *
src[0];
1120 dst(1, 0) = li21 *
src[2];
1121 dst(1, 1) =
src[2] *
src[2];
1125template <
class F,
class M>
1131template <
class F,
class M>
1139template <
class F,
class V>
1145 const F y0 = rhs[0] *
l[0];
1146 const F y1 = (rhs[1] -
l[1] * y0) *
l[2];
1147 const F y2 = (rhs[2] - (
l[3] * y0 +
l[4] *
y1)) *
l[5];
1148 const F y3 = (rhs[3] - (
l[6] * y0 +
l[7] *
y1 +
l[8] *
y2)) *
l[9];
1149 const F y4 = (rhs[4] - (
l[10] * y0 +
l[11] *
y1 +
l[12] *
y2 +
l[13] * y3)) *
l[14];
1150 const F y5 = (rhs[5] - (
l[15] * y0 +
l[16] *
y1 +
l[17] *
y2 +
l[18] * y3 +
l[19] * y4)) *
l[20];
1152 rhs[5] = y5 *
l[20];
1153 rhs[4] = (y4 -
l[19] * rhs[5]) *
l[14];
1154 rhs[3] = (y3 - (
l[18] * rhs[5] +
l[13] * rhs[4])) *
l[9];
1155 rhs[2] = (
y2 - (
l[17] * rhs[5] +
l[12] * rhs[4] +
l[8] * rhs[3])) *
l[5];
1156 rhs[1] = (
y1 - (
l[16] * rhs[5] +
l[11] * rhs[4] +
l[7] * rhs[3] +
l[4] * rhs[2])) *
l[2];
1157 rhs[0] = (y0 - (
l[15] * rhs[5] +
l[10] * rhs[4] +
l[6] * rhs[3] +
l[3] * rhs[2] +
l[1] * rhs[1])) *
l[0];
1161template <
class F,
class V>
1167 const F y0 = rhs[0] *
l[0];
1168 const F y1 = (rhs[1] -
l[1] * y0) *
l[2];
1169 const F y2 = (rhs[2] - (
l[3] * y0 +
l[4] *
y1)) *
l[5];
1170 const F y3 = (rhs[3] - (
l[6] * y0 +
l[7] *
y1 +
l[8] *
y2)) *
l[9];
1171 const F y4 = (rhs[4] - (
l[10] * y0 +
l[11] *
y1 +
l[12] *
y2 +
l[13] * y3)) *
l[14];
1173 rhs[4] = (y4)*
l[14];
1174 rhs[3] = (y3 - (
l[13] * rhs[4])) *
l[9];
1175 rhs[2] = (
y2 - (
l[12] * rhs[4] +
l[8] * rhs[3])) *
l[5];
1176 rhs[1] = (
y1 - (
l[11] * rhs[4] +
l[7] * rhs[3] +
l[4] * rhs[2])) *
l[2];
1177 rhs[0] = (y0 - (
l[10] * rhs[4] +
l[6] * rhs[3] +
l[3] * rhs[2] +
l[1] * rhs[1])) *
l[0];
1181template <
class F,
class V>
1187 const F y0 = rhs[0] *
l[0];
1188 const F y1 = (rhs[1] -
l[1] * y0) *
l[2];
1189 const F y2 = (rhs[2] - (
l[3] * y0 +
l[4] *
y1)) *
l[5];
1190 const F y3 = (rhs[3] - (
l[6] * y0 +
l[7] *
y1 +
l[8] *
y2)) *
l[9];
1193 rhs[2] = (
y2 - (
l[8] * rhs[3])) *
l[5];
1194 rhs[1] = (
y1 - (
l[7] * rhs[3] +
l[4] * rhs[2])) *
l[2];
1195 rhs[0] = (y0 - (
l[6] * rhs[3] +
l[3] * rhs[2] +
l[1] * rhs[1])) *
l[0];
1199template <
class F,
class V>
1205 const F y0 = rhs[0] *
l[0];
1206 const F y1 = (rhs[1] -
l[1] * y0) *
l[2];
1207 const F y2 = (rhs[2] - (
l[3] * y0 +
l[4] *
y1)) *
l[5];
1210 rhs[1] = (
y1 - (
l[4] * rhs[2])) *
l[2];
1211 rhs[0] = (y0 - (
l[3] * rhs[2] +
l[1] * rhs[1])) *
l[0];
1215template <
class F,
class V>
1221 const F y0 = rhs[0] *
l[0];
1222 const F y1 = (rhs[1] -
l[1] * y0) *
l[2];
1225 rhs[0] = (y0 - (
l[1] * rhs[1])) *
l[0];
1229template <
class F,
class V>
1235 rhs[0] *=
l[0] *
l[0];
1239template <
class F,
class V>
Option_t Option_t TPoint TPoint const char y2
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t src
Option_t Option_t TPoint TPoint const char y1
class to compute the Cholesky decomposition of a matrix
bool fOk
flag indicating a successful decomposition
CholeskyDecompGenDim(unsigned N, G *m, std::vector< F > wksp={})
perform a Cholesky decomposition
bool getL(G *m) const
obtain the decomposed matrix L
bool getL(M &m) const
obtain the decomposed matrix L
std::vector< F > fL
lower triangular matrix L
bool Invert(G *m) const
place the inverse into m
std::vector< F > releaseWorkspace()
release the workspace of the decomposition for reuse
bool Invert(M &m) const
place the inverse into m
bool Solve(V &rhs) const
solves a linear system for the given right hand side
bool getLi(M &m) const
obtain the inverse of the decomposed matrix L
CholeskyDecompGenDim(unsigned N, const M &m, std::vector< F > wksp={})
perform a Cholesky decomposition
unsigned fN
dimensionality dimensionality of the problem
bool getLi(G *m) const
obtain the inverse of the decomposed matrix L
bool ok() const
returns true if decomposition was successful
adapter for packed arrays (to SMatrix indexing conventions)
G * fArr
pointer to first array element
G & operator()(unsigned i, unsigned j)
write access to elements (make sure that j <= i)
const G operator()(unsigned i, unsigned j) const
read access to elements (make sure that j <= i)
PackedArrayAdapter(G *arr)
constructor
class to compute the Cholesky decomposition of a matrix
bool fOk
flag indicating a successful decomposition
bool ok() const
returns true if decomposition was successful
bool getL(G *m) const
obtain the decomposed matrix L
bool Invert(G *m) const
place the inverse into m
CholeskyDecomp(const M &m)
perform a Cholesky decomposition
bool getLi(G *m) const
obtain the inverse of the decomposed matrix L
bool getL(M &m) const
obtain the decomposed matrix L
bool Solve(V &rhs) const
solves a linear system for the given right hand side
F fL[N *(N+1)/2]
lower triangular matrix L
CholeskyDecomp(G *m)
perform a Cholesky decomposition
bool getLi(M &m) const
obtain the inverse of the decomposed matrix L
bool Invert(M &m) const
place the inverse into m
Namespace for new Math classes and functions.
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
struct to do a Cholesky decomposition (general dimensionality)
bool operator()(F *dst, const M &src, unsigned N) const
method to do the decomposition
bool operator()(F *dst, const M &src) const
bool operator()(F *dst, const M &src) const
method to do the decomposition
bool operator()(F *dst, const M &src) const
method to do the decomposition
bool operator()(F *dst, const M &src) const
method to do the decomposition
bool operator()(F *dst, const M &src) const
method to do the decomposition
bool operator()(F *dst, const M &src) const
method to do the decomposition
bool operator()(F *dst, const M &src) const
method to do the decomposition
struct to do a Cholesky decomposition
bool operator()(F *dst, const M &src) const
method to do the decomposition
struct to obtain the inverse from a Cholesky decomposition (general dimensionality)
void operator()(M &dst, unsigned N, F *wksp) const
method to do the inversion
void operator()(M &dst, const F *src) const
void operator()(M &dst, const F *src) const
method to do the inversion
void operator()(M &dst, const F *src) const
method to do the inversion
void operator()(M &dst, const F *src) const
method to do the inversion
void operator()(M &dst, const F *src) const
method to do the inversion
void operator()(M &dst, const F *src) const
method to do the inversion
void operator()(M &dst, const F *src) const
method to do the inversion
struct to obtain the inverse from a Cholesky decomposition
void operator()(M &dst, const F *src) const
method to do the inversion
struct to solve a linear system using its Cholesky decomposition (generalised dimensionality)
void operator()(V &rhs, const F *l, unsigned N) const
method to solve the linear system
void operator()(V &rhs, const F *l) const
void operator()(V &rhs, const F *l) const
method to solve the linear system
void operator()(V &rhs, const F *l) const
method to solve the linear system
void operator()(V &rhs, const F *l) const
method to solve the linear system
void operator()(V &rhs, const F *l) const
method to solve the linear system
void operator()(V &rhs, const F *l) const
method to solve the linear system
void operator()(V &rhs, const F *l) const
method to solve the linear system
struct to solve a linear system using its Cholesky decomposition
void operator()(V &rhs, const F *l) const
method to solve the linear system
static uint64_t sum(uint64_t i)