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 srcs = ["exponential_distribution_test.cc"], 310 copts = ABSL_TEST_COPTS, 311 linkopts = ABSL_DEFAULT_LINKOPTS, 312 deps = [ 313 ":distributions", 314 ":random", 315 "//absl/base:core_headers", 316 "//absl/base:raw_logging_internal", 317 "//absl/numeric:representation", 318 "//absl/random/internal:distribution_test_util", 319 "//absl/random/internal:pcg_engine", 320 "//absl/random/internal:sequence_urbg", 321 "//absl/strings", 322 "//absl/strings:str_format", 323 "@com_google_googletest//:gtest_main", 324 ], 325) 326 327cc_test( 328 name = "gaussian_distribution_test", 329 size = "small", 330 timeout = "eternal", # Android can take a very long time 331 srcs = [ 332 "gaussian_distribution_test.cc", 333 ], 334 copts = ABSL_TEST_COPTS, 335 linkopts = ABSL_DEFAULT_LINKOPTS, 336 deps = [ 337 ":distributions", 338 ":random", 339 "//absl/base:core_headers", 340 "//absl/base:raw_logging_internal", 341 "//absl/numeric:representation", 342 "//absl/random/internal:distribution_test_util", 343 "//absl/random/internal:sequence_urbg", 344 "//absl/strings", 345 "//absl/strings:str_format", 346 "@com_google_googletest//:gtest_main", 347 ], 348) 349 350cc_test( 351 name = "uniform_int_distribution_test", 352 size = "medium", 353 timeout = "long", 354 srcs = [ 355 "uniform_int_distribution_test.cc", 356 ], 357 copts = ABSL_TEST_COPTS, 358 linkopts = ABSL_DEFAULT_LINKOPTS, 359 deps = [ 360 ":distributions", 361 ":random", 362 "//absl/base:raw_logging_internal", 363 "//absl/random/internal:distribution_test_util", 364 "//absl/random/internal:pcg_engine", 365 "//absl/random/internal:sequence_urbg", 366 "//absl/strings", 367 "@com_google_googletest//:gtest_main", 368 ], 369) 370 371cc_test( 372 name = "uniform_real_distribution_test", 373 size = "medium", 374 srcs = [ 375 "uniform_real_distribution_test.cc", 376 ], 377 copts = ABSL_TEST_COPTS, 378 linkopts = ABSL_DEFAULT_LINKOPTS, 379 tags = [ 380 "no_test_android_arm", 381 "no_test_android_arm64", 382 "no_test_android_x86", 383 ], 384 deps = [ 385 ":distributions", 386 ":random", 387 "//absl/base:raw_logging_internal", 388 "//absl/numeric:representation", 389 "//absl/random/internal:distribution_test_util", 390 "//absl/random/internal:pcg_engine", 391 "//absl/random/internal:sequence_urbg", 392 "//absl/strings", 393 "@com_google_googletest//:gtest_main", 394 ], 395) 396 397cc_test( 398 name = "zipf_distribution_test", 399 size = "medium", 400 srcs = [ 401 "zipf_distribution_test.cc", 402 ], 403 copts = ABSL_TEST_COPTS, 404 linkopts = ABSL_DEFAULT_LINKOPTS, 405 deps = [ 406 ":distributions", 407 ":random", 408 "//absl/base:raw_logging_internal", 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_main", 414 ], 415) 416 417cc_test( 418 name = "bit_gen_ref_test", 419 size = "small", 420 srcs = ["bit_gen_ref_test.cc"], 421 copts = ABSL_TEST_COPTS, 422 linkopts = ABSL_DEFAULT_LINKOPTS, 423 deps = [ 424 ":bit_gen_ref", 425 ":random", 426 "//absl/base:fast_type_id", 427 "//absl/random/internal:sequence_urbg", 428 "@com_google_googletest//:gtest_main", 429 ], 430) 431 432cc_test( 433 name = "mocking_bit_gen_test", 434 size = "small", 435 srcs = ["mocking_bit_gen_test.cc"], 436 copts = ABSL_TEST_COPTS, 437 linkopts = ABSL_DEFAULT_LINKOPTS, 438 tags = [ 439 "no_test_wasm", 440 ], 441 deps = [ 442 ":bit_gen_ref", 443 ":mock_distributions", 444 ":mocking_bit_gen", 445 ":random", 446 "@com_google_googletest//:gtest_main", 447 ], 448) 449 450cc_test( 451 name = "mock_distributions_test", 452 size = "small", 453 srcs = ["mock_distributions_test.cc"], 454 copts = ABSL_TEST_COPTS, 455 linkopts = ABSL_DEFAULT_LINKOPTS, 456 tags = [ 457 "no_test_wasm", 458 ], 459 deps = [ 460 ":mock_distributions", 461 ":mocking_bit_gen", 462 ":random", 463 "@com_google_googletest//:gtest_main", 464 ], 465) 466 467cc_test( 468 name = "examples_test", 469 size = "small", 470 srcs = ["examples_test.cc"], 471 copts = ABSL_TEST_COPTS, 472 linkopts = ABSL_DEFAULT_LINKOPTS, 473 tags = [ 474 "no_test_wasm", 475 ], 476 deps = [ 477 ":random", 478 "@com_google_googletest//:gtest_main", 479 ], 480) 481 482cc_test( 483 name = "seed_sequences_test", 484 size = "small", 485 srcs = ["seed_sequences_test.cc"], 486 copts = ABSL_TEST_COPTS, 487 linkopts = ABSL_DEFAULT_LINKOPTS, 488 deps = [ 489 ":random", 490 ":seed_sequences", 491 "//absl/random/internal:nonsecure_base", 492 "@com_google_googletest//:gtest_main", 493 ], 494) 495 496BENCHMARK_TAGS = [ 497 "benchmark", 498 "no_test_android_arm", 499 "no_test_android_arm64", 500 "no_test_android_x86", 501 "no_test_darwin_x86_64", 502 "no_test_ios_x86_64", 503 "no_test_loonix", 504 "no_test_msvc_x64", 505 "no_test_wasm", 506] 507 508# Benchmarks for various methods / test utilities 509cc_binary( 510 name = "benchmarks", 511 testonly = 1, 512 srcs = [ 513 "benchmarks.cc", 514 ], 515 copts = ABSL_TEST_COPTS, 516 linkopts = ABSL_DEFAULT_LINKOPTS, 517 tags = BENCHMARK_TAGS, 518 deps = [ 519 ":distributions", 520 ":random", 521 ":seed_sequences", 522 "//absl/base:core_headers", 523 "//absl/meta:type_traits", 524 "//absl/random/internal:fast_uniform_bits", 525 "//absl/random/internal:randen_engine", 526 "@com_github_google_benchmark//:benchmark_main", 527 ], 528) 529