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(default_visibility = ["//visibility:public"]) 27 28licenses(["notice"]) 29 30cc_library( 31 name = "random", 32 hdrs = ["random.h"], 33 copts = ABSL_DEFAULT_COPTS, 34 linkopts = ABSL_DEFAULT_LINKOPTS, 35 deps = [ 36 ":distributions", 37 ":seed_sequences", 38 "//absl/random/internal:nonsecure_base", 39 "//absl/random/internal:pcg_engine", 40 "//absl/random/internal:pool_urbg", 41 "//absl/random/internal:randen_engine", 42 ], 43) 44 45cc_library( 46 name = "distributions", 47 srcs = [ 48 "discrete_distribution.cc", 49 "gaussian_distribution.cc", 50 ], 51 hdrs = [ 52 "bernoulli_distribution.h", 53 "beta_distribution.h", 54 "discrete_distribution.h", 55 "distributions.h", 56 "exponential_distribution.h", 57 "gaussian_distribution.h", 58 "log_uniform_int_distribution.h", 59 "poisson_distribution.h", 60 "uniform_int_distribution.h", 61 "uniform_real_distribution.h", 62 "zipf_distribution.h", 63 ], 64 copts = ABSL_DEFAULT_COPTS, 65 linkopts = ABSL_DEFAULT_LINKOPTS, 66 deps = [ 67 "//absl/base:base_internal", 68 "//absl/base:config", 69 "//absl/base:core_headers", 70 "//absl/meta:type_traits", 71 "//absl/numeric:bits", 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/base:config", 104 "//absl/random/internal:pool_urbg", 105 "//absl/random/internal:salted_seed_seq", 106 "//absl/random/internal:seed_material", 107 "//absl/types:span", 108 ], 109) 110 111cc_library( 112 name = "bit_gen_ref", 113 hdrs = ["bit_gen_ref.h"], 114 copts = ABSL_DEFAULT_COPTS, 115 linkopts = ABSL_DEFAULT_LINKOPTS, 116 deps = [ 117 ":random", 118 "//absl/base:core_headers", 119 "//absl/base:fast_type_id", 120 "//absl/meta:type_traits", 121 "//absl/random/internal:distribution_caller", 122 "//absl/random/internal:fast_uniform_bits", 123 ], 124) 125 126cc_library( 127 name = "mock_distributions", 128 testonly = 1, 129 hdrs = ["mock_distributions.h"], 130 linkopts = ABSL_DEFAULT_LINKOPTS, 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 tags = [ 187 "no_test_wasm", 188 ], 189 deps = [ 190 ":distributions", 191 ":random", 192 "//absl/base:raw_logging_internal", 193 "//absl/numeric:representation", 194 "//absl/random/internal:distribution_test_util", 195 "//absl/random/internal:pcg_engine", 196 "//absl/random/internal:sequence_urbg", 197 "//absl/strings", 198 "//absl/strings:str_format", 199 "@com_google_googletest//:gtest_main", 200 ], 201) 202 203cc_test( 204 name = "distributions_test", 205 size = "small", 206 timeout = "moderate", 207 srcs = [ 208 "distributions_test.cc", 209 ], 210 copts = ABSL_TEST_COPTS, 211 linkopts = ABSL_DEFAULT_LINKOPTS, 212 deps = [ 213 ":distributions", 214 ":random", 215 "//absl/random/internal:distribution_test_util", 216 "@com_google_googletest//:gtest_main", 217 ], 218) 219 220cc_test( 221 name = "generators_test", 222 size = "small", 223 srcs = ["generators_test.cc"], 224 copts = ABSL_TEST_COPTS, 225 linkopts = ABSL_DEFAULT_LINKOPTS, 226 deps = [ 227 ":distributions", 228 ":random", 229 "@com_google_googletest//:gtest_main", 230 ], 231) 232 233cc_test( 234 name = "log_uniform_int_distribution_test", 235 size = "medium", 236 srcs = [ 237 "log_uniform_int_distribution_test.cc", 238 ], 239 copts = ABSL_TEST_COPTS, 240 linkopts = ABSL_DEFAULT_LINKOPTS, 241 tags = [ 242 "no_test_wasm", # Does not converge on WASM. 243 ], 244 deps = [ 245 ":distributions", 246 ":random", 247 "//absl/base:raw_logging_internal", 248 "//absl/random/internal:distribution_test_util", 249 "//absl/random/internal:pcg_engine", 250 "//absl/random/internal:sequence_urbg", 251 "//absl/strings", 252 "//absl/strings:str_format", 253 "@com_google_googletest//:gtest_main", 254 ], 255) 256 257cc_test( 258 name = "discrete_distribution_test", 259 size = "medium", 260 srcs = [ 261 "discrete_distribution_test.cc", 262 ], 263 copts = ABSL_TEST_COPTS, 264 linkopts = ABSL_DEFAULT_LINKOPTS, 265 deps = [ 266 ":distributions", 267 ":random", 268 "//absl/base:raw_logging_internal", 269 "//absl/random/internal:distribution_test_util", 270 "//absl/random/internal:pcg_engine", 271 "//absl/random/internal:sequence_urbg", 272 "//absl/strings", 273 "@com_google_googletest//:gtest_main", 274 ], 275) 276 277cc_test( 278 name = "poisson_distribution_test", 279 size = "small", 280 timeout = "eternal", # Android can take a very long time 281 srcs = [ 282 "poisson_distribution_test.cc", 283 ], 284 copts = ABSL_TEST_COPTS, 285 linkopts = ABSL_DEFAULT_LINKOPTS, 286 tags = [ 287 # Too Slow. 288 "no_test_android_arm", 289 "no_test_loonix", 290 ], 291 deps = [ 292 ":distributions", 293 ":random", 294 "//absl/base:core_headers", 295 "//absl/base:raw_logging_internal", 296 "//absl/container:flat_hash_map", 297 "//absl/random/internal:distribution_test_util", 298 "//absl/random/internal:pcg_engine", 299 "//absl/random/internal:sequence_urbg", 300 "//absl/strings", 301 "//absl/strings:str_format", 302 "@com_google_googletest//:gtest_main", 303 ], 304) 305 306cc_test( 307 name = "exponential_distribution_test", 308 size = "small", 309 timeout = "moderate", 310 srcs = ["exponential_distribution_test.cc"], 311 copts = ABSL_TEST_COPTS, 312 linkopts = ABSL_DEFAULT_LINKOPTS, 313 deps = [ 314 ":distributions", 315 ":random", 316 "//absl/base:core_headers", 317 "//absl/base:raw_logging_internal", 318 "//absl/numeric:representation", 319 "//absl/random/internal:distribution_test_util", 320 "//absl/random/internal:pcg_engine", 321 "//absl/random/internal:sequence_urbg", 322 "//absl/strings", 323 "//absl/strings:str_format", 324 "@com_google_googletest//:gtest_main", 325 ], 326) 327 328cc_test( 329 name = "gaussian_distribution_test", 330 size = "small", 331 timeout = "eternal", # Android can take a very long time 332 srcs = [ 333 "gaussian_distribution_test.cc", 334 ], 335 copts = ABSL_TEST_COPTS, 336 linkopts = ABSL_DEFAULT_LINKOPTS, 337 deps = [ 338 ":distributions", 339 ":random", 340 "//absl/base:core_headers", 341 "//absl/base:raw_logging_internal", 342 "//absl/numeric:representation", 343 "//absl/random/internal:distribution_test_util", 344 "//absl/random/internal:sequence_urbg", 345 "//absl/strings", 346 "//absl/strings:str_format", 347 "@com_google_googletest//:gtest_main", 348 ], 349) 350 351cc_test( 352 name = "uniform_int_distribution_test", 353 size = "medium", 354 timeout = "long", 355 srcs = [ 356 "uniform_int_distribution_test.cc", 357 ], 358 copts = ABSL_TEST_COPTS, 359 linkopts = ABSL_DEFAULT_LINKOPTS, 360 deps = [ 361 ":distributions", 362 ":random", 363 "//absl/base:raw_logging_internal", 364 "//absl/random/internal:distribution_test_util", 365 "//absl/random/internal:pcg_engine", 366 "//absl/random/internal:sequence_urbg", 367 "//absl/strings", 368 "@com_google_googletest//:gtest_main", 369 ], 370) 371 372cc_test( 373 name = "uniform_real_distribution_test", 374 size = "medium", 375 srcs = [ 376 "uniform_real_distribution_test.cc", 377 ], 378 copts = ABSL_TEST_COPTS, 379 linkopts = ABSL_DEFAULT_LINKOPTS, 380 tags = [ 381 "no_test_android_arm", 382 "no_test_android_arm64", 383 "no_test_android_x86", 384 ], 385 deps = [ 386 ":distributions", 387 ":random", 388 "//absl/base:raw_logging_internal", 389 "//absl/numeric:representation", 390 "//absl/random/internal:distribution_test_util", 391 "//absl/random/internal:pcg_engine", 392 "//absl/random/internal:sequence_urbg", 393 "//absl/strings", 394 "@com_google_googletest//:gtest_main", 395 ], 396) 397 398cc_test( 399 name = "zipf_distribution_test", 400 size = "medium", 401 srcs = [ 402 "zipf_distribution_test.cc", 403 ], 404 copts = ABSL_TEST_COPTS, 405 linkopts = ABSL_DEFAULT_LINKOPTS, 406 deps = [ 407 ":distributions", 408 ":random", 409 "//absl/base:raw_logging_internal", 410 "//absl/random/internal:distribution_test_util", 411 "//absl/random/internal:pcg_engine", 412 "//absl/random/internal:sequence_urbg", 413 "//absl/strings", 414 "@com_google_googletest//:gtest_main", 415 ], 416) 417 418cc_test( 419 name = "bit_gen_ref_test", 420 size = "small", 421 srcs = ["bit_gen_ref_test.cc"], 422 copts = ABSL_TEST_COPTS, 423 linkopts = ABSL_DEFAULT_LINKOPTS, 424 deps = [ 425 ":bit_gen_ref", 426 ":random", 427 "//absl/base:fast_type_id", 428 "//absl/random/internal:sequence_urbg", 429 "@com_google_googletest//:gtest_main", 430 ], 431) 432 433cc_test( 434 name = "mocking_bit_gen_test", 435 size = "small", 436 srcs = ["mocking_bit_gen_test.cc"], 437 copts = ABSL_TEST_COPTS, 438 linkopts = ABSL_DEFAULT_LINKOPTS, 439 tags = [ 440 "no_test_wasm", 441 ], 442 deps = [ 443 ":bit_gen_ref", 444 ":mock_distributions", 445 ":mocking_bit_gen", 446 ":random", 447 "@com_google_googletest//:gtest_main", 448 ], 449) 450 451cc_test( 452 name = "mock_distributions_test", 453 size = "small", 454 srcs = ["mock_distributions_test.cc"], 455 copts = ABSL_TEST_COPTS, 456 linkopts = ABSL_DEFAULT_LINKOPTS, 457 tags = [ 458 "no_test_wasm", 459 ], 460 deps = [ 461 ":mock_distributions", 462 ":mocking_bit_gen", 463 ":random", 464 "@com_google_googletest//:gtest_main", 465 ], 466) 467 468cc_test( 469 name = "examples_test", 470 size = "small", 471 srcs = ["examples_test.cc"], 472 copts = ABSL_TEST_COPTS, 473 linkopts = ABSL_DEFAULT_LINKOPTS, 474 tags = [ 475 "no_test_wasm", 476 ], 477 deps = [ 478 ":random", 479 "@com_google_googletest//:gtest_main", 480 ], 481) 482 483cc_test( 484 name = "seed_sequences_test", 485 size = "small", 486 srcs = ["seed_sequences_test.cc"], 487 copts = ABSL_TEST_COPTS, 488 linkopts = ABSL_DEFAULT_LINKOPTS, 489 deps = [ 490 ":random", 491 ":seed_sequences", 492 "//absl/random/internal:nonsecure_base", 493 "@com_google_googletest//:gtest_main", 494 ], 495) 496 497BENCHMARK_TAGS = [ 498 "benchmark", 499 "no_test_android_arm", 500 "no_test_android_arm64", 501 "no_test_android_x86", 502 "no_test_darwin_x86_64", 503 "no_test_ios_x86_64", 504 "no_test_loonix", 505 "no_test_msvc_x64", 506 "no_test_wasm", 507] 508 509# Benchmarks for various methods / test utilities 510cc_binary( 511 name = "benchmarks", 512 testonly = 1, 513 srcs = [ 514 "benchmarks.cc", 515 ], 516 copts = ABSL_TEST_COPTS, 517 linkopts = ABSL_DEFAULT_LINKOPTS, 518 tags = BENCHMARK_TAGS, 519 deps = [ 520 ":distributions", 521 ":random", 522 ":seed_sequences", 523 "//absl/base:core_headers", 524 "//absl/meta:type_traits", 525 "//absl/random/internal:fast_uniform_bits", 526 "//absl/random/internal:randen_engine", 527 "@com_github_google_benchmark//:benchmark_main", 528 ], 529) 530