dlacon function

void dlacon(
  1. int N,
  2. Array<double> V_,
  3. Array<double> X_,
  4. Array<int> ISGN_,
  5. Box<double> EST,
  6. Box<int> KASE,
)

Implementation

void dlacon(
  final int N,
  final Array<double> V_,
  final Array<double> X_,
  final Array<int> ISGN_,
  final Box<double> EST,
  final Box<int> KASE,
) {
  final V = V_.having();
  final X = X_.having();
  final ISGN = ISGN_.having();
  const ITMAX = 5;
  const ZERO = 0.0, ONE = 1.0, TWO = 2.0;

  if (KASE.value == 0) {
    for (var I = 1; I <= N; I++) {
      X[I] = ONE / N;
    }
    KASE.value = 1;
    _JUMP = 1;
    return;
  }

  switch (_JUMP) {
    // FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
    case 1:
      if (N == 1) {
        V[1] = X[1];
        EST.value = V[1].abs();
        KASE.value = 0;
        return;
      }
      EST.value = dasum(N, X, 1);

      for (var I = 1; I <= N; I++) {
        X[I] = sign(ONE, X[I]);
        ISGN[I] = nint(X[I]);
      }
      KASE.value = 2;
      _JUMP = 2;
      return;

    // FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
    case 2:
      _J = idamax(N, X, 1);
      _ITER = 2;
      continue L50;
    L50:
    case 50:
      // MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
      for (var I = 1; I <= N; I++) {
        X[I] = ZERO;
      }
      X[_J] = ONE;
      KASE.value = 1;
      _JUMP = 3;
      return;
    // X HAS BEEN OVERWRITTEN BY A*X.
    case 3:
      dcopy(N, X, 1, V, 1);
      _ESTOLD = EST.value;
      EST.value = dasum(N, V, 1);
      var isConverged = true;
      for (var I = 1; I <= N; I++) {
        if (nint(sign(ONE, X[I])) != ISGN[I]) {
          isConverged = false;
          break;
        }
      }
      // REPEATED sign VECTOR DETECTED, HENCE ALGORITHM HAS CONVERGED.
      if (isConverged) continue L120;

      // TEST FOR CYCLING.
      if (EST.value <= _ESTOLD) continue L120;

      for (var I = 1; I <= N; I++) {
        X[I] = sign(ONE, X[I]);
        ISGN[I] = nint(X[I]);
      }
      KASE.value = 2;
      _JUMP = 4;
      return;

    // X HAS BEEN OVERWRITTEN BY TRANSPOSE(A)*X.
    case 4:
      final JLAST = _J;
      _J = idamax(N, X, 1);
      if ((X[JLAST] != X[_J].abs()) && (_ITER < ITMAX)) {
        _ITER++;
        continue L50;
      }

      continue L120;
    // ITERATION COMPLETE.  FINAL STAGE.
    L120:
    case 120:
      var ALTSGN = ONE;
      for (var I = 1; I <= N; I++) {
        X[I] = ALTSGN * (ONE + (I - 1) / (N - 1));
        ALTSGN = -ALTSGN;
      }
      KASE.value = 1;
      _JUMP = 5;
      return;
    // X HAS BEEN OVERWRITTEN BY A*X.
    case 5:
      double TEMP = TWO * (dasum(N, X, 1) / (3 * N));
      if (TEMP > EST.value) {
        dcopy(N, X, 1, V, 1);
        EST.value = TEMP;
      }
  }
  KASE.value = 0;
}