$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r72756 - sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper
From: mario.mulansky_at_[hidden]
Date: 2011-06-26 03:37:33
Author: mariomulansky
Date: 2011-06-26 03:37:29 EDT (Sun, 26 Jun 2011)
New Revision: 72756
URL: http://svn.boost.org/trac/boost/changeset/72756
Log:
prototype implementation of state_wrapper idea and new resizing concept in ideas/state_wrapper
Added:
   sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/size_adjuster.hpp   (contents, props changed)
Text files modified: 
   sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/explicit_euler.hpp  |    26 ++++++++++++++++++--------              
   sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/test_gsl_vector.cpp |    16 +++++++++-------                        
   sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/test_vector.cpp     |     3 ++-                                     
   3 files changed, 29 insertions(+), 16 deletions(-)
Modified: sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/explicit_euler.hpp
==============================================================================
--- sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/explicit_euler.hpp	(original)
+++ sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/explicit_euler.hpp	2011-06-26 03:37:29 EDT (Sun, 26 Jun 2011)
@@ -4,7 +4,7 @@
 
 #include <boost/numeric/odeint/algebra/range_algebra.hpp>
 #include <boost/numeric/odeint/algebra/default_operations.hpp>
-#include <boost/numeric/odeint/util/size_adjuster.hpp>
+#include <boost/numeric/odeint/util/resize.hpp>
 
 template< class V >
 struct state_wrapper
@@ -18,7 +18,7 @@
 };
 
 
-template< typename StateType >
+template< typename StateType , class Resizer >
 class explicit_euler {
 
 public:
@@ -27,23 +27,33 @@
     typedef double time_type;
     typedef StateType state_type;
     typedef state_wrapper< state_type > wrapped_state_type;
+    typedef Resizer resizer_type;
 
-    explicit_euler() : m_dxdt()
-    {
-        m_size_adjuster.register_state( 0 , m_dxdt.m_v );
-    };
+    explicit_euler() : m_dxdt() , m_resizer()
+    { }
 
     template< class System , class StateInOut >
     void do_step( System system , StateInOut &inout , const time_type &t , const time_type &dt )
     {
-        m_size_adjuster.adjust_size( inout );
+        m_resizer.adjust_size( *this , inout );
 
         system( inout , m_dxdt.m_v , t );
 
         boost::numeric::odeint::range_algebra::for_each3( inout , inout , m_dxdt.m_v , typename boost::numeric::odeint::default_operations::template scale_sum2< value_type , time_type >( 1.0 , dt ) );
     }
 
+    template< class State >
+    bool adjust_size( const State &x )
+    {
+        if( boost::numeric::odeint::same_size( x , m_dxdt.m_v ) )
+        {
+            boost::numeric::odeint::resize( x , m_dxdt.m_v );
+            return true;
+        } else
+            return false;
+    }
+
 private:
-    boost::numeric::odeint::size_adjuster< state_type , 1 > m_size_adjuster;
     wrapped_state_type m_dxdt;
+    resizer_type m_resizer;
 };
Added: sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/size_adjuster.hpp
==============================================================================
--- (empty file)
+++ sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/size_adjuster.hpp	2011-06-26 03:37:29 EDT (Sun, 26 Jun 2011)
@@ -0,0 +1,54 @@
+#include <boost/numeric/odeint/util/is_resizeable.hpp>
+
+
+template< class Stepper , class State >
+bool adjust_size_by_resizeability( Stepper &stepper , const State &x , boost::true_type )
+{
+    return stepper.adjust_size( x );
+}
+
+template< class Stepper , class State>
+bool adjust_size_by_resizeability( Stepper &stepper , const State &x , boost::false_type )
+{
+    return false;
+}
+
+struct always_resizer
+{
+
+    template< class Stepper , class State >
+    bool adjust_size( Stepper& stepper, const State &x )
+    {
+        return adjust_size_by_resizeability( stepper , x , typename boost::numeric::odeint::is_resizeable< State >::type() );
+        stepper.resize( x );
+    }
+
+};
+
+
+struct initially_resizer
+{
+    bool m_initialized;
+
+    initially_resizer(): m_initialized( false )
+    { }
+
+    template< class Stepper , class State >
+    bool adjust_size( Stepper& stepper, const State &x )
+    {
+        if( !m_initialized )
+        {
+            m_initialized = true;
+            return adjust_size_by_resizeability( stepper , x , typename boost::numeric::odeint::is_resizeable< State >::type() );
+        }
+        return false;
+    }
+};
+
+
+struct never_resizer
+{
+    template< class Stepper , class State >
+    void adjust_size( Stepper& stepper, const State &x )
+    { }
+};
Modified: sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/test_gsl_vector.cpp
==============================================================================
--- sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/test_gsl_vector.cpp	(original)
+++ sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/test_gsl_vector.cpp	2011-06-26 03:37:29 EDT (Sun, 26 Jun 2011)
@@ -2,11 +2,12 @@
 #include <gsl/gsl_vector.h>
 
 #include "explicit_euler.hpp"
+#include "size_adjuster.hpp"
 #include <boost/numeric/odeint/external/gsl/gsl_vector_adaptor.hpp>
 
 using namespace std;
 
-typedef gsl_vector state_type;
+typedef gsl_vector* state_type;
 
 const double sigma = 10.0;
 const double R = 28.0;
@@ -28,18 +29,19 @@
 
     state_wrapper( )
     {
-        m_v->owner = 0;
-        m_v->size = 0;
-        m_v->stride = 0;
-        m_v->data = 0;
-        m_v->block = 0;
+        m_v = gsl_vector_alloc( 1 );
+    }
+
+    ~state_wrapper()
+    {
+        gsl_vector_free( m_v );
     }
 
 };
 
 int main() {
 
-    explicit_euler< state_type > euler;
+    explicit_euler< state_type , initially_resizer > euler;
 
     state_type x = gsl_vector_alloc( 3 );
     gsl_vector_set( x , 0 , 1.0);
Modified: sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/test_vector.cpp
==============================================================================
--- sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/test_vector.cpp	(original)
+++ sandbox/odeint/branches/karsten/libs/numeric/odeint/ideas/state_wrapper/test_vector.cpp	2011-06-26 03:37:29 EDT (Sun, 26 Jun 2011)
@@ -2,6 +2,7 @@
 #include <vector>
 
 #include "explicit_euler.hpp"
+#include "size_adjuster.hpp"
 
 using namespace std;
 
@@ -20,7 +21,7 @@
 
 int main()
 {
-    explicit_euler< state_type > euler;
+    explicit_euler< state_type , initially_resizer > euler;
 
     state_type x(3);
     x[0] = 1.0; x[1] = 1.0; x[2] = 2.0;