public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);

                var p = Util.Permutation(A.RowCount, rand);

                var B = (SparseMatrix)A.Clone();
                var C = (SparseMatrix)A.Clone();

                var result = new BenchmarkResult();

                Util.Tic();
                C.FastPermuteColumns(p);
                result.Time2 = Util.Toc();

                Util.Tic();
                B.PermuteColumns(new Permutation(p));
                result.Time1 = Util.Toc();

                result.Success = MatrixComparer.Equals(B, C, EPS);

                return(result);
            }
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);
                var B = Create.SparseMatrix(rows, cols, density, symmetric);

                var result = new BenchmarkResult();

                Util.Tic();
                var C = A.FastAdd(B);

                result.Time2 = Util.Toc();

                Util.Tic();
                //var D = A.Add(B);
                var D = A + B;

                result.Time1 = Util.Toc();

                result.Success = MatrixComparer.Equals(C, D, EPS);

                return(result);
            }
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);
                var S = CreateSparse.RandomSymmetric(4, 0.5);

                var result = new BenchmarkResult();

                Util.Tic();
                var B = S.FastKroneckerProduct(A);

                result.Time2 = Util.Toc();

                Util.Tic();
                var C = S.KroneckerProduct(A);

                result.Time1 = Util.Toc();

                result.Success = MatrixComparer.Equals(B, C, EPS);

                return(result);
            }
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);

                var result = new BenchmarkResult();

                var a = DenseVector.Create(rows, (i) => 1.0 + i);
                var D = DiagonalMatrix.OfDiagonal(rows, cols, a);
                var C = (SparseMatrix)A.Clone();

                Util.Tic();
                var B = A.Add(D);

                result.Time1 = Util.Toc();

                Util.Tic();
                C.FastAddDiagonalMatrix(Util.GetData(a), C);
                result.Time2 = Util.Toc();

                result.Success = MatrixComparer.Equals(B, C, EPS);

                return(result);
            }
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);

                var temp = A.RowNorms(1);
                var a    = DenseVector.Create(cols, i => temp[i]);
                var b    = Util.GetData(a);
                var D    = SparseMatrix.OfDiagonalVector(a);

                var result = new BenchmarkResult();

                Util.Tic();
                var B = A.Multiply(D);

                result.Time1 = Util.Toc();

                Util.Tic();
                A.FastScaleColumns(b, A);
                result.Time2 = Util.Toc();

                result.Success = MatrixComparer.Equals(A, B, EPS);

                return(result);
            }
示例#6
0
        private async void btnRun_Click(object sender, EventArgs e)
        {
            if (busy)
            {
                if (cts != null)
                {
                    cts.Cancel();
                }

                return;
            }

            cts = new CancellationTokenSource();

            var solver         = comboSolver.SelectedItem as TypeNameProvider;
            var preconditioner = comboPrecon.SelectedItem as TypeNameProvider;

            var setup = new BenchmarkSetup();

            setup.CancellationToken = cts.Token;

            if (matrix == null)
            {
                matrix = MatrixHelper.CreateLaplacian(typeName, 50, 50);
            }

            if (typeName == "Double")
            {
                setup.SetMatrix <double>(matrix);
            }
            else
            {
                setup.SetMatrix <Complex>(matrix);
            }

            setup.Solver          = cache.GetSolver(typeName, solver.Type);
            setup.Preconditioner  = cache.GetPreconditioner(typeName, preconditioner.Type);
            setup.Tolerance       = GetTolerance();
            setup.IterationsLimit = GetLimit();

            btnRun.Image = Properties.Resources.stop;

            try
            {
                busy = true;
                await benchmarkResultsView1.Run(setup, typeName);
            }
            catch (Exception ex)
            {
                lbInfo.Text = ex.Message;
            }
            finally
            {
                busy = false;
            }

            btnRun.Image = Properties.Resources.play;
        }
示例#7
0
        public override BenchmarkResult Run(BenchmarkSetup config)
        {
            var result = new BenchmarkResult();

            if (!(config.Solver is IIterativeSolver <double>))
            {
                return(result);
            }

            if (!(config.Preconditioner is IPreconditioner <double>))
            {
                return(result);
            }

            var matrix = config.Matrix as SparseMatrix;

            if (matrix == null)
            {
                return(result);
            }

            int n = matrix.ColumnCount;

            var s = DenseVector.Create(n, (i) => 1.0 + ((double)i / (n - 1)));
            var b = matrix.Multiply(s) as DenseVector;
            var x = DenseVector.Create(n, 0.0);

            var monitor = new IterationMonitor <double>();

            var iterator = new Iterator <double>(
                new IterationCountStopCriterion <double>(config.IterationsLimit),
                //new ResidualStopCriterion<double>(config.Tolerance, b.L2Norm()),
                new ResidualStopCriterion <double>(config.Tolerance),
                new DivergenceStopCriterion <double>(),
                new CancellationStopCriterion <double>(config.CancellationToken),
                monitor
                );

            var solver         = (IIterativeSolver <double>)config.Solver;
            var preconditioner = (IPreconditioner <double>)config.Preconditioner;

            preconditioner.Initialize(matrix);

            Util.Tic();
            solver.Solve(matrix, b, x, iterator, preconditioner);

            var residual = b.Clone();

            matrix.Multiply(-1.0, x, 1.0, residual);

            result.Time            = Util.Toc();
            result.Status          = iterator.Status;
            result.IterationCount  = monitor.LastIteration;
            result.ResidualHistory = monitor.ResidualNormHistory.ToArray();
            result.Error           = residual.L2Norm() / b.L2Norm();

            return(result);
        }
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);

                var result = new BenchmarkResult();

                var x = Create.Vector(cols, 1.0);
                var y = Create.Array(cols, 1.0);
                var z = (DenseVector)x.Clone();

                Util.Tic();

                for (int i = 0; i < repeat; i++)
                {
                    A.TransposeMultiply(2.0, Util.GetData(x), 0.1, y);
                }

                result.Time2 = Util.Toc();


                Util.Tic();

                var temp = x.Clone();

                // We really don't like to compute/allocate the transpose, but ...
                A = (SparseMatrix)A.Transpose();

                for (int i = 0; i < repeat; i++)
                {
                    // z = 2.0 * A^t * x + 0.1 * z;
                    temp.Multiply(2.0, x);
                    A.Multiply(x, x);
                    z.Multiply(0.1, z);
                    z.Add(x, z);
                }

                result.Time1 = Util.Toc();

                result.Success = Helper.Equals(z, y, EPS);

                return(result);
            }
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);

                var result = new BenchmarkResult();

                var x = Create.Vector(cols, 1.0);
                var y = Create.Array(cols, 1.0);
                var z = (DenseVector)x.Clone();

                Util.Tic();

                for (int i = 0; i < repeat; i++)
                {
                    A.TransposeMultiply(2.0, Util.GetData(x), 0.1, y);
                }

                result.Time2 = Util.Toc();


                Util.Tic();

                var temp = x.Clone();

                for (int i = 0; i < repeat; i++)
                {
                    // z = 2.0 * A^t * x + 0.1 * z;
                    temp.Multiply(2.0, x);

                    // Completely unusable for large sparse matrices.
                    A.TransposeThisAndMultiply(x, x); // Same as A.LeftMultiply(x, x)?

                    z.Multiply(0.1, z);
                    z.Add(x, z);
                }

                result.Time1 = Util.Toc();

                result.Success = Helper.Equals(z, y, EPS);

                return(result);
            }
示例#10
0
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);

                DVector b;
                var     a = new double[A.RowCount];

                var result = new BenchmarkResult();

                Util.Tic();
                b             = A.RowNorms(1);
                result.Time1 += Util.Toc();

                Util.Tic();
                A.FastRowNorms(1, a);
                result.Time2 += Util.Toc();

                result.Success = Helper.Equals(b, a, 0.0);

                Util.Tic();
                b             = A.RowNorms(2);
                result.Time1 += Util.Toc();

                Util.Tic();
                A.FastRowNorms(2, a);
                result.Time2 += Util.Toc();

                result.Success &= Helper.Equals(b, a, 0.0);

                Util.Tic();
                b             = A.RowNorms(double.PositiveInfinity);
                result.Time1 += Util.Toc();

                Util.Tic();
                A.FastRowNorms(0, a);
                result.Time2 += Util.Toc();

                result.Success &= Helper.Equals(b, a, 0.0);

                return(result);
            }
示例#11
0
        public async Task Run(BenchmarkSetup setup, string type)
        {
            if (!setup.CheckForNull())
            {
                return;
            }

            var context = new BenchmarkContext(setup, type);

            var progress = new Progress <int>(i => { });

            await context.Run(progress);

            AddResultToList(context);

            VisualizeTestResults();
        }
示例#12
0
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);

                var result = new BenchmarkResult();

                var rowIndices = new int[repeat];

                for (int i = 0; i < repeat; i++)
                {
                    rowIndices[i] = rand.Next(0, rows - 1);
                }

                var x = new DenseVector(cols);
                var y = new DenseVector(cols);

                Util.Tic();
                for (int i = 0; i < repeat; i++)
                {
                    A.FastGetRow(rowIndices[i], x);
                }
                result.Time2 = Util.Toc();


                Util.Tic();
                for (int i = 0; i < repeat; i++)
                {
                    A.Row(rowIndices[i], y);
                }
                result.Time1 = Util.Toc();

                result.Success = Helper.Equals(x, (Complex[])y, EPS);

                return(result);
            }
示例#13
0
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);
                var B = (SparseMatrix)A.Clone();

                var result = new BenchmarkResult();

                Util.Tic();
                B.FastUpperTriangle();
                result.Time2 = Util.Toc();

                Util.Tic();
                var C = (SparseMatrix)A.UpperTriangle();

                result.Time1 = Util.Toc();

                result.Success = MatrixComparer.Equals(B, C, EPS);

                // Strict upper.
                B = (SparseMatrix)A.Clone();

                Util.Tic();
                B.FastUpperTriangle(true);
                result.Time2 += Util.Toc();

                Util.Tic();
                C             = (SparseMatrix)A.StrictlyUpperTriangle();
                result.Time1 += Util.Toc();

                result.Success &= MatrixComparer.Equals(B, C, EPS);

                return(result);
            }
示例#14
0
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);
                var B = (SparseMatrix)A.Clone();

                var S = Create.SparseMatrix(repeat, cols, 2 * density, false);

                var result = new BenchmarkResult();

                var rowIndices = new int[repeat];

                for (int i = 0; i < repeat; i++)
                {
                    rowIndices[i] = rand.Next(0, rows - 1);
                }

                Util.Tic();
                A.FastSetRows(rowIndices, S);
                result.Time2 = Util.Toc();


                Util.Tic();
                for (int i = 0; i < repeat; i++)
                {
                    B.SetRow(rowIndices[i], S.Row(i));
                }
                result.Time1 = Util.Toc();

                result.Success = MatrixComparer.Equals(A, B, EPS);

                return(result);
            }
示例#15
0
            public override BenchmarkResult Run(BenchmarkSetup config)
            {
                int    rows      = config.RowCount;
                int    cols      = config.ColumnCount;
                int    repeat    = config.Repeat;
                double density   = config.Density;
                bool   symmetric = config.Symmetric;

                var A = Create.SparseMatrix(rows, cols, density, symmetric);

                var result = new BenchmarkResult();

                var columnIndices = new int[repeat];

                for (int i = 0; i < repeat; i++)
                {
                    columnIndices[i] = rand.Next(0, cols - 1);
                }

                Util.Tic();
                var B = A.FastGetColumns(columnIndices);

                result.Time2 = Util.Toc();


                Util.Tic();
                var C = new SparseMatrix(rows, repeat);

                for (int i = 0; i < repeat; i++)
                {
                    C.SetColumn(i, A.Column(columnIndices[i]));
                }
                result.Time1 = Util.Toc();

                result.Success = MatrixComparer.Equals(B, C, EPS);

                return(result);
            }