diff --git a/ChangeLog b/ChangeLog index 6899fbb19a09d65e3cab61d253d4c47172c0bcfb..155b576a8e367ae96c324a69d62f141cea0a0e74 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,11 @@ CHANGELOG [Current] +[v3.0.0] + * Replace jrl-mal with eigen + * Add ostream and isteram operators for Eigen Classes + + [v2.5.5] * Improve Travis support diff --git a/include/dynamic-graph/eigen-io.h b/include/dynamic-graph/eigen-io.h index f3ee994ddc92a7963478d276dfe49831b6a5bffd..60eab3f023aa56ac11f9e53b0dcc396c77f38ecc 100644 --- a/include/dynamic-graph/eigen-io.h +++ b/include/dynamic-graph/eigen-io.h @@ -1,5 +1,5 @@ // -// Copyright 2010 CNRS +// Copyright 2016 CNRS // // Author: Rohan Budhiraja // @@ -34,92 +34,126 @@ using dynamicgraph::ExceptionSignal; /* \brief Eigen Vector input from istream * - * Input Vector format: val1 val2 val3 ... valN - * e.g. 1 23 32.2 12.12 32 + * Input Vector format: [N](val1,val2,val3,...,valN) + * e.g. [5](1,23,32.2,12.12,32) */ namespace Eigen { typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE eigen_index; inline std::istringstream& operator >> (std::istringstream &iss, - dynamicgraph::Vector &inst) - { - std::vector<double> _stdvec; - double _dbl_val; - - boost::format fmt ("Failed to enter %s as vector. Reenter as [val1 val2 ... valN]"); - fmt %iss.str(); - - while(iss >> _dbl_val && !iss.fail()) { - _stdvec.push_back(_dbl_val); - } - try { - inst = Eigen::VectorXd::Map (_stdvec.data(), - boost::numeric_cast<eigen_index> (_stdvec.size()) ); + dynamicgraph::Vector &inst) { + unsigned int _size; + double _dbl_val; + char _ch; + boost::format fmt ("Failed to enter %s as vector. Reenter as [N](val1,val2,val3,...,valN)"); + fmt %iss.str(); + if(iss>> _ch && _ch != '['){ + throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); + } + else { + if(iss >> _size && !iss.fail()){ + inst.resize(_size); } - catch (boost::bad_numeric_cast&) { - throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str() ); + else + throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); + if(iss >> _ch && _ch != ']') + throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); + else { + if(iss>> _ch && _ch != '(') + throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); + else { + for (unsigned int i=0;i<_size; i++){ + iss >> _dbl_val; + if (iss.peek() == ',' || iss.peek() == ' ') + iss.ignore(); + inst(i) = _dbl_val; + } + if(iss >> _ch && _ch != ')') + throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); + } } - - return iss; } + return iss; + } /* \brief Eigen Matrix input from istream * - * Matrix format: [[val11 val12 val13 ... val1N] ... [valM1 valM2 ... valMN]] - * e.g. [[1 23 32.2 12.12 32][2 32 23 92.01 19.2]] + * Matrix format: [M,N]((val11,val12,val13,...,val1N),...,(valM1,valM2,...,valMN)) + * e.g. [2,5]((1 23 32.2 12.12 32),(2 32 23 92.01 19.2)) */ template<typename Derived> inline std::istringstream& operator >> (std::istringstream &iss, - DenseBase<Derived> &inst) - { - std::vector<dynamicgraph::Vector> _stdmat; - char _ch; - int _vec_size; - bool _vec_size_set = false; - - boost::format fmt - ("Failed to enter %s as matrix. Reenter as [[val11 val12 ... val1N]...[valM1 valM2 ... valMN]]. Check that vector sizes are consistent."); - fmt %iss.str(); - - if(iss>> _ch && _ch != '['){ - throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); - } - else{ - dynamicgraph::Vector _eigvec; - while(iss >> _eigvec && !iss.fail()){ - if (!_vec_size_set) { - try { - _vec_size = boost::numeric_cast <int> (_eigvec.size()); - } - catch (boost::bad_numeric_cast&) { - throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); - } - _vec_size_set = true; - } - else { - if (_eigvec.size() != _vec_size) { - throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); - } - } - _stdmat.push_back(_eigvec); - } - if(iss>> _ch && _ch != ']'){ + DenseBase<Derived> &inst) { + unsigned int _colsize; + unsigned int _rowsize; + double _dbl_val; + char _ch; + boost::format fmt ("Failed to enter %s as vector. Reenter as [N](val1,val2,val3,...,valN)"); + fmt %iss.str(); + if(iss>> _ch && _ch != '['){ + throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); + } + else { + iss >>_rowsize; + if (iss.peek() == ',' || iss.peek() == ' ') + iss.ignore(); + iss >> _colsize; + if (iss.fail()) + throw ExceptionSignal(ExceptionSignal::GENERIC,fmt.str()); + else { + inst.resize(_rowsize,_colsize); + if(iss >> _ch && _ch != ']') throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); - } else { - try { - inst.resize(boost::numeric_cast<eigen_index> (_stdmat.size()), _vec_size); - } - catch (boost::bad_numeric_cast&) { + if(iss>> _ch && _ch != '(') throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); - } - for (unsigned int i =0;i<_stdmat.size(); i++) { - inst.row(i) = _stdmat[i]; + else { + for (unsigned int j=0;j<_rowsize; j++){ + if(iss>> _ch && _ch != '(') + throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); + for (unsigned int i=0;i<_colsize; i++){ + iss >> _dbl_val; + if (iss.peek() == ',' || iss.peek() == ' ') + iss.ignore(); + inst(j,i) = _dbl_val; + } + if(iss >> _ch && _ch != ')') + throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); + if (iss.peek() == ',' || iss.peek() == ' ') + iss.ignore(); + } + if(iss >> _ch && _ch != ')') + throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); } } } - return iss; } + return iss; + } + + + inline std::istringstream& operator >> (std::istringstream &iss, + Transform<double,3,Affine> &inst) { + Matrix4d M; iss >> M; inst = M; return iss; } + + + + inline std::ostream& operator << (std::ostream &os, + Transform<double,3,Affine> MH) { + os << MH.matrix(); return os; } + + + inline std::ostream& operator << (std::ostream &os, + AngleAxisd quat) { + Vector4d v; v(0) = quat.angle(); v.tail<3>() = quat.axis(); + os << v; return os; } + + inline std::istringstream& operator >> (std::istringstream &iss, + AngleAxisd &inst) { + Vector4d v; iss >>v; + inst.angle() = v(0); inst.axis() = v.tail<3>(); + return iss; } + } diff --git a/tests/signal-cast-registerer.cpp b/tests/signal-cast-registerer.cpp index 78dba1ef447b5416964438f28fa44f26fd23feac..1982589f3d3d73f0a8092541a2c781a355845441 100644 --- a/tests/signal-cast-registerer.cpp +++ b/tests/signal-cast-registerer.cpp @@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE (custom_vector_registerer) Vector v = Vector::Unit(5,i) ; std::ostringstream os; os << v; - std::istringstream ss (os.str ()); + std::istringstream ss ("[5]("+os.str ()+")"); // Set signal value. myVectorSignal.set (ss);