private void checkSplitPerformImplicit() { // check for splits for (int i = x2; i > x1; i--) { if (_implicit.isZero(i, i - 1)) { x1 = i; splits[numSplits++] = i - 1; // reduce the scope of what it is looking at return; } } // first try using known eigenvalues in the same order they were originally found if (onscript) { if (_implicit.steps > _implicit.exceptionalThreshold / 2) { onscript = false; } else { Complex_F32 a = origEigenvalues[indexVal]; // if no splits are found perform an _implicit step if (a.isReal()) { _implicit.performImplicitSingleStep(x1, x2, a.getReal()); } else if (x2 - x1 >= 1 && x1 + 2 < N) { _implicit.performImplicitDoubleStep(x1, x2, a.real, a.imaginary); } else { onscript = false; } } } else { // that didn't work so try a modified order if (x2 - x1 >= 1 && x1 + 2 < N) { _implicit.implicitDoubleStep(x1, x2); } else { _implicit.performImplicitSingleStep(x1, x2, _implicit.A.get(x2, x2)); } } }
private void performIteration() { bool changed = false; // see if it can perform a split for (int i = x2; i > x1; i--) { if (implicitQR.isZero(i, i - 1)) { x1 = i; splits[numSplits++] = i - 1; changed = true; // reduce the scope of what it is looking at break; } } if (!changed) { implicitQR.implicitDoubleStep(x1, x2); } }