[37] | 1 | ///////////////////////////////////////////////////////////////////////////////// |
---|
| 2 | //// |
---|
| 3 | //// Prototypes and definitions for sparse bundle adjustment |
---|
| 4 | //// Copyright (C) 2004 Manolis Lourakis (lourakis@ics.forth.gr) |
---|
| 5 | //// Institute of Computer Science, Foundation for Research & Technology - Hellas |
---|
| 6 | //// Heraklion, Crete, Greece. |
---|
| 7 | //// |
---|
| 8 | //// This program is free software; you can redistribute it and/or modify |
---|
| 9 | //// it under the terms of the GNU General Public License as published by |
---|
| 10 | //// the Free Software Foundation; either version 2 of the License, or |
---|
| 11 | //// (at your option) any later version. |
---|
| 12 | //// |
---|
| 13 | //// This program is distributed in the hope that it will be useful, |
---|
| 14 | //// but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 15 | //// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
| 16 | //// GNU General Public License for more details. |
---|
| 17 | //// |
---|
| 18 | /////////////////////////////////////////////////////////////////////////////////// |
---|
| 19 | |
---|
| 20 | #ifndef _SBA_H_ |
---|
| 21 | #define _SBA_H_ |
---|
| 22 | |
---|
| 23 | #ifdef __cplusplus |
---|
| 24 | extern "C" { |
---|
| 25 | #endif |
---|
| 26 | |
---|
| 27 | #define SBA_APPEND_UNDERSCORE_SUFFIX // undef this for AIX |
---|
| 28 | |
---|
| 29 | #define SBA_MIN_DELTA 1E-06 // finite differentiation minimum delta |
---|
| 30 | #define SBA_DELTA_SCALE 1E-04 // finite differentiation delta scale |
---|
| 31 | |
---|
| 32 | #define SBA_OPTSSZ 4 |
---|
| 33 | #define SBA_INFOSZ 10 |
---|
| 34 | #define SBA_INIT_MU 1E-03 |
---|
| 35 | #define SBA_STOP_THRESH 1E-12 |
---|
| 36 | #define SBA_CG_NOPREC 0 |
---|
| 37 | #define SBA_CG_JACOBI 1 |
---|
| 38 | #define SBA_CG_SSOR 2 |
---|
| 39 | #define SBA_VERSION "1.3 (Jun. 2006)" |
---|
| 40 | |
---|
| 41 | |
---|
| 42 | /* Sparse matrix representation using Compressed Row Storage (CRS) format. |
---|
| 43 | * See http://www.netlib.org/linalg/html_templates/node91.html#SECTION00931100000000000000 |
---|
| 44 | */ |
---|
| 45 | |
---|
| 46 | struct sba_crsm{ |
---|
| 47 | int nr, nc; /* #rows, #cols for the sparse matrix */ |
---|
| 48 | int nnz; /* number of nonzero array elements */ |
---|
| 49 | int *val; /* storage for nonzero array elements. size: nnz */ |
---|
| 50 | int *colidx; /* column indexes of nonzero elements. size: nnz */ |
---|
| 51 | int *rowptr; /* locations in val that start a row. size: nr+1. |
---|
| 52 | * By convention, rowptr[nr]=nnz |
---|
| 53 | */ |
---|
| 54 | }; |
---|
| 55 | |
---|
| 56 | /* sparse LM */ |
---|
| 57 | |
---|
| 58 | /* simple drivers */ |
---|
| 59 | extern int |
---|
| 60 | sba_motstr_levmar(const int n, const int m, const int mcon, char *vmask, double *p, const int cnp, const int pnp, double *x, const int mnp, |
---|
| 61 | void (*proj)(int j, int i, double *aj, double *bi, double *xij, void *adata), |
---|
| 62 | void (*projac)(int j, int i, double *aj, double *bi, double *Aij, double *Bij, void *adata), |
---|
| 63 | void *adata, int itmax, int verbose, double opts[SBA_OPTSSZ], double info[SBA_INFOSZ]); |
---|
| 64 | |
---|
| 65 | extern int |
---|
| 66 | sba_mot_levmar(const int n, const int m, const int mcon, char *vmask, double *p, const int cnp, double *x, const int mnp, |
---|
| 67 | void (*proj)(int j, int i, double *aj, double *xij, void *adata), |
---|
| 68 | void (*projac)(int j, int i, double *aj, double *Aij, void *adata), |
---|
| 69 | void *adata, int itmax, int verbose, double opts[SBA_OPTSSZ], double info[SBA_INFOSZ]); |
---|
| 70 | |
---|
| 71 | extern int |
---|
| 72 | sba_str_levmar(const int n, const int m, char *vmask, double *p, const int pnp, double *x, const int mnp, |
---|
| 73 | void (*proj)(int j, int i, double *bi, double *xij, void *adata), |
---|
| 74 | void (*projac)(int j, int i, double *bi, double *Bij, void *adata), |
---|
| 75 | void *adata, int itmax, int verbose, double opts[SBA_OPTSSZ], double info[SBA_INFOSZ]); |
---|
| 76 | |
---|
| 77 | |
---|
| 78 | /* expert drivers */ |
---|
| 79 | extern int |
---|
| 80 | sba_motstr_levmar_x(const int n, const int m, const int mcon, char *vmask, double *p, int const cnp, const int pnp, double *x, const int mnp, |
---|
| 81 | void (*func)(double *p, struct sba_crsm *idxij, int *rcidxs, int *rcsubs, double *hx, void *adata), |
---|
| 82 | void (*fjac)(double *p, struct sba_crsm *idxij, int *rcidxs, int *rcsubs, double *jac, void *adata), |
---|
| 83 | void *adata, int itmax, int verbose, double opts[SBA_OPTSSZ], double info[SBA_INFOSZ]); |
---|
| 84 | |
---|
| 85 | extern int |
---|
| 86 | sba_mot_levmar_x(const int n, const int m, const int mcon, char *vmask, double *p, int const cnp, double *x, const int mnp, |
---|
| 87 | void (*func)(double *p, struct sba_crsm *idxij, int *rcidxs, int *rcsubs, double *hx, void *adata), |
---|
| 88 | void (*fjac)(double *p, struct sba_crsm *idxij, int *rcidxs, int *rcsubs, double *jac, void *adata), |
---|
| 89 | void *adata, int itmax, int verbose, double opts[SBA_OPTSSZ], double info[SBA_INFOSZ]); |
---|
| 90 | |
---|
| 91 | extern int |
---|
| 92 | sba_str_levmar_x(const int n, const int m, char *vmask, double *p, const int pnp, double *x, const int mnp, |
---|
| 93 | void (*func)(double *p, struct sba_crsm *idxij, int *rcidxs, int *rcsubs, double *hx, void *adata), |
---|
| 94 | void (*fjac)(double *p, struct sba_crsm *idxij, int *rcidxs, int *rcsubs, double *jac, void *adata), |
---|
| 95 | void *adata, int itmax, int verbose, double opts[SBA_OPTSSZ], double info[SBA_INFOSZ]); |
---|
| 96 | |
---|
| 97 | |
---|
| 98 | /* interfaces to LAPACK routines: solution of linear systems, matrix inversion */ |
---|
| 99 | extern int sba_Axb_QR(double *A, double *B, double *x, int m, int iscolmaj); |
---|
| 100 | extern int sba_Axb_QRnoQ(double *A, double *B, double *x, int m, int iscolmaj); |
---|
| 101 | extern int sba_Axb_Chol(double *A, double *B, double *x, int m, int iscolmaj); |
---|
| 102 | extern int sba_Axb_LU(double *A, double *B, double *x, int m, int iscolmaj); |
---|
| 103 | extern int sba_Axb_SVD(double *A, double *B, double *x, int m, int iscolmaj); |
---|
| 104 | extern int sba_Axb_BK(double *A, double *B, double *x, int m, int iscolmaj); |
---|
| 105 | extern int sba_Axb_CG(double *A, double *B, double *x, int m, int niter, double eps, int prec, int iscolmaj); |
---|
| 106 | extern int sba_mat_invert_LU(double *A, double *B, int m); |
---|
| 107 | extern int sba_mat_invert_Chol(double *A, double *B, int m); |
---|
| 108 | |
---|
| 109 | /* CRS sparse matrices manipulation routines */ |
---|
| 110 | extern void sba_crsm_alloc(struct sba_crsm *sm, int nr, int nc, int nnz); |
---|
| 111 | extern void sba_crsm_free(struct sba_crsm *sm); |
---|
| 112 | extern int sba_crsm_elmidx(struct sba_crsm *sm, int i, int j); |
---|
| 113 | extern int sba_crsm_row_elmidxs(struct sba_crsm *sm, int i, int *vidxs, int *jidxs); |
---|
| 114 | extern int sba_crsm_col_elmidxs(struct sba_crsm *sm, int j, int *vidxs, int *iidxs); |
---|
| 115 | |
---|
| 116 | #ifdef __cplusplus |
---|
| 117 | } |
---|
| 118 | #endif |
---|
| 119 | |
---|
| 120 | #endif /* _SBA_H_ */ |
---|