Chris@16: /* Chris@16: [auto_generated] Chris@16: boost/numeric/odeint/util/ublas_wrapper.hpp Chris@16: Chris@16: [begin_description] Chris@16: Resizing for ublas::vector and ublas::matrix Chris@16: [end_description] Chris@16: Chris@16: Copyright 2009-2011 Karsten Ahnert Chris@16: Copyright 2009-2011 Mario Mulansky Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. Chris@16: (See accompanying file LICENSE_1_0.txt or Chris@16: copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: */ Chris@16: Chris@16: Chris@16: #ifndef BOOST_NUMERIC_ODEINT_UTIL_UBLAS_WRAPPER_HPP_INCLUDED Chris@16: #define BOOST_NUMERIC_ODEINT_UTIL_UBLAS_WRAPPER_HPP_INCLUDED Chris@16: Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace numeric { Chris@16: namespace odeint { Chris@16: Chris@16: /* Chris@16: * resizeable specialization for boost::numeric::ublas::vector Chris@16: */ Chris@16: template< class T , class A > Chris@16: struct is_resizeable< boost::numeric::ublas::vector< T , A > > Chris@16: { Chris@16: typedef boost::true_type type; Chris@16: const static bool value = type::value; Chris@16: }; Chris@16: Chris@16: Chris@16: /* Chris@16: * resizeable specialization for boost::numeric::ublas::matrix Chris@16: */ Chris@16: template< class T , class L , class A > Chris@16: struct is_resizeable< boost::numeric::ublas::matrix< T , L , A > > Chris@16: { Chris@16: typedef boost::true_type type; Chris@16: const static bool value = type::value; Chris@16: }; Chris@16: Chris@16: Chris@16: /* Chris@16: * resizeable specialization for boost::numeric::ublas::permutation_matrix Chris@16: */ Chris@16: template< class T , class A > Chris@16: struct is_resizeable< boost::numeric::ublas::permutation_matrix< T , A > > Chris@16: { Chris@16: typedef boost::true_type type; Chris@16: const static bool value = type::value; Chris@16: }; Chris@16: Chris@16: Chris@16: // specialization for ublas::matrix Chris@16: // same size and resize specialization for matrix-matrix resizing Chris@16: template< class T , class L , class A , class T2 , class L2 , class A2 > Chris@16: struct same_size_impl< boost::numeric::ublas::matrix< T , L , A > , boost::numeric::ublas::matrix< T2 , L2 , A2 > > Chris@16: { Chris@16: static bool same_size( const boost::numeric::ublas::matrix< T , L , A > &m1 , Chris@16: const boost::numeric::ublas::matrix< T2 , L2 , A2 > &m2 ) Chris@16: { Chris@16: return ( ( m1.size1() == m2.size1() ) && ( m1.size2() == m2.size2() ) ); Chris@16: } Chris@16: }; Chris@16: Chris@16: template< class T , class L , class A , class T2 , class L2 , class A2 > Chris@16: struct resize_impl< boost::numeric::ublas::matrix< T , L , A > , boost::numeric::ublas::matrix< T2 , L2 , A2 > > Chris@16: { Chris@16: static void resize( boost::numeric::ublas::matrix< T , L , A > &m1 , Chris@16: const boost::numeric::ublas::matrix< T2 , L2 , A2 > &m2 ) Chris@16: { Chris@16: m1.resize( m2.size1() , m2.size2() ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: // same size and resize specialization for matrix-vector resizing Chris@16: template< class T , class L , class A , class T_V , class A_V > Chris@16: struct same_size_impl< boost::numeric::ublas::matrix< T , L , A > , boost::numeric::ublas::vector< T_V , A_V > > Chris@16: { Chris@16: static bool same_size( const boost::numeric::ublas::matrix< T , L , A > &m , Chris@16: const boost::numeric::ublas::vector< T_V , A_V > &v ) Chris@16: { Chris@16: return ( ( m.size1() == v.size() ) && ( m.size2() == v.size() ) ); Chris@16: } Chris@16: }; Chris@16: Chris@16: template< class T , class L , class A , class T_V , class A_V > Chris@16: struct resize_impl< boost::numeric::ublas::matrix< T , L , A > , boost::numeric::ublas::vector< T_V , A_V > > Chris@16: { Chris@16: static void resize( boost::numeric::ublas::matrix< T , L , A > &m , Chris@16: const boost::numeric::ublas::vector< T_V , A_V > &v ) Chris@16: { Chris@16: m.resize( v.size() , v.size() ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: // specialization for ublas::permutation_matrix Chris@16: // same size and resize specialization for matrix-vector resizing Chris@16: template< class T , class A , class T_V , class A_V > Chris@16: struct same_size_impl< boost::numeric::ublas::permutation_matrix< T , A > , boost::numeric::ublas::vector< T_V , A_V > > Chris@16: { Chris@16: static bool same_size( const boost::numeric::ublas::permutation_matrix< T , A > &m , Chris@16: const boost::numeric::ublas::vector< T_V , A_V > &v ) Chris@16: { Chris@16: return ( m.size() == v.size() ); // && ( m.size2() == v.size() ) ); Chris@16: } Chris@16: }; Chris@16: Chris@16: template< class T , class A , class T_V , class A_V > Chris@16: struct resize_impl< boost::numeric::ublas::vector< T_V , A_V > , boost::numeric::ublas::permutation_matrix< T , A > > Chris@16: { Chris@16: static void resize( const boost::numeric::ublas::vector< T_V , A_V > &v, Chris@16: boost::numeric::ublas::permutation_matrix< T , A > &m ) Chris@16: { Chris@16: m.resize( v.size() , v.size() ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template< class T , class A > Chris@16: struct state_wrapper< boost::numeric::ublas::permutation_matrix< T , A > > // with resizing Chris@16: { Chris@16: typedef boost::numeric::ublas::permutation_matrix< T , A > state_type; Chris@16: typedef state_wrapper< state_type > state_wrapper_type; Chris@16: Chris@16: state_type m_v; Chris@16: Chris@16: state_wrapper() : m_v( 1 ) // permutation matrix constructor requires a size, choose 1 as default Chris@16: { } Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: } } } Chris@16: Chris@16: //// all specializations done, ready to include state_wrapper Chris@16: // Chris@16: //#include Chris@16: // Chris@16: //namespace boost { Chris@16: //namespace numeric { Chris@16: //namespace odeint { Chris@16: // Chris@16: ///* specialization for permutation matrices wrapper because we need to change the construction */ Chris@16: //template< class T , class A > Chris@16: //struct state_wrapper< boost::numeric::ublas::permutation_matrix< T , A > , true > // with resizing Chris@16: //{ Chris@16: // typedef boost::numeric::ublas::permutation_matrix< T , A > state_type; Chris@16: // typedef state_wrapper< state_type > state_wrapper_type; Chris@16: // //typedef typename V::value_type value_type; Chris@16: // typedef boost::true_type is_resizeable; Chris@16: // Chris@16: // state_type m_v; Chris@16: // Chris@16: // state_wrapper() : m_v( 1 ) // permutation matrix constructor requires a size, choose 1 as default Chris@16: // { } Chris@16: // Chris@16: // template< class T_V , class A_V > Chris@16: // bool same_size( const boost::numeric::ublas::vector< T_V , A_V > &x ) Chris@16: // { Chris@16: // return boost::numeric::odeint::same_size( m_v , x ); Chris@16: // } Chris@16: // Chris@16: // template< class T_V , class A_V > Chris@16: // bool resize( const boost::numeric::ublas::vector< T_V , A_V > &x ) Chris@16: // { Chris@16: // //standard resizing done like for std::vector Chris@16: // if( !same_size( x ) ) Chris@16: // { Chris@16: // boost::numeric::odeint::resize( m_v , x ); Chris@16: // return true; Chris@16: // } else Chris@16: // return false; Chris@16: // } Chris@16: //}; Chris@16: // Chris@16: //} Chris@16: //} Chris@16: //} Chris@16: Chris@16: Chris@16: /* Chris@16: * preparing ublas::matrix for boost::range, such that ublas::matrix can be used in all steppers with the range algebra Chris@16: */ Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: template< class T , class L , class A > Chris@16: struct range_mutable_iterator< boost::numeric::ublas::matrix< T , L , A > > Chris@16: { Chris@16: typedef typename boost::numeric::ublas::matrix< T , L , A >::array_type::iterator type; Chris@16: }; Chris@16: Chris@16: template< class T , class L , class A > Chris@16: struct range_const_iterator< boost::numeric::ublas::matrix< T , L , A > > Chris@16: { Chris@16: typedef typename boost::numeric::ublas::matrix< T , L , A >::array_type::const_iterator type; Chris@16: }; Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: namespace boost { namespace numeric { namespace ublas { Chris@16: Chris@16: template< class T , class L , class A > Chris@16: inline typename matrix< T , L , A >::array_type::iterator Chris@16: range_begin( matrix< T , L , A > &x ) Chris@16: { Chris@16: return x.data().begin(); Chris@16: } Chris@16: Chris@16: template< class T , class L , class A > Chris@16: inline typename matrix< T , L , A >::array_type::const_iterator Chris@16: range_begin( const matrix< T , L , A > &x ) Chris@16: { Chris@16: return x.data().begin(); Chris@16: } Chris@16: Chris@16: template< class T , class L , class A > Chris@16: inline typename matrix< T , L , A >::array_type::iterator Chris@16: range_end( matrix< T , L , A > &x ) Chris@16: { Chris@16: return x.data().end(); Chris@16: } Chris@16: Chris@16: template< class T , class L , class A > Chris@16: inline typename matrix< T , L , A >::array_type::const_iterator Chris@16: range_end( const matrix< T , L , A > &x ) Chris@16: { Chris@16: return x.data().end(); Chris@16: } Chris@16: Chris@16: } } } // namespace boost::numeric::ublas Chris@16: Chris@16: Chris@16: #endif // BOOST_NUMERIC_ODEINT_UTIL_UBLAS_WRAPPER_HPP_INCLUDED