test/matrix_view.cc

Code
Comments
Other
Rev Date Author Line
4129 19 Jan 22 peter 1 // $Id$
4129 19 Jan 22 peter 2
4129 19 Jan 22 peter 3 /*
4207 26 Aug 22 peter 4   Copyright (C) 2022 Peter Johansson
4129 19 Jan 22 peter 5
4129 19 Jan 22 peter 6   This file is part of the yat library, https://dev.thep.lu.se/yat
4129 19 Jan 22 peter 7
4129 19 Jan 22 peter 8   The yat library is free software; you can redistribute it and/or
4129 19 Jan 22 peter 9   modify it under the terms of the GNU General Public License as
4129 19 Jan 22 peter 10   published by the Free Software Foundation; either version 3 of the
4129 19 Jan 22 peter 11   License, or (at your option) any later version.
4129 19 Jan 22 peter 12
4129 19 Jan 22 peter 13   The yat library is distributed in the hope that it will be useful,
4129 19 Jan 22 peter 14   but WITHOUT ANY WARRANTY; without even the implied warranty of
4129 19 Jan 22 peter 15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4129 19 Jan 22 peter 16   General Public License for more details.
4129 19 Jan 22 peter 17
4129 19 Jan 22 peter 18   You should have received a copy of the GNU General Public License
4129 19 Jan 22 peter 19   along with yat. If not, see <https://www.gnu.org/licenses/>.
4129 19 Jan 22 peter 20 */
4129 19 Jan 22 peter 21
4129 19 Jan 22 peter 22 #include <config.h>
4129 19 Jan 22 peter 23
4129 19 Jan 22 peter 24 #include "Suite.h"
4129 19 Jan 22 peter 25
4132 21 Jan 22 peter 26 #include "yat/utility/concept_check.h"
4129 19 Jan 22 peter 27 #include "yat/utility/Matrix.h"
4129 19 Jan 22 peter 28 #include "yat/utility/MatrixConstView.h"
4129 19 Jan 22 peter 29 #include "yat/utility/MatrixView.h"
4129 19 Jan 22 peter 30
4132 21 Jan 22 peter 31 #include <boost/concept_check.hpp>
4132 21 Jan 22 peter 32
4129 19 Jan 22 peter 33 using namespace theplu::yat;
4129 19 Jan 22 peter 34
4129 19 Jan 22 peter 35 void test_matrix_view(test::Suite& suite);
4129 19 Jan 22 peter 36 void test_matrix_const_view(test::Suite& suite);
4129 19 Jan 22 peter 37
4129 19 Jan 22 peter 38 int main(int argc, char* argv[])
4129 19 Jan 22 peter 39 {
4129 19 Jan 22 peter 40   test::Suite suite(argc, argv);
4129 19 Jan 22 peter 41   test_matrix_view(suite);
4129 19 Jan 22 peter 42   test_matrix_const_view(suite);
4129 19 Jan 22 peter 43   return suite.return_value();
4129 19 Jan 22 peter 44 }
4129 19 Jan 22 peter 45
4129 19 Jan 22 peter 46
4129 19 Jan 22 peter 47 template<class VIEW>
4129 19 Jan 22 peter 48 void test_constructors(test::Suite& suite, utility::Matrix m)
4129 19 Jan 22 peter 49 {
4129 19 Jan 22 peter 50   VIEW view;
4129 19 Jan 22 peter 51   VIEW view2(view);
4129 19 Jan 22 peter 52   suite.out() << "matrix:\n" << m << "\n";
4129 19 Jan 22 peter 53   VIEW view3(m);
4129 19 Jan 22 peter 54   if (view3 != m) {
4129 19 Jan 22 peter 55     suite.add(false);
4129 19 Jan 22 peter 56     suite.err() << "view3 != m\n";
4129 19 Jan 22 peter 57   }
4129 19 Jan 22 peter 58   VIEW view4(view3);
4129 19 Jan 22 peter 59   if (view4 != view3) {
4129 19 Jan 22 peter 60     suite.add(false);
4129 19 Jan 22 peter 61     suite.err() << "view4 != view3\n";
4129 19 Jan 22 peter 62   }
4129 19 Jan 22 peter 63   m(0,0) = 3.1415;
4129 19 Jan 22 peter 64   if (view4 != m) {
4129 19 Jan 22 peter 65     suite.add(false);
4129 19 Jan 22 peter 66     suite.err() << "view4 != m\n";
4129 19 Jan 22 peter 67   }
4129 19 Jan 22 peter 68
4129 19 Jan 22 peter 69   VIEW view5(m, 2, 3, 3, 4);
4129 19 Jan 22 peter 70   if (view5.rows() != 3) {
4129 19 Jan 22 peter 71     suite.add(false);
4129 19 Jan 22 peter 72     suite.err() << "view5: incorrect rows: " << view5.rows() << "\n";
4129 19 Jan 22 peter 73   }
4129 19 Jan 22 peter 74   if (view5.columns() != 4) {
4129 19 Jan 22 peter 75     suite.add(false);
4129 19 Jan 22 peter 76     suite.err() << "view5: incorrect columns: " << view5.columns() << "\n";
4129 19 Jan 22 peter 77   }
4129 19 Jan 22 peter 78   for (size_t row = 0; row<view5.rows(); ++row)
4129 19 Jan 22 peter 79     for (size_t col = 0; col<view5.columns(); ++col) {
4129 19 Jan 22 peter 80       if (view5(row, col) != m(2+row, 3+col)) {
4129 19 Jan 22 peter 81         suite.add(false);
4129 19 Jan 22 peter 82         suite.err() << "incorrect view5:" << view5 << "\n";
4129 19 Jan 22 peter 83       }
4129 19 Jan 22 peter 84     }
4129 19 Jan 22 peter 85
4129 19 Jan 22 peter 86   // construct a matrix copy of a view and test that it's not linked
4129 19 Jan 22 peter 87   utility::Matrix m2(view5);
4129 19 Jan 22 peter 88   if (m2 != view5) {
4129 19 Jan 22 peter 89     suite.add(false);
4129 19 Jan 22 peter 90     suite.err() << "m2 != view5:\nm2:\n" << m2 << "\nview5:\n" << view5
4129 19 Jan 22 peter 91                 << "\n";
4129 19 Jan 22 peter 92   }
4129 19 Jan 22 peter 93   m2(0,0) = -1;
4129 19 Jan 22 peter 94   if (view5(0, 0) == -1) {
4129 19 Jan 22 peter 95     suite.err() << "view5(0,0) = -1\n";
4129 19 Jan 22 peter 96   }
4129 19 Jan 22 peter 97 }
4129 19 Jan 22 peter 98
4129 19 Jan 22 peter 99
4129 19 Jan 22 peter 100 template<class VIEW>
4129 19 Jan 22 peter 101 void test_assignment(test::Suite& suite, utility::Matrix m)
4129 19 Jan 22 peter 102 {
4129 19 Jan 22 peter 103   utility::Matrix m0(m.rows(), m.columns(), 0.0);
4129 19 Jan 22 peter 104   VIEW view(m0);
4129 19 Jan 22 peter 105   view = m;
4129 19 Jan 22 peter 106   if (!suite.add(suite.equal_matrix(m, view))) {
4129 19 Jan 22 peter 107     suite.err() << "view != m\n";
4129 19 Jan 22 peter 108   }
4129 19 Jan 22 peter 109   if (!suite.add(suite.equal_matrix(m, m0))) {
4129 19 Jan 22 peter 110     suite.err() << "m != m0\n";
4129 19 Jan 22 peter 111   }
4129 19 Jan 22 peter 112
4129 19 Jan 22 peter 113   utility::Matrix m2(2,2,1.0);
4129 19 Jan 22 peter 114   VIEW view1(m, 1, 1, m2.rows(), m2.columns());
4129 19 Jan 22 peter 115   VIEW view2(m, 1, 1, m2.rows(), m2.columns());
4129 19 Jan 22 peter 116   view2 = m2;
4129 19 Jan 22 peter 117   if (!suite.add(suite.equal_matrix(view1, view2))) {
4129 19 Jan 22 peter 118     suite.err() << "view1 != view2 after = m2\n";
4129 19 Jan 22 peter 119   }
4129 19 Jan 22 peter 120   view2 = m2 + m2;
4129 19 Jan 22 peter 121   if (!suite.add(suite.equal_matrix(view1, view2))) {
4129 19 Jan 22 peter 122     suite.err() << "view1 != view2 after = m2 + m2\n";
4129 19 Jan 22 peter 123   }
4129 19 Jan 22 peter 124   view2 += m2*m2;
4129 19 Jan 22 peter 125   if (!suite.add(suite.equal_matrix(view1, view2))) {
4129 19 Jan 22 peter 126     suite.err() << "view1 != view2 after += m2*m2\n";
4129 19 Jan 22 peter 127   }
4129 19 Jan 22 peter 128   view2 -= m2*m2;
4129 19 Jan 22 peter 129   if (!suite.add(suite.equal_matrix(view1, view2))) {
4129 19 Jan 22 peter 130     suite.err() << "view1 != view2 after -= m2*m2\n";
4129 19 Jan 22 peter 131   }
4129 19 Jan 22 peter 132   view2 *= 1.2;
4129 19 Jan 22 peter 133   if (!suite.add(suite.equal_matrix(view1, view2))) {
4129 19 Jan 22 peter 134     suite.err() << "view1 != view2 after *= 1.2\n";
4129 19 Jan 22 peter 135   }
4129 19 Jan 22 peter 136
4129 19 Jan 22 peter 137   // create views that overlap with view
4129 19 Jan 22 peter 138   VIEW view3(m, 1, 5, 2, 2);
4129 19 Jan 22 peter 139   utility::Matrix copy3(view3);
4129 19 Jan 22 peter 140   VIEW view4(m, 2, 6, 2, 2);
4129 19 Jan 22 peter 141   suite.out() << "m:\n" << m << "\n";
4129 19 Jan 22 peter 142   suite.out() << "copy3:\n" << copy3 << "\n";
4129 19 Jan 22 peter 143   suite.out() << "view3:\n" << view3 << "\n";
4129 19 Jan 22 peter 144   suite.out() << "view4:\n" << view4 << "\n";
4129 19 Jan 22 peter 145   view4 = view3;
4129 19 Jan 22 peter 146   suite.add(suite.equal_matrix(view4, copy3));
4129 19 Jan 22 peter 147 }
4129 19 Jan 22 peter 148
4129 19 Jan 22 peter 149
4131 21 Jan 22 peter 150 template<class VIEW>
4131 21 Jan 22 peter 151 void test_iterators(test::Suite& suite, utility::Matrix m)
4131 21 Jan 22 peter 152 {
4131 21 Jan 22 peter 153   suite.out () << __func__ << "\n";
4131 21 Jan 22 peter 154   size_t n1 = 2;
4131 21 Jan 22 peter 155   size_t n2 = 4;
4131 21 Jan 22 peter 156   VIEW view(m, 1, 3, n1, n2);
4131 21 Jan 22 peter 157
4131 21 Jan 22 peter 158   suite.test_random_access_iterator(view.begin());
4131 21 Jan 22 peter 159   suite.test_random_access_iterator(view.begin_row(0));
4131 21 Jan 22 peter 160   suite.test_random_access_iterator(view.begin_column(0));
4131 21 Jan 22 peter 161
4131 21 Jan 22 peter 162   suite.out() << "testing ::row_iterator\n";
4131 21 Jan 22 peter 163   size_t n = view.end_row(0) - view.begin_row(0);
4131 21 Jan 22 peter 164   if (n != n2) {
4131 21 Jan 22 peter 165     suite.add(false);
4131 21 Jan 22 peter 166     suite.err() << "end - begin: " << n << "; expected " << n2 << "\n";
4131 21 Jan 22 peter 167   }
4131 21 Jan 22 peter 168   if (view.begin_row(0)[1] != view(0,1)) {
4131 21 Jan 22 peter 169     suite.add(false);
4131 21 Jan 22 peter 170     suite.err() << "error: view.begin_row(0)[1]: " << view.begin_row(0)[1]
4131 21 Jan 22 peter 171                 << "; expected: " << view(0,1) << "\n";
4131 21 Jan 22 peter 172   }
4131 21 Jan 22 peter 173
4131 21 Jan 22 peter 174   suite.out() << "testing ::column_iterator\n";
4131 21 Jan 22 peter 175   n = view.end_column(0) - view.begin_column(0);
4131 21 Jan 22 peter 176   if (n != n1) {
4131 21 Jan 22 peter 177     suite.add(false);
4131 21 Jan 22 peter 178     suite.err() << "end - begin: " << n << "; expected " << n1 << "\n";
4131 21 Jan 22 peter 179   }
4131 21 Jan 22 peter 180   if (view.begin_column(0)[1] != view(1,0)) {
4131 21 Jan 22 peter 181     suite.add(false);
4131 21 Jan 22 peter 182     suite.err() << "error: view.begin_column(0)[1]: " << view.begin_column(0)[1]
4131 21 Jan 22 peter 183                 << "; expected: " << view(1,0) << "\n";
4131 21 Jan 22 peter 184   }
4131 21 Jan 22 peter 185
4131 21 Jan 22 peter 186   suite.out() << "testing ::iterator\n";
4131 21 Jan 22 peter 187   n = view.end() - view.begin();
4131 21 Jan 22 peter 188   if (n != n1*n2) {
4131 21 Jan 22 peter 189     suite.add(false);
4131 21 Jan 22 peter 190     suite.err() << "end - begin: " << n << "; expected " << n1*n2 << "\n";
4131 21 Jan 22 peter 191   }
4131 21 Jan 22 peter 192   if (view.begin()[n2] != view(1,0)) {
4131 21 Jan 22 peter 193     suite.add(false);
4131 21 Jan 22 peter 194     suite.err() << "error: view.begin(n2)[1]: " << view.begin()[n2]
4131 21 Jan 22 peter 195                 << "; expected: " << view(1,0) << "\n";
4131 21 Jan 22 peter 196   }
4131 21 Jan 22 peter 197 }
4131 21 Jan 22 peter 198
4131 21 Jan 22 peter 199
4137 21 Jan 22 peter 200 utility::MatrixView make_view(utility::Matrix& m)
4137 21 Jan 22 peter 201 {
4137 21 Jan 22 peter 202   return utility::MatrixView(m);
4137 21 Jan 22 peter 203 }
4137 21 Jan 22 peter 204
4137 21 Jan 22 peter 205
4129 19 Jan 22 peter 206 void test_matrix_view(test::Suite& suite)
4129 19 Jan 22 peter 207 {
4132 21 Jan 22 peter 208   BOOST_CONCEPT_ASSERT((utility::Mutable_Container2D<utility::MatrixView>));
4129 19 Jan 22 peter 209   suite.out() << "=== " << __func__ << "===\n";
4129 19 Jan 22 peter 210   using utility::MatrixView;
4129 19 Jan 22 peter 211   // test constructors
4129 19 Jan 22 peter 212   utility::Matrix m(5, 10);
4129 19 Jan 22 peter 213   for (size_t i=0; i<m.rows(); ++i)
4129 19 Jan 22 peter 214     for (size_t j=0; j<m.columns(); ++j)
4129 19 Jan 22 peter 215       m(i,j) = 10*i + j;
4129 19 Jan 22 peter 216
4129 19 Jan 22 peter 217   test_constructors<MatrixView>(suite, m);
4129 19 Jan 22 peter 218   test_assignment<MatrixView>(suite, m);
4131 21 Jan 22 peter 219   test_iterators<MatrixView>(suite, m);
4137 21 Jan 22 peter 220   MatrixView view = make_view(m);
4141 01 Feb 22 peter 221
4129 19 Jan 22 peter 222 }
4129 19 Jan 22 peter 223
4129 19 Jan 22 peter 224
4137 21 Jan 22 peter 225 utility::MatrixConstView make_const_view(const utility::Matrix& m)
4137 21 Jan 22 peter 226 {
4137 21 Jan 22 peter 227   return utility::MatrixConstView(m);
4137 21 Jan 22 peter 228 }
4137 21 Jan 22 peter 229
4137 21 Jan 22 peter 230
4129 19 Jan 22 peter 231 void test_matrix_const_view(test::Suite& suite)
4129 19 Jan 22 peter 232 {
4132 21 Jan 22 peter 233   BOOST_CONCEPT_ASSERT((utility::Container2D<utility::MatrixConstView>));
4129 19 Jan 22 peter 234   suite.out() << "=== " << __func__ << "===\n";
4129 19 Jan 22 peter 235   using utility::MatrixConstView;
4129 19 Jan 22 peter 236   // test constructors
4129 19 Jan 22 peter 237   utility::Matrix m(5, 10);
4129 19 Jan 22 peter 238   for (size_t i=0; i<m.rows(); ++i)
4129 19 Jan 22 peter 239     for (size_t j=0; j<m.columns(); ++j)
4129 19 Jan 22 peter 240       m(i,j) = 10*i + j;
4129 19 Jan 22 peter 241   test_constructors<MatrixConstView>(suite, m);
4131 21 Jan 22 peter 242   test_iterators<MatrixConstView>(suite, m);
4137 21 Jan 22 peter 243
4137 21 Jan 22 peter 244   MatrixConstView view = make_const_view(m);
4141 01 Feb 22 peter 245
4141 01 Feb 22 peter 246   std::vector<double> vec(100,0);
4141 01 Feb 22 peter 247   for (size_t i=0; i<vec.size(); ++i)
4141 01 Feb 22 peter 248     vec[i] = i;
4141 01 Feb 22 peter 249   utility::Matrix correct(4, 5);
4141 01 Feb 22 peter 250   for (size_t i=0; i<correct.rows(); ++i)
4141 01 Feb 22 peter 251     for (size_t j=0; j<correct.columns(); ++j)
4141 01 Feb 22 peter 252       correct(i,j) = 5*i + j;
4141 01 Feb 22 peter 253   MatrixConstView view2(&vec.front(), 4, 5);
4141 01 Feb 22 peter 254   if (!suite.equal_matrix(view2, correct)) {
4141 01 Feb 22 peter 255     suite.add(false);
4141 01 Feb 22 peter 256     suite.err() << "error: view2 not equal correct\n";
4141 01 Feb 22 peter 257     suite.err() << "view2:\n" << view2 << "\ncorrect:\n" << correct << "\n";
4141 01 Feb 22 peter 258   }
4141 01 Feb 22 peter 259
4141 01 Feb 22 peter 260   size_t tda = 10;
4141 01 Feb 22 peter 261   MatrixConstView view3(&vec.front(), 4, 5, tda);
4141 01 Feb 22 peter 262   for (size_t i=0; i<correct.rows(); ++i)
4141 01 Feb 22 peter 263     for (size_t j=0; j<correct.columns(); ++j)
4141 01 Feb 22 peter 264       correct(i,j) = tda*i + j;
4141 01 Feb 22 peter 265   if (!suite.equal_matrix(view3, correct)) {
4141 01 Feb 22 peter 266     suite.add(false);
4141 01 Feb 22 peter 267     suite.err() << "error: view3 not equal correct\n";
4141 01 Feb 22 peter 268     suite.err() << "view3:\n" << view3 << "\ncorrect:\n" << correct << "\n";
4141 01 Feb 22 peter 269   }
4141 01 Feb 22 peter 270
4141 01 Feb 22 peter 271   MatrixConstView view4(correct.gsl_matrix_p());
4141 01 Feb 22 peter 272   if (!suite.equal_matrix(view4, correct)) {
4141 01 Feb 22 peter 273     suite.add(false);
4141 01 Feb 22 peter 274     suite.err() << "error: view4 not equal correct\n";
4141 01 Feb 22 peter 275     suite.err() << "view4:\n" << view4 << "\ncorrect:\n" << correct << "\n";
4141 01 Feb 22 peter 276   }
4129 19 Jan 22 peter 277 }