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/random/internal:distribution_caller", 79 "//absl/random/internal:fast_uniform_bits", 80 "//absl/random/internal:fastmath", 81 "//absl/random/internal:generate_real", 82 "//absl/random/internal:iostream_state_saver", 83 "//absl/random/internal:traits", 84 "//absl/random/internal:uniform_helper", 85 "//absl/random/internal:wide_multiply", 86 "//absl/strings", 87 ], 88) 89 90cc_library( 91 name = "seed_gen_exception", 92 srcs = ["seed_gen_exception.cc"], 93 hdrs = ["seed_gen_exception.h"], 94 copts = ABSL_DEFAULT_COPTS, 95 linkopts = ABSL_DEFAULT_LINKOPTS, 96 deps = ["//absl/base:config"], 97) 98 99cc_library( 100 name = "seed_sequences", 101 srcs = ["seed_sequences.cc"], 102 hdrs = [ 103 "seed_sequences.h", 104 ], 105 copts = ABSL_DEFAULT_COPTS, 106 linkopts = ABSL_DEFAULT_LINKOPTS, 107 deps = [ 108 ":seed_gen_exception", 109 "//absl/base:config", 110 "//absl/base:nullability", 111 "//absl/random/internal:pool_urbg", 112 "//absl/random/internal:salted_seed_seq", 113 "//absl/random/internal:seed_material", 114 "//absl/strings:string_view", 115 "//absl/types:span", 116 ], 117) 118 119cc_library( 120 name = "bit_gen_ref", 121 hdrs = ["bit_gen_ref.h"], 122 copts = ABSL_DEFAULT_COPTS, 123 linkopts = ABSL_DEFAULT_LINKOPTS, 124 deps = [ 125 ":random", 126 "//absl/base:config", 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:fast_type_id", 160 "//absl/container:flat_hash_map", 161 "//absl/meta:type_traits", 162 "//absl/random/internal:mock_helpers", 163 "//absl/utility", 164 "@com_google_googletest//:gtest", 165 ], 166) 167 168cc_test( 169 name = "bernoulli_distribution_test", 170 size = "small", 171 timeout = "eternal", # Android can take a very long time 172 srcs = ["bernoulli_distribution_test.cc"], 173 copts = ABSL_TEST_COPTS, 174 linkopts = ABSL_DEFAULT_LINKOPTS, 175 deps = [ 176 ":distributions", 177 ":random", 178 "//absl/random/internal:pcg_engine", 179 "//absl/random/internal:sequence_urbg", 180 "@com_google_googletest//:gtest", 181 "@com_google_googletest//:gtest_main", 182 ], 183) 184 185cc_test( 186 name = "beta_distribution_test", 187 size = "small", 188 timeout = "eternal", # Android can take a very long time 189 srcs = ["beta_distribution_test.cc"], 190 copts = ABSL_TEST_COPTS, 191 flaky = 1, 192 linkopts = ABSL_DEFAULT_LINKOPTS, 193 tags = [ 194 "no_test_wasm", 195 ], 196 deps = [ 197 ":distributions", 198 ":random", 199 "//absl/log", 200 "//absl/numeric:representation", 201 "//absl/random/internal:distribution_test_util", 202 "//absl/random/internal:pcg_engine", 203 "//absl/random/internal:sequence_urbg", 204 "//absl/strings", 205 "//absl/strings:str_format", 206 "@com_google_googletest//:gtest", 207 "@com_google_googletest//:gtest_main", 208 ], 209) 210 211cc_test( 212 name = "distributions_test", 213 size = "small", 214 timeout = "moderate", 215 srcs = [ 216 "distributions_test.cc", 217 ], 218 copts = ABSL_TEST_COPTS, 219 linkopts = ABSL_DEFAULT_LINKOPTS, 220 deps = [ 221 ":distributions", 222 ":random", 223 "//absl/meta:type_traits", 224 "//absl/numeric:int128", 225 "//absl/random/internal:distribution_test_util", 226 "@com_google_googletest//:gtest", 227 "@com_google_googletest//:gtest_main", 228 ], 229) 230 231cc_test( 232 name = "generators_test", 233 size = "small", 234 srcs = ["generators_test.cc"], 235 copts = ABSL_TEST_COPTS, 236 linkopts = ABSL_DEFAULT_LINKOPTS, 237 deps = [ 238 ":distributions", 239 ":random", 240 "@com_google_googletest//:gtest", 241 "@com_google_googletest//:gtest_main", 242 ], 243) 244 245cc_test( 246 name = "log_uniform_int_distribution_test", 247 size = "medium", 248 srcs = [ 249 "log_uniform_int_distribution_test.cc", 250 ], 251 copts = ABSL_TEST_COPTS, 252 linkopts = ABSL_DEFAULT_LINKOPTS, 253 tags = [ 254 "no_test_wasm", # Does not converge on WASM. 255 ], 256 deps = [ 257 ":distributions", 258 ":random", 259 "//absl/log", 260 "//absl/random/internal:distribution_test_util", 261 "//absl/random/internal:pcg_engine", 262 "//absl/random/internal:sequence_urbg", 263 "//absl/strings", 264 "//absl/strings:str_format", 265 "@com_google_googletest//:gtest", 266 "@com_google_googletest//:gtest_main", 267 ], 268) 269 270cc_test( 271 name = "discrete_distribution_test", 272 size = "medium", 273 srcs = [ 274 "discrete_distribution_test.cc", 275 ], 276 copts = ABSL_TEST_COPTS, 277 linkopts = ABSL_DEFAULT_LINKOPTS, 278 deps = [ 279 ":distributions", 280 ":random", 281 "//absl/log", 282 "//absl/random/internal:distribution_test_util", 283 "//absl/random/internal:pcg_engine", 284 "//absl/random/internal:sequence_urbg", 285 "//absl/strings", 286 "@com_google_googletest//:gtest", 287 "@com_google_googletest//:gtest_main", 288 ], 289) 290 291cc_test( 292 name = "poisson_distribution_test", 293 size = "small", 294 timeout = "eternal", # Android can take a very long time 295 srcs = [ 296 "poisson_distribution_test.cc", 297 ], 298 copts = ABSL_TEST_COPTS, 299 linkopts = ABSL_DEFAULT_LINKOPTS, 300 tags = [ 301 # Too Slow. 302 "no_test_android_arm", 303 "no_test_loonix", 304 ], 305 deps = [ 306 ":distributions", 307 ":random", 308 "//absl/base:core_headers", 309 "//absl/container:flat_hash_map", 310 "//absl/log", 311 "//absl/random/internal:distribution_test_util", 312 "//absl/random/internal:pcg_engine", 313 "//absl/random/internal:sequence_urbg", 314 "//absl/strings", 315 "//absl/strings:str_format", 316 "@com_google_googletest//:gtest", 317 "@com_google_googletest//:gtest_main", 318 ], 319) 320 321cc_test( 322 name = "exponential_distribution_test", 323 size = "small", 324 timeout = "moderate", 325 srcs = ["exponential_distribution_test.cc"], 326 copts = ABSL_TEST_COPTS, 327 linkopts = ABSL_DEFAULT_LINKOPTS, 328 deps = [ 329 ":distributions", 330 ":random", 331 "//absl/base:core_headers", 332 "//absl/log", 333 "//absl/numeric:representation", 334 "//absl/random/internal:distribution_test_util", 335 "//absl/random/internal:pcg_engine", 336 "//absl/random/internal:sequence_urbg", 337 "//absl/strings", 338 "//absl/strings:str_format", 339 "@com_google_googletest//:gtest", 340 "@com_google_googletest//:gtest_main", 341 ], 342) 343 344cc_test( 345 name = "gaussian_distribution_test", 346 size = "small", 347 timeout = "eternal", # Android can take a very long time 348 srcs = [ 349 "gaussian_distribution_test.cc", 350 ], 351 copts = ABSL_TEST_COPTS, 352 linkopts = ABSL_DEFAULT_LINKOPTS, 353 deps = [ 354 ":distributions", 355 ":random", 356 "//absl/base:core_headers", 357 "//absl/log", 358 "//absl/numeric:representation", 359 "//absl/random/internal:distribution_test_util", 360 "//absl/random/internal:sequence_urbg", 361 "//absl/strings", 362 "//absl/strings:str_format", 363 "@com_google_googletest//:gtest", 364 "@com_google_googletest//:gtest_main", 365 ], 366) 367 368cc_test( 369 name = "uniform_int_distribution_test", 370 size = "medium", 371 timeout = "long", 372 srcs = [ 373 "uniform_int_distribution_test.cc", 374 ], 375 copts = ABSL_TEST_COPTS, 376 linkopts = ABSL_DEFAULT_LINKOPTS, 377 deps = [ 378 ":distributions", 379 ":random", 380 "//absl/log", 381 "//absl/random/internal:distribution_test_util", 382 "//absl/random/internal:pcg_engine", 383 "//absl/random/internal:sequence_urbg", 384 "//absl/strings", 385 "@com_google_googletest//:gtest", 386 "@com_google_googletest//:gtest_main", 387 ], 388) 389 390cc_test( 391 name = "uniform_real_distribution_test", 392 size = "medium", 393 srcs = [ 394 "uniform_real_distribution_test.cc", 395 ], 396 copts = ABSL_TEST_COPTS, 397 linkopts = ABSL_DEFAULT_LINKOPTS, 398 tags = [ 399 "no_test_android_arm", 400 "no_test_android_arm64", 401 "no_test_android_x86", 402 ], 403 deps = [ 404 ":distributions", 405 ":random", 406 "//absl/log", 407 "//absl/numeric:representation", 408 "//absl/random/internal:distribution_test_util", 409 "//absl/random/internal:pcg_engine", 410 "//absl/random/internal:sequence_urbg", 411 "//absl/strings", 412 "@com_google_googletest//:gtest", 413 "@com_google_googletest//:gtest_main", 414 ], 415) 416 417cc_test( 418 name = "zipf_distribution_test", 419 size = "medium", 420 srcs = [ 421 "zipf_distribution_test.cc", 422 ], 423 copts = ABSL_TEST_COPTS, 424 linkopts = ABSL_DEFAULT_LINKOPTS, 425 deps = [ 426 ":distributions", 427 ":random", 428 "//absl/log", 429 "//absl/random/internal:distribution_test_util", 430 "//absl/random/internal:pcg_engine", 431 "//absl/random/internal:sequence_urbg", 432 "//absl/strings", 433 "@com_google_googletest//:gtest", 434 "@com_google_googletest//:gtest_main", 435 ], 436) 437 438cc_test( 439 name = "bit_gen_ref_test", 440 size = "small", 441 srcs = ["bit_gen_ref_test.cc"], 442 copts = ABSL_TEST_COPTS, 443 linkopts = ABSL_DEFAULT_LINKOPTS, 444 deps = [ 445 ":bit_gen_ref", 446 ":random", 447 "//absl/base:fast_type_id", 448 "//absl/random/internal:sequence_urbg", 449 "@com_google_googletest//:gtest", 450 "@com_google_googletest//:gtest_main", 451 ], 452) 453 454cc_test( 455 name = "mocking_bit_gen_test", 456 size = "small", 457 srcs = ["mocking_bit_gen_test.cc"], 458 copts = ABSL_TEST_COPTS, 459 linkopts = ABSL_DEFAULT_LINKOPTS, 460 tags = [ 461 "no_test_wasm", 462 ], 463 deps = [ 464 ":bit_gen_ref", 465 ":mock_distributions", 466 ":mocking_bit_gen", 467 ":random", 468 "@com_google_googletest//:gtest", 469 "@com_google_googletest//:gtest_main", 470 ], 471) 472 473cc_test( 474 name = "mock_distributions_test", 475 size = "small", 476 timeout = "moderate", 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