public void TestGenerate1() { // Load matrix from a file. var A = ResourceLoader.Get <double>("general-40x40.mat"); int n = A.ColumnCount; // Randomized Dulmage-Mendelsohn analysis. var dm = DulmageMendelsohn.Generate(A, 1); Assert.IsTrue(dm.StructuralRank == n); }
public DulmageMendelsohn Generate(EquationSystem problem) { var A = CSparseWrapper.ConvertSparsityJacobian(problem); var dm = DulmageMendelsohn.Generate(A, 1); A.PermuteRows(dm.p); A.PermuteColumns(dm.q); //foreach (var value in A.EnumerateIndexed()) //{ // sw.WriteLine("{0},{1}", value.Item1, value.Item2); //} StringBuilder sb = new StringBuilder(); sb.AppendLine("Coarse Structure"); sb.AppendLine("Underdetermined : "); sb.AppendLine("Determined : "); sb.AppendLine("Overdetermined : "); sb.AppendLine("Fine Structure"); for (int i = dm.Blocks - 1; i >= 0; i--) { sb.AppendLine(String.Format("Block {0}: V {1} - {2} E {3} - {4}", i, dm.s[i], dm.s[i + 1] - 1, dm.r[i], dm.r[i + 1] - 1)); var varcount = dm.s[i + 1] - dm.s[i]; for (int j = 0; j < varcount; j++) { var vari = dm.q[dm.s[i] + j]; sb.Append(problem.Variables[vari] + ", "); } var eqcount = dm.r[i + 1] - dm.r[i]; for (int j = 0; j < eqcount; j++) { var vari = dm.p[dm.r[i] + j]; // sb.Append(problem.Constraints[vari] + ", "); } sb.AppendLine(""); } // Console.WriteLine((sb.ToString())); return(dm); }