@rowstile/cli-linux-x64 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (565) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +5 -0
  3. package/package.json +26 -0
  4. package/python/bin/python3.13 +0 -0
  5. package/python/bin/python3.13-config +122 -0
  6. package/python/lib/libpython3.13.so.1.0 +0 -0
  7. package/python/lib/libpython3.so +0 -0
  8. package/python/lib/python3.13/LICENSE.txt +277 -0
  9. package/python/lib/python3.13/__future__.py +147 -0
  10. package/python/lib/python3.13/__hello__.py +16 -0
  11. package/python/lib/python3.13/_aix_support.py +108 -0
  12. package/python/lib/python3.13/_android_support.py +192 -0
  13. package/python/lib/python3.13/_apple_support.py +66 -0
  14. package/python/lib/python3.13/_collections_abc.py +1187 -0
  15. package/python/lib/python3.13/_colorize.py +119 -0
  16. package/python/lib/python3.13/_compat_pickle.py +251 -0
  17. package/python/lib/python3.13/_compression.py +162 -0
  18. package/python/lib/python3.13/_ios_support.py +71 -0
  19. package/python/lib/python3.13/_markupbase.py +396 -0
  20. package/python/lib/python3.13/_opcode_metadata.py +343 -0
  21. package/python/lib/python3.13/_osx_support.py +579 -0
  22. package/python/lib/python3.13/_py_abc.py +147 -0
  23. package/python/lib/python3.13/_pydatetime.py +2640 -0
  24. package/python/lib/python3.13/_pydecimal.py +6356 -0
  25. package/python/lib/python3.13/_pyio.py +2714 -0
  26. package/python/lib/python3.13/_pylong.py +363 -0
  27. package/python/lib/python3.13/_pyrepl/__init__.py +19 -0
  28. package/python/lib/python3.13/_pyrepl/__main__.py +10 -0
  29. package/python/lib/python3.13/_pyrepl/_minimal_curses.py +68 -0
  30. package/python/lib/python3.13/_pyrepl/_threading_handler.py +74 -0
  31. package/python/lib/python3.13/_pyrepl/base_eventqueue.py +110 -0
  32. package/python/lib/python3.13/_pyrepl/commands.py +492 -0
  33. package/python/lib/python3.13/_pyrepl/completing_reader.py +295 -0
  34. package/python/lib/python3.13/_pyrepl/console.py +229 -0
  35. package/python/lib/python3.13/_pyrepl/curses.py +33 -0
  36. package/python/lib/python3.13/_pyrepl/fancy_termios.py +82 -0
  37. package/python/lib/python3.13/_pyrepl/historical_reader.py +419 -0
  38. package/python/lib/python3.13/_pyrepl/input.py +114 -0
  39. package/python/lib/python3.13/_pyrepl/keymap.py +213 -0
  40. package/python/lib/python3.13/_pyrepl/main.py +59 -0
  41. package/python/lib/python3.13/_pyrepl/mypy.ini +29 -0
  42. package/python/lib/python3.13/_pyrepl/pager.py +175 -0
  43. package/python/lib/python3.13/_pyrepl/reader.py +764 -0
  44. package/python/lib/python3.13/_pyrepl/readline.py +599 -0
  45. package/python/lib/python3.13/_pyrepl/simple_interact.py +180 -0
  46. package/python/lib/python3.13/_pyrepl/trace.py +21 -0
  47. package/python/lib/python3.13/_pyrepl/types.py +10 -0
  48. package/python/lib/python3.13/_pyrepl/unix_console.py +852 -0
  49. package/python/lib/python3.13/_pyrepl/unix_eventqueue.py +76 -0
  50. package/python/lib/python3.13/_pyrepl/utils.py +83 -0
  51. package/python/lib/python3.13/_pyrepl/windows_console.py +687 -0
  52. package/python/lib/python3.13/_pyrepl/windows_eventqueue.py +42 -0
  53. package/python/lib/python3.13/_sitebuiltins.py +91 -0
  54. package/python/lib/python3.13/_strptime.py +800 -0
  55. package/python/lib/python3.13/_sysconfigdata__linux_x86_64-linux-gnu.py +1079 -0
  56. package/python/lib/python3.13/_threading_local.py +120 -0
  57. package/python/lib/python3.13/_weakrefset.py +205 -0
  58. package/python/lib/python3.13/abc.py +188 -0
  59. package/python/lib/python3.13/antigravity.py +17 -0
  60. package/python/lib/python3.13/argparse.py +2690 -0
  61. package/python/lib/python3.13/ast.py +1865 -0
  62. package/python/lib/python3.13/asyncio/__init__.py +47 -0
  63. package/python/lib/python3.13/asyncio/__main__.py +211 -0
  64. package/python/lib/python3.13/asyncio/base_events.py +2086 -0
  65. package/python/lib/python3.13/asyncio/base_futures.py +67 -0
  66. package/python/lib/python3.13/asyncio/base_subprocess.py +312 -0
  67. package/python/lib/python3.13/asyncio/base_tasks.py +94 -0
  68. package/python/lib/python3.13/asyncio/constants.py +41 -0
  69. package/python/lib/python3.13/asyncio/coroutines.py +109 -0
  70. package/python/lib/python3.13/asyncio/events.py +885 -0
  71. package/python/lib/python3.13/asyncio/exceptions.py +62 -0
  72. package/python/lib/python3.13/asyncio/format_helpers.py +84 -0
  73. package/python/lib/python3.13/asyncio/futures.py +425 -0
  74. package/python/lib/python3.13/asyncio/locks.py +617 -0
  75. package/python/lib/python3.13/asyncio/log.py +7 -0
  76. package/python/lib/python3.13/asyncio/mixins.py +21 -0
  77. package/python/lib/python3.13/asyncio/proactor_events.py +891 -0
  78. package/python/lib/python3.13/asyncio/protocols.py +216 -0
  79. package/python/lib/python3.13/asyncio/queues.py +309 -0
  80. package/python/lib/python3.13/asyncio/runners.py +217 -0
  81. package/python/lib/python3.13/asyncio/selector_events.py +1328 -0
  82. package/python/lib/python3.13/asyncio/sslproto.py +929 -0
  83. package/python/lib/python3.13/asyncio/staggered.py +174 -0
  84. package/python/lib/python3.13/asyncio/streams.py +787 -0
  85. package/python/lib/python3.13/asyncio/subprocess.py +229 -0
  86. package/python/lib/python3.13/asyncio/taskgroups.py +278 -0
  87. package/python/lib/python3.13/asyncio/tasks.py +1121 -0
  88. package/python/lib/python3.13/asyncio/threads.py +26 -0
  89. package/python/lib/python3.13/asyncio/timeouts.py +185 -0
  90. package/python/lib/python3.13/asyncio/transports.py +337 -0
  91. package/python/lib/python3.13/asyncio/trsock.py +98 -0
  92. package/python/lib/python3.13/asyncio/unix_events.py +1550 -0
  93. package/python/lib/python3.13/asyncio/windows_events.py +906 -0
  94. package/python/lib/python3.13/asyncio/windows_utils.py +181 -0
  95. package/python/lib/python3.13/base64.py +628 -0
  96. package/python/lib/python3.13/bdb.py +973 -0
  97. package/python/lib/python3.13/bisect.py +118 -0
  98. package/python/lib/python3.13/bz2.py +352 -0
  99. package/python/lib/python3.13/cProfile.py +197 -0
  100. package/python/lib/python3.13/calendar.py +813 -0
  101. package/python/lib/python3.13/cmd.py +409 -0
  102. package/python/lib/python3.13/code.py +386 -0
  103. package/python/lib/python3.13/codecs.py +1132 -0
  104. package/python/lib/python3.13/codeop.py +155 -0
  105. package/python/lib/python3.13/collections/__init__.py +1603 -0
  106. package/python/lib/python3.13/colorsys.py +166 -0
  107. package/python/lib/python3.13/compileall.py +470 -0
  108. package/python/lib/python3.13/concurrent/__init__.py +1 -0
  109. package/python/lib/python3.13/concurrent/futures/__init__.py +54 -0
  110. package/python/lib/python3.13/concurrent/futures/_base.py +660 -0
  111. package/python/lib/python3.13/concurrent/futures/process.py +892 -0
  112. package/python/lib/python3.13/concurrent/futures/thread.py +240 -0
  113. package/python/lib/python3.13/configparser.py +1396 -0
  114. package/python/lib/python3.13/contextlib.py +814 -0
  115. package/python/lib/python3.13/contextvars.py +4 -0
  116. package/python/lib/python3.13/copy.py +306 -0
  117. package/python/lib/python3.13/copyreg.py +217 -0
  118. package/python/lib/python3.13/csv.py +527 -0
  119. package/python/lib/python3.13/ctypes/__init__.py +605 -0
  120. package/python/lib/python3.13/ctypes/_aix.py +327 -0
  121. package/python/lib/python3.13/ctypes/_endian.py +78 -0
  122. package/python/lib/python3.13/ctypes/macholib/README.ctypes +7 -0
  123. package/python/lib/python3.13/ctypes/macholib/__init__.py +9 -0
  124. package/python/lib/python3.13/ctypes/macholib/dyld.py +165 -0
  125. package/python/lib/python3.13/ctypes/macholib/dylib.py +42 -0
  126. package/python/lib/python3.13/ctypes/macholib/fetch_macholib +2 -0
  127. package/python/lib/python3.13/ctypes/macholib/fetch_macholib.bat +1 -0
  128. package/python/lib/python3.13/ctypes/macholib/framework.py +42 -0
  129. package/python/lib/python3.13/ctypes/util.py +387 -0
  130. package/python/lib/python3.13/ctypes/wintypes.py +202 -0
  131. package/python/lib/python3.13/curses/__init__.py +101 -0
  132. package/python/lib/python3.13/curses/ascii.py +99 -0
  133. package/python/lib/python3.13/curses/has_key.py +192 -0
  134. package/python/lib/python3.13/curses/panel.py +6 -0
  135. package/python/lib/python3.13/curses/textpad.py +236 -0
  136. package/python/lib/python3.13/dataclasses.py +1679 -0
  137. package/python/lib/python3.13/datetime.py +9 -0
  138. package/python/lib/python3.13/dbm/__init__.py +194 -0
  139. package/python/lib/python3.13/dbm/dumb.py +319 -0
  140. package/python/lib/python3.13/dbm/gnu.py +3 -0
  141. package/python/lib/python3.13/dbm/ndbm.py +3 -0
  142. package/python/lib/python3.13/dbm/sqlite3.py +144 -0
  143. package/python/lib/python3.13/decimal.py +109 -0
  144. package/python/lib/python3.13/difflib.py +2058 -0
  145. package/python/lib/python3.13/dis.py +1075 -0
  146. package/python/lib/python3.13/doctest.py +2919 -0
  147. package/python/lib/python3.13/email/__init__.py +61 -0
  148. package/python/lib/python3.13/email/_encoded_words.py +233 -0
  149. package/python/lib/python3.13/email/_header_value_parser.py +3153 -0
  150. package/python/lib/python3.13/email/_parseaddr.py +563 -0
  151. package/python/lib/python3.13/email/_policybase.py +382 -0
  152. package/python/lib/python3.13/email/architecture.rst +216 -0
  153. package/python/lib/python3.13/email/base64mime.py +115 -0
  154. package/python/lib/python3.13/email/charset.py +396 -0
  155. package/python/lib/python3.13/email/contentmanager.py +254 -0
  156. package/python/lib/python3.13/email/encoders.py +65 -0
  157. package/python/lib/python3.13/email/errors.py +117 -0
  158. package/python/lib/python3.13/email/feedparser.py +536 -0
  159. package/python/lib/python3.13/email/generator.py +530 -0
  160. package/python/lib/python3.13/email/header.py +582 -0
  161. package/python/lib/python3.13/email/headerregistry.py +618 -0
  162. package/python/lib/python3.13/email/iterators.py +68 -0
  163. package/python/lib/python3.13/email/message.py +1217 -0
  164. package/python/lib/python3.13/email/mime/__init__.py +0 -0
  165. package/python/lib/python3.13/email/mime/application.py +37 -0
  166. package/python/lib/python3.13/email/mime/audio.py +97 -0
  167. package/python/lib/python3.13/email/mime/base.py +29 -0
  168. package/python/lib/python3.13/email/mime/image.py +152 -0
  169. package/python/lib/python3.13/email/mime/message.py +33 -0
  170. package/python/lib/python3.13/email/mime/multipart.py +47 -0
  171. package/python/lib/python3.13/email/mime/nonmultipart.py +21 -0
  172. package/python/lib/python3.13/email/mime/text.py +40 -0
  173. package/python/lib/python3.13/email/parser.py +127 -0
  174. package/python/lib/python3.13/email/policy.py +232 -0
  175. package/python/lib/python3.13/email/quoprimime.py +300 -0
  176. package/python/lib/python3.13/email/utils.py +497 -0
  177. package/python/lib/python3.13/encodings/__init__.py +179 -0
  178. package/python/lib/python3.13/encodings/__pycache__/__init__.cpython-313.pyc +0 -0
  179. package/python/lib/python3.13/encodings/__pycache__/aliases.cpython-313.pyc +0 -0
  180. package/python/lib/python3.13/encodings/__pycache__/utf_8.cpython-313.pyc +0 -0
  181. package/python/lib/python3.13/encodings/aliases.py +560 -0
  182. package/python/lib/python3.13/encodings/ascii.py +50 -0
  183. package/python/lib/python3.13/encodings/base64_codec.py +55 -0
  184. package/python/lib/python3.13/encodings/big5.py +39 -0
  185. package/python/lib/python3.13/encodings/big5hkscs.py +39 -0
  186. package/python/lib/python3.13/encodings/bz2_codec.py +78 -0
  187. package/python/lib/python3.13/encodings/charmap.py +69 -0
  188. package/python/lib/python3.13/encodings/cp037.py +307 -0
  189. package/python/lib/python3.13/encodings/cp1006.py +307 -0
  190. package/python/lib/python3.13/encodings/cp1026.py +307 -0
  191. package/python/lib/python3.13/encodings/cp1125.py +698 -0
  192. package/python/lib/python3.13/encodings/cp1140.py +307 -0
  193. package/python/lib/python3.13/encodings/cp1250.py +307 -0
  194. package/python/lib/python3.13/encodings/cp1251.py +307 -0
  195. package/python/lib/python3.13/encodings/cp1252.py +307 -0
  196. package/python/lib/python3.13/encodings/cp1253.py +307 -0
  197. package/python/lib/python3.13/encodings/cp1254.py +307 -0
  198. package/python/lib/python3.13/encodings/cp1255.py +307 -0
  199. package/python/lib/python3.13/encodings/cp1256.py +307 -0
  200. package/python/lib/python3.13/encodings/cp1257.py +307 -0
  201. package/python/lib/python3.13/encodings/cp1258.py +307 -0
  202. package/python/lib/python3.13/encodings/cp273.py +307 -0
  203. package/python/lib/python3.13/encodings/cp424.py +307 -0
  204. package/python/lib/python3.13/encodings/cp437.py +698 -0
  205. package/python/lib/python3.13/encodings/cp500.py +307 -0
  206. package/python/lib/python3.13/encodings/cp720.py +309 -0
  207. package/python/lib/python3.13/encodings/cp737.py +698 -0
  208. package/python/lib/python3.13/encodings/cp775.py +697 -0
  209. package/python/lib/python3.13/encodings/cp850.py +698 -0
  210. package/python/lib/python3.13/encodings/cp852.py +698 -0
  211. package/python/lib/python3.13/encodings/cp855.py +698 -0
  212. package/python/lib/python3.13/encodings/cp856.py +307 -0
  213. package/python/lib/python3.13/encodings/cp857.py +694 -0
  214. package/python/lib/python3.13/encodings/cp858.py +698 -0
  215. package/python/lib/python3.13/encodings/cp860.py +698 -0
  216. package/python/lib/python3.13/encodings/cp861.py +698 -0
  217. package/python/lib/python3.13/encodings/cp862.py +698 -0
  218. package/python/lib/python3.13/encodings/cp863.py +698 -0
  219. package/python/lib/python3.13/encodings/cp864.py +690 -0
  220. package/python/lib/python3.13/encodings/cp865.py +698 -0
  221. package/python/lib/python3.13/encodings/cp866.py +698 -0
  222. package/python/lib/python3.13/encodings/cp869.py +689 -0
  223. package/python/lib/python3.13/encodings/cp874.py +307 -0
  224. package/python/lib/python3.13/encodings/cp875.py +307 -0
  225. package/python/lib/python3.13/encodings/cp932.py +39 -0
  226. package/python/lib/python3.13/encodings/cp949.py +39 -0
  227. package/python/lib/python3.13/encodings/cp950.py +39 -0
  228. package/python/lib/python3.13/encodings/euc_jis_2004.py +39 -0
  229. package/python/lib/python3.13/encodings/euc_jisx0213.py +39 -0
  230. package/python/lib/python3.13/encodings/euc_jp.py +39 -0
  231. package/python/lib/python3.13/encodings/euc_kr.py +39 -0
  232. package/python/lib/python3.13/encodings/gb18030.py +39 -0
  233. package/python/lib/python3.13/encodings/gb2312.py +39 -0
  234. package/python/lib/python3.13/encodings/gbk.py +39 -0
  235. package/python/lib/python3.13/encodings/hex_codec.py +55 -0
  236. package/python/lib/python3.13/encodings/hp_roman8.py +314 -0
  237. package/python/lib/python3.13/encodings/hz.py +39 -0
  238. package/python/lib/python3.13/encodings/idna.py +387 -0
  239. package/python/lib/python3.13/encodings/iso2022_jp.py +39 -0
  240. package/python/lib/python3.13/encodings/iso2022_jp_1.py +39 -0
  241. package/python/lib/python3.13/encodings/iso2022_jp_2.py +39 -0
  242. package/python/lib/python3.13/encodings/iso2022_jp_2004.py +39 -0
  243. package/python/lib/python3.13/encodings/iso2022_jp_3.py +39 -0
  244. package/python/lib/python3.13/encodings/iso2022_jp_ext.py +39 -0
  245. package/python/lib/python3.13/encodings/iso2022_kr.py +39 -0
  246. package/python/lib/python3.13/encodings/iso8859_1.py +307 -0
  247. package/python/lib/python3.13/encodings/iso8859_10.py +307 -0
  248. package/python/lib/python3.13/encodings/iso8859_11.py +307 -0
  249. package/python/lib/python3.13/encodings/iso8859_13.py +307 -0
  250. package/python/lib/python3.13/encodings/iso8859_14.py +307 -0
  251. package/python/lib/python3.13/encodings/iso8859_15.py +307 -0
  252. package/python/lib/python3.13/encodings/iso8859_16.py +307 -0
  253. package/python/lib/python3.13/encodings/iso8859_2.py +307 -0
  254. package/python/lib/python3.13/encodings/iso8859_3.py +307 -0
  255. package/python/lib/python3.13/encodings/iso8859_4.py +307 -0
  256. package/python/lib/python3.13/encodings/iso8859_5.py +307 -0
  257. package/python/lib/python3.13/encodings/iso8859_6.py +307 -0
  258. package/python/lib/python3.13/encodings/iso8859_7.py +307 -0
  259. package/python/lib/python3.13/encodings/iso8859_8.py +307 -0
  260. package/python/lib/python3.13/encodings/iso8859_9.py +307 -0
  261. package/python/lib/python3.13/encodings/johab.py +39 -0
  262. package/python/lib/python3.13/encodings/koi8_r.py +307 -0
  263. package/python/lib/python3.13/encodings/koi8_t.py +308 -0
  264. package/python/lib/python3.13/encodings/koi8_u.py +307 -0
  265. package/python/lib/python3.13/encodings/kz1048.py +307 -0
  266. package/python/lib/python3.13/encodings/latin_1.py +50 -0
  267. package/python/lib/python3.13/encodings/mac_arabic.py +698 -0
  268. package/python/lib/python3.13/encodings/mac_croatian.py +307 -0
  269. package/python/lib/python3.13/encodings/mac_cyrillic.py +307 -0
  270. package/python/lib/python3.13/encodings/mac_farsi.py +307 -0
  271. package/python/lib/python3.13/encodings/mac_greek.py +307 -0
  272. package/python/lib/python3.13/encodings/mac_iceland.py +307 -0
  273. package/python/lib/python3.13/encodings/mac_latin2.py +312 -0
  274. package/python/lib/python3.13/encodings/mac_roman.py +307 -0
  275. package/python/lib/python3.13/encodings/mac_romanian.py +307 -0
  276. package/python/lib/python3.13/encodings/mac_turkish.py +307 -0
  277. package/python/lib/python3.13/encodings/mbcs.py +47 -0
  278. package/python/lib/python3.13/encodings/oem.py +41 -0
  279. package/python/lib/python3.13/encodings/palmos.py +308 -0
  280. package/python/lib/python3.13/encodings/ptcp154.py +312 -0
  281. package/python/lib/python3.13/encodings/punycode.py +253 -0
  282. package/python/lib/python3.13/encodings/quopri_codec.py +56 -0
  283. package/python/lib/python3.13/encodings/raw_unicode_escape.py +46 -0
  284. package/python/lib/python3.13/encodings/rot_13.py +113 -0
  285. package/python/lib/python3.13/encodings/shift_jis.py +39 -0
  286. package/python/lib/python3.13/encodings/shift_jis_2004.py +39 -0
  287. package/python/lib/python3.13/encodings/shift_jisx0213.py +39 -0
  288. package/python/lib/python3.13/encodings/tis_620.py +307 -0
  289. package/python/lib/python3.13/encodings/undefined.py +49 -0
  290. package/python/lib/python3.13/encodings/unicode_escape.py +46 -0
  291. package/python/lib/python3.13/encodings/utf_16.py +155 -0
  292. package/python/lib/python3.13/encodings/utf_16_be.py +42 -0
  293. package/python/lib/python3.13/encodings/utf_16_le.py +42 -0
  294. package/python/lib/python3.13/encodings/utf_32.py +150 -0
  295. package/python/lib/python3.13/encodings/utf_32_be.py +37 -0
  296. package/python/lib/python3.13/encodings/utf_32_le.py +37 -0
  297. package/python/lib/python3.13/encodings/utf_7.py +38 -0
  298. package/python/lib/python3.13/encodings/utf_8.py +42 -0
  299. package/python/lib/python3.13/encodings/utf_8_sig.py +130 -0
  300. package/python/lib/python3.13/encodings/uu_codec.py +103 -0
  301. package/python/lib/python3.13/encodings/zlib_codec.py +77 -0
  302. package/python/lib/python3.13/enum.py +2183 -0
  303. package/python/lib/python3.13/filecmp.py +320 -0
  304. package/python/lib/python3.13/fileinput.py +442 -0
  305. package/python/lib/python3.13/fnmatch.py +192 -0
  306. package/python/lib/python3.13/fractions.py +1043 -0
  307. package/python/lib/python3.13/ftplib.py +975 -0
  308. package/python/lib/python3.13/functools.py +1036 -0
  309. package/python/lib/python3.13/genericpath.py +200 -0
  310. package/python/lib/python3.13/getopt.py +215 -0
  311. package/python/lib/python3.13/getpass.py +192 -0
  312. package/python/lib/python3.13/gettext.py +657 -0
  313. package/python/lib/python3.13/glob.py +572 -0
  314. package/python/lib/python3.13/graphlib.py +250 -0
  315. package/python/lib/python3.13/gzip.py +693 -0
  316. package/python/lib/python3.13/hashlib.py +255 -0
  317. package/python/lib/python3.13/heapq.py +603 -0
  318. package/python/lib/python3.13/hmac.py +220 -0
  319. package/python/lib/python3.13/html/__init__.py +132 -0
  320. package/python/lib/python3.13/html/entities.py +2513 -0
  321. package/python/lib/python3.13/html/parser.py +583 -0
  322. package/python/lib/python3.13/http/__init__.py +202 -0
  323. package/python/lib/python3.13/http/client.py +1598 -0
  324. package/python/lib/python3.13/http/cookiejar.py +2122 -0
  325. package/python/lib/python3.13/http/cookies.py +635 -0
  326. package/python/lib/python3.13/http/server.py +1355 -0
  327. package/python/lib/python3.13/imaplib.py +1769 -0
  328. package/python/lib/python3.13/importlib/__init__.py +136 -0
  329. package/python/lib/python3.13/importlib/_abc.py +39 -0
  330. package/python/lib/python3.13/importlib/_bootstrap.py +1559 -0
  331. package/python/lib/python3.13/importlib/_bootstrap_external.py +1826 -0
  332. package/python/lib/python3.13/importlib/abc.py +243 -0
  333. package/python/lib/python3.13/importlib/machinery.py +21 -0
  334. package/python/lib/python3.13/importlib/metadata/__init__.py +1093 -0
  335. package/python/lib/python3.13/importlib/metadata/_adapters.py +89 -0
  336. package/python/lib/python3.13/importlib/metadata/_collections.py +30 -0
  337. package/python/lib/python3.13/importlib/metadata/_functools.py +104 -0
  338. package/python/lib/python3.13/importlib/metadata/_itertools.py +73 -0
  339. package/python/lib/python3.13/importlib/metadata/_meta.py +67 -0
  340. package/python/lib/python3.13/importlib/metadata/_text.py +99 -0
  341. package/python/lib/python3.13/importlib/metadata/diagnose.py +21 -0
  342. package/python/lib/python3.13/importlib/readers.py +12 -0
  343. package/python/lib/python3.13/importlib/resources/__init__.py +43 -0
  344. package/python/lib/python3.13/importlib/resources/_adapters.py +168 -0
  345. package/python/lib/python3.13/importlib/resources/_common.py +211 -0
  346. package/python/lib/python3.13/importlib/resources/_functional.py +81 -0
  347. package/python/lib/python3.13/importlib/resources/_itertools.py +38 -0
  348. package/python/lib/python3.13/importlib/resources/abc.py +173 -0
  349. package/python/lib/python3.13/importlib/resources/readers.py +203 -0
  350. package/python/lib/python3.13/importlib/resources/simple.py +106 -0
  351. package/python/lib/python3.13/importlib/simple.py +14 -0
  352. package/python/lib/python3.13/importlib/util.py +274 -0
  353. package/python/lib/python3.13/inspect.py +3479 -0
  354. package/python/lib/python3.13/io.py +99 -0
  355. package/python/lib/python3.13/ipaddress.py +2440 -0
  356. package/python/lib/python3.13/json/__init__.py +365 -0
  357. package/python/lib/python3.13/json/decoder.py +364 -0
  358. package/python/lib/python3.13/json/encoder.py +446 -0
  359. package/python/lib/python3.13/json/scanner.py +73 -0
  360. package/python/lib/python3.13/json/tool.py +90 -0
  361. package/python/lib/python3.13/keyword.py +64 -0
  362. package/python/lib/python3.13/lib-dynload/.empty +0 -0
  363. package/python/lib/python3.13/lib-dynload/_dbm.cpython-313-x86_64-linux-gnu.so +0 -0
  364. package/python/lib/python3.13/linecache.py +236 -0
  365. package/python/lib/python3.13/locale.py +1987 -0
  366. package/python/lib/python3.13/logging/__init__.py +2330 -0
  367. package/python/lib/python3.13/logging/config.py +1080 -0
  368. package/python/lib/python3.13/logging/handlers.py +1629 -0
  369. package/python/lib/python3.13/lzma.py +364 -0
  370. package/python/lib/python3.13/mailbox.py +2219 -0
  371. package/python/lib/python3.13/mimetypes.py +679 -0
  372. package/python/lib/python3.13/modulefinder.py +671 -0
  373. package/python/lib/python3.13/multiprocessing/__init__.py +37 -0
  374. package/python/lib/python3.13/multiprocessing/connection.py +1216 -0
  375. package/python/lib/python3.13/multiprocessing/context.py +383 -0
  376. package/python/lib/python3.13/multiprocessing/dummy/__init__.py +126 -0
  377. package/python/lib/python3.13/multiprocessing/dummy/connection.py +75 -0
  378. package/python/lib/python3.13/multiprocessing/forkserver.py +373 -0
  379. package/python/lib/python3.13/multiprocessing/heap.py +337 -0
  380. package/python/lib/python3.13/multiprocessing/managers.py +1397 -0
  381. package/python/lib/python3.13/multiprocessing/pool.py +957 -0
  382. package/python/lib/python3.13/multiprocessing/popen_fork.py +97 -0
  383. package/python/lib/python3.13/multiprocessing/popen_forkserver.py +74 -0
  384. package/python/lib/python3.13/multiprocessing/popen_spawn_posix.py +76 -0
  385. package/python/lib/python3.13/multiprocessing/popen_spawn_win32.py +147 -0
  386. package/python/lib/python3.13/multiprocessing/process.py +436 -0
  387. package/python/lib/python3.13/multiprocessing/queues.py +399 -0
  388. package/python/lib/python3.13/multiprocessing/reduction.py +281 -0
  389. package/python/lib/python3.13/multiprocessing/resource_sharer.py +154 -0
  390. package/python/lib/python3.13/multiprocessing/resource_tracker.py +499 -0
  391. package/python/lib/python3.13/multiprocessing/shared_memory.py +544 -0
  392. package/python/lib/python3.13/multiprocessing/sharedctypes.py +240 -0
  393. package/python/lib/python3.13/multiprocessing/spawn.py +307 -0
  394. package/python/lib/python3.13/multiprocessing/synchronize.py +404 -0
  395. package/python/lib/python3.13/multiprocessing/util.py +562 -0
  396. package/python/lib/python3.13/netrc.py +199 -0
  397. package/python/lib/python3.13/ntpath.py +872 -0
  398. package/python/lib/python3.13/nturl2path.py +69 -0
  399. package/python/lib/python3.13/numbers.py +427 -0
  400. package/python/lib/python3.13/opcode.py +115 -0
  401. package/python/lib/python3.13/operator.py +467 -0
  402. package/python/lib/python3.13/optparse.py +1681 -0
  403. package/python/lib/python3.13/os.py +1184 -0
  404. package/python/lib/python3.13/pathlib/__init__.py +12 -0
  405. package/python/lib/python3.13/pathlib/_abc.py +930 -0
  406. package/python/lib/python3.13/pathlib/_local.py +861 -0
  407. package/python/lib/python3.13/pdb.py +2550 -0
  408. package/python/lib/python3.13/pickle.py +1860 -0
  409. package/python/lib/python3.13/pickletools.py +2904 -0
  410. package/python/lib/python3.13/pkgutil.py +529 -0
  411. package/python/lib/python3.13/platform.py +1454 -0
  412. package/python/lib/python3.13/plistlib.py +948 -0
  413. package/python/lib/python3.13/poplib.py +477 -0
  414. package/python/lib/python3.13/posixpath.py +578 -0
  415. package/python/lib/python3.13/pprint.py +658 -0
  416. package/python/lib/python3.13/profile.py +616 -0
  417. package/python/lib/python3.13/pstats.py +778 -0
  418. package/python/lib/python3.13/pty.py +211 -0
  419. package/python/lib/python3.13/py_compile.py +212 -0
  420. package/python/lib/python3.13/pyclbr.py +314 -0
  421. package/python/lib/python3.13/pydoc.py +2861 -0
  422. package/python/lib/python3.13/queue.py +383 -0
  423. package/python/lib/python3.13/quopri.py +237 -0
  424. package/python/lib/python3.13/random.py +1078 -0
  425. package/python/lib/python3.13/re/__init__.py +428 -0
  426. package/python/lib/python3.13/re/_casefix.py +106 -0
  427. package/python/lib/python3.13/re/_compiler.py +768 -0
  428. package/python/lib/python3.13/re/_constants.py +222 -0
  429. package/python/lib/python3.13/re/_parser.py +1081 -0
  430. package/python/lib/python3.13/reprlib.py +230 -0
  431. package/python/lib/python3.13/rlcompleter.py +222 -0
  432. package/python/lib/python3.13/runpy.py +326 -0
  433. package/python/lib/python3.13/sched.py +167 -0
  434. package/python/lib/python3.13/secrets.py +71 -0
  435. package/python/lib/python3.13/selectors.py +603 -0
  436. package/python/lib/python3.13/shelve.py +250 -0
  437. package/python/lib/python3.13/shlex.py +345 -0
  438. package/python/lib/python3.13/shutil.py +1569 -0
  439. package/python/lib/python3.13/signal.py +94 -0
  440. package/python/lib/python3.13/site.py +773 -0
  441. package/python/lib/python3.13/smtplib.py +1123 -0
  442. package/python/lib/python3.13/socket.py +988 -0
  443. package/python/lib/python3.13/socketserver.py +863 -0
  444. package/python/lib/python3.13/sqlite3/__init__.py +70 -0
  445. package/python/lib/python3.13/sqlite3/__main__.py +139 -0
  446. package/python/lib/python3.13/sqlite3/dbapi2.py +108 -0
  447. package/python/lib/python3.13/sqlite3/dump.py +118 -0
  448. package/python/lib/python3.13/sre_compile.py +7 -0
  449. package/python/lib/python3.13/sre_constants.py +7 -0
  450. package/python/lib/python3.13/sre_parse.py +7 -0
  451. package/python/lib/python3.13/ssl.py +1541 -0
  452. package/python/lib/python3.13/stat.py +212 -0
  453. package/python/lib/python3.13/statistics.py +1817 -0
  454. package/python/lib/python3.13/string.py +314 -0
  455. package/python/lib/python3.13/stringprep.py +272 -0
  456. package/python/lib/python3.13/struct.py +15 -0
  457. package/python/lib/python3.13/subprocess.py +2258 -0
  458. package/python/lib/python3.13/symtable.py +414 -0
  459. package/python/lib/python3.13/sysconfig/__init__.py +734 -0
  460. package/python/lib/python3.13/sysconfig/__main__.py +248 -0
  461. package/python/lib/python3.13/tabnanny.py +340 -0
  462. package/python/lib/python3.13/tarfile.py +3136 -0
  463. package/python/lib/python3.13/tempfile.py +958 -0
  464. package/python/lib/python3.13/textwrap.py +497 -0
  465. package/python/lib/python3.13/this.py +28 -0
  466. package/python/lib/python3.13/threading.py +1602 -0
  467. package/python/lib/python3.13/timeit.py +381 -0
  468. package/python/lib/python3.13/token.py +141 -0
  469. package/python/lib/python3.13/tokenize.py +592 -0
  470. package/python/lib/python3.13/tomllib/__init__.py +10 -0
  471. package/python/lib/python3.13/tomllib/_parser.py +703 -0
  472. package/python/lib/python3.13/tomllib/_re.py +107 -0
  473. package/python/lib/python3.13/tomllib/_types.py +10 -0
  474. package/python/lib/python3.13/tomllib/mypy.ini +15 -0
  475. package/python/lib/python3.13/trace.py +754 -0
  476. package/python/lib/python3.13/traceback.py +1639 -0
  477. package/python/lib/python3.13/tracemalloc.py +560 -0
  478. package/python/lib/python3.13/tty.py +73 -0
  479. package/python/lib/python3.13/types.py +346 -0
  480. package/python/lib/python3.13/typing.py +3846 -0
  481. package/python/lib/python3.13/unittest/__init__.py +80 -0
  482. package/python/lib/python3.13/unittest/__main__.py +18 -0
  483. package/python/lib/python3.13/unittest/_log.py +86 -0
  484. package/python/lib/python3.13/unittest/async_case.py +146 -0
  485. package/python/lib/python3.13/unittest/case.py +1478 -0
  486. package/python/lib/python3.13/unittest/loader.py +460 -0
  487. package/python/lib/python3.13/unittest/main.py +280 -0
  488. package/python/lib/python3.13/unittest/mock.py +3189 -0
  489. package/python/lib/python3.13/unittest/result.py +256 -0
  490. package/python/lib/python3.13/unittest/runner.py +292 -0
  491. package/python/lib/python3.13/unittest/signals.py +71 -0
  492. package/python/lib/python3.13/unittest/suite.py +379 -0
  493. package/python/lib/python3.13/unittest/util.py +170 -0
  494. package/python/lib/python3.13/urllib/__init__.py +0 -0
  495. package/python/lib/python3.13/urllib/error.py +74 -0
  496. package/python/lib/python3.13/urllib/parse.py +1264 -0
  497. package/python/lib/python3.13/urllib/request.py +2796 -0
  498. package/python/lib/python3.13/urllib/response.py +84 -0
  499. package/python/lib/python3.13/urllib/robotparser.py +363 -0
  500. package/python/lib/python3.13/uuid.py +784 -0
  501. package/python/lib/python3.13/warnings.py +735 -0
  502. package/python/lib/python3.13/wave.py +665 -0
  503. package/python/lib/python3.13/weakref.py +674 -0
  504. package/python/lib/python3.13/webbrowser.py +724 -0
  505. package/python/lib/python3.13/wsgiref/__init__.py +25 -0
  506. package/python/lib/python3.13/wsgiref/handlers.py +575 -0
  507. package/python/lib/python3.13/wsgiref/headers.py +192 -0
  508. package/python/lib/python3.13/wsgiref/simple_server.py +161 -0
  509. package/python/lib/python3.13/wsgiref/types.py +54 -0
  510. package/python/lib/python3.13/wsgiref/util.py +159 -0
  511. package/python/lib/python3.13/wsgiref/validate.py +438 -0
  512. package/python/lib/python3.13/xml/__init__.py +20 -0
  513. package/python/lib/python3.13/xml/dom/NodeFilter.py +27 -0
  514. package/python/lib/python3.13/xml/dom/__init__.py +140 -0
  515. package/python/lib/python3.13/xml/dom/domreg.py +99 -0
  516. package/python/lib/python3.13/xml/dom/expatbuilder.py +962 -0
  517. package/python/lib/python3.13/xml/dom/minicompat.py +109 -0
  518. package/python/lib/python3.13/xml/dom/minidom.py +2024 -0
  519. package/python/lib/python3.13/xml/dom/pulldom.py +336 -0
  520. package/python/lib/python3.13/xml/dom/xmlbuilder.py +389 -0
  521. package/python/lib/python3.13/xml/etree/ElementInclude.py +186 -0
  522. package/python/lib/python3.13/xml/etree/ElementPath.py +430 -0
  523. package/python/lib/python3.13/xml/etree/ElementTree.py +2116 -0
  524. package/python/lib/python3.13/xml/etree/__init__.py +33 -0
  525. package/python/lib/python3.13/xml/etree/cElementTree.py +3 -0
  526. package/python/lib/python3.13/xml/parsers/__init__.py +8 -0
  527. package/python/lib/python3.13/xml/parsers/expat.py +8 -0
  528. package/python/lib/python3.13/xml/sax/__init__.py +94 -0
  529. package/python/lib/python3.13/xml/sax/_exceptions.py +127 -0
  530. package/python/lib/python3.13/xml/sax/expatreader.py +454 -0
  531. package/python/lib/python3.13/xml/sax/handler.py +387 -0
  532. package/python/lib/python3.13/xml/sax/saxutils.py +369 -0
  533. package/python/lib/python3.13/xml/sax/xmlreader.py +378 -0
  534. package/python/lib/python3.13/xmlrpc/__init__.py +1 -0
  535. package/python/lib/python3.13/xmlrpc/client.py +1503 -0
  536. package/python/lib/python3.13/xmlrpc/server.py +1002 -0
  537. package/python/lib/python3.13/zipapp.py +229 -0
  538. package/python/lib/python3.13/zipfile/__init__.py +2391 -0
  539. package/python/lib/python3.13/zipfile/__main__.py +4 -0
  540. package/python/lib/python3.13/zipfile/_path/__init__.py +452 -0
  541. package/python/lib/python3.13/zipfile/_path/glob.py +113 -0
  542. package/python/lib/python3.13/zipimport.py +803 -0
  543. package/python/lib/python3.13/zoneinfo/__init__.py +34 -0
  544. package/python/lib/python3.13/zoneinfo/_common.py +172 -0
  545. package/python/lib/python3.13/zoneinfo/_tzpath.py +189 -0
  546. package/python/lib/python3.13/zoneinfo/_zoneinfo.py +779 -0
  547. package/python/licenses/LICENSE.bdb.txt +126 -0
  548. package/python/licenses/LICENSE.bzip2.txt +37 -0
  549. package/python/licenses/LICENSE.cpython.txt +771 -0
  550. package/python/licenses/LICENSE.expat.txt +21 -0
  551. package/python/licenses/LICENSE.libX11.txt +942 -0
  552. package/python/licenses/LICENSE.libXau.txt +21 -0
  553. package/python/licenses/LICENSE.libedit.txt +29 -0
  554. package/python/licenses/LICENSE.libffi.txt +21 -0
  555. package/python/licenses/LICENSE.liblzma.txt +13 -0
  556. package/python/licenses/LICENSE.libuuid.txt +27 -0
  557. package/python/licenses/LICENSE.libxcb.txt +30 -0
  558. package/python/licenses/LICENSE.mpdecimal.txt +24 -0
  559. package/python/licenses/LICENSE.ncurses.txt +29 -0
  560. package/python/licenses/LICENSE.openssl-1.1.txt +124 -0
  561. package/python/licenses/LICENSE.openssl-3.txt +177 -0
  562. package/python/licenses/LICENSE.sqlite.txt +23 -0
  563. package/python/licenses/LICENSE.tcl.txt +40 -0
  564. package/python/licenses/LICENSE.tix.txt +54 -0
  565. package/python/licenses/LICENSE.zlib.txt +21 -0
@@ -0,0 +1,1078 @@
1
+ """Random variable generators.
2
+
3
+ bytes
4
+ -----
5
+ uniform bytes (values between 0 and 255)
6
+
7
+ integers
8
+ --------
9
+ uniform within range
10
+
11
+ sequences
12
+ ---------
13
+ pick random element
14
+ pick random sample
15
+ pick weighted random sample
16
+ generate random permutation
17
+
18
+ distributions on the real line:
19
+ ------------------------------
20
+ uniform
21
+ triangular
22
+ normal (Gaussian)
23
+ lognormal
24
+ negative exponential
25
+ gamma
26
+ beta
27
+ pareto
28
+ Weibull
29
+
30
+ distributions on the circle (angles 0 to 2pi)
31
+ ---------------------------------------------
32
+ circular uniform
33
+ von Mises
34
+
35
+ discrete distributions
36
+ ----------------------
37
+ binomial
38
+
39
+
40
+ General notes on the underlying Mersenne Twister core generator:
41
+
42
+ * The period is 2**19937-1.
43
+ * It is one of the most extensively tested generators in existence.
44
+ * The random() method is implemented in C, executes in a single Python step,
45
+ and is, therefore, threadsafe.
46
+
47
+ """
48
+
49
+ # Translated by Guido van Rossum from C source provided by
50
+ # Adrian Baddeley. Adapted by Raymond Hettinger for use with
51
+ # the Mersenne Twister and os.urandom() core generators.
52
+
53
+ from math import log as _log, exp as _exp, pi as _pi, e as _e, ceil as _ceil
54
+ from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin
55
+ from math import tau as TWOPI, floor as _floor, isfinite as _isfinite
56
+ from math import lgamma as _lgamma, fabs as _fabs, log2 as _log2
57
+ from os import urandom as _urandom
58
+ from _collections_abc import Sequence as _Sequence
59
+ from operator import index as _index
60
+ from itertools import accumulate as _accumulate, repeat as _repeat
61
+ from bisect import bisect as _bisect
62
+ import os as _os
63
+ import _random
64
+
65
+ __all__ = [
66
+ "Random",
67
+ "SystemRandom",
68
+ "betavariate",
69
+ "binomialvariate",
70
+ "choice",
71
+ "choices",
72
+ "expovariate",
73
+ "gammavariate",
74
+ "gauss",
75
+ "getrandbits",
76
+ "getstate",
77
+ "lognormvariate",
78
+ "normalvariate",
79
+ "paretovariate",
80
+ "randbytes",
81
+ "randint",
82
+ "random",
83
+ "randrange",
84
+ "sample",
85
+ "seed",
86
+ "setstate",
87
+ "shuffle",
88
+ "triangular",
89
+ "uniform",
90
+ "vonmisesvariate",
91
+ "weibullvariate",
92
+ ]
93
+
94
+ NV_MAGICCONST = 4 * _exp(-0.5) / _sqrt(2.0)
95
+ LOG4 = _log(4.0)
96
+ SG_MAGICCONST = 1.0 + _log(4.5)
97
+ BPF = 53 # Number of bits in a float
98
+ RECIP_BPF = 2 ** -BPF
99
+ _ONE = 1
100
+ _sha512 = None
101
+
102
+
103
+ class Random(_random.Random):
104
+ """Random number generator base class used by bound module functions.
105
+
106
+ Used to instantiate instances of Random to get generators that don't
107
+ share state.
108
+
109
+ Class Random can also be subclassed if you want to use a different basic
110
+ generator of your own devising: in that case, override the following
111
+ methods: random(), seed(), getstate(), and setstate().
112
+ Optionally, implement a getrandbits() method so that randrange()
113
+ can cover arbitrarily large ranges.
114
+
115
+ """
116
+
117
+ VERSION = 3 # used by getstate/setstate
118
+
119
+ def __init__(self, x=None):
120
+ """Initialize an instance.
121
+
122
+ Optional argument x controls seeding, as for Random.seed().
123
+ """
124
+
125
+ self.seed(x)
126
+ self.gauss_next = None
127
+
128
+ def seed(self, a=None, version=2):
129
+ """Initialize internal state from a seed.
130
+
131
+ The only supported seed types are None, int, float,
132
+ str, bytes, and bytearray.
133
+
134
+ None or no argument seeds from current time or from an operating
135
+ system specific randomness source if available.
136
+
137
+ If *a* is an int, all bits are used.
138
+
139
+ For version 2 (the default), all of the bits are used if *a* is a str,
140
+ bytes, or bytearray. For version 1 (provided for reproducing random
141
+ sequences from older versions of Python), the algorithm for str and
142
+ bytes generates a narrower range of seeds.
143
+
144
+ """
145
+
146
+ if version == 1 and isinstance(a, (str, bytes)):
147
+ a = a.decode('latin-1') if isinstance(a, bytes) else a
148
+ x = ord(a[0]) << 7 if a else 0
149
+ for c in map(ord, a):
150
+ x = ((1000003 * x) ^ c) & 0xFFFFFFFFFFFFFFFF
151
+ x ^= len(a)
152
+ a = -2 if x == -1 else x
153
+
154
+ elif version == 2 and isinstance(a, (str, bytes, bytearray)):
155
+ global _sha512
156
+ if _sha512 is None:
157
+ try:
158
+ # hashlib is pretty heavy to load, try lean internal
159
+ # module first
160
+ from _sha2 import sha512 as _sha512
161
+ except ImportError:
162
+ # fallback to official implementation
163
+ from hashlib import sha512 as _sha512
164
+
165
+ if isinstance(a, str):
166
+ a = a.encode()
167
+ a = int.from_bytes(a + _sha512(a).digest())
168
+
169
+ elif not isinstance(a, (type(None), int, float, str, bytes, bytearray)):
170
+ raise TypeError('The only supported seed types are:\n'
171
+ 'None, int, float, str, bytes, and bytearray.')
172
+
173
+ super().seed(a)
174
+ self.gauss_next = None
175
+
176
+ def getstate(self):
177
+ """Return internal state; can be passed to setstate() later."""
178
+ return self.VERSION, super().getstate(), self.gauss_next
179
+
180
+ def setstate(self, state):
181
+ """Restore internal state from object returned by getstate()."""
182
+ version = state[0]
183
+ if version == 3:
184
+ version, internalstate, self.gauss_next = state
185
+ super().setstate(internalstate)
186
+ elif version == 2:
187
+ version, internalstate, self.gauss_next = state
188
+ # In version 2, the state was saved as signed ints, which causes
189
+ # inconsistencies between 32/64-bit systems. The state is
190
+ # really unsigned 32-bit ints, so we convert negative ints from
191
+ # version 2 to positive longs for version 3.
192
+ try:
193
+ internalstate = tuple(x % (2 ** 32) for x in internalstate)
194
+ except ValueError as e:
195
+ raise TypeError from e
196
+ super().setstate(internalstate)
197
+ else:
198
+ raise ValueError("state with version %s passed to "
199
+ "Random.setstate() of version %s" %
200
+ (version, self.VERSION))
201
+
202
+
203
+ ## -------------------------------------------------------
204
+ ## ---- Methods below this point do not need to be overridden or extended
205
+ ## ---- when subclassing for the purpose of using a different core generator.
206
+
207
+
208
+ ## -------------------- pickle support -------------------
209
+
210
+ # Issue 17489: Since __reduce__ was defined to fix #759889 this is no
211
+ # longer called; we leave it here because it has been here since random was
212
+ # rewritten back in 2001 and why risk breaking something.
213
+ def __getstate__(self): # for pickle
214
+ return self.getstate()
215
+
216
+ def __setstate__(self, state): # for pickle
217
+ self.setstate(state)
218
+
219
+ def __reduce__(self):
220
+ return self.__class__, (), self.getstate()
221
+
222
+
223
+ ## ---- internal support method for evenly distributed integers ----
224
+
225
+ def __init_subclass__(cls, /, **kwargs):
226
+ """Control how subclasses generate random integers.
227
+
228
+ The algorithm a subclass can use depends on the random() and/or
229
+ getrandbits() implementation available to it and determines
230
+ whether it can generate random integers from arbitrarily large
231
+ ranges.
232
+ """
233
+
234
+ for c in cls.__mro__:
235
+ if '_randbelow' in c.__dict__:
236
+ # just inherit it
237
+ break
238
+ if 'getrandbits' in c.__dict__:
239
+ cls._randbelow = cls._randbelow_with_getrandbits
240
+ break
241
+ if 'random' in c.__dict__:
242
+ cls._randbelow = cls._randbelow_without_getrandbits
243
+ break
244
+
245
+ def _randbelow_with_getrandbits(self, n):
246
+ "Return a random int in the range [0,n). Defined for n > 0."
247
+
248
+ getrandbits = self.getrandbits
249
+ k = n.bit_length()
250
+ r = getrandbits(k) # 0 <= r < 2**k
251
+ while r >= n:
252
+ r = getrandbits(k)
253
+ return r
254
+
255
+ def _randbelow_without_getrandbits(self, n, maxsize=1<<BPF):
256
+ """Return a random int in the range [0,n). Defined for n > 0.
257
+
258
+ The implementation does not use getrandbits, but only random.
259
+ """
260
+
261
+ random = self.random
262
+ if n >= maxsize:
263
+ from warnings import warn
264
+ warn("Underlying random() generator does not supply \n"
265
+ "enough bits to choose from a population range this large.\n"
266
+ "To remove the range limitation, add a getrandbits() method.")
267
+ return _floor(random() * n)
268
+ rem = maxsize % n
269
+ limit = (maxsize - rem) / maxsize # int(limit * maxsize) % n == 0
270
+ r = random()
271
+ while r >= limit:
272
+ r = random()
273
+ return _floor(r * maxsize) % n
274
+
275
+ _randbelow = _randbelow_with_getrandbits
276
+
277
+
278
+ ## --------------------------------------------------------
279
+ ## ---- Methods below this point generate custom distributions
280
+ ## ---- based on the methods defined above. They do not
281
+ ## ---- directly touch the underlying generator and only
282
+ ## ---- access randomness through the methods: random(),
283
+ ## ---- getrandbits(), or _randbelow().
284
+
285
+
286
+ ## -------------------- bytes methods ---------------------
287
+
288
+ def randbytes(self, n):
289
+ """Generate n random bytes."""
290
+ return self.getrandbits(n * 8).to_bytes(n, 'little')
291
+
292
+
293
+ ## -------------------- integer methods -------------------
294
+
295
+ def randrange(self, start, stop=None, step=_ONE):
296
+ """Choose a random item from range(stop) or range(start, stop[, step]).
297
+
298
+ Roughly equivalent to ``choice(range(start, stop, step))`` but
299
+ supports arbitrarily large ranges and is optimized for common cases.
300
+
301
+ """
302
+
303
+ # This code is a bit messy to make it fast for the
304
+ # common case while still doing adequate error checking.
305
+ istart = _index(start)
306
+ if stop is None:
307
+ # We don't check for "step != 1" because it hasn't been
308
+ # type checked and converted to an integer yet.
309
+ if step is not _ONE:
310
+ raise TypeError("Missing a non-None stop argument")
311
+ if istart > 0:
312
+ return self._randbelow(istart)
313
+ raise ValueError("empty range for randrange()")
314
+
315
+ # Stop argument supplied.
316
+ istop = _index(stop)
317
+ width = istop - istart
318
+ istep = _index(step)
319
+ # Fast path.
320
+ if istep == 1:
321
+ if width > 0:
322
+ return istart + self._randbelow(width)
323
+ raise ValueError(f"empty range in randrange({start}, {stop})")
324
+
325
+ # Non-unit step argument supplied.
326
+ if istep > 0:
327
+ n = (width + istep - 1) // istep
328
+ elif istep < 0:
329
+ n = (width + istep + 1) // istep
330
+ else:
331
+ raise ValueError("zero step for randrange()")
332
+ if n <= 0:
333
+ raise ValueError(f"empty range in randrange({start}, {stop}, {step})")
334
+ return istart + istep * self._randbelow(n)
335
+
336
+ def randint(self, a, b):
337
+ """Return random integer in range [a, b], including both end points.
338
+ """
339
+
340
+ return self.randrange(a, b+1)
341
+
342
+
343
+ ## -------------------- sequence methods -------------------
344
+
345
+ def choice(self, seq):
346
+ """Choose a random element from a non-empty sequence."""
347
+
348
+ # As an accommodation for NumPy, we don't use "if not seq"
349
+ # because bool(numpy.array()) raises a ValueError.
350
+ if not len(seq):
351
+ raise IndexError('Cannot choose from an empty sequence')
352
+ return seq[self._randbelow(len(seq))]
353
+
354
+ def shuffle(self, x):
355
+ """Shuffle list x in place, and return None."""
356
+
357
+ randbelow = self._randbelow
358
+ for i in reversed(range(1, len(x))):
359
+ # pick an element in x[:i+1] with which to exchange x[i]
360
+ j = randbelow(i + 1)
361
+ x[i], x[j] = x[j], x[i]
362
+
363
+ def sample(self, population, k, *, counts=None):
364
+ """Chooses k unique random elements from a population sequence.
365
+
366
+ Returns a new list containing elements from the population while
367
+ leaving the original population unchanged. The resulting list is
368
+ in selection order so that all sub-slices will also be valid random
369
+ samples. This allows raffle winners (the sample) to be partitioned
370
+ into grand prize and second place winners (the subslices).
371
+
372
+ Members of the population need not be hashable or unique. If the
373
+ population contains repeats, then each occurrence is a possible
374
+ selection in the sample.
375
+
376
+ Repeated elements can be specified one at a time or with the optional
377
+ counts parameter. For example:
378
+
379
+ sample(['red', 'blue'], counts=[4, 2], k=5)
380
+
381
+ is equivalent to:
382
+
383
+ sample(['red', 'red', 'red', 'red', 'blue', 'blue'], k=5)
384
+
385
+ To choose a sample from a range of integers, use range() for the
386
+ population argument. This is especially fast and space efficient
387
+ for sampling from a large population:
388
+
389
+ sample(range(10000000), 60)
390
+
391
+ """
392
+
393
+ # Sampling without replacement entails tracking either potential
394
+ # selections (the pool) in a list or previous selections in a set.
395
+
396
+ # When the number of selections is small compared to the
397
+ # population, then tracking selections is efficient, requiring
398
+ # only a small set and an occasional reselection. For
399
+ # a larger number of selections, the pool tracking method is
400
+ # preferred since the list takes less space than the
401
+ # set and it doesn't suffer from frequent reselections.
402
+
403
+ # The number of calls to _randbelow() is kept at or near k, the
404
+ # theoretical minimum. This is important because running time
405
+ # is dominated by _randbelow() and because it extracts the
406
+ # least entropy from the underlying random number generators.
407
+
408
+ # Memory requirements are kept to the smaller of a k-length
409
+ # set or an n-length list.
410
+
411
+ # There are other sampling algorithms that do not require
412
+ # auxiliary memory, but they were rejected because they made
413
+ # too many calls to _randbelow(), making them slower and
414
+ # causing them to eat more entropy than necessary.
415
+
416
+ if not isinstance(population, _Sequence):
417
+ raise TypeError("Population must be a sequence. "
418
+ "For dicts or sets, use sorted(d).")
419
+ n = len(population)
420
+ if counts is not None:
421
+ cum_counts = list(_accumulate(counts))
422
+ if len(cum_counts) != n:
423
+ raise ValueError('The number of counts does not match the population')
424
+ total = cum_counts.pop() if cum_counts else 0
425
+ if not isinstance(total, int):
426
+ raise TypeError('Counts must be integers')
427
+ if total < 0:
428
+ raise ValueError('Counts must be non-negative')
429
+ selections = self.sample(range(total), k=k)
430
+ bisect = _bisect
431
+ return [population[bisect(cum_counts, s)] for s in selections]
432
+ randbelow = self._randbelow
433
+ if not 0 <= k <= n:
434
+ raise ValueError("Sample larger than population or is negative")
435
+ result = [None] * k
436
+ setsize = 21 # size of a small set minus size of an empty list
437
+ if k > 5:
438
+ setsize += 4 ** _ceil(_log(k * 3, 4)) # table size for big sets
439
+ if n <= setsize:
440
+ # An n-length list is smaller than a k-length set.
441
+ # Invariant: non-selected at pool[0 : n-i]
442
+ pool = list(population)
443
+ for i in range(k):
444
+ j = randbelow(n - i)
445
+ result[i] = pool[j]
446
+ pool[j] = pool[n - i - 1] # move non-selected item into vacancy
447
+ else:
448
+ selected = set()
449
+ selected_add = selected.add
450
+ for i in range(k):
451
+ j = randbelow(n)
452
+ while j in selected:
453
+ j = randbelow(n)
454
+ selected_add(j)
455
+ result[i] = population[j]
456
+ return result
457
+
458
+ def choices(self, population, weights=None, *, cum_weights=None, k=1):
459
+ """Return a k sized list of population elements chosen with replacement.
460
+
461
+ If the relative weights or cumulative weights are not specified,
462
+ the selections are made with equal probability.
463
+
464
+ """
465
+ random = self.random
466
+ n = len(population)
467
+ if cum_weights is None:
468
+ if weights is None:
469
+ floor = _floor
470
+ n += 0.0 # convert to float for a small speed improvement
471
+ return [population[floor(random() * n)] for i in _repeat(None, k)]
472
+ try:
473
+ cum_weights = list(_accumulate(weights))
474
+ except TypeError:
475
+ if not isinstance(weights, int):
476
+ raise
477
+ k = weights
478
+ raise TypeError(
479
+ f'The number of choices must be a keyword argument: {k=}'
480
+ ) from None
481
+ elif weights is not None:
482
+ raise TypeError('Cannot specify both weights and cumulative weights')
483
+ if len(cum_weights) != n:
484
+ raise ValueError('The number of weights does not match the population')
485
+ total = cum_weights[-1] + 0.0 # convert to float
486
+ if total <= 0.0:
487
+ raise ValueError('Total of weights must be greater than zero')
488
+ if not _isfinite(total):
489
+ raise ValueError('Total of weights must be finite')
490
+ bisect = _bisect
491
+ hi = n - 1
492
+ return [population[bisect(cum_weights, random() * total, 0, hi)]
493
+ for i in _repeat(None, k)]
494
+
495
+
496
+ ## -------------------- real-valued distributions -------------------
497
+
498
+ def uniform(self, a, b):
499
+ """Get a random number in the range [a, b) or [a, b] depending on rounding.
500
+
501
+ The mean (expected value) and variance of the random variable are:
502
+
503
+ E[X] = (a + b) / 2
504
+ Var[X] = (b - a) ** 2 / 12
505
+
506
+ """
507
+ return a + (b - a) * self.random()
508
+
509
+ def triangular(self, low=0.0, high=1.0, mode=None):
510
+ """Triangular distribution.
511
+
512
+ Continuous distribution bounded by given lower and upper limits,
513
+ and having a given mode value in-between.
514
+
515
+ http://en.wikipedia.org/wiki/Triangular_distribution
516
+
517
+ The mean (expected value) and variance of the random variable are:
518
+
519
+ E[X] = (low + high + mode) / 3
520
+ Var[X] = (low**2 + high**2 + mode**2 - low*high - low*mode - high*mode) / 18
521
+
522
+ """
523
+ u = self.random()
524
+ try:
525
+ c = 0.5 if mode is None else (mode - low) / (high - low)
526
+ except ZeroDivisionError:
527
+ return low
528
+ if u > c:
529
+ u = 1.0 - u
530
+ c = 1.0 - c
531
+ low, high = high, low
532
+ return low + (high - low) * _sqrt(u * c)
533
+
534
+ def normalvariate(self, mu=0.0, sigma=1.0):
535
+ """Normal distribution.
536
+
537
+ mu is the mean, and sigma is the standard deviation.
538
+
539
+ """
540
+ # Uses Kinderman and Monahan method. Reference: Kinderman,
541
+ # A.J. and Monahan, J.F., "Computer generation of random
542
+ # variables using the ratio of uniform deviates", ACM Trans
543
+ # Math Software, 3, (1977), pp257-260.
544
+
545
+ random = self.random
546
+ while True:
547
+ u1 = random()
548
+ u2 = 1.0 - random()
549
+ z = NV_MAGICCONST * (u1 - 0.5) / u2
550
+ zz = z * z / 4.0
551
+ if zz <= -_log(u2):
552
+ break
553
+ return mu + z * sigma
554
+
555
+ def gauss(self, mu=0.0, sigma=1.0):
556
+ """Gaussian distribution.
557
+
558
+ mu is the mean, and sigma is the standard deviation. This is
559
+ slightly faster than the normalvariate() function.
560
+
561
+ Not thread-safe without a lock around calls.
562
+
563
+ """
564
+ # When x and y are two variables from [0, 1), uniformly
565
+ # distributed, then
566
+ #
567
+ # cos(2*pi*x)*sqrt(-2*log(1-y))
568
+ # sin(2*pi*x)*sqrt(-2*log(1-y))
569
+ #
570
+ # are two *independent* variables with normal distribution
571
+ # (mu = 0, sigma = 1).
572
+ # (Lambert Meertens)
573
+ # (corrected version; bug discovered by Mike Miller, fixed by LM)
574
+
575
+ # Multithreading note: When two threads call this function
576
+ # simultaneously, it is possible that they will receive the
577
+ # same return value. The window is very small though. To
578
+ # avoid this, you have to use a lock around all calls. (I
579
+ # didn't want to slow this down in the serial case by using a
580
+ # lock here.)
581
+
582
+ random = self.random
583
+ z = self.gauss_next
584
+ self.gauss_next = None
585
+ if z is None:
586
+ x2pi = random() * TWOPI
587
+ g2rad = _sqrt(-2.0 * _log(1.0 - random()))
588
+ z = _cos(x2pi) * g2rad
589
+ self.gauss_next = _sin(x2pi) * g2rad
590
+
591
+ return mu + z * sigma
592
+
593
+ def lognormvariate(self, mu, sigma):
594
+ """Log normal distribution.
595
+
596
+ If you take the natural logarithm of this distribution, you'll get a
597
+ normal distribution with mean mu and standard deviation sigma.
598
+ mu can have any value, and sigma must be greater than zero.
599
+
600
+ """
601
+ return _exp(self.normalvariate(mu, sigma))
602
+
603
+ def expovariate(self, lambd=1.0):
604
+ """Exponential distribution.
605
+
606
+ lambd is 1.0 divided by the desired mean. It should be
607
+ nonzero. (The parameter would be called "lambda", but that is
608
+ a reserved word in Python.) Returned values range from 0 to
609
+ positive infinity if lambd is positive, and from negative
610
+ infinity to 0 if lambd is negative.
611
+
612
+ The mean (expected value) and variance of the random variable are:
613
+
614
+ E[X] = 1 / lambd
615
+ Var[X] = 1 / lambd ** 2
616
+
617
+ """
618
+ # we use 1-random() instead of random() to preclude the
619
+ # possibility of taking the log of zero.
620
+
621
+ return -_log(1.0 - self.random()) / lambd
622
+
623
+ def vonmisesvariate(self, mu, kappa):
624
+ """Circular data distribution.
625
+
626
+ mu is the mean angle, expressed in radians between 0 and 2*pi, and
627
+ kappa is the concentration parameter, which must be greater than or
628
+ equal to zero. If kappa is equal to zero, this distribution reduces
629
+ to a uniform random angle over the range 0 to 2*pi.
630
+
631
+ """
632
+ # Based upon an algorithm published in: Fisher, N.I.,
633
+ # "Statistical Analysis of Circular Data", Cambridge
634
+ # University Press, 1993.
635
+
636
+ # Thanks to Magnus Kessler for a correction to the
637
+ # implementation of step 4.
638
+
639
+ random = self.random
640
+ if kappa <= 1e-6:
641
+ return TWOPI * random()
642
+
643
+ s = 0.5 / kappa
644
+ r = s + _sqrt(1.0 + s * s)
645
+
646
+ while True:
647
+ u1 = random()
648
+ z = _cos(_pi * u1)
649
+
650
+ d = z / (r + z)
651
+ u2 = random()
652
+ if u2 < 1.0 - d * d or u2 <= (1.0 - d) * _exp(d):
653
+ break
654
+
655
+ q = 1.0 / r
656
+ f = (q + z) / (1.0 + q * z)
657
+ u3 = random()
658
+ if u3 > 0.5:
659
+ theta = (mu + _acos(f)) % TWOPI
660
+ else:
661
+ theta = (mu - _acos(f)) % TWOPI
662
+
663
+ return theta
664
+
665
+ def gammavariate(self, alpha, beta):
666
+ """Gamma distribution. Not the gamma function!
667
+
668
+ Conditions on the parameters are alpha > 0 and beta > 0.
669
+
670
+ The probability distribution function is:
671
+
672
+ x ** (alpha - 1) * math.exp(-x / beta)
673
+ pdf(x) = --------------------------------------
674
+ math.gamma(alpha) * beta ** alpha
675
+
676
+ The mean (expected value) and variance of the random variable are:
677
+
678
+ E[X] = alpha * beta
679
+ Var[X] = alpha * beta ** 2
680
+
681
+ """
682
+
683
+ # Warning: a few older sources define the gamma distribution in terms
684
+ # of alpha > -1.0
685
+ if alpha <= 0.0 or beta <= 0.0:
686
+ raise ValueError('gammavariate: alpha and beta must be > 0.0')
687
+
688
+ random = self.random
689
+ if alpha > 1.0:
690
+
691
+ # Uses R.C.H. Cheng, "The generation of Gamma
692
+ # variables with non-integral shape parameters",
693
+ # Applied Statistics, (1977), 26, No. 1, p71-74
694
+
695
+ ainv = _sqrt(2.0 * alpha - 1.0)
696
+ bbb = alpha - LOG4
697
+ ccc = alpha + ainv
698
+
699
+ while True:
700
+ u1 = random()
701
+ if not 1e-7 < u1 < 0.9999999:
702
+ continue
703
+ u2 = 1.0 - random()
704
+ v = _log(u1 / (1.0 - u1)) / ainv
705
+ x = alpha * _exp(v)
706
+ z = u1 * u1 * u2
707
+ r = bbb + ccc * v - x
708
+ if r + SG_MAGICCONST - 4.5 * z >= 0.0 or r >= _log(z):
709
+ return x * beta
710
+
711
+ elif alpha == 1.0:
712
+ # expovariate(1/beta)
713
+ return -_log(1.0 - random()) * beta
714
+
715
+ else:
716
+ # alpha is between 0 and 1 (exclusive)
717
+ # Uses ALGORITHM GS of Statistical Computing - Kennedy & Gentle
718
+ while True:
719
+ u = random()
720
+ b = (_e + alpha) / _e
721
+ p = b * u
722
+ if p <= 1.0:
723
+ x = p ** (1.0 / alpha)
724
+ else:
725
+ x = -_log((b - p) / alpha)
726
+ u1 = random()
727
+ if p > 1.0:
728
+ if u1 <= x ** (alpha - 1.0):
729
+ break
730
+ elif u1 <= _exp(-x):
731
+ break
732
+ return x * beta
733
+
734
+ def betavariate(self, alpha, beta):
735
+ """Beta distribution.
736
+
737
+ Conditions on the parameters are alpha > 0 and beta > 0.
738
+ Returned values range between 0 and 1.
739
+
740
+ The mean (expected value) and variance of the random variable are:
741
+
742
+ E[X] = alpha / (alpha + beta)
743
+ Var[X] = alpha * beta / ((alpha + beta)**2 * (alpha + beta + 1))
744
+
745
+ """
746
+ ## See
747
+ ## http://mail.python.org/pipermail/python-bugs-list/2001-January/003752.html
748
+ ## for Ivan Frohne's insightful analysis of why the original implementation:
749
+ ##
750
+ ## def betavariate(self, alpha, beta):
751
+ ## # Discrete Event Simulation in C, pp 87-88.
752
+ ##
753
+ ## y = self.expovariate(alpha)
754
+ ## z = self.expovariate(1.0/beta)
755
+ ## return z/(y+z)
756
+ ##
757
+ ## was dead wrong, and how it probably got that way.
758
+
759
+ # This version due to Janne Sinkkonen, and matches all the std
760
+ # texts (e.g., Knuth Vol 2 Ed 3 pg 134 "the beta distribution").
761
+ y = self.gammavariate(alpha, 1.0)
762
+ if y:
763
+ return y / (y + self.gammavariate(beta, 1.0))
764
+ return 0.0
765
+
766
+ def paretovariate(self, alpha):
767
+ """Pareto distribution. alpha is the shape parameter."""
768
+ # Jain, pg. 495
769
+
770
+ u = 1.0 - self.random()
771
+ return u ** (-1.0 / alpha)
772
+
773
+ def weibullvariate(self, alpha, beta):
774
+ """Weibull distribution.
775
+
776
+ alpha is the scale parameter and beta is the shape parameter.
777
+
778
+ """
779
+ # Jain, pg. 499; bug fix courtesy Bill Arms
780
+
781
+ u = 1.0 - self.random()
782
+ return alpha * (-_log(u)) ** (1.0 / beta)
783
+
784
+
785
+ ## -------------------- discrete distributions ---------------------
786
+
787
+ def binomialvariate(self, n=1, p=0.5):
788
+ """Binomial random variable.
789
+
790
+ Gives the number of successes for *n* independent trials
791
+ with the probability of success in each trial being *p*:
792
+
793
+ sum(random() < p for i in range(n))
794
+
795
+ Returns an integer in the range: 0 <= X <= n
796
+
797
+ The mean (expected value) and variance of the random variable are:
798
+
799
+ E[X] = n * p
800
+ Var[x] = n * p * (1 - p)
801
+
802
+ """
803
+ # Error check inputs and handle edge cases
804
+ if n < 0:
805
+ raise ValueError("n must be non-negative")
806
+ if p <= 0.0 or p >= 1.0:
807
+ if p == 0.0:
808
+ return 0
809
+ if p == 1.0:
810
+ return n
811
+ raise ValueError("p must be in the range 0.0 <= p <= 1.0")
812
+
813
+ random = self.random
814
+
815
+ # Fast path for a common case
816
+ if n == 1:
817
+ return _index(random() < p)
818
+
819
+ # Exploit symmetry to establish: p <= 0.5
820
+ if p > 0.5:
821
+ return n - self.binomialvariate(n, 1.0 - p)
822
+
823
+ if n * p < 10.0:
824
+ # BG: Geometric method by Devroye with running time of O(np).
825
+ # https://dl.acm.org/doi/pdf/10.1145/42372.42381
826
+ x = y = 0
827
+ c = _log2(1.0 - p)
828
+ if not c:
829
+ return x
830
+ while True:
831
+ try:
832
+ y += _floor(_log2(random()) / c) + 1
833
+ except ValueError:
834
+ # Reject case where random() returned 0.0
835
+ continue
836
+ if y > n:
837
+ return x
838
+ x += 1
839
+
840
+ # BTRS: Transformed rejection with squeeze method by Wolfgang Hörmann
841
+ # https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.47.8407&rep=rep1&type=pdf
842
+ assert n*p >= 10.0 and p <= 0.5
843
+ setup_complete = False
844
+
845
+ spq = _sqrt(n * p * (1.0 - p)) # Standard deviation of the distribution
846
+ b = 1.15 + 2.53 * spq
847
+ a = -0.0873 + 0.0248 * b + 0.01 * p
848
+ c = n * p + 0.5
849
+ vr = 0.92 - 4.2 / b
850
+
851
+ while True:
852
+
853
+ u = random()
854
+ u -= 0.5
855
+ us = 0.5 - _fabs(u)
856
+ try:
857
+ k = _floor((2.0 * a / us + b) * u + c)
858
+ except ZeroDivisionError:
859
+ # Reject case where random() returned 0.0
860
+ continue
861
+ if k < 0 or k > n:
862
+ continue
863
+
864
+ # The early-out "squeeze" test substantially reduces
865
+ # the number of acceptance condition evaluations.
866
+ v = random()
867
+ if us >= 0.07 and v <= vr:
868
+ return k
869
+
870
+ # Acceptance-rejection test.
871
+ # Note, the original paper erroneously omits the call to log(v)
872
+ # when comparing to the log of the rescaled binomial distribution.
873
+ if not setup_complete:
874
+ alpha = (2.83 + 5.1 / b) * spq
875
+ lpq = _log(p / (1.0 - p))
876
+ m = _floor((n + 1) * p) # Mode of the distribution
877
+ h = _lgamma(m + 1) + _lgamma(n - m + 1)
878
+ setup_complete = True # Only needs to be done once
879
+ v *= alpha / (a / (us * us) + b)
880
+ if _log(v) <= h - _lgamma(k + 1) - _lgamma(n - k + 1) + (k - m) * lpq:
881
+ return k
882
+
883
+
884
+ ## ------------------------------------------------------------------
885
+ ## --------------- Operating System Random Source ------------------
886
+
887
+
888
+ class SystemRandom(Random):
889
+ """Alternate random number generator using sources provided
890
+ by the operating system (such as /dev/urandom on Unix or
891
+ CryptGenRandom on Windows).
892
+
893
+ Not available on all systems (see os.urandom() for details).
894
+
895
+ """
896
+
897
+ def random(self):
898
+ """Get the next random number in the range 0.0 <= X < 1.0."""
899
+ return (int.from_bytes(_urandom(7)) >> 3) * RECIP_BPF
900
+
901
+ def getrandbits(self, k):
902
+ """getrandbits(k) -> x. Generates an int with k random bits."""
903
+ if k < 0:
904
+ raise ValueError('number of bits must be non-negative')
905
+ numbytes = (k + 7) // 8 # bits / 8 and rounded up
906
+ x = int.from_bytes(_urandom(numbytes))
907
+ return x >> (numbytes * 8 - k) # trim excess bits
908
+
909
+ def randbytes(self, n):
910
+ """Generate n random bytes."""
911
+ # os.urandom(n) fails with ValueError for n < 0
912
+ # and returns an empty bytes string for n == 0.
913
+ return _urandom(n)
914
+
915
+ def seed(self, *args, **kwds):
916
+ "Stub method. Not used for a system random number generator."
917
+ return None
918
+
919
+ def _notimplemented(self, *args, **kwds):
920
+ "Method should not be called for a system random number generator."
921
+ raise NotImplementedError('System entropy source does not have state.')
922
+ getstate = setstate = _notimplemented
923
+
924
+
925
+ # ----------------------------------------------------------------------
926
+ # Create one instance, seeded from current time, and export its methods
927
+ # as module-level functions. The functions share state across all uses
928
+ # (both in the user's code and in the Python libraries), but that's fine
929
+ # for most programs and is easier for the casual user than making them
930
+ # instantiate their own Random() instance.
931
+
932
+ _inst = Random()
933
+ seed = _inst.seed
934
+ random = _inst.random
935
+ uniform = _inst.uniform
936
+ triangular = _inst.triangular
937
+ randint = _inst.randint
938
+ choice = _inst.choice
939
+ randrange = _inst.randrange
940
+ sample = _inst.sample
941
+ shuffle = _inst.shuffle
942
+ choices = _inst.choices
943
+ normalvariate = _inst.normalvariate
944
+ lognormvariate = _inst.lognormvariate
945
+ expovariate = _inst.expovariate
946
+ vonmisesvariate = _inst.vonmisesvariate
947
+ gammavariate = _inst.gammavariate
948
+ gauss = _inst.gauss
949
+ betavariate = _inst.betavariate
950
+ binomialvariate = _inst.binomialvariate
951
+ paretovariate = _inst.paretovariate
952
+ weibullvariate = _inst.weibullvariate
953
+ getstate = _inst.getstate
954
+ setstate = _inst.setstate
955
+ getrandbits = _inst.getrandbits
956
+ randbytes = _inst.randbytes
957
+
958
+
959
+ ## ------------------------------------------------------
960
+ ## ----------------- test program -----------------------
961
+
962
+ def _test_generator(n, func, args):
963
+ from statistics import stdev, fmean as mean
964
+ from time import perf_counter
965
+
966
+ t0 = perf_counter()
967
+ data = [func(*args) for i in _repeat(None, n)]
968
+ t1 = perf_counter()
969
+
970
+ xbar = mean(data)
971
+ sigma = stdev(data, xbar)
972
+ low = min(data)
973
+ high = max(data)
974
+
975
+ print(f'{t1 - t0:.3f} sec, {n} times {func.__name__}{args!r}')
976
+ print('avg %g, stddev %g, min %g, max %g\n' % (xbar, sigma, low, high))
977
+
978
+
979
+ def _test(N=10_000):
980
+ _test_generator(N, random, ())
981
+ _test_generator(N, normalvariate, (0.0, 1.0))
982
+ _test_generator(N, lognormvariate, (0.0, 1.0))
983
+ _test_generator(N, vonmisesvariate, (0.0, 1.0))
984
+ _test_generator(N, binomialvariate, (15, 0.60))
985
+ _test_generator(N, binomialvariate, (100, 0.75))
986
+ _test_generator(N, gammavariate, (0.01, 1.0))
987
+ _test_generator(N, gammavariate, (0.1, 1.0))
988
+ _test_generator(N, gammavariate, (0.1, 2.0))
989
+ _test_generator(N, gammavariate, (0.5, 1.0))
990
+ _test_generator(N, gammavariate, (0.9, 1.0))
991
+ _test_generator(N, gammavariate, (1.0, 1.0))
992
+ _test_generator(N, gammavariate, (2.0, 1.0))
993
+ _test_generator(N, gammavariate, (20.0, 1.0))
994
+ _test_generator(N, gammavariate, (200.0, 1.0))
995
+ _test_generator(N, gauss, (0.0, 1.0))
996
+ _test_generator(N, betavariate, (3.0, 3.0))
997
+ _test_generator(N, triangular, (0.0, 1.0, 1.0 / 3.0))
998
+
999
+
1000
+ ## ------------------------------------------------------
1001
+ ## ------------------ fork support ---------------------
1002
+
1003
+ if hasattr(_os, "fork"):
1004
+ _os.register_at_fork(after_in_child=_inst.seed)
1005
+
1006
+
1007
+ # ------------------------------------------------------
1008
+ # -------------- command-line interface ----------------
1009
+
1010
+
1011
+ def _parse_args(arg_list: list[str] | None):
1012
+ import argparse
1013
+ parser = argparse.ArgumentParser(
1014
+ formatter_class=argparse.RawTextHelpFormatter)
1015
+ group = parser.add_mutually_exclusive_group()
1016
+ group.add_argument(
1017
+ "-c", "--choice", nargs="+",
1018
+ help="print a random choice")
1019
+ group.add_argument(
1020
+ "-i", "--integer", type=int, metavar="N",
1021
+ help="print a random integer between 1 and N inclusive")
1022
+ group.add_argument(
1023
+ "-f", "--float", type=float, metavar="N",
1024
+ help="print a random floating-point number between 0 and N inclusive")
1025
+ group.add_argument(
1026
+ "--test", type=int, const=10_000, nargs="?",
1027
+ help=argparse.SUPPRESS)
1028
+ parser.add_argument("input", nargs="*",
1029
+ help="""\
1030
+ if no options given, output depends on the input
1031
+ string or multiple: same as --choice
1032
+ integer: same as --integer
1033
+ float: same as --float""")
1034
+ args = parser.parse_args(arg_list)
1035
+ return args, parser.format_help()
1036
+
1037
+
1038
+ def main(arg_list: list[str] | None = None) -> int | str:
1039
+ args, help_text = _parse_args(arg_list)
1040
+
1041
+ # Explicit arguments
1042
+ if args.choice:
1043
+ return choice(args.choice)
1044
+
1045
+ if args.integer is not None:
1046
+ return randint(1, args.integer)
1047
+
1048
+ if args.float is not None:
1049
+ return uniform(0, args.float)
1050
+
1051
+ if args.test:
1052
+ _test(args.test)
1053
+ return ""
1054
+
1055
+ # No explicit argument, select based on input
1056
+ if len(args.input) == 1:
1057
+ val = args.input[0]
1058
+ try:
1059
+ # Is it an integer?
1060
+ val = int(val)
1061
+ return randint(1, val)
1062
+ except ValueError:
1063
+ try:
1064
+ # Is it a float?
1065
+ val = float(val)
1066
+ return uniform(0, val)
1067
+ except ValueError:
1068
+ # Split in case of space-separated string: "a b c"
1069
+ return choice(val.split())
1070
+
1071
+ if len(args.input) >= 2:
1072
+ return choice(args.input)
1073
+
1074
+ return help_text
1075
+
1076
+
1077
+ if __name__ == '__main__':
1078
+ print(main())