]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // Copyright (c) 2011 David Bellot |
2 | // | |
3 | // Distributed under the Boost Software License, Version 1.0. (See | |
4 | // accompanying file LICENSE_1_0.txt or copy at | |
5 | // http://www.boost.org/LICENSE_1_0.txt) | |
6 | ||
7 | #ifndef BOOST_UBLAS_NO_ELEMENT_PROXIES | |
8 | # define BOOST_UBLAS_NO_ELEMENT_PROXIES | |
9 | #endif | |
10 | ||
11 | #include <boost/numeric/ublas/assignment.hpp> | |
12 | #include <boost/numeric/ublas/matrix.hpp> | |
13 | #include <boost/numeric/ublas/matrix_sparse.hpp> | |
14 | #include <boost/numeric/ublas/matrix_expression.hpp> | |
15 | #include <boost/numeric/ublas/io.hpp> | |
16 | #include "common/testhelper.hpp" | |
17 | #include "utils.hpp" | |
18 | ||
19 | using std::cout; | |
20 | using std::endl; | |
21 | ||
22 | const double TOL = 1e-15; | |
23 | ||
24 | template<typename T> | |
25 | bool check_sortedness(const boost::numeric::ublas::coordinate_matrix<T>& matrix) { | |
26 | bool result = true; | |
27 | typedef boost::numeric::ublas::coordinate_matrix<T> matrix_type; | |
28 | typename matrix_type::index_array_type i1 = matrix.index1_data(); | |
29 | typename matrix_type::index_array_type i2 = matrix.index2_data(); | |
30 | typename matrix_type::array_size_type size = matrix.filled(); | |
31 | ||
32 | for (typename matrix_type::array_size_type i = 0; i + 1 < size && result; ++ i) { | |
33 | result &= ( (i1[i] < i1[i + 1]) || | |
34 | ((i1[i] == i1[i]) && | |
35 | (i2[i] < i2[i + 1])) ); | |
36 | ||
37 | } | |
38 | return result; | |
39 | } | |
40 | ||
41 | void print_entries(size_t size_x, size_t size_y, | |
42 | const std::vector<std::pair<size_t, size_t> >& entries) | |
43 | { | |
44 | std::cerr << "Error - Size:" << size_x << " x " << size_y << ". Entries: "; | |
45 | for (size_t i = 0; i < entries.size(); ++ i) { | |
46 | std::cerr << entries[i].first << ", " << entries[i].second << "; "; | |
47 | } | |
48 | std::cerr << "\n"; | |
49 | } | |
50 | ||
51 | ||
52 | BOOST_UBLAS_TEST_DEF( test_coordinate_matrix_inplace_merge_random ) | |
53 | { | |
54 | const size_t max_repeats = 100; | |
55 | const size_t max_size = 100; | |
56 | const size_t dim_var = 10; | |
57 | const size_t nr_entries = 10; | |
58 | ||
59 | for (size_t repeats = 1; repeats < max_repeats; ++repeats ) { | |
60 | for (size_t size = 1; size < max_size; size += 5) { | |
61 | size_t size_x = size + rand() % dim_var; | |
62 | size_t size_y = size + rand() % dim_var; | |
63 | ||
64 | boost::numeric::ublas::coordinate_matrix<double> matrix_coord(size_x, size_y); | |
65 | boost::numeric::ublas::matrix<double> matrix_dense(size_x, size_y, 0); | |
66 | ||
67 | matrix_coord.sort(); | |
68 | ||
69 | std::vector<std::pair<size_t, size_t> > entries; | |
70 | for (size_t entry = 0; entry < nr_entries; ++ entry) { | |
71 | int x = rand() % size_x; | |
72 | int y = rand() % size_y; | |
73 | entries.push_back(std::make_pair(x, y)); | |
74 | matrix_coord.append_element(x, y, 1); | |
75 | matrix_dense(x, y) += 1; | |
76 | } | |
77 | matrix_coord.sort(); | |
78 | ||
79 | { | |
80 | bool sorted = check_sortedness(matrix_coord); | |
92f5a8d4 | 81 | bool identical = compare_distance(matrix_coord, matrix_dense, TOL); |
7c673cae FG |
82 | if (!(sorted && identical)) { |
83 | print_entries(size_x, size_y, entries); | |
84 | } | |
85 | BOOST_UBLAS_TEST_CHECK( check_sortedness(matrix_coord) ); | |
92f5a8d4 | 86 | BOOST_UBLAS_TEST_CHECK( compare_distance(matrix_coord, matrix_dense, TOL) ); |
7c673cae FG |
87 | } |
88 | ||
89 | for (size_t entry = 0; entry < nr_entries; ++ entry) { | |
90 | int x = rand() % size_x; | |
91 | int y = rand() % size_y; | |
92 | entries.push_back(std::make_pair(x, y)); | |
93 | matrix_coord(x, y) += 1; | |
94 | matrix_dense(x, y) += 1; | |
95 | matrix_coord.sort(); | |
96 | } | |
97 | ||
98 | { | |
99 | bool sorted = check_sortedness(matrix_coord); | |
92f5a8d4 | 100 | bool identical = compare_distance(matrix_coord, matrix_dense, TOL); |
7c673cae FG |
101 | if (!(sorted && identical)) { |
102 | print_entries(size_x, size_y, entries); | |
103 | } | |
104 | BOOST_UBLAS_TEST_CHECK( sorted ); | |
105 | BOOST_UBLAS_TEST_CHECK( identical ); | |
106 | } | |
107 | } | |
108 | } | |
109 | } | |
110 | ||
111 | int main() | |
112 | { | |
113 | BOOST_UBLAS_TEST_BEGIN(); | |
114 | ||
115 | BOOST_UBLAS_TEST_DO( test_coordinate_matrix_inplace_merge_random ); | |
116 | ||
117 | BOOST_UBLAS_TEST_END(); | |
7c673cae | 118 | } |