Beispiel #1
0
        public void CholeskySolver_SolveWhenFactorIsNull_ThrowsArgumentNullException()
        {
            var right = new Vector(3);

            var solver = new CholeskySolver();

            Assert.Throws <ArgumentNullException>(() => solver.Solve(null, right));
        }
Beispiel #2
0
        public void TestCholeskySolver()
        {
            IVector x = new SparseVector(new double[] { 2, 4, 1 });
            IVector b = A.Multiply(x);

            IVector x_pi = CholeskySolver.Solve(A, b);

            Assert.Equal(x, x_pi);
        }
Beispiel #3
0
        public void CholeskySolver_SolveWhenRightIsNull_ThrowsArgumentNullException()
        {
            var matrix = new Matrix(3, 3, new double[, ] {
                { 81, -45, 45 }, { -45, 50, 5 }, { 45, -15, 38 }
            });

            var solver = new CholeskySolver();

            Assert.Throws <ArgumentNullException>(() => solver.Solve(matrix, null));
        }
Beispiel #4
0
        public void CholeskySolver_SolveWhenFactorAndRightHaveDifferentSize_ThrowsArgumentNullException()
        {
            var matrix = new Matrix(3, 3, new double[, ] {
                { 81, -45, 45 }, { -45, 50, 5 }, { 45, -15, 38 }
            });
            var right = new Vector(2);

            var solver = new CholeskySolver();

            Assert.Throws <ArgumentException>(() => solver.Solve(matrix, right));
        }
Beispiel #5
0
        public void CholeskySolver_SolveWhenFactorIsNotSquare_ThrowsNonSymmetricMatrixException()
        {
            var matrix = new Matrix(3, 3, new double[, ] {
                { 81, -45, 45 }, { -45, 50, 5 }, { 45, -15, 38 }
            });
            var right = new Vector(3, new double[] { 531, -460, 193 });

            var solver = new CholeskySolver();

            Assert.Throws <NonSymmetricMatrixException>(() => solver.Solve(matrix, right));
        }
Beispiel #6
0
        public void CholeskySolver_Solve_ReturnsResultAsExpected()
        {
            var matrix = new Matrix(3, 3, new double[, ] {
                { 81, -45, 45 }, { -45, 50, -15 }, { 45, -15, 38 }
            });
            var right = new Vector(3, new double[] { 531, -460, 193 });

            var expected = Vector.From(new double[] { 6, -5, -4 });

            var solver = new CholeskySolver();

            var x = solver.Solve(matrix, right);

            Assert.AreEqual(expected, x);
        }
Beispiel #7
0
        public void TestMatrixInverse()
        {
            IMatrix Ainv = CholeskySolver.Invert(A);
            IMatrix Ipi  = A.Multiply(Ainv);


            Assert.Equal(A.Identity(3), Ipi);

            Ipi = Ainv.Multiply(A);

            //for (int row = 0; row < 2; ++row)
            //{
            //    Console.WriteLine(Ipi[row]);
            //}

            Assert.Equal(A.Identity(3), Ipi);
        }
        private ISolver CreateSolver(CCS a)
        {
            ISolver buf;

            switch (parent.LastResult.SolverType)
            {
            case BuiltInSolverType.CholeskyDecomposition:
                buf = new CholeskySolver(a);
                break;

            case BuiltInSolverType.ConjugateGradient:
                buf   = new PCG(new SSOR());
                buf.A = a;
                break;

            default:
                throw new NotImplementedException();
            }

            return(buf);
        }
Beispiel #9
0
        public void Test_Solve2Dimension()
        {
            /*
             *  Созданная матрица:
             *
             *  1  0  0   2  2  2
             *  0  1  1  -2 -2 -2
             *  0  1  0  -8 -8 -8
             *
             *  2 -2 -8   3  3  3
             *  2 -2 -8   3  0  3
             *  2 -2 -8   3  3  6
             *
             *  Правая часть:
             *   1  2  1
             *  -8 -8 -8
             *
             *  Ожидаемый результат:
             *  решение:
             *  1 1 1
             *  0 0 0
             *
             */
            int dimension = 2;

            SymmetricMatrix <MatrixDimension3> sourceMatrix = new SymmetricMatrix <MatrixDimension3>(dimension, new MatrixDimension3());

            MatrixDimension3 globalPart00 = new MatrixDimension3();

            globalPart00[0, 0] = 1;
            globalPart00[0, 1] = 0;
            globalPart00[1, 0] = globalPart00[0, 1];
            globalPart00[0, 2] = 0;
            globalPart00[2, 0] = globalPart00[0, 2];
            globalPart00[1, 1] = 1;
            globalPart00[1, 2] = 1;
            globalPart00[2, 1] = globalPart00[1, 2];
            globalPart00[2, 2] = 0;

            MatrixDimension3 globalPart01 = new MatrixDimension3();

            globalPart01[0, 0] = 2;
            globalPart01[0, 1] = 2;
            globalPart01[1, 0] = -2;
            globalPart01[0, 2] = 2;
            globalPart01[2, 0] = -8;
            globalPart01[1, 1] = -2;
            globalPart01[1, 2] = -2;
            globalPart01[2, 1] = -8;
            globalPart01[2, 2] = -8;

            MatrixDimension3 globalPart11 = new MatrixDimension3();

            globalPart11[0, 0] = 3;
            globalPart11[0, 1] = 3;
            globalPart11[1, 0] = globalPart11[0, 1];
            globalPart11[0, 2] = 3;
            globalPart11[2, 0] = globalPart11[0, 2];
            globalPart11[1, 1] = 0;
            globalPart11[1, 2] = 3;
            globalPart11[2, 1] = globalPart11[1, 2];
            globalPart11[2, 2] = 0;

            sourceMatrix[0, 0] = globalPart00;
            sourceMatrix[0, 1] = globalPart01;
            sourceMatrix[1, 1] = globalPart11;

            List <Vector3D> rightPart = new List <Vector3D>();
            Vector3D        part1     = new Vector3D(1, 2, 1);
            Vector3D        part2     = new Vector3D(-8, -8, -8);

            rightPart.Insert(0, part1);
            rightPart.Insert(1, part2);

            CholeskySolver solver = new CholeskySolver();

            SymmetricMatrix <DoubleContainerElement> BMatrix = new SymmetricMatrix <DoubleContainerElement>(2 * 3, new DoubleContainerElement());
            SymmetricMatrix <DoubleContainerElement> CMatrix = new SymmetricMatrix <DoubleContainerElement>(2 * 3, new DoubleContainerElement());

            IList <Vector3D> solution = solver.solve(SymmetricMatrix <DoubleContainerElement> .extractMatrix(sourceMatrix), rightPart);

            //Ожидаемый результат
            List <Vector3D> expectVector = new List <Vector3D>();
            Vector3D        part3        = new Vector3D(1, 1, 1);
            Vector3D        part4        = new Vector3D(0, 0, 0);

            expectVector.Insert(0, part3);
            expectVector.Insert(1, part4);

            //Проверка
            foreach (Vector3D vector in solution)
            {
                Console.Write(vector.ToString() + " ");
            }
            Console.WriteLine();

            foreach (Vector3D vector in expectVector)
            {
                Console.Write(vector.ToString() + " ");
            }
            Console.WriteLine();
        }
Beispiel #10
0
        //For debugging purpose only
        //[TestMethod]
        public void Test_CreateBCMatrix()
        {
            /*
             *  Созданная матрица:
             *
             *  1  0  0  2  2  2
             *  0  1  1 -2 -2 -2
             *  0  1  0 -8 -8 -8
             *  2 -2 -8  3  3  3
             *  2 -2 -8  3  0  3
             *  2 -2 -8  3  3  6
             *
             */
            int dimension = 6;

            SymmetricMatrix <DoubleContainerElement> sourceMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement());

            sourceMatrix[0, 0] = new DoubleContainerElement(1);
            sourceMatrix[0, 1] = new DoubleContainerElement(0);
            sourceMatrix[0, 2] = new DoubleContainerElement(0);
            sourceMatrix[0, 3] = new DoubleContainerElement(2);
            sourceMatrix[0, 4] = new DoubleContainerElement(2);
            sourceMatrix[0, 5] = new DoubleContainerElement(2);

            sourceMatrix[1, 1] = new DoubleContainerElement(1);
            sourceMatrix[1, 2] = new DoubleContainerElement(1);
            sourceMatrix[1, 3] = new DoubleContainerElement(-2);
            sourceMatrix[1, 4] = new DoubleContainerElement(-2);
            sourceMatrix[1, 5] = new DoubleContainerElement(-2);

            sourceMatrix[2, 2] = new DoubleContainerElement(0);
            sourceMatrix[2, 3] = new DoubleContainerElement(-8);
            sourceMatrix[2, 4] = new DoubleContainerElement(-8);
            sourceMatrix[2, 5] = new DoubleContainerElement(-8);

            sourceMatrix[3, 3] = new DoubleContainerElement(3);
            sourceMatrix[3, 4] = new DoubleContainerElement(3);
            sourceMatrix[3, 5] = new DoubleContainerElement(3);

            sourceMatrix[4, 4] = new DoubleContainerElement(0);
            sourceMatrix[4, 5] = new DoubleContainerElement(3);

            sourceMatrix[5, 5] = new DoubleContainerElement(0);

            SymmetricMatrix <DoubleContainerElement> BMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement());
            SymmetricMatrix <DoubleContainerElement> CMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement());

            CholeskySolver solver = new CholeskySolver();

            //solver.createBCMatrix(BMatrix, CMatrix, sourceMatrix);

            // Ожидаемый результат:
            SymmetricMatrix <DoubleContainerElement> expBMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement());
            SymmetricMatrix <DoubleContainerElement> expCMatrix = new SymmetricMatrix <DoubleContainerElement>(dimension, new DoubleContainerElement());

            //Матрица B

            expBMatrix[0, 0] = new DoubleContainerElement(1);
            expBMatrix[1, 0] = new DoubleContainerElement(0);
            expBMatrix[2, 0] = new DoubleContainerElement(0);
            expBMatrix[3, 0] = new DoubleContainerElement(2);
            expBMatrix[4, 0] = new DoubleContainerElement(2);
            expBMatrix[5, 0] = new DoubleContainerElement(2);

            expBMatrix[1, 1] = new DoubleContainerElement(1);
            expBMatrix[2, 1] = new DoubleContainerElement(1);
            expBMatrix[3, 1] = new DoubleContainerElement(-2);
            expBMatrix[4, 1] = new DoubleContainerElement(-2);
            expBMatrix[5, 1] = new DoubleContainerElement(-2);

            expBMatrix[2, 2] = new DoubleContainerElement(-1);
            expBMatrix[3, 2] = new DoubleContainerElement(-6);
            expBMatrix[4, 2] = new DoubleContainerElement(-6);
            expBMatrix[5, 2] = new DoubleContainerElement(-6);

            expBMatrix[3, 3] = new DoubleContainerElement(31);
            expBMatrix[4, 3] = new DoubleContainerElement(31);
            expBMatrix[5, 3] = new DoubleContainerElement(31);

            expBMatrix[4, 4] = new DoubleContainerElement(-3);
            expBMatrix[5, 4] = new DoubleContainerElement(0);

            expBMatrix[5, 5] = new DoubleContainerElement(-3);

            //Матрица C

            expCMatrix[0, 0] = new DoubleContainerElement(1);
            expCMatrix[0, 1] = new DoubleContainerElement(0);
            expCMatrix[0, 2] = new DoubleContainerElement(0);
            expCMatrix[0, 3] = new DoubleContainerElement(2);
            expCMatrix[0, 4] = new DoubleContainerElement(2);
            expCMatrix[0, 5] = new DoubleContainerElement(2);

            expCMatrix[1, 1] = new DoubleContainerElement(1);
            expCMatrix[1, 2] = new DoubleContainerElement(1);
            expCMatrix[1, 3] = new DoubleContainerElement(-2);
            expCMatrix[1, 4] = new DoubleContainerElement(-2);
            expCMatrix[1, 5] = new DoubleContainerElement(-2);

            expCMatrix[2, 2] = new DoubleContainerElement(1);
            expCMatrix[2, 3] = new DoubleContainerElement(6);
            expCMatrix[2, 4] = new DoubleContainerElement(6);
            expCMatrix[2, 5] = new DoubleContainerElement(6);

            expCMatrix[3, 3] = new DoubleContainerElement(1);
            expCMatrix[3, 4] = new DoubleContainerElement(1);
            expCMatrix[3, 5] = new DoubleContainerElement(1);

            expCMatrix[4, 4] = new DoubleContainerElement(1);
            expCMatrix[4, 5] = new DoubleContainerElement(0);

            expCMatrix[5, 5] = new DoubleContainerElement(1);

            // Проверка
            //Assert.IsTrue(expCMatrix.Equals(CMatrix), "All is bad");
            Assert.IsTrue(expBMatrix.Equals(BMatrix), "All is bad");
            Assert.IsTrue(expCMatrix.Equals(CMatrix), "All is bad");
        }
Beispiel #11
0
        public static async Task Main(string[] args)
        {
            MatrixProvider provider = new MatrixProvider(ImagePath);
            ResultsSaver   saver    = new ResultsSaver();

            IEquationSolver sequentialSolver = new EquationSolver();
            IEquationSolver parallelSolver   = new ParallelEquationSolver();

            IEquationSolver choleskySolver         = new CholeskySolver();
            IEquationSolver parallelCholeskySolver = new ParallelCholeskySolver();

            IEquationSolver diagonalSolver         = new DiagonalSolver();
            IEquationSolver parallelDiagonalSolver = new ParallelDiagonalSolver();

            IEquationSolver jacobiSolver         = new JacobiSolver();
            IEquationSolver parallelJacobiSolver = new ParallelJacobiSolver();

            int[] sizes = { 10, 100, 500 };

            sequentialSolver.Solve(GetTestMatrix());

            // Console.WriteLine("Sequential Cramer:");
            // await PerformTesting(sizes, provider, saver, sequentialSolver);
            //
            // Console.WriteLine();
            // Console.WriteLine("Parallel Cramer:");
            // await PerformTesting(sizes, provider, saver, parallelSolver);

            // Console.WriteLine();
            // Console.WriteLine("Sequential Cholesky:");
            // choleskySolver.Solve(GetCholeskyTestMatrix());
            // await PerformTesting(sizes, provider, saver, choleskySolver);
            //
            // Console.WriteLine();
            // Console.WriteLine("Parallel Cholesky:");
            // parallelSolver.Solve(GetCholeskyTestMatrix());
            // await PerformTesting(sizes, provider, saver, parallelCholeskySolver);
            //
            // Console.WriteLine();
            // Console.WriteLine("Sequential K-Diagonal:");
            // diagonalSolver.Solve(GetDiagonalTestMatrix());
            // await PerformTesting(sizes, provider, saver, diagonalSolver);
            //
            // Console.WriteLine();
            // Console.WriteLine("Parallel K-Diagonal:");
            // parallelDiagonalSolver.Solve(GetDiagonalTestMatrix2());
            // await PerformTesting(sizes, provider, saver, parallelDiagonalSolver);

            Console.WriteLine();
            Console.WriteLine("Sequential Jacobi on common matrix:");
            jacobiSolver.Solve(GetDiagonalTestMatrix2());
            await PerformTesting(sizes, provider, saver, jacobiSolver);

            Console.WriteLine();
            Console.WriteLine("Sequential Jacobi on chess matrix:");
            jacobiSolver.Solve(GetDiagonalTestMatrix2());
            await PerformTesting(sizes, provider, saver, jacobiSolver, matrix => matrix.ToChessZero());

            Console.WriteLine();
            Console.WriteLine("Parallel Jacobi on common matrix:");
            parallelJacobiSolver.Solve(GetDiagonalTestMatrix2());
            await PerformTesting(sizes, provider, saver, parallelJacobiSolver);

            Console.WriteLine();
            Console.WriteLine("Parallel Jacobi on chess matrix:");
            parallelJacobiSolver.Solve(GetDiagonalTestMatrix2());
            await PerformTesting(sizes, provider, saver, parallelJacobiSolver, matrix => matrix.ToChessZero());
        }