32 std::cout << (
s.empty() ?
"" :
s +
" ") << std::endl;
33 std::cout <<
"size: " <<
size() << std::endl;
36 ss <<
"factor " <<
i <<
": ";
39 std::cout << std::endl;
48 const std::function<
bool(
const Factor* ,
double ,
49 size_t )>& printCondition)
const {
50 std::cout <<
str <<
"size: " <<
size() << std::endl << std::endl;
56 std::cout <<
"Factor " <<
i <<
": ";
59 ss.str(std::string());
61 if (
auto mf = std::dynamic_pointer_cast<HybridNonlinearFactor>(
factor)) {
63 std::cout <<
"nullptr"
66 factor->print(
ss.str(), keyFormatter);
67 std::cout <<
"error = ";
68 mf->errorTree(
values.nonlinear()).print(
"", keyFormatter);
69 std::cout << std::endl;
72 std::dynamic_pointer_cast<HybridGaussianFactor>(
factor)) {
74 std::cout <<
"nullptr"
77 factor->print(
ss.str(), keyFormatter);
78 std::cout <<
"error = ";
79 gmf->errorTree(
values.continuous()).print(
"", keyFormatter);
80 std::cout << std::endl;
82 }
else if (
auto gm = std::dynamic_pointer_cast<HybridGaussianConditional>(
85 std::cout <<
"nullptr"
88 factor->print(
ss.str(), keyFormatter);
89 std::cout <<
"error = ";
90 gm->errorTree(
values.continuous()).print(
"", keyFormatter);
91 std::cout << std::endl;
93 }
else if (
auto nf = std::dynamic_pointer_cast<NonlinearFactor>(
factor)) {
94 const double errorValue = (
factor !=
nullptr ? nf->error(
values) : .0);
95 if (!printCondition(
factor.get(), errorValue,
i))
99 std::cout <<
"nullptr"
102 factor->print(
ss.str(), keyFormatter);
103 std::cout <<
"error = " << errorValue <<
"\n";
105 }
else if (
auto gf = std::dynamic_pointer_cast<GaussianFactor>(
factor)) {
106 const double errorValue = (
factor !=
nullptr ? gf->error(
values) : .0);
107 if (!printCondition(
factor.get(), errorValue,
i))
111 std::cout <<
"nullptr"
114 factor->print(
ss.str(), keyFormatter);
115 std::cout <<
"error = " << errorValue <<
"\n";
117 }
else if (
auto df = std::dynamic_pointer_cast<DiscreteFactor>(
factor)) {
119 std::cout <<
"nullptr"
122 factor->print(
ss.str(), keyFormatter);
123 std::cout <<
"error = ";
124 df->errorTree().print(
"", keyFormatter);
125 std::cout << std::endl;
139 const Values& continuousValues)
const {
140 using std::dynamic_pointer_cast;
143 auto linearFG = std::make_shared<HybridGaussianFactorGraph>();
145 linearFG->reserve(
size());
154 if (
auto mf = dynamic_pointer_cast<HybridNonlinearFactor>(
f)) {
156 mf->linearize(continuousValues);
157 linearFG->push_back(gmf);
158 }
else if (
auto nlf = dynamic_pointer_cast<NonlinearFactor>(
f)) {
160 linearFG->push_back(gf);
161 }
else if (dynamic_pointer_cast<DiscreteFactor>(
f)) {
163 linearFG->push_back(
f);
164 }
else if (
auto gmf = dynamic_pointer_cast<HybridGaussianFactor>(
f)) {
165 linearFG->push_back(gmf);
166 }
else if (
auto gm = dynamic_pointer_cast<HybridGaussianConditional>(
f)) {
167 linearFG->push_back(gm);
168 }
else if (dynamic_pointer_cast<GaussianFactor>(
f)) {
169 linearFG->push_back(
f);
172 throw std::invalid_argument(
173 std::string(
"HybridNonlinearFactorGraph::linearize: factor type "
188 if (
auto hnf = std::dynamic_pointer_cast<HybridNonlinearFactor>(
factor)) {
192 }
else if (
auto nf = std::dynamic_pointer_cast<NonlinearFactor>(
factor)) {
197 }
else if (
auto df = std::dynamic_pointer_cast<DiscreteFactor>(
factor)) {
202 throw std::runtime_error(
203 "HybridNonlinearFactorGraph::errorTree(Values) not implemented for "
214 const Values& continuousValues)
const {
226 using std::dynamic_pointer_cast;
236 if (
auto hf = dynamic_pointer_cast<HybridFactor>(
f)) {
237 result.push_back(hf->restrict(discreteValues));
238 }
else if (
auto df = dynamic_pointer_cast<DiscreteFactor>(
f)) {
239 auto restricted_df = df->restrict(discreteValues);
245 if (restricted_df->discreteKeys().size() > 0) {
246 result.push_back(restricted_df);