Isis 3 Programmer Reference
BundleAdjust.h
1#ifndef BundleAdjust_h
2#define BundleAdjust_h
3
10/* SPDX-License-Identifier: CC0-1.0 */
11
12#include <QObject> // parent class
13
14// std lib
15#include <vector>
16#include <fstream>
17
18// cholmod lib
19#include <cholmod.h>
20
21// Isis lib
22#include "BundleControlPoint.h"
23#include "BundleLidarPointVector.h"
24#include "BundleObservationSolveSettings.h"
25#include "BundleObservationVector.h"
26#include "BundleResults.h"
27#include "BundleSettings.h"
28#include "BundleSolutionInfo.h"
29#include "BundleTargetBody.h"
30#include "Camera.h"
31#include "CameraGroundMap.h"
32#include "ControlMeasure.h"
33#include "ControlNet.h"
34#include "LidarData.h"
35#include "LinearAlgebra.h"
36#include "MaximumLikelihoodWFunctions.h"
37#include "ObservationNumberList.h"
38#include "Progress.h"
39#include "SerialNumberList.h"
40#include "SparseBlockMatrix.h"
41#include "Statistics.h"
42
43template< typename T > class QList;
44template< typename A, typename B > class QMap;
45
46namespace Isis {
47 class Control;
48 class ImageList;
49
329 class BundleAdjust : public QObject {
330 Q_OBJECT
331 public:
332 BundleAdjust(BundleSettingsQsp bundleSettings,
333 const QString &cnetFile,
334 const QString &cubeList,
335 bool printSummary = true);
336 BundleAdjust(BundleSettingsQsp bundleSettings,
337 const QString &cnetFile,
338 const QString &cubeList,
339 const QString &lidarDataFile,
340 bool printSummary = true);
341 BundleAdjust(BundleSettingsQsp bundleSettings,
342 QString &cnet,
343 SerialNumberList &snlist,
344 bool printSummary = true);
345 BundleAdjust(BundleSettingsQsp bundleSettings,
346 Control &cnet,
347 SerialNumberList &snlist,
348 bool bPrintSummary);
349 BundleAdjust(BundleSettingsQsp bundleSettings,
350 ControlNet &cnet,
351 SerialNumberList &snlist,
352 bool printSummary = true);
353 BundleAdjust(BundleSettingsQsp bundleSettings,
354 ControlNetQsp cnet,
355 const QString &cubeList,
356 bool printSummary = true);
357 BundleAdjust(BundleSettingsQsp bundleSettings,
358 Control &control,
359 QList<ImageList *> imgList,
360 bool printSummary);
363
364 QList<ImageList *> imageLists();
365 bool isAborted();
366
367 public slots:
368 bool solveCholesky();
369 void abortBundle();
370 void outputBundleStatus(QString status);
371
372 // accessors
373
377 QString fileName(int index);
378 QString iterationSummaryGroup() const;
379 bool isConverged();
380 Table cMatrix(int index);
381 Table spVector(int index);
382 QString modelState(int index);
383 int numberOfImages() const;
384 double iteration() const;
385
386 signals:
387 void statusUpdate(QString);
388 void error(QString);
389 void iterationUpdate(int);
390 void pointUpdate(int);
391 void statusBarUpdate(QString);
392 void resultsReady(BundleSolutionInfo *bundleSolveInformation);
393 void finished();
394
395 private:
396 //TODO Should there be a resetBundle(BundleSettings bundleSettings) method
397 // that allows for rerunning with new settings? JWB
398 void init(Progress *progress = 0);
400 bool validateNetwork();
401 bool solveSystem();
402 void iterationSummary();
406 bool errorPropagation();
407 void computeResiduals();
408 double computeVtpv();
410 bool flagOutliers();
411
412 // normal equation matrices methods
413
414 bool formNormalEquations();
415 bool computePartials(LinearAlgebra::Matrix &coeffTarget,
416 LinearAlgebra::Matrix &coeffImage,
417 LinearAlgebra::Matrix &coeffPoint3D,
418 LinearAlgebra::Vector &coeffRHS,
419 BundleMeasure &measure,
420 BundleControlPoint &point);
425 LinearAlgebra::Matrix &coeffTarget,
426 LinearAlgebra::Matrix &coeffImage,
427 LinearAlgebra::Matrix &coeffPoint3D,
428 LinearAlgebra::Vector &coeffRHS,
429 int observationIndex);
434 BundleControlPointQsp &point);
442
443 // dedicated matrix functions
444
447 void accumProductAlphaAB(double alpha,
455
456 // CHOLMOD library methods
457
460 bool loadCholmodTriplet();
461
462 // member variables
463
469
470 QVector <BundleControlPointQsp> m_bundleControlPoints;
472
476
477 BundleObservationVector m_bundleObservations;
481 BundleTargetBodyQsp m_bundleTargetBody;
483 bool m_abort;
484 QString m_iterationSummary;
492 int m_rank;
496 QList<ImageList *> m_imageLists;
499 // ==========================================================================================
500 // === BEYOND THIS PLACE (THERE BE DRAGONS) all refers to the folded bundle solution. ===
501 // === Currently, everything uses the CHOLMOD library, ===
502 // === there is no dependence on the least-squares class. ===
503 // ==========================================================================================
504
506 boost::numeric::ublas::symmetric_matrix<
507 double,
508 boost::numeric::ublas::upper,
509 boost::numeric::ublas::column_major > m_normalInverse;
510 cholmod_common m_cholmodCommon;
519 cholmod_triplet *m_cholmodTriplet;
525 cholmod_sparse *m_cholmodNormal;
530 cholmod_factor *m_L;
540 };
541}
542
543#endif
An image bundle adjustment object.
QString modelState(int index)
Return the updated model state for the ith cube in the cube list given to the constructor.
bool m_cleanUp
!< If the iteration summaries should be output to the log file.
int m_rank
!< If the serial number lists need to be deleted by the destructor.
SparseBlockMatrix m_sparseNormals
!< The right hand side of the normal equations.
int numberOfImages() const
Returns the number of images.
void productAB(SparseBlockColumnMatrix &A, SparseBlockRowMatrix &B)
Perform the matrix multiplication C = N12 x Q.
bool solveCholesky()
Compute the least squares bundle adjustment solution using Cholesky decomposition.
bool computeBundleStatistics()
Compute Bundle statistics and store them in m_bundleResults.
double m_iterationTime
Time for last iteration.
int formLidarPointNormals(LinearAlgebra::MatrixUpperTriangular &N22, SparseBlockColumnMatrix &N12, LinearAlgebra::Vector &n2, LinearAlgebra::Vector &nj, BundleLidarControlPointQsp &point)
Compute the Q matrix and NIC vector for a control point.
bool formNormalEquations()
Form the least-squares normal equations matrix via cholmod.
SerialNumberList * serialNumberList()
Returns a pointer to the serial number list.
void init(Progress *progress=0)
Initialize all solution parameters.
bool computePartials(LinearAlgebra::Matrix &coeffTarget, LinearAlgebra::Matrix &coeffImage, LinearAlgebra::Matrix &coeffPoint3D, LinearAlgebra::Vector &coeffRHS, BundleMeasure &measure, BundleControlPoint &point)
Compute partial derivatives and weighted residuals for a measure.
bool isConverged()
Returns if the BundleAdjust converged.
QString fileName(int index)
Return the ith filename in the cube list file given to constructor.
void abortBundle()
Flag to abort when bundle is threaded.
QString m_lidarFileName
Input lidar point filename.
int m_previousNumberImagePartials
!< The image parameter solution vector.
double iteration() const
Returns what iteration the BundleAdjust is currently on.
void outputBundleStatus(QString status)
Slot for deltack and jigsaw to output the bundle status.
bool flagOutliers()
Flags outlier measures and control points.
QVector< BundleControlPointQsp > m_bundleControlPoints
Vector of control points.
LidarDataQsp lidarData()
Returns a pointer to the output lidar data file.
bool isAborted()
Returns if the BundleAdjust has been aborted.
BundleSettingsQsp m_bundleSettings
Contains the solve settings.
bool invert3x3(LinearAlgebra::MatrixUpperTriangular &m)
Dedicated quick inverse of 3x3 matrix.
int m_numLidarConstraints
TODO: temp.
Table cMatrix(int index)
Return the updated instrument pointing table for the ith cube in the cube list given to the construct...
double computeVtpv()
Computes vtpv, the weighted sum of squares of residuals.
QList< ImageList * > imageLists()
This method returns the image list used in the bundle adjust.
void applyParameterCorrections()
Apply parameter corrections for current iteration.
bool initializeCHOLMODLibraryVariables()
Initializations for CHOLMOD sparse matrix package.
boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper, boost::numeric::ublas::column_major > m_normalInverse
!< The lists of images used in the bundle.
int m_numberOfImagePartials
number of image-related partials.
LinearAlgebra::Vector m_imageSolution
!< The lower triangular L matrix from Cholesky decomposition.
cholmod_triplet * m_cholmodTriplet
!< The sparse block normal equations matrix.
ControlNetQsp m_controlNet
Output control net.
bool validateNetwork()
control network validation - on the very real chance that the net has not been checked before running...
SerialNumberList * m_serialNumberList
!< Vector of observations.
bool loadCholmodTriplet()
Load sparse normal equations matrix into CHOLMOD triplet.
LidarDataQsp m_lidarDataSet
Output lidar data.
cholmod_factor * m_L
!< The CHOLMOD sparse normal equations matrix used by cholmod_factorize to solve the system.
bool solveSystem()
Compute the solution to the normal equations using the CHOLMOD library.
BundleAdjust(BundleSettingsQsp bundleSettings, const QString &cnetFile, const QString &cubeList, bool printSummary=true)
Construct a BundleAdjust object from the given settings, control network file, and cube list.
void accumProductAlphaAB(double alpha, SparseBlockRowMatrix &A, LinearAlgebra::Vector &B, LinearAlgebra::Vector &C)
Performs the matrix multiplication nj = nj + alpha (Q x n2).
bool initializeNormalEquationsMatrix()
Initialize Normal Equations matrix (m_sparseNormals).
QString iterationSummaryGroup() const
Returns the iteration summary string.
LinearAlgebra::Vector m_RHS
!< Contains object parameters, statistics, and workspace used by the CHOLMOD library.
bool errorPropagation()
Error propagation for solution.
BundleResults m_bundleResults
Stores the results of the bundle adjust.
QString m_cnetFileName
The control net filename.
bool formMeasureNormals(LinearAlgebra::MatrixUpperTriangular &N22, SparseBlockColumnMatrix &N12, LinearAlgebra::VectorCompressed &n1, LinearAlgebra::Vector &n2, LinearAlgebra::Matrix &coeffTarget, LinearAlgebra::Matrix &coeffImage, LinearAlgebra::Matrix &coeffPoint3D, LinearAlgebra::Vector &coeffRHS, int observationIndex)
Form the auxilary normal equation matrices for a measure.
BundleSolutionInfo * bundleSolveInformation()
Create a BundleSolutionInfo containing the settings and results from the bundle adjustment.
int formPointNormals(LinearAlgebra::MatrixUpperTriangular &N22, SparseBlockColumnMatrix &N12, LinearAlgebra::Vector &n2, LinearAlgebra::Vector &nj, BundleControlPointQsp &point)
Compute the Q matrix and NIC vector for a control point.
bool m_abort
!< Contains information about the target body.
BundleLidarPointVector m_bundleLidarControlPoints
Vector of lidar points.
void computeResiduals()
Compute image measure residuals.
bool m_printSummary
!< Summary of the most recently completed iteration.
bool computeRejectionLimit()
Compute rejection limit.
bool productATransB(LinearAlgebra::MatrixUpperTriangular &N22, SparseBlockColumnMatrix &N12, SparseBlockRowMatrix &Q)
Perform the matrix multiplication Q = N22 x N12(transpose)
void iterationSummary()
Creates an iteration summary and an iteration group for the solution summary.
int m_iteration
The current iteration.
bool freeCHOLMODLibraryVariables()
Free CHOLMOD library variables.
bool formWeightedNormals(LinearAlgebra::VectorCompressed &n1, LinearAlgebra::Vector &nj)
Apply weighting for spacecraft position, velocity, acceleration and camera angles,...
BundleSolutionInfo * solveCholeskyBR()
Compute the least squares bundle adjustment solution using Cholesky decomposition.
ControlNetQsp controlNet()
Returns a pointer to the output control network.
cholmod_sparse * m_cholmodNormal
!< The CHOLMOD triplet representation of the sparse normal equations matrix.
~BundleAdjust()
Destroys BundleAdjust object, deallocates pointers (if we have ownership), and frees variables from c...
Table spVector(int index)
Return the updated instrument position table for the ith cube in the cube list given to the construct...
This class holds information about a control point that BundleAdjust needs to run correctly.
This class is a container class for BundleLidarControlPoints.
A container class for a ControlMeasure.
This class is a container class for BundleObservations.
A container class for statistical results from a BundleAdjust solution.
Container class for BundleAdjustment results.
This represents an ISIS control net in a project-based GUI interface.
Definition Control.h:66
a control network
Definition ControlNet.h:258
Internalizes a list of images and allows for operations on the entire list.
Definition ImageList.h:55
boost::numeric::ublas::compressed_vector< double > VectorCompressed
Definition for an Isis::LinearAlgebra::VectorCompressed of doubles.
boost::numeric::ublas::vector< double > Vector
Definition for an Isis::LinearAlgebra::Vector of doubles.
boost::numeric::ublas::matrix< double > Matrix
Definition for an Isis::LinearAlgebra::Matrix of doubles.
boost::numeric::ublas::symmetric_matrix< double, boost::numeric::ublas::upper > MatrixUpperTriangular
Definition for an Isis::LinearAlgebra::MatrixUpperTriangular of doubles with an upper configuration.
Program progress reporter.
Definition Progress.h:42
Serial Number list generator.
SparseBlockColumnMatrix.
Class for storing Table blobs information.
Definition Table.h:61
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
This is free and unencumbered software released into the public domain.
Definition Apollo.h:16