diff --git a/unittest/user_type.cpp b/unittest/user_type.cpp index a6fdeee89031774403abbd52537aa1bf2ab80b30..250f7a15759504c178d242ab9902037bd35e14e5 100644 --- a/unittest/user_type.cpp +++ b/unittest/user_type.cpp @@ -9,6 +9,63 @@ #include <iostream> #include <sstream> +template<typename Scalar> struct CustomType; + +namespace Eigen +{ + /// @brief Eigen::NumTraits<> specialization for casadi::SX + /// + template<typename Scalar> + struct NumTraits< CustomType<Scalar> > + { + typedef CustomType<Scalar> Real; + typedef CustomType<Scalar> NonInteger; + typedef CustomType<Scalar> Literal; + typedef CustomType<Scalar> Nested; + + enum { + // does not support complex Base types + IsComplex = 0 , + // does not support integer Base types + IsInteger = 0 , + // only support signed Base types + IsSigned = 1 , + // must initialize an AD<Base> object + RequireInitialization = 1 , + // computational cost of the corresponding operations + ReadCost = 1 , + AddCost = 2 , + MulCost = 2 + }; + + static Scalar epsilon() + { + return CustomType<Scalar>(std::numeric_limits<Scalar>::epsilon()); + } + + static CustomType<Scalar> dummy_precision() + { + return CustomType<Scalar>(NumTraits<Scalar>::dummy_precision()); + } + + static CustomType<Scalar> highest() + { + return CustomType<Scalar>(std::numeric_limits<Scalar>::max()); + } + + static CustomType<Scalar> lowest() + { + return CustomType<Scalar>(std::numeric_limits<Scalar>::min()); + } + + static int digits10() + { + return std::numeric_limits<Scalar>::digits10; + } + }; +} // namespace Eigen + + template<typename Scalar> struct CustomType { @@ -46,6 +103,12 @@ struct CustomType ss << "value: " << m_value << std::endl; return ss.str(); } + + friend std::ostream & operator <<(std::ostream & os, const CustomType & X) + { + os << X.m_value; + return os; + } protected: @@ -59,6 +122,12 @@ Eigen::Matrix<CustomType<Scalar>,Eigen::Dynamic,Eigen::Dynamic> create(int rows, return Matrix(rows,cols); } +template<typename Scalar> +void print(const Eigen::Matrix<CustomType<Scalar>,Eigen::Dynamic,Eigen::Dynamic> & mat) +{ + std::cout << mat << std::endl; +} + template<typename Scalar> Eigen::Matrix<Scalar,Eigen::Dynamic,Eigen::Dynamic> build_matrix(int rows, int cols) { @@ -104,13 +173,17 @@ BOOST_PYTHON_MODULE(user_type) typedef CustomType<double> DoubleType; typedef Eigen::Matrix<DoubleType,Eigen::Dynamic,Eigen::Dynamic> DoubleMatrix; eigenpy::EigenToPyConverter<DoubleMatrix>::registration(); + eigenpy::EigenFromPyConverter<DoubleMatrix>::registration(); bp::def("create_double",create<double>); expose_custom_type<float>("CustomFloat"); typedef CustomType<float> FloatType; typedef Eigen::Matrix<FloatType,Eigen::Dynamic,Eigen::Dynamic> FloatMatrix; eigenpy::EigenToPyConverter<FloatMatrix>::registration(); + eigenpy::EigenFromPyConverter<FloatMatrix>::registration(); bp::def("create_float",create<float>); bp::def("build_matrix",build_matrix<double>); + bp::def("print",print<double>); + bp::def("print",print<float>); }