• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Ceres Solver - A fast non-linear least squares minimizer
2 // Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
3 // http://code.google.com/p/ceres-solver/
4 //
5 // Redistribution and use in source and binary forms, with or without
6 // modification, are permitted provided that the following conditions are met:
7 //
8 // * Redistributions of source code must retain the above copyright notice,
9 //   this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright notice,
11 //   this list of conditions and the following disclaimer in the documentation
12 //   and/or other materials provided with the distribution.
13 // * Neither the name of Google Inc. nor the names of its contributors may be
14 //   used to endorse or promote products derived from this software without
15 //   specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 // POSSIBILITY OF SUCH DAMAGE.
28 //
29 // Author: sameeragarwal@google.com (Sameer Agarwal)
30 //
31 // For generalized bi-partite Jacobian matrices that arise in
32 // Structure from Motion related problems, it is sometimes useful to
33 // have access to the two parts of the matrix as linear operators
34 // themselves. This class provides that functionality.
35 
36 #ifndef CERES_INTERNAL_PARTITIONED_MATRIX_VIEW_H_
37 #define CERES_INTERNAL_PARTITIONED_MATRIX_VIEW_H_
38 
39 #include "ceres/block_sparse_matrix.h"
40 
41 namespace ceres {
42 namespace internal {
43 
44 // Given generalized bi-partite matrix A = [E F], with the same block
45 // structure as required by the Schur complement based solver, found
46 // in explicit_schur_complement_solver.h, provide access to the
47 // matrices E and F and their outer products E'E and F'F with
48 // themselves.
49 //
50 // Lack of BlockStructure object will result in a crash and if the
51 // block structure of the matrix does not satisfy the requirements of
52 // the Schur complement solver it will result in unpredictable and
53 // wrong output.
54 //
55 // This class lives in the internal name space as its a utility class
56 // to be used by the IterativeSchurComplementSolver class, found in
57 // iterative_schur_complement_solver.h, and is not meant for general
58 // consumption.
59 class PartitionedMatrixView {
60  public:
61   // matrix = [E F], where the matrix E contains the first
62   // num_col_blocks_a column blocks.
63   PartitionedMatrixView(const BlockSparseMatrixBase& matrix,
64                         int num_col_blocks_a);
65   ~PartitionedMatrixView();
66 
67   // y += E'x
68   void LeftMultiplyE(const double* x, double* y) const;
69 
70   // y += F'x
71   void LeftMultiplyF(const double* x, double* y) const;
72 
73   // y += Ex
74   void RightMultiplyE(const double* x, double* y) const;
75 
76   // y += Fx
77   void RightMultiplyF(const double* x, double* y) const;
78 
79   // Create and return the block diagonal of the matrix E'E.
80   BlockSparseMatrix* CreateBlockDiagonalEtE() const;
81 
82   // Create and return the block diagonal of the matrix F'F.
83   BlockSparseMatrix* CreateBlockDiagonalFtF() const;
84 
85   // Compute the block diagonal of the matrix E'E and store it in
86   // block_diagonal. The matrix block_diagonal is expected to have a
87   // BlockStructure (preferably created using
88   // CreateBlockDiagonalMatrixEtE) which is has the same structure as
89   // the block diagonal of E'E.
90   void UpdateBlockDiagonalEtE(BlockSparseMatrix* block_diagonal) const;
91 
92   // Compute the block diagonal of the matrix F'F and store it in
93   // block_diagonal. The matrix block_diagonal is expected to have a
94   // BlockStructure (preferably created using
95   // CreateBlockDiagonalMatrixFtF) which is has the same structure as
96   // the block diagonal of F'F.
97   void UpdateBlockDiagonalFtF(BlockSparseMatrix* block_diagonal) const;
98 
num_col_blocks_e()99   int num_col_blocks_e() const { return num_col_blocks_e_;  }
num_col_blocks_f()100   int num_col_blocks_f() const { return num_col_blocks_f_;  }
num_cols_e()101   int num_cols_e()       const { return num_cols_e_;        }
num_cols_f()102   int num_cols_f()       const { return num_cols_f_;        }
num_rows()103   int num_rows()         const { return matrix_.num_rows(); }
num_cols()104   int num_cols()         const { return matrix_.num_cols(); }
105 
106  private:
107   BlockSparseMatrix* CreateBlockDiagonalMatrixLayout(int start_col_block,
108                                                      int end_col_block) const;
109 
110   const BlockSparseMatrixBase& matrix_;
111   int num_row_blocks_e_;
112   int num_col_blocks_e_;
113   int num_col_blocks_f_;
114   int num_cols_e_;
115   int num_cols_f_;
116 };
117 
118 }  // namespace internal
119 }  // namespace ceres
120 
121 #endif  // CERES_INTERNAL_PARTITIONED_MATRIX_VIEW_H_
122