// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2010-2011 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// SPDX-License-Identifier: MPL-2.0

#include "lapack_common.h"
#include <Eigen/Cholesky>

// POTRF computes the Cholesky factorization of a real symmetric positive definite matrix A.
EIGEN_LAPACK_FUNC(potrf)(const char *uplo, int *n, RealScalar *pa, int *lda, int *info) {
  *info = 0;
  if (UPLO(*uplo) == INVALID)
    *info = -1;
  else if (*n < 0)
    *info = -2;
  else if (*lda < std::max(1, *n))
    *info = -4;
  if (*info != 0) {
    int e = -*info;
    return xerbla_(SCALAR_SUFFIX_UP "POTRF", &e, kBlasNameLength);
  }

  Scalar *a = reinterpret_cast<Scalar *>(pa);
  MatrixType A(a, *n, *n, *lda);
  int ret;
  if (UPLO(*uplo) == UP)
    ret = int(Eigen::internal::llt_inplace<Scalar, Eigen::Upper>::blocked(A));
  else
    ret = int(Eigen::internal::llt_inplace<Scalar, Eigen::Lower>::blocked(A));

  if (ret >= 0) *info = ret + 1;
}

// POTRS solves a system of linear equations A*X = B with a symmetric
// positive definite matrix A using the Cholesky factorization
// A = U**T*U or A = L*L**T computed by DPOTRF.
EIGEN_LAPACK_FUNC(potrs)
(const char *uplo, int *n, int *nrhs, RealScalar *pa, int *lda, RealScalar *pb, int *ldb, int *info) {
  *info = 0;
  if (UPLO(*uplo) == INVALID)
    *info = -1;
  else if (*n < 0)
    *info = -2;
  else if (*nrhs < 0)
    *info = -3;
  else if (*lda < std::max(1, *n))
    *info = -5;
  else if (*ldb < std::max(1, *n))
    *info = -7;
  if (*info != 0) {
    int e = -*info;
    return xerbla_(SCALAR_SUFFIX_UP "POTRS", &e, kBlasNameLength);
  }

  Scalar *a = reinterpret_cast<Scalar *>(pa);
  Scalar *b = reinterpret_cast<Scalar *>(pb);
  MatrixType A(a, *n, *n, *lda);
  MatrixType B(b, *n, *nrhs, *ldb);

  if (UPLO(*uplo) == UP) {
    A.triangularView<Eigen::Upper>().adjoint().solveInPlace(B);
    A.triangularView<Eigen::Upper>().solveInPlace(B);
  } else {
    A.triangularView<Eigen::Lower>().solveInPlace(B);
    A.triangularView<Eigen::Lower>().adjoint().solveInPlace(B);
  }
}
