// IWYU pragma: private
// SPDX-FileCopyrightText: The Eigen Authors
// SPDX-License-Identifier: MPL-2.0

#ifndef EIGEN_NONLINEAROPTIMIZATION_RWUPDT_H
#define EIGEN_NONLINEAROPTIMIZATION_RWUPDT_H

#include "./InternalHeaderCheck.h"

namespace Eigen {

namespace internal {

template <typename Scalar>
void rwupdt(Matrix<Scalar, Dynamic, Dynamic> &r, const Matrix<Scalar, Dynamic, 1> &w, Matrix<Scalar, Dynamic, 1> &b,
            Scalar alpha) {
  typedef DenseIndex Index;

  const Index n = r.cols();
  eigen_assert(r.rows() >= n);
  std::vector<JacobiRotation<Scalar> > givens(n);

  /* Local variables */
  Scalar temp, rowj;

  /* Function Body */
  for (Index j = 0; j < n; ++j) {
    rowj = w[j];

    /* apply the previous transformations to */
    /* r(i,j), i=0,1,...,j-1, and to w(j). */
    for (Index i = 0; i < j; ++i) {
      temp = givens[i].c() * r(i, j) + givens[i].s() * rowj;
      rowj = -givens[i].s() * r(i, j) + givens[i].c() * rowj;
      r(i, j) = temp;
    }

    /* determine a givens rotation which eliminates w(j). */
    givens[j].makeGivens(-r(j, j), rowj);

    if (rowj == 0.) continue;  // givens[j] is identity

    /* apply the current transformation to r(j,j), b(j), and alpha. */
    r(j, j) = givens[j].c() * r(j, j) + givens[j].s() * rowj;
    temp = givens[j].c() * b[j] + givens[j].s() * alpha;
    alpha = -givens[j].s() * b[j] + givens[j].c() * alpha;
    b[j] = temp;
  }
}

}  // end namespace internal

}  // end namespace Eigen

#endif  // EIGEN_NONLINEAROPTIMIZATION_RWUPDT_H
