31 void HybridNonlinearISAM::saveGraph(
const string&
s,
33 isam_.saveGraph(
s, keyFormatter);
38 const Values& initialValues,
39 const std::optional<size_t>& maxNrLeaves,
40 const std::optional<Ordering>&
ordering) {
41 if (newFactors.
size() > 0) {
43 if (reorderInterval_ > 0 && ++reorderCounter_ >= reorderInterval_) {
48 factors_.push_back(newFactors);
52 linPoint_.insert(initialValues);
54 std::shared_ptr<HybridGaussianFactorGraph> linearizedNewFactors =
58 isam_.update(*linearizedNewFactors, maxNrLeaves,
ordering,
59 eliminationFunction_);
64 void HybridNonlinearISAM::reorderRelinearize() {
65 if (factors_.size() > 0) {
67 const Values newLinPoint = estimate();
71 auto discreteRoot = isam_.roots().at(0)->conditional();
75 discreteProbabilities = discreteRoot->asDiscrete();
82 for (
auto&&
factor : factors_) {
83 if (
auto nf = std::dynamic_pointer_cast<HybridNonlinearFactor>(
factor)) {
84 pruned_factors.
push_back(nf->prune(*discreteProbabilities));
89 factors_ = pruned_factors;
94 isam_.update(*factors_.linearize(newLinPoint), {}, {},
95 eliminationFunction_);
98 linPoint_ = newLinPoint;
105 if (isam_.size() > 0) {
107 assignment_ =
values.discrete();
108 return linPoint_.retract(
values.continuous());
122 cout <<
s <<
"ReorderInterval: " << reorderInterval_
123 <<
" Current Count: " << reorderCounter_ << endl;
124 std::cout <<
"HybridGaussianISAM:" << std::endl;
125 isam_.print(
"", keyFormatter);
126 linPoint_.print(
"Linearization Point:\n", keyFormatter);
127 std::cout <<
"Nonlinear Graph:" << std::endl;
128 factors_.print(
"", keyFormatter);
132 void HybridNonlinearISAM::printStats()
const {
133 isam_.getCliqueData().getStats().print();