public void SparseAndDenseSolversGiveSameResult() { var rng = new Random(42); const int numberOfRuns = 500; const int numRows = 400; const int numCols = 400; for (var run = 0; run < numberOfRuns; run++) { var dense = new double[numRows, numCols]; for (var i = 0; i < numRows; i++) { for (var j = 0; j < numCols; j++) { dense[i, j] = rng.Next(1, 100); } } var sparse = new SparseMatrixDouble(dense); var solver = new ShortestPathSolver(); var denseResult = solver.Solve(dense); var sparseResult = solver.Solve(sparse); // Check that all assignments agree. In principle, they don't have to if more than // one optimal solution exists, but this is somewhat unlikely when we're dealing // with random doubles. 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); } }
public void SolveThrowsWhenNoFeasibleSolutionExists() { var cost = new[, ] { { double.PositiveInfinity } }; var solver = new ShortestPathSolver(); Assert.Throws <InvalidOperationException>(() => solver.Solve(cost)); }
public void LoadMaze(IMaze maze, MazeStats mazeStats) { _currentMaze = maze; _currentStats = mazeStats; _mazeDistanceInfo = CellDistanceSolver.GetPassableDistancesFromCell(_currentMaze.StartingCell); _mazeShortestPathInfo = ShortestPathSolver.Solve(_currentMaze.FinishingCell, _mazeDistanceInfo); UpdateMazeRendering(); ResetMazePositionAndScaling(); }
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)); }
public void SolveGivesExpectedResult( double[,] cost, int[] expectedColumnAssignment, int[] expectedRowAssignment, double[] expectedDualU, double[] expectedDualV) { var solver = new ShortestPathSolver(); var solution = solver.Solve(cost); Assert.IsAssignableFrom <AssignmentWithDuals>(solution); var solutionWithDuals = (AssignmentWithDuals)solution; Assert.Equal(expectedColumnAssignment, solution.ColumnAssignment); Assert.Equal(expectedRowAssignment, solution.RowAssignment); Assert.Equal(expectedDualU, solutionWithDuals.DualU); Assert.Equal(expectedDualV, solutionWithDuals.DualV); }
static void Main(string[] args) { const string pngFileName = "rendering.png"; var maze = new TriangleMaze(20, 40, WallSetupAlgorithm.RecursiveBackTracker); var mazeDistanceInfo = CellDistanceSolver.GetPassableDistancesFromCell(maze.StartingCell); var mazeShortestPathInfo = ShortestPathSolver.Solve(maze.FinishingCell, mazeDistanceInfo); var renderOptions = new RenderOptions { ShowGradientOfDistanceFromStart = true, HighlightShortestPath = true, //ShowAllDistances = true, }; using (var image = maze.RenderWithSkia(renderOptions, mazeDistanceInfo, mazeShortestPathInfo)) using (var data = image.Encode(SKEncodedImageFormat.Png, 100)) using (var stream = File.OpenWrite(pngFileName)) { data.SaveTo(stream); } }