update Unique to be recursive
							parent
							
								
									73b563a9aa
								
							
						
					
					
						commit
						8a8f146517
					
				| 
						 | 
				
			
			@ -93,7 +93,7 @@ namespace gtsam {
 | 
			
		|||
    /// print
 | 
			
		||||
    void print(const std::string& s, const LabelFormatter& labelFormatter,
 | 
			
		||||
               const ValueFormatter& valueFormatter) const override {
 | 
			
		||||
      std::cout << s << " Leaf " << valueFormatter(constant_) << " | nrAssignments: " << nrAssignments_ << std::endl;
 | 
			
		||||
      std::cout << s << " Leaf " << valueFormatter(constant_) << std::endl;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /** Write graphviz format to stream `os`. */
 | 
			
		||||
| 
						 | 
				
			
			@ -201,6 +201,7 @@ namespace gtsam {
 | 
			
		|||
    /// If all branches of a choice node f are the same, just return a branch.
 | 
			
		||||
    static NodePtr Unique(const ChoicePtr& f) {
 | 
			
		||||
#ifndef GTSAM_DT_NO_PRUNING
 | 
			
		||||
      // If all the branches are the same, we can merge them into one
 | 
			
		||||
      if (f->allSame_) {
 | 
			
		||||
        assert(f->branches().size() > 0);
 | 
			
		||||
        NodePtr f0 = f->branches_[0];
 | 
			
		||||
| 
						 | 
				
			
			@ -215,34 +216,30 @@ namespace gtsam {
 | 
			
		|||
            new Leaf(std::dynamic_pointer_cast<const Leaf>(f0)->constant(),
 | 
			
		||||
                     nrAssignments));
 | 
			
		||||
        return newLeaf;
 | 
			
		||||
 | 
			
		||||
      } else
 | 
			
		||||
      // Else we recurse
 | 
			
		||||
#endif
 | 
			
		||||
          // {
 | 
			
		||||
          //   Choice choice_node;
 | 
			
		||||
      {
 | 
			
		||||
 | 
			
		||||
          //   for (auto branch : f->branches()) {
 | 
			
		||||
          //     if (auto choice = std::dynamic_pointer_cast<const
 | 
			
		||||
          //     Choice>(branch)) {
 | 
			
		||||
          //       // `branch` is a Choice node so we apply Unique to it.
 | 
			
		||||
          //       choice_node.push_back(Unique(choice));
 | 
			
		||||
        // Make non-const copy
 | 
			
		||||
        auto ff = std::make_shared<Choice>(f->label(), f->nrChoices());
 | 
			
		||||
 | 
			
		||||
          //     } else if (auto leaf =
 | 
			
		||||
          //                    std::dynamic_pointer_cast<const Leaf>(branch)) {
 | 
			
		||||
          //       choice_node.push_back(leaf);
 | 
			
		||||
          //     }
 | 
			
		||||
          //   }
 | 
			
		||||
          //   return std::make_shared<const Choice>(choice_node);
 | 
			
		||||
          // }
 | 
			
		||||
        return f;
 | 
			
		||||
    }
 | 
			
		||||
        // Iterate over all the branches
 | 
			
		||||
        for (size_t i = 0; i < f->nrChoices(); i++) {
 | 
			
		||||
          auto branch = f->branches_[i];
 | 
			
		||||
          if (auto leaf = std::dynamic_pointer_cast<const Leaf>(branch)) {
 | 
			
		||||
            // Leaf node, simply assign
 | 
			
		||||
            ff->push_back(branch);
 | 
			
		||||
 | 
			
		||||
    static NodePtr UpdateNrAssignments(const NodePtr& f) {
 | 
			
		||||
      if (auto choice = std::dynamic_pointer_cast<const Choice>(f)) {
 | 
			
		||||
        // `f` is a Choice node so we recurse.
 | 
			
		||||
        return UpdateNrAssignments(f);
 | 
			
		||||
 | 
			
		||||
      } else if (auto leaf = std::dynamic_pointer_cast<const Leaf>(f)) {
 | 
			
		||||
          } else if (auto choice =
 | 
			
		||||
                         std::dynamic_pointer_cast<const Choice>(branch)) {
 | 
			
		||||
            // Choice node, we recurse
 | 
			
		||||
            ff->push_back(Unique(choice));
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return ff;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -308,7 +305,7 @@ namespace gtsam {
 | 
			
		|||
    void print(const std::string& s, const LabelFormatter& labelFormatter,
 | 
			
		||||
               const ValueFormatter& valueFormatter) const override {
 | 
			
		||||
      std::cout << s << " Choice(";
 | 
			
		||||
      std::cout << labelFormatter(label_) << ") " << " | All Same: " << allSame_ << " | nrBranches: " << branches_.size() << std::endl;
 | 
			
		||||
      std::cout << labelFormatter(label_) << ") " << std::endl;
 | 
			
		||||
      for (size_t i = 0; i < branches_.size(); i++) {
 | 
			
		||||
        branches_[i]->print(s + " " + std::to_string(i), labelFormatter, valueFormatter);
 | 
			
		||||
      }
 | 
			
		||||
| 
						 | 
				
			
			@ -595,16 +592,16 @@ namespace gtsam {
 | 
			
		|||
    // find highest label among branches
 | 
			
		||||
    std::optional<L> highestLabel;
 | 
			
		||||
    size_t nrChoices = 0;
 | 
			
		||||
    // for (Iterator it = begin; it != end; it++) {
 | 
			
		||||
    //   if (it->root_->isLeaf())
 | 
			
		||||
    //     continue;
 | 
			
		||||
    //   std::shared_ptr<const Choice> c =
 | 
			
		||||
    //       std::dynamic_pointer_cast<const Choice>(it->root_);
 | 
			
		||||
    //   if (!highestLabel || c->label() > *highestLabel) {
 | 
			
		||||
    //     highestLabel = c->label();
 | 
			
		||||
    //     nrChoices = c->nrChoices();
 | 
			
		||||
    //   }
 | 
			
		||||
    // }
 | 
			
		||||
    for (Iterator it = begin; it != end; it++) {
 | 
			
		||||
      if (it->root_->isLeaf())
 | 
			
		||||
        continue;
 | 
			
		||||
      std::shared_ptr<const Choice> c =
 | 
			
		||||
          std::dynamic_pointer_cast<const Choice>(it->root_);
 | 
			
		||||
      if (!highestLabel || c->label() > *highestLabel) {
 | 
			
		||||
        highestLabel = c->label();
 | 
			
		||||
        nrChoices = c->nrChoices();
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // if label is already in correct order, just put together a choice on label
 | 
			
		||||
    if (!nrChoices || !highestLabel || label > *highestLabel) {
 | 
			
		||||
| 
						 | 
				
			
			@ -679,7 +676,7 @@ namespace gtsam {
 | 
			
		|||
      for (ValueIt y = beginY; y != endY; y++) {
 | 
			
		||||
        choice->push_back(NodePtr(new Leaf(*y)));
 | 
			
		||||
      }
 | 
			
		||||
      return Choice::Unique(choice);
 | 
			
		||||
      return choice;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Recursive case: perform "Shannon expansion"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue