// Copyright (C) 2026 EDF
// All Rights Reserved
// This code is published under the GNU Lesser General Public License (GNU LGPL)
#pragma once
#include <Eigen/Dense>


template<typename T>
Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>
choleskyLowerBasic(const Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> &A)
{
    const Eigen::Index n = A.rows();

    if (A.cols() != n)
        throw std::runtime_error("choleskyLowerBasic: matrix must be square");

    Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic> L =
        Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic>::Zero(n, n);

    for (Eigen::Index i = 0; i < n; ++i)
    {
        for (Eigen::Index j = 0; j <= i; ++j)
        {
            T sum = A(i, j);

            for (Eigen::Index k = 0; k < j; ++k)
            {
                sum -= L(i, k) * L(j, k);
            }

            if (i == j)
            {
                using std::sqrt;
                L(i, j) = sqrt(sum);
            }
            else
            {
                L(i, j) = sum / L(j, j);
            }
        }
    }
    return L;
}
