public void SolveSparseGivesExpectedResult(
            double[,] dense,
            int[] expectedColumnAssignment,
            int[] expectedRowAssignment)
        {
            var solver   = new ShortestPathSolver();
            var cost     = new SparseMatrixDouble(dense);
            var solution = solver.Solve(cost);

            Assert.Equal(expectedColumnAssignment, solution.ColumnAssignment);
            Assert.Equal(expectedRowAssignment, solution.RowAssignment);
        }
        public void SolveThrowsForNonTrivialNonSquareInputWithoutFeasibleSolution()
        {
            var dense = new[, ]
            {
                { .2, double.PositiveInfinity, double.PositiveInfinity },
                { .3, double.PositiveInfinity, double.PositiveInfinity }
            };
            var sparse = new SparseMatrixDouble(dense);
            var solver = new ShortestPathSolver();

            Assert.Throws <InvalidOperationException>(() => solver.Solve(dense));
            Assert.Throws <InvalidOperationException>(() => solver.Solve(sparse));
        }
Ejemplo n.º 3
0
        public void TransposeCalculatesTransposeAndIsAnInvolution(
            List <double> A, List <int> IA, List <int> CA, int numColumns,
            List <double> At, List <int> IAt, List <int> CAt)
        {
            var matrix          = new SparseMatrixDouble(A.ToList(), IA.ToList(), CA.ToList(), numColumns);
            var transpose       = matrix.Transpose();
            var doubleTranspose = transpose.Transpose();

            Assert.Equal(At, transpose.A);
            Assert.Equal(IAt, transpose.IA);
            Assert.Equal(CAt, transpose.CA);

            Assert.Equal(A, doubleTranspose.A);
            Assert.Equal(IA, doubleTranspose.IA);
            Assert.Equal(CA, doubleTranspose.CA);
        }
Ejemplo n.º 4
0
        public void SparseMatrixConstructsProperlyForDenseIntegralInput()
        {
            double[,] dense = { { 0, 0, 0, 0 }, { 5, 8, 0, 0 }, { 0, 0, 3, 0 }, { 0, 6, 0, 0 } };
            var sparse = new SparseMatrixDouble(dense, 0);

            Assert.Equal(new List <double> {
                5, 8, 3, 6
            }, sparse.A);
            Assert.Equal(new List <int> {
                0, 0, 2, 3, 4
            }, sparse.IA);
            Assert.Equal(new List <int> {
                0, 1, 2, 1
            }, sparse.CA);
            Assert.Equal(4, sparse.NumRows);
            Assert.Equal(4, sparse.NumColumns);
            Assert.Equal(8, sparse.MaxValue);
        }
Ejemplo n.º 5
0
        public void SparseAndDenseSolversGiveSameResult()
        {
            var       rng          = new Random(60);
            const int numberOfRuns = 1000;

            for (var run = 0; run < numberOfRuns; run++)
            {
                var numRows = rng.Next(200, 300);
                var numCols = rng.Next(200, 300);
                var dense   = new double[numRows, numCols];
                for (var i = 0; i < numRows; i++)
                {
                    for (var j = 0; j < numCols; j++)
                    {
                        dense[i, j] = rng.NextDouble() < 0.3 ? double.PositiveInfinity : rng.Next(1, 100);
                    }
                }
                var sparse = new SparseMatrixDouble(dense);

                var denseResult  = Solver.Solve(dense);
                var sparseResult = Solver.Solve(sparse);

                // Check that the objective agrees for both solvers.
                if (numRows <= numCols)
                {
                    var denseObjective =
                        Enumerable.Range(0, numRows).Sum(i => dense[i, denseResult.ColumnAssignment[i]]);
                    var sparseObjective =
                        Enumerable.Range(0, numRows).Sum(i => dense[i, sparseResult.ColumnAssignment[i]]);
                    Assert.Equal(denseObjective, sparseObjective);
                }
                else
                {
                    var denseObjective =
                        Enumerable.Range(0, numCols).Sum(i => dense[denseResult.RowAssignment[i], i]);
                    var sparseObjective =
                        Enumerable.Range(0, numCols).Sum(i => dense[sparseResult.RowAssignment[i], i]);
                    Assert.Equal(denseObjective, sparseObjective);
                }
            }
        }