$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r58239 - in sandbox/numeric_bindings/libs/numeric/bindings/tools: . templates templates/level3
From: rutger_at_[hidden]
Date: 2009-12-08 14:34:17
Author: rutger
Date: 2009-12-08 14:34:16 EST (Tue, 08 Dec 2009)
New Revision: 58239
URL: http://svn.boost.org/trac/boost/changeset/58239
Log:
Sync of work on numeric_bindings
Text files modified: 
   sandbox/numeric_bindings/libs/numeric/bindings/tools/blas_generator.py            |    18 +++++++++----                           
   sandbox/numeric_bindings/libs/numeric/bindings/tools/netlib.py                    |    50 +++++++++++++++++++++++++++------------ 
   sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/blas.hpp           |    31 +++++++++++++++++++-----                
   sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/level3/gemm.hpp    |     4 +++                                     
   sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/singleton_blas.hpp |     1                                         
   5 files changed, 74 insertions(+), 30 deletions(-)
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/blas_generator.py
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/blas_generator.py	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/blas_generator.py	2009-12-08 14:34:16 EST (Tue, 08 Dec 2009)
@@ -49,15 +49,20 @@
 
     filename = group_name.lower() + '.hpp'
     includes = [
-      '#include <boost/numeric/bindings/traits/traits.hpp>',
-      '#include <boost/numeric/bindings/traits/type_traits.hpp>', 
+      #'#include <boost/numeric/bindings/detail/void_ptr.hpp>',
+      #'#include <boost/numeric/bindings/traits/traits.hpp>',
+      #'#include <boost/numeric/bindings/traits/type_traits.hpp>', 
       '#include <boost/numeric/bindings/remove_imaginary.hpp>', 
       '#include <boost/numeric/bindings/is_mutable.hpp>', 
       '#include <boost/numeric/bindings/value.hpp>', 
-      '#include <boost/mpl/bool.hpp>',
+      '#include <boost/numeric/bindings/stride.hpp>',
+      '#include <boost/numeric/bindings/size.hpp>',
+      #'#include <boost/mpl/bool.hpp>',
       '#include <boost/type_traits/is_same.hpp>',
       '#include <boost/type_traits/remove_const.hpp>',
-      '#include <boost/static_assert.hpp>' ]
+      '#include <boost/static_assert.hpp>',
+      '#include <boost/assert.hpp>',
+    ]
       
     if template_map.has_key( group_name.lower() + '.includes' ):
       includes += template_map[ group_name.lower() + '.includes' ].splitlines()
@@ -87,6 +92,7 @@
       sub_template = sub_template.replace( "$CALL_BLAS_HEADER", ", ".join( lapack_arg_list ) )
       sub_template = sub_template.replace( "$CALL_CBLAS_HEADER", ", ".join( cblas_arg_list ) )
       sub_template = sub_template.replace( "$SUBROUTINE", subroutine )
+      sub_template = sub_template.replace( "$SPECIALIZATION", documentation.routine_value_type[ subroutine[0] ] )
 
       # CBLAS stuff
       if 'cblas_routine' in info_map[ subroutine ]:
@@ -220,7 +226,7 @@
       for level2_idx in range( 0, len( level2_arg_lists ) ):
         level2_function = level2_template.replace( "$LEVEL2", \
                 ", ".join( level2_arg_lists[ level2_idx ] ) )
-        if len( level2_static_asserts ) > 0:
+        if len( "".join(level2_static_asserts[ level2_idx ] ) ) > 0:
           level2_function = level2_function.replace( "$STATIC_ASSERTS", \
                 "\n    ".join( level2_static_asserts[ level2_idx ] ) )
         level2_functions.append( level2_function )
@@ -240,7 +246,7 @@
       level2_template = level2_template.replace( "$CALL_LEVEL1", ", ".join( call_level1_arg_list ) )
       level2_template = level2_template.replace( "$TYPES", ", ".join( level1_type_arg_list ) )
       level2_template = level2_template.replace( '$RETURN_STATEMENT', info_map[ subroutine ][ 'return_statement' ] )
-      level2_template = level2_template.replace( '\n    $STATIC_ASSERTS', '' )
+      level2_template = level2_template.replace( '    $STATIC_ASSERTS\n', '' )
 
       level1_map[ value_type ] = bindings.proper_indent( level1_template )
       level2_map[ value_type ] = bindings.proper_indent( level2_template )
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/netlib.py
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/netlib.py	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/netlib.py	2009-12-08 14:34:16 EST (Tue, 08 Dec 2009)
@@ -14,11 +14,18 @@
 # for debugging purposes
 import pprint
 
+fortran_integer_type = 'std::ptrdiff_t'
+
+complex_float_type = 'std::complex<float>'  
+complex_double_type = 'std::complex<double>'
+
+fortran_complex_float_ptr = 'void'    # was fcomplex_t
+fortran_complex_double_ptr = 'void'   # was dcomplex_t
 
 global_type_map = { 
   'CHARACTER': 'char',
   'LOGICAL': 'logical_t', 
-  'INTEGER': 'integer_t',
+  'INTEGER': fortran_integer_type,
   'REAL': 'float', 
   'DOUBLE PRECISION': 'double' }
 
@@ -37,16 +44,16 @@
 
 def value_type( fortran_type ):
   m_type_map = global_type_map
-  m_type_map[ 'COMPLEX' ] = 'fcomplex_t'
-  m_type_map[ 'COMPLEX*16' ] = 'dcomplex_t'
-  m_type_map[ 'DOUBLE COMPLEX' ] = 'dcomplex_t'
+  m_type_map[ 'COMPLEX' ] = fortran_complex_float_ptr
+  m_type_map[ 'COMPLEX*16' ] = fortran_complex_double_ptr
+  m_type_map[ 'DOUBLE COMPLEX' ] = fortran_complex_double_ptr
   return m_type_map[ fortran_type ]
   
 def c_type( name, properties ):
   m_type_map = global_type_map
-  m_type_map[ 'COMPLEX' ] = 'fcomplex_t'
-  m_type_map[ 'COMPLEX*16' ] = 'dcomplex_t'
-  m_type_map[ 'DOUBLE COMPLEX' ] = 'dcomplex_t'
+  m_type_map[ 'COMPLEX' ] = fortran_complex_float_ptr
+  m_type_map[ 'COMPLEX*16' ] = fortran_complex_double_ptr
+  m_type_map[ 'DOUBLE COMPLEX' ] = fortran_complex_double_ptr
 
   result = m_type_map[ properties[ 'value_type' ] ];
   if properties[ 'io' ] == [ 'input' ]:
@@ -59,9 +66,10 @@
   
 def cpp_type( name, properties ):
   m_type_map = global_type_map
-  m_type_map[ 'COMPLEX' ] = 'traits::complex_f'
-  m_type_map[ 'COMPLEX*16' ] = 'traits::complex_d'
-  m_type_map[ 'DOUBLE COMPLEX' ] = 'traits::complex_d'
+
+  m_type_map[ 'COMPLEX' ] = complex_float_type
+  m_type_map[ 'COMPLEX*16' ] = complex_double_type
+  m_type_map[ 'DOUBLE COMPLEX' ] = complex_double_type
   
   result = m_type_map[ properties[ 'value_type' ] ]
   
@@ -87,13 +95,17 @@
   if properties[ 'type' ] == 'vector' or properties[ 'type' ] == 'matrix':
     if properties[ 'value_type' ][ 0:7] == 'COMPLEX' or \
        properties[ 'value_type' ] == 'DOUBLE COMPLEX':
-      result = 'detail::complex_ptr(' + name.lower() + ')'
+      #result = 'detail::complex_ptr(' + name.lower() + ')'
+      #result = 'bindings::detail::void_ptr(' + name.lower() + ')'
+      result = '' + name.lower() + ''
     else:
       result = name.lower()
   elif properties[ 'type' ] == 'scalar':
     if properties[ 'value_type' ][ 0:7] == 'COMPLEX' or \
        properties[ 'value_type' ] == 'DOUBLE COMPLEX':
-      result = 'detail::complex_ptr(&' + name.lower() + ')'
+      #result = 'detail::complex_ptr(&' + name.lower() + ')'
+      result = '&' + name.lower() + ''
+      #result = 'bindings::detail::void_ptr(&' + name.lower() + ')'
     else:
       result = '&' + name.lower()
   
@@ -161,8 +173,8 @@
         result = result.replace( "double", "real_type" )
       if properties[ 'value_type' ][ 0:7] == 'COMPLEX' or \
         properties[ 'value_type' ] == 'DOUBLE COMPLEX':
-         result = result.replace( "traits::complex_d", "value_type" )
-         result = result.replace( "traits::complex_f", "value_type" )
+         result = result.replace( complex_float_type, "value_type" )
+         result = result.replace( complex_double_type, "value_type" )
 
   return result
 
@@ -366,7 +378,7 @@
   result = None
   if 'workspace' in properties[ 'io' ]:
     if properties[ 'value_type' ] == 'INTEGER':
-      result = 'integer_t'
+      result = fortran_integer_type
     elif properties[ 'value_type' ] == 'LOGICAL':
       result = 'bool'
     elif properties[ 'value_type' ] == 'REAL' or properties[ 'value_type' ] == 'DOUBLE PRECISION':
@@ -1140,10 +1152,10 @@
       # Uplo character detection
       if argument_name == 'UPLO':
         # see if the traits are overruled through the template system
+        # the trait_of key will be added below
         traits_key = subroutine_group_name.lower() + '.' + subroutine_value_type + '.' + argument_name + '.trait_of'
         if my_has_key( traits_key, template_map ):
           argument_properties[ 'trait_type' ] = 'uplo'
-          argument_properties[ 'trait_of' ] = template_map[ my_has_key( traits_key, template_map ) ].strip()
         
         else:
           match_uplo = re.compile( '([Uu]pper|[Ll]ower)(or|triangular|triangle|triangles|part|of|the|band|hermitian|symmetric|input|matrix|\s)+([A-Z]+)', re.M ).findall( comment_block )
@@ -1164,6 +1176,12 @@
         argument_properties[ 'trait_type' ] = 'trans'
         argument_properties[ 'trait_of' ] = 'A'
 
+      # check for existance of trait_of definition in template file(s)
+      traits_key = subroutine_group_name.lower() + '.' + subroutine_value_type + '.' + argument_name + '.trait_of'
+      if my_has_key( traits_key, template_map ):
+        argument_properties[ 'trait_of' ] = template_map[ my_has_key( traits_key, template_map ) ].strip()
+
+
     #
     # Minimal workspace dimension recognition
     #
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/blas.hpp
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/blas.hpp	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/blas.hpp	2009-12-08 14:34:16 EST (Tue, 08 Dec 2009)
@@ -31,15 +31,24 @@
 namespace bindings {
 namespace blas {
 
-// The detail namespace is used for overloads on value type,
-// and to dispatch to the right routine
-
+//
+// The detail namespace contains value-type-overloaded functions that
+// dispatch to the appropriate back-end BLAS routine.
+//
 namespace detail {
 
 $OVERLOADS
 } // namespace detail
 
 $LEVEL1
+
+//
+// Functions for direct use. These functions are overloaded for temporaries,
+// so that wrapped types can still be passed and used for write-access. 
+// In the documentation the const-overloads are collapsed. Consult the
+// static assert lists (if available) to check what kind of overload it is.
+//
+
 $LEVEL2
 } // namespace blas
 } // namespace bindings
@@ -48,6 +57,9 @@
 
 #endif
 $TEMPLATE[blas_overloads]
+//
+// Overloaded function for the $SPECIALIZATION value type.
+//
 inline $RETURN_TYPE $groupname( $LEVEL0 ) {
 #if defined BOOST_NUMERIC_BINDINGS_BLAS_CBLAS
     $RETURN_STATEMENT$CBLAS_ROUTINE( $CALL_CBLAS_HEADER );
@@ -60,7 +72,8 @@
 
 $TEMPLATE[blas_level1]
 //
-// Value-type based template class
+// Value-type based template class. Use this class if you need a type
+// for dispatching to $groupname.
 //
 template< typename Value >
 struct $groupname_impl {
@@ -70,7 +83,11 @@
     typedef $RETURN_TYPE return_type;
 
 $INCLUDE_TEMPLATES
-    // static template member function
+    //
+    // Static member function that
+    // 1) Deduces the required arguments for dispatching to BLAS, and
+    // 2) Asserts that most arguments make sense.
+    //
     template< $TYPES >
     static return_type invoke( $LEVEL1 ) {
         $STATIC_ASSERTS
@@ -80,8 +97,8 @@
 };
 $TEMPLATE[blas_level2]
 //
-// Generic template function to call $groupname
-//
+// Overloaded function for $groupname
+// 
 template< $TYPES >
 inline typename $groupname_impl< typename value< $FIRST_TYPENAME >::type >::return_type
 $groupname( $LEVEL2 ) {
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/level3/gemm.hpp
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/level3/gemm.hpp	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/level3/gemm.hpp	2009-12-08 14:34:16 EST (Tue, 08 Dec 2009)
@@ -1,3 +1,7 @@
 $TEMPLATE[gemm.all.M.trait]
 num_rows,C
+$TEMPLATE[gemm.all.TRANSA.trait_of]
+A
+$TEMPLATE[gemm.all.TRANSB.trait_of]
+B
 $TEMPLATE[end]
Modified: sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/singleton_blas.hpp
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/singleton_blas.hpp	(original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/tools/templates/singleton_blas.hpp	2009-12-08 14:34:16 EST (Tue, 08 Dec 2009)
@@ -15,7 +15,6 @@
 #ifndef BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_BLAS_H
 #define BOOST_NUMERIC_BINDINGS_BLAS_DETAIL_BLAS_H
 
-#include <boost/numeric/bindings/traits/type.h>
 #include <boost/numeric/bindings/blas/detail/blas_names.h>
 
 extern "C" {