USGS

Isis 3.0 Object Programmers' Reference

Home

BundleAdjust.h

Go to the documentation of this file.
00001 #ifndef BundleAdjust_h
00002 #define BundleAdjust_h
00003 
00027 #include <QObject> // parent class
00028 
00029 #include <vector>
00030 #include <fstream>
00031 
00032 #include "ControlNet.h"
00033 #include "SerialNumberList.h"
00034 #include "ObservationNumberList.h"
00035 #include "Camera.h"
00036 #include "Statistics.h"
00037 //#include "SpicePosition.h"
00038 //#include "SpiceRotation.h"
00039 #include "Progress.h"
00040 #include "CameraGroundMap.h"
00041 #include "ControlMeasure.h"
00042 #include "SparseBlockMatrix.h"
00043 
00044 #include <CHOLMOD/cholmod.h>
00045 #include <CHOLMOD/UFconfig.h>
00046 
00047 template< typename T > class QList;
00048 template< typename A, typename B > class QMap;
00049 
00050 #ifndef __sun__
00051 #include "gmm/gmm.h"
00052 #endif
00053 
00054 namespace Isis {
00055   class LeastSquares;
00056   class BasisFunction;
00057   class MaximumLikelihoodWFunctions;
00058   class StatCumProbDistDynCalc;
00059 
00155   class BundleAdjust {
00156     public:
00157       BundleAdjust(const QString &cnetFile, const QString &cubeList,
00158                    bool printSummary = true);
00159       BundleAdjust(const QString &cnetFile, const QString &cubeList,
00160                    const QString &heldList, bool printSummary = true);
00161       BundleAdjust(Isis::ControlNet &cnet, Isis::SerialNumberList &snlist,
00162                    bool printSummary = true);
00163       BundleAdjust(Isis::ControlNet &cnet, Isis::SerialNumberList &snlist,
00164                    Isis::SerialNumberList &heldsnlist, bool printSummary = true);
00165       ~BundleAdjust();
00166 
00167       bool ReadSCSigmas(const QString &scsigmasList);
00168 
00169       double Solve();
00170       bool SolveCholesky();
00171 
00172       Isis::ControlNet *ControlNet() { return m_pCnet; }
00173 
00174       Isis::SerialNumberList *SerialNumberList() { return m_pSnList; }
00175       int Images() const { return m_pSnList->Size(); }
00176       int Observations() const;
00177       QString FileName(int index);
00178       bool IsHeld(int index);
00179       Table Cmatrix(int index);
00180       Table SpVector(int index);
00181 
00182       void SetSolveTwist(bool solve) { m_bSolveTwist = solve; ComputeNumberPartials(); }
00183       void SetSolveRadii(bool solve) { m_bSolveRadii = solve; }
00184       void SetSolvePolyOverHermite(bool b) { m_bSolvePolyOverHermite = b;
00185         if( b ) m_nPositionType = SpicePosition::PolyFunctionOverHermiteConstant; }
00186 
00187       void SetSolvePolyOverPointing(bool b) { m_bSolvePolyOverPointing = b;
00188         if( b ) m_nPointingType = SpiceRotation::PolyFunctionOverSpice; }
00189 
00190       void SetErrorPropagation(bool b) { m_bErrorPropagation = b; }
00191       void SetOutlierRejection(bool b) { m_bOutlierRejection = b; }
00192       void SetRejectionMultiplier(double d) { m_dRejectionMultiplier = d; }
00193 
00194       void SetGlobalLatitudeAprioriSigma(double d) { m_dGlobalLatitudeAprioriSigma = d; }
00195       void SetGlobalLongitudeAprioriSigma(double d) { m_dGlobalLongitudeAprioriSigma = d; }
00196       void SetGlobalRadiiAprioriSigma(double d) { m_dGlobalRadiusAprioriSigma = d; }
00197 
00198 //    void SetGlobalSurfaceXAprioriSigma(double d) { m_dGlobalSurfaceXAprioriSigma = d; }
00199 //    void SetGlobalSurfaceYAprioriSigma(double d) { m_dGlobalSurfaceYAprioriSigma = d; }
00200 //    void SetGlobalSurfaceZAprioriSigma(double d) { m_dGlobalSurfaceZAprioriSigma = d; }
00201 //
00202 //      void SetGlobalSpacecraftPositionAprioriSigma(double d) { m_dGlobalSpacecraftPositionAprioriSigma = d; }
00203 //      void SetGlobalSpacecraftVelocityAprioriSigma(double d) { m_dGlobalSpacecraftVelocityAprioriSigma = d; }
00204 //      void SetGlobalSpacecraftAccelerationAprioriSigma(double d) { m_dGlobalSpacecraftAccelerationAprioriSigma = d; }
00205 
00206       void SetGlobalSpacecraftPositionAprioriSigma(double d) { if( m_nNumberCamPosCoefSolved < 1 ) return; m_dGlobalSpacecraftPositionAprioriSigma[0] = d; }
00207       void SetGlobalSpacecraftVelocityAprioriSigma(double d) { if( m_nNumberCamPosCoefSolved < 2 ) return; m_dGlobalSpacecraftPositionAprioriSigma[1] = d; }
00208       void SetGlobalSpacecraftAccelerationAprioriSigma(double d) { if( m_nNumberCamPosCoefSolved < 3 ) return; m_dGlobalSpacecraftPositionAprioriSigma[2] = d; }
00209 
00210       void SetGlobalCameraAnglesAprioriSigma(double d) {  if( m_nNumberCamAngleCoefSolved < 1 ) return; m_dGlobalCameraAnglesAprioriSigma[0] = d; }
00211       void SetGlobalCameraAngularVelocityAprioriSigma(double d) { if( m_nNumberCamAngleCoefSolved < 2 ) return; m_dGlobalCameraAnglesAprioriSigma[1] = d; }
00212       void SetGlobalCameraAngularAccelerationAprioriSigma(double d) { if( m_nNumberCamAngleCoefSolved < 3 ) return; m_dGlobalCameraAnglesAprioriSigma[2] = d; }
00213 
00214 //    void SetGlobalCameraAngularVelocityAprioriSigma(double d) { m_dGlobalCameraAngularVelocityAprioriSigma = d; }
00215 //    void SetGlobalCameraAngularAccelerationAprioriSigma(double d) { m_dGlobalCameraAngularAccelerationAprioriSigma = d; }
00216 
00217       void SetStandardOutput(bool b) { m_bOutputStandard = b; }
00218       void SetCSVOutput(bool b) { m_bOutputCSV = b; }
00219       void SetResidualOutput(bool b) { m_bOutputResiduals = b; }
00220       void SetOutputFilePrefix(const QString &str) { m_strOutputFilePrefix = str; }
00221 
00222       enum DecompositionMethod {
00223         NoneSelected,
00224         SPECIALK,
00225         CHOLMOD,
00226       };
00227 
00228       enum CmatrixSolveType {
00229         None,
00230         AnglesOnly,
00231         AnglesVelocity,
00232         AnglesVelocityAcceleration,
00233         CKAll
00234       };
00235 
00236       enum SpacecraftPositionSolveType {
00237         Nothing,
00238         PositionOnly,
00239         PositionVelocity,
00240         PositionVelocityAcceleration,
00241         SPKAll
00242       };
00243 
00244       struct SpacecraftWeights {
00245         QString SpacecraftName;
00246         QString InstrumentId;
00247         std::vector<double> weights;
00248       };
00249 
00250       void SetDecompositionMethod(DecompositionMethod method);
00251 
00252       void SetSolveCmatrix(CmatrixSolveType type);
00253       void SetSolveSpacecraftPosition(SpacecraftPositionSolveType type);
00254 
00256       void SetCKDegree(int degree) { m_nCKDegree = degree; }
00257 
00259       void SetSolveCKDegree(int degree) { m_nsolveCKDegree = degree; }
00260 
00262       void SetSPKDegree(int degree) { m_nSPKDegree = degree; }
00263 
00266       void SetSolveSPKDegree(int degree) { m_nsolveSPKDegree = degree; }
00267 
00268       int BasisColumns();
00269       int ComputeConstrainedParameters();
00270 
00271       double Error() const { return m_dError; }
00272       double Iteration() const { return m_nIteration; }
00273 
00274 //      int HeldPoints() const { return m_nHeldPoints; }
00275       int IgnoredPoints() const { return m_nIgnoredPoints; }
00276       int FixedPoints() const { return m_nFixedPoints; }
00277       void SetObservationMode(bool bObservationMode);
00278 
00279       void SetConvergenceThreshold(double d) { m_dConvergenceThreshold = d; }
00280       void SetMaxIterations(int n) { m_nMaxIterations = n; }
00281       void SetSolutionMethod(QString str);
00282 
00283       void GetSparseParameterCorrections();
00284 
00285       bool IsConverged() { return m_bConverged; }
00286       QString IterationSummaryGroup () const {
00287         return m_iterationSummary;
00288       }
00289 
00290     private:
00291 
00292       void Init(Progress *progress = 0);
00293       bool validateNetwork();
00294 
00295       void ComputeNumberPartials();
00296       void ComputeImageParameterWeights();
00297       void SetSpaceCraftWeights();
00298 
00299       void AddPartials(int nPointIndex);
00300       void FillPointIndexMap();
00301       void Update(BasisFunction &basis);
00302 
00303       int PointIndex(int i) const;
00304       int ImageIndex(int i) const;
00305 
00306       void CheckHeldList();
00307       void ApplyHeldList();
00308 
00309       // triangulation functions
00310       int Triangulation(bool bDoApproximation = false);
00311       bool ApproximatePoint_ClosestApproach(const ControlPoint &rpoint, int nIndex);
00312       bool TriangulatePoint(const ControlPoint &rpoint);
00313       bool TriangulationPartials();
00314 
00315       bool SetParameterWeights();
00316       void SetPostBundleSigmas();
00317 
00318       // output functions
00319       void IterationSummary(double avErr, double sigmaXY, double sigmaHat, 
00320                             double sigmaX, double sigmaY);
00321       void SpecialKIterationSummary();
00322       bool Output();
00323       bool OutputHeader(std::ofstream& fp_out);
00324       bool OutputWithErrorPropagation();
00325       bool OutputNoErrorPropagation();
00326       bool OutputPointsCSV();
00327       bool OutputImagesCSV();
00328       bool OutputResiduals();
00329       bool WrapUp();
00330       bool ComputeBundleStatistics();
00331 
00333       bool m_bSolveTwist;                                    
00334       bool m_bSolveRadii;                                    
00335       bool m_bSolvePolyOverHermite;                          
00336       bool m_bSolvePolyOverPointing;                         
00337       bool m_bObservationMode;                               
00338       bool m_bErrorPropagation;                              
00339       bool m_bOutlierRejection;                              
00340       double m_dRejectionMultiplier;                         
00341       bool m_bPrintSummary;                                  
00342       bool m_bOutputStandard;                                
00343       bool m_bOutputCSV;                                     
00344       bool m_bOutputResiduals;                               
00345       bool m_bCleanUp;                                       
00346       bool m_bSimulatedData;                                 
00347       bool m_bLastIteration;
00348       bool m_bMaxIterationsReached;
00349       bool m_bDeltack;                                       
00350       // This will become obsolete once we have a dedicated resection class.
00351 
00352       int m_nIteration;                                      
00353       int m_nMaxIterations;                                  
00354       int m_nNumImagePartials;                               
00355       int m_nNumPointPartials;                               
00356       int m_nObservations;                                   
00357       int m_nRejectedObservations;                         
00358       int m_nImageParameters;                                
00359       int m_nPointParameters;                                
00360       int m_nConstrainedPointParameters;                     
00361       int m_nConstrainedImageParameters;                     
00362       int m_nDegreesOfFreedom;                               
00363       int m_nHeldPoints;                                     
00364       int m_nFixedPoints;                                    
00365       int m_nIgnoredPoints;                                  
00366       int m_nHeldImages;                                     
00367       int m_nHeldObservations;                               
00368       int m_nCKDegree;                                       
00369       int m_nsolveCKDegree;                                  
00370       int m_nNumberCamAngleCoefSolved;                         
00371       int m_nSPKDegree;                                      
00372       int m_nsolveSPKDegree;                                 
00373       int m_nNumberCamPosCoefSolved;                         
00374       int m_nUnknownParameters;                              
00375       int m_nBasisColumns;                                   
00376       SpicePosition::Source m_nPositionType;                 
00377       SpiceRotation::Source m_nPointingType;                 
00378       std::vector<int> m_nPointIndexMap;                     
00379       std::vector<int> m_nImageIndexMap;                     
00380 
00381       double m_dError;                                       
00382       double m_dConvergenceThreshold;                        
00383       double m_dElapsedTime;                                 
00384       double m_dElapsedTimeErrorProp;                        
00385       double m_dSigma0;                                      
00386       double m_drms_rx;                                      
00387       double m_drms_ry;                                      
00388       double m_drms_rxy;                                     
00389       double m_drms_sigmaLat;                           
00390       double m_drms_sigmaLon;                          
00391       double m_drms_sigmaRad;                          
00392       double m_dminSigmaLatitude;
00393       QString m_idMinSigmaLatitude;
00394       double m_dmaxSigmaLatitude;
00395       QString m_idMaxSigmaLatitude;
00396       double m_dminSigmaLongitude;
00397       QString m_idMinSigmaLongitude;
00398       double m_dmaxSigmaLongitude;
00399       QString m_idMaxSigmaLongitude;
00400       double m_dminSigmaRadius;
00401       QString m_idMinSigmaRadius;
00402       double m_dmaxSigmaRadius;
00403       QString m_idMaxSigmaRadius;
00404 
00405       double m_dRejectionLimit;                              
00406 
00409 
00411       double m_dGlobalLatitudeAprioriSigma;                  
00412       double m_dGlobalLongitudeAprioriSigma;                 
00413       double m_dGlobalRadiusAprioriSigma;                    
00414       double m_dGlobalSurfaceXAprioriSigma;                  
00415       double m_dGlobalSurfaceYAprioriSigma;                  
00416       double m_dGlobalSurfaceZAprioriSigma;                  
00417 
00418       std::vector<double> m_dGlobalSpacecraftPositionAprioriSigma; 
00419 //      double m_dGlobalSpacecraftPositionAprioriSigma;        //!< spacecraft coordinates apriori sigmas
00420 //      double m_dGlobalSpacecraftVelocityAprioriSigma;        //!< spacecraft coordinate velocities apriori sigmas
00421 //      double m_dGlobalSpacecraftAccelerationAprioriSigma;    //!< spacecraft coordinate accelerations apriori sigmas
00422 
00423       std::vector<double> m_dGlobalCameraAnglesAprioriSigma; 
00424 //      double m_dGlobalCameraAnglesAprioriSigma;              //!< camera angles apriori sigmas
00425 //      double m_dGlobalCameraAngularVelocityAprioriSigma;     //!< camera angular velocities apriori sigmas
00426 //      double m_dGlobalCameraAngularAccelerationAprioriSigma; //!< camera angular accelerations apriori sigmas
00427 
00428       double m_dGlobalSpacecraftPositionWeight;
00429       double m_dGlobalSpacecraftVelocityWeight;
00430       double m_dGlobalSpacecraftAccelerationWeight;
00431       double m_dGlobalCameraAnglesWeight;
00432       double m_dGlobalCameraAngularVelocityWeight;
00433       double m_dGlobalCameraAngularAccelerationWeight;
00434 
00435       std::vector<double> m_dImageParameterWeights;
00436 
00437 
00438       double m_dRTM;                                         
00439       double m_dMTR;                                         
00440       Distance m_BodyRadii[3];                               
00441 
00442       std::vector<double> m_dEpsilons;                       
00443       std::vector<double> m_dParameterWeights;               
00444 
00445       std::vector<double> m_dxKnowns;
00446       std::vector<double> m_dyKnowns;
00447 
00448       QString m_strCnetFileName;                         
00449       QString m_strSolutionMethod;                       
00450       QString m_strOutputFilePrefix;                     
00451 
00453       Isis::LeastSquares *m_pLsq;                            
00454       Isis::ControlNet *m_pCnet;                             
00455       Isis::SerialNumberList *m_pSnList;                     
00456       Isis::SerialNumberList *m_pHeldSnList;                 
00457       Isis::ObservationNumberList *m_pObsNumList;            
00458 
00460       Statistics m_Statsx;                                   
00461       Statistics m_Statsy;                                   
00462       Statistics m_Statsrx;                                  
00463       Statistics m_Statsry;                                  
00464       Statistics m_Statsrxy;                                 
00465 
00466       std::vector<Statistics> m_rmsImageSampleResiduals;
00467       std::vector<Statistics> m_rmsImageLineResiduals;
00468       std::vector<Statistics> m_rmsImageResiduals;
00469       std::vector<Statistics> m_rmsImageXSigmas;
00470       std::vector<Statistics> m_rmsImageYSigmas;
00471       std::vector<Statistics> m_rmsImageZSigmas;
00472       std::vector<Statistics> m_rmsImageRASigmas;
00473       std::vector<Statistics> m_rmsImageDECSigmas;
00474       std::vector<Statistics> m_rmsImageTWISTSigmas;
00475 
00476       DecompositionMethod m_decompositionMethod; 
00477 
00478       CmatrixSolveType m_cmatrixSolveType;                          
00479       SpacecraftPositionSolveType m_spacecraftPositionSolveType;    
00480 
00481       std::vector<SpacecraftWeights>  m_SCWeights;
00482 
00483       // beyond this place (there be dragons) all refers to the folded bundle solution (referred to as 'SpecialK'
00484       // in the interim; there is no dependence on the least-squares class
00485 
00486     private:
00487       int m_nRank;
00488 
00489       bool m_bConverged;
00490       bool m_bError;
00491 
00492       boost::numeric::ublas::symmetric_matrix < double,
00493             boost::numeric::ublas::upper, boost::numeric::ublas::column_major >
00494             m_Normals; 
00495 //      symmetric_matrix<double,lower>     m_Normals;                      //!< reduced normal equations matrix
00496       boost::numeric::ublas::vector< double > m_nj;
00497 
00499       std::vector< boost::numeric::ublas::compressed_matrix< double> > m_Qs_SPECIALK;
00500       std::vector< SparseBlockRowMatrix > m_Qs_CHOLMOD;
00501 
00502 //      vector<bounded_vector<double,3> >  m_NICs;                         //!< array of NICs (see Brown, 1976)
00504       std::vector< boost::numeric::ublas::bounded_vector< double, 3 > >  m_NICs;
00505 
00506       boost::numeric::ublas::vector<double> m_Image_Corrections;                                  
00507       boost::numeric::ublas::vector<double> m_Image_Solution;                                     
00508 
00509 //      vector<bounded_vector<double,3> >  m_Point_Corrections;            //!< vector of corrections to 3D point parameter
00510       std::vector< boost::numeric::ublas::bounded_vector< double, 3 > > m_Point_Corrections;         
00511       std::vector< boost::numeric::ublas::bounded_vector< double, 3 > > m_Point_AprioriSigmas;       
00512       std::vector< boost::numeric::ublas::bounded_vector< double, 3 > > m_Point_Weights;             
00513 
00514       void Initialize();
00515       bool InitializePointWeights();
00516       void InitializePoints();
00517 
00518       QString m_iterationSummary;
00519 
00520       bool formNormalEquations();
00521       void applyParameterCorrections();
00522       bool errorPropagation();
00523       bool solveSystem();
00524 
00525       // solution, error propagation, and matrix methods for cholmod approach
00526       bool formNormalEquations_CHOLMOD();
00527 
00528       bool formNormals1_CHOLMOD(boost::numeric::ublas::symmetric_matrix<double, boost::numeric::ublas::upper>&N22,
00529           SparseBlockColumnMatrix& N12,
00530           boost::numeric::ublas::compressed_vector<double>& n1,
00531           boost::numeric::ublas::vector<double>& n2,
00532           boost::numeric::ublas::matrix<double>& coeff_image,
00533           boost::numeric::ublas::matrix<double>& coeff_point3D,
00534           boost::numeric::ublas::vector<double>& coeff_RHS, int nImageIndex);
00535 
00536       bool formNormals2_CHOLMOD(boost::numeric::ublas::symmetric_matrix<double, boost::numeric::ublas::upper>&N22,
00537           SparseBlockColumnMatrix& N12,
00538           boost::numeric::ublas::vector<double>& n2,
00539           boost::numeric::ublas::vector<double>& nj, int nPointIndex, int i);
00540 
00541       bool formNormals3_CHOLMOD(boost::numeric::ublas::compressed_vector<double>& n1,
00542           boost::numeric::ublas::vector<double>& nj);
00543 
00544       bool solveSystem_CHOLMOD();
00545 
00546       void AmultAdd_CNZRows_CHOLMOD(double alpha, SparseBlockColumnMatrix& A,
00547           SparseBlockRowMatrix& B);
00548 
00549       void transA_NZ_multAdd_CHOLMOD(double alpha, SparseBlockRowMatrix &A,
00550           boost::numeric::ublas::vector< double > &B,
00551           boost::numeric::ublas::vector< double > &C);
00552 
00553       void applyParameterCorrections_CHOLMOD();
00554 
00555       bool errorPropagation_CHOLMOD();
00556 
00557       // solution, error propagation, and matrix methods for specialk approach
00558       // TODO: this may be able to go away if I can verify cholmod behaviour for
00559       // a truly dense matrix
00560       bool formNormalEquations_SPECIALK();
00561 
00562       bool formNormals1_SPECIALK(boost::numeric::ublas::symmetric_matrix<double, boost::numeric::ublas::upper>&N22,
00563           boost::numeric::ublas::matrix<double>& N12,
00564           boost::numeric::ublas::compressed_vector<double>& n1,
00565           boost::numeric::ublas::vector<double>& n2,
00566           boost::numeric::ublas::matrix<double>& coeff_image,
00567           boost::numeric::ublas::matrix<double>& coeff_point3D,
00568           boost::numeric::ublas::vector<double>& coeff_RHS, int nImageIndex);
00569 
00570       bool formNormals2_SPECIALK(boost::numeric::ublas::symmetric_matrix<double, boost::numeric::ublas::upper>&N22,
00571           boost::numeric::ublas::matrix<double>& N12,
00572           boost::numeric::ublas::vector<double>& n2,
00573           boost::numeric::ublas::vector<double>& nj, int nPointIndex, int i);
00574 
00575       bool formNormals3_SPECIALK(boost::numeric::ublas::compressed_vector<double>& n1,
00576           boost::numeric::ublas::vector<double>& nj);
00577 
00578       bool solveSystem_SPECIALK();
00579 
00580       void AmultAdd_CNZRows_SPECIALK(double alpha,
00581           boost::numeric::ublas::matrix< double > &A,
00582           boost::numeric::ublas::compressed_matrix< double > &B,
00583           boost::numeric::ublas::symmetric_matrix < double,
00584           boost::numeric::ublas::upper,
00585           boost::numeric::ublas::column_major > &C);
00586 
00587       void transA_NZ_multAdd_SPECIALK(double alpha,
00588           boost::numeric::ublas::compressed_matrix< double > &A,
00589           boost::numeric::ublas::vector< double > &B,
00590           boost::numeric::ublas::vector< double > &C);
00591 
00592       void applyParameterCorrections_SPECIALK();
00593 
00594       bool errorPropagation_SPECIALK();
00595 
00596       bool CholeskyUT_NOSQR();
00597       bool CholeskyUT_NOSQR_Inverse();
00598       bool CholeskyUT_NOSQR_BackSub(
00599         boost::numeric::ublas::symmetric_matrix < double,
00600         boost::numeric::ublas::upper,
00601         boost::numeric::ublas::column_major > &m,
00602         boost::numeric::ublas::vector< double > &s,
00603         boost::numeric::ublas::vector< double > &rhs);
00604 
00605       bool ComputePartials_DC(boost::numeric::ublas::matrix<double>& coeff_image,
00606           boost::numeric::ublas::matrix<double>& coeff_point3D,
00607           boost::numeric::ublas::vector<double>& coeff_RHS,
00608           const ControlMeasure &measure, const ControlPoint &point);
00609 
00610 //      bool CholeskyUT_NOSQR_BackSub(symmetric_matrix<double,lower>& m, vector<double>& s, vector<double>& rhs);
00611       double ComputeResiduals();
00612 
00613       // dedicated matrix functions
00614       void AmulttransBNZ(boost::numeric::ublas::matrix<double>& A,
00615           boost::numeric::ublas::compressed_matrix<double>& B,
00616           boost::numeric::ublas::matrix<double> &C, double alpha=1.0);
00617       void ANZmultAdd(boost::numeric::ublas::compressed_matrix<double>& A,
00618           boost::numeric::ublas::symmetric_matrix < double,
00619           boost::numeric::ublas::upper,boost::numeric::ublas::column_major >& B,
00620           boost::numeric::ublas::matrix<double>& C, double alpha=1.0) ;
00621 
00622       bool Invert_3x3(boost::numeric::ublas::symmetric_matrix < double,
00623                       boost::numeric::ublas::upper > &m);
00624 
00625       bool product_ATransB(boost::numeric::ublas::symmetric_matrix < double,
00626           boost::numeric::ublas::upper > &N22, SparseBlockColumnMatrix& N12,
00627           SparseBlockRowMatrix& Q);
00628       void product_AV(double alpha, boost::numeric::ublas::bounded_vector< double,3 >& v2,
00629           SparseBlockRowMatrix& Q, boost::numeric::ublas::vector< double >& v1);
00630 
00631       bool ComputeRejectionLimit();
00632       bool FlagOutliers();
00633 
00634       //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00635       // variables and methods for cholmod
00636       cholmod_common m_cm;
00637       cholmod_factor *m_L;
00638       cholmod_sparse* m_N;
00639 
00640       SparseBlockMatrix m_SparseNormals;
00641       cholmod_triplet* m_pTriplet;
00642 
00643       bool initializeCholMod();
00644       bool freeCholMod();
00645       bool cholmod_Inverse();
00646       bool loadCholmodTriplet();
00647 
00648 
00649 
00650       //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00651       // variables and methods for maximum likelihood estimation
00652       //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
00655       MaximumLikelihoodWFunctions *m_wFunc[3];
00656      
00659       StatCumProbDistDynCalc *m_cumPro;
00660 
00663       StatCumProbDistDynCalc *m_cumProRes;
00664 
00667       bool m_maxLikelihoodFlag[3];
00668 
00671       int m_maxLikelihoodIndex;
00672 
00675       double m_maxLikelihoodQuan[3];
00676 
00677       public: void maximumLikelihoodSetup( QList<QString> models, QList<double> quantiles );
00678   };
00679 
00680 }
00681 
00682 #endif
00683