| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * SingleValue.cpp | 
					
						
							|  |  |  |  * @brief domain constraint | 
					
						
							|  |  |  |  * @date Feb 13, 2012 | 
					
						
							|  |  |  |  * @author Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-18 23:17:49 +08:00
										 |  |  | #include <gtsam/base/Testable.h>
 | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | #include <gtsam/discrete/DecisionTreeFactor.h>
 | 
					
						
							|  |  |  | #include <gtsam_unstable/discrete/Domain.h>
 | 
					
						
							|  |  |  | #include <gtsam_unstable/discrete/SingleValue.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | using namespace std; | 
					
						
							| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | void SingleValue::print(const string& s, const KeyFormatter& formatter) const { | 
					
						
							|  |  |  |   cout << s << "SingleValue on " | 
					
						
							|  |  |  |        << "j=" << formatter(keys_[0]) << " with value " << value_ << endl; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2024-12-10 10:09:00 +08:00
										 |  |  | double SingleValue::evaluate(const Assignment<Key>& values) const { | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  |   return (double)(values.at(keys_[0]) == value_); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | DecisionTreeFactor SingleValue::toDecisionTreeFactor() const { | 
					
						
							| 
									
										
										
										
											2023-01-08 02:19:52 +08:00
										 |  |  |   const DiscreteKeys keys{DiscreteKey(keys_[0], cardinality_)}; | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  |   vector<double> table; | 
					
						
							|  |  |  |   for (size_t i1 = 0; i1 < cardinality_; i1++) table.push_back(i1 == value_); | 
					
						
							|  |  |  |   DecisionTreeFactor converted(keys, table); | 
					
						
							|  |  |  |   return converted; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | DecisionTreeFactor SingleValue::operator*(const DecisionTreeFactor& f) const { | 
					
						
							|  |  |  |   // TODO: can we do this more efficiently?
 | 
					
						
							|  |  |  |   return toDecisionTreeFactor() * f; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2021-11-21 04:52:12 +08:00
										 |  |  | bool SingleValue::ensureArcConsistency(Key j, Domains* domains) const { | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  |   if (j != keys_[0]) | 
					
						
							|  |  |  |     throw invalid_argument("SingleValue check on wrong domain"); | 
					
						
							|  |  |  |   Domain& D = domains->at(j); | 
					
						
							|  |  |  |   if (D.isSingleton()) { | 
					
						
							|  |  |  |     if (D.firstValue() != value_) throw runtime_error("Unsatisfiable"); | 
					
						
							|  |  |  |     return false; | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  |   D = Domain(discreteKey(), value_); | 
					
						
							|  |  |  |   return true; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2021-12-14 02:46:53 +08:00
										 |  |  | Constraint::shared_ptr SingleValue::partiallyApply(const DiscreteValues& values) const { | 
					
						
							|  |  |  |   DiscreteValues::const_iterator it = values.find(keys_[0]); | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  |   if (it != values.end() && it->second != value_) | 
					
						
							|  |  |  |     throw runtime_error("SingleValue::partiallyApply: unsatisfiable"); | 
					
						
							| 
									
										
										
										
											2023-01-18 06:05:12 +08:00
										 |  |  |   return std::make_shared<SingleValue>(keys_[0], cardinality_, value_); | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | /* ************************************************************************* */ | 
					
						
							|  |  |  | Constraint::shared_ptr SingleValue::partiallyApply( | 
					
						
							| 
									
										
										
										
											2021-11-21 04:52:12 +08:00
										 |  |  |     const Domains& domains) const { | 
					
						
							|  |  |  |   const Domain& Dk = domains.at(keys_[0]); | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  |   if (Dk.isSingleton() && !Dk.contains(value_)) | 
					
						
							|  |  |  |     throw runtime_error("SingleValue::partiallyApply: unsatisfiable"); | 
					
						
							| 
									
										
										
										
											2023-01-18 06:05:12 +08:00
										 |  |  |   return std::make_shared<SingleValue>(discreteKey(), value_); | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2012-04-16 06:35:28 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2021-11-19 04:08:01 +08:00
										 |  |  | }  // namespace gtsam
 |