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