Recursive print

release/4.3a0
Frank Dellaert 2015-07-08 23:21:35 -07:00
parent f7c5f0cb79
commit 6df0d49769
3 changed files with 46 additions and 13 deletions

View File

@ -29,7 +29,7 @@ namespace gtsam {
template<typename T>
void Expression<T>::print(const std::string& s) const {
std::cout << s << *root_ << std::endl;
root_->print(s);
}
template<typename T>
@ -155,7 +155,7 @@ size_t Expression<T>::traceSize() const {
template<typename T>
T Expression<T>::valueAndDerivatives(const Values& values,
const FastVector<Key>& keys, const FastVector<int>& dims,
const KeyVector& keys, const FastVector<int>& dims,
std::vector<Matrix>& H) const {
// H should be pre-allocated
@ -205,6 +205,7 @@ T Expression<T>::valueAndJacobianMap(const Values& values,
internal::ExecutionTrace<T> trace;
T value(this->traceExecution(values, trace, traceStorage));
GTSAM_PRINT(trace);
trace.startReverseAD1(jacobians);
#ifdef _MSC_VER
@ -219,7 +220,7 @@ typename Expression<T>::KeysAndDims Expression<T>::keysAndDims() const {
std::map<Key, int> map;
dims(map);
size_t n = map.size();
KeysAndDims pair = std::make_pair(FastVector<Key>(n), FastVector<int>(n));
KeysAndDims pair = std::make_pair(KeyVector(n), FastVector<int>(n));
boost::copy(map | boost::adaptors::map_keys, pair.first.begin());
boost::copy(map | boost::adaptors::map_values, pair.second.begin());
return pair;

View File

@ -173,11 +173,11 @@ public:
private:
/// Keys and dimensions in same order
typedef std::pair<FastVector<Key>, FastVector<int> > KeysAndDims;
typedef std::pair<KeyVector, FastVector<int> > KeysAndDims;
KeysAndDims keysAndDims() const;
/// private version that takes keys and dimensions, returns derivatives
T valueAndDerivatives(const Values& values, const FastVector<Key>& keys,
T valueAndDerivatives(const Values& values, const KeyVector& keys,
const FastVector<int>& dims, std::vector<Matrix>& H) const;
/// trace execution, very unsafe

View File

@ -78,13 +78,14 @@ public:
virtual ~ExpressionNode() {
}
/// Print
virtual void print(const std::string& indent = "") const = 0;
/// Streaming
GTSAM_EXPORT
friend std::ostream &operator<<(std::ostream &os,
const ExpressionNode& node) {
friend std::ostream& operator<<(std::ostream& os, const ExpressionNode& node) {
os << "Expression of type " << typeid(T).name();
if (node.traceSize_ > 0)
os << ", trace size = " << node.traceSize_;
if (node.traceSize_ > 0) os << ", trace size = " << node.traceSize_;
os << "\n";
return os;
}
@ -133,6 +134,11 @@ public:
virtual ~ConstantExpression() {
}
/// Print
virtual void print(const std::string& indent = "") const {
std::cout << indent << "Constant" << std::endl;
}
/// Return value
virtual T value(const Values& values) const {
return constant_;
@ -167,6 +173,11 @@ public:
virtual ~LeafExpression() {
}
/// Print
virtual void print(const std::string& indent = "") const {
std::cout << indent << "Leaf, key = " << key_ << std::endl;
}
/// Return keys that play in this expression
virtual std::set<Key> keys() const {
std::set<Key> keys;
@ -226,6 +237,12 @@ public:
virtual ~UnaryExpression() {
}
/// Print
virtual void print(const std::string& indent = "") const {
std::cout << indent << "UnaryExpression" << std::endl;
expression1_->print(indent + " ");
}
/// Return value
virtual T value(const Values& values) const {
return function_(expression1_->value(values), boost::none);
@ -329,6 +346,13 @@ public:
virtual ~BinaryExpression() {
}
/// Print
virtual void print(const std::string& indent = "") const {
std::cout << indent << "BinaryExpression" << std::endl;
expression1_->print(indent + " ");
expression2_->print(indent + " ");
}
/// Return value
virtual T value(const Values& values) const {
using boost::none;
@ -428,6 +452,14 @@ public:
virtual ~TernaryExpression() {
}
/// Print
virtual void print(const std::string& indent = "") const {
std::cout << indent << "TernaryExpression" << std::endl;
expression1_->print(indent + " ");
expression2_->print(indent + " ");
expression3_->print(indent + " ");
}
/// Return value
virtual T value(const Values& values) const {
using boost::none;