Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r61973 - in sandbox/numeric_bindings/libs/numeric/bindings: . lapack/test
From: thomas.klimpel_at_[hidden]
Date: 2010-05-14 19:35:17


Author: klimpel
Date: 2010-05-14 19:35:16 EDT (Fri, 14 May 2010)
New Revision: 61973
URL: http://svn.boost.org/trac/boost/changeset/61973

Log:
use bjam ... matlib=ublas/glas/mtl/eigen to test the bindings for the corresponding matrix library (well, at least the ublas_gesv2 regression test...)
Text files modified:
   sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/Jamfile.v2 | 1
   sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/ublas_gesv2.cc | 50 +++++++++++++++++++++++++++++++++++----
   sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/utils.h | 29 +++++++++++++++--------
   sandbox/numeric_bindings/libs/numeric/bindings/numeric-bindings.jam | 22 +++++++++++++++++
   4 files changed, 86 insertions(+), 16 deletions(-)

Modified: sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/Jamfile.v2
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/Jamfile.v2 (original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/Jamfile.v2 2010-05-14 19:35:16 EDT (Fri, 14 May 2010)
@@ -6,6 +6,7 @@
 project libs/numeric/bindings/lapack/test : requirements
         <include>$(BOOST_ROOT)
         <include>$(B_ROOT)
+ <library>/numeric-bindings//test_matlib
         <library>/numeric-bindings//lapack_lib ;
 
 import testing ;

Modified: sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/ublas_gesv2.cc
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/ublas_gesv2.cc (original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/ublas_gesv2.cc 2010-05-14 19:35:16 EDT (Fri, 14 May 2010)
@@ -1,3 +1,6 @@
+#if !defined(TEST_MATLIB_UBLAS) && !defined(TEST_MATLIB_GLAS) && !defined(TEST_MATLIB_MTL) && !defined(TEST_MATLIB_EIGEN)
+#define TEST_MATLIB_UBLAS
+#endif
 
 // solving A * X = B
 // using driver function gesv()
@@ -6,28 +9,51 @@
 #include <iostream>
 #include <vector>
 #include <boost/numeric/bindings/lapack/driver/gesv.hpp>
-#include <boost/numeric/bindings/ublas/matrix.hpp>
 #include <boost/numeric/bindings/std/vector.hpp>
+#if defined(TEST_MATLIB_UBLAS)
+#include <boost/numeric/bindings/ublas/matrix.hpp>
 #include <boost/numeric/ublas/matrix_proxy.hpp>
+#elif defined(TEST_MATLIB_GLAS)
+#include <boost/numeric/bindings/glas/dense_matrix.hpp>
+#include <glas/toolbox/la/algorithm/operators.hpp>
+#elif defined(TEST_MATLIB_MTL)
+#include <boost/numeric/bindings/mtl/dense2D.hpp>
+#include <boost/numeric/mtl/operation/operators.hpp>
+#elif defined(TEST_MATLIB_EIGEN)
+#include <boost/numeric/bindings/eigen/matrix.hpp>
+#endif
 #include "utils.h"
 
-namespace ublas = boost::numeric::ublas;
 namespace lapack = boost::numeric::bindings::lapack;
+namespace bindings = boost::numeric::bindings;
+#if defined(TEST_MATLIB_UBLAS)
+namespace ublas = boost::numeric::ublas;
+typedef ublas::matrix<double, ublas::column_major> m_t;
+typedef std::size_t size_type;
+#elif defined(TEST_MATLIB_GLAS)
+using namespace glas::la;
+typedef glas::dense_matrix<double, glas::column_orientation> m_t;
+typedef std::ptrdiff_t size_type;
+#elif defined(TEST_MATLIB_MTL)
+typedef mtl::dense2D<double, mtl::matrix::parameters<mtl::tag::col_major> > m_t;
+typedef std::ptrdiff_t size_type;
+#elif defined(TEST_MATLIB_EIGEN)
+typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> m_t;
+typedef int size_type;
+#endif
 
-using std::size_t;
 using std::cout;
 using std::endl;
 
-typedef ublas::matrix<double, ublas::column_major> m_t;
 
 int main() {
 
   cout << endl;
 
- size_t n = 5;
+ size_type n = 5;
   m_t a (n, n); // system matrix
 
- size_t nrhs = 2;
+ size_type nrhs = 2;
   m_t x (n, nrhs), b (n, nrhs); // b -- right-hand side matrix
 
   init_symm (a);
@@ -39,12 +65,20 @@
 
   m_t aa (a); // copy of a, because a is `lost' after gesv()
 
+#if defined(TEST_MATLIB_UBLAS)
   ublas::matrix_column<m_t> xc0 (x, 0), xc1 (x, 1);
   for (int i = 0; i < xc0.size(); ++i) {
     xc0 (i) = 1.;
     xc1 (i) = 2.;
   }
   b = prod (a, x);
+#elif defined(TEST_MATLIB_GLAS) || defined(TEST_MATLIB_MTL) || defined(TEST_MATLIB_EIGEN)
+ for (int i = 0; i < bindings::size_row (x); ++i) {
+ x (i,0) = 1.;
+ x (i,1) = 2.;
+ }
+ b = a * x;
+#endif
 
   print_m (a, "A");
   cout << endl;
@@ -59,7 +93,11 @@
   print_m (b, "X");
   cout << endl;
 
+#if defined(TEST_MATLIB_UBLAS)
   x = prod (aa, b);
+#elif defined(TEST_MATLIB_GLAS) || defined(TEST_MATLIB_MTL) || defined(TEST_MATLIB_EIGEN)
+ x = aa * b;
+#endif
   print_m (x, "B = A X");
 
   cout << endl;

Modified: sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/utils.h
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/utils.h (original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/lapack/test/utils.h 2010-05-14 19:35:16 EDT (Fri, 14 May 2010)
@@ -97,24 +97,33 @@
 
 
 /////////////////////////////////////
-// matrices
+// matrices
 
-// element access:
+// element access:
 template <typename M>
 struct matr_access_traits {
- typedef typename
- M::reference ref_t;
- //boost::numeric::bindings::traits::matrix_traits<M>::value_type val_t;
- //typedef val_t& ref_t;
- static ref_t elem (M& m, size_t i, size_t j) { return m (i, j); }
+ typedef M mat_t;
+ typedef typename boost::numeric::bindings::value_type<mat_t>::type val_t;
+ typedef typename mat_t::reference ref_t;
+ static ref_t elem (mat_t& m, size_t i, size_t j) { return m (i, j); }
 };
 
+#ifdef EIGEN_FORWARDDECLARATIONS_H
+template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
+struct matr_access_traits<Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> > {
+ typedef Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols> mat_t;
+ typedef typename boost::numeric::bindings::value_type<mat_t>::type val_t;
+ typedef val_t& ref_t;
+ static ref_t elem (mat_t& m, size_t i, size_t j) { return m (i, j); }
+};
+#endif
+
 template <typename M>
 struct matr_access_traits<M const> {
- typedef typename
- boost::numeric::bindings::value_type<M>::type val_t;
+ typedef M const mat_t;
+ typedef typename boost::numeric::bindings::value_type<mat_t>::type val_t;
   typedef val_t ref_t;
- static ref_t elem (M const& m, size_t i, size_t j) { return m (i, j); }
+ static ref_t elem (mat_t& m, size_t i, size_t j) { return m (i, j); }
 };
 
 template <typename M>

Modified: sandbox/numeric_bindings/libs/numeric/bindings/numeric-bindings.jam
==============================================================================
--- sandbox/numeric_bindings/libs/numeric/bindings/numeric-bindings.jam (original)
+++ sandbox/numeric_bindings/libs/numeric/bindings/numeric-bindings.jam 2010-05-14 19:35:16 EDT (Fri, 14 May 2010)
@@ -12,11 +12,19 @@
           mkl-gcc mkl-msvc
         : optional propagated ;
 
+feature matlib
+ : ublas glas mtl eigen
+ : optional propagated ;
+
 # Make this module a project
 import project ;
 project.initialize $(__name__) ;
 project numeric-bindings ;
 
+GLAS_INCLUDE ?= /usr/local/lib ;
+MTL_INCLUDE ?= /usr/local/lib ;
+EIGEN_INCLUDE ?= /usr/local/lib ;
+
 NUMERIC_LIB_PATH ?= /usr/lib ;
 NUMERIC_INCLUDE ?= /usr/local/lib ;
 SUITESPARSE_INCLUDE ?= $(NUMERIC_INCLUDE)/SuiteSparse ;
@@ -58,6 +66,20 @@
 AMD_PATH ?= $(NUMERIC_LIB_PATH) ;
 AMD_LIB ?= amd ;
 
+alias test_matlib : :
+ : : <define>TEST_MATLIB_UBLAS ;
+alias test_matlib : : <matlib>ublas
+ : : <define>TEST_MATLIB_UBLAS ;
+alias test_matlib : : <matlib>glas
+ : : <define>TEST_MATLIB_GLAS
+ <include>$(GLAS_INCLUDE) ;
+alias test_matlib : : <matlib>mtl
+ : : <define>TEST_MATLIB_MTL
+ <include>$(MTL_INCLUDE) ;
+alias test_matlib : : <matlib>eigen
+ : : <define>TEST_MATLIB_EIGEN
+ <include>$(EIGEN_INCLUDE) ;
+
 lib acml_lib : : <name>$(ACML_LIB) <search>$(ACML_PATH)
              : : <define>BIND_FORTRAN_NO_F2C_RETURN_CONVENTIONS ;
 #lib msvc_acml_fortran_lib : : <name>$(ACML_FORTRAN_DLL) <search>$(ACML_DLL_PATH) <toolset>msvc:<link>shared


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk