diff --git a/.travis.yml b/.travis.yml index 8806fee3ed4bff995b820ef708748573ce9f90b6..e034df2d5b3f6b8586f82e25bb5a7a347795913c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,7 @@ language: python sudo: required +git: + depth: false compiler: - gcc # - clang diff --git a/CMakeLists.txt b/CMakeLists.txt index a7bb4914ffe9e2117c2a9380baa31cdbd56ade50..43d10098f3d446202f12221184bd1d5c70722c33 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -141,6 +141,14 @@ SET(${PROJECT_NAME}_SOURCES ${${PROJECT_NAME}_DECOMPOSITIONS_SOURCES} src/exception.cpp src/eigenpy.cpp + src/matrix-float.cpp + src/matrix-complex-float.cpp + src/matrix-complex-double.cpp + src/matrix-double.cpp + src/matrix-long-double.cpp + src/matrix-complex-long-double.cpp + src/matrix-int.cpp + src/matrix-long.cpp src/angle-axis.cpp src/quaternion.cpp src/geometry-conversion.cpp diff --git a/include/eigenpy/details.hpp b/include/eigenpy/details.hpp index 89ebdc4009ced99a7d0b40612ac89eaead33d377..58a8a6b2c3364f3f404767ebc52c4fe962e8f724 100644 --- a/include/eigenpy/details.hpp +++ b/include/eigenpy/details.hpp @@ -111,10 +111,14 @@ namespace eigenpy struct CastMatToMat { template<typename MatrixIn, typename MatrixOut> - static void run(const Eigen::MatrixBase<MatrixIn> & input, const Eigen::MatrixBase<MatrixOut> & dest) + static void run(const Eigen::MatrixBase<MatrixIn> & input, + const Eigen::MatrixBase<MatrixOut> & dest) { MatrixOut & dest_ = const_cast<MatrixOut &>(dest.derived()); - dest_ = input.template cast<NewScalar>(); + if(dest.rows() == input.rows()) + dest_ = input.template cast<NewScalar>(); + else + dest_ = input.transpose().template cast<NewScalar>(); } }; @@ -126,6 +130,7 @@ namespace eigenpy const Eigen::MatrixBase<MatrixOut> & /*dest*/) { // do nothing + assert("Must never happened"); } }; @@ -192,9 +197,15 @@ namespace eigenpy const MatrixDerived & mat = const_cast<const MatrixDerived &>(mat_.derived()); const int pyArray_Type = GET_PY_ARRAY_TYPE(pyArray); - if(pyArray_Type == NumpyEquivalentType<Scalar>::type_code) + typedef typename MapNumpy<MatType,Scalar>::EigenMap MapType; + + if(pyArray_Type == NumpyEquivalentType<Scalar>::type_code) // no cast needed { - MapNumpy<MatType,Scalar>::map(pyArray) = mat; // no cast needed + MapType map_pyArray = MapNumpy<MatType,Scalar>::map(pyArray); + if(mat.rows() == map_pyArray.rows()) + map_pyArray = mat; + else + map_pyArray = mat.transpose(); return; } @@ -260,13 +271,14 @@ namespace eigenpy typedef typename MatType::Scalar Scalar; assert( (mat.rows()<INT_MAX) && (mat.cols()<INT_MAX) && "Matrix range larger than int ... should never happen." ); - const int R = (int)mat.rows(), C = (int)mat.cols(); + const npy_intp R = (npy_intp)mat.rows(), C = (npy_intp)mat.cols(); PyArrayObject* pyArray; // Allocate Python memory - if(C == 1 && NumpyType::getType() == ARRAY_TYPE && MatType::IsVectorAtCompileTime) // Handle array with a single dimension + if( ( (((C == 1) xor (R == 1)) && !MatType::IsVectorAtCompileTime) || MatType::IsVectorAtCompileTime) + && NumpyType::getType() == ARRAY_TYPE) // Handle array with a single dimension { - npy_intp shape[1] = { R }; + npy_intp shape[1] = { C == 1 ? R : C }; pyArray = (PyArrayObject*) PyArray_SimpleNew(1, shape, NumpyEquivalentType<Scalar>::type_code); } diff --git a/include/eigenpy/eigenpy.hpp b/include/eigenpy/eigenpy.hpp index 24c7b7400e75601f9f2b6d64947c8a92cd175a80..b9668da4dc930d6354b67b41b5670738608f8401 100644 --- a/include/eigenpy/eigenpy.hpp +++ b/include/eigenpy/eigenpy.hpp @@ -24,12 +24,38 @@ #endif // if EIGEN_VERSION_AT_LEAST(3,2,0) +#define EIGENPY_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \ + /** \ingroup matrixtypedefs */ \ + typedef Eigen::Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix; \ + /** \ingroup matrixtypedefs */ \ + typedef Eigen::Matrix<Type, Size, 1> Vector##SizeSuffix##TypeSuffix; \ + /** \ingroup matrixtypedefs */ \ + typedef Eigen::Matrix<Type, 1, Size> RowVector##SizeSuffix##TypeSuffix; + +#define EIGENPY_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size) \ + /** \ingroup matrixtypedefs */ \ + typedef Eigen::Matrix<Type, Size, Eigen::Dynamic> Matrix##Size##X##TypeSuffix; \ + /** \ingroup matrixtypedefs */ \ + typedef Eigen::Matrix<Type, Eigen::Dynamic, Size> Matrix##X##Size##TypeSuffix; + +#define EIGENPY_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \ + EIGENPY_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \ + EIGENPY_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \ + EIGENPY_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \ + EIGENPY_MAKE_TYPEDEFS(Type, TypeSuffix, Eigen::Dynamic, X) \ + EIGENPY_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \ + EIGENPY_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \ + EIGENPY_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4) + namespace eigenpy { /* Enable Eigen-Numpy serialization for a set of standard MatrixBase instance. */ void EIGENPY_DLLEXPORT enableEigenPy(); + /* Enable the Eigen--Numpy serialization for the templated MatrixBase class. + * The second template argument is used for inheritance of Eigen classes. If + * using a native Eigen::MatrixBase, simply repeat the same arg twice. */ template<typename MatType> void enableEigenPySpecific(); @@ -39,10 +65,36 @@ namespace eigenpy template<typename MatType,typename EigenEquivalentType> EIGENPY_DEPRECATED void enableEigenPySpecific(); + template<typename Scalar> + EIGEN_DONT_INLINE void exposeType() + { + EIGENPY_MAKE_TYPEDEFS_ALL_SIZES(Scalar,s); + + ENABLE_SPECIFIC_MATRIX_TYPE(Vector2s); + ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2s); + ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2s); + ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xs); + ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2s); + + ENABLE_SPECIFIC_MATRIX_TYPE(Vector3s); + ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3s); + ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3s); + ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xs); + ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3s); + + ENABLE_SPECIFIC_MATRIX_TYPE(Vector4s); + ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4s); + ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4s); + ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xs); + ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4s); + + ENABLE_SPECIFIC_MATRIX_TYPE(VectorXs); + ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXs); + ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXs); + } } // namespace eigenpy #include "eigenpy/details.hpp" #endif // ifndef __eigenpy_eigenpy_hpp__ - diff --git a/src/eigenpy.cpp b/src/eigenpy.cpp index 9956e65804b0b0e296c5723f6ae6a1c1a2d61193..c85030b1ff9d87a689ec609635f5caba42f39fb5 100644 --- a/src/eigenpy.cpp +++ b/src/eigenpy.cpp @@ -6,38 +6,6 @@ #include "eigenpy/eigenpy.hpp" #include <stdlib.h> -namespace Eigen -{ - #define EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Size, SizeSuffix) \ - /** \ingroup matrixtypedefs */ \ - typedef Matrix<Type, Size, Size> Matrix##SizeSuffix##TypeSuffix; \ - /** \ingroup matrixtypedefs */ \ - typedef Matrix<Type, Size, 1> Vector##SizeSuffix##TypeSuffix; \ - /** \ingroup matrixtypedefs */ \ - typedef Matrix<Type, 1, Size> RowVector##SizeSuffix##TypeSuffix; - - #define EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, Size) \ - /** \ingroup matrixtypedefs */ \ - typedef Matrix<Type, Size, Dynamic> Matrix##Size##X##TypeSuffix; \ - /** \ingroup matrixtypedefs */ \ - typedef Matrix<Type, Dynamic, Size> Matrix##X##Size##TypeSuffix; - - #define EIGEN_MAKE_TYPEDEFS_ALL_SIZES(Type, TypeSuffix) \ - EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 2, 2) \ - EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 3, 3) \ - EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, 4, 4) \ - EIGEN_MAKE_TYPEDEFS(Type, TypeSuffix, Dynamic, X) \ - EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 2) \ - EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 3) \ - EIGEN_MAKE_FIXED_TYPEDEFS(Type, TypeSuffix, 4) - - EIGEN_MAKE_TYPEDEFS_ALL_SIZES(long double, ld) - EIGEN_MAKE_TYPEDEFS_ALL_SIZES(std::complex<long double>, cld) - - #undef EIGEN_MAKE_TYPEDEFS_ALL_SIZES - #undef EIGEN_MAKE_TYPEDEFS - #undef EIGEN_MAKE_FIXED_TYPEDEFS -} namespace eigenpy { @@ -47,6 +15,16 @@ namespace eigenpy srand(seed_value); } + void exposeMatrixInt(); + void exposeMatrixLong(); + void exposeMatrixFloat(); + void exposeMatrixDouble(); + void exposeMatrixLongDouble(); + + void exposeMatrixComplexFloat(); + void exposeMatrixComplexDouble(); + void exposeMatrixComplexLongDouble(); + /* Enable Eigen-Numpy serialization for a set of standard MatrixBase instances. */ void enableEigenPy() { @@ -70,147 +48,15 @@ namespace eigenpy bp::def("seed",&seed,bp::arg("seed_value"), "Initialize the pseudo-random number generator with the argument seed_value."); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2ld); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2d); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2f); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2i); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2cf); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2cd); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xld); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xd); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xf); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xi); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xcf); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xcd); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix2Xcld); - - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3ld); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3d); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3f); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3i); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3cf); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3cd); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xd); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xf); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xi); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xcf); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xcd); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix3Xcld); - - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4ld); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4d); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4f); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4i); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4cf); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4cd); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xld); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xd); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xf); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xi); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xcf); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xcd); - ENABLE_SPECIFIC_MATRIX_TYPE(Matrix4Xcld); - - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2ld); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2d); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2f); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2i); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2cf); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2cd); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX2cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3ld); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3d); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3f); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3i); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3cf); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3cd); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX3cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4ld); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4d); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4f); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4i); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4cf); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4cd); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixX4cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXld); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXd); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXf); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXi); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXcf); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXcd); - ENABLE_SPECIFIC_MATRIX_TYPE(MatrixXcld); - - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2ld); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2d); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2f); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2i); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2cf); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector2cd); - - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3ld); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3d); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3f); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3i); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3cf); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3cd); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector3cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4ld); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4d); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4f); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4i); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4cf); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4cd); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVector4cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXld); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXd); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXf); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXi); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXcf); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXcd); - ENABLE_SPECIFIC_MATRIX_TYPE(RowVectorXcld); - - ENABLE_SPECIFIC_MATRIX_TYPE(Vector2ld); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector2d); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector2f); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector2i); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector2cf); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector2cd); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector2cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(Vector3ld); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector3d); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector3f); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector3i); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector3cf); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector3cd); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector3cld); - - ENABLE_SPECIFIC_MATRIX_TYPE(Vector4ld); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector4d); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector4f); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector4i); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector4cf); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector4cd); - ENABLE_SPECIFIC_MATRIX_TYPE(Vector4cld); + exposeMatrixInt(); + exposeMatrixLong(); + exposeMatrixFloat(); + exposeMatrixDouble(); + exposeMatrixLongDouble(); - ENABLE_SPECIFIC_MATRIX_TYPE(VectorXld); - ENABLE_SPECIFIC_MATRIX_TYPE(VectorXd); - ENABLE_SPECIFIC_MATRIX_TYPE(VectorXf); - ENABLE_SPECIFIC_MATRIX_TYPE(VectorXi); - ENABLE_SPECIFIC_MATRIX_TYPE(VectorXcf); - ENABLE_SPECIFIC_MATRIX_TYPE(VectorXcd); - ENABLE_SPECIFIC_MATRIX_TYPE(VectorXcld); + exposeMatrixComplexFloat(); + exposeMatrixComplexDouble(); + exposeMatrixComplexLongDouble(); } } // namespace eigenpy diff --git a/src/matrix-complex-double.cpp b/src/matrix-complex-double.cpp new file mode 100644 index 0000000000000000000000000000000000000000..899f88fcc7ba53faf94f577fcd5c02844ef74e79 --- /dev/null +++ b/src/matrix-complex-double.cpp @@ -0,0 +1,13 @@ +/* + * Copyright 2020 INRIA + */ + +#include "eigenpy/eigenpy.hpp" + +namespace eigenpy +{ + void exposeMatrixComplexDouble() + { + exposeType<std::complex<double> >(); + } +} diff --git a/src/matrix-complex-float.cpp b/src/matrix-complex-float.cpp new file mode 100644 index 0000000000000000000000000000000000000000..323c52d761d71c4427e610f40f3679409ad87343 --- /dev/null +++ b/src/matrix-complex-float.cpp @@ -0,0 +1,13 @@ +/* + * Copyright 2020 INRIA + */ + +#include "eigenpy/eigenpy.hpp" + +namespace eigenpy +{ + void exposeMatrixComplexFloat() + { + exposeType<std::complex<float> >(); + } +} diff --git a/src/matrix-complex-long-double.cpp b/src/matrix-complex-long-double.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1f987ae10ef913941d9a34d70362f7f11ae41779 --- /dev/null +++ b/src/matrix-complex-long-double.cpp @@ -0,0 +1,13 @@ +/* + * Copyright 2020 INRIA + */ + +#include "eigenpy/eigenpy.hpp" + +namespace eigenpy +{ + void exposeMatrixComplexLongDouble() + { + exposeType<std::complex<long double> >(); + } +} diff --git a/src/matrix-double.cpp b/src/matrix-double.cpp new file mode 100644 index 0000000000000000000000000000000000000000..dc84a9c257af26261b39093872dda7c4acb70a30 --- /dev/null +++ b/src/matrix-double.cpp @@ -0,0 +1,13 @@ +/* + * Copyright 2020 INRIA + */ + +#include "eigenpy/eigenpy.hpp" + +namespace eigenpy +{ + void exposeMatrixDouble() + { + exposeType<double>(); + } +} diff --git a/src/matrix-float.cpp b/src/matrix-float.cpp new file mode 100644 index 0000000000000000000000000000000000000000..100b8e9ee77799a0d0cb8e4484abced47a5e3f78 --- /dev/null +++ b/src/matrix-float.cpp @@ -0,0 +1,13 @@ +/* + * Copyright 2020 INRIA + */ + +#include "eigenpy/eigenpy.hpp" + +namespace eigenpy +{ + void exposeMatrixFloat() + { + exposeType<float>(); + } +} diff --git a/src/matrix-int.cpp b/src/matrix-int.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a4b0d8b2f8f1803350330df7558ca7e764032e5c --- /dev/null +++ b/src/matrix-int.cpp @@ -0,0 +1,13 @@ +/* + * Copyright 2020 INRIA + */ + +#include "eigenpy/eigenpy.hpp" + +namespace eigenpy +{ + void exposeMatrixInt() + { + exposeType<int>(); + } +} diff --git a/src/matrix-long-double.cpp b/src/matrix-long-double.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1b2a8f71eed54fa5620ff446e8b000f29a7499ce --- /dev/null +++ b/src/matrix-long-double.cpp @@ -0,0 +1,13 @@ +/* + * Copyright 2020 INRIA + */ + +#include "eigenpy/eigenpy.hpp" + +namespace eigenpy +{ + void exposeMatrixLongDouble() + { + exposeType<long double>(); + } +} diff --git a/src/matrix-long.cpp b/src/matrix-long.cpp new file mode 100644 index 0000000000000000000000000000000000000000..835b6cce0c227305b4a0e203cedfed5f04a56a9e --- /dev/null +++ b/src/matrix-long.cpp @@ -0,0 +1,13 @@ +/* + * Copyright 2020 INRIA + */ + +#include "eigenpy/eigenpy.hpp" + +namespace eigenpy +{ + void exposeMatrixLong() + { + exposeType<long>(); + } +} diff --git a/unittest/python/test_matrix.py b/unittest/python/test_matrix.py index 41a450c9701b7145400b7e135d3c1cc09a21a0a8..18fce68edb6a3bbb6936bf9922aabca5f77abfc6 100644 --- a/unittest/python/test_matrix.py +++ b/unittest/python/test_matrix.py @@ -62,19 +62,19 @@ assert( np.array_equal(M,eigenpy.reflex(M,verbose)) ); if verbose: print("===> Block Vector 1x0:6:2") M = Mref[1:2,0:6:2] -assert( np.array_equal(M,eigenpy.reflex(M,verbose)) ); +assert( np.array_equal(M.squeeze(),eigenpy.reflex(M,verbose)) ); if verbose: print("===> Block Vector 1x0:6:2 tanspose") M = Mref[1:2,0:6:2].T -assert( np.array_equal(M,eigenpy.reflex(M,verbose)) ); +assert( np.array_equal(M.squeeze(),eigenpy.reflex(M,verbose)) ); if verbose: print("===> Block Vector 0:6:2x1") M = Mref[0:6:2,1:2] -assert( np.array_equal(M,eigenpy.reflex(M,verbose)) ); +assert( np.array_equal(M.squeeze(),eigenpy.reflex(M,verbose)) ); if verbose: print("===> Block Vector 0:6:2x1 tanspose") M = Mref[0:6:2,1:2].T -assert( np.array_equal(M,eigenpy.reflex(M,verbose)) ); +assert( np.array_equal(M.squeeze(),eigenpy.reflex(M,verbose)) ); if verbose: print("===> From Py to Eigen::VectorXd") if verbose: print("===> From Py to Eigen::VectorXd") @@ -87,7 +87,7 @@ M = Mref[0:6:2,1].T if verbose: print("===> Block Vector 0:6:2x1") M = Mref[0:6:2,1:2] -assert( np.array_equal(M,eigenpy.reflexV(M,verbose)) ); +assert( np.array_equal(M.squeeze(),eigenpy.reflexV(M,verbose)) ); if verbose: print("===> Block Vector 0:6:2x1 transpose") M = Mref[0:6:2,1:2].T