remove augment method in favor of conversion
							parent
							
								
									98a2668fb1
								
							
						
					
					
						commit
						cd9ee08457
					
				|  | @ -200,27 +200,24 @@ std::shared_ptr<GaussianMixtureFactor> GaussianMixture::likelihood( | |||
|   const GaussianMixtureFactor::Factors likelihoods( | ||||
|       conditionals_, [&](const GaussianConditional::shared_ptr &conditional) { | ||||
|         const auto likelihood_m = conditional->likelihood(given); | ||||
|         return likelihood_m; | ||||
|         const double Cgm_Kgcm = | ||||
|             logConstant_ - conditional->logNormalizationConstant(); | ||||
|         if (Cgm_Kgcm == 0.0) { | ||||
|           return likelihood_m; | ||||
|         } else { | ||||
|           // Add a constant factor to the likelihood in case the noise models
 | ||||
|           // are not all equal.
 | ||||
|           GaussianFactorGraph gfg; | ||||
|           gfg.push_back(likelihood_m); | ||||
|           Vector c(1); | ||||
|           c << std::sqrt(2.0 * Cgm_Kgcm); | ||||
|           auto constantFactor = std::make_shared<JacobianFactor>(c); | ||||
|           gfg.push_back(constantFactor); | ||||
|           return std::make_shared<JacobianFactor>(gfg); | ||||
|         } | ||||
|       }); | ||||
| 
 | ||||
|   // First compute all the sqrt(|2 pi Sigma|) terms
 | ||||
|   auto computeLogNormalizers = [](const GaussianFactor::shared_ptr &gf) { | ||||
|     auto jf = std::dynamic_pointer_cast<JacobianFactor>(gf); | ||||
|     // If we have, say, a Hessian factor, then no need to do anything
 | ||||
|     if (!jf) return 0.0; | ||||
| 
 | ||||
|     auto model = jf->get_model(); | ||||
|     // If there is no noise model, there is nothing to do.
 | ||||
|     if (!model) { | ||||
|       return 0.0; | ||||
|     } | ||||
|     return ComputeLogNormalizer(model); | ||||
|   }; | ||||
| 
 | ||||
|   AlgebraicDecisionTree<Key> log_normalizers = | ||||
|       DecisionTree<Key, double>(likelihoods, computeLogNormalizers); | ||||
|   return std::make_shared<GaussianMixtureFactor>( | ||||
|       continuousParentKeys, discreteParentKeys, likelihoods, log_normalizers); | ||||
|       continuousParentKeys, discreteParentKeys, likelihoods); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
|  |  | |||
|  | @ -28,55 +28,11 @@ | |||
| 
 | ||||
| namespace gtsam { | ||||
| 
 | ||||
| /**
 | ||||
|  * @brief Helper function to augment the [A|b] matrices in the factor components | ||||
|  * with the normalizer values. | ||||
|  * This is done by storing the normalizer value in | ||||
|  * the `b` vector as an additional row. | ||||
|  * | ||||
|  * @param factors DecisionTree of GaussianFactor shared pointers. | ||||
|  * @param logNormalizers Tree of log-normalizers corresponding to each | ||||
|  * Gaussian factor in factors. | ||||
|  * @return GaussianMixtureFactor::Factors | ||||
|  */ | ||||
| GaussianMixtureFactor::Factors augment( | ||||
|     const GaussianMixtureFactor::Factors &factors, | ||||
|     const AlgebraicDecisionTree<Key> &logNormalizers) { | ||||
|   // Find the minimum value so we can "proselytize" to positive values.
 | ||||
|   // Done because we can't have sqrt of negative numbers.
 | ||||
|   double min_log_normalizer = logNormalizers.min(); | ||||
|   AlgebraicDecisionTree<Key> log_normalizers = logNormalizers.apply( | ||||
|       [&min_log_normalizer](double n) { return n - min_log_normalizer; }); | ||||
| 
 | ||||
|   // Finally, update the [A|b] matrices.
 | ||||
|   auto update = [&log_normalizers]( | ||||
|                     const Assignment<Key> &assignment, | ||||
|                     const GaussianMixtureFactor::sharedFactor &gf) { | ||||
|     auto jf = std::dynamic_pointer_cast<JacobianFactor>(gf); | ||||
|     if (!jf) return gf; | ||||
|     // If the log_normalizer is 0, do nothing
 | ||||
|     if (log_normalizers(assignment) == 0.0) return gf; | ||||
| 
 | ||||
|     GaussianFactorGraph gfg; | ||||
|     gfg.push_back(jf); | ||||
| 
 | ||||
|     Vector c(1); | ||||
|     c << std::sqrt(log_normalizers(assignment)); | ||||
|     auto constantFactor = std::make_shared<JacobianFactor>(c); | ||||
| 
 | ||||
|     gfg.push_back(constantFactor); | ||||
|     return std::dynamic_pointer_cast<GaussianFactor>( | ||||
|         std::make_shared<JacobianFactor>(gfg)); | ||||
|   }; | ||||
|   return factors.apply(update); | ||||
| } | ||||
| 
 | ||||
| /* *******************************************************************************/ | ||||
| GaussianMixtureFactor::GaussianMixtureFactor( | ||||
|     const KeyVector &continuousKeys, const DiscreteKeys &discreteKeys, | ||||
|     const Factors &factors, const AlgebraicDecisionTree<Key> &logNormalizers) | ||||
|     : Base(continuousKeys, discreteKeys), | ||||
|       factors_(augment(factors, logNormalizers)) {} | ||||
| GaussianMixtureFactor::GaussianMixtureFactor(const KeyVector &continuousKeys, | ||||
|                                              const DiscreteKeys &discreteKeys, | ||||
|                                              const Factors &factors) | ||||
|     : Base(continuousKeys, discreteKeys), factors_(factors) {} | ||||
| 
 | ||||
| /* *******************************************************************************/ | ||||
| bool GaussianMixtureFactor::equals(const HybridFactor &lf, double tol) const { | ||||
|  |  | |||
|  | @ -82,14 +82,10 @@ class GTSAM_EXPORT GaussianMixtureFactor : public HybridFactor { | |||
|    * their cardinalities. | ||||
|    * @param factors The decision tree of Gaussian factors stored as the mixture | ||||
|    * density. | ||||
|    * @param logNormalizers Tree of log-normalizers corresponding to each | ||||
|    * Gaussian factor in factors. | ||||
|    */ | ||||
|   GaussianMixtureFactor(const KeyVector &continuousKeys, | ||||
|                         const DiscreteKeys &discreteKeys, | ||||
|                         const Factors &factors, | ||||
|                         const AlgebraicDecisionTree<Key> &logNormalizers = | ||||
|                             AlgebraicDecisionTree<Key>(0.0)); | ||||
|                         const Factors &factors); | ||||
| 
 | ||||
|   /**
 | ||||
|    * @brief Construct a new GaussianMixtureFactor object using a vector of | ||||
|  | @ -98,16 +94,12 @@ class GTSAM_EXPORT GaussianMixtureFactor : public HybridFactor { | |||
|    * @param continuousKeys Vector of keys for continuous factors. | ||||
|    * @param discreteKeys Vector of discrete keys. | ||||
|    * @param factors Vector of gaussian factor shared pointers. | ||||
|    * @param logNormalizers Tree of log-normalizers corresponding to each | ||||
|    * Gaussian factor in factors. | ||||
|    */ | ||||
|   GaussianMixtureFactor(const KeyVector &continuousKeys, | ||||
|                         const DiscreteKeys &discreteKeys, | ||||
|                         const std::vector<sharedFactor> &factors, | ||||
|                         const AlgebraicDecisionTree<Key> &logNormalizers = | ||||
|                             AlgebraicDecisionTree<Key>(0.0)) | ||||
|                         const std::vector<sharedFactor> &factors) | ||||
|       : GaussianMixtureFactor(continuousKeys, discreteKeys, | ||||
|                               Factors(discreteKeys, factors), logNormalizers) {} | ||||
|                               Factors(discreteKeys, factors)) {} | ||||
| 
 | ||||
|   /// @}
 | ||||
|   /// @name Testable
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue