| 1 | // Test cases for supporting serialization in boost::numeric::ublas::symmetrix_matrix.
|
|---|
| 2 | // =====================================================================
|
|---|
| 3 | // In response to https://svn.boost.org/trac/boost/ticket/10045
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 | // Author
|
|---|
| 7 | // ==============
|
|---|
| 8 | // Shivam Mittal
|
|---|
| 9 | // Email - 2015csb1032@iitrpr.ac.in
|
|---|
| 10 | // Github profile - github.com/shivam5
|
|---|
| 11 | // Date - 2nd April 2017
|
|---|
| 12 |
|
|---|
| 13 |
|
|---|
| 14 | // Should be placed in ublas/test/
|
|---|
| 15 |
|
|---|
| 16 | // Compiling
|
|---|
| 17 | // ==========
|
|---|
| 18 |
|
|---|
| 19 | // g++ -I <path to modular_boost> test_symmetric_matrix_serialization.cpp -L<path to installed libraries (stage/lib)> -static -lboost_serialization
|
|---|
| 20 |
|
|---|
| 21 | // Example (my computer):
|
|---|
| 22 | // g++ -I /home/shivam/Desktop/boost/modular_boost/ test_symmetric_matrix_serialization.cpp -L/home/shivam/Desktop/boost/modular_boost/stage/lib -static -lboost_serialization
|
|---|
| 23 |
|
|---|
| 24 | // Running
|
|---|
| 25 | // ==========
|
|---|
| 26 | // ./a.out
|
|---|
| 27 |
|
|---|
| 28 |
|
|---|
| 29 | #include <boost/numeric/ublas/io.hpp>
|
|---|
| 30 | #include <boost/numeric/ublas/symmetric.hpp>
|
|---|
| 31 | #include <iostream>
|
|---|
| 32 | #include <fstream>
|
|---|
| 33 | #include <string>
|
|---|
| 34 | #include <boost/archive/text_iarchive.hpp>
|
|---|
| 35 | #include <boost/archive/text_oarchive.hpp>
|
|---|
| 36 | #include "common/testhelper.hpp"
|
|---|
| 37 | #include "utils.hpp"
|
|---|
| 38 |
|
|---|
| 39 | using namespace boost::numeric::ublas;
|
|---|
| 40 |
|
|---|
| 41 | #define N 200
|
|---|
| 42 |
|
|---|
| 43 | template <typename T, typename U>
|
|---|
| 44 | void save_smatrix(const symmetric_matrix<T,U> &s, const char * filename){
|
|---|
| 45 | std::ofstream ofs(filename);
|
|---|
| 46 | boost::archive::text_oarchive oa(ofs);
|
|---|
| 47 | oa << s;
|
|---|
| 48 | }
|
|---|
| 49 |
|
|---|
| 50 | template <typename T, typename U>
|
|---|
| 51 | void load_smatrix(symmetric_matrix<T,U> &s, const char * filename){
|
|---|
| 52 | std::ifstream ifs(filename);
|
|---|
| 53 | boost::archive::text_iarchive ia(ifs);
|
|---|
| 54 | ia >> s;
|
|---|
| 55 | }
|
|---|
| 56 |
|
|---|
| 57 |
|
|---|
| 58 | template <class T>
|
|---|
| 59 | bool check(int size = 3) {
|
|---|
| 60 | bool pass = true;
|
|---|
| 61 |
|
|---|
| 62 | std::string filename = "filename";
|
|---|
| 63 |
|
|---|
| 64 | symmetric_matrix<T, lower> ml (size, size);
|
|---|
| 65 | symmetric_matrix<T, upper> mu (size, size);
|
|---|
| 66 | symmetric_matrix<T, lower> ml2 (size, size);
|
|---|
| 67 | symmetric_matrix<T, upper> mu2 (size, size);
|
|---|
| 68 |
|
|---|
| 69 | for (unsigned i = 0; i < ml.size1 (); ++ i)
|
|---|
| 70 | for (unsigned j = 0; j <= i; ++ j)
|
|---|
| 71 | ml (i, j) = (size * i + j);
|
|---|
| 72 |
|
|---|
| 73 | for (unsigned i = 0; i < mu.size1 (); ++ i)
|
|---|
| 74 | for (unsigned j = i; j < mu.size2 (); ++ j)
|
|---|
| 75 | mu (i, j) = (size * i + j);
|
|---|
| 76 |
|
|---|
| 77 |
|
|---|
| 78 | save_smatrix <T, lower> (ml, filename.c_str());
|
|---|
| 79 | load_smatrix <T, lower>(ml2, filename.c_str());
|
|---|
| 80 | pass &= compare(ml, ml2);
|
|---|
| 81 |
|
|---|
| 82 | save_smatrix <T, upper> (mu, filename.c_str());
|
|---|
| 83 | load_smatrix <T, upper>(mu2, filename.c_str());
|
|---|
| 84 | pass &= compare(mu, mu2);
|
|---|
| 85 |
|
|---|
| 86 |
|
|---|
| 87 | for (unsigned i = 0; i < ml.size1 (); ++ i)
|
|---|
| 88 | for (unsigned j = 0; j <= i; ++ j)
|
|---|
| 89 | ml (i, j) = j * i + j;
|
|---|
| 90 |
|
|---|
| 91 | for (unsigned i = 0; i < mu.size1 (); ++ i)
|
|---|
| 92 | for (unsigned j = i; j < mu.size2 (); ++ j)
|
|---|
| 93 | mu (i, j) = (j+i) * i + j;
|
|---|
| 94 |
|
|---|
| 95 |
|
|---|
| 96 | save_smatrix <T, lower> (ml, filename.c_str());
|
|---|
| 97 | load_smatrix <T, lower>(ml2, filename.c_str());
|
|---|
| 98 | pass &= compare(ml, ml2);
|
|---|
| 99 |
|
|---|
| 100 | save_smatrix <T, upper> (mu, filename.c_str());
|
|---|
| 101 | load_smatrix <T, upper>(mu2, filename.c_str());
|
|---|
| 102 | pass &= compare(mu, mu2);
|
|---|
| 103 |
|
|---|
| 104 |
|
|---|
| 105 | return pass;
|
|---|
| 106 | }
|
|---|
| 107 |
|
|---|
| 108 |
|
|---|
| 109 | BOOST_UBLAS_TEST_DEF (check_mat_int) {
|
|---|
| 110 | BOOST_UBLAS_DEBUG_TRACE( "Checking serialization in integer symmetric matrices" );
|
|---|
| 111 | for (int i=1; i<N; i++)
|
|---|
| 112 | BOOST_UBLAS_TEST_CHECK(check<int> (i));
|
|---|
| 113 | }
|
|---|
| 114 |
|
|---|
| 115 | BOOST_UBLAS_TEST_DEF (check_mat_uint) {
|
|---|
| 116 | BOOST_UBLAS_DEBUG_TRACE( "Checking serialization in unsigned integer symmetric matrices" );
|
|---|
| 117 | for (int i=1; i<N; i++)
|
|---|
| 118 | BOOST_UBLAS_TEST_CHECK(check<unsigned int> (i));
|
|---|
| 119 | }
|
|---|
| 120 |
|
|---|
| 121 | BOOST_UBLAS_TEST_DEF (check_mat_long) {
|
|---|
| 122 | BOOST_UBLAS_DEBUG_TRACE( "Checking serialization in long symmetric matrices" );
|
|---|
| 123 | for (int i=1; i<N; i++)
|
|---|
| 124 | BOOST_UBLAS_TEST_CHECK(check<long> (i));
|
|---|
| 125 | }
|
|---|
| 126 |
|
|---|
| 127 | BOOST_UBLAS_TEST_DEF (check_mat_ulong) {
|
|---|
| 128 | BOOST_UBLAS_DEBUG_TRACE( "Checking serialization in unsigned integer symmetric matrices" );
|
|---|
| 129 | for (int i=1; i<N; i++)
|
|---|
| 130 | BOOST_UBLAS_TEST_CHECK(check<unsigned long> (i));
|
|---|
| 131 | }
|
|---|
| 132 |
|
|---|
| 133 | BOOST_UBLAS_TEST_DEF (check_mat_float) {
|
|---|
| 134 | BOOST_UBLAS_DEBUG_TRACE( "Checking serialization in float symmetric matrices" );
|
|---|
| 135 | for (int i=1; i<N; i++)
|
|---|
| 136 | BOOST_UBLAS_TEST_CHECK(check<float> (i));
|
|---|
| 137 | }
|
|---|
| 138 |
|
|---|
| 139 | BOOST_UBLAS_TEST_DEF (check_mat_double) {
|
|---|
| 140 | BOOST_UBLAS_DEBUG_TRACE( "Checking serialization in double symmetric matrices" );
|
|---|
| 141 | for (int i=1; i<N; i++)
|
|---|
| 142 | BOOST_UBLAS_TEST_CHECK(check<double> (i));
|
|---|
| 143 | }
|
|---|
| 144 |
|
|---|
| 145 | BOOST_UBLAS_TEST_DEF (check_mat_size_t) {
|
|---|
| 146 | BOOST_UBLAS_DEBUG_TRACE( "Checking serialization in size_t symmetric matrices" );
|
|---|
| 147 | for (int i=1; i<N; i++)
|
|---|
| 148 | BOOST_UBLAS_TEST_CHECK(check<size_t> (i));
|
|---|
| 149 | }
|
|---|
| 150 |
|
|---|
| 151 | BOOST_UBLAS_TEST_DEF (check_mat_char) {
|
|---|
| 152 | BOOST_UBLAS_DEBUG_TRACE( "Checking serialization in char symmetric matrices" );
|
|---|
| 153 | for (int i=1; i<N; i++)
|
|---|
| 154 | BOOST_UBLAS_TEST_CHECK(check<char> (i));
|
|---|
| 155 | }
|
|---|
| 156 |
|
|---|
| 157 |
|
|---|
| 158 | int main () {
|
|---|
| 159 | BOOST_UBLAS_TEST_BEGIN();
|
|---|
| 160 |
|
|---|
| 161 | BOOST_UBLAS_TEST_DO( check_mat_int );
|
|---|
| 162 | BOOST_UBLAS_TEST_DO( check_mat_uint );
|
|---|
| 163 | BOOST_UBLAS_TEST_DO( check_mat_long );
|
|---|
| 164 | BOOST_UBLAS_TEST_DO( check_mat_ulong );
|
|---|
| 165 | BOOST_UBLAS_TEST_DO( check_mat_float );
|
|---|
| 166 | BOOST_UBLAS_TEST_DO( check_mat_double );
|
|---|
| 167 | BOOST_UBLAS_TEST_DO( check_mat_size_t );
|
|---|
| 168 | BOOST_UBLAS_TEST_DO( check_mat_char );
|
|---|
| 169 |
|
|---|
| 170 | BOOST_UBLAS_TEST_END();
|
|---|
| 171 |
|
|---|
| 172 | return EXIT_SUCCESS;
|
|---|
| 173 | }
|
|---|