                                libflounder TODO   
                             ======================

EIF_SLAM / Sparse_Solver
-------------------------

* Currently the complete sparse information matrix (which is symmetric) is
  stored. Only storing the upper or lower triangle would nearly half memory
  usage (perhaps leading to performance increases due to cache hits) and
  make the convert_sparse function in auv_sparse_solver.cpp more efficient. 

* Currently the test to see if a loop-closure observation has enough information
  to warrant updating the conservative covariances is AUV specific. Fix this
  somehow, perhaps by requiring a functor taking in covariance matrices.

* Supply the non-zero row structure when removing rows in Sparse_Solver. 
  Row deletion is not currently used, however this would change its scalability
  from O(n) to O(1). 

* Maintain forward substitution results to speed up recovery of the vehicle 
  covariance columns?


EKF_SLAM
--------

* Clean up EKF_SLAM by using ublas::range for submatrices and subvectors like
  in the EIF_SLAM class.


Seabed Models
----------------------

* At the moment the seabed attitude observation performs on observation
  on the vehicles Euler angels. This should be an observation on the DVL's
  raw heading, roll and pitch measurements.


Seabed_EIF_SLAM Class
----------------------

* Should the Seabed_EIF_SLAM class store recovered stereo (not vehicle) pose
  estimates.


SLAM Generalisation
--------------------

* Move remaining vehicle observations out of EKF_SLAM to functors
* Make EKF_SLAM have functor-based observe functions.
* Make functors for feature and pose augmentation.

* Abstract a SLAM interface common to EKF_SLAM and EIF_SLAM

   -- Current Class Hierarchy --
  
        EKF_SLAM   EIF_SLAM          Seabead_SLAM
                                          /\
                                         /  \
                                        /    \
                                       /      \
                           Seabed_EKF_SLAM   Seabed_EIF_SLAM
                     (contains an EKF_SLAM)  (contains an EIF_SLAM)
  
   -- Desired Class Hierarchy --
 
                 SLAM             Seabead_SLAM
                  /\          (contains a SLAM object)
                 /  \
                /    \
               /      \
         EKF_SLAM   EIF_SLAM
     



Matrix Performance Issues
---------------------------

* Think about the cost/benefit of using symmetric matrices for
    - EKF state covariance matrix
    - Observation and process model covariances

* Observation covariances are often diagonal, which can be inverted quickly.
  Perhaps have a diagonal_matrix class that represents this or allow the user
  of an observation model to supply the inverse.

* Think about the cost/benefit of using column-major matrices

  Currently matrices are stored column-major (defined in auv_matrix.hpp), which
  is the orientation used by lapack. 

  Are operations (eg multiplication) on row-major matrices more efficient?
  They must be the ublas default for some reason. 
  
  I suspect there is a lot of code that performs a row-by-row traversal of a 
  column-major matrix, which is likely to result in more cache misses
  eg:
      for( unsigned int i=0 ; i<M.size1() ; i++ )
         for( unsigned int j=0 ; j<M.size2() ; j++ )


