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/base:nullability", 112 "//absl/random/internal:pool_urbg", 113 "//absl/random/internal:salted_seed_seq", 114 "//absl/random/internal:seed_material", 115 "//absl/strings:string_view", 116 "//absl/types:span", 117 ], 118) 119 120cc_library( 121 name = "bit_gen_ref", 122 hdrs = ["bit_gen_ref.h"], 123 copts = ABSL_DEFAULT_COPTS, 124 linkopts = ABSL_DEFAULT_LINKOPTS, 125 deps = [ 126 ":random", 127 "//absl/base:core_headers", 128 "//absl/base:fast_type_id", 129 "//absl/meta:type_traits", 130 "//absl/random/internal:distribution_caller", 131 "//absl/random/internal:fast_uniform_bits", 132 ], 133) 134 135cc_library( 136 name = "mock_distributions", 137 testonly = True, 138 hdrs = ["mock_distributions.h"], 139 linkopts = ABSL_DEFAULT_LINKOPTS, 140 deps = [ 141 ":distributions", 142 ":mocking_bit_gen", 143 "//absl/base:config", 144 "//absl/random/internal:mock_overload_set", 145 "//absl/random/internal:mock_validators", 146 ], 147) 148 149cc_library( 150 name = "mocking_bit_gen", 151 testonly = True, 152 hdrs = [ 153 "mocking_bit_gen.h", 154 ], 155 linkopts = ABSL_DEFAULT_LINKOPTS, 156 deps = [ 157 ":random", 158 "//absl/base:config", 159 "//absl/base:core_headers", 160 "//absl/base:fast_type_id", 161 "//absl/container:flat_hash_map", 162 "//absl/meta:type_traits", 163 "//absl/random/internal:mock_helpers", 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/meta:type_traits", 225 "//absl/numeric:int128", 226 "//absl/random/internal:distribution_test_util", 227 "@com_google_googletest//:gtest", 228 "@com_google_googletest//:gtest_main", 229 ], 230) 231 232cc_test( 233 name = "generators_test", 234 size = "small", 235 srcs = ["generators_test.cc"], 236 copts = ABSL_TEST_COPTS, 237 linkopts = ABSL_DEFAULT_LINKOPTS, 238 deps = [ 239 ":distributions", 240 ":random", 241 "@com_google_googletest//:gtest", 242 "@com_google_googletest//:gtest_main", 243 ], 244) 245 246cc_test( 247 name = "log_uniform_int_distribution_test", 248 size = "medium", 249 srcs = [ 250 "log_uniform_int_distribution_test.cc", 251 ], 252 copts = ABSL_TEST_COPTS, 253 linkopts = ABSL_DEFAULT_LINKOPTS, 254 tags = [ 255 "no_test_wasm", # Does not converge on WASM. 256 ], 257 deps = [ 258 ":distributions", 259 ":random", 260 "//absl/log", 261 "//absl/random/internal:distribution_test_util", 262 "//absl/random/internal:pcg_engine", 263 "//absl/random/internal:sequence_urbg", 264 "//absl/strings", 265 "//absl/strings:str_format", 266 "@com_google_googletest//:gtest", 267 "@com_google_googletest//:gtest_main", 268 ], 269) 270 271cc_test( 272 name = "discrete_distribution_test", 273 size = "medium", 274 srcs = [ 275 "discrete_distribution_test.cc", 276 ], 277 copts = ABSL_TEST_COPTS, 278 linkopts = ABSL_DEFAULT_LINKOPTS, 279 deps = [ 280 ":distributions", 281 ":random", 282 "//absl/log", 283 "//absl/random/internal:distribution_test_util", 284 "//absl/random/internal:pcg_engine", 285 "//absl/random/internal:sequence_urbg", 286 "//absl/strings", 287 "@com_google_googletest//:gtest", 288 "@com_google_googletest//:gtest_main", 289 ], 290) 291 292cc_test( 293 name = "poisson_distribution_test", 294 size = "small", 295 timeout = "eternal", # Android can take a very long time 296 srcs = [ 297 "poisson_distribution_test.cc", 298 ], 299 copts = ABSL_TEST_COPTS, 300 linkopts = ABSL_DEFAULT_LINKOPTS, 301 tags = [ 302 # Too Slow. 303 "no_test_android_arm", 304 "no_test_loonix", 305 ], 306 deps = [ 307 ":distributions", 308 ":random", 309 "//absl/base:core_headers", 310 "//absl/container:flat_hash_map", 311 "//absl/log", 312 "//absl/random/internal:distribution_test_util", 313 "//absl/random/internal:pcg_engine", 314 "//absl/random/internal:sequence_urbg", 315 "//absl/strings", 316 "//absl/strings:str_format", 317 "@com_google_googletest//:gtest", 318 "@com_google_googletest//:gtest_main", 319 ], 320) 321 322cc_test( 323 name = "exponential_distribution_test", 324 size = "small", 325 timeout = "moderate", 326 srcs = ["exponential_distribution_test.cc"], 327 copts = ABSL_TEST_COPTS, 328 linkopts = ABSL_DEFAULT_LINKOPTS, 329 deps = [ 330 ":distributions", 331 ":random", 332 "//absl/base:core_headers", 333 "//absl/log", 334 "//absl/numeric:representation", 335 "//absl/random/internal:distribution_test_util", 336 "//absl/random/internal:pcg_engine", 337 "//absl/random/internal:sequence_urbg", 338 "//absl/strings", 339 "//absl/strings:str_format", 340 "@com_google_googletest//:gtest", 341 "@com_google_googletest//:gtest_main", 342 ], 343) 344 345cc_test( 346 name = "gaussian_distribution_test", 347 size = "small", 348 timeout = "eternal", # Android can take a very long time 349 srcs = [ 350 "gaussian_distribution_test.cc", 351 ], 352 copts = ABSL_TEST_COPTS, 353 linkopts = ABSL_DEFAULT_LINKOPTS, 354 deps = [ 355 ":distributions", 356 ":random", 357 "//absl/base:core_headers", 358 "//absl/log", 359 "//absl/numeric:representation", 360 "//absl/random/internal:distribution_test_util", 361 "//absl/random/internal:sequence_urbg", 362 "//absl/strings", 363 "//absl/strings:str_format", 364 "@com_google_googletest//:gtest", 365 "@com_google_googletest//:gtest_main", 366 ], 367) 368 369cc_test( 370 name = "uniform_int_distribution_test", 371 size = "medium", 372 timeout = "long", 373 srcs = [ 374 "uniform_int_distribution_test.cc", 375 ], 376 copts = ABSL_TEST_COPTS, 377 linkopts = ABSL_DEFAULT_LINKOPTS, 378 deps = [ 379 ":distributions", 380 ":random", 381 "//absl/log", 382 "//absl/random/internal:distribution_test_util", 383 "//absl/random/internal:pcg_engine", 384 "//absl/random/internal:sequence_urbg", 385 "//absl/strings", 386 "@com_google_googletest//:gtest", 387 "@com_google_googletest//:gtest_main", 388 ], 389) 390 391cc_test( 392 name = "uniform_real_distribution_test", 393 size = "medium", 394 srcs = [ 395 "uniform_real_distribution_test.cc", 396 ], 397 copts = ABSL_TEST_COPTS, 398 linkopts = ABSL_DEFAULT_LINKOPTS, 399 tags = [ 400 "no_test_android_arm", 401 "no_test_android_arm64", 402 "no_test_android_x86", 403 ], 404 deps = [ 405 ":distributions", 406 ":random", 407 "//absl/log", 408 "//absl/numeric:representation", 409 "//absl/random/internal:distribution_test_util", 410 "//absl/random/internal:pcg_engine", 411 "//absl/random/internal:sequence_urbg", 412 "//absl/strings", 413 "@com_google_googletest//:gtest", 414 "@com_google_googletest//:gtest_main", 415 ], 416) 417 418cc_test( 419 name = "zipf_distribution_test", 420 size = "medium", 421 srcs = [ 422 "zipf_distribution_test.cc", 423 ], 424 copts = ABSL_TEST_COPTS, 425 linkopts = ABSL_DEFAULT_LINKOPTS, 426 deps = [ 427 ":distributions", 428 ":random", 429 "//absl/log", 430 "//absl/random/internal:distribution_test_util", 431 "//absl/random/internal:pcg_engine", 432 "//absl/random/internal:sequence_urbg", 433 "//absl/strings", 434 "@com_google_googletest//:gtest", 435 "@com_google_googletest//:gtest_main", 436 ], 437) 438 439cc_test( 440 name = "bit_gen_ref_test", 441 size = "small", 442 srcs = ["bit_gen_ref_test.cc"], 443 copts = ABSL_TEST_COPTS, 444 linkopts = ABSL_DEFAULT_LINKOPTS, 445 deps = [ 446 ":bit_gen_ref", 447 ":random", 448 "//absl/base:fast_type_id", 449 "//absl/random/internal:sequence_urbg", 450 "@com_google_googletest//:gtest", 451 "@com_google_googletest//:gtest_main", 452 ], 453) 454 455cc_test( 456 name = "mocking_bit_gen_test", 457 size = "small", 458 srcs = ["mocking_bit_gen_test.cc"], 459 copts = ABSL_TEST_COPTS, 460 linkopts = ABSL_DEFAULT_LINKOPTS, 461 tags = [ 462 "no_test_wasm", 463 ], 464 deps = [ 465 ":bit_gen_ref", 466 ":mock_distributions", 467 ":mocking_bit_gen", 468 ":random", 469 "@com_google_googletest//:gtest", 470 "@com_google_googletest//:gtest_main", 471 ], 472) 473 474cc_test( 475 name = "mock_distributions_test", 476 size = "small", 477 srcs = ["mock_distributions_test.cc"], 478 copts = ABSL_TEST_COPTS, 479 linkopts = ABSL_DEFAULT_LINKOPTS, 480 tags = [ 481 "no_test_wasm", 482 ], 483 deps = [ 484 ":distributions", 485 ":mock_distributions", 486 ":mocking_bit_gen", 487 ":random", 488 "//absl/numeric:int128", 489 "@com_google_googletest//:gtest", 490 "@com_google_googletest//:gtest_main", 491 ], 492) 493 494cc_test( 495 name = "examples_test", 496 size = "small", 497 srcs = ["examples_test.cc"], 498 copts = ABSL_TEST_COPTS, 499 linkopts = ABSL_DEFAULT_LINKOPTS, 500 tags = [ 501 "no_test_wasm", 502 ], 503 deps = [ 504 ":random", 505 "@com_google_googletest//:gtest", 506 "@com_google_googletest//:gtest_main", 507 ], 508) 509 510cc_test( 511 name = "seed_sequences_test", 512 size = "small", 513 srcs = ["seed_sequences_test.cc"], 514 copts = ABSL_TEST_COPTS, 515 linkopts = ABSL_DEFAULT_LINKOPTS, 516 deps = [ 517 ":random", 518 ":seed_sequences", 519 "//absl/random/internal:nonsecure_base", 520 "@com_google_googletest//:gtest", 521 "@com_google_googletest//:gtest_main", 522 ], 523) 524 525# Benchmarks for various methods / test utilities 526cc_binary( 527 name = "benchmarks", 528 testonly = True, 529 srcs = [ 530 "benchmarks.cc", 531 ], 532 copts = ABSL_TEST_COPTS, 533 linkopts = ABSL_DEFAULT_LINKOPTS, 534 tags = ["benchmark"], 535 deps = [ 536 ":distributions", 537 ":random", 538 ":seed_sequences", 539 "//absl/base:core_headers", 540 "//absl/meta:type_traits", 541 "//absl/random/internal:fast_uniform_bits", 542 "//absl/random/internal:randen_engine", 543 "@com_github_google_benchmark//:benchmark_main", 544 ], 545) 546