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