Make key generation more efficient
							parent
							
								
									ae8d79cb3c
								
							
						
					
					
						commit
						74c40556e3
					
				| 
						 | 
				
			
			@ -147,14 +147,14 @@ namespace gtsam {
 | 
			
		|||
    size_t i;
 | 
			
		||||
    ADT result(*this);
 | 
			
		||||
    for (i = 0; i < nrFrontals; i++) {
 | 
			
		||||
      Key j = keys()[i];
 | 
			
		||||
      Key j = keys_[i];
 | 
			
		||||
      result = result.combine(j, cardinality(j), op);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // create new factor, note we start keys after nrFrontals
 | 
			
		||||
    // Create new factor, note we start with keys after nrFrontals:
 | 
			
		||||
    DiscreteKeys dkeys;
 | 
			
		||||
    for (; i < keys().size(); i++) {
 | 
			
		||||
      Key j = keys()[i];
 | 
			
		||||
    for (; i < keys_.size(); i++) {
 | 
			
		||||
      Key j = keys_[i];
 | 
			
		||||
      dkeys.push_back(DiscreteKey(j, cardinality(j)));
 | 
			
		||||
    }
 | 
			
		||||
    return std::make_shared<DecisionTreeFactor>(dkeys, result);
 | 
			
		||||
| 
						 | 
				
			
			@ -179,24 +179,22 @@ namespace gtsam {
 | 
			
		|||
      result = result.combine(j, cardinality(j), op);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // create new factor, note we collect keys that are not in frontalKeys
 | 
			
		||||
    /*
 | 
			
		||||
    Due to branch merging, the labels in `result` may be missing some keys
 | 
			
		||||
    Create new factor, note we collect keys that are not in frontalKeys.
 | 
			
		||||
    
 | 
			
		||||
    Due to branch merging, the labels in `result` may be missing some keys.
 | 
			
		||||
    E.g. After branch merging, we may get a ADT like:
 | 
			
		||||
      Leaf [2] 1.0204082
 | 
			
		||||
 | 
			
		||||
    This is missing the key values used for branching.
 | 
			
		||||
    Hence, code below traverses the original keys and omits those in
 | 
			
		||||
    frontalKeys. We loop over cardinalities, which is O(n) even for a map, and
 | 
			
		||||
    then "contains" is a binary search on a small vector.
 | 
			
		||||
    */
 | 
			
		||||
    KeyVector difference, frontalKeys_(frontalKeys), keys_(keys());
 | 
			
		||||
    // Get the difference of the frontalKeys and the factor keys using set_difference
 | 
			
		||||
    std::sort(keys_.begin(), keys_.end());
 | 
			
		||||
    std::sort(frontalKeys_.begin(), frontalKeys_.end());
 | 
			
		||||
    std::set_difference(keys_.begin(), keys_.end(), frontalKeys_.begin(),
 | 
			
		||||
                        frontalKeys_.end(), back_inserter(difference));
 | 
			
		||||
 | 
			
		||||
    DiscreteKeys dkeys;
 | 
			
		||||
    for (Key key : difference) {
 | 
			
		||||
      dkeys.push_back(DiscreteKey(key, cardinality(key)));
 | 
			
		||||
    for (auto&& [key, cardinality] : cardinalities_) {
 | 
			
		||||
      if (!frontalKeys.contains(key)) { 
 | 
			
		||||
        dkeys.push_back(DiscreteKey(key, cardinality));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return std::make_shared<DecisionTreeFactor>(dkeys, result);
 | 
			
		||||
  }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue