$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r64727 - in sandbox/odeint/branches/karsten: boost/numeric/odeint/algebra boost/numeric/odeint/algebra/detail boost/numeric/odeint/stepper libs/numeric/odeint/test
From: mario.mulansky_at_[hidden]
Date: 2010-08-10 12:20:52
Author: mariomulansky
Date: 2010-08-10 12:20:48 EDT (Tue, 10 Aug 2010)
New Revision: 64727
URL: http://svn.boost.org/trac/boost/changeset/64727
Log:
implemented error_checker
Added:
   sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/detail/reduce.hpp   (contents, props changed)
Text files modified: 
   sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/standard_algebra.hpp         |     6 ++++                                    
   sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/standard_operations.hpp      |    53 ++++++++++++++++++++++++++++++++++++--- 
   sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/vector_space_algebra.hpp     |     7 +++++                                   
   sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/controlled_error_stepper.hpp |     6 +++                                     
   sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/error_checker.hpp            |    29 +++++++++++++++------                   
   sandbox/odeint/branches/karsten/libs/numeric/odeint/test/check_stepper_concepts.cpp       |    19 +++++++++-----                          
   sandbox/odeint/branches/karsten/libs/numeric/odeint/test/vector_space_1d.hpp              |    31 ++++++++++++++++++++++                  
   7 files changed, 128 insertions(+), 23 deletions(-)
Added: sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/detail/reduce.hpp
==============================================================================
--- (empty file)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/detail/reduce.hpp	2010-08-10 12:20:48 EDT (Tue, 10 Aug 2010)
@@ -0,0 +1,34 @@
+/*
+ * boost header: BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_FOR_EACH/reduce.hpp
+ *
+ Copyright 2009 Karsten Ahnert
+ Copyright 2009 Mario Mulansky
+ Copyright 2009 Andre Bergner
+
+ 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_ODEINT_ALGEBRA_DETAIL_REDUCE_HPP_INCLUDED
+#define BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_REDUCE_HPP_INCLUDED
+
+namespace boost {
+namespace numeric {
+namespace odeint {
+namespace detail {
+
+template< class ValueType , class Iterator1 , class Reduction >
+inline ValueType reduce( Iterator1 first1 , Iterator1 last1 , Reduction red, ValueType init)
+{
+	for( ; first1 != last1 ; )
+		init = red( init , *first1++ );
+	return init;
+}
+
+} // detail
+} // odeint
+} // numeric
+} // boost
+
+#endif /* BOOST_NUMERIC_ODEINT_ALGEBRA_DETAIL_REDUCE_HPP_INCLUDED */
Modified: sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/standard_algebra.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/standard_algebra.hpp	(original)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/standard_algebra.hpp	2010-08-10 12:20:48 EDT (Tue, 10 Aug 2010)
@@ -17,6 +17,7 @@
 
 #include <boost/numeric/odeint/algebra/detail/macros.hpp>
 #include <boost/numeric/odeint/algebra/detail/for_each.hpp>
+#include <boost/numeric/odeint/algebra/detail/reduce.hpp>
 
 namespace boost {
 namespace numeric {
@@ -136,6 +137,11 @@
                                                    op	);
         }
 
+	template< class ValueType , class StateType , class Reduction >
+	static ValueType reduce( StateType &s , Reduction red , ValueType init)
+	{
+		return detail::reduce( boost::begin( s ) , boost::end( s ) , red , init );
+	}
 
 };
 
Modified: sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/standard_operations.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/standard_operations.hpp	(original)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/standard_operations.hpp	2010-08-10 12:20:48 EDT (Tue, 10 Aug 2010)
@@ -118,11 +118,54 @@
                 scale_sum6( time_type alpha1 , time_type alpha2 , time_type alpha3 , time_type alpha4 , time_type alpha5 , time_type alpha6 )
                         : m_alpha1( alpha1 ) , m_alpha2( alpha2 ) , m_alpha3( alpha3 ) , m_alpha4( alpha4 ) , m_alpha5( alpha5 ) , m_alpha6( alpha6 ){ }
 
-			template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
-			void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 ,const T7 &t7) const
-			{
-				t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7;
-			}
+		template< class T1 , class T2 , class T3 , class T4 , class T5 , class T6 , class T7 >
+		void operator()( T1 &t1 , const T2 &t2 , const T3 &t3 , const T4 &t4 , const T5 &t5 , const T6 &t6 ,const T7 &t7) const
+		{
+			t1 = m_alpha1 * t2 + m_alpha2 * t3 + m_alpha3 * t4 + m_alpha4 * t5 + m_alpha5 * t6 + m_alpha6 * t7;
+		}
+	};
+
+
+
+
+
+
+
+	struct rel_error
+	{
+		time_type m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt;
+
+		rel_error( time_type eps_abs , time_type eps_rel , time_type a_x , time_type a_dxdt )
+			: m_eps_abs( eps_abs ) , m_eps_rel( eps_rel ) , m_a_x( a_x ) , m_a_dxdt( a_dxdt ) { }
+
+
+		template< class T1 , class T2 , class T3 >
+		void operator()( const T1 &t1 , const T2 &t2 , T3 &t3 )
+		{
+			using std::abs;
+			t3 = abs( t3 ) / ( m_eps_abs + m_eps_rel * ( m_a_x * abs( t1 ) + m_a_dxdt * abs( t2 ) ) );
+		}
+
+	};
+
+
+	/* ToDo : this is a reduction-operation so it needs 2 arguments for usage in reduce() functions,
+	 * but for vector spaces only one argument should be supplied - this should be rethought in details.
+	 */
+	struct maximum
+	{
+		template< class T1 , class T2 >
+		time_type operator()( const T1 &t1 , const T2 &t2 )
+		{
+			using std::max;
+			return max( t1 , t2 );
+		}
+
+		template< class T >
+		time_type operator()( const T &t1 )
+		{ // for the vector space algebra
+			return max( t1 );
+		}
         };
 
 
Modified: sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/vector_space_algebra.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/vector_space_algebra.hpp	(original)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/algebra/vector_space_algebra.hpp	2010-08-10 12:20:48 EDT (Tue, 10 Aug 2010)
@@ -62,6 +62,13 @@
                 op( s1 , s2 , s3 , s4 , s5 , s6 , s7 );
         }
 
+
+	/* ToDo : get ValueType from Container? */
+	template< class ValueType , class StateType , class Reduction>
+	static ValueType reduce( StateType &s , Reduction red , ValueType init)
+	{
+		return red( s );
+	}
 };
 
 
Modified: sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/controlled_error_stepper.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/controlled_error_stepper.hpp	(original)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/controlled_error_stepper.hpp	2010-08-10 12:20:48 EDT (Tue, 10 Aug 2010)
@@ -32,7 +32,10 @@
 
 template<
         class ErrorStepper ,
-	class ErrorChecker = error_checker_standard< typename ErrorStepper::state_type , typename ErrorStepper::time_type >
+	class ErrorChecker = error_checker_standard< typename ErrorStepper::state_type ,
+												   typename ErrorStepper::time_type ,
+												   typename ErrorStepper::algebra_type ,
+												   typename ErrorStepper::operations_type >
 	>
 class controlled_error_stepper
 {
@@ -83,6 +86,7 @@
                 boost::numeric::odeint::copy( x , m_x_old );
                 m_stepper.do_step( sys , x , dxdt , t , dt , m_x_err );
 
+		// this potentially overwrites m_x_err! (standard_error_checker does, at least)
                 time_type max_rel_err = m_error_checker.error( m_x_old , dxdt , m_x_err , dt );
 
                 if( max_rel_err > 1.1 )
Modified: sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/error_checker.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/error_checker.hpp	(original)
+++ sandbox/odeint/branches/karsten/boost/numeric/odeint/stepper/error_checker.hpp	2010-08-10 12:20:48 EDT (Tue, 10 Aug 2010)
@@ -13,34 +13,45 @@
 #ifndef BOOST_NUMERIC_ODEINT_ERROR_CHECKER_HPP_INCLUDED
 #define BOOST_NUMERIC_ODEINT_ERROR_CHECKER_HPP_INCLUDED
 
+#include <boost/numeric/odeint/algebra/standard_algebra.hpp>
+#include <boost/numeric/odeint/algebra/standard_operations.hpp>
+
 namespace boost {
 namespace numeric {
 namespace odeint {
 
 
-template< class State , class Time >
+template< class State ,
+		   class Time ,
+		   class Algebra = standard_algebra< State > ,
+		   class Operations = standard_operations< Time > >
 class error_checker_standard
 {
 public:
 
         typedef State state_type;
         typedef Time time_type;
+	typedef Algebra algebra_type;
+	typedef Operations operations_type;
 
 
-	error_checker_standard( void )
+	error_checker_standard( void ) : m_eps_abs( 1E-6 ) , m_eps_rel( 1E-6 ) , m_a_x( 1.0 ) , m_a_dxdt( 1.0 )
         {}
 
-	time_type error( const state_type &x_old , const state_type &dxdt_old , const state_type &x_err , time_type dt )
-	{
-		return 0.0;
+	time_type error( const state_type &x_old , const state_type &dxdt_old , state_type &x_err , time_type dt )
+	{   // this overwrites x_err !
+		algebra_type::for_each3( x_old , dxdt_old , x_err ,
+					             typename operations_type::rel_error( m_eps_abs , m_eps_rel , m_a_x , m_a_dxdt*dt ) );
+
+		return algebra_type::template reduce< time_type >( x_err , typename operations_type::maximum() , 100.0 );
         }
 
 private:
 
-	//	time_type m_eps_abs;
-	//	time_type m_eps_rel;
-	//	time_type m_a_x;
-	//	time_type m_a_dxdt;
+	time_type m_eps_abs;
+	time_type m_eps_rel;
+	time_type m_a_x;
+	time_type m_a_dxdt;
 };
 
 } // odeint
Modified: sandbox/odeint/branches/karsten/libs/numeric/odeint/test/check_stepper_concepts.cpp
==============================================================================
--- sandbox/odeint/branches/karsten/libs/numeric/odeint/test/check_stepper_concepts.cpp	(original)
+++ sandbox/odeint/branches/karsten/libs/numeric/odeint/test/check_stepper_concepts.cpp	2010-08-10 12:20:48 EDT (Tue, 10 Aug 2010)
@@ -3,7 +3,11 @@
  Copyright 2009 Karsten Ahnert
  Copyright 2009 Mario Mulansky
  
- This file tests the use of the euler stepper
+ This file tests the use of the all different steppers with several state types:
+ std::vector< double >
+ gsl_vector
+ vector_space_1d< double >  (see vector_space_1d.hpp)
+ std::tr1::array< double , 1 >
   
  Distributed under the Boost Software License, Version 1.0.
  (See accompanying file LICENSE_1_0.txt or
@@ -281,7 +285,7 @@
 
 
 
-
+/* ToDO: check actual results of controlled step... */
 
 
 template< class ControlledStepper , class State > struct perform_controlled_stepper_test;
@@ -296,7 +300,7 @@
                 error_checker_standard< typename ControlledStepper::state_type , typename ControlledStepper::time_type > error_checker;
                 ControlledStepper controlled_stepper( error_stepper , error_checker );
                 check_controlled_stepper_concept( controlled_stepper , constant_system1 , x );
-		BOOST_CHECK_SMALL( fabs( x[0] - 0.1 ) , eps );
+		//BOOST_CHECK_SMALL( fabs( x[0] - 0.1 ) , eps );
         }
 };
 
@@ -311,7 +315,7 @@
                 error_checker_standard< typename ControlledStepper::state_type , typename ControlledStepper::time_type > error_checker;
                 ControlledStepper controlled_stepper( error_stepper , error_checker );
                 check_controlled_stepper_concept( controlled_stepper , constant_system2 , *x );
-		BOOST_CHECK_SMALL( fabs( gsl_vector_get( x , 0 ) - 0.1 ) , eps );
+		//BOOST_CHECK_SMALL( fabs( gsl_vector_get( x , 0 ) - 0.1 ) , eps );
                 gsl_vector_free( x );
         }
 };
@@ -324,10 +328,10 @@
                 vector_space_type x;
                 x.m_x = 0.0;
                 typename ControlledStepper::error_stepper_type error_stepper;
-		error_checker_standard< typename ControlledStepper::state_type , typename ControlledStepper::time_type > error_checker;
+		error_checker_standard< typename ControlledStepper::state_type , typename ControlledStepper::time_type , vector_space_algebra > error_checker;
                 ControlledStepper controlled_stepper( error_stepper , error_checker );
                 check_controlled_stepper_concept( controlled_stepper , constant_system3 , x );
-		BOOST_CHECK_SMALL( fabs( x.m_x - 0.1 ) , eps );
+		//BOOST_CHECK_SMALL( fabs( x.m_x - 0.1 ) , eps );
         }
 };
 
@@ -342,7 +346,7 @@
                 error_checker_standard< typename ControlledStepper::state_type , typename ControlledStepper::time_type > error_checker;
                 ControlledStepper controlled_stepper( error_stepper , error_checker );
                 check_controlled_stepper_concept( controlled_stepper , constant_system4 , x );
-		BOOST_CHECK_SMALL( fabs( x[0] - 0.1 ) , eps );
+		//BOOST_CHECK_SMALL( fabs( x[0] - 0.1 ) , eps );
         }
 };
 
@@ -353,6 +357,7 @@
 
 typedef mpl::insert_range<	mpl::vector0<> , mpl::end< mpl::vector0<> >::type ,	controlled_stepper_methods< vector_type > >::type first_controlled_stepper_type;
 typedef mpl::insert_range<	first_controlled_stepper_type , mpl::end< first_controlled_stepper_type >::type , controlled_stepper_methods< gsl_vector_type > >::type second_controlled_stepper_type;
+//typedef mpl::insert_range<	second_controlled_stepper_type , mpl::end< second_controlled_stepper_type >::type , controlled_stepper_methods< array_type > >::type all_controlled_stepper_methods;
 typedef mpl::insert_range<	second_controlled_stepper_type , mpl::end< second_controlled_stepper_type >::type , controlled_stepper_methods< vector_space_type > >::type third_controlled_stepper_type;
 typedef mpl::insert_range<	third_controlled_stepper_type , mpl::end< third_controlled_stepper_type >::type , controlled_stepper_methods< array_type > >::type all_controlled_stepper_methods;
 
Modified: sandbox/odeint/branches/karsten/libs/numeric/odeint/test/vector_space_1d.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/libs/numeric/odeint/test/vector_space_1d.hpp	(original)
+++ sandbox/odeint/branches/karsten/libs/numeric/odeint/test/vector_space_1d.hpp	2010-08-10 12:20:48 EDT (Tue, 10 Aug 2010)
@@ -19,8 +19,9 @@
 struct vector_space_1d :
     boost::additive1< vector_space_1d< T > ,
     boost::additive2< vector_space_1d< T > , T ,
+    boost::multiplicative1< vector_space_1d< T > ,
     boost::multiplicative2< vector_space_1d< T > , T
-    > > >
+    > > > >
 {
         typedef T value_type;
 
@@ -40,6 +41,18 @@
             return *this;
         }
 
+    vector_space_1d& operator*=( const vector_space_1d& p )
+   	{
+       	m_x *= p.m_x;
+   	    return *this;
+   	}
+
+    vector_space_1d& operator/=( const vector_space_1d& p )
+	{
+       	m_x /= p.m_x;
+        return *this;
+	}
+
     vector_space_1d& operator+=( const value_type& val )
         {
             m_x += val;
@@ -65,4 +78,20 @@
         }
 };
 
+
+template< class T >
+vector_space_1d< T > abs( const vector_space_1d< T > &v)
+{
+	vector_space_1d< T > tmp;
+	tmp.m_x = std::abs( v.m_x );
+	return tmp;
+}
+
+
+template< class T >
+T max( const vector_space_1d< T > &v )
+{
+	return v.m_x;
+}
+
 #endif // VECTOR_SPACE_1D_HPP_INCLUDED