Exemple #1
0
        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);
        }