| # Ceres Solver - A fast non-linear least squares minimizer | |
| # Copyright 2023 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. | |
| # | |
| # Support for building Ceres Solver with a specific configuration. | |
| load("@rules_cc//cc:defs.bzl", "cc_library") | |
| CERES_SRCS = ["internal/ceres/" + filename for filename in [ | |
| "accelerate_sparse.cc", | |
| "array_utils.cc", | |
| "block_evaluate_preparer.cc", | |
| "block_jacobi_preconditioner.cc", | |
| "block_jacobian_writer.cc", | |
| "block_random_access_dense_matrix.cc", | |
| "block_random_access_diagonal_matrix.cc", | |
| "block_random_access_matrix.cc", | |
| "block_random_access_sparse_matrix.cc", | |
| "block_sparse_matrix.cc", | |
| "block_structure.cc", | |
| "c_api.cc", | |
| "callbacks.cc", | |
| "canonical_views_clustering.cc", | |
| "cgnr_solver.cc", | |
| "compressed_col_sparse_matrix_utils.cc", | |
| "compressed_row_jacobian_writer.cc", | |
| "compressed_row_sparse_matrix.cc", | |
| "conditioned_cost_function.cc", | |
| "context.cc", | |
| "context_impl.cc", | |
| "coordinate_descent_minimizer.cc", | |
| "corrector.cc", | |
| "cost_function.cc", | |
| "covariance.cc", | |
| "covariance_impl.cc", | |
| "dense_cholesky.cc", | |
| "dense_normal_cholesky_solver.cc", | |
| "dense_qr.cc", | |
| "dense_qr_solver.cc", | |
| "dense_sparse_matrix.cc", | |
| "detect_structure.cc", | |
| "dogleg_strategy.cc", | |
| "dynamic_compressed_row_jacobian_writer.cc", | |
| "dynamic_compressed_row_sparse_matrix.cc", | |
| "dynamic_cost_function_to_functor.cc", | |
| "dynamic_sparse_normal_cholesky_solver.cc", | |
| "eigensparse.cc", | |
| "evaluation_callback.cc", | |
| "evaluator.cc", | |
| "event_logger.cc", | |
| "fake_bundle_adjustment_jacobian.cc", | |
| "file.cc", | |
| "first_order_function.cc", | |
| "function_sample.cc", | |
| "gradient_checker.cc", | |
| "gradient_checking_cost_function.cc", | |
| "gradient_problem.cc", | |
| "gradient_problem_solver.cc", | |
| "implicit_schur_complement.cc", | |
| "inner_product_computer.cc", | |
| "is_close.cc", | |
| "iteration_callback.cc", | |
| "iterative_refiner.cc", | |
| "iterative_schur_complement_solver.cc", | |
| "levenberg_marquardt_strategy.cc", | |
| "line_search.cc", | |
| "line_search_direction.cc", | |
| "line_search_minimizer.cc", | |
| "line_search_preprocessor.cc", | |
| "linear_least_squares_problems.cc", | |
| "linear_operator.cc", | |
| "linear_solver.cc", | |
| "loss_function.cc", | |
| "low_rank_inverse_hessian.cc", | |
| "manifold.cc", | |
| "minimizer.cc", | |
| "normal_prior.cc", | |
| "parallel_invoke.cc", | |
| "parallel_utils.cc", | |
| "parallel_vector_ops.cc", | |
| "parameter_block_ordering.cc", | |
| "partitioned_matrix_view.cc", | |
| "polynomial.cc", | |
| "power_series_expansion_preconditioner.cc", | |
| "preconditioner.cc", | |
| "preprocessor.cc", | |
| "problem.cc", | |
| "problem_impl.cc", | |
| "program.cc", | |
| "reorder_program.cc", | |
| "residual_block.cc", | |
| "residual_block_utils.cc", | |
| "schur_complement_solver.cc", | |
| "schur_eliminator.cc", | |
| "schur_jacobi_preconditioner.cc", | |
| "schur_templates.cc", | |
| "scratch_evaluate_preparer.cc", | |
| "single_linkage_clustering.cc", | |
| "solver.cc", | |
| "solver_utils.cc", | |
| "sparse_cholesky.cc", | |
| "sparse_matrix.cc", | |
| "sparse_normal_cholesky_solver.cc", | |
| "subset_preconditioner.cc", | |
| "suitesparse.cc", | |
| "thread_pool.cc", | |
| "thread_token_provider.cc", | |
| "triplet_sparse_matrix.cc", | |
| "trust_region_minimizer.cc", | |
| "trust_region_preprocessor.cc", | |
| "trust_region_step_evaluator.cc", | |
| "trust_region_strategy.cc", | |
| "types.cc", | |
| "visibility_based_preconditioner.cc", | |
| "visibility.cc", | |
| ]] | |
| # TODO(rodrigoq): add support to configure Ceres into various permutations, | |
| # like SuiteSparse or not, and so on. | |
| # See https://github.com/ceres-solver/ceres-solver/issues/335. | |
| def ceres_library( | |
| name, | |
| restrict_schur_specializations = False): | |
| # The fixed-size Schur eliminator template instantiations incur a large | |
| # binary size penalty, and are slow to compile, so support disabling them. | |
| schur_eliminator_copts = [] | |
| if restrict_schur_specializations: | |
| schur_eliminator_copts.append("-DCERES_RESTRICT_SCHUR_SPECIALIZATION") | |
| schur_sources = [ | |
| "internal/ceres/generated/schur_eliminator_d_d_d.cc", | |
| "internal/ceres/generated/partitioned_matrix_view_d_d_d.cc", | |
| ] | |
| else: | |
| schur_sources = native.glob(["internal/ceres/generated/*.cc"]) | |
| cc_library( | |
| name = name, | |
| # Internal sources, options, and dependencies. | |
| srcs = CERES_SRCS + schur_sources + native.glob([ | |
| "include/ceres/internal/*.h", | |
| ]) + native.glob([ | |
| "internal/ceres/*.h", | |
| ]), | |
| # These headers are made available to other targets. | |
| hdrs = | |
| native.glob(["include/ceres/*.h"]) + native.glob([ | |
| "include/ceres/internal/*.h", | |
| ]) + | |
| # This is an empty config and export, since the | |
| # Bazel-based build does not generate a | |
| # config.h/export.h. This is fine, since Bazel properly | |
| # handles propagating -D defines to dependent targets. | |
| native.glob([ | |
| "config/ceres/internal/config.h", | |
| "config/ceres/internal/export.h", | |
| ]), | |
| copts = schur_eliminator_copts, | |
| # These include directories and defines are propagated to other targets | |
| # depending on Ceres. | |
| # TODO(keir): These defines are placeholders for now to facilitate getting | |
| # started with a Bazel build. However, these should become configurable as | |
| # part of a Skylark Ceres target macro. | |
| # https://github.com/ceres-solver/ceres-solver/issues/396 | |
| defines = [ | |
| "CERES_NO_ACCELERATE_SPARSE", | |
| "CERES_NO_CHOLMOD_PARTITION", | |
| "CERES_NO_CUDA", | |
| "CERES_NO_CUDSS", | |
| "CERES_NO_EIGEN_METIS", | |
| "CERES_NO_EXPORT=", | |
| "CERES_NO_LAPACK", | |
| "CERES_NO_SUITESPARSE", | |
| "CERES_USE_EIGEN_SPARSE", | |
| "CERES_EXPORT=", | |
| ], | |
| includes = [ | |
| "config", | |
| "include", | |
| "internal", | |
| ], | |
| visibility = ["//visibility:public"], | |
| deps = [ | |
| "@eigen//:eigen", | |
| "@abseil-cpp//absl/log", | |
| "@abseil-cpp//absl/container:fixed_array", | |
| "@abseil-cpp//absl/container:flat_hash_map", | |
| "@abseil-cpp//absl/container:flat_hash_set", | |
| "@abseil-cpp//absl/strings", | |
| "@abseil-cpp//absl/time", | |
| "@abseil-cpp//absl/container:btree", | |
| "@abseil-cpp//absl/log:check", | |
| ], | |
| ) |