private void LDLt(double[,] value)
{
n = value.GetLength(0);
L = new double[n,n];
D = new double[n];
robust = true;
double[,] a = value;
var v = new double[n];
positiveDefinite = true;
symmetric = true;
double d = D[0] = v[0] = a[0, 0];
for (int j = 1; j < n; j++)
L[j, 0] = a[j, 0]/d;
for (int j = 1; j < n; j++)
{
d = 0.0;
for (int k = 0; k < j; k++)
{
v[k] = L[j, k]*D[k];
d += L[j, k]*v[k];
}
d = D[j] = v[j] = a[j, j] - d;
positiveDefinite = positiveDefinite & (d > 0.0);
for (int k = j + 1; k < n; k++)
{
double s = 0.0;
for (int i = 0; i < j; i++)
s += L[k, i]*v[i];
L[k, j] = (a[k, j] - s)/d;
symmetric = symmetric & (a[k, j] == a[j, k]);
}
}
for (int i = 0; i < n; i++)
L[i, i] += 1.0;
}