diff options
Diffstat (limited to 'internal/ceres/matrix.proto')
-rw-r--r-- | internal/ceres/matrix.proto | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/internal/ceres/matrix.proto b/internal/ceres/matrix.proto new file mode 100644 index 0000000..55a01d2 --- /dev/null +++ b/internal/ceres/matrix.proto @@ -0,0 +1,143 @@ +// 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: keir@google.com (Keir Mierle) + +syntax = "proto2"; + +package ceres.internal; + +message BlockProto { + // The span of the block. + optional int32 size = 1; + + // Position along the row or column (depending on storage orientation). + optional int32 position = 2; +} + +message CellProto { + // Column or row block id as appropriate. + optional int32 block_id = 1; + + // Position in the values array the cell is located. Each cell is stored as a + // row-major chunk inside the values array. + optional int32 position = 2; +} + +// A single row or column, depending on the matrix type. +message CompressedRowProto { + optional BlockProto block = 2; + repeated CellProto cells = 1; +} + +message BlockStructureProto { + repeated BlockProto cols = 1; + repeated CompressedRowProto rows = 2; +} + +// A block sparse matrix, either in column major or row major format. +message BlockSparseMatrixProto { + optional int64 num_rows = 2; + optional int64 num_cols = 3; + optional int64 num_nonzeros = 4; + repeated double values = 1 [packed=true]; + + optional BlockStructureProto block_structure = 5; +} + +message TripletSparseMatrixProto { + optional int64 num_rows = 4; + optional int64 num_cols = 5; + optional int64 num_nonzeros = 6; + + // The data is stored as three arrays. For each i, values(i) is stored at the + // location (rows(i), cols(i)). If the there are multiple entries with the + // same (rows(i), cols(i)), the values entries corresponding to them are + // summed up. + repeated int64 rows = 1 [packed=true]; + repeated int64 cols = 2 [packed=true]; + repeated double values = 3 [packed=true]; +} + +message CompressedRowSparseMatrixProto { + optional int64 num_rows = 4; + optional int64 num_cols = 5; + + repeated int64 rows = 1 [packed=true]; + repeated int64 cols = 2 [packed=true]; + repeated double values = 3 [packed=true]; +} + +message DenseSparseMatrixProto { + optional int64 num_rows = 1; + optional int64 num_cols = 2; + + // Entries are stored in row-major order. + repeated double values = 3 [packed=true]; +} + +// A sparse matrix. It is a union; only one field is permitted. If new sparse +// implementations are added, update this proto accordingly. +message SparseMatrixProto { + optional TripletSparseMatrixProto triplet_matrix = 1; + optional BlockSparseMatrixProto block_matrix = 2; + optional CompressedRowSparseMatrixProto compressed_row_matrix = 3; + optional DenseSparseMatrixProto dense_matrix = 4; +} + +// A linear least squares problem. +// +// Given a matrix A, an optional diagonal matrix D as a vector, and a vector b, +// the proto represents the following linear least squares problem. +// +// | A | x = | b | +// | D | | 0 | +// +// If D is empty, then the problem is considered to be +// +// A x = b +// +// The desired solution for the problem is the vector x that solves the +// following optimization problem: +// +// arg min_x ||Ax - b||^2 + ||Dx||^2 +// +// If x is present, then it is the expected solution to the +// problem. The dimensions of A, b, x, and D should be consistent. +message LinearLeastSquaresProblemProto { + optional SparseMatrixProto a = 1; + repeated double b = 2 [packed=true]; + repeated double d = 3 [packed=true]; + repeated double x = 4 [packed=true]; + // If the problem is of SfM type, i.e it has a generalized + // bi-partite structure, then num_eliminate_blocks is the number of + // column blocks that are to eliminated in the formation of the + // Schur complement. For more details see + // explicit_schur_complement_solver.h. + optional int32 num_eliminate_blocks = 5; +} |