39 #include <tests/myratest.h>    46 std::vector<int> random_rows(
int I, 
int N)
    48   std::vector<int> answer;
    49   for (
int n = 0; n < N; ++n)
    50     answer.push_back( random_int(0,I) );
    58   int J = Bv.
size().second;
    60   for (
int j = 0; j < J; ++j)
    61     for (
int i = 0; i < Bi.size(); ++i)
    62       B_builder(Bi[i],j) = Bv(i,j);
    63   return B_builder.make_SparseMatrix();
    67 template<
class Precision> 
void test(Precision tolerance)
    77   auto A = laplacian2<Precision>(I,J);
    81   Options options = Options::create().set_blocksize(4).set_globsize(4).set_nthreads(4);
    94     Precision S_error = frobenius(S1.
make_Matrix(
'T')-S2)/frobenius(S2);
    95     myra::out() << 
"|B'*inv(A)*B [dense] - B'*inv(A)*B [sparse]| = " << S_error << std::endl;
    96     REQUIRE(S_error < tolerance);
   102     auto Bi = random_rows(N,10);
   104     auto B = fill(N,Bi,Bv);
   105     auto S1 = solver.schur(Bi,Bv,options);
   107     auto S2 = gemm(B.make_Matrix(),
'T',gemm(inverse(A.
make_Matrix()),B.make_Matrix()));       
   108     Precision S_error = frobenius(S1.
make_Matrix(
'T')-S2)/frobenius(S2);
   109     myra::out() << 
"|schur(B)-schur(BiBv)| = " << S_error << std::endl;
   110     REQUIRE(S_error < tolerance);
   116     auto Bi = ilinspace(0,N);
   118     Precision S1 = solver.schur(Bi,Bv,options)(0,0);
   122     Precision S_error = std::abs(S1-S2)/std::abs(S2);
   123     myra::out() << 
"|schur(Bi,Bv)-dot(L\\Bv,L\\Bv))| = " << S_error << std::endl;
   124     REQUIRE(S_error < tolerance);
   135     Precision S_error = frobenius(S1-S2)/frobenius(S2);
   136     myra::out() << 
"|C'*inv(A)*D [dense] - C'*inv(A)*D [sparse]| = " << S_error << std::endl;
   137     REQUIRE(S_error < tolerance);
   143     auto Bi = random_rows(N,10);
   145     auto Ci = random_rows(N,10);
   147     auto S1 = solver.schur(Bi,Bv,Ci,Cv,options);
   149     auto B = fill(N,Bi,Bv);
   150     auto C = fill(N,Ci,Cv);
   151     auto S2 = gemm(B.make_Matrix(),
'T',gemm(inverse(A.
make_Matrix()),C.make_Matrix()));   
   152     Precision S_error = frobenius(S1-S2)/frobenius(S2);
   153     myra::out() << 
"|schur(B,C)-schur(BiBv,CiCv)| = " << S_error << std::endl;
   154     REQUIRE(S_error < tolerance);
   159     auto Bi = ilinspace(0,N);
   161     auto Ci = ilinspace(0,N);
   163     Precision S1 = solver.schur(Bi,Bv,Ci,Cv,options)(0,0);
   167     Precision S2 = dot(Bv.
vector(0),Cv.vector(0));
   168     Precision S_error = std::abs(S1-S2)/std::abs(S2);
   169     myra::out() << 
"|schur(Bi,Bv)-dot(L\\Bv,L\\Bv))| = " << S_error << std::endl;
   170     REQUIRE(S_error < tolerance);
   177 ADD_TEST(
"rcholesky2_schur",
"[multifrontal][parallel]")
   179   test<float>(1.0e-4f);
   180   test<double>(1.0e-8);
 Interface class for representing subranges of dense Matrix'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
Interface class for representing subranges of dense Vector's. 
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. 
static Matrix< Number > random(int I, int J)
Generates a random Matrix of specified size. 
Definition: Matrix.cpp:353
static SparseMatrix< Number > random(int I, int J, int N)
Generates a random SparseMatrix with size IxJ and (approximately) N nonzeros. 
Definition: SparseMatrix.cpp:493
Reduces a std::vector to its unique entries, and sorts it. 
General purpose compressed-sparse-column (CSC) container. 
Range construct for a lower triangular matrix stored in rectangular packed format. 
void sortunique(std::vector< T > &v)
Reduces a std::vector to its unique entries, and sorts it. 
Definition: sortunique.h:20
Specialized container for a lower triangular matrix, O(N^2/2) storage. Used by symmetry exploiting ma...
Routines for inner products of Vector's / VectorRange's. 
Various utility functions/classes related to scalar Number types. 
Returns a vector of int'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. 
Container for either a column vector or row vector (depends upon the usage context) ...
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. 
Convenience type for building SparseMatrix's, uses coordinate/triplet format. 
Definition: SparseMatrix.h:32
Sparse direct solver suitable for real symmetric positive definite systems. 
Definition: SparseRCholeskySolver.h:61
std::pair< int, int > size() const
Size inspector. 
Definition: Matrix.cpp:116
Convenience type for building SparseMatrix's, uses coordinate/triplet format. Note that SparseMatrixB...
CVectorRange< Number > vector(int j) const
Returns the j'th column as a VectorRange. 
Definition: Matrix.cpp:154
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. 
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's. 
|B'*inv(A)*B [dense] - B'*inv(A)*B [sparse]| = 1.26579e-07
|schur(B)-schur(BiBv)| = 1.50978e-07
|schur(Bi,Bv)-dot(L\Bv,L\Bv))| = 8.52305e-08
|C'*inv(A)*D [dense] - C'*inv(A)*D [sparse]| = 2.7761e-07
|schur(B,C)-schur(BiBv,CiCv)| = 1.49129e-07
|schur(Bi,Bv)-dot(L\Bv,L\Bv))| = 5.43625e-07
|B'*inv(A)*B [dense] - B'*inv(A)*B [sparse]| = 2.23428e-16
|schur(B)-schur(BiBv)| = 3.53397e-16
|schur(Bi,Bv)-dot(L\Bv,L\Bv))| = 6.16227e-16
|C'*inv(A)*D [dense] - C'*inv(A)*D [sparse]| = 6.0128e-16
|schur(B,C)-schur(BiBv,CiCv)| = 4.09679e-16
|schur(Bi,Bv)-dot(L\Bv,L\Bv))| = 2.09545e-16