# 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.
#
# Author: mierle@gmail.com (Keir Mierle)
#
# These are Bazel rules to build Ceres. It's currently in Alpha state, and does
# not support parameterization around threading choice or sparse backends.
load("//:bazel/ceres.bzl", "ceres_library")
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test")

exports_files(["data/problem-16-22106-pre.txt"])

ceres_library(
    name = "ceres",
    restrict_schur_specializations = False,
)

cc_library(
    name = "test_util",
    srcs = ["internal/ceres/" + x for x in [
        "evaluator_test_utils.cc",
        "numeric_diff_test_utils.cc",
        "test_util.cc",
    ]],
    copts = [
        "-Wno-sign-compare",
        "-DCERES_TEST_SRCDIR_SUFFIX=\\\"_main/data/\\\"",
    ],
    defines = [
        "CERES_HAS_GTEST",
    ],
    includes = [
        "internal",
        "internal/ceres",
    ],
    deps = [
        "//:ceres",
        "@googletest//:gtest_main",
    ],
)

CERES_TESTS = [
    "accurate_norm",
    "array_selector",
    "array_utils",
    "autodiff",
    "autodiff_cost_function",
    "autodiff_first_order_function",
    "autodiff_manifold",
    "block_jacobi_preconditioner",
    "block_random_access_dense_matrix",
    "block_random_access_diagonal_matrix",
    "block_random_access_sparse_matrix",
    "block_sparse_matrix",
    "c_api",
    "canonical_views_clustering",
    "compressed_col_sparse_matrix_utils",
    "compressed_row_sparse_matrix",
    "concurrent_queue",
    "conditioned_cost_function",
    "conjugate_gradients_solver",
    "coordinate_descent_minimizer",
    "corrector",
    "cost_function_to_functor",
    "covariance",
    "cubic_interpolation",
    "cuda_block_sparse_crs_view",
    "cuda_block_structure",
    "cuda_dense_cholesky",
    "cuda_dense_qr",
    "cuda_kernels_vector_ops",
    "cuda_partitioned_block_sparse_crs_view",
    "cuda_sparse_matrix",
    "cuda_streamed_buffer",
    "cuda_vector",
    "dense_cholesky",
    "dense_linear_solver",
    "dense_qr",
    "dense_sparse_matrix",
    "detect_structure",
    "dogleg_strategy",
    "dynamic_autodiff_cost_function",
    "dynamic_compressed_row_sparse_matrix",
    "dynamic_numeric_diff_cost_function",
    "dynamic_sparse_normal_cholesky_solver",
    "dynamic_sparsity",
    "evaluation_callback",
    "evaluator",
    "gradient_checker",
    "gradient_checking_cost_function",
    "gradient_problem",
    "gradient_problem_solver",
    "graph",
    "graph_algorithms",
    "householder_vector",
    "implicit_schur_complement",
    "inner_product_computer",
    "integer_sequence_algorithm",
    "invert_psd_matrix",
    "is_close",
    "iterative_refiner",
    "iterative_schur_complement_solver",
    "jet",
    "jet_traits",
    "levenberg_marquardt_strategy",
    "line_search_minimizer",
    "line_search_preprocessor",
    "loss_function",
    "manifold",
    "minimizer",
    "normal_prior",
    "numeric_diff_cost_function",
    "numeric_diff_first_order_function",
    "ordered_groups",
    "parallel_for",
    "parallel_utils",
    "parameter_block",
    "parameter_block_ordering",
    "parameter_dims",
    "partitioned_matrix_view",
    "polynomial",
    "power_series_expansion_preconditioner",
    "problem",
    "program",
    "reorder_program",
    "residual_block",
    "residual_block_utils",
    "rotation",
    "schur_complement_solver",
    "schur_eliminator",
    "single_linkage_clustering",
    "small_blas",
    "solver",
    "sparse_cholesky",
    "sparse_normal_cholesky_solver",
    "subset_preconditioner",
    "system",
    "thread_pool",
    "tiny_solver",
    "tiny_solver_autodiff_function",
    "tiny_solver_cost_function_adapter",
    "triplet_sparse_matrix",
    "trust_region_minimizer",
    "trust_region_preprocessor",
    "visibility",
    "visibility_based_preconditioner",
]

TEST_DEPS = [
    "//:ceres",
    "//:test_util",
    "@eigen//:eigen",
]

# Instantiate all the tests with a template.
[cc_test(
    name = test_name + "_test",
    timeout = "short",
    srcs = ["internal/ceres/" + test_name + "_test.cc"],
    deps = TEST_DEPS,
) for test_name in CERES_TESTS]

# Instantiate all the bundle adjustment tests. These are separate to
# parallelize the execution of the tests; otherwise the tests take a long time.
#
# Note: While it is possible to run the Python script to generate the .cc files
# as part of the build, it introduces an undesirable build-time Python
# dependency that we'd prefer to avoid.
[cc_test(
    name = test_filename.split("/")[-1][:-3],  # Remove .cc.
    timeout = "long",
    srcs = [test_filename],
    # This is the data set that is bundled for the testing.
    data = [":data/problem-16-22106-pre.txt"],
    deps = TEST_DEPS,
) for test_filename in glob([
    "internal/ceres/generated_bundle_adjustment_tests/*_test.cc",
])]

# Build the benchmarks.
BENCHMARK_COPTS = select({
    "@rules_cc//cc/compiler:clang": [
        "-mllvm -inlinehint-threshold=1000000",
        "-mno-outline",
    ],
    "//conditions:default": [],
})

[cc_binary(
    name = benchmark_name,
    srcs = ["internal/ceres/" + benchmark_name + ".cc"],
    copts = BENCHMARK_COPTS,
    deps = TEST_DEPS + ["@google_benchmark//:benchmark"],
) for benchmark_name in [
    "autodiff_manifold_benchmark",
    "block_jacobi_preconditioner_benchmark",
    "dense_linear_solver_benchmark",
    "evaluation_benchmark",
    "first_order_function_differentiation_benchmark",
    "invert_psd_matrix_benchmark",
    "jet_operator_benchmark",
    "parallel_for_benchmark",
    "parallel_vector_operations_benchmark",
    "schur_eliminator_benchmark",
    "small_blas_gemm_benchmark",
    "small_blas_gemv_benchmark",
    "spmv_benchmark",
]]

cc_binary(
    name = "cost_function_differentiation_benchmark",
    srcs = [
        "internal/ceres/benchmark_cost_functions.h",
        "internal/ceres/cost_function_differentiation_benchmark.cc",
    ],
    copts = BENCHMARK_COPTS,
    deps = TEST_DEPS + ["@google_benchmark//:benchmark"],
)
