179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// Ceres Solver - A fast non-linear least squares minimizer
279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// Copyright 2014 Google Inc. All rights reserved.
379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// http://code.google.com/p/ceres-solver/
479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//
579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// Redistribution and use in source and binary forms, with or without
679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// modification, are permitted provided that the following conditions are met:
779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//
879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// * Redistributions of source code must retain the above copyright notice,
979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//   this list of conditions and the following disclaimer.
1079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// * Redistributions in binary form must reproduce the above copyright notice,
1179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//   this list of conditions and the following disclaimer in the documentation
1279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//   and/or other materials provided with the distribution.
1379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// * Neither the name of Google Inc. nor the names of its contributors may be
1479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//   used to endorse or promote products derived from this software without
1579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//   specific prior written permission.
1679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//
1779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
1879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
2179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// POSSIBILITY OF SUCH DAMAGE.
2879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//
2979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// Author: richie.stebbing@gmail.com (Richard Stebbing)
3079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez//
3179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// A jacobian writer that directly writes to dynamic compressed row sparse
3279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez// matrices.
3379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
3479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#ifndef CERES_INTERNAL_DYNAMIC_COMPRESSED_ROW_JACOBIAN_WRITER_H_
3579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#define CERES_INTERNAL_DYNAMIC_COMPRESSED_ROW_JACOBIAN_WRITER_H_
3679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
3779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "ceres/evaluator.h"
3879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#include "ceres/scratch_evaluate_preparer.h"
3979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
4079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandeznamespace ceres {
4179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandeznamespace internal {
4279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
4379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandezclass Program;
4479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandezclass SparseMatrix;
4579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
4679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandezclass DynamicCompressedRowJacobianWriter {
4779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez public:
4879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  DynamicCompressedRowJacobianWriter(Evaluator::Options /* ignored */,
4979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez                                     Program* program)
5079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez    : program_(program) {
5179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  }
5279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
5379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // JacobianWriter interface.
5479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
5579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // The compressed row matrix has different layout than that assumed by
5679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // the cost functions. The scratch space is therefore used to store
5779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // the jacobians (including zeros) temporarily before only the non-zero
5879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // entries are copied over to the larger jacobian in `Write`.
5979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  ScratchEvaluatePreparer* CreateEvaluatePreparers(int num_threads);
6079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
6179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Return a `DynamicCompressedRowSparseMatrix` which is filled by
6279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // `Write`. Note that `Finalize` must be called to make the
6379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // `CompressedRowSparseMatrix` interface valid.
6479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  SparseMatrix* CreateJacobian() const;
6579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
6679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // Write only the non-zero jacobian entries for a residual block
6779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // (specified by `residual_id`) into `base_jacobian`, starting at the row
6879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // specifed by `residual_offset`.
6979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  //
7079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  // This method is thread-safe over residual blocks (each `residual_id`).
7179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  void Write(int residual_id,
7279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez             int residual_offset,
7379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez             double **jacobians,
7479397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez             SparseMatrix* base_jacobian);
7579397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
7679397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez private:
7779397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez  Program* program_;
7879397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez};
7979397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
8079397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez}  // namespace internal
8179397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez}  // namespace ceres
8279397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez
8379397c21138f54fcff6ec067b44b847f1f7e0e98Carlos Hernandez#endif // CERES_INTERNAL_DYNAMIC_COMPRESSED_ROW_JACOBIAN_WRITER_H_
84