More utility functions
							parent
							
								
									83dd3e6234
								
							
						
					
					
						commit
						35e5953d34
					
				|  | @ -643,6 +643,32 @@ static vector<size_t> columnDimensions( | |||
| 	return dims; | ||||
| } | ||||
| 
 | ||||
| // To do this, we merge-sort the rows so that the column indices of the first structural
 | ||||
| // non-zero in each row increase monotonically.
 | ||||
| vector<_RowSource> computeRowPermutation(size_t m, const vector<size_t>& factorIndices, | ||||
| 		const FactorGraph<GaussianFactor>& factorGraph) { | ||||
| 	vector<_RowSource> rowSources; | ||||
| 	rowSources.reserve(m); | ||||
| 	size_t i1 = 0; | ||||
| 	BOOST_FOREACH(const size_t i2, factorIndices) { | ||||
| 		const GaussianFactor& factor(*factorGraph[i2]); | ||||
| 		size_t factorRowI = 0; | ||||
| 		assert(factor.get_firstNonzeroBlocks().size() == factor.numberOfRows()); | ||||
| 		BOOST_FOREACH(const size_t factorFirstNonzeroVarpos, factor.get_firstNonzeroBlocks()) { | ||||
| 			Index firstNonzeroVar; | ||||
| 			firstNonzeroVar = factor.keys()[factorFirstNonzeroVarpos]; | ||||
| 			rowSources.push_back(_RowSource(firstNonzeroVar, i1, factorRowI)); | ||||
| 			++ factorRowI; | ||||
| 		} | ||||
| 		assert(factorRowI == factor.numberOfRows()); | ||||
| 		++ i1; | ||||
| 	} | ||||
| 	assert(rowSources.size() == m); | ||||
| 	assert(i1 == factorIndices.size()); | ||||
| 	sort(rowSources.begin(), rowSources.end()); | ||||
| 	return rowSources; | ||||
| } | ||||
| 
 | ||||
| template<class STORAGE> | ||||
| GaussianFactor::shared_ptr GaussianFactor::Combine(const FactorGraph<GaussianFactor>& factorGraph, | ||||
|     const GaussianVariableIndex<STORAGE>& variableIndex, const vector<size_t>& factorIndices, | ||||
|  | @ -674,29 +700,9 @@ GaussianFactor::shared_ptr GaussianFactor::Combine(const FactorGraph<GaussianFac | |||
|   combinedFactor->keys_.insert(combinedFactor->keys_.end(), variables.begin(), variables.end()); | ||||
|   toc("Combine: set up empty"); | ||||
| 
 | ||||
|   // Compute a row permutation that maintains a staircase pattern in the new
 | ||||
|   // combined factor.  To do this, we merge-sort the rows so that the column
 | ||||
|   // indices of the first structural non-zero in each row increase monotonically.
 | ||||
|   // Compute a row permutation that maintains a staircase pattern in the new combined factor.
 | ||||
|   tic("Combine: sort rows"); | ||||
|   vector<_RowSource> rowSources; | ||||
|   rowSources.reserve(m); | ||||
|   size_t i1 = 0; | ||||
|   BOOST_FOREACH(const size_t i2, factorIndices) { | ||||
|     const GaussianFactor& factor(*factorGraph[i2]); | ||||
|     size_t factorRowI = 0; | ||||
|     assert(factor.firstNonzeroBlocks_.size() == factor.numberOfRows()); | ||||
|     BOOST_FOREACH(const size_t factorFirstNonzeroVarpos, factor.firstNonzeroBlocks_) { | ||||
|       Index firstNonzeroVar; | ||||
|       firstNonzeroVar = factor.keys_[factorFirstNonzeroVarpos]; | ||||
|       rowSources.push_back(_RowSource(firstNonzeroVar, i1, factorRowI)); | ||||
|       ++ factorRowI; | ||||
|     } | ||||
|     assert(factorRowI == factor.numberOfRows()); | ||||
|     ++ i1; | ||||
|   } | ||||
|   assert(rowSources.size() == m); | ||||
|   assert(i1 == factorIndices.size()); | ||||
|   sort(rowSources.begin(), rowSources.end()); | ||||
|   vector<_RowSource> rowSources = computeRowPermutation(m, factorIndices, factorGraph); | ||||
|   toc("Combine: sort rows"); | ||||
| 
 | ||||
|   // Fill in the rows of the new factor in sorted order.  Fill in the array of
 | ||||
|  |  | |||
|  | @ -175,6 +175,9 @@ public: | |||
| 	/** get a copy of model */ | ||||
| 	const SharedDiagonal& get_model() const { return model_;  } | ||||
| 
 | ||||
| 	/** get the indices list */ | ||||
| 	const std::vector<size_t>& get_firstNonzeroBlocks() const { return firstNonzeroBlocks_; } | ||||
| 
 | ||||
| 	bool isConstrained() const {return model_->isConstrained();} | ||||
| 
 | ||||
| 	/**
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue