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