-
Notifications
You must be signed in to change notification settings - Fork 298
/
matrix_sparse.hpp
135 lines (108 loc) · 4.51 KB
/
matrix_sparse.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
//
// Copyright (c) 2009 Rutger ter Borg
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
#ifndef BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_SPARSE_HPP
#define BOOST_NUMERIC_BINDINGS_UBLAS_MATRIX_SPARSE_HPP
#include <Core/Utils/numeric/bindings/begin.hpp>
#include <Core/Utils/numeric/bindings/end.hpp>
#include <Core/Utils/numeric/bindings/detail/adaptor.hpp>
#include <Core/Utils/numeric/bindings/detail/copy_const.hpp>
#include <Core/Utils/numeric/bindings/ublas/detail/convert_to.hpp>
#include <Core/Utils/numeric/bindings/ublas/matrix_expression.hpp>
#include <Core/Utils/numeric/bindings/ublas/storage.hpp>
#include <boost/numeric/ublas/matrix_sparse.hpp>
namespace boost {
namespace numeric {
namespace bindings {
namespace detail {
template< typename T, typename F, std::size_t IB, typename IA, typename TA, typename Id, typename Enable >
struct adaptor< ublas::compressed_matrix< T, F, IB, IA, TA >, Id, Enable > {
typedef typename copy_const< Id, T >::type value_type;
typedef typename copy_const< Id, typename bindings::value_type<IA>::type >::type index_type;
typedef typename convert_to< tag::data_order, F >::type data_order;
typedef mpl::map<
mpl::pair< tag::value_type, value_type >,
mpl::pair< tag::index_type, index_type >,
mpl::pair< tag::entity, tag::matrix >,
mpl::pair< tag::size_type<1>, std::ptrdiff_t >,
mpl::pair< tag::size_type<2>, std::ptrdiff_t >,
mpl::pair< tag::matrix_type, tag::general >,
mpl::pair< tag::data_structure, tag::compressed_sparse >,
mpl::pair< tag::data_order, data_order >,
mpl::pair< tag::index_base, mpl::int_<IB> >
> property_map;
static std::ptrdiff_t size1( const Id& id ) {
return id.size1();
}
static std::ptrdiff_t size2( const Id& id ) {
return id.size2();
}
static value_type* begin_value( Id& id ) {
return bindings::begin_value( id.value_data() );
}
static value_type* end_value( Id& id ) {
return bindings::begin_value( id.value_data() ) + id.nnz();
}
static index_type* begin_compressed_index_major( Id& id ) {
return bindings::begin_value( id.index1_data() );
}
static index_type* end_compressed_index_major( Id& id ) {
return bindings::end_value( id.index1_data() );
}
static index_type* begin_index_minor( Id& id ) {
return bindings::begin_value( id.index2_data() );
}
static index_type* end_index_minor( Id& id ) {
return bindings::begin_value( id.index2_data() ) + id.nnz();
}
};
template< typename T, typename F, std::size_t IB, typename IA, typename TA, typename Id, typename Enable >
struct adaptor< ublas::coordinate_matrix< T, F, IB, IA, TA >, Id, Enable > {
typedef typename copy_const< Id, T >::type value_type;
typedef typename copy_const< Id, typename bindings::value_type<IA>::type >::type index_type;
typedef typename convert_to< tag::data_order, F >::type data_order;
typedef mpl::map<
mpl::pair< tag::value_type, value_type >,
mpl::pair< tag::index_type, index_type >,
mpl::pair< tag::entity, tag::matrix >,
mpl::pair< tag::size_type<1>, std::ptrdiff_t >,
mpl::pair< tag::size_type<2>, std::ptrdiff_t >,
mpl::pair< tag::matrix_type, tag::general >,
mpl::pair< tag::data_structure, tag::coordinate_sparse >,
mpl::pair< tag::data_order, data_order >,
mpl::pair< tag::index_base, mpl::int_<IB> >
> property_map;
static std::ptrdiff_t size1( const Id& id ) {
return id.size1();
}
static std::ptrdiff_t size2( const Id& id ) {
return id.size2();
}
static value_type* begin_value( Id& id ) {
return bindings::begin_value( id.value_data() );
}
static value_type* end_value( Id& id ) {
return bindings::begin_value( id.value_data() ) + id.nnz();
}
static index_type* begin_index_major( Id& id ) {
return bindings::begin_value( id.index1_data() );
}
static index_type* end_index_major( Id& id ) {
return bindings::begin_value( id.index1_data() ) + id.nnz();
}
static index_type* begin_index_minor( Id& id ) {
return bindings::begin_value( id.index2_data() );
}
static index_type* end_index_minor( Id& id ) {
return bindings::begin_value( id.index2_data() ) + id.nnz();
}
};
} // namespace detail
} // namespace bindings
} // namespace numeric
} // namespace boost
#endif