# ABSL random-number generation libraries.

load(
    "//absl:copts/configure_copts.bzl",
    "ABSL_DEFAULT_COPTS",
    "ABSL_DEFAULT_LINKOPTS",
    "ABSL_EXCEPTIONS_FLAG",
    "ABSL_EXCEPTIONS_FLAG_LINKOPTS",
    "ABSL_TEST_COPTS",
)

package(default_visibility = ["//visibility:public"])

licenses(["notice"])  # Apache 2.0

cc_library(
    name = "random",
    hdrs = ["random.h"],
    copts = ABSL_DEFAULT_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":seed_sequences",
        "//absl/random/internal:nonsecure_base",
        "//absl/random/internal:pcg_engine",
        "//absl/random/internal:pool_urbg",
        "//absl/random/internal:randen_engine",
    ],
)

cc_library(
    name = "distributions",
    srcs = [
        "discrete_distribution.cc",
        "gaussian_distribution.cc",
    ],
    hdrs = [
        "bernoulli_distribution.h",
        "beta_distribution.h",
        "discrete_distribution.h",
        "distribution_format_traits.h",
        "distributions.h",
        "exponential_distribution.h",
        "gaussian_distribution.h",
        "log_uniform_int_distribution.h",
        "poisson_distribution.h",
        "uniform_int_distribution.h",
        "uniform_real_distribution.h",
        "zipf_distribution.h",
    ],
    copts = ABSL_DEFAULT_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        "//absl/base:base_internal",
        "//absl/base:core_headers",
        "//absl/meta:type_traits",
        "//absl/random/internal:distribution_impl",
        "//absl/random/internal:distributions",
        "//absl/random/internal:fast_uniform_bits",
        "//absl/random/internal:fastmath",
        "//absl/random/internal:iostream_state_saver",
        "//absl/random/internal:traits",
        "//absl/random/internal:uniform_helper",
        "//absl/strings",
        "//absl/types:span",
    ],
)

cc_library(
    name = "seed_gen_exception",
    srcs = ["seed_gen_exception.cc"],
    hdrs = ["seed_gen_exception.h"],
    copts = ABSL_DEFAULT_COPTS + ABSL_EXCEPTIONS_FLAG,
    linkopts = ABSL_EXCEPTIONS_FLAG_LINKOPTS + ABSL_DEFAULT_LINKOPTS,
    deps = ["//absl/base:config"],
)

cc_library(
    name = "seed_sequences",
    srcs = ["seed_sequences.cc"],
    hdrs = [
        "seed_sequences.h",
    ],
    copts = ABSL_DEFAULT_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":seed_gen_exception",
        "//absl/container:inlined_vector",
        "//absl/random/internal:nonsecure_base",
        "//absl/random/internal:pool_urbg",
        "//absl/random/internal:salted_seed_seq",
        "//absl/random/internal:seed_material",
        "//absl/types:span",
    ],
)

cc_test(
    name = "bernoulli_distribution_test",
    size = "small",
    timeout = "eternal",  # Android can take a very long time
    srcs = ["bernoulli_distribution_test.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "//absl/random/internal:sequence_urbg",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "beta_distribution_test",
    size = "small",
    timeout = "eternal",  # Android can take a very long time
    srcs = ["beta_distribution_test.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "//absl/base",
        "//absl/random/internal:distribution_test_util",
        "//absl/random/internal:sequence_urbg",
        "//absl/strings",
        "//absl/strings:str_format",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "distributions_test",
    size = "small",
    srcs = [
        "distributions_test.cc",
    ],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "//absl/random/internal:distribution_test_util",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "generators_test",
    size = "small",
    srcs = ["generators_test.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "log_uniform_int_distribution_test",
    size = "medium",
    srcs = [
        "log_uniform_int_distribution_test.cc",
    ],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "//absl/base",
        "//absl/base:core_headers",
        "//absl/random/internal:distribution_test_util",
        "//absl/random/internal:sequence_urbg",
        "//absl/strings",
        "//absl/strings:str_format",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "discrete_distribution_test",
    size = "medium",
    srcs = [
        "discrete_distribution_test.cc",
    ],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "//absl/base",
        "//absl/random/internal:distribution_test_util",
        "//absl/random/internal:sequence_urbg",
        "//absl/strings",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "poisson_distribution_test",
    size = "small",
    timeout = "eternal",  # Android can take a very long time
    srcs = [
        "poisson_distribution_test.cc",
    ],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    tags = [
        # Too Slow.
        "no_test_android_arm",
        "no_test_loonix",
    ],
    deps = [
        ":distributions",
        ":random",
        "//absl/base",
        "//absl/base:core_headers",
        "//absl/container:flat_hash_map",
        "//absl/random/internal:distribution_test_util",
        "//absl/random/internal:sequence_urbg",
        "//absl/strings",
        "//absl/strings:str_format",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "exponential_distribution_test",
    size = "small",
    srcs = ["exponential_distribution_test.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "//absl/base",
        "//absl/base:core_headers",
        "//absl/random/internal:distribution_test_util",
        "//absl/random/internal:sequence_urbg",
        "//absl/strings",
        "//absl/strings:str_format",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "gaussian_distribution_test",
    size = "small",
    timeout = "eternal",  # Android can take a very long time
    srcs = [
        "gaussian_distribution_test.cc",
    ],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "//absl/base",
        "//absl/base:core_headers",
        "//absl/random/internal:distribution_test_util",
        "//absl/random/internal:sequence_urbg",
        "//absl/strings",
        "//absl/strings:str_format",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "uniform_int_distribution_test",
    size = "medium",
    timeout = "long",
    srcs = [
        "uniform_int_distribution_test.cc",
    ],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "//absl/base",
        "//absl/random/internal:distribution_test_util",
        "//absl/random/internal:sequence_urbg",
        "//absl/strings",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "uniform_real_distribution_test",
    size = "medium",
    srcs = [
        "uniform_real_distribution_test.cc",
    ],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    tags = [
        "no_test_android_arm",
        "no_test_android_arm64",
        "no_test_android_x86",
    ],
    deps = [
        ":distributions",
        ":random",
        "//absl/base",
        "//absl/random/internal:distribution_test_util",
        "//absl/random/internal:sequence_urbg",
        "//absl/strings",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "zipf_distribution_test",
    size = "medium",
    srcs = [
        "zipf_distribution_test.cc",
    ],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":distributions",
        ":random",
        "//absl/base",
        "//absl/random/internal:distribution_test_util",
        "//absl/random/internal:sequence_urbg",
        "//absl/strings",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "examples_test",
    size = "small",
    srcs = ["examples_test.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":random",
        "@com_google_googletest//:gtest_main",
    ],
)

cc_test(
    name = "seed_sequences_test",
    size = "small",
    srcs = ["seed_sequences_test.cc"],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    deps = [
        ":random",
        ":seed_sequences",
        "//absl/random/internal:nonsecure_base",
        "@com_google_googletest//:gtest_main",
    ],
)

BENCHMARK_TAGS = [
    "benchmark",
    "no_test_android_arm",
    "no_test_android_arm64",
    "no_test_android_x86",
    "no_test_darwin_x86_64",
    "no_test_ios_x86_64",
    "no_test_loonix",
    "no_test_msvc_x64",
    "no_test_wasm",
]

# Benchmarks for various methods / test utilities
cc_binary(
    name = "benchmarks",
    testonly = 1,
    srcs = [
        "benchmarks.cc",
    ],
    copts = ABSL_TEST_COPTS,
    linkopts = ABSL_DEFAULT_LINKOPTS,
    tags = BENCHMARK_TAGS,
    deps = [
        ":distributions",
        ":random",
        ":seed_sequences",
        "//absl/base:core_headers",
        "//absl/meta:type_traits",
        "//absl/random/internal:fast_uniform_bits",
        "//absl/random/internal:randen_engine",
        "@com_github_google_benchmark//:benchmark_main",
    ],
)
