annotate DEPENDENCIES/generic/include/boost/numeric/odeint/util/ublas_wrapper.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
rev   line source
Chris@16 1 /*
Chris@16 2 [auto_generated]
Chris@16 3 boost/numeric/odeint/util/ublas_wrapper.hpp
Chris@16 4
Chris@16 5 [begin_description]
Chris@16 6 Resizing for ublas::vector and ublas::matrix
Chris@16 7 [end_description]
Chris@16 8
Chris@16 9 Copyright 2009-2011 Karsten Ahnert
Chris@16 10 Copyright 2009-2011 Mario Mulansky
Chris@16 11
Chris@16 12 Distributed under the Boost Software License, Version 1.0.
Chris@16 13 (See accompanying file LICENSE_1_0.txt or
Chris@16 14 copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 15 */
Chris@16 16
Chris@16 17
Chris@16 18 #ifndef BOOST_NUMERIC_ODEINT_UTIL_UBLAS_WRAPPER_HPP_INCLUDED
Chris@16 19 #define BOOST_NUMERIC_ODEINT_UTIL_UBLAS_WRAPPER_HPP_INCLUDED
Chris@16 20
Chris@16 21
Chris@16 22 #include <boost/type_traits/integral_constant.hpp>
Chris@16 23 #include <boost/numeric/ublas/vector.hpp>
Chris@16 24 #include <boost/numeric/ublas/matrix.hpp>
Chris@16 25 #include <boost/numeric/ublas/lu.hpp>
Chris@16 26
Chris@16 27 #include <boost/numeric/odeint/util/is_resizeable.hpp>
Chris@16 28 #include <boost/numeric/odeint/util/state_wrapper.hpp>
Chris@16 29
Chris@16 30 namespace boost {
Chris@16 31 namespace numeric {
Chris@16 32 namespace odeint {
Chris@16 33
Chris@16 34 /*
Chris@16 35 * resizeable specialization for boost::numeric::ublas::vector
Chris@16 36 */
Chris@16 37 template< class T , class A >
Chris@16 38 struct is_resizeable< boost::numeric::ublas::vector< T , A > >
Chris@16 39 {
Chris@16 40 typedef boost::true_type type;
Chris@16 41 const static bool value = type::value;
Chris@16 42 };
Chris@16 43
Chris@16 44
Chris@16 45 /*
Chris@16 46 * resizeable specialization for boost::numeric::ublas::matrix
Chris@16 47 */
Chris@16 48 template< class T , class L , class A >
Chris@16 49 struct is_resizeable< boost::numeric::ublas::matrix< T , L , A > >
Chris@16 50 {
Chris@16 51 typedef boost::true_type type;
Chris@16 52 const static bool value = type::value;
Chris@16 53 };
Chris@16 54
Chris@16 55
Chris@16 56 /*
Chris@16 57 * resizeable specialization for boost::numeric::ublas::permutation_matrix
Chris@16 58 */
Chris@16 59 template< class T , class A >
Chris@16 60 struct is_resizeable< boost::numeric::ublas::permutation_matrix< T , A > >
Chris@16 61 {
Chris@16 62 typedef boost::true_type type;
Chris@16 63 const static bool value = type::value;
Chris@16 64 };
Chris@16 65
Chris@16 66
Chris@16 67 // specialization for ublas::matrix
Chris@16 68 // same size and resize specialization for matrix-matrix resizing
Chris@16 69 template< class T , class L , class A , class T2 , class L2 , class A2 >
Chris@16 70 struct same_size_impl< boost::numeric::ublas::matrix< T , L , A > , boost::numeric::ublas::matrix< T2 , L2 , A2 > >
Chris@16 71 {
Chris@16 72 static bool same_size( const boost::numeric::ublas::matrix< T , L , A > &m1 ,
Chris@16 73 const boost::numeric::ublas::matrix< T2 , L2 , A2 > &m2 )
Chris@16 74 {
Chris@16 75 return ( ( m1.size1() == m2.size1() ) && ( m1.size2() == m2.size2() ) );
Chris@16 76 }
Chris@16 77 };
Chris@16 78
Chris@16 79 template< class T , class L , class A , class T2 , class L2 , class A2 >
Chris@16 80 struct resize_impl< boost::numeric::ublas::matrix< T , L , A > , boost::numeric::ublas::matrix< T2 , L2 , A2 > >
Chris@16 81 {
Chris@16 82 static void resize( boost::numeric::ublas::matrix< T , L , A > &m1 ,
Chris@16 83 const boost::numeric::ublas::matrix< T2 , L2 , A2 > &m2 )
Chris@16 84 {
Chris@16 85 m1.resize( m2.size1() , m2.size2() );
Chris@16 86 }
Chris@16 87 };
Chris@16 88
Chris@16 89
Chris@16 90
Chris@16 91 // same size and resize specialization for matrix-vector resizing
Chris@16 92 template< class T , class L , class A , class T_V , class A_V >
Chris@16 93 struct same_size_impl< boost::numeric::ublas::matrix< T , L , A > , boost::numeric::ublas::vector< T_V , A_V > >
Chris@16 94 {
Chris@16 95 static bool same_size( const boost::numeric::ublas::matrix< T , L , A > &m ,
Chris@16 96 const boost::numeric::ublas::vector< T_V , A_V > &v )
Chris@16 97 {
Chris@16 98 return ( ( m.size1() == v.size() ) && ( m.size2() == v.size() ) );
Chris@16 99 }
Chris@16 100 };
Chris@16 101
Chris@16 102 template< class T , class L , class A , class T_V , class A_V >
Chris@16 103 struct resize_impl< boost::numeric::ublas::matrix< T , L , A > , boost::numeric::ublas::vector< T_V , A_V > >
Chris@16 104 {
Chris@16 105 static void resize( boost::numeric::ublas::matrix< T , L , A > &m ,
Chris@16 106 const boost::numeric::ublas::vector< T_V , A_V > &v )
Chris@16 107 {
Chris@16 108 m.resize( v.size() , v.size() );
Chris@16 109 }
Chris@16 110 };
Chris@16 111
Chris@16 112
Chris@16 113
Chris@16 114 // specialization for ublas::permutation_matrix
Chris@16 115 // same size and resize specialization for matrix-vector resizing
Chris@16 116 template< class T , class A , class T_V , class A_V >
Chris@16 117 struct same_size_impl< boost::numeric::ublas::permutation_matrix< T , A > , boost::numeric::ublas::vector< T_V , A_V > >
Chris@16 118 {
Chris@16 119 static bool same_size( const boost::numeric::ublas::permutation_matrix< T , A > &m ,
Chris@16 120 const boost::numeric::ublas::vector< T_V , A_V > &v )
Chris@16 121 {
Chris@16 122 return ( m.size() == v.size() ); // && ( m.size2() == v.size() ) );
Chris@16 123 }
Chris@16 124 };
Chris@16 125
Chris@16 126 template< class T , class A , class T_V , class A_V >
Chris@16 127 struct resize_impl< boost::numeric::ublas::vector< T_V , A_V > , boost::numeric::ublas::permutation_matrix< T , A > >
Chris@16 128 {
Chris@16 129 static void resize( const boost::numeric::ublas::vector< T_V , A_V > &v,
Chris@16 130 boost::numeric::ublas::permutation_matrix< T , A > &m )
Chris@16 131 {
Chris@16 132 m.resize( v.size() , v.size() );
Chris@16 133 }
Chris@16 134 };
Chris@16 135
Chris@16 136
Chris@16 137
Chris@16 138
Chris@16 139
Chris@16 140
Chris@16 141
Chris@16 142 template< class T , class A >
Chris@16 143 struct state_wrapper< boost::numeric::ublas::permutation_matrix< T , A > > // with resizing
Chris@16 144 {
Chris@16 145 typedef boost::numeric::ublas::permutation_matrix< T , A > state_type;
Chris@16 146 typedef state_wrapper< state_type > state_wrapper_type;
Chris@16 147
Chris@16 148 state_type m_v;
Chris@16 149
Chris@16 150 state_wrapper() : m_v( 1 ) // permutation matrix constructor requires a size, choose 1 as default
Chris@16 151 { }
Chris@16 152
Chris@16 153 };
Chris@16 154
Chris@16 155
Chris@16 156
Chris@16 157
Chris@16 158 } } }
Chris@16 159
Chris@16 160 //// all specializations done, ready to include state_wrapper
Chris@16 161 //
Chris@16 162 //#include <boost/numeric/odeint/util/state_wrapper.hpp>
Chris@16 163 //
Chris@16 164 //namespace boost {
Chris@16 165 //namespace numeric {
Chris@16 166 //namespace odeint {
Chris@16 167 //
Chris@16 168 ///* specialization for permutation matrices wrapper because we need to change the construction */
Chris@16 169 //template< class T , class A >
Chris@16 170 //struct state_wrapper< boost::numeric::ublas::permutation_matrix< T , A > , true > // with resizing
Chris@16 171 //{
Chris@16 172 // typedef boost::numeric::ublas::permutation_matrix< T , A > state_type;
Chris@16 173 // typedef state_wrapper< state_type > state_wrapper_type;
Chris@16 174 // //typedef typename V::value_type value_type;
Chris@16 175 // typedef boost::true_type is_resizeable;
Chris@16 176 //
Chris@16 177 // state_type m_v;
Chris@16 178 //
Chris@16 179 // state_wrapper() : m_v( 1 ) // permutation matrix constructor requires a size, choose 1 as default
Chris@16 180 // { }
Chris@16 181 //
Chris@16 182 // template< class T_V , class A_V >
Chris@16 183 // bool same_size( const boost::numeric::ublas::vector< T_V , A_V > &x )
Chris@16 184 // {
Chris@16 185 // return boost::numeric::odeint::same_size( m_v , x );
Chris@16 186 // }
Chris@16 187 //
Chris@16 188 // template< class T_V , class A_V >
Chris@16 189 // bool resize( const boost::numeric::ublas::vector< T_V , A_V > &x )
Chris@16 190 // {
Chris@16 191 // //standard resizing done like for std::vector
Chris@16 192 // if( !same_size( x ) )
Chris@16 193 // {
Chris@16 194 // boost::numeric::odeint::resize( m_v , x );
Chris@16 195 // return true;
Chris@16 196 // } else
Chris@16 197 // return false;
Chris@16 198 // }
Chris@16 199 //};
Chris@16 200 //
Chris@16 201 //}
Chris@16 202 //}
Chris@16 203 //}
Chris@16 204
Chris@16 205
Chris@16 206 /*
Chris@16 207 * preparing ublas::matrix for boost::range, such that ublas::matrix can be used in all steppers with the range algebra
Chris@16 208 */
Chris@16 209
Chris@16 210 namespace boost
Chris@16 211 {
Chris@16 212 template< class T , class L , class A >
Chris@16 213 struct range_mutable_iterator< boost::numeric::ublas::matrix< T , L , A > >
Chris@16 214 {
Chris@16 215 typedef typename boost::numeric::ublas::matrix< T , L , A >::array_type::iterator type;
Chris@16 216 };
Chris@16 217
Chris@16 218 template< class T , class L , class A >
Chris@16 219 struct range_const_iterator< boost::numeric::ublas::matrix< T , L , A > >
Chris@16 220 {
Chris@16 221 typedef typename boost::numeric::ublas::matrix< T , L , A >::array_type::const_iterator type;
Chris@16 222 };
Chris@16 223
Chris@16 224 } // namespace boost
Chris@16 225
Chris@16 226
Chris@16 227 namespace boost { namespace numeric { namespace ublas {
Chris@16 228
Chris@16 229 template< class T , class L , class A >
Chris@16 230 inline typename matrix< T , L , A >::array_type::iterator
Chris@16 231 range_begin( matrix< T , L , A > &x )
Chris@16 232 {
Chris@16 233 return x.data().begin();
Chris@16 234 }
Chris@16 235
Chris@16 236 template< class T , class L , class A >
Chris@16 237 inline typename matrix< T , L , A >::array_type::const_iterator
Chris@16 238 range_begin( const matrix< T , L , A > &x )
Chris@16 239 {
Chris@16 240 return x.data().begin();
Chris@16 241 }
Chris@16 242
Chris@16 243 template< class T , class L , class A >
Chris@16 244 inline typename matrix< T , L , A >::array_type::iterator
Chris@16 245 range_end( matrix< T , L , A > &x )
Chris@16 246 {
Chris@16 247 return x.data().end();
Chris@16 248 }
Chris@16 249
Chris@16 250 template< class T , class L , class A >
Chris@16 251 inline typename matrix< T , L , A >::array_type::const_iterator
Chris@16 252 range_end( const matrix< T , L , A > &x )
Chris@16 253 {
Chris@16 254 return x.data().end();
Chris@16 255 }
Chris@16 256
Chris@16 257 } } } // namespace boost::numeric::ublas
Chris@16 258
Chris@16 259
Chris@16 260 #endif // BOOST_NUMERIC_ODEINT_UTIL_UBLAS_WRAPPER_HPP_INCLUDED