Merged in fix/sparse_jacobian_output (pull request #121)
fixed sparseJacobian() to use a std::map such that it works with symbol keysrelease/4.3a0
						commit
						19bc1cd686
					
				|  | @ -123,26 +123,32 @@ namespace gtsam { | ||||||
|   /* ************************************************************************* */ |   /* ************************************************************************* */ | ||||||
|   vector<boost::tuple<size_t, size_t, double> > GaussianFactorGraph::sparseJacobian() const { |   vector<boost::tuple<size_t, size_t, double> > GaussianFactorGraph::sparseJacobian() const { | ||||||
|     // First find dimensions of each variable
 |     // First find dimensions of each variable
 | ||||||
|     vector<size_t> dims; |     typedef std::map<Key, size_t> KeySizeMap; | ||||||
|  |     KeySizeMap dims; | ||||||
|     BOOST_FOREACH(const sharedFactor& factor, *this) { |     BOOST_FOREACH(const sharedFactor& factor, *this) { | ||||||
|       for (GaussianFactor::const_iterator pos = factor->begin(); |       if (!static_cast<bool>(factor)) continue; | ||||||
|           pos != factor->end(); ++pos) { | 
 | ||||||
|         if (dims.size() <= *pos) |       for (GaussianFactor::const_iterator key = factor->begin(); | ||||||
|           dims.resize(*pos + 1, 0); |           key != factor->end(); ++key) { | ||||||
|         dims[*pos] = factor->getDim(pos); |         dims[*key] = factor->getDim(key); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // Compute first scalar column of each variable
 |     // Compute first scalar column of each variable
 | ||||||
|     vector<size_t> columnIndices(dims.size() + 1, 0); |     size_t currentColIndex = 0; | ||||||
|     for (size_t j = 1; j < dims.size() + 1; ++j) |     KeySizeMap columnIndices = dims; | ||||||
|       columnIndices[j] = columnIndices[j - 1] + dims[j - 1]; |     BOOST_FOREACH(const KeySizeMap::value_type& col, dims) { | ||||||
|  |       columnIndices[col.first] = currentColIndex; | ||||||
|  |       currentColIndex += dims[col.first]; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     // Iterate over all factors, adding sparse scalar entries
 |     // Iterate over all factors, adding sparse scalar entries
 | ||||||
|     typedef boost::tuple<size_t, size_t, double> triplet; |     typedef boost::tuple<size_t, size_t, double> triplet; | ||||||
|     vector<triplet> entries; |     vector<triplet> entries; | ||||||
|     size_t row = 0; |     size_t row = 0; | ||||||
|     BOOST_FOREACH(const sharedFactor& factor, *this) { |     BOOST_FOREACH(const sharedFactor& factor, *this) { | ||||||
|  |       if (!static_cast<bool>(factor)) continue; | ||||||
|  | 
 | ||||||
|       // Convert to JacobianFactor if necessary
 |       // Convert to JacobianFactor if necessary
 | ||||||
|       JacobianFactor::shared_ptr jacobianFactor( |       JacobianFactor::shared_ptr jacobianFactor( | ||||||
|           boost::dynamic_pointer_cast<JacobianFactor>(factor)); |           boost::dynamic_pointer_cast<JacobianFactor>(factor)); | ||||||
|  | @ -159,11 +165,11 @@ namespace gtsam { | ||||||
|       // Whiten the factor and add entries for it
 |       // Whiten the factor and add entries for it
 | ||||||
|       // iterate over all variables in the factor
 |       // iterate over all variables in the factor
 | ||||||
|       const JacobianFactor whitened(jacobianFactor->whiten()); |       const JacobianFactor whitened(jacobianFactor->whiten()); | ||||||
|       for (JacobianFactor::const_iterator pos = whitened.begin(); |       for (JacobianFactor::const_iterator key = whitened.begin(); | ||||||
|           pos < whitened.end(); ++pos) { |           key < whitened.end(); ++key) { | ||||||
|         JacobianFactor::constABlock whitenedA = whitened.getA(pos); |         JacobianFactor::constABlock whitenedA = whitened.getA(key); | ||||||
|         // find first column index for this key
 |         // find first column index for this key
 | ||||||
|         size_t column_start = columnIndices[*pos]; |         size_t column_start = columnIndices[*key]; | ||||||
|         for (size_t i = 0; i < (size_t) whitenedA.rows(); i++) |         for (size_t i = 0; i < (size_t) whitenedA.rows(); i++) | ||||||
|           for (size_t j = 0; j < (size_t) whitenedA.cols(); j++) { |           for (size_t j = 0; j < (size_t) whitenedA.cols(); j++) { | ||||||
|             double s = whitenedA(i, j); |             double s = whitenedA(i, j); | ||||||
|  | @ -173,7 +179,7 @@ namespace gtsam { | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       JacobianFactor::constBVector whitenedb(whitened.getb()); |       JacobianFactor::constBVector whitenedb(whitened.getb()); | ||||||
|       size_t bcolumn = columnIndices.back(); |       size_t bcolumn = currentColIndex; | ||||||
|       for (size_t i = 0; i < (size_t) whitenedb.size(); i++) |       for (size_t i = 0; i < (size_t) whitenedb.size(); i++) | ||||||
|         entries.push_back(boost::make_tuple(row + i, bcolumn, whitenedb(i))); |         entries.push_back(boost::make_tuple(row + i, bcolumn, whitenedb(i))); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue