Merge pull request #1696 from borglab/model-selection-integration
AlgebraicDecisionTree Helpersrelease/4.3a0
						commit
						231d1adbbd
					
				|  | @ -196,6 +196,42 @@ namespace gtsam { | |||
|       return this->apply(g, &Ring::div); | ||||
|     } | ||||
| 
 | ||||
|     /// Compute sum of all values
 | ||||
|     double sum() const { | ||||
|       double sum = 0; | ||||
|       auto visitor = [&](double y) { sum += y; }; | ||||
|       this->visit(visitor); | ||||
|       return sum; | ||||
|     } | ||||
| 
 | ||||
|     /**
 | ||||
|      * @brief Helper method to perform normalization such that all leaves in the | ||||
|      * tree sum to 1 | ||||
|      * | ||||
|      * @param sum | ||||
|      * @return AlgebraicDecisionTree | ||||
|      */ | ||||
|     AlgebraicDecisionTree normalize(double sum) const { | ||||
|       return this->apply([&sum](const double& x) { return x / sum; }); | ||||
|     } | ||||
| 
 | ||||
|     /// Find the minimum values amongst all leaves
 | ||||
|     double min() const { | ||||
|       double min = std::numeric_limits<double>::max(); | ||||
|       auto visitor = [&](double x) { min = x < min ? x : min; }; | ||||
|       this->visit(visitor); | ||||
|       return min; | ||||
|     } | ||||
| 
 | ||||
|     /// Find the maximum values amongst all leaves
 | ||||
|     double max() const { | ||||
|       // Get the most negative value
 | ||||
|       double max = -std::numeric_limits<double>::max(); | ||||
|       auto visitor = [&](double x) { max = x > max ? x : max; }; | ||||
|       this->visit(visitor); | ||||
|       return max; | ||||
|     } | ||||
| 
 | ||||
|     /** sum out variable */ | ||||
|     AlgebraicDecisionTree sum(const L& label, size_t cardinality) const { | ||||
|       return this->combine(label, cardinality, &Ring::add); | ||||
|  |  | |||
|  | @ -593,6 +593,55 @@ TEST(ADT, zero) { | |||
|   EXPECT_DOUBLES_EQUAL(0, anotb(x11), 1e-9); | ||||
| } | ||||
| 
 | ||||
| /// Example ADT from 0 to 11.
 | ||||
| ADT exampleADT() { | ||||
|   DiscreteKey A(0, 2), B(1, 3), C(2, 2); | ||||
|   ADT f(A & B & C, "0 6  2 8  4 10    1 7  3 9  5 11"); | ||||
|   return f; | ||||
| } | ||||
| /* ************************************************************************** */ | ||||
| // Test sum
 | ||||
| TEST(ADT, Sum) { | ||||
|   ADT a = exampleADT(); | ||||
|   double expected_sum = 0; | ||||
|   for (double i = 0; i < 12; i++) { | ||||
|     expected_sum += i; | ||||
|   } | ||||
|   EXPECT_DOUBLES_EQUAL(expected_sum, a.sum(), 1e-9); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************** */ | ||||
| // Test normalize
 | ||||
| TEST(ADT, Normalize) { | ||||
|   ADT a = exampleADT(); | ||||
|   double sum = a.sum(); | ||||
|   auto actual = a.normalize(sum); | ||||
| 
 | ||||
|   DiscreteKey A(0, 2), B(1, 3), C(2, 2); | ||||
|   DiscreteKeys keys = DiscreteKeys{A, B, C}; | ||||
|   std::vector<double> cpt{0 / sum, 6 / sum,  2 / sum, 8 / sum, | ||||
|                           4 / sum, 10 / sum, 1 / sum, 7 / sum, | ||||
|                           3 / sum, 9 / sum,  5 / sum, 11 / sum}; | ||||
|   ADT expected(keys, cpt); | ||||
|   EXPECT(assert_equal(expected, actual)); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************** */ | ||||
| // Test min
 | ||||
| TEST(ADT, Min) { | ||||
|   ADT a = exampleADT(); | ||||
|   double min = a.min(); | ||||
|   EXPECT_DOUBLES_EQUAL(0.0, min, 1e-9); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************** */ | ||||
| // Test max
 | ||||
| TEST(ADT, Max) { | ||||
|   ADT a = exampleADT(); | ||||
|   double max = a.max(); | ||||
|   EXPECT_DOUBLES_EQUAL(11.0, max, 1e-9); | ||||
| } | ||||
| 
 | ||||
| /* ************************************************************************* */ | ||||
| int main() { | ||||
|   TestResult tr; | ||||
|  |  | |||
|  | @ -67,7 +67,8 @@ class GTSAM_EXPORT GaussianMixture | |||
|   double logConstant_;         ///< log of the normalization constant.
 | ||||
| 
 | ||||
|   /**
 | ||||
|    * @brief Convert a DecisionTree of factors into a DT of Gaussian FGs. | ||||
|    * @brief Convert a DecisionTree of factors into | ||||
|    * a DecisionTree of Gaussian factor graphs. | ||||
|    */ | ||||
|   GaussianFactorGraphTree asGaussianFactorGraphTree() const; | ||||
| 
 | ||||
|  | @ -214,7 +215,8 @@ class GTSAM_EXPORT GaussianMixture | |||
|    * @return AlgebraicDecisionTree<Key> A decision tree on the discrete keys | ||||
|    * only, with the leaf values as the error for each assignment. | ||||
|    */ | ||||
|   AlgebraicDecisionTree<Key> errorTree(const VectorValues &continuousValues) const; | ||||
|   AlgebraicDecisionTree<Key> errorTree( | ||||
|       const VectorValues &continuousValues) const; | ||||
| 
 | ||||
|   /**
 | ||||
|    * @brief Compute the logProbability of this Gaussian Mixture. | ||||
|  |  | |||
|  | @ -135,7 +135,8 @@ class GTSAM_EXPORT GaussianMixtureFactor : public HybridFactor { | |||
|    * @return AlgebraicDecisionTree<Key> A decision tree with the same keys | ||||
|    * as the factors involved, and leaf values as the error. | ||||
|    */ | ||||
|   AlgebraicDecisionTree<Key> errorTree(const VectorValues &continuousValues) const; | ||||
|   AlgebraicDecisionTree<Key> errorTree( | ||||
|       const VectorValues &continuousValues) const; | ||||
| 
 | ||||
|   /**
 | ||||
|    * @brief Compute the log-likelihood, including the log-normalizing constant. | ||||
|  |  | |||
|  | @ -12,6 +12,7 @@ | |||
| /**
 | ||||
|  *  @file HybridValues.h | ||||
|  *  @date Jul 28, 2022 | ||||
|  *  @author Varun Agrawal | ||||
|  *  @author Shangjie Xue | ||||
|  */ | ||||
| 
 | ||||
|  | @ -54,13 +55,13 @@ class GTSAM_EXPORT HybridValues { | |||
|   HybridValues() = default; | ||||
| 
 | ||||
|   /// Construct from DiscreteValues and VectorValues.
 | ||||
|   HybridValues(const VectorValues &cv, const DiscreteValues &dv) | ||||
|       : continuous_(cv), discrete_(dv){} | ||||
|   HybridValues(const VectorValues& cv, const DiscreteValues& dv) | ||||
|       : continuous_(cv), discrete_(dv) {} | ||||
| 
 | ||||
|   /// Construct from all values types.
 | ||||
|   HybridValues(const VectorValues& cv, const DiscreteValues& dv, | ||||
|                const Values& v) | ||||
|       : continuous_(cv), discrete_(dv), nonlinear_(v){} | ||||
|       : continuous_(cv), discrete_(dv), nonlinear_(v) {} | ||||
| 
 | ||||
|   /// @}
 | ||||
|   /// @name Testable
 | ||||
|  | @ -101,9 +102,7 @@ class GTSAM_EXPORT HybridValues { | |||
|   bool existsDiscrete(Key j) { return (discrete_.find(j) != discrete_.end()); } | ||||
| 
 | ||||
|   /// Check whether a variable with key \c j exists in values.
 | ||||
|   bool existsNonlinear(Key j) { | ||||
|     return nonlinear_.exists(j); | ||||
|   } | ||||
|   bool existsNonlinear(Key j) { return nonlinear_.exists(j); } | ||||
| 
 | ||||
|   /// Check whether a variable with key \c j exists.
 | ||||
|   bool exists(Key j) { | ||||
|  | @ -128,9 +127,7 @@ class GTSAM_EXPORT HybridValues { | |||
|   } | ||||
| 
 | ||||
|   /// insert_or_assign() , similar to Values.h
 | ||||
|   void insert_or_assign(Key j, size_t value) { | ||||
|     discrete_[j] = value; | ||||
|   } | ||||
|   void insert_or_assign(Key j, size_t value) { discrete_[j] = value; } | ||||
| 
 | ||||
|   /** Insert all continuous values from \c values.  Throws an invalid_argument
 | ||||
|    * exception if any keys to be inserted are already used. */ | ||||
|  |  | |||
|  | @ -333,7 +333,6 @@ TEST(HybridEstimation, Probability) { | |||
|   for (auto discrete_conditional : *discreteBayesNet) { | ||||
|     bayesNet->add(discrete_conditional); | ||||
|   } | ||||
|   auto discreteConditional = discreteBayesNet->at(0)->asDiscrete(); | ||||
| 
 | ||||
|   HybridValues hybrid_values = bayesNet->optimize(); | ||||
| 
 | ||||
|  |  | |||
|  | @ -381,17 +381,22 @@ typedef gtsam::GncOptimizer<gtsam::GncParams<gtsam::LevenbergMarquardtParams>> G | |||
| #include <gtsam/nonlinear/LevenbergMarquardtOptimizer.h> | ||||
| virtual class LevenbergMarquardtOptimizer : gtsam::NonlinearOptimizer { | ||||
|   LevenbergMarquardtOptimizer(const gtsam::NonlinearFactorGraph& graph, | ||||
|                               const gtsam::Values& initialValues); | ||||
|                               const gtsam::Values& initialValues, | ||||
|                               const gtsam::LevenbergMarquardtParams& params = | ||||
|                                   gtsam::LevenbergMarquardtParams()); | ||||
|   LevenbergMarquardtOptimizer(const gtsam::NonlinearFactorGraph& graph, | ||||
|                               const gtsam::Values& initialValues, | ||||
|                               const gtsam::LevenbergMarquardtParams& params); | ||||
|                               const gtsam::Ordering& ordering, | ||||
|                               const gtsam::LevenbergMarquardtParams& params = | ||||
|                                   gtsam::LevenbergMarquardtParams()); | ||||
| 
 | ||||
|   double lambda() const; | ||||
|   void print(string s = "") const; | ||||
| }; | ||||
| 
 | ||||
| #include <gtsam/nonlinear/ISAM2.h> | ||||
| class ISAM2GaussNewtonParams { | ||||
|   ISAM2GaussNewtonParams(); | ||||
|   ISAM2GaussNewtonParams(double _wildfireThreshold = 0.001); | ||||
| 
 | ||||
|   void print(string s = "") const; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue