Skip to content
Snippets Groups Projects
Commit f90749c6 authored by Rainer Kartmann's avatar Rainer Kartmann
Browse files

Merge branch 'armem-viewer/data-display-ndarray' into 'master'

Memory Viewer: Improve display of NdArrays, fix passing -1 as num rows/cols

See merge request !355
parents 4ee3e4f3 b40fbe3f
No related branches found
No related tags found
No related merge requests found
......@@ -38,6 +38,7 @@ set(SOURCES
instance/serialize_path.cpp
instance/display_visitors/DataDisplayVisitor.cpp
instance/display_visitors/StringStreamMixin.cpp
instance/display_visitors/TypedDataDisplayVisitor.cpp
instance/tree_builders/DataTreeBuilder.cpp
......@@ -87,6 +88,7 @@ set(HEADERS
instance/serialize_path.h
instance/display_visitors/DataDisplayVisitor.h
instance/display_visitors/StringStreamMixin.h
instance/display_visitors/TypedDataDisplayVisitor.h
instance/tree_builders/DataTreeBuilder.h
......
......@@ -5,26 +5,30 @@
namespace armarx::aron
{
std::string DataDisplayVisitor::getValue(const data::VariantPtr& n)
std::string
DataDisplayVisitor::getValue(const data::VariantPtr& n)
{
DataDisplayVisitor v;
data::visit(v, n);
return v.value.str();
}
void DataDisplayVisitor::visitDict(const data::VariantPtr& n)
void
DataDisplayVisitor::visitDict(const data::VariantPtr& n)
{
auto x = data::Dict::DynamicCastAndCheck(n);
value << x->childrenSize() << " items";
}
void DataDisplayVisitor::visitList(const data::VariantPtr& n)
void
DataDisplayVisitor::visitList(const data::VariantPtr& n)
{
auto x = data::List::DynamicCastAndCheck(n);
value << x->childrenSize() << " items";
}
void DataDisplayVisitor::visitBool(const data::VariantPtr& b)
void
DataDisplayVisitor::visitBool(const data::VariantPtr& b)
{
auto x = data::Bool::DynamicCastAndCheck(b);
if (x->getValue())
......@@ -37,41 +41,101 @@ namespace armarx::aron
}
}
void DataDisplayVisitor::visitDouble(const data::VariantPtr& n)
void
DataDisplayVisitor::visitDouble(const data::VariantPtr& n)
{
auto x = data::Double::DynamicCastAndCheck(n);
value << x->getValue();
}
void DataDisplayVisitor::visitFloat(const data::VariantPtr& n)
void
DataDisplayVisitor::visitFloat(const data::VariantPtr& n)
{
auto x = data::Float::DynamicCastAndCheck(n);
value << x->getValue();
}
void DataDisplayVisitor::visitInt(const data::VariantPtr& n)
void
DataDisplayVisitor::visitInt(const data::VariantPtr& n)
{
auto x = data::Int::DynamicCastAndCheck(n);
value << x->getValue();
}
void DataDisplayVisitor::visitLong(const data::VariantPtr& n)
void
DataDisplayVisitor::visitLong(const data::VariantPtr& n)
{
auto x = data::Long::DynamicCastAndCheck(n);
value << x->getValue();
}
void DataDisplayVisitor::visitString(const data::VariantPtr& n)
void
DataDisplayVisitor::visitString(const data::VariantPtr& n)
{
auto x = data::String::DynamicCastAndCheck(n);
value << "'" << x->getValue() << "'";
}
void DataDisplayVisitor::visitNDArray(const data::VariantPtr& n)
void
DataDisplayVisitor::visitNDArray(const data::VariantPtr& data)
{
auto x = data::NDArray::DynamicCastAndCheck(n);
value << "shape " << aron::data::NDArray::DimensionsToString(x->getShape()) << ", type '" << x->getType() << "'";
auto d = data::NDArray::DynamicCastAndCheck(data);
if (d->getType() == "float")
{
setStreamPrecision();
processMatrix<float>(*d);
}
else if (d->getType() == "double")
{
setStreamPrecision();
processMatrix<double>(*d);
}
else
{
printShape(*d);
}
}
void
DataDisplayVisitor::printShape(const data::NDArray& d)
{
value << "shape " << aron::data::NDArray::DimensionsToString(d.getShape()) << ", type '"
<< d.getType() << "'";
}
template <typename ScalarT>
void
DataDisplayVisitor::processMatrix(const data::NDArray& data)
{
const int rows = data.getShape().at(0);
const int cols = data.getShape().at(1);
const Eigen::Map<Eigen::Matrix<ScalarT, Eigen::Dynamic, Eigen::Dynamic>> m(
reinterpret_cast<ScalarT*>(data.getData()), rows, cols);
const int maxRows = 10;
const int maxCols = 10;
if (cols > maxCols)
{
printShape(data);
}
else if (rows > maxRows)
{
int shownRows = 2;
value << "(";
printShape(data);
value << ")\n"
<< m.block(0, 0, shownRows, cols) << "\n...\n"
<< m.block(rows - shownRows, 0, shownRows, cols);
}
else
{
value << m.format(eigenIof);
}
}
}
} // namespace armarx::aron
......@@ -4,20 +4,18 @@
#include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h>
#include "StringStreamMixin.h"
namespace armarx::aron
{
class DataDisplayVisitor : public aron::data::ConstVariantVisitor
class DataDisplayVisitor : public aron::data::ConstVariantVisitor, public StringStreamMixin
{
public:
static std::string getValue(const data::VariantPtr& n);
public:
std::stringstream value;
void visitDict(const data::VariantPtr& n) override;
void visitList(const data::VariantPtr& n) override;
......@@ -30,6 +28,11 @@ namespace armarx::aron
void visitNDArray(const data::VariantPtr& n) override;
private:
template <typename ScalarT>
void processMatrix(const data::NDArray& data);
void printShape(const data::NDArray& data);
};
}
} // namespace armarx::aron
#include "StringStreamMixin.h"
#include <iomanip> // std::setprecision
namespace armarx::aron
{
StringStreamMixin::StringStreamMixin() :
coeffSep(" "), eigenIof(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", "")
{
}
void
StringStreamMixin::setStreamPrecision()
{
setStreamPrecision(value);
}
void
StringStreamMixin::setStreamPrecision(std::ostream& os)
{
os << std::setprecision(2) << std::fixed;
}
} // namespace armarx::aron
#pragma once
#include <sstream>
#include <Eigen/Core>
namespace armarx::aron
{
class StringStreamMixin
{
public:
StringStreamMixin();
protected:
void setStreamPrecision();
void setStreamPrecision(std::ostream& os);
public:
std::stringstream value;
protected:
const std::string coeffSep;
const Eigen::IOFormat eigenIof;
};
} // namespace armarx::aron
......@@ -24,8 +24,7 @@ namespace armarx::aron
return v.value.str();
}
TypedDataDisplayVisitor::TypedDataDisplayVisitor() :
coeffSep(" "), eigenIof(Eigen::StreamPrecision, 0, coeffSep, "\n", "", "", "", "")
TypedDataDisplayVisitor::TypedDataDisplayVisitor()
{
}
......@@ -104,7 +103,9 @@ namespace armarx::aron
TypedDataDisplayVisitor::processMatrix(const type::Matrix& type, const data::NDArray& data)
{
Eigen::Map<Eigen::Matrix<ScalarT, Eigen::Dynamic, Eigen::Dynamic>> m(
reinterpret_cast<ScalarT*>(data.getData()), type.getRows(), type.getCols());
reinterpret_cast<ScalarT*>(data.getData()),
data.getShape().at(0),
data.getShape().at(1));
value << m.format(eigenIof);
}
......@@ -158,28 +159,7 @@ namespace armarx::aron
void
TypedDataDisplayVisitor::visitMatrix(const data::VariantPtr& data, const type::VariantPtr& type)
{
auto t = *type::Matrix::DynamicCastAndCheck(type);
auto d = *data::NDArray::DynamicCastAndCheck(data);
if (std::max(t.getRows(), t.getCols()) > 10)
{
// Just show the shape.
value << DataDisplayVisitor::getValue(data);
}
else if (d.getType() == "float")
{
setStreamPrecision();
processMatrix<float>(t, d);
}
else if (d.getType() == "double")
{
setStreamPrecision();
processMatrix<double>(t, d);
}
else
{
value << DataDisplayVisitor::getValue(data);
}
value << DataDisplayVisitor::getValue(data);
}
void
......@@ -204,16 +184,4 @@ namespace armarx::aron
value << DataDisplayVisitor::getValue(data);
}
void
TypedDataDisplayVisitor::setStreamPrecision()
{
setStreamPrecision(value);
}
void
TypedDataDisplayVisitor::setStreamPrecision(std::ostream& os)
{
os << std::setprecision(2) << std::fixed;
}
} // namespace armarx::aron
......@@ -7,25 +7,22 @@
#include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h>
#include "StringStreamMixin.h"
namespace armarx::aron
{
class TypedDataDisplayVisitor : public aron::data::ConstTypedVariantVisitor
class TypedDataDisplayVisitor :
public aron::data::ConstTypedVariantVisitor,
public StringStreamMixin
{
public:
static std::string getValue(const type::VariantPtr& type, const data::VariantPtr& data);
public:
TypedDataDisplayVisitor();
std::stringstream value;
void visitDict(const data::VariantPtr& data, const type::VariantPtr& type) override;
void visitObject(const data::VariantPtr& data, const type::VariantPtr& type) override;
......@@ -48,14 +45,7 @@ namespace armarx::aron
// What about NDArray? currently defaulted
protected:
std::string coeffSep;
Eigen::IOFormat eigenIof;
private:
template <typename ScalarT>
void processMatrix(const type::Matrix&, const data::NDArray& data);
void processQuaternion(const data::NDArray& data);
......@@ -63,10 +53,6 @@ namespace armarx::aron
void processPose(const type::Matrix&, const data::NDArray& data);
void processPosition(const type::Matrix&, const data::NDArray& data);
void processOrientation(const type::Quaternion&, const data::NDArray& data);
void setStreamPrecision();
void setStreamPrecision(std::ostream& os);
};
}
} // namespace armarx::aron
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