Skip to content
Snippets Groups Projects
Commit 55c51cbd authored by Rohan Budhiraja's avatar Rohan Budhiraja Committed by Olivier Stasse
Browse files

[eigen] add ostream and istream operators for Eigen/Geoemetry classes.

modify dg::Vector and dg::Matrix istream operators.
parent bfafccbe
No related branches found
No related tags found
No related merge requests found
...@@ -3,6 +3,11 @@ CHANGELOG ...@@ -3,6 +3,11 @@ CHANGELOG
[Current] [Current]
[v3.0.0]
* Replace jrl-mal with eigen
* Add ostream and isteram operators for Eigen Classes
[v2.5.5] [v2.5.5]
* Improve Travis support * Improve Travis support
......
// //
// Copyright 2010 CNRS // Copyright 2016 CNRS
// //
// Author: Rohan Budhiraja // Author: Rohan Budhiraja
// //
...@@ -34,92 +34,126 @@ using dynamicgraph::ExceptionSignal; ...@@ -34,92 +34,126 @@ using dynamicgraph::ExceptionSignal;
/* \brief Eigen Vector input from istream /* \brief Eigen Vector input from istream
* *
* Input Vector format: val1 val2 val3 ... valN * Input Vector format: [N](val1,val2,val3,...,valN)
* e.g. 1 23 32.2 12.12 32 * e.g. [5](1,23,32.2,12.12,32)
*/ */
namespace Eigen { namespace Eigen {
typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE eigen_index; typedef EIGEN_DEFAULT_DENSE_INDEX_TYPE eigen_index;
inline std::istringstream& operator >> (std::istringstream &iss, inline std::istringstream& operator >> (std::istringstream &iss,
dynamicgraph::Vector &inst) dynamicgraph::Vector &inst) {
{ unsigned int _size;
std::vector<double> _stdvec; double _dbl_val;
double _dbl_val; char _ch;
boost::format fmt ("Failed to enter %s as vector. Reenter as [N](val1,val2,val3,...,valN)");
boost::format fmt ("Failed to enter %s as vector. Reenter as [val1 val2 ... valN]"); fmt %iss.str();
fmt %iss.str(); if(iss>> _ch && _ch != '['){
throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str());
while(iss >> _dbl_val && !iss.fail()) { }
_stdvec.push_back(_dbl_val); else {
} if(iss >> _size && !iss.fail()){
try { inst.resize(_size);
inst = Eigen::VectorXd::Map (_stdvec.data(),
boost::numeric_cast<eigen_index> (_stdvec.size()) );
} }
catch (boost::bad_numeric_cast&) { else
throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str() ); 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 /* \brief Eigen Matrix input from istream
* *
* Matrix format: [[val11 val12 val13 ... val1N] ... [valM1 valM2 ... valMN]] * Matrix format: [M,N]((val11,val12,val13,...,val1N),...,(valM1,valM2,...,valMN))
* e.g. [[1 23 32.2 12.12 32][2 32 23 92.01 19.2]] * e.g. [2,5]((1 23 32.2 12.12 32),(2 32 23 92.01 19.2))
*/ */
template<typename Derived> template<typename Derived>
inline std::istringstream& operator >> (std::istringstream &iss, inline std::istringstream& operator >> (std::istringstream &iss,
DenseBase<Derived> &inst) DenseBase<Derived> &inst) {
{ unsigned int _colsize;
std::vector<dynamicgraph::Vector> _stdmat; unsigned int _rowsize;
char _ch; double _dbl_val;
int _vec_size; char _ch;
bool _vec_size_set = false; boost::format fmt ("Failed to enter %s as vector. Reenter as [N](val1,val2,val3,...,valN)");
fmt %iss.str();
boost::format fmt if(iss>> _ch && _ch != '['){
("Failed to enter %s as matrix. Reenter as [[val11 val12 ... val1N]...[valM1 valM2 ... valMN]]. Check that vector sizes are consistent."); throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str());
fmt %iss.str(); }
else {
if(iss>> _ch && _ch != '['){ iss >>_rowsize;
throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); if (iss.peek() == ',' || iss.peek() == ' ')
} iss.ignore();
else{ iss >> _colsize;
dynamicgraph::Vector _eigvec; if (iss.fail())
while(iss >> _eigvec && !iss.fail()){ throw ExceptionSignal(ExceptionSignal::GENERIC,fmt.str());
if (!_vec_size_set) { else {
try { inst.resize(_rowsize,_colsize);
_vec_size = boost::numeric_cast <int> (_eigvec.size()); if(iss >> _ch && _ch != ']')
}
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 != ']'){
throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str());
}
else { else {
try { if(iss>> _ch && _ch != '(')
inst.resize(boost::numeric_cast<eigen_index> (_stdmat.size()), _vec_size);
}
catch (boost::bad_numeric_cast&) {
throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str()); throw ExceptionSignal(ExceptionSignal::GENERIC, fmt.str());
} else {
for (unsigned int i =0;i<_stdmat.size(); i++) { for (unsigned int j=0;j<_rowsize; j++){
inst.row(i) = _stdmat[i]; 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; }
} }
......
...@@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE (custom_vector_registerer) ...@@ -149,7 +149,7 @@ BOOST_AUTO_TEST_CASE (custom_vector_registerer)
Vector v = Vector::Unit(5,i) ; Vector v = Vector::Unit(5,i) ;
std::ostringstream os; std::ostringstream os;
os << v; os << v;
std::istringstream ss (os.str ()); std::istringstream ss ("[5]("+os.str ()+")");
// Set signal value. // Set signal value.
myVectorSignal.set (ss); myVectorSignal.set (ss);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment