Initial commit of Ceres Solver.
diff --git a/internal/ceres/partitioned_matrix_view.h b/internal/ceres/partitioned_matrix_view.h
new file mode 100644
index 0000000..cfe4de5
--- /dev/null
+++ b/internal/ceres/partitioned_matrix_view.h
@@ -0,0 +1,121 @@
+// Ceres Solver - A fast non-linear least squares minimizer
+// Copyright 2010, 2011, 2012 Google Inc. All rights reserved.
+// http://code.google.com/p/ceres-solver/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are met:
+//
+// * Redistributions of source code must retain the above copyright notice,
+//   this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above copyright notice,
+//   this list of conditions and the following disclaimer in the documentation
+//   and/or other materials provided with the distribution.
+// * Neither the name of Google Inc. nor the names of its contributors may be
+//   used to endorse or promote products derived from this software without
+//   specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+// POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: sameeragarwal@google.com (Sameer Agarwal)
+//
+// For generalized bi-partite Jacobian matrices that arise in
+// Structure from Motion related problems, it is sometimes useful to
+// have access to the two parts of the matrix as linear operators
+// themselves. This class provides that functionality.
+
+#ifndef CERES_INTERNAL_PARTITIONED_MATRIX_VIEW_H_
+#define CERES_INTERNAL_PARTITIONED_MATRIX_VIEW_H_
+
+#include "ceres/block_sparse_matrix.h"
+
+namespace ceres {
+namespace internal {
+
+// Given generalized bi-partite matrix A = [E F], with the same block
+// structure as required by the Schur complement based solver, found
+// in explicit_schur_complement_solver.h, provide access to the
+// matrices E and F and their outer products E'E and F'F with
+// themselves.
+//
+// Lack of BlockStructure object will result in a crash and if the
+// block structure of the matrix does not satisfy the requirements of
+// the Schur complement solver it will result in unpredictable and
+// wrong output.
+//
+// This class lives in the internal name space as its a utility class
+// to be used by the IterativeSchurComplementSolver class, found in
+// iterative_schur_complement_solver.h, and is not meant for general
+// consumption.
+class PartitionedMatrixView {
+ public:
+  // matrix = [E F], where the matrix E contains the first
+  // num_col_blocks_a column blocks.
+  PartitionedMatrixView(const BlockSparseMatrixBase& matrix,
+                        int num_col_blocks_a);
+  ~PartitionedMatrixView();
+
+  // y += E'x
+  void LeftMultiplyE(const double* x, double* y) const;
+
+  // y += F'x
+  void LeftMultiplyF(const double* x, double* y) const;
+
+  // y += Ex
+  void RightMultiplyE(const double* x, double* y) const;
+
+  // y += Fx
+  void RightMultiplyF(const double* x, double* y) const;
+
+  // Create and return the block diagonal of the matrix E'E.
+  BlockSparseMatrix* CreateBlockDiagonalEtE() const;
+
+  // Create and return the block diagonal of the matrix F'F.
+  BlockSparseMatrix* CreateBlockDiagonalFtF() const;
+
+  // Compute the block diagonal of the matrix E'E and store it in
+  // block_diagonal. The matrix block_diagonal is expected to have a
+  // BlockStructure (preferably created using
+  // CreateBlockDiagonalMatrixEtE) which is has the same structure as
+  // the block diagonal of E'E.
+  void UpdateBlockDiagonalEtE(BlockSparseMatrix* block_diagonal) const;
+
+  // Compute the block diagonal of the matrix F'F and store it in
+  // block_diagonal. The matrix block_diagonal is expected to have a
+  // BlockStructure (preferably created using
+  // CreateBlockDiagonalMatrixFtF) which is has the same structure as
+  // the block diagonal of F'F.
+  void UpdateBlockDiagonalFtF(BlockSparseMatrix* block_diagonal) const;
+
+  int num_col_blocks_e() const { return num_col_blocks_e_;  }
+  int num_col_blocks_f() const { return num_col_blocks_f_;  }
+  int num_cols_e()       const { return num_cols_e_;        }
+  int num_cols_f()       const { return num_cols_f_;        }
+  int num_rows()         const { return matrix_.num_rows(); }
+  int num_cols()         const { return matrix_.num_cols(); }
+
+ private:
+  BlockSparseMatrix* CreateBlockDiagonalMatrixLayout(int start_col_block,
+                                                     int end_col_block) const;
+
+  const BlockSparseMatrixBase& matrix_;
+  int num_row_blocks_e_;
+  int num_col_blocks_e_;
+  int num_col_blocks_f_;
+  int num_cols_e_;
+  int num_cols_f_;
+};
+
+}  // namespace internal
+}  // namespace ceres
+
+#endif  // CERES_INTERNAL_PARTITIONED_MATRIX_VIEW_H_