// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2012 Désiré Nuentsa-Wakam <desire.nuentsa_wakam@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

#ifndef EIGEN_SPARSELU_UTILS_H
#define EIGEN_SPARSELU_UTILS_H

// IWYU pragma: private
#include "./InternalHeaderCheck.h"

namespace Eigen {
namespace internal {

/**
 * \brief Count Nonzero elements in the factors
 */
template <typename Scalar, typename StorageIndex>
void SparseLUImpl<Scalar, StorageIndex>::countnz(const Index n, Index& nnzL, Index& nnzU, GlobalLU_t& glu) {
  nnzL = 0;
  nnzU = glu.xusub(n);
  Index nsuper = glu.supno(n);
  Index jlen;
  Index i, j, fsupc;
  if (n <= 0) return;
  // For each supernode
  for (i = 0; i <= nsuper; i++) {
    fsupc = glu.xsup(i);
    jlen = glu.xlsub(fsupc + 1) - glu.xlsub(fsupc);

    for (j = fsupc; j < glu.xsup(i + 1); j++) {
      nnzL += jlen;
      nnzU += j - fsupc + 1;
      jlen--;
    }
  }
}

/**
 * \brief Fix up the data storage lsub for L-subscripts.
 *
 * It removes the subscripts sets for structural pruning,
 * and applies permutation to the remaining subscripts
 *
 */
template <typename Scalar, typename StorageIndex>
void SparseLUImpl<Scalar, StorageIndex>::fixupL(const Index n, const IndexVector& perm_r, GlobalLU_t& glu) {
  Index fsupc, i, j, k, jstart;

  StorageIndex nextl = 0;
  Index nsuper = glu.supno(n);

  // For each supernode
  for (i = 0; i <= nsuper; i++) {
    fsupc = glu.xsup(i);
    jstart = glu.xlsub(fsupc);
    glu.xlsub(fsupc) = nextl;
    for (j = jstart; j < glu.xlsub(fsupc + 1); j++) {
      glu.lsub(nextl) = perm_r(glu.lsub(j));  // Now indexed into P*A
      nextl++;
    }
    for (k = fsupc + 1; k < glu.xsup(i + 1); k++) glu.xlsub(k) = nextl;  // other columns in supernode i
  }

  glu.xlsub(n) = nextl;
}

}  // end namespace internal

}  // end namespace Eigen
#endif  // EIGEN_SPARSELU_UTILS_H
