We now use safe version in unwhitenedError
							parent
							
								
									2c35cda71f
								
							
						
					
					
						commit
						2ced73ebe1
					
				|  | @ -34,7 +34,7 @@ class ExpressionFactor: public NoiseModelFactor { | |||
| 
 | ||||
|   T measurement_; ///< the measurement to be compared with the expression
 | ||||
|   Expression<T> expression_; ///< the expression that is AD enabled
 | ||||
|   FastVector<int> dimensions_; ///< dimensions of the Jacobian matrices
 | ||||
|   FastVector<int> dims_; ///< dimensions of the Jacobian matrices
 | ||||
|   size_t augmentedCols_; ///< total number of columns + 1 (for RHS)
 | ||||
| 
 | ||||
|   static const int Dim = traits::dimension<T>::value; | ||||
|  | @ -54,13 +54,13 @@ public: | |||
| 
 | ||||
|     // Get keys and dimensions for Jacobian matrices
 | ||||
|     // An Expression is assumed unmutable, so we do this now
 | ||||
|     boost::tie(keys_,dimensions_) = expression_.keysAndDims(); | ||||
|     boost::tie(keys_, dims_) = expression_.keysAndDims(); | ||||
| 
 | ||||
|     // Add sizes to know how much memory to allocate on stack in linearize
 | ||||
|     augmentedCols_ = std::accumulate(dimensions_.begin(), dimensions_.end(), 1); | ||||
|     augmentedCols_ = std::accumulate(dims_.begin(), dims_.end(), 1); | ||||
| 
 | ||||
| #ifdef DEBUG_ExpressionFactor | ||||
|     BOOST_FOREACH(size_t d, dimensions_) | ||||
|     BOOST_FOREACH(size_t d, dims_) | ||||
|     std::cout << d << " "; | ||||
|     std::cout << " -> " << Dim << "x" << augmentedCols_ << std::endl; | ||||
| #endif | ||||
|  | @ -76,32 +76,15 @@ public: | |||
|     // TODO(PTF) Is this a place for custom charts?
 | ||||
|     DefaultChart<T> chart; | ||||
|     if (H) { | ||||
|       // H should be pre-allocated
 | ||||
|       assert(H->size()==size()); | ||||
| 
 | ||||
|       VerticalBlockMatrix Ab(dimensions_, Dim); | ||||
| 
 | ||||
|       // Wrap keys and VerticalBlockMatrix into structure passed to expression_
 | ||||
|       JacobianMap map(keys_, Ab); | ||||
|       Ab.matrix().setZero(); | ||||
| 
 | ||||
|       // Evaluate error to get Jacobians and RHS vector b
 | ||||
|       T value = expression_.value(x, map); // <<< Reverse AD happens here !
 | ||||
| 
 | ||||
|       // Copy blocks into the vector of jacobians passed in
 | ||||
|       for (DenseIndex i = 0; i < static_cast<DenseIndex>(size()); i++) | ||||
|         H->at(i) = Ab(i); | ||||
| 
 | ||||
|       const T value = expression_.value(x, std::make_pair(keys_, dims_), *H); | ||||
|       return chart.local(measurement_, value); | ||||
|     } else { | ||||
|       const T& value = expression_.value(x); | ||||
|       const T value = expression_.value(x); | ||||
|       return chart.local(measurement_, value); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   virtual boost::shared_ptr<GaussianFactor> linearize(const Values& x) const { | ||||
|     // TODO(PTF) Is this a place for custom charts?
 | ||||
|     DefaultChart<T> chart; | ||||
|     // Only linearize if the factor is active
 | ||||
|     if (!active(x)) | ||||
|       return boost::shared_ptr<JacobianFactor>(); | ||||
|  | @ -110,9 +93,9 @@ public: | |||
|     // In case noise model is constrained, we need to provide a noise model
 | ||||
|     bool constrained = noiseModel_->is_constrained(); | ||||
|     boost::shared_ptr<JacobianFactor> factor( | ||||
|         constrained ? new JacobianFactor(keys_, dimensions_, Dim, | ||||
|         constrained ? new JacobianFactor(keys_, dims_, Dim, | ||||
|             boost::static_pointer_cast<noiseModel::Constrained>(noiseModel_)->unit()) : | ||||
|             new JacobianFactor(keys_, dimensions_, Dim)); | ||||
|             new JacobianFactor(keys_, dims_, Dim)); | ||||
| 
 | ||||
|     // Wrap keys and VerticalBlockMatrix into structure passed to expression_
 | ||||
|     VerticalBlockMatrix& Ab = factor->matrixObject(); | ||||
|  | @ -121,13 +104,17 @@ public: | |||
|     // Zero out Jacobian so we can simply add to it
 | ||||
|     Ab.matrix().setZero(); | ||||
| 
 | ||||
|     // Evaluate error to get Jacobians and RHS vector b
 | ||||
|     // Get value and Jacobians, writing directly into JacobianFactor
 | ||||
|     T value = expression_.value(x, jacobianMap); // <<< Reverse AD happens here !
 | ||||
| 
 | ||||
|     // Evaluate error and set RHS vector b
 | ||||
|     // TODO(PTF) Is this a place for custom charts?
 | ||||
|     DefaultChart<T> chart; | ||||
|     Ab(size()).col(0) = -chart.local(measurement_, value); | ||||
| 
 | ||||
|     // Whiten the corresponding system, Ab already contains RHS
 | ||||
|     Vector dummy(Dim); | ||||
|     noiseModel_->WhitenSystem(Ab.matrix(),dummy); | ||||
|     noiseModel_->WhitenSystem(Ab.matrix(), dummy); | ||||
| 
 | ||||
|     return factor; | ||||
|   } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue