1# 2# Copyright 2019 The Abseil Authors. 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# https://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16 17# ABSL random-number generation libraries. 18 19load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_test") 20load( 21 "//absl:copts/configure_copts.bzl", 22 "ABSL_DEFAULT_COPTS", 23 "ABSL_DEFAULT_LINKOPTS", 24 "ABSL_TEST_COPTS", 25) 26 27package(default_visibility = ["//visibility:public"]) 28 29licenses(["notice"]) 30 31cc_library( 32 name = "random", 33 hdrs = ["random.h"], 34 copts = ABSL_DEFAULT_COPTS, 35 linkopts = ABSL_DEFAULT_LINKOPTS, 36 deps = [ 37 ":distributions", 38 ":seed_sequences", 39 "//absl/random/internal:nonsecure_base", 40 "//absl/random/internal:pcg_engine", 41 "//absl/random/internal:pool_urbg", 42 "//absl/random/internal:randen_engine", 43 ], 44) 45 46cc_library( 47 name = "distributions", 48 srcs = [ 49 "discrete_distribution.cc", 50 "gaussian_distribution.cc", 51 ], 52 hdrs = [ 53 "bernoulli_distribution.h", 54 "beta_distribution.h", 55 "discrete_distribution.h", 56 "distributions.h", 57 "exponential_distribution.h", 58 "gaussian_distribution.h", 59 "log_uniform_int_distribution.h", 60 "poisson_distribution.h", 61 "uniform_int_distribution.h", 62 "uniform_real_distribution.h", 63 "zipf_distribution.h", 64 ], 65 copts = ABSL_DEFAULT_COPTS, 66 linkopts = ABSL_DEFAULT_LINKOPTS, 67 deps = [ 68 "//absl/base:base_internal", 69 "//absl/base:config", 70 "//absl/base:core_headers", 71 "//absl/meta:type_traits", 72 "//absl/random/internal:distribution_caller", 73 "//absl/random/internal:fast_uniform_bits", 74 "//absl/random/internal:fastmath", 75 "//absl/random/internal:generate_real", 76 "//absl/random/internal:iostream_state_saver", 77 "//absl/random/internal:traits", 78 "//absl/random/internal:uniform_helper", 79 "//absl/random/internal:wide_multiply", 80 "//absl/strings", 81 ], 82) 83 84cc_library( 85 name = "seed_gen_exception", 86 srcs = ["seed_gen_exception.cc"], 87 hdrs = ["seed_gen_exception.h"], 88 copts = ABSL_DEFAULT_COPTS, 89 linkopts = ABSL_DEFAULT_LINKOPTS, 90 deps = ["//absl/base:config"], 91) 92 93cc_library( 94 name = "seed_sequences", 95 srcs = ["seed_sequences.cc"], 96 hdrs = [ 97 "seed_sequences.h", 98 ], 99 copts = ABSL_DEFAULT_COPTS, 100 linkopts = ABSL_DEFAULT_LINKOPTS, 101 deps = [ 102 ":seed_gen_exception", 103 "//absl/container:inlined_vector", 104 "//absl/random/internal:nonsecure_base", 105 "//absl/random/internal:pool_urbg", 106 "//absl/random/internal:salted_seed_seq", 107 "//absl/random/internal:seed_material", 108 "//absl/types:span", 109 ], 110) 111 112cc_library( 113 name = "bit_gen_ref", 114 hdrs = ["bit_gen_ref.h"], 115 copts = ABSL_DEFAULT_COPTS, 116 linkopts = ABSL_DEFAULT_LINKOPTS, 117 deps = [ 118 ":random", 119 "//absl/base:core_headers", 120 "//absl/base:fast_type_id", 121 "//absl/meta:type_traits", 122 "//absl/random/internal:distribution_caller", 123 "//absl/random/internal:fast_uniform_bits", 124 ], 125) 126 127cc_library( 128 name = "mock_distributions", 129 testonly = 1, 130 hdrs = ["mock_distributions.h"], 131 deps = [ 132 ":distributions", 133 ":mocking_bit_gen", 134 "//absl/meta:type_traits", 135 "//absl/random/internal:mock_overload_set", 136 "@com_google_googletest//:gtest", 137 ], 138) 139 140cc_library( 141 name = "mocking_bit_gen", 142 testonly = 1, 143 hdrs = [ 144 "mocking_bit_gen.h", 145 ], 146 linkopts = ABSL_DEFAULT_LINKOPTS, 147 deps = [ 148 ":distributions", 149 ":random", 150 "//absl/base:fast_type_id", 151 "//absl/container:flat_hash_map", 152 "//absl/meta:type_traits", 153 "//absl/random/internal:distribution_caller", 154 "//absl/strings", 155 "//absl/types:span", 156 "//absl/types:variant", 157 "//absl/utility", 158 "@com_google_googletest//:gtest", 159 ], 160) 161 162cc_test( 163 name = "bernoulli_distribution_test", 164 size = "small", 165 timeout = "eternal", # Android can take a very long time 166 srcs = ["bernoulli_distribution_test.cc"], 167 copts = ABSL_TEST_COPTS, 168 linkopts = ABSL_DEFAULT_LINKOPTS, 169 deps = [ 170 ":distributions", 171 ":random", 172 "//absl/random/internal:pcg_engine", 173 "//absl/random/internal:sequence_urbg", 174 "@com_google_googletest//:gtest_main", 175 ], 176) 177 178cc_test( 179 name = "beta_distribution_test", 180 size = "small", 181 timeout = "eternal", # Android can take a very long time 182 srcs = ["beta_distribution_test.cc"], 183 copts = ABSL_TEST_COPTS, 184 flaky = 1, 185 linkopts = ABSL_DEFAULT_LINKOPTS, 186 deps = [ 187 ":distributions", 188 ":random", 189 "//absl/base:raw_logging_internal", 190 "//absl/random/internal:distribution_test_util", 191 "//absl/random/internal:pcg_engine", 192 "//absl/random/internal:sequence_urbg", 193 "//absl/strings", 194 "//absl/strings:str_format", 195 "@com_google_googletest//:gtest_main", 196 ], 197) 198 199cc_test( 200 name = "distributions_test", 201 size = "small", 202 timeout = "moderate", 203 srcs = [ 204 "distributions_test.cc", 205 ], 206 copts = ABSL_TEST_COPTS, 207 linkopts = ABSL_DEFAULT_LINKOPTS, 208 deps = [ 209 ":distributions", 210 ":random", 211 "//absl/random/internal:distribution_test_util", 212 "@com_google_googletest//:gtest_main", 213 ], 214) 215 216cc_test( 217 name = "generators_test", 218 size = "small", 219 srcs = ["generators_test.cc"], 220 copts = ABSL_TEST_COPTS, 221 linkopts = ABSL_DEFAULT_LINKOPTS, 222 deps = [ 223 ":distributions", 224 ":random", 225 "@com_google_googletest//:gtest_main", 226 ], 227) 228 229cc_test( 230 name = "log_uniform_int_distribution_test", 231 size = "medium", 232 srcs = [ 233 "log_uniform_int_distribution_test.cc", 234 ], 235 copts = ABSL_TEST_COPTS, 236 linkopts = ABSL_DEFAULT_LINKOPTS, 237 deps = [ 238 ":distributions", 239 ":random", 240 "//absl/base:raw_logging_internal", 241 "//absl/random/internal:distribution_test_util", 242 "//absl/random/internal:pcg_engine", 243 "//absl/random/internal:sequence_urbg", 244 "//absl/strings", 245 "//absl/strings:str_format", 246 "@com_google_googletest//:gtest_main", 247 ], 248) 249 250cc_test( 251 name = "discrete_distribution_test", 252 size = "medium", 253 srcs = [ 254 "discrete_distribution_test.cc", 255 ], 256 copts = ABSL_TEST_COPTS, 257 linkopts = ABSL_DEFAULT_LINKOPTS, 258 deps = [ 259 ":distributions", 260 ":random", 261 "//absl/base:raw_logging_internal", 262 "//absl/random/internal:distribution_test_util", 263 "//absl/random/internal:pcg_engine", 264 "//absl/random/internal:sequence_urbg", 265 "//absl/strings", 266 "@com_google_googletest//:gtest_main", 267 ], 268) 269 270cc_test( 271 name = "poisson_distribution_test", 272 size = "small", 273 timeout = "eternal", # Android can take a very long time 274 srcs = [ 275 "poisson_distribution_test.cc", 276 ], 277 copts = ABSL_TEST_COPTS, 278 linkopts = ABSL_DEFAULT_LINKOPTS, 279 tags = [ 280 # Too Slow. 281 "no_test_android_arm", 282 "no_test_loonix", 283 ], 284 deps = [ 285 ":distributions", 286 ":random", 287 "//absl/base:core_headers", 288 "//absl/base:raw_logging_internal", 289 "//absl/container:flat_hash_map", 290 "//absl/random/internal:distribution_test_util", 291 "//absl/random/internal:pcg_engine", 292 "//absl/random/internal:sequence_urbg", 293 "//absl/strings", 294 "//absl/strings:str_format", 295 "@com_google_googletest//:gtest_main", 296 ], 297) 298 299cc_test( 300 name = "exponential_distribution_test", 301 size = "small", 302 srcs = ["exponential_distribution_test.cc"], 303 copts = ABSL_TEST_COPTS, 304 linkopts = ABSL_DEFAULT_LINKOPTS, 305 deps = [ 306 ":distributions", 307 ":random", 308 "//absl/base:core_headers", 309 "//absl/base:raw_logging_internal", 310 "//absl/random/internal:distribution_test_util", 311 "//absl/random/internal:pcg_engine", 312 "//absl/random/internal:sequence_urbg", 313 "//absl/strings", 314 "//absl/strings:str_format", 315 "@com_google_googletest//:gtest_main", 316 ], 317) 318 319cc_test( 320 name = "gaussian_distribution_test", 321 size = "small", 322 timeout = "eternal", # Android can take a very long time 323 srcs = [ 324 "gaussian_distribution_test.cc", 325 ], 326 copts = ABSL_TEST_COPTS, 327 linkopts = ABSL_DEFAULT_LINKOPTS, 328 deps = [ 329 ":distributions", 330 ":random", 331 "//absl/base:core_headers", 332 "//absl/base:raw_logging_internal", 333 "//absl/random/internal:distribution_test_util", 334 "//absl/random/internal:sequence_urbg", 335 "//absl/strings", 336 "//absl/strings:str_format", 337 "@com_google_googletest//:gtest_main", 338 ], 339) 340 341cc_test( 342 name = "uniform_int_distribution_test", 343 size = "medium", 344 timeout = "long", 345 srcs = [ 346 "uniform_int_distribution_test.cc", 347 ], 348 copts = ABSL_TEST_COPTS, 349 linkopts = ABSL_DEFAULT_LINKOPTS, 350 deps = [ 351 ":distributions", 352 ":random", 353 "//absl/base:raw_logging_internal", 354 "//absl/random/internal:distribution_test_util", 355 "//absl/random/internal:pcg_engine", 356 "//absl/random/internal:sequence_urbg", 357 "//absl/strings", 358 "@com_google_googletest//:gtest_main", 359 ], 360) 361 362cc_test( 363 name = "uniform_real_distribution_test", 364 size = "medium", 365 srcs = [ 366 "uniform_real_distribution_test.cc", 367 ], 368 copts = ABSL_TEST_COPTS, 369 linkopts = ABSL_DEFAULT_LINKOPTS, 370 tags = [ 371 "no_test_android_arm", 372 "no_test_android_arm64", 373 "no_test_android_x86", 374 ], 375 deps = [ 376 ":distributions", 377 ":random", 378 "//absl/base:raw_logging_internal", 379 "//absl/random/internal:distribution_test_util", 380 "//absl/random/internal:pcg_engine", 381 "//absl/random/internal:sequence_urbg", 382 "//absl/strings", 383 "@com_google_googletest//:gtest_main", 384 ], 385) 386 387cc_test( 388 name = "zipf_distribution_test", 389 size = "medium", 390 srcs = [ 391 "zipf_distribution_test.cc", 392 ], 393 copts = ABSL_TEST_COPTS, 394 linkopts = ABSL_DEFAULT_LINKOPTS, 395 deps = [ 396 ":distributions", 397 ":random", 398 "//absl/base:raw_logging_internal", 399 "//absl/random/internal:distribution_test_util", 400 "//absl/random/internal:pcg_engine", 401 "//absl/random/internal:sequence_urbg", 402 "//absl/strings", 403 "@com_google_googletest//:gtest_main", 404 ], 405) 406 407cc_test( 408 name = "bit_gen_ref_test", 409 size = "small", 410 srcs = ["bit_gen_ref_test.cc"], 411 copts = ABSL_TEST_COPTS, 412 linkopts = ABSL_DEFAULT_LINKOPTS, 413 deps = [ 414 ":bit_gen_ref", 415 ":random", 416 "//absl/base:fast_type_id", 417 "//absl/random/internal:sequence_urbg", 418 "@com_google_googletest//:gtest_main", 419 ], 420) 421 422cc_test( 423 name = "mocking_bit_gen_test", 424 size = "small", 425 srcs = ["mocking_bit_gen_test.cc"], 426 copts = ABSL_TEST_COPTS, 427 linkopts = ABSL_DEFAULT_LINKOPTS, 428 deps = [ 429 ":bit_gen_ref", 430 ":mock_distributions", 431 ":mocking_bit_gen", 432 ":random", 433 "@com_google_googletest//:gtest_main", 434 ], 435) 436 437cc_test( 438 name = "mock_distributions_test", 439 size = "small", 440 srcs = ["mock_distributions_test.cc"], 441 copts = ABSL_TEST_COPTS, 442 linkopts = ABSL_DEFAULT_LINKOPTS, 443 deps = [ 444 ":mock_distributions", 445 ":mocking_bit_gen", 446 ":random", 447 "@com_google_googletest//:gtest_main", 448 ], 449) 450 451cc_test( 452 name = "examples_test", 453 size = "small", 454 srcs = ["examples_test.cc"], 455 copts = ABSL_TEST_COPTS, 456 linkopts = ABSL_DEFAULT_LINKOPTS, 457 deps = [ 458 ":random", 459 "@com_google_googletest//:gtest_main", 460 ], 461) 462 463cc_test( 464 name = "seed_sequences_test", 465 size = "small", 466 srcs = ["seed_sequences_test.cc"], 467 copts = ABSL_TEST_COPTS, 468 linkopts = ABSL_DEFAULT_LINKOPTS, 469 deps = [ 470 ":random", 471 ":seed_sequences", 472 "//absl/random/internal:nonsecure_base", 473 "@com_google_googletest//:gtest_main", 474 ], 475) 476 477BENCHMARK_TAGS = [ 478 "benchmark", 479 "no_test_android_arm", 480 "no_test_android_arm64", 481 "no_test_android_x86", 482 "no_test_darwin_x86_64", 483 "no_test_ios_x86_64", 484 "no_test_loonix", 485 "no_test_msvc_x64", 486 "no_test_wasm", 487] 488 489# Benchmarks for various methods / test utilities 490cc_binary( 491 name = "benchmarks", 492 testonly = 1, 493 srcs = [ 494 "benchmarks.cc", 495 ], 496 copts = ABSL_TEST_COPTS, 497 linkopts = ABSL_DEFAULT_LINKOPTS, 498 tags = BENCHMARK_TAGS, 499 deps = [ 500 ":distributions", 501 ":random", 502 ":seed_sequences", 503 "//absl/base:core_headers", 504 "//absl/meta:type_traits", 505 "//absl/random/internal:fast_uniform_bits", 506 "//absl/random/internal:randen_engine", 507 "@com_github_google_benchmark//:benchmark_main", 508 ], 509) 510