Move semantics
parent
6a5dd60d33
commit
ba7674d5fb
|
@ -22,18 +22,15 @@
|
||||||
#include <gtsam/discrete/DecisionTree.h>
|
#include <gtsam/discrete/DecisionTree.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cassert>
|
||||||
#include <cmath>
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <list>
|
#include <iterator>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
#include <optional>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <optional>
|
|
||||||
#include <cassert>
|
|
||||||
#include <iterator>
|
|
||||||
|
|
||||||
namespace gtsam {
|
namespace gtsam {
|
||||||
|
|
||||||
|
@ -251,22 +248,28 @@ namespace gtsam {
|
||||||
label_ = f.label();
|
label_ = f.label();
|
||||||
size_t count = f.nrChoices();
|
size_t count = f.nrChoices();
|
||||||
branches_.reserve(count);
|
branches_.reserve(count);
|
||||||
for (size_t i = 0; i < count; i++)
|
for (size_t i = 0; i < count; i++) {
|
||||||
push_back(f.branches_[i]->apply_f_op_g(g, op));
|
NodePtr newBranch = f.branches_[i]->apply_f_op_g(g, op);
|
||||||
|
push_back(std::move(newBranch));
|
||||||
|
}
|
||||||
} else if (g.label() > f.label()) {
|
} else if (g.label() > f.label()) {
|
||||||
// f lower than g
|
// f lower than g
|
||||||
label_ = g.label();
|
label_ = g.label();
|
||||||
size_t count = g.nrChoices();
|
size_t count = g.nrChoices();
|
||||||
branches_.reserve(count);
|
branches_.reserve(count);
|
||||||
for (size_t i = 0; i < count; i++)
|
for (size_t i = 0; i < count; i++) {
|
||||||
push_back(g.branches_[i]->apply_g_op_fC(f, op));
|
NodePtr newBranch = g.branches_[i]->apply_g_op_fC(f, op);
|
||||||
|
push_back(std::move(newBranch));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
// f same level as g
|
// f same level as g
|
||||||
label_ = f.label();
|
label_ = f.label();
|
||||||
size_t count = f.nrChoices();
|
size_t count = f.nrChoices();
|
||||||
branches_.reserve(count);
|
branches_.reserve(count);
|
||||||
for (size_t i = 0; i < count; i++)
|
for (size_t i = 0; i < count; i++) {
|
||||||
push_back(f.branches_[i]->apply_f_op_g(*g.branches_[i], op));
|
NodePtr newBranch = f.branches_[i]->apply_f_op_g(*g.branches_[i], op);
|
||||||
|
push_back(std::move(newBranch));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,12 +287,12 @@ namespace gtsam {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** add a branch: TODO merge into constructor */
|
/** add a branch: TODO merge into constructor */
|
||||||
void push_back(const NodePtr& node) {
|
void push_back(NodePtr&& node) {
|
||||||
// allSame_ is restricted to leaf nodes in a decision tree
|
// allSame_ is restricted to leaf nodes in a decision tree
|
||||||
if (allSame_ && !branches_.empty()) {
|
if (allSame_ && !branches_.empty()) {
|
||||||
allSame_ = node->sameLeaf(*branches_.back());
|
allSame_ = node->sameLeaf(*branches_.back());
|
||||||
}
|
}
|
||||||
branches_.push_back(node);
|
branches_.push_back(std::move(node));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// print (as a tree).
|
/// print (as a tree).
|
||||||
|
@ -497,9 +500,9 @@ namespace gtsam {
|
||||||
DecisionTree<L, Y>::DecisionTree(const L& label, const Y& y1, const Y& y2) {
|
DecisionTree<L, Y>::DecisionTree(const L& label, const Y& y1, const Y& y2) {
|
||||||
auto a = std::make_shared<Choice>(label, 2);
|
auto a = std::make_shared<Choice>(label, 2);
|
||||||
NodePtr l1(new Leaf(y1)), l2(new Leaf(y2));
|
NodePtr l1(new Leaf(y1)), l2(new Leaf(y2));
|
||||||
a->push_back(l1);
|
a->push_back(std::move(l1));
|
||||||
a->push_back(l2);
|
a->push_back(std::move(l2));
|
||||||
root_ = Choice::Unique(a);
|
root_ = Choice::Unique(std::move(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
|
@ -510,11 +513,10 @@ namespace gtsam {
|
||||||
"DecisionTree: binary constructor called with non-binary label");
|
"DecisionTree: binary constructor called with non-binary label");
|
||||||
auto a = std::make_shared<Choice>(labelC.first, 2);
|
auto a = std::make_shared<Choice>(labelC.first, 2);
|
||||||
NodePtr l1(new Leaf(y1)), l2(new Leaf(y2));
|
NodePtr l1(new Leaf(y1)), l2(new Leaf(y2));
|
||||||
a->push_back(l1);
|
a->push_back(std::move(l1));
|
||||||
a->push_back(l2);
|
a->push_back(std::move(l2));
|
||||||
root_ = Choice::Unique(a);
|
root_ = Choice::Unique(std::move(a));
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************/
|
/****************************************************************************/
|
||||||
template<typename L, typename Y>
|
template<typename L, typename Y>
|
||||||
DecisionTree<L, Y>::DecisionTree(const std::vector<LabelC>& labelCs,
|
DecisionTree<L, Y>::DecisionTree(const std::vector<LabelC>& labelCs,
|
||||||
|
@ -596,8 +598,10 @@ namespace gtsam {
|
||||||
// if label is already in correct order, just put together a choice on label
|
// if label is already in correct order, just put together a choice on label
|
||||||
if (!nrChoices || !highestLabel || label > *highestLabel) {
|
if (!nrChoices || !highestLabel || label > *highestLabel) {
|
||||||
auto choiceOnLabel = std::make_shared<Choice>(label, end - begin);
|
auto choiceOnLabel = std::make_shared<Choice>(label, end - begin);
|
||||||
for (Iterator it = begin; it != end; it++)
|
for (Iterator it = begin; it != end; it++) {
|
||||||
choiceOnLabel->push_back(it->root_);
|
NodePtr root = it->root_;
|
||||||
|
choiceOnLabel->push_back(std::move(root));
|
||||||
|
}
|
||||||
// If no reordering, no need to call Choice::Unique
|
// If no reordering, no need to call Choice::Unique
|
||||||
return choiceOnLabel;
|
return choiceOnLabel;
|
||||||
} else {
|
} else {
|
||||||
|
@ -616,7 +620,7 @@ namespace gtsam {
|
||||||
}
|
}
|
||||||
// We then recurse, for all values of the highest label
|
// We then recurse, for all values of the highest label
|
||||||
NodePtr fi = compose(functions.begin(), functions.end(), label);
|
NodePtr fi = compose(functions.begin(), functions.end(), label);
|
||||||
choiceOnHighestLabel->push_back(fi);
|
choiceOnHighestLabel->push_back(std::move(fi));
|
||||||
}
|
}
|
||||||
return choiceOnHighestLabel;
|
return choiceOnHighestLabel;
|
||||||
}
|
}
|
||||||
|
@ -673,6 +677,7 @@ namespace gtsam {
|
||||||
// Creates one tree (i.e.,function) for each choice of current key
|
// Creates one tree (i.e.,function) for each choice of current key
|
||||||
// by calling create recursively, and then puts them all together.
|
// by calling create recursively, and then puts them all together.
|
||||||
std::vector<DecisionTree> functions;
|
std::vector<DecisionTree> functions;
|
||||||
|
functions.reserve(nrChoices);
|
||||||
size_t split = size / nrChoices;
|
size_t split = size / nrChoices;
|
||||||
for (size_t i = 0; i < nrChoices; i++, beginY += split) {
|
for (size_t i = 0; i < nrChoices; i++, beginY += split) {
|
||||||
NodePtr f = build<It, ValueIt>(labelC, end, beginY, beginY + split);
|
NodePtr f = build<It, ValueIt>(labelC, end, beginY, beginY + split);
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <sstream>
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
Loading…
Reference in New Issue