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.

Files changed (382) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +84 -64
  3. data/include/grpc/grpc_security.h +10 -0
  4. data/include/grpc/impl/codegen/compression_types.h +0 -2
  5. data/include/grpc/impl/codegen/grpc_types.h +6 -0
  6. data/src/core/ext/filters/client_channel/backend_metric.h +1 -1
  7. data/src/core/ext/filters/client_channel/client_channel.cc +62 -68
  8. data/src/core/ext/filters/client_channel/client_channel.h +8 -8
  9. data/src/core/ext/filters/client_channel/client_channel_plugin.cc +1 -1
  10. data/src/core/ext/filters/client_channel/config_selector.h +4 -4
  11. data/src/core/ext/filters/client_channel/dynamic_filters.h +1 -1
  12. data/src/core/ext/filters/client_channel/health/health_check_client.cc +16 -14
  13. data/src/core/ext/filters/client_channel/health/health_check_client.h +3 -3
  14. data/src/core/ext/filters/client_channel/http_connect_handshaker.cc +1 -1
  15. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.cc +4 -3
  16. data/src/core/ext/filters/client_channel/lb_policy/address_filtering.h +6 -5
  17. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +3 -7
  18. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +31 -32
  19. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +0 -7
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h +1 -1
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel.h +1 -1
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_channel_secure.cc +1 -1
  23. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +43 -29
  24. data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +6 -2
  25. data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +120 -68
  26. data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +60 -48
  27. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +62 -61
  28. data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +16 -11
  29. data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +11 -5
  30. data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +19 -15
  31. data/src/core/ext/filters/client_channel/lb_policy/xds/xds.h +1 -1
  32. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +14 -12
  33. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +3 -2
  34. data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +50 -105
  35. data/src/core/ext/filters/client_channel/lb_policy.cc +15 -14
  36. data/src/core/ext/filters/client_channel/lb_policy.h +19 -3
  37. data/src/core/ext/filters/client_channel/resolver/binder/binder_resolver.cc +3 -3
  38. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +207 -81
  39. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver.h +22 -12
  40. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +19 -15
  41. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_windows.cc +23 -38
  42. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +118 -207
  43. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +25 -32
  44. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper_windows.cc +1 -1
  45. data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +82 -73
  46. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.cc +10 -10
  47. data/src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h +2 -1
  48. data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +2 -5
  49. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +5 -5
  50. data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +157 -67
  51. data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +1 -1
  52. data/src/core/ext/filters/client_channel/resolver_result_parsing.h +2 -2
  53. data/src/core/ext/filters/client_channel/retry_filter.cc +37 -64
  54. data/src/core/ext/filters/client_channel/retry_service_config.cc +1 -1
  55. data/src/core/ext/filters/client_channel/retry_service_config.h +1 -1
  56. data/src/core/ext/filters/client_channel/service_config_channel_arg_filter.cc +1 -1
  57. data/src/core/ext/filters/client_channel/subchannel.cc +12 -16
  58. data/src/core/ext/filters/client_channel/subchannel.h +2 -3
  59. data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +37 -48
  60. data/src/core/ext/filters/fault_injection/service_config_parser.cc +6 -8
  61. data/src/core/ext/filters/fault_injection/service_config_parser.h +1 -1
  62. data/src/core/ext/filters/http/client/http_client_filter.cc +51 -122
  63. data/src/core/ext/filters/http/client_authority_filter.cc +8 -24
  64. data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +42 -140
  65. data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +5 -25
  66. data/src/core/ext/filters/http/server/http_server_filter.cc +50 -135
  67. data/src/core/ext/filters/message_size/message_size_filter.cc +1 -1
  68. data/src/core/ext/filters/message_size/message_size_filter.h +1 -1
  69. data/src/core/ext/filters/rbac/rbac_filter.cc +157 -0
  70. data/src/core/ext/filters/rbac/rbac_filter.h +74 -0
  71. data/src/core/ext/filters/rbac/rbac_service_config_parser.cc +605 -0
  72. data/src/core/ext/filters/rbac/rbac_service_config_parser.h +70 -0
  73. data/src/core/ext/filters/server_config_selector/server_config_selector.h +3 -2
  74. data/src/core/ext/filters/server_config_selector/server_config_selector_filter.cc +11 -6
  75. data/src/core/ext/transport/chttp2/client/insecure/channel_create.cc +1 -1
  76. data/src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc +1 -1
  77. data/src/core/ext/transport/chttp2/server/chttp2_server.cc +89 -29
  78. data/src/core/ext/transport/chttp2/transport/chttp2_plugin.cc +0 -1
  79. data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +45 -186
  80. data/src/core/ext/transport/chttp2/transport/frame_data.cc +0 -1
  81. data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +341 -279
  82. data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +69 -159
  83. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.cc +1 -1
  84. data/src/core/ext/transport/chttp2/transport/hpack_encoder_table.h +2 -0
  85. data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +19 -32
  86. data/src/core/ext/transport/chttp2/transport/hpack_parser.h +0 -1
  87. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +94 -1
  88. data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +2 -24
  89. data/src/core/ext/transport/chttp2/transport/internal.h +0 -33
  90. data/src/core/ext/transport/chttp2/transport/parsing.cc +0 -6
  91. data/src/core/ext/transport/chttp2/transport/writing.cc +47 -116
  92. data/src/core/ext/transport/inproc/inproc_plugin.cc +0 -4
  93. data/src/core/ext/transport/inproc/inproc_transport.cc +11 -63
  94. data/src/core/ext/transport/inproc/inproc_transport.h +0 -3
  95. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.c +61 -0
  96. data/src/core/ext/upb-generated/envoy/extensions/filters/http/rbac/v3/rbac.upb.h +146 -0
  97. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.c +188 -0
  98. data/src/core/ext/upbdefs-generated/envoy/config/rbac/v3/rbac.upbdefs.h +70 -0
  99. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.c +56 -0
  100. data/src/core/ext/upbdefs-generated/envoy/extensions/filters/http/rbac/v3/rbac.upbdefs.h +40 -0
  101. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.c +154 -0
  102. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/checked.upbdefs.h +95 -0
  103. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.c +58 -0
  104. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/eval.upbdefs.h +55 -0
  105. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.c +44 -0
  106. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/explain.upbdefs.h +40 -0
  107. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.c +153 -0
  108. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/syntax.upbdefs.h +100 -0
  109. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.c +75 -0
  110. data/src/core/ext/upbdefs-generated/google/api/expr/v1alpha1/value.upbdefs.h +55 -0
  111. data/src/core/ext/xds/upb_utils.h +65 -0
  112. data/src/core/ext/xds/xds_api.cc +81 -3458
  113. data/src/core/ext/xds/xds_api.h +56 -611
  114. data/src/core/ext/xds/xds_bootstrap.cc +189 -125
  115. data/src/core/ext/xds/xds_bootstrap.h +20 -15
  116. data/src/core/ext/xds/xds_certificate_provider.h +1 -0
  117. data/src/core/ext/xds/xds_channel_creds.cc +108 -0
  118. data/src/core/ext/xds/xds_channel_creds.h +50 -0
  119. data/src/core/ext/xds/xds_client.cc +584 -994
  120. data/src/core/ext/xds/xds_client.h +78 -135
  121. data/src/core/ext/xds/xds_cluster.cc +451 -0
  122. data/src/core/ext/xds/xds_cluster.h +111 -0
  123. data/src/core/ext/xds/xds_common_types.cc +388 -0
  124. data/src/core/ext/xds/xds_common_types.h +110 -0
  125. data/src/core/ext/xds/xds_endpoint.cc +364 -0
  126. data/src/core/ext/xds/xds_endpoint.h +135 -0
  127. data/src/core/ext/xds/xds_http_filters.cc +5 -0
  128. data/src/core/ext/xds/xds_http_rbac_filter.cc +563 -0
  129. data/src/core/ext/xds/xds_http_rbac_filter.h +54 -0
  130. data/src/core/ext/xds/xds_listener.cc +1036 -0
  131. data/src/core/ext/xds/xds_listener.h +220 -0
  132. data/src/core/ext/{transport/chttp2/transport/hpack_utils.h → xds/xds_resource_type.cc} +12 -9
  133. data/src/core/ext/xds/xds_resource_type.h +98 -0
  134. data/src/core/ext/xds/xds_resource_type_impl.h +87 -0
  135. data/src/core/ext/xds/xds_route_config.cc +993 -0
  136. data/src/core/ext/xds/xds_route_config.h +215 -0
  137. data/src/core/ext/xds/xds_routing.cc +11 -8
  138. data/src/core/ext/xds/xds_routing.h +8 -5
  139. data/src/core/ext/xds/xds_server_config_fetcher.cc +159 -99
  140. data/src/core/lib/address_utils/parse_address.cc +20 -0
  141. data/src/core/lib/address_utils/parse_address.h +5 -0
  142. data/src/core/lib/address_utils/sockaddr_utils.cc +33 -36
  143. data/src/core/lib/address_utils/sockaddr_utils.h +1 -16
  144. data/src/core/lib/backoff/backoff.cc +4 -30
  145. data/src/core/lib/backoff/backoff.h +3 -3
  146. data/src/core/lib/channel/channel_args.cc +0 -1
  147. data/src/core/lib/channel/channel_stack.cc +8 -0
  148. data/src/core/lib/channel/channel_stack.h +1 -1
  149. data/src/core/lib/channel/channel_stack_builder.cc +5 -9
  150. data/src/core/lib/channel/channel_stack_builder.h +4 -7
  151. data/src/core/lib/channel/channelz.cc +1 -0
  152. data/src/core/lib/compression/compression.cc +19 -111
  153. data/src/core/lib/compression/compression_internal.cc +142 -202
  154. data/src/core/lib/compression/compression_internal.h +64 -69
  155. data/src/core/lib/compression/message_compress.cc +11 -11
  156. data/src/core/lib/compression/message_compress.h +2 -2
  157. data/src/core/lib/gpr/useful.h +4 -0
  158. data/src/core/lib/gprpp/bitset.h +7 -0
  159. data/src/core/lib/gprpp/chunked_vector.h +45 -3
  160. data/src/core/lib/gprpp/status_helper.cc +20 -28
  161. data/src/core/lib/gprpp/status_helper.h +6 -19
  162. data/src/core/lib/gprpp/table.h +11 -0
  163. data/src/core/lib/http/httpcli.cc +37 -46
  164. data/src/core/lib/http/httpcli.h +3 -15
  165. data/src/core/lib/iomgr/call_combiner.cc +15 -4
  166. data/src/core/lib/iomgr/closure.h +29 -9
  167. data/src/core/lib/iomgr/combiner.cc +25 -3
  168. data/src/core/lib/iomgr/error.cc +2 -0
  169. data/src/core/lib/iomgr/error.h +3 -0
  170. data/src/core/lib/iomgr/event_engine/iomgr.cc +3 -2
  171. data/src/core/lib/iomgr/event_engine/resolved_address_internal.cc +6 -0
  172. data/src/core/lib/iomgr/event_engine/resolved_address_internal.h +2 -0
  173. data/src/core/lib/iomgr/event_engine/resolver.cc +66 -48
  174. data/src/core/lib/iomgr/event_engine/resolver.h +56 -0
  175. data/src/core/lib/iomgr/exec_ctx.cc +22 -9
  176. data/src/core/lib/iomgr/executor.cc +10 -1
  177. data/src/core/lib/iomgr/fork_posix.cc +3 -2
  178. data/src/core/lib/iomgr/iomgr_custom.cc +4 -1
  179. data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
  180. data/src/core/lib/iomgr/iomgr_posix_cfstream.cc +2 -2
  181. data/src/core/lib/iomgr/iomgr_windows.cc +2 -2
  182. data/src/core/lib/iomgr/port.h +2 -2
  183. data/src/core/lib/iomgr/resolve_address.cc +5 -24
  184. data/src/core/lib/iomgr/resolve_address.h +47 -44
  185. data/src/core/lib/iomgr/resolve_address_custom.cc +131 -109
  186. data/src/core/lib/iomgr/resolve_address_custom.h +101 -19
  187. data/src/core/lib/iomgr/resolve_address_impl.h +59 -0
  188. data/src/core/lib/iomgr/resolve_address_posix.cc +82 -66
  189. data/src/core/lib/iomgr/resolve_address_posix.h +47 -0
  190. data/src/core/lib/iomgr/resolve_address_windows.cc +93 -74
  191. data/src/core/lib/iomgr/resolve_address_windows.h +47 -0
  192. data/src/core/lib/iomgr/resolved_address.h +39 -0
  193. data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +1 -0
  194. data/src/core/lib/iomgr/tcp_server_utils_posix_ifaddrs.cc +1 -0
  195. data/src/core/lib/iomgr/unix_sockets_posix.cc +22 -34
  196. data/src/core/lib/iomgr/unix_sockets_posix.h +4 -7
  197. data/src/core/lib/iomgr/unix_sockets_posix_noop.cc +6 -15
  198. data/src/core/lib/matchers/matchers.cc +1 -1
  199. data/src/core/lib/promise/activity.h +49 -20
  200. data/src/core/lib/promise/detail/status.h +5 -0
  201. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.cc +17 -25
  202. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver.h +43 -44
  203. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_factory.h +10 -5
  204. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.cc +3 -2
  205. data/src/core/{ext/filters/client_channel → lib/resolver}/resolver_registry.h +4 -5
  206. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.cc +1 -1
  207. data/src/core/{ext/filters/client_channel → lib/resolver}/server_address.h +4 -4
  208. data/src/core/lib/resource_quota/api.h +0 -1
  209. data/src/core/lib/{gprpp → resource_quota}/arena.cc +16 -13
  210. data/src/core/lib/{gprpp → resource_quota}/arena.h +24 -13
  211. data/src/core/lib/security/authorization/evaluate_args.cc +30 -15
  212. data/src/core/lib/security/authorization/evaluate_args.h +1 -0
  213. data/src/core/lib/security/authorization/grpc_authorization_engine.cc +60 -0
  214. data/src/core/lib/security/authorization/grpc_authorization_engine.h +62 -0
  215. data/src/core/lib/security/authorization/matchers.cc +227 -0
  216. data/src/core/lib/security/authorization/matchers.h +211 -0
  217. data/src/core/lib/security/authorization/rbac_policy.cc +442 -0
  218. data/src/core/lib/security/authorization/rbac_policy.h +170 -0
  219. data/src/core/lib/security/context/security_context.cc +4 -2
  220. data/src/core/lib/security/context/security_context.h +1 -1
  221. data/src/core/lib/security/credentials/composite/composite_credentials.cc +5 -5
  222. data/src/core/lib/security/credentials/composite/composite_credentials.h +4 -3
  223. data/src/core/lib/security/credentials/credentials.h +10 -20
  224. data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +6 -9
  225. data/src/core/lib/security/credentials/external/external_account_credentials.cc +7 -9
  226. data/src/core/lib/security/credentials/external/external_account_credentials.h +2 -7
  227. data/src/core/lib/security/credentials/external/url_external_account_credentials.cc +2 -3
  228. data/src/core/lib/security/credentials/fake/fake_credentials.cc +5 -4
  229. data/src/core/lib/security/credentials/fake/fake_credentials.h +8 -7
  230. data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +2 -5
  231. data/src/core/lib/security/credentials/iam/iam_credentials.cc +16 -19
  232. data/src/core/lib/security/credentials/iam/iam_credentials.h +6 -5
  233. data/src/core/lib/security/credentials/jwt/json_token.cc +4 -6
  234. data/src/core/lib/security/credentials/jwt/jwt_credentials.cc +16 -28
  235. data/src/core/lib/security/credentials/jwt/jwt_credentials.h +8 -8
  236. data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +6 -13
  237. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +44 -57
  238. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +13 -15
  239. data/src/core/lib/security/credentials/plugin/plugin_credentials.cc +6 -7
  240. data/src/core/lib/security/credentials/plugin/plugin_credentials.h +5 -4
  241. data/src/core/lib/security/credentials/ssl/ssl_credentials.cc +1 -10
  242. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.cc +6 -0
  243. data/src/core/lib/security/credentials/tls/grpc_tls_credentials_options.h +7 -0
  244. data/src/core/lib/security/credentials/xds/xds_credentials.h +1 -1
  245. data/src/core/lib/security/security_connector/security_connector.cc +0 -4
  246. data/src/core/lib/security/security_connector/security_connector.h +5 -1
  247. data/src/core/lib/security/security_connector/ssl_utils.cc +14 -24
  248. data/src/core/lib/security/security_connector/ssl_utils.h +5 -14
  249. data/src/core/lib/security/security_connector/tls/tls_security_connector.cc +2 -3
  250. data/src/core/lib/security/transport/auth_filters.h +7 -0
  251. data/src/core/lib/security/transport/client_auth_filter.cc +53 -33
  252. data/src/core/lib/security/transport/server_auth_filter.cc +40 -35
  253. data/src/core/{ext → lib}/service_config/service_config.cc +2 -2
  254. data/src/core/{ext → lib}/service_config/service_config.h +4 -4
  255. data/src/core/{ext → lib}/service_config/service_config_call_data.h +5 -5
  256. data/src/core/{ext → lib}/service_config/service_config_parser.cc +1 -1
  257. data/src/core/{ext → lib}/service_config/service_config_parser.h +3 -3
  258. data/src/core/lib/slice/slice.cc +3 -1
  259. data/src/core/lib/slice/slice.h +43 -13
  260. data/src/core/lib/slice/slice_intern.cc +3 -101
  261. data/src/core/lib/slice/slice_internal.h +1 -2
  262. data/src/core/lib/slice/slice_refcount.h +4 -13
  263. data/src/core/lib/slice/slice_refcount_base.h +0 -16
  264. data/src/core/lib/surface/call.cc +140 -382
  265. data/src/core/lib/surface/call.h +4 -4
  266. data/src/core/lib/surface/channel.cc +42 -44
  267. data/src/core/lib/surface/channel.h +4 -4
  268. data/src/core/lib/surface/init.cc +0 -2
  269. data/src/core/lib/surface/lame_client.cc +0 -1
  270. data/src/core/lib/surface/server.cc +12 -29
  271. data/src/core/lib/surface/server.h +2 -2
  272. data/src/core/lib/surface/version.cc +2 -2
  273. data/src/core/lib/transport/error_utils.h +14 -0
  274. data/src/core/lib/transport/metadata_batch.h +799 -717
  275. data/src/core/lib/transport/parsed_metadata.cc +2 -0
  276. data/src/core/lib/transport/parsed_metadata.h +95 -92
  277. data/src/core/lib/transport/timeout_encoding.cc +200 -66
  278. data/src/core/lib/transport/timeout_encoding.h +40 -10
  279. data/src/core/lib/transport/transport.h +1 -1
  280. data/src/core/lib/transport/transport_op_string.cc +6 -39
  281. data/src/core/lib/uri/uri_parser.cc +223 -53
  282. data/src/core/lib/uri/uri_parser.h +36 -23
  283. data/src/core/plugin_registry/grpc_plugin_registry.cc +4 -3
  284. data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +1 -1
  285. data/src/core/tsi/ssl/session_cache/ssl_session.h +2 -4
  286. data/src/core/tsi/ssl/session_cache/ssl_session_cache.h +3 -5
  287. data/src/core/tsi/ssl_transport_security.cc +53 -13
  288. data/src/core/tsi/ssl_transport_security.h +18 -6
  289. data/src/ruby/ext/grpc/extconf.rb +10 -3
  290. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +2 -0
  291. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +3 -0
  292. data/src/ruby/lib/grpc/version.rb +1 -1
  293. data/src/ruby/pb/src/proto/grpc/testing/test_pb.rb +2 -1
  294. data/third_party/abseil-cpp/absl/base/internal/fast_type_id.h +48 -0
  295. data/third_party/abseil-cpp/absl/random/bernoulli_distribution.h +200 -0
  296. data/third_party/abseil-cpp/absl/random/beta_distribution.h +427 -0
  297. data/third_party/abseil-cpp/absl/random/discrete_distribution.cc +98 -0
  298. data/third_party/abseil-cpp/absl/random/discrete_distribution.h +247 -0
  299. data/third_party/abseil-cpp/absl/random/distributions.h +452 -0
  300. data/third_party/abseil-cpp/absl/random/exponential_distribution.h +165 -0
  301. data/third_party/abseil-cpp/absl/random/gaussian_distribution.cc +104 -0
  302. data/third_party/abseil-cpp/absl/random/gaussian_distribution.h +275 -0
  303. data/third_party/abseil-cpp/absl/random/internal/distribution_caller.h +92 -0
  304. data/third_party/abseil-cpp/absl/random/internal/fast_uniform_bits.h +268 -0
  305. data/third_party/abseil-cpp/absl/random/internal/fastmath.h +57 -0
  306. data/third_party/abseil-cpp/absl/random/internal/generate_real.h +144 -0
  307. data/third_party/abseil-cpp/absl/random/internal/iostream_state_saver.h +245 -0
  308. data/third_party/abseil-cpp/absl/random/internal/nonsecure_base.h +150 -0
  309. data/third_party/abseil-cpp/absl/random/internal/pcg_engine.h +308 -0
  310. data/third_party/abseil-cpp/absl/random/internal/platform.h +171 -0
  311. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.cc +253 -0
  312. data/third_party/abseil-cpp/absl/random/internal/pool_urbg.h +131 -0
  313. data/third_party/abseil-cpp/absl/random/internal/randen.cc +91 -0
  314. data/third_party/abseil-cpp/absl/random/internal/randen.h +102 -0
  315. data/third_party/abseil-cpp/absl/random/internal/randen_detect.cc +221 -0
  316. data/third_party/abseil-cpp/absl/random/internal/randen_detect.h +33 -0
  317. data/third_party/abseil-cpp/absl/random/internal/randen_engine.h +239 -0
  318. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.cc +526 -0
  319. data/third_party/abseil-cpp/absl/random/internal/randen_hwaes.h +50 -0
  320. data/third_party/abseil-cpp/absl/random/internal/randen_round_keys.cc +462 -0
  321. data/third_party/abseil-cpp/absl/random/internal/randen_slow.cc +471 -0
  322. data/third_party/abseil-cpp/absl/random/internal/randen_slow.h +40 -0
  323. data/third_party/abseil-cpp/absl/random/internal/randen_traits.h +88 -0
  324. data/third_party/abseil-cpp/absl/random/internal/salted_seed_seq.h +167 -0
  325. data/third_party/abseil-cpp/absl/random/internal/seed_material.cc +267 -0
  326. data/third_party/abseil-cpp/absl/random/internal/seed_material.h +104 -0
  327. data/third_party/abseil-cpp/absl/random/internal/traits.h +101 -0
  328. data/third_party/abseil-cpp/absl/random/internal/uniform_helper.h +244 -0
  329. data/third_party/abseil-cpp/absl/random/internal/wide_multiply.h +111 -0
  330. data/third_party/abseil-cpp/absl/random/log_uniform_int_distribution.h +257 -0
  331. data/third_party/abseil-cpp/absl/random/poisson_distribution.h +258 -0
  332. data/third_party/abseil-cpp/absl/random/random.h +189 -0
  333. data/third_party/abseil-cpp/absl/random/seed_gen_exception.cc +46 -0
  334. data/third_party/abseil-cpp/absl/random/seed_gen_exception.h +55 -0
  335. data/third_party/abseil-cpp/absl/random/seed_sequences.cc +29 -0
  336. data/third_party/abseil-cpp/absl/random/seed_sequences.h +110 -0
  337. data/third_party/abseil-cpp/absl/random/uniform_int_distribution.h +275 -0
  338. data/third_party/abseil-cpp/absl/random/uniform_real_distribution.h +202 -0
  339. data/third_party/abseil-cpp/absl/random/zipf_distribution.h +271 -0
  340. data/third_party/boringssl-with-bazel/src/crypto/asn1/tasn_enc.c +1 -0
  341. data/third_party/boringssl-with-bazel/src/crypto/base64/base64.c +13 -0
  342. data/third_party/boringssl-with-bazel/src/crypto/dsa/dsa.c +21 -0
  343. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/cipher.c +12 -0
  344. data/third_party/boringssl-with-bazel/src/crypto/fipsmodule/ecdsa/ecdsa.c +1 -2
  345. data/third_party/boringssl-with-bazel/src/crypto/hpke/hpke.c +2 -2
  346. data/third_party/boringssl-with-bazel/src/crypto/mem.c +1 -1
  347. data/third_party/boringssl-with-bazel/src/crypto/pkcs7/pkcs7.c +29 -0
  348. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/internal.h +0 -1
  349. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8.c +1 -1
  350. data/third_party/boringssl-with-bazel/src/crypto/pkcs8/pkcs8_x509.c +1 -1
  351. data/third_party/boringssl-with-bazel/src/include/openssl/base64.h +8 -0
  352. data/third_party/boringssl-with-bazel/src/include/openssl/cipher.h +13 -1
  353. data/third_party/boringssl-with-bazel/src/include/openssl/dsa.h +10 -0
  354. data/third_party/boringssl-with-bazel/src/include/openssl/hpke.h +1 -1
  355. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs7.h +9 -4
  356. data/third_party/boringssl-with-bazel/src/include/openssl/pkcs8.h +6 -1
  357. data/third_party/boringssl-with-bazel/src/include/openssl/ssl.h +23 -2
  358. data/third_party/boringssl-with-bazel/src/ssl/ssl_lib.cc +4 -0
  359. data/third_party/xxhash/xxhash.h +607 -352
  360. metadata +149 -77
  361. data/src/core/ext/transport/chttp2/transport/hpack_encoder_index.h +0 -107
  362. data/src/core/ext/transport/chttp2/transport/hpack_utils.cc +0 -46
  363. data/src/core/ext/transport/chttp2/transport/popularity_count.h +0 -60
  364. data/src/core/lib/compression/algorithm_metadata.h +0 -62
  365. data/src/core/lib/compression/compression_args.cc +0 -140
  366. data/src/core/lib/compression/compression_args.h +0 -58
  367. data/src/core/lib/compression/stream_compression.cc +0 -81
  368. data/src/core/lib/compression/stream_compression.h +0 -117
  369. data/src/core/lib/compression/stream_compression_gzip.cc +0 -231
  370. data/src/core/lib/compression/stream_compression_gzip.h +0 -28
  371. data/src/core/lib/compression/stream_compression_identity.cc +0 -91
  372. data/src/core/lib/compression/stream_compression_identity.h +0 -29
  373. data/src/core/lib/security/credentials/credentials_metadata.cc +0 -61
  374. data/src/core/lib/slice/static_slice.cc +0 -377
  375. data/src/core/lib/slice/static_slice.h +0 -300
  376. data/src/core/lib/transport/metadata.cc +0 -714
  377. data/src/core/lib/transport/metadata.h +0 -449
  378. data/src/core/lib/transport/metadata_batch.cc +0 -99
  379. data/src/core/lib/transport/static_metadata.cc +0 -1032
  380. data/src/core/lib/transport/static_metadata.h +0 -322
  381. data/src/core/lib/transport/status_metadata.cc +0 -63
  382. 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