grpc 1.43.1 → 1.44.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +84 -64
- data/include/grpc/grpc_security.h +10 -0
- data/include/grpc/impl/codegen/compression_types.h +0 -2
- data/include/grpc/impl/codegen/grpc_types.h +6 -0
- data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
- data/src/core/ext/filters/client_channel/client_channel.h +8 -8
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
- data/src/core/ext/filters/client_channel/config_selector.h +4 -4
- data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
- data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
- data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
- data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
- data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
- data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
- data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
- data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
- data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
- data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
- data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
- data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
- data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
- data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
- data/src/core/ext/filters/client_channel/subchannel.h +2 -3
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
- data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
- data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
- data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
- data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
- data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
- data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
- data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
- data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
- data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
- data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
- data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
- data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
- data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
- data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
- data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
- data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
- data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
- data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
- data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
- data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
- data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
- data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
- data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
- data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
- data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
- data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
- data/src/core/ext/xds/upb_utils.h +65 -0
- data/src/core/ext/xds/xds_api.cc +81 -3458
- data/src/core/ext/xds/xds_api.h +56 -611
- data/src/core/ext/xds/xds_bootstrap.cc +189 -125
- data/src/core/ext/xds/xds_bootstrap.h +20 -15
- data/src/core/ext/xds/xds_certificate_provider.h +1 -0
- data/src/core/ext/xds/xds_channel_creds.cc +108 -0
- data/src/core/ext/xds/xds_channel_creds.h +50 -0
- data/src/core/ext/xds/xds_client.cc +584 -994
- data/src/core/ext/xds/xds_client.h +78 -135
- data/src/core/ext/xds/xds_cluster.cc +451 -0
- data/src/core/ext/xds/xds_cluster.h +111 -0
- data/src/core/ext/xds/xds_common_types.cc +388 -0
- data/src/core/ext/xds/xds_common_types.h +110 -0
- data/src/core/ext/xds/xds_endpoint.cc +364 -0
- data/src/core/ext/xds/xds_endpoint.h +135 -0
- data/src/core/ext/xds/xds_http_filters.cc +5 -0
- data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
- data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
- data/src/core/ext/xds/xds_listener.cc +1036 -0
- data/src/core/ext/xds/xds_listener.h +220 -0
- data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
- data/src/core/ext/xds/xds_resource_type.h +98 -0
- data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
- data/src/core/ext/xds/xds_route_config.cc +993 -0
- data/src/core/ext/xds/xds_route_config.h +215 -0
- data/src/core/ext/xds/xds_routing.cc +11 -8
- data/src/core/ext/xds/xds_routing.h +8 -5
- data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
- data/src/core/lib/address_utils/parse_address.cc +20 -0
- data/src/core/lib/address_utils/parse_address.h +5 -0
- data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
- data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
- data/src/core/lib/backoff/backoff.cc +4 -30
- data/src/core/lib/backoff/backoff.h +3 -3
- data/src/core/lib/channel/channel_args.cc +0 -1
- data/src/core/lib/channel/channel_stack.cc +8 -0
- data/src/core/lib/channel/channel_stack.h +1 -1
- data/src/core/lib/channel/channel_stack_builder.cc +5 -9
- data/src/core/lib/channel/channel_stack_builder.h +4 -7
- data/src/core/lib/channel/channelz.cc +1 -0
- data/src/core/lib/compression/compression.cc +19 -111
- data/src/core/lib/compression/compression_internal.cc +142 -202
- data/src/core/lib/compression/compression_internal.h +64 -69
- data/src/core/lib/compression/message_compress.cc +11 -11
- data/src/core/lib/compression/message_compress.h +2 -2
- data/src/core/lib/gpr/useful.h +4 -0
- data/src/core/lib/gprpp/bitset.h +7 -0
- data/src/core/lib/gprpp/chunked_vector.h +45 -3
- data/src/core/lib/gprpp/status_helper.cc +20 -28
- data/src/core/lib/gprpp/status_helper.h +6 -19
- data/src/core/lib/gprpp/table.h +11 -0
- data/src/core/lib/http/httpcli.cc +37 -46
- data/src/core/lib/http/httpcli.h +3 -15
- data/src/core/lib/iomgr/call_combiner.cc +15 -4
- data/src/core/lib/iomgr/closure.h +29 -9
- data/src/core/lib/iomgr/combiner.cc +25 -3
- data/src/core/lib/iomgr/error.cc +2 -0
- data/src/core/lib/iomgr/error.h +3 -0
- data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
- data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
- data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
- data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
- data/src/core/lib/iomgr/exec_ctx.cc +22 -9
- data/src/core/lib/iomgr/executor.cc +10 -1
- data/src/core/lib/iomgr/fork_posix.cc +3 -2
- data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
- data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
- data/src/core/lib/iomgr/port.h +2 -2
- data/src/core/lib/iomgr/resolve_address.cc +5 -24
- data/src/core/lib/iomgr/resolve_address.h +47 -44
- data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
- data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
- data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
- data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
- data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
- data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
- data/src/core/lib/iomgr/resolved_address.h +39 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
- data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
- data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
- data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
- data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
- data/src/core/lib/matchers/matchers.cc +1 -1
- data/src/core/lib/promise/activity.h +49 -20
- data/src/core/lib/promise/detail/status.h +5 -0
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
- data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
- data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
- data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
- data/src/core/lib/resource_quota/api.h +0 -1
- data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
- data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
- data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
- data/src/core/lib/security/authorization/evaluate_args.h +1 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
- data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
- data/src/core/lib/security/authorization/matchers.cc +227 -0
- data/src/core/lib/security/authorization/matchers.h +211 -0
- data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
- data/src/core/lib/security/authorization/rbac_policy.h +170 -0
- data/src/core/lib/security/context/security_context.cc +4 -2
- data/src/core/lib/security/context/security_context.h +1 -1
- data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
- data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
- data/src/core/lib/security/credentials/credentials.h +10 -20
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
- data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
- data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
- data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
- data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
- data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
- data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
- data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
- data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
- data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
- data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
- data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
- data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
- data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
- data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
- data/src/core/lib/security/security_connector/security_connector.cc +0 -4
- data/src/core/lib/security/security_connector/security_connector.h +5 -1
- data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
- data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
- data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
- data/src/core/lib/security/transport/auth_filters.h +7 -0
- data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
- data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
- data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
- data/src/core/{ext → lib}/service_config/service_config.h +4 -4
- data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
- data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
- data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
- data/src/core/lib/slice/slice.cc +3 -1
- data/src/core/lib/slice/slice.h +43 -13
- data/src/core/lib/slice/slice_intern.cc +3 -101
- data/src/core/lib/slice/slice_internal.h +1 -2
- data/src/core/lib/slice/slice_refcount.h +4 -13
- data/src/core/lib/slice/slice_refcount_base.h +0 -16
- data/src/core/lib/surface/call.cc +140 -382
- data/src/core/lib/surface/call.h +4 -4
- data/src/core/lib/surface/channel.cc +42 -44
- data/src/core/lib/surface/channel.h +4 -4
- data/src/core/lib/surface/init.cc +0 -2
- data/src/core/lib/surface/lame_client.cc +0 -1
- data/src/core/lib/surface/server.cc +12 -29
- data/src/core/lib/surface/server.h +2 -2
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/error_utils.h +14 -0
- data/src/core/lib/transport/metadata_batch.h +799 -717
- data/src/core/lib/transport/parsed_metadata.cc +2 -0
- data/src/core/lib/transport/parsed_metadata.h +95 -92
- data/src/core/lib/transport/timeout_encoding.cc +200 -66
- data/src/core/lib/transport/timeout_encoding.h +40 -10
- data/src/core/lib/transport/transport.h +1 -1
- data/src/core/lib/transport/transport_op_string.cc +6 -39
- data/src/core/lib/uri/uri_parser.cc +223 -53
- data/src/core/lib/uri/uri_parser.h +36 -23
- data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
- data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
- data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
- data/src/core/tsi/ssl_transport_security.cc +53 -13
- data/src/core/tsi/ssl_transport_security.h +18 -6
- data/src/ruby/ext/grpc/extconf.rb +10 -3
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
- data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
- data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
- data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
- data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
- data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
- data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
- data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
- data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
- data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
- data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
- data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
- data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
- data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
- data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
- data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
- data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
- data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
- data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
- data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
- data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
- data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
- data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
- data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
- data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
- data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
- data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
- data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
- data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
- data/third_party/abseil-cpp/absl/random/random.h +189 -0
- data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
- data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
- data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
- data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
- data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
- data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
- data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
- data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
- data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
- data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
- data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
- data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
- data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
- data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
- data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
- data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
- data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
- data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
- data/third_party/xxhash/xxhash.h +607 -352
- metadata +149 -77
- data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
- data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
- data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
- data/src/core/lib/compression/algorithm_metadata.h +0 -62
- data/src/core/lib/compression/compression_args.cc +0 -140
- data/src/core/lib/compression/compression_args.h +0 -58
- data/src/core/lib/compression/stream_compression.cc +0 -81
- data/src/core/lib/compression/stream_compression.h +0 -117
- data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
- data/src/core/lib/compression/stream_compression_gzip.h +0 -28
- data/src/core/lib/compression/stream_compression_identity.cc +0 -91
- data/src/core/lib/compression/stream_compression_identity.h +0 -29
- data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
- data/src/core/lib/slice/static_slice.cc +0 -377
- data/src/core/lib/slice/static_slice.h +0 -300
- data/src/core/lib/transport/metadata.cc +0 -714
- data/src/core/lib/transport/metadata.h +0 -449
- data/src/core/lib/transport/metadata_batch.cc +0 -99
- data/src/core/lib/transport/static_metadata.cc +0 -1032
- data/src/core/lib/transport/static_metadata.h +0 -322
- data/src/core/lib/transport/status_metadata.cc +0 -63
- data/src/core/lib/transport/status_metadata.h +0 -48
@@ -0,0 +1,427 @@
|
|
1
|
+
// Copyright 2017 The Abseil Authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef ABSL_RANDOM_BETA_DISTRIBUTION_H_
|
16
|
+
#define ABSL_RANDOM_BETA_DISTRIBUTION_H_
|
17
|
+
|
18
|
+
#include <cassert>
|
19
|
+
#include <cmath>
|
20
|
+
#include <istream>
|
21
|
+
#include <limits>
|
22
|
+
#include <ostream>
|
23
|
+
#include <type_traits>
|
24
|
+
|
25
|
+
#include "absl/meta/type_traits.h"
|
26
|
+
#include "absl/random/internal/fast_uniform_bits.h"
|
27
|
+
#include "absl/random/internal/fastmath.h"
|
28
|
+
#include "absl/random/internal/generate_real.h"
|
29
|
+
#include "absl/random/internal/iostream_state_saver.h"
|
30
|
+
|
31
|
+
namespace absl {
|
32
|
+
ABSL_NAMESPACE_BEGIN
|
33
|
+
|
34
|
+
// absl::beta_distribution:
|
35
|
+
// Generate a floating-point variate conforming to a Beta distribution:
|
36
|
+
// pdf(x) \propto x^(alpha-1) * (1-x)^(beta-1),
|
37
|
+
// where the params alpha and beta are both strictly positive real values.
|
38
|
+
//
|
39
|
+
// The support is the open interval (0, 1), but the return value might be equal
|
40
|
+
// to 0 or 1, due to numerical errors when alpha and beta are very different.
|
41
|
+
//
|
42
|
+
// Usage note: One usage is that alpha and beta are counts of number of
|
43
|
+
// successes and failures. When the total number of trials are large, consider
|
44
|
+
// approximating a beta distribution with a Gaussian distribution with the same
|
45
|
+
// mean and variance. One could use the skewness, which depends only on the
|
46
|
+
// smaller of alpha and beta when the number of trials are sufficiently large,
|
47
|
+
// to quantify how far a beta distribution is from the normal distribution.
|
48
|
+
template <typename RealType = double>
|
49
|
+
class beta_distribution {
|
50
|
+
public:
|
51
|
+
using result_type = RealType;
|
52
|
+
|
53
|
+
class param_type {
|
54
|
+
public:
|
55
|
+
using distribution_type = beta_distribution;
|
56
|
+
|
57
|
+
explicit param_type(result_type alpha, result_type beta)
|
58
|
+
: alpha_(alpha), beta_(beta) {
|
59
|
+
assert(alpha >= 0);
|
60
|
+
assert(beta >= 0);
|
61
|
+
assert(alpha <= (std::numeric_limits<result_type>::max)());
|
62
|
+
assert(beta <= (std::numeric_limits<result_type>::max)());
|
63
|
+
if (alpha == 0 || beta == 0) {
|
64
|
+
method_ = DEGENERATE_SMALL;
|
65
|
+
x_ = (alpha >= beta) ? 1 : 0;
|
66
|
+
return;
|
67
|
+
}
|
68
|
+
// a_ = min(beta, alpha), b_ = max(beta, alpha).
|
69
|
+
if (beta < alpha) {
|
70
|
+
inverted_ = true;
|
71
|
+
a_ = beta;
|
72
|
+
b_ = alpha;
|
73
|
+
} else {
|
74
|
+
inverted_ = false;
|
75
|
+
a_ = alpha;
|
76
|
+
b_ = beta;
|
77
|
+
}
|
78
|
+
if (a_ <= 1 && b_ >= ThresholdForLargeA()) {
|
79
|
+
method_ = DEGENERATE_SMALL;
|
80
|
+
x_ = inverted_ ? result_type(1) : result_type(0);
|
81
|
+
return;
|
82
|
+
}
|
83
|
+
// For threshold values, see also:
|
84
|
+
// Evaluation of Beta Generation Algorithms, Ying-Chao Hung, et. al.
|
85
|
+
// February, 2009.
|
86
|
+
if ((b_ < 1.0 && a_ + b_ <= 1.2) || a_ <= ThresholdForSmallA()) {
|
87
|
+
// Choose Joehnk over Cheng when it's faster or when Cheng encounters
|
88
|
+
// numerical issues.
|
89
|
+
method_ = JOEHNK;
|
90
|
+
a_ = result_type(1) / alpha_;
|
91
|
+
b_ = result_type(1) / beta_;
|
92
|
+
if (std::isinf(a_) || std::isinf(b_)) {
|
93
|
+
method_ = DEGENERATE_SMALL;
|
94
|
+
x_ = inverted_ ? result_type(1) : result_type(0);
|
95
|
+
}
|
96
|
+
return;
|
97
|
+
}
|
98
|
+
if (a_ >= ThresholdForLargeA()) {
|
99
|
+
method_ = DEGENERATE_LARGE;
|
100
|
+
// Note: on PPC for long double, evaluating
|
101
|
+
// `std::numeric_limits::max() / ThresholdForLargeA` results in NaN.
|
102
|
+
result_type r = a_ / b_;
|
103
|
+
x_ = (inverted_ ? result_type(1) : r) / (1 + r);
|
104
|
+
return;
|
105
|
+
}
|
106
|
+
x_ = a_ + b_;
|
107
|
+
log_x_ = std::log(x_);
|
108
|
+
if (a_ <= 1) {
|
109
|
+
method_ = CHENG_BA;
|
110
|
+
y_ = result_type(1) / a_;
|
111
|
+
gamma_ = a_ + a_;
|
112
|
+
return;
|
113
|
+
}
|
114
|
+
method_ = CHENG_BB;
|
115
|
+
result_type r = (a_ - 1) / (b_ - 1);
|
116
|
+
y_ = std::sqrt((1 + r) / (b_ * r * 2 - r + 1));
|
117
|
+
gamma_ = a_ + result_type(1) / y_;
|
118
|
+
}
|
119
|
+
|
120
|
+
result_type alpha() const { return alpha_; }
|
121
|
+
result_type beta() const { return beta_; }
|
122
|
+
|
123
|
+
friend bool operator==(const param_type& a, const param_type& b) {
|
124
|
+
return a.alpha_ == b.alpha_ && a.beta_ == b.beta_;
|
125
|
+
}
|
126
|
+
|
127
|
+
friend bool operator!=(const param_type& a, const param_type& b) {
|
128
|
+
return !(a == b);
|
129
|
+
}
|
130
|
+
|
131
|
+
private:
|
132
|
+
friend class beta_distribution;
|
133
|
+
|
134
|
+
#ifdef _MSC_VER
|
135
|
+
// MSVC does not have constexpr implementations for std::log and std::exp
|
136
|
+
// so they are computed at runtime.
|
137
|
+
#define ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR
|
138
|
+
#else
|
139
|
+
#define ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR constexpr
|
140
|
+
#endif
|
141
|
+
|
142
|
+
// The threshold for whether std::exp(1/a) is finite.
|
143
|
+
// Note that this value is quite large, and a smaller a_ is NOT abnormal.
|
144
|
+
static ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR result_type
|
145
|
+
ThresholdForSmallA() {
|
146
|
+
return result_type(1) /
|
147
|
+
std::log((std::numeric_limits<result_type>::max)());
|
148
|
+
}
|
149
|
+
|
150
|
+
// The threshold for whether a * std::log(a) is finite.
|
151
|
+
static ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR result_type
|
152
|
+
ThresholdForLargeA() {
|
153
|
+
return std::exp(
|
154
|
+
std::log((std::numeric_limits<result_type>::max)()) -
|
155
|
+
std::log(std::log((std::numeric_limits<result_type>::max)())) -
|
156
|
+
ThresholdPadding());
|
157
|
+
}
|
158
|
+
|
159
|
+
#undef ABSL_RANDOM_INTERNAL_LOG_EXP_CONSTEXPR
|
160
|
+
|
161
|
+
// Pad the threshold for large A for long double on PPC. This is done via a
|
162
|
+
// template specialization below.
|
163
|
+
static constexpr result_type ThresholdPadding() { return 0; }
|
164
|
+
|
165
|
+
enum Method {
|
166
|
+
JOEHNK, // Uses algorithm Joehnk
|
167
|
+
CHENG_BA, // Uses algorithm BA in Cheng
|
168
|
+
CHENG_BB, // Uses algorithm BB in Cheng
|
169
|
+
|
170
|
+
// Note: See also:
|
171
|
+
// Hung et al. Evaluation of beta generation algorithms. Communications
|
172
|
+
// in Statistics-Simulation and Computation 38.4 (2009): 750-770.
|
173
|
+
// especially:
|
174
|
+
// Zechner, Heinz, and Ernst Stadlober. Generating beta variates via
|
175
|
+
// patchwork rejection. Computing 50.1 (1993): 1-18.
|
176
|
+
|
177
|
+
DEGENERATE_SMALL, // a_ is abnormally small.
|
178
|
+
DEGENERATE_LARGE, // a_ is abnormally large.
|
179
|
+
};
|
180
|
+
|
181
|
+
result_type alpha_;
|
182
|
+
result_type beta_;
|
183
|
+
|
184
|
+
result_type a_; // the smaller of {alpha, beta}, or 1.0/alpha_ in JOEHNK
|
185
|
+
result_type b_; // the larger of {alpha, beta}, or 1.0/beta_ in JOEHNK
|
186
|
+
result_type x_; // alpha + beta, or the result in degenerate cases
|
187
|
+
result_type log_x_; // log(x_)
|
188
|
+
result_type y_; // "beta" in Cheng
|
189
|
+
result_type gamma_; // "gamma" in Cheng
|
190
|
+
|
191
|
+
Method method_;
|
192
|
+
|
193
|
+
// Placing this last for optimal alignment.
|
194
|
+
// Whether alpha_ != a_, i.e. true iff alpha_ > beta_.
|
195
|
+
bool inverted_;
|
196
|
+
|
197
|
+
static_assert(std::is_floating_point<RealType>::value,
|
198
|
+
"Class-template absl::beta_distribution<> must be "
|
199
|
+
"parameterized using a floating-point type.");
|
200
|
+
};
|
201
|
+
|
202
|
+
beta_distribution() : beta_distribution(1) {}
|
203
|
+
|
204
|
+
explicit beta_distribution(result_type alpha, result_type beta = 1)
|
205
|
+
: param_(alpha, beta) {}
|
206
|
+
|
207
|
+
explicit beta_distribution(const param_type& p) : param_(p) {}
|
208
|
+
|
209
|
+
void reset() {}
|
210
|
+
|
211
|
+
// Generating functions
|
212
|
+
template <typename URBG>
|
213
|
+
result_type operator()(URBG& g) { // NOLINT(runtime/references)
|
214
|
+
return (*this)(g, param_);
|
215
|
+
}
|
216
|
+
|
217
|
+
template <typename URBG>
|
218
|
+
result_type operator()(URBG& g, // NOLINT(runtime/references)
|
219
|
+
const param_type& p);
|
220
|
+
|
221
|
+
param_type param() const { return param_; }
|
222
|
+
void param(const param_type& p) { param_ = p; }
|
223
|
+
|
224
|
+
result_type(min)() const { return 0; }
|
225
|
+
result_type(max)() const { return 1; }
|
226
|
+
|
227
|
+
result_type alpha() const { return param_.alpha(); }
|
228
|
+
result_type beta() const { return param_.beta(); }
|
229
|
+
|
230
|
+
friend bool operator==(const beta_distribution& a,
|
231
|
+
const beta_distribution& b) {
|
232
|
+
return a.param_ == b.param_;
|
233
|
+
}
|
234
|
+
friend bool operator!=(const beta_distribution& a,
|
235
|
+
const beta_distribution& b) {
|
236
|
+
return a.param_ != b.param_;
|
237
|
+
}
|
238
|
+
|
239
|
+
private:
|
240
|
+
template <typename URBG>
|
241
|
+
result_type AlgorithmJoehnk(URBG& g, // NOLINT(runtime/references)
|
242
|
+
const param_type& p);
|
243
|
+
|
244
|
+
template <typename URBG>
|
245
|
+
result_type AlgorithmCheng(URBG& g, // NOLINT(runtime/references)
|
246
|
+
const param_type& p);
|
247
|
+
|
248
|
+
template <typename URBG>
|
249
|
+
result_type DegenerateCase(URBG& g, // NOLINT(runtime/references)
|
250
|
+
const param_type& p) {
|
251
|
+
if (p.method_ == param_type::DEGENERATE_SMALL && p.alpha_ == p.beta_) {
|
252
|
+
// Returns 0 or 1 with equal probability.
|
253
|
+
random_internal::FastUniformBits<uint8_t> fast_u8;
|
254
|
+
return static_cast<result_type>((fast_u8(g) & 0x10) !=
|
255
|
+
0); // pick any single bit.
|
256
|
+
}
|
257
|
+
return p.x_;
|
258
|
+
}
|
259
|
+
|
260
|
+
param_type param_;
|
261
|
+
random_internal::FastUniformBits<uint64_t> fast_u64_;
|
262
|
+
};
|
263
|
+
|
264
|
+
#if defined(__powerpc64__) || defined(__PPC64__) || defined(__powerpc__) || \
|
265
|
+
defined(__ppc__) || defined(__PPC__)
|
266
|
+
// PPC needs a more stringent boundary for long double.
|
267
|
+
template <>
|
268
|
+
constexpr long double
|
269
|
+
beta_distribution<long double>::param_type::ThresholdPadding() {
|
270
|
+
return 10;
|
271
|
+
}
|
272
|
+
#endif
|
273
|
+
|
274
|
+
template <typename RealType>
|
275
|
+
template <typename URBG>
|
276
|
+
typename beta_distribution<RealType>::result_type
|
277
|
+
beta_distribution<RealType>::AlgorithmJoehnk(
|
278
|
+
URBG& g, // NOLINT(runtime/references)
|
279
|
+
const param_type& p) {
|
280
|
+
using random_internal::GeneratePositiveTag;
|
281
|
+
using random_internal::GenerateRealFromBits;
|
282
|
+
using real_type =
|
283
|
+
absl::conditional_t<std::is_same<RealType, float>::value, float, double>;
|
284
|
+
|
285
|
+
// Based on Joehnk, M. D. Erzeugung von betaverteilten und gammaverteilten
|
286
|
+
// Zufallszahlen. Metrika 8.1 (1964): 5-15.
|
287
|
+
// This method is described in Knuth, Vol 2 (Third Edition), pp 134.
|
288
|
+
|
289
|
+
result_type u, v, x, y, z;
|
290
|
+
for (;;) {
|
291
|
+
u = GenerateRealFromBits<real_type, GeneratePositiveTag, false>(
|
292
|
+
fast_u64_(g));
|
293
|
+
v = GenerateRealFromBits<real_type, GeneratePositiveTag, false>(
|
294
|
+
fast_u64_(g));
|
295
|
+
|
296
|
+
// Direct method. std::pow is slow for float, so rely on the optimizer to
|
297
|
+
// remove the std::pow() path for that case.
|
298
|
+
if (!std::is_same<float, result_type>::value) {
|
299
|
+
x = std::pow(u, p.a_);
|
300
|
+
y = std::pow(v, p.b_);
|
301
|
+
z = x + y;
|
302
|
+
if (z > 1) {
|
303
|
+
// Reject if and only if `x + y > 1.0`
|
304
|
+
continue;
|
305
|
+
}
|
306
|
+
if (z > 0) {
|
307
|
+
// When both alpha and beta are small, x and y are both close to 0, so
|
308
|
+
// divide by (x+y) directly may result in nan.
|
309
|
+
return x / z;
|
310
|
+
}
|
311
|
+
}
|
312
|
+
|
313
|
+
// Log transform.
|
314
|
+
// x = log( pow(u, p.a_) ), y = log( pow(v, p.b_) )
|
315
|
+
// since u, v <= 1.0, x, y < 0.
|
316
|
+
x = std::log(u) * p.a_;
|
317
|
+
y = std::log(v) * p.b_;
|
318
|
+
if (!std::isfinite(x) || !std::isfinite(y)) {
|
319
|
+
continue;
|
320
|
+
}
|
321
|
+
// z = log( pow(u, a) + pow(v, b) )
|
322
|
+
z = x > y ? (x + std::log(1 + std::exp(y - x)))
|
323
|
+
: (y + std::log(1 + std::exp(x - y)));
|
324
|
+
// Reject iff log(x+y) > 0.
|
325
|
+
if (z > 0) {
|
326
|
+
continue;
|
327
|
+
}
|
328
|
+
return std::exp(x - z);
|
329
|
+
}
|
330
|
+
}
|
331
|
+
|
332
|
+
template <typename RealType>
|
333
|
+
template <typename URBG>
|
334
|
+
typename beta_distribution<RealType>::result_type
|
335
|
+
beta_distribution<RealType>::AlgorithmCheng(
|
336
|
+
URBG& g, // NOLINT(runtime/references)
|
337
|
+
const param_type& p) {
|
338
|
+
using random_internal::GeneratePositiveTag;
|
339
|
+
using random_internal::GenerateRealFromBits;
|
340
|
+
using real_type =
|
341
|
+
absl::conditional_t<std::is_same<RealType, float>::value, float, double>;
|
342
|
+
|
343
|
+
// Based on Cheng, Russell CH. Generating beta variates with nonintegral
|
344
|
+
// shape parameters. Communications of the ACM 21.4 (1978): 317-322.
|
345
|
+
// (https://dl.acm.org/citation.cfm?id=359482).
|
346
|
+
static constexpr result_type kLogFour =
|
347
|
+
result_type(1.3862943611198906188344642429163531361); // log(4)
|
348
|
+
static constexpr result_type kS =
|
349
|
+
result_type(2.6094379124341003746007593332261876); // 1+log(5)
|
350
|
+
|
351
|
+
const bool use_algorithm_ba = (p.method_ == param_type::CHENG_BA);
|
352
|
+
result_type u1, u2, v, w, z, r, s, t, bw_inv, lhs;
|
353
|
+
for (;;) {
|
354
|
+
u1 = GenerateRealFromBits<real_type, GeneratePositiveTag, false>(
|
355
|
+
fast_u64_(g));
|
356
|
+
u2 = GenerateRealFromBits<real_type, GeneratePositiveTag, false>(
|
357
|
+
fast_u64_(g));
|
358
|
+
v = p.y_ * std::log(u1 / (1 - u1));
|
359
|
+
w = p.a_ * std::exp(v);
|
360
|
+
bw_inv = result_type(1) / (p.b_ + w);
|
361
|
+
r = p.gamma_ * v - kLogFour;
|
362
|
+
s = p.a_ + r - w;
|
363
|
+
z = u1 * u1 * u2;
|
364
|
+
if (!use_algorithm_ba && s + kS >= 5 * z) {
|
365
|
+
break;
|
366
|
+
}
|
367
|
+
t = std::log(z);
|
368
|
+
if (!use_algorithm_ba && s >= t) {
|
369
|
+
break;
|
370
|
+
}
|
371
|
+
lhs = p.x_ * (p.log_x_ + std::log(bw_inv)) + r;
|
372
|
+
if (lhs >= t) {
|
373
|
+
break;
|
374
|
+
}
|
375
|
+
}
|
376
|
+
return p.inverted_ ? (1 - w * bw_inv) : w * bw_inv;
|
377
|
+
}
|
378
|
+
|
379
|
+
template <typename RealType>
|
380
|
+
template <typename URBG>
|
381
|
+
typename beta_distribution<RealType>::result_type
|
382
|
+
beta_distribution<RealType>::operator()(URBG& g, // NOLINT(runtime/references)
|
383
|
+
const param_type& p) {
|
384
|
+
switch (p.method_) {
|
385
|
+
case param_type::JOEHNK:
|
386
|
+
return AlgorithmJoehnk(g, p);
|
387
|
+
case param_type::CHENG_BA:
|
388
|
+
ABSL_FALLTHROUGH_INTENDED;
|
389
|
+
case param_type::CHENG_BB:
|
390
|
+
return AlgorithmCheng(g, p);
|
391
|
+
default:
|
392
|
+
return DegenerateCase(g, p);
|
393
|
+
}
|
394
|
+
}
|
395
|
+
|
396
|
+
template <typename CharT, typename Traits, typename RealType>
|
397
|
+
std::basic_ostream<CharT, Traits>& operator<<(
|
398
|
+
std::basic_ostream<CharT, Traits>& os, // NOLINT(runtime/references)
|
399
|
+
const beta_distribution<RealType>& x) {
|
400
|
+
auto saver = random_internal::make_ostream_state_saver(os);
|
401
|
+
os.precision(random_internal::stream_precision_helper<RealType>::kPrecision);
|
402
|
+
os << x.alpha() << os.fill() << x.beta();
|
403
|
+
return os;
|
404
|
+
}
|
405
|
+
|
406
|
+
template <typename CharT, typename Traits, typename RealType>
|
407
|
+
std::basic_istream<CharT, Traits>& operator>>(
|
408
|
+
std::basic_istream<CharT, Traits>& is, // NOLINT(runtime/references)
|
409
|
+
beta_distribution<RealType>& x) { // NOLINT(runtime/references)
|
410
|
+
using result_type = typename beta_distribution<RealType>::result_type;
|
411
|
+
using param_type = typename beta_distribution<RealType>::param_type;
|
412
|
+
result_type alpha, beta;
|
413
|
+
|
414
|
+
auto saver = random_internal::make_istream_state_saver(is);
|
415
|
+
alpha = random_internal::read_floating_point<result_type>(is);
|
416
|
+
if (is.fail()) return is;
|
417
|
+
beta = random_internal::read_floating_point<result_type>(is);
|
418
|
+
if (!is.fail()) {
|
419
|
+
x.param(param_type(alpha, beta));
|
420
|
+
}
|
421
|
+
return is;
|
422
|
+
}
|
423
|
+
|
424
|
+
ABSL_NAMESPACE_END
|
425
|
+
} // namespace absl
|
426
|
+
|
427
|
+
#endif // ABSL_RANDOM_BETA_DISTRIBUTION_H_
|
@@ -0,0 +1,98 @@
|
|
1
|
+
// Copyright 2017 The Abseil Authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// https://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include "absl/random/discrete_distribution.h"
|
16
|
+
|
17
|
+
namespace absl {
|
18
|
+
ABSL_NAMESPACE_BEGIN
|
19
|
+
namespace random_internal {
|
20
|
+
|
21
|
+
// Initializes the distribution table for Walker's Aliasing algorithm, described
|
22
|
+
// in Knuth, Vol 2. as well as in https://en.wikipedia.org/wiki/Alias_method
|
23
|
+
std::vector<std::pair<double, size_t>> InitDiscreteDistribution(
|
24
|
+
std::vector<double>* probabilities) {
|
25
|
+
// The empty-case should already be handled by the constructor.
|
26
|
+
assert(probabilities);
|
27
|
+
assert(!probabilities->empty());
|
28
|
+
|
29
|
+
// Step 1. Normalize the input probabilities to 1.0.
|
30
|
+
double sum = std::accumulate(std::begin(*probabilities),
|
31
|
+
std::end(*probabilities), 0.0);
|
32
|
+
if (std::fabs(sum - 1.0) > 1e-6) {
|
33
|
+
// Scale `probabilities` only when the sum is too far from 1.0. Scaling
|
34
|
+
// unconditionally will alter the probabilities slightly.
|
35
|
+
for (double& item : *probabilities) {
|
36
|
+
item = item / sum;
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
// Step 2. At this point `probabilities` is set to the conditional
|
41
|
+
// probabilities of each element which sum to 1.0, to within reasonable error.
|
42
|
+
// These values are used to construct the proportional probability tables for
|
43
|
+
// the selection phases of Walker's Aliasing algorithm.
|
44
|
+
//
|
45
|
+
// To construct the table, pick an element which is under-full (i.e., an
|
46
|
+
// element for which `(*probabilities)[i] < 1.0/n`), and pair it with an
|
47
|
+
// element which is over-full (i.e., an element for which
|
48
|
+
// `(*probabilities)[i] > 1.0/n`). The smaller value can always be retired.
|
49
|
+
// The larger may still be greater than 1.0/n, or may now be less than 1.0/n,
|
50
|
+
// and put back onto the appropriate collection.
|
51
|
+
const size_t n = probabilities->size();
|
52
|
+
std::vector<std::pair<double, size_t>> q;
|
53
|
+
q.reserve(n);
|
54
|
+
|
55
|
+
std::vector<size_t> over;
|
56
|
+
std::vector<size_t> under;
|
57
|
+
size_t idx = 0;
|
58
|
+
for (const double item : *probabilities) {
|
59
|
+
assert(item >= 0);
|
60
|
+
const double v = item * n;
|
61
|
+
q.emplace_back(v, 0);
|
62
|
+
if (v < 1.0) {
|
63
|
+
under.push_back(idx++);
|
64
|
+
} else {
|
65
|
+
over.push_back(idx++);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
while (!over.empty() && !under.empty()) {
|
69
|
+
auto lo = under.back();
|
70
|
+
under.pop_back();
|
71
|
+
auto hi = over.back();
|
72
|
+
over.pop_back();
|
73
|
+
|
74
|
+
q[lo].second = hi;
|
75
|
+
const double r = q[hi].first - (1.0 - q[lo].first);
|
76
|
+
q[hi].first = r;
|
77
|
+
if (r < 1.0) {
|
78
|
+
under.push_back(hi);
|
79
|
+
} else {
|
80
|
+
over.push_back(hi);
|
81
|
+
}
|
82
|
+
}
|
83
|
+
|
84
|
+
// Due to rounding errors, there may be un-paired elements in either
|
85
|
+
// collection; these should all be values near 1.0. For these values, set `q`
|
86
|
+
// to 1.0 and set the alternate to the identity.
|
87
|
+
for (auto i : over) {
|
88
|
+
q[i] = {1.0, i};
|
89
|
+
}
|
90
|
+
for (auto i : under) {
|
91
|
+
q[i] = {1.0, i};
|
92
|
+
}
|
93
|
+
return q;
|
94
|
+
}
|
95
|
+
|
96
|
+
} // namespace random_internal
|
97
|
+
ABSL_NAMESPACE_END
|
98
|
+
} // namespace absl
|