| // Ceres Solver - A fast non-linear least squares minimizer | 
 | // Copyright 2015 Google Inc. All rights reserved. | 
 | // http://ceres-solver.org/ | 
 | // | 
 | // 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: richie.stebbing@gmail.com (Richard Stebbing) | 
 | // | 
 | // A compressed row sparse matrix that provides an extended interface to | 
 | // allow dynamic insertion of entries. This is provided for the use case | 
 | // where the sparsity structure and number of non-zero entries is dynamic. | 
 | // This flexibility is achieved by using an (internal) scratch space that | 
 | // allows independent insertion of entries into each row (thread-safe). | 
 | // Once insertion is complete, the `Finalize` method must be called to ensure | 
 | // that the underlying `CompressedRowSparseMatrix` is consistent. | 
 | // | 
 | // This should only be used if you really do need a dynamic sparsity pattern. | 
 |  | 
 | #ifndef CERES_INTERNAL_DYNAMIC_COMPRESSED_ROW_SPARSE_MATRIX_H_ | 
 | #define CERES_INTERNAL_DYNAMIC_COMPRESSED_ROW_SPARSE_MATRIX_H_ | 
 |  | 
 | #include <vector> | 
 |  | 
 | #include "ceres/compressed_row_sparse_matrix.h" | 
 | #include "ceres/internal/disable_warnings.h" | 
 | #include "ceres/internal/export.h" | 
 |  | 
 | namespace ceres::internal { | 
 |  | 
 | class CERES_NO_EXPORT DynamicCompressedRowSparseMatrix final | 
 |     : public CompressedRowSparseMatrix { | 
 |  public: | 
 |   // Set the number of rows and columns for the underlying | 
 |   // `CompressedRowSparseMatrix` and set the initial number of maximum non-zero | 
 |   // entries. Note that following the insertion of entries, when `Finalize` | 
 |   // is called the number of non-zeros is determined and all internal | 
 |   // structures are adjusted as required. If you know the upper limit on the | 
 |   // number of non-zeros, then passing this value here can prevent future | 
 |   // memory reallocations which may improve performance. Otherwise, if no | 
 |   // upper limit is available a value of 0 is sufficient. | 
 |   // | 
 |   // Typical usage of this class is to define a new instance with a given | 
 |   // number of rows, columns and maximum number of non-zero elements | 
 |   // (if available). Next, entries are inserted at row and column positions | 
 |   // using `InsertEntry`. Finally, once all elements have been inserted, | 
 |   // `Finalize` must be called to make the underlying | 
 |   // `CompressedRowSparseMatrix` consistent. | 
 |   DynamicCompressedRowSparseMatrix(int num_rows, | 
 |                                    int num_cols, | 
 |                                    int initial_max_num_nonzeros); | 
 |  | 
 |   // Insert an entry at a given row and column position. This method is | 
 |   // thread-safe across rows i.e. different threads can insert values | 
 |   // simultaneously into different rows. It should be emphasized that this | 
 |   // method always inserts a new entry and does not check for existing | 
 |   // entries at the specified row and column position. Duplicate entries | 
 |   // for a given row and column position will result in undefined | 
 |   // behavior. | 
 |   void InsertEntry(int row, int col, const double& value); | 
 |  | 
 |   // Clear all entries for rows, starting from row index `row_start` | 
 |   // and proceeding for `num_rows`. | 
 |   void ClearRows(int row_start, int num_rows); | 
 |  | 
 |   // Make the underlying internal `CompressedRowSparseMatrix` data structures | 
 |   // consistent. Additional space for non-zero entries in the | 
 |   // `CompressedRowSparseMatrix` can be reserved by specifying | 
 |   // `num_additional_elements`. This is useful when it is known that rows will | 
 |   // be appended to the `CompressedRowSparseMatrix` (e.g. appending a diagonal | 
 |   // matrix to the jacobian) as it prevents need for future reallocation. | 
 |   void Finalize(int num_additional_elements); | 
 |  | 
 |  private: | 
 |   std::vector<std::vector<int>> dynamic_cols_; | 
 |   std::vector<std::vector<double>> dynamic_values_; | 
 | }; | 
 |  | 
 | }  // namespace ceres::internal | 
 |  | 
 | #include "ceres/internal/reenable_warnings.h" | 
 |  | 
 | #endif  // CERES_INTERNAL_DYNAMIC_COMPRESSED_ROW_SPARSE_MATRIX_H_ |