Add formatter

release/4.3a0
Frank Dellaert 2021-12-23 15:19:38 -05:00
parent c6925987e1
commit c5e6650d67
3 changed files with 23 additions and 22 deletions

View File

@ -135,33 +135,31 @@ namespace gtsam {
}
/* ************************************************************************* */
// Check markdown representation looks as expected.
std::string DecisionTreeFactor::_repr_markdown_() const {
std::string DecisionTreeFactor::_repr_markdown_(
const KeyFormatter& keyFormatter) const {
std::stringstream ss;
// Print out header and calculate number of rows.
// Print out header and construct argument for `cartesianProduct`.
std::vector<std::pair<Key, size_t>> pairs;
ss << "|";
for (auto& key : cardinalities_) {
size_t k = key.second;
ss << key.first << "(" << k << ")|";
for (auto& key : keys()) {
ss << keyFormatter(key) << "|";
pairs.emplace_back(key, cardinalities_.at(key));
}
ss << "value|\n";
// Print out separator with alignment hints.
size_t n = cardinalities_.size();
ss << "|";
for (size_t j = 0; j < n; j++) ss << ":-:|";
for (size_t j = 0; j < size(); j++) ss << ":-:|";
ss << ":-:|\n";
// Print out all rows.
std::vector<std::pair<Key, size_t>> keys(cardinalities_.begin(),
cardinalities_.end());
const auto assignments = cartesianProduct(keys);
for (auto &&assignment : assignments) {
std::vector<std::pair<Key, size_t>> rpairs(pairs.rbegin(), pairs.rend());
const auto assignments = cartesianProduct(rpairs);
for (const auto& assignment : assignments) {
ss << "|";
for (auto& kv : assignment) ss << kv.second << "|";
const double value = operator()(assignment);
ss << value << "|\n";
for (auto& key : keys()) ss << assignment.at(key) << "|";
ss << operator()(assignment) << "|\n";
}
return ss.str();
}

View File

@ -167,7 +167,8 @@ namespace gtsam {
/// @{
/// Render as markdown table.
std::string _repr_markdown_() const;
std::string _repr_markdown_(
const KeyFormatter& keyFormatter = DefaultKeyFormatter) const;
/// @}

View File

@ -83,19 +83,21 @@ TEST( DecisionTreeFactor, sum_max)
}
/* ************************************************************************* */
// Check markdown representation looks as expected.
TEST(DecisionTreeFactor, markdown) {
DiscreteKey v0(0, 3), v1(1, 2);
DecisionTreeFactor f1(v0 & v1, "1 2 3 4 5 6");
DiscreteKey A(12, 3), B(5, 2);
DecisionTreeFactor f1(A & B, "1 2 3 4 5 6");
string expected =
"|0(3)|1(2)|value|\n"
"|A|B|value|\n"
"|:-:|:-:|:-:|\n"
"|0|0|1|\n"
"|1|0|3|\n"
"|2|0|5|\n"
"|0|1|2|\n"
"|1|0|3|\n"
"|1|1|4|\n"
"|2|0|5|\n"
"|2|1|6|\n";
string actual = f1._repr_markdown_();
auto formatter = [](Key key) { return key == 12 ? "A" : "B"; };
string actual = f1._repr_markdown_(formatter);
EXPECT(actual == expected);
}