/// <summary> /// Ordering and symbolic analysis for a Cholesky factorization. /// </summary> /// <param name="A">Matrix to factorize.</param> /// <param name="p">Permutation.</param> private void SymbolicAnalysis(CompressedColumnStorage <Complex> A, int[] p) { int n = A.ColumnCount; var sym = this.S = new SymbolicFactorization(); // Find inverse permutation. sym.pinv = Permutation.Invert(p); // C = spones(triu(A(P,P))) var C = PermuteSym(A, sym.pinv, false); // Find etree of C. sym.parent = GraphHelper.EliminationTree(n, n, C.ColumnPointers, C.RowIndices, false); // Postorder the etree. var post = GraphHelper.TreePostorder(sym.parent, n); // Find column counts of chol(C) var c = GraphHelper.ColumnCounts(SymbolicColumnStorage.Create(C, false), sym.parent, post, false); sym.cp = new int[n + 1]; // Find column pointers for L sym.unz = sym.lnz = Helper.CumulativeSum(sym.cp, c, n); }
/// <summary> /// Symbolic ordering and analysis for QR. /// </summary> /// <param name="A">Matrix to factorize.</param> /// <param name="p">Permutation.</param> protected void SymbolicAnalysis(CompressedColumnStorage <T> A, int[] p, bool natural) { int m = A.RowCount; int n = A.ColumnCount; var sym = this.S = new SymbolicFactorization(); // Fill-reducing ordering sym.q = p; var C = natural ? SymbolicColumnStorage.Create(A) : Permute(A, null, sym.q); // etree of C'*C, where C=A(:,q) sym.parent = GraphHelper.EliminationTree(m, n, C.ColumnPointers, C.RowIndices, true); int[] post = GraphHelper.TreePostorder(sym.parent, n); sym.cp = GraphHelper.ColumnCounts(C, sym.parent, post, true); // col counts chol(C'*C) bool ok = C != null && sym.parent != null && sym.cp != null && CountV(C, sym); if (ok) { sym.unz = 0; for (int k = 0; k < n; k++) { sym.unz += sym.cp[k]; } } }
/// <summary> /// Symbolic ordering and analysis for QR. /// </summary> private void SymbolicAnalysis(ColumnOrdering order, CompressedColumnStorage <double> A) { int m = A.RowCount; int n = A.ColumnCount; var sym = this.symFactor = new SymbolicFactorization(); // Fill-reducing ordering sym.q = AMD.Generate(A, order); var C = order > 0 ? Permute(A, null, sym.q) : SymbolicColumnStorage.Create(A); // etree of C'*C, where C=A(:,q) sym.parent = GraphHelper.EliminationTree(m, n, C.ColumnPointers, C.RowIndices, true); int[] post = GraphHelper.TreePostorder(sym.parent, n); sym.cp = GraphHelper.ColumnCounts(C, sym.parent, post, true); // col counts chol(C'*C) bool ok = C != null && sym.parent != null && sym.cp != null && CountV(C); if (ok) { sym.unz = 0; for (int k = 0; k < n; k++) { sym.unz += sym.cp[k]; } } }