Go to the documentation of this file.
42 using P = std::vector<std::pair<Vector, double>>;
45 template <
typename... Args>
50 std::vector<GaussianFactorValuePair> fvs;
51 std::vector<GC::shared_ptr> gcs;
52 fvs.reserve(
p.size());
53 gcs.reserve(
p.size());
55 auto gaussianConditional =
57 double value = gaussianConditional->negLogConstant();
59 fvs.emplace_back(gaussianConditional,
value);
60 gcs.push_back(gaussianConditional);
77 value =
c->negLogConstant();
80 return {std::dynamic_pointer_cast<GaussianFactor>(
c),
value};
84 throw std::runtime_error(
85 "HybridGaussianConditional: need at least one frontal variable. "
86 "Provided conditionals do not contain any frontal variables.");
97 negLogConstant_(helper.minNegLogConstant) {}
101 const std::vector<GaussianConditional::shared_ptr> &
conditionals)
107 const std::vector<std::pair<Vector, double>> &
parameters)
114 const std::vector<std::pair<Vector, double>> &
parameters)
122 const std::vector<std::pair<Vector, double>> &
parameters)
147 if (Cgm_Kgcm > 0.0) {
152 auto constantFactor = std::make_shared<JacobianFactor>(
c);
165 if (node) total += 1;
174 if (!ptr)
return nullptr;
175 auto conditional = std::dynamic_pointer_cast<GaussianConditional>(ptr);
179 throw std::logic_error(
180 "A HybridGaussianConditional unexpectedly contained a non-conditional");
186 const This *
e =
dynamic_cast<const This *
>(&lf);
187 if (
e ==
nullptr)
return false;
196 e->conditionals_, [
tol](
const auto &
f1,
const auto &
f2) {
197 return (!f1 && !f2) || (f1 && f2 && f1->equals(*f2, tol));
204 std::cout << (
s.empty() ?
"" :
s +
"\n");
207 if (
isHybrid()) std::cout <<
"Hybrid ";
209 std::cout <<
" Discrete Keys = ";
211 std::cout <<
"(" <<
formatter(dk.first) <<
", " << dk.second <<
"), ";
213 std::cout << std::endl
214 <<
" logNormalizationConstant: " << -
negLogConstant() << std::endl
220 if (gf && !gf->empty()) {
236 const Key key = discreteKey.first;
238 continuousParentKeys.erase(std::remove(continuousParentKeys.begin(),
239 continuousParentKeys.end(),
key),
240 continuousParentKeys.end());
242 return continuousParentKeys;
248 for (
auto &&kv : given) {
249 if (given.find(kv.first) == given.end()) {
260 throw std::runtime_error(
261 "HybridGaussianConditional::likelihood: given values are missing some "
271 const auto likelihood_m = conditional->likelihood(given);
272 const double Cgm_Kgcm = conditional->negLogConstant() -
negLogConstant_;
273 if (Cgm_Kgcm == 0.0) {
274 return {likelihood_m, 0.0};
278 return {likelihood_m, Cgm_Kgcm};
281 return std::make_shared<HybridGaussianFactor>(discreteParentKeys,
287 std::set<DiscreteKey>
s(discreteKeys.begin(), discreteKeys.end());
300 auto pruner = [discreteProbs, discreteProbsKeySet, hybridGaussianCondKeySet](
309 if (hybridGaussianCondKeySet == discreteProbsKeySet) {
310 if (discreteProbs(
values) == 0.0) {
312 std::shared_ptr<GaussianConditional>
null;
318 std::vector<DiscreteKey> set_diff;
320 discreteProbsKeySet.begin(), discreteProbsKeySet.end(),
321 hybridGaussianCondKeySet.begin(), hybridGaussianCondKeySet.end(),
322 std::back_inserter(set_diff));
324 const std::vector<DiscreteValues> assignments =
328 augmented_values.
insert(assignment);
332 if (discreteProbs(augmented_values) > 0.0) {
362 return conditional->logProbability(continuousValues);
376 return conditional->logProbability(
values.continuous());
382 return conditional->evaluate(
values.continuous());
void print(const std::string &s="Conditional", const KeyFormatter &formatter=DefaultKeyFormatter) const
Linear Factor Graph where all factors are Gaussians.
Helper(const Conditionals &conditionals)
Construct from tree of GaussianConditionals.
A hybrid conditional in the Conditional Linear Gaussian scheme.
Array< double, 1, 3 > e(1./3., 0.5, 2.)
GaussianConditional::shared_ptr choose(const DiscreteValues &discreteValues) const
Return the conditional Gaussian for the given discrete assignment.
Conditionals conditionals_
a decision tree of Gaussian conditionals.
bool empty() const
Check if tree is empty.
Helper(const DiscreteKey &mode, const P &p, Args &&...args)
Construct from a vector of mean and sigma pairs, plus extra args.
bool equals(const DecisionTree &other, const CompareFunc &compare=&DefaultCompare) const
bool isDiscrete() const
True if this is a factor of discrete variables only.
mxArray * wrap(const Class &value)
const KeyFormatter & formatter
double f2(const Vector2 &x)
DiscreteKeys is a set of keys that can be assembled using the & operator.
void print(const std::string &s, const LabelFormatter &labelFormatter, const ValueFormatter &valueFormatter) const
GTSAM-style print.
Chordal Bayes Net, the result of eliminating a factor graph.
bool isHybrid() const
True is this is a Discrete-Continuous factor.
FastVector< Key > KeyVector
Define collection type once and for all - also used in wrappers.
A set of GaussianFactors, indexed by a set of discrete keys.
const std::vector< GaussianConditional::shared_ptr > conditionals
static const double sigma
Double_ range(const Point2_ &p, const Point2_ &q)
Conditionals conditionals
AlgebraicDecisionTree< Key > logProbability(const VectorValues &continuousValues) const
Compute logProbability of the HybridGaussianConditional as a tree.
double evaluate(const HybridValues &values) const override
Calculate probability density for given values.
NodePtr root_
A DecisionTree just contains the root. TODO(dellaert): make protected.
std::pair< GaussianFactor::shared_ptr, double > GaussianFactorValuePair
Alias for pair of GaussianFactor::shared_pointer and a double value.
static std::vector< DiscreteValues > CartesianProduct(const DiscreteKeys &keys)
Return a vector of DiscreteValues, one for each possible combination of values.
static const DiscreteKey mode(modeKey, 2)
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
static ConjugateGradientParameters parameters
size_t nrComponents() const
Returns the total number of continuous components.
std::shared_ptr< This > shared_ptr
shared_ptr to this class
std::vector< std::pair< Vector, double > > P
A conditional of gaussian conditionals indexed by discrete variables, as part of a Bayes Network....
void visit(Func f) const
Visit all leaves in depth-first fashion.
void prune(const DecisionTreeFactor &discreteProbs)
Prune the decision tree of Gaussian factors as per the discrete discreteProbs.
KeyVector continuousParents() const
Returns the continuous keys among the parents.
bool isContinuous() const
True if this is a factor of continuous variables only.
DecisionTree apply(const Unary &op) const
std::shared_ptr< HybridGaussianFactor > likelihood(const VectorValues &given) const
bool equals(const HybridFactor &lf, double tol=1e-9) const override
equals
std::optional< size_t > nrFrontals
const gtsam::Symbol key('X', 0)
GaussianFactorGraphTree asGaussianFactorGraphTree() const
Convert to a DecisionTree of Gaussian factor graphs.
std::set< DiscreteKey > DiscreteKeysAsSet(const DiscreteKeys &discreteKeys)
Return the DiscreteKey vector as a set.
DecisionTree< Key, GaussianConditional::shared_ptr > Conditionals
typedef for Decision Tree of Gaussian Conditionals
DecisionTree< Key, GaussianFactorValuePair > FactorValuePairs
typedef for Decision Tree of Gaussian factors and arbitrary value.
Point3 mean(const CONTAINER &points)
mean
std::pair< Key, size_t > DiscreteKey
bool allFrontalsGiven(const VectorValues &given) const
Check whether given has values for all frontal keys.
std::pair< iterator, bool > insert(const value_type &value)
bool equals(const HybridFactor &lf, double tol=1e-9) const override
Test equality with base HybridFactor.
Implementation of a discrete-conditioned hybrid factor. Implements a joint discrete-continuous factor...
const Conditionals & conditionals() const
Getter for the underlying Conditionals DecisionTree.
std::shared_ptr< This > shared_ptr
shared_ptr to this class
std::function< GaussianConditional::shared_ptr(const Assignment< Key > &, const GaussianConditional::shared_ptr &)> prunerFunc(const DecisionTreeFactor &prunedProbabilities)
Get the pruner function from discrete probabilities.
double negLogConstant() const override
Return log normalization constant in negative log space.
HybridGaussianConditional()=default
Default constructor, mainly for serialization.
DiscreteKeys discreteKeys() const
Return all the discrete keys associated with this factor.
std::uint64_t Key
Integer nonlinear key type.
const DiscreteKeys & discreteKeys() const
Return the discrete keys for this factor.
void print(const std::string &s="HybridGaussianConditional\n", const KeyFormatter &formatter=DefaultKeyFormatter) const override
Print utility.
Jet< T, N > sqrt(const Jet< T, N > &f)
std::string str() const
return the string
static shared_ptr sharedMeanAndStddev(Args &&... args)
Create shared pointer by forwarding arguments to fromMeanAndStddev.
gtsam
Author(s):
autogenerated on Fri Oct 4 2024 03:02:13