MyraMath
rcholesky2_inverse


Source: tests/multifrontal/rcholesky/rcholesky2_inverse.cpp

1 // ========================================================================= //
2 // This file is part of MyraMath, copyright (c) 2014-2019 by Ryan A Chilton //
3 // and distributed by MyraCore, LLC. See LICENSE.txt for license terms. //
4 // ========================================================================= //
5 
11 // Containers.
14 #include <myramath/dense/Matrix.h>
23 
24 // Algorithms.
26 #include <myramath/dense/gemm.h>
27 #include <myramath/dense/inverse.h>
30 
31 // Solver under test.
33 
34 // Reporting.
35 #include <myramath/utility/Timer.h>
36 #include <tests/myratest.h>
37 #include <algorithm>
38 
39 using namespace myra;
40 
41 ADD_TEST("rcholesky2_inverse","[multifrontal][parallel]")
42  {
43  // Generate A. Need to break these tests apart, there's a wide dynamic
44  // range in times so using the same input size doesn't make the most sense.
45  int I = 10;
46  int J = 10;
47  int N = I*J;
48  SparseMatrix<double> A = laplacian2<double>(I,J);
49  Pattern P = stencil2(I,J);
50  // Options related to reordering. Test input is small, so need to use small
51  // blocks/no globbing to make sure the symbolic factorization is nontrivial
52  typedef multifrontal::Options Options;
53  Options options = Options::create().set_blocksize(4).set_globsize(4).set_nthreads(2);
54  // Reorder A using bisection and factor it.
55  Permutation perm = bisect2(I,J);
56  SparseRCholeskySolver<double> solver(A,perm,options);
57 
58  // Compute inverse of A explicitly, for reference.
59  Matrix<double> invA = inverse(A.make_Matrix());
60 
61  // Compare to solver.inverse(i,j) for each nonzero original pattern.
62  {
63  Timer timer;
64  double error1 = 0;
65  for (int j = 0; j < N; ++j)
66  {
67  std::vector<int> Pj = P.pattern(j);
68  for (auto i = Pj.begin(); i != Pj.end(); ++i)
69  {
70  double z1 = invA(*i,j);
71  double z2 = solver.inverse(*i,j);
72  error1 = std::max(error1, scalar_norm1(invA(*i,j)-solver.inverse(*i,j)) );
73  }
74  }
75  double t = timer.elapsed_time();
76  myra::out() << "|solver.inverse(i,j)| = " << error1 << ", " << t << " sec" << std::endl;
77  REQUIRE(error1 < 1.0e-12);
78  }
79 
80  // Check the inverse over some arbitrary 20x20 tensor block.
81  {
82  Timer timer;
83  Matrix<double> invA_block = solver.inverse(ilinspace(5,25),ilinspace(27,47));
84  // Matrix<double> invA_block(20,20);
85  double t = timer.elapsed_time();
86  double error3 = frobenius(invA_block - invA.window(5,25,27,47));
87  myra::out() << "|solver.inverse(i_indices,j_indices)| = " << error3 << ", " << t << " sec" << std::endl;
88  REQUIRE(error3 < 1.0e-12);
89  }
90 
91  // Check the inverse over a diagonal 20x20 tensor block.
92  {
93  Timer timer;
94  LowerMatrix<double> invA_block = solver.inverse(ilinspace(5,25),options.set_nthreads(1));
95  double t = timer.elapsed_time();
96  double error4 = frobenius(invA_block.make_Matrix('T') - invA.window(5,25,5,25));
97  myra::out() << "|solver.inverse(ij_indices)| = " << error4 << ", " << t << " sec" << std::endl;
98  REQUIRE(error4 < 1.0e-12);
99  }
100 
101  }
Interface class for representing subranges of dense Matrix&#39;s.
Options pack for routines in /multifrontal.
Definition: Options.h:24
Represents a Permutation matrix, used to reorder rows/columns/etc of various numeric containers...
Definition: Permutation.h:34
Tabulates an IxJ matrix. Allows random access, has column major layout to be compatible with BLAS/LAP...
Definition: bdsqr.h:20
Matrix< Number > make_Matrix(char op='N') const
Accumulates *this onto the lower triangle of a Matrix<Number>
Definition: LowerMatrix.cpp:152
Routines for computing Frobenius norms of various algebraic containers.
Simplistic timing class, might dispatch to platform specific timers depending upon environment...
General purpose compressed-sparse-column (CSC) container.
Range construct for a lower triangular matrix stored in rectangular packed format.
Definition: syntax.dox:1
CMatrixRange< Number > window(int i0, int i1, int j0, int j1) const
Returns a MatrixRange over this(i0:i1,j0:j1)
Definition: Matrix.cpp:142
Measures elapsed time.
Definition: Timer.h:19
Specialized container for a lower triangular matrix, O(N^2/2) storage. Used by symmetry exploiting ma...
Various utility functions/classes related to scalar Number types.
Returns a vector of int&#39;s, over [min,max)
General purpose dense matrix container, O(i*j) storage.
Range/Iterator types associated with Pattern.
Sparse direct solver suitable for real symmetric positive definite systems.
Holds the nonzero pattern of a sparse matrix.
Definition: Pattern.h:55
Container class for a sparse nonzero pattern, used in reordering/symbolic analysis.
Overwrites a LowerMatrix, DiagonalMatrix, or square Matrix with its own inverse. Or, returns it as a copy.
Aggregates a (perm, iperm, swaps) triple into a vocabulary type.
Sparse direct solver suitable for real symmetric positive definite systems.
Definition: SparseRCholeskySolver.h:61
Stores a lower triangular matrix in rectangular packed format.
Definition: conjugate.h:22
Stores an IxJ matrix A in compressed sparse column format.
Definition: bothcat.h:23
Helper routines for reordering/filling 2D structured grids. Used by many unit tests.
Variety of routines all for dense Matrix*Matrix multiplies. Delegates to the BLAS.
double elapsed_time() const
Returns elapsed time in seconds since last call to reset()
Definition: Timer.cpp:18
Range/Iterator types associated with SparseMatrix.
Matrix< Number > make_Matrix() const
Accumulates *this onto a Matrix<Number>.
Definition: SparseMatrix.cpp:581
Interface class for representing subranges of contiguous int&#39;s.


Results: [PASS]

|solver.inverse(i,j)| = 3.33067e-16, 0.154009 sec
|solver.inverse(i_indices,j_indices)| = 1.19586e-16, 0.020001 sec
|solver.inverse(ij_indices)| = 4.99847e-16, 0.002 sec


Go back to Summary of /test programs.