private static void Tst() { int n = 8; int[] ia /*[9]*/ = new int[] { 1, 5, 8, 10, 12, 15, 17, 18, 19 }; int[] ja /*[18]*/ = new int[] { 1, 3, 6, 7, 2, 3, 5, 3, 8, 4, 7, 5, 6, 7, 6, 8, 7, 8 }; double[] a /*[18]*/ = new double[] { 7.0, 1.0, 2.0, 7.0, -4.0, 8.0, 2.0, 1.0, 5.0, 7.0, 9.0, 5.0, 1.0, 5.0, -1.0, 5.0, 11.0, 5.0 }; var csr = new CSparse.Double.CompressedColumnStorage(n, n, 18); csr.ColumnPointers = ia; csr.RowIndices = ja; csr.Values = a; }
public CSR GetAdjacencyGraph(CSR P_delta) { var p = P_delta.CloneMatrix(); for (var i = 0; i < p.NonZerosCount; i++) { p.Values[i] = 1; } var buf = (CSR)p.Multiply(p.Transpose()); return(buf); }
public static SparseEqSystem Generate(CSparse.Double.CompressedColumnStorage eqSystem) { var buf = new SparseEqSystem(); var lastCol = eqSystem.ColumnCount; var eqs = buf.Equations = new SparseRow[eqSystem.RowCount]; var colNnzs = buf.ColumnNonzeros = new int[eqSystem.ColumnCount]; buf.RowNonzeros = new int[eqSystem.RowCount]; for (var i = 0; i < eqs.Length; i++) { buf.Equations[i] = new SparseRow(1); } foreach (var tuple in eqSystem.EnumerateIndexed2()) { var rw = tuple.Item1; //tuple.Item1; var col = tuple.Item2; //tuple.Item2; var val = tuple.Item3; eqs[rw].Add(col, val); if (col != lastCol) { colNnzs[col]++; } } for (var i = 0; i < eqs.Length; i++) { buf.RowNonzeros[i] = buf.Equations[i].CalcNnz(lastCol); } buf.RowCount = eqSystem.RowCount; buf.ColumnCount = eqSystem.ColumnCount; return(buf); }
public CCS CalculateRref(CCS a) { var singleMemberColumns = 00; var aTran = a.Transpose(); var n = a.ColumnCount; for (var i = 0; i < n; i++) { if (a.GetNnzcForColumn(i) == 1) { singleMemberColumns++; } } if (singleMemberColumns == a.RowCount) { return(a.Clonee()); } var pat = new CoordinateStorage <double>(a.RowCount, a.ColumnCount - 1, 1, true); var bCrd = new CoordinateStorage <double>(a.RowCount, a.ColumnCount - 1, 1, true);//a matrix without last column a.EnumerateMembers((row, col, val) => { if (col != a.ColumnCount - 1) { pat.At(row, col, 1); bCrd.At(row, col, val); } }); //nonzero pattern of a, except last column var b = bCrd.ToCCs(); var bTran = b.Transpose(); var patt = pat.ToCCs(); var pattTr = patt.Transpose(); var varGraph = pattTr.Multiply(patt); varGraph.Values.SetAllMembers(1); var eqnGraph = patt.Multiply(pattTr); eqnGraph.Values.SetAllMembers(1); if (!varGraph.IsSymmetric() || !eqnGraph.IsSymmetric()) { throw new Exception(); } var eqnParts = CalcUtil.EnumerateGraphParts(eqnGraph); var varParts = CalcUtil.EnumerateGraphParts(varGraph); var varVisited = new bool[varGraph.ColumnCount]; foreach (var eqnPart in eqnParts) { //i'th independent system. var firstEq = eqnPart.First(); int firstVarOfFirstEq = -1; /* * patt.EnumerateRowMembers(firstEq, (row, col, val) => { * if (firstValOfFirstEq != -1) * firstValOfFirstEq = col; * ); */ pattTr.EnumerateColumnMembers(firstEq, (row, col, val) => { if (firstVarOfFirstEq == -1) { firstVarOfFirstEq = row; } }); //var firstVar = patt.EnumerateColumnMembers() var connectedVariables = CalcUtil.DepthFirstSearch(varGraph, varVisited, firstVarOfFirstEq); connectedVariables.Sort(); var vp = new Dictionary <int, int>();//variablePermute //vp[a] = b, a: number of variable in original system // b: index of variable in connectedVariables for (var i = 0; i < connectedVariables.Count; i++) { vp[connectedVariables[i]] = i; } var denseSubSytem = new Matrix(eqnPart.Count, connectedVariables.Count + 1);////i'th independent system as dense var dns = aTran.ToDenseMatrix(); for (var i = 0; i < eqnPart.Count; i++) { //insert i'th eqn into denseSubSytem var row = i; var st = aTran.ColumnPointers[i]; var en = aTran.ColumnPointers[i + 1]; for (int j = st; j < en; j++) { var col = aTran.RowIndices[j]; if (col == a.ColumnCount - 1) { continue; } var val = aTran.Values[j]; denseSubSytem[i, vp[col]] = val; } } } throw new NotImplementedException(); }
/// <summary> /// Divides the zones of reduced <see cref="matrix"/>. /// </summary> /// <param name="model">The model.</param> /// <param name="matrix">The reduced matrix.</param> /// <param name="dofMap">The DoF map.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public static ZoneDevidedMatrix DivideZones(Model model, CCS matrix, DofMappingManager dofMap) { //see Calcutil.GetReducedZoneDividedMatrix throw new NotImplementedException(); }
/// <summary> /// Extracts the free free part. /// </summary> /// <param name="matrix">The matrix.</param> /// <param name="nodeMapping">The node mapping.</param> /// <returns></returns> /// <exception cref="System.NotImplementedException"></exception> public static CCS ExtractFreeFreePart(CCS matrix, int[] nodeMapping) { throw new NotImplementedException(); }