dlarft function

void dlarft(
  1. String DIRECT,
  2. String STOREV,
  3. int N,
  4. int K,
  5. Matrix<double> V_,
  6. int LDV,
  7. Array<double> TAU_,
  8. Matrix<double> T_,
  9. int LDT,
)

Implementation

void dlarft(
  final String DIRECT,
  final String STOREV,
  final int N,
  final int K,
  final Matrix<double> V_,
  final int LDV,
  final Array<double> TAU_,
  final Matrix<double> T_,
  final int LDT,
) {
  final V = V_.having(ld: LDV);
  final TAU = TAU_.having();
  final T = T_.having(ld: LDT);
  const ONE = 1.0, ZERO = 0.0;
  int I, J, PREVLASTV, LASTV;

  // Quick return if possible

  if (N == 0) return;

  if (lsame(DIRECT, 'F')) {
    PREVLASTV = N;
    for (I = 1; I <= K; I++) {
      PREVLASTV = max(I, PREVLASTV);
      if (TAU[I] == ZERO) {
        // H(i)  =  I

        for (J = 1; J <= I; J++) {
          T[J][I] = ZERO;
        }
      } else {
        // general case

        if (lsame(STOREV, 'C')) {
          // Skip any trailing zeros.
          for (LASTV = N; LASTV >= I + 1; LASTV--) {
            if (V[LASTV][I] != ZERO) break;
          }
          for (J = 1; J <= I - 1; J++) {
            T[J][I] = -TAU[I] * V[I][J];
          }
          J = min(LASTV, PREVLASTV);

          // T[1:i-1][i] := - tau[i] * V[i:j][1:i-1]**T * V[i:j][i]

          dgemv('Transpose', J - I, I - 1, -TAU[I], V(I + 1, 1), LDV,
              V(I + 1, I).asArray(), 1, ONE, T(1, I).asArray(), 1);
        } else {
          // Skip any trailing zeros.
          for (LASTV = N; LASTV >= I + 1; LASTV--) {
            if (V[I][LASTV] != ZERO) break;
          }
          for (J = 1; J <= I - 1; J++) {
            T[J][I] = -TAU[I] * V[J][I];
          }
          J = min(LASTV, PREVLASTV);

          // T[1:i-1][i] := - tau[i] * V[1:i-1][i:j] * V[i][i:j]**T

          dgemv('No transpose', I - 1, J - I, -TAU[I], V(1, I + 1), LDV,
              V(I, I + 1).asArray(), LDV, ONE, T(1, I).asArray(), 1);
        }

        // T[1:i-1][i] := T[1:i-1][1:i-1] * T[1:i-1][i]

        dtrmv('Upper', 'No transpose', 'Non-unit', I - 1, T, LDT,
            T(1, I).asArray(), 1);
        T[I][I] = TAU[I];
        if (I > 1) {
          PREVLASTV = max(PREVLASTV, LASTV);
        } else {
          PREVLASTV = LASTV;
        }
      }
    }
  } else {
    PREVLASTV = 1;
    for (I = K; I >= 1; I--) {
      if (TAU[I] == ZERO) {
        // H(i)  =  I

        for (J = I; J <= K; J++) {
          T[J][I] = ZERO;
        }
      } else {
        // general case

        if (I < K) {
          if (lsame(STOREV, 'C')) {
            // Skip any leading zeros.
            for (LASTV = 1; LASTV <= I - 1; LASTV++) {
              if (V[LASTV][I] != ZERO) break;
            }
            for (J = I + 1; J <= K; J++) {
              T[J][I] = -TAU[I] * V[N - K + I][J];
            }
            J = max(LASTV, PREVLASTV);

            // T[i+1:k][i] = -tau[i] * V[j:n-k+i][i+1:k]**T * V[j:n-k+i][i]

            dgemv('Transpose', N - K + I - J, K - I, -TAU[I], V(J, I + 1), LDV,
                V(J, I).asArray(), 1, ONE, T(I + 1, I).asArray(), 1);
          } else {
            // Skip any leading zeros.
            for (LASTV = 1; LASTV <= I - 1; LASTV++) {
              if (V[I][LASTV] != ZERO) break;
            }
            for (J = I + 1; J <= K; J++) {
              T[J][I] = -TAU[I] * V[J][N - K + I];
            }
            J = max(LASTV, PREVLASTV);

            // T[i+1:k][i] = -tau[i] * V[i+1:k][j:n-k+i] * V[i][j:n-k+i]**T

            dgemv('No transpose', K - I, N - K + I - J, -TAU[I], V(I + 1, J),
                LDV, V(I, J).asArray(), LDV, ONE, T(I + 1, I).asArray(), 1);
          }

          // T[i+1:k][i] := T[i+1:k][i+1:k] * T[i+1:k][i]

          dtrmv('Lower', 'No transpose', 'Non-unit', K - I, T(I + 1, I + 1),
              LDT, T(I + 1, I).asArray(), 1);
          if (I > 1) {
            PREVLASTV = min(PREVLASTV, LASTV);
          } else {
            PREVLASTV = LASTV;
          }
        }
        T[I][I] = TAU[I];
      }
    }
  }
}