wandb 0.18.2__py3-none-musllinux_1_2_x86_64.whl

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 (827) hide show
  1. package_readme.md +89 -0
  2. wandb/__init__.py +245 -0
  3. wandb/__init__.pyi +1139 -0
  4. wandb/__main__.py +3 -0
  5. wandb/_globals.py +19 -0
  6. wandb/agents/__init__.py +0 -0
  7. wandb/agents/pyagent.py +363 -0
  8. wandb/analytics/__init__.py +3 -0
  9. wandb/analytics/sentry.py +266 -0
  10. wandb/apis/__init__.py +48 -0
  11. wandb/apis/attrs.py +40 -0
  12. wandb/apis/importers/__init__.py +1 -0
  13. wandb/apis/importers/internals/internal.py +385 -0
  14. wandb/apis/importers/internals/protocols.py +99 -0
  15. wandb/apis/importers/internals/util.py +78 -0
  16. wandb/apis/importers/mlflow.py +254 -0
  17. wandb/apis/importers/validation.py +108 -0
  18. wandb/apis/importers/wandb.py +1603 -0
  19. wandb/apis/internal.py +232 -0
  20. wandb/apis/normalize.py +89 -0
  21. wandb/apis/paginator.py +81 -0
  22. wandb/apis/public/__init__.py +34 -0
  23. wandb/apis/public/api.py +1305 -0
  24. wandb/apis/public/artifacts.py +1090 -0
  25. wandb/apis/public/const.py +4 -0
  26. wandb/apis/public/files.py +195 -0
  27. wandb/apis/public/history.py +149 -0
  28. wandb/apis/public/jobs.py +659 -0
  29. wandb/apis/public/projects.py +154 -0
  30. wandb/apis/public/query_generator.py +166 -0
  31. wandb/apis/public/reports.py +469 -0
  32. wandb/apis/public/runs.py +914 -0
  33. wandb/apis/public/sweeps.py +240 -0
  34. wandb/apis/public/teams.py +198 -0
  35. wandb/apis/public/users.py +136 -0
  36. wandb/apis/reports/__init__.py +1 -0
  37. wandb/apis/reports/v1/__init__.py +8 -0
  38. wandb/apis/reports/v2/__init__.py +8 -0
  39. wandb/apis/workspaces/__init__.py +8 -0
  40. wandb/beta/workflows.py +288 -0
  41. wandb/bin/nvidia_gpu_stats +0 -0
  42. wandb/bin/wandb-core +0 -0
  43. wandb/cli/__init__.py +0 -0
  44. wandb/cli/cli.py +3004 -0
  45. wandb/data_types.py +63 -0
  46. wandb/docker/__init__.py +342 -0
  47. wandb/docker/auth.py +436 -0
  48. wandb/docker/wandb-entrypoint.sh +33 -0
  49. wandb/docker/www_authenticate.py +94 -0
  50. wandb/env.py +514 -0
  51. wandb/errors/__init__.py +17 -0
  52. wandb/errors/errors.py +37 -0
  53. wandb/errors/term.py +103 -0
  54. wandb/errors/util.py +57 -0
  55. wandb/errors/warnings.py +2 -0
  56. wandb/filesync/__init__.py +0 -0
  57. wandb/filesync/dir_watcher.py +403 -0
  58. wandb/filesync/stats.py +100 -0
  59. wandb/filesync/step_checksum.py +142 -0
  60. wandb/filesync/step_prepare.py +179 -0
  61. wandb/filesync/step_upload.py +290 -0
  62. wandb/filesync/upload_job.py +142 -0
  63. wandb/integration/__init__.py +0 -0
  64. wandb/integration/catboost/__init__.py +5 -0
  65. wandb/integration/catboost/catboost.py +178 -0
  66. wandb/integration/cohere/__init__.py +3 -0
  67. wandb/integration/cohere/cohere.py +21 -0
  68. wandb/integration/cohere/resolver.py +347 -0
  69. wandb/integration/diffusers/__init__.py +3 -0
  70. wandb/integration/diffusers/autologger.py +76 -0
  71. wandb/integration/diffusers/pipeline_resolver.py +50 -0
  72. wandb/integration/diffusers/resolvers/__init__.py +9 -0
  73. wandb/integration/diffusers/resolvers/multimodal.py +882 -0
  74. wandb/integration/diffusers/resolvers/utils.py +102 -0
  75. wandb/integration/fastai/__init__.py +249 -0
  76. wandb/integration/gym/__init__.py +105 -0
  77. wandb/integration/huggingface/__init__.py +3 -0
  78. wandb/integration/huggingface/huggingface.py +18 -0
  79. wandb/integration/huggingface/resolver.py +213 -0
  80. wandb/integration/keras/__init__.py +11 -0
  81. wandb/integration/keras/callbacks/__init__.py +5 -0
  82. wandb/integration/keras/callbacks/metrics_logger.py +136 -0
  83. wandb/integration/keras/callbacks/model_checkpoint.py +195 -0
  84. wandb/integration/keras/callbacks/tables_builder.py +226 -0
  85. wandb/integration/keras/keras.py +1091 -0
  86. wandb/integration/kfp/__init__.py +6 -0
  87. wandb/integration/kfp/helpers.py +28 -0
  88. wandb/integration/kfp/kfp_patch.py +324 -0
  89. wandb/integration/kfp/wandb_logging.py +182 -0
  90. wandb/integration/langchain/__init__.py +3 -0
  91. wandb/integration/langchain/wandb_tracer.py +48 -0
  92. wandb/integration/lightgbm/__init__.py +239 -0
  93. wandb/integration/lightning/__init__.py +0 -0
  94. wandb/integration/lightning/fabric/__init__.py +3 -0
  95. wandb/integration/lightning/fabric/logger.py +762 -0
  96. wandb/integration/magic.py +556 -0
  97. wandb/integration/metaflow/__init__.py +3 -0
  98. wandb/integration/metaflow/metaflow.py +383 -0
  99. wandb/integration/openai/__init__.py +3 -0
  100. wandb/integration/openai/fine_tuning.py +480 -0
  101. wandb/integration/openai/openai.py +22 -0
  102. wandb/integration/openai/resolver.py +240 -0
  103. wandb/integration/prodigy/__init__.py +3 -0
  104. wandb/integration/prodigy/prodigy.py +299 -0
  105. wandb/integration/sacred/__init__.py +117 -0
  106. wandb/integration/sagemaker/__init__.py +12 -0
  107. wandb/integration/sagemaker/auth.py +28 -0
  108. wandb/integration/sagemaker/config.py +49 -0
  109. wandb/integration/sagemaker/files.py +3 -0
  110. wandb/integration/sagemaker/resources.py +34 -0
  111. wandb/integration/sb3/__init__.py +3 -0
  112. wandb/integration/sb3/sb3.py +153 -0
  113. wandb/integration/sklearn/__init__.py +37 -0
  114. wandb/integration/sklearn/calculate/__init__.py +32 -0
  115. wandb/integration/sklearn/calculate/calibration_curves.py +125 -0
  116. wandb/integration/sklearn/calculate/class_proportions.py +68 -0
  117. wandb/integration/sklearn/calculate/confusion_matrix.py +93 -0
  118. wandb/integration/sklearn/calculate/decision_boundaries.py +40 -0
  119. wandb/integration/sklearn/calculate/elbow_curve.py +55 -0
  120. wandb/integration/sklearn/calculate/feature_importances.py +67 -0
  121. wandb/integration/sklearn/calculate/learning_curve.py +64 -0
  122. wandb/integration/sklearn/calculate/outlier_candidates.py +69 -0
  123. wandb/integration/sklearn/calculate/residuals.py +86 -0
  124. wandb/integration/sklearn/calculate/silhouette.py +118 -0
  125. wandb/integration/sklearn/calculate/summary_metrics.py +62 -0
  126. wandb/integration/sklearn/plot/__init__.py +35 -0
  127. wandb/integration/sklearn/plot/classifier.py +329 -0
  128. wandb/integration/sklearn/plot/clusterer.py +146 -0
  129. wandb/integration/sklearn/plot/regressor.py +121 -0
  130. wandb/integration/sklearn/plot/shared.py +91 -0
  131. wandb/integration/sklearn/utils.py +183 -0
  132. wandb/integration/tensorboard/__init__.py +10 -0
  133. wandb/integration/tensorboard/log.py +355 -0
  134. wandb/integration/tensorboard/monkeypatch.py +185 -0
  135. wandb/integration/tensorflow/__init__.py +5 -0
  136. wandb/integration/tensorflow/estimator_hook.py +54 -0
  137. wandb/integration/torch/__init__.py +0 -0
  138. wandb/integration/torch/wandb_torch.py +554 -0
  139. wandb/integration/ultralytics/__init__.py +11 -0
  140. wandb/integration/ultralytics/bbox_utils.py +208 -0
  141. wandb/integration/ultralytics/callback.py +524 -0
  142. wandb/integration/ultralytics/classification_utils.py +83 -0
  143. wandb/integration/ultralytics/mask_utils.py +202 -0
  144. wandb/integration/ultralytics/pose_utils.py +103 -0
  145. wandb/integration/xgboost/__init__.py +11 -0
  146. wandb/integration/xgboost/xgboost.py +189 -0
  147. wandb/integration/yolov8/__init__.py +0 -0
  148. wandb/integration/yolov8/yolov8.py +284 -0
  149. wandb/jupyter.py +515 -0
  150. wandb/magic.py +3 -0
  151. wandb/mpmain/__init__.py +0 -0
  152. wandb/mpmain/__main__.py +1 -0
  153. wandb/old/__init__.py +0 -0
  154. wandb/old/core.py +53 -0
  155. wandb/old/settings.py +173 -0
  156. wandb/old/summary.py +440 -0
  157. wandb/plot/__init__.py +19 -0
  158. wandb/plot/bar.py +45 -0
  159. wandb/plot/confusion_matrix.py +100 -0
  160. wandb/plot/histogram.py +39 -0
  161. wandb/plot/line.py +43 -0
  162. wandb/plot/line_series.py +88 -0
  163. wandb/plot/pr_curve.py +136 -0
  164. wandb/plot/roc_curve.py +118 -0
  165. wandb/plot/scatter.py +32 -0
  166. wandb/plot/utils.py +183 -0
  167. wandb/plot/viz.py +123 -0
  168. wandb/proto/__init__.py +0 -0
  169. wandb/proto/v3/__init__.py +0 -0
  170. wandb/proto/v3/wandb_base_pb2.py +55 -0
  171. wandb/proto/v3/wandb_internal_pb2.py +1608 -0
  172. wandb/proto/v3/wandb_server_pb2.py +208 -0
  173. wandb/proto/v3/wandb_settings_pb2.py +112 -0
  174. wandb/proto/v3/wandb_telemetry_pb2.py +106 -0
  175. wandb/proto/v4/__init__.py +0 -0
  176. wandb/proto/v4/wandb_base_pb2.py +30 -0
  177. wandb/proto/v4/wandb_internal_pb2.py +360 -0
  178. wandb/proto/v4/wandb_server_pb2.py +63 -0
  179. wandb/proto/v4/wandb_settings_pb2.py +45 -0
  180. wandb/proto/v4/wandb_telemetry_pb2.py +41 -0
  181. wandb/proto/v5/wandb_base_pb2.py +31 -0
  182. wandb/proto/v5/wandb_internal_pb2.py +361 -0
  183. wandb/proto/v5/wandb_server_pb2.py +64 -0
  184. wandb/proto/v5/wandb_settings_pb2.py +46 -0
  185. wandb/proto/v5/wandb_telemetry_pb2.py +42 -0
  186. wandb/proto/wandb_base_pb2.py +10 -0
  187. wandb/proto/wandb_deprecated.py +53 -0
  188. wandb/proto/wandb_generate_deprecated.py +34 -0
  189. wandb/proto/wandb_generate_proto.py +49 -0
  190. wandb/proto/wandb_internal_pb2.py +16 -0
  191. wandb/proto/wandb_server_pb2.py +10 -0
  192. wandb/proto/wandb_settings_pb2.py +10 -0
  193. wandb/proto/wandb_telemetry_pb2.py +10 -0
  194. wandb/py.typed +0 -0
  195. wandb/sdk/__init__.py +37 -0
  196. wandb/sdk/artifacts/__init__.py +0 -0
  197. wandb/sdk/artifacts/_validators.py +90 -0
  198. wandb/sdk/artifacts/artifact.py +2389 -0
  199. wandb/sdk/artifacts/artifact_download_logger.py +43 -0
  200. wandb/sdk/artifacts/artifact_file_cache.py +253 -0
  201. wandb/sdk/artifacts/artifact_instance_cache.py +17 -0
  202. wandb/sdk/artifacts/artifact_manifest.py +74 -0
  203. wandb/sdk/artifacts/artifact_manifest_entry.py +249 -0
  204. wandb/sdk/artifacts/artifact_manifests/__init__.py +0 -0
  205. wandb/sdk/artifacts/artifact_manifests/artifact_manifest_v1.py +92 -0
  206. wandb/sdk/artifacts/artifact_saver.py +269 -0
  207. wandb/sdk/artifacts/artifact_state.py +11 -0
  208. wandb/sdk/artifacts/artifact_ttl.py +7 -0
  209. wandb/sdk/artifacts/exceptions.py +57 -0
  210. wandb/sdk/artifacts/staging.py +25 -0
  211. wandb/sdk/artifacts/storage_handler.py +62 -0
  212. wandb/sdk/artifacts/storage_handlers/__init__.py +0 -0
  213. wandb/sdk/artifacts/storage_handlers/azure_handler.py +208 -0
  214. wandb/sdk/artifacts/storage_handlers/gcs_handler.py +228 -0
  215. wandb/sdk/artifacts/storage_handlers/http_handler.py +114 -0
  216. wandb/sdk/artifacts/storage_handlers/local_file_handler.py +141 -0
  217. wandb/sdk/artifacts/storage_handlers/multi_handler.py +56 -0
  218. wandb/sdk/artifacts/storage_handlers/s3_handler.py +300 -0
  219. wandb/sdk/artifacts/storage_handlers/tracking_handler.py +72 -0
  220. wandb/sdk/artifacts/storage_handlers/wb_artifact_handler.py +135 -0
  221. wandb/sdk/artifacts/storage_handlers/wb_local_artifact_handler.py +74 -0
  222. wandb/sdk/artifacts/storage_layout.py +6 -0
  223. wandb/sdk/artifacts/storage_policies/__init__.py +4 -0
  224. wandb/sdk/artifacts/storage_policies/register.py +1 -0
  225. wandb/sdk/artifacts/storage_policies/wandb_storage_policy.py +378 -0
  226. wandb/sdk/artifacts/storage_policy.py +72 -0
  227. wandb/sdk/backend/__init__.py +0 -0
  228. wandb/sdk/backend/backend.py +222 -0
  229. wandb/sdk/data_types/__init__.py +0 -0
  230. wandb/sdk/data_types/_dtypes.py +914 -0
  231. wandb/sdk/data_types/_private.py +10 -0
  232. wandb/sdk/data_types/audio.py +165 -0
  233. wandb/sdk/data_types/base_types/__init__.py +0 -0
  234. wandb/sdk/data_types/base_types/json_metadata.py +55 -0
  235. wandb/sdk/data_types/base_types/media.py +315 -0
  236. wandb/sdk/data_types/base_types/wb_value.py +272 -0
  237. wandb/sdk/data_types/bokeh.py +70 -0
  238. wandb/sdk/data_types/graph.py +405 -0
  239. wandb/sdk/data_types/helper_types/__init__.py +0 -0
  240. wandb/sdk/data_types/helper_types/bounding_boxes_2d.py +295 -0
  241. wandb/sdk/data_types/helper_types/classes.py +159 -0
  242. wandb/sdk/data_types/helper_types/image_mask.py +235 -0
  243. wandb/sdk/data_types/histogram.py +96 -0
  244. wandb/sdk/data_types/html.py +115 -0
  245. wandb/sdk/data_types/image.py +845 -0
  246. wandb/sdk/data_types/molecule.py +241 -0
  247. wandb/sdk/data_types/object_3d.py +474 -0
  248. wandb/sdk/data_types/plotly.py +82 -0
  249. wandb/sdk/data_types/saved_model.py +446 -0
  250. wandb/sdk/data_types/table.py +1204 -0
  251. wandb/sdk/data_types/trace_tree.py +438 -0
  252. wandb/sdk/data_types/utils.py +229 -0
  253. wandb/sdk/data_types/video.py +247 -0
  254. wandb/sdk/integration_utils/__init__.py +0 -0
  255. wandb/sdk/integration_utils/auto_logging.py +239 -0
  256. wandb/sdk/integration_utils/data_logging.py +475 -0
  257. wandb/sdk/interface/__init__.py +0 -0
  258. wandb/sdk/interface/constants.py +4 -0
  259. wandb/sdk/interface/interface.py +972 -0
  260. wandb/sdk/interface/interface_queue.py +59 -0
  261. wandb/sdk/interface/interface_relay.py +53 -0
  262. wandb/sdk/interface/interface_shared.py +537 -0
  263. wandb/sdk/interface/interface_sock.py +61 -0
  264. wandb/sdk/interface/message_future.py +27 -0
  265. wandb/sdk/interface/message_future_poll.py +50 -0
  266. wandb/sdk/interface/router.py +118 -0
  267. wandb/sdk/interface/router_queue.py +44 -0
  268. wandb/sdk/interface/router_relay.py +39 -0
  269. wandb/sdk/interface/router_sock.py +36 -0
  270. wandb/sdk/interface/summary_record.py +67 -0
  271. wandb/sdk/internal/__init__.py +0 -0
  272. wandb/sdk/internal/context.py +89 -0
  273. wandb/sdk/internal/datastore.py +297 -0
  274. wandb/sdk/internal/file_pusher.py +181 -0
  275. wandb/sdk/internal/file_stream.py +695 -0
  276. wandb/sdk/internal/flow_control.py +263 -0
  277. wandb/sdk/internal/handler.py +901 -0
  278. wandb/sdk/internal/internal.py +417 -0
  279. wandb/sdk/internal/internal_api.py +4358 -0
  280. wandb/sdk/internal/internal_util.py +100 -0
  281. wandb/sdk/internal/job_builder.py +629 -0
  282. wandb/sdk/internal/profiler.py +78 -0
  283. wandb/sdk/internal/progress.py +83 -0
  284. wandb/sdk/internal/run.py +25 -0
  285. wandb/sdk/internal/sample.py +70 -0
  286. wandb/sdk/internal/sender.py +1686 -0
  287. wandb/sdk/internal/sender_config.py +197 -0
  288. wandb/sdk/internal/settings_static.py +90 -0
  289. wandb/sdk/internal/system/__init__.py +0 -0
  290. wandb/sdk/internal/system/assets/__init__.py +27 -0
  291. wandb/sdk/internal/system/assets/aggregators.py +37 -0
  292. wandb/sdk/internal/system/assets/asset_registry.py +20 -0
  293. wandb/sdk/internal/system/assets/cpu.py +163 -0
  294. wandb/sdk/internal/system/assets/disk.py +210 -0
  295. wandb/sdk/internal/system/assets/gpu.py +416 -0
  296. wandb/sdk/internal/system/assets/gpu_amd.py +239 -0
  297. wandb/sdk/internal/system/assets/gpu_apple.py +177 -0
  298. wandb/sdk/internal/system/assets/interfaces.py +207 -0
  299. wandb/sdk/internal/system/assets/ipu.py +177 -0
  300. wandb/sdk/internal/system/assets/memory.py +166 -0
  301. wandb/sdk/internal/system/assets/network.py +125 -0
  302. wandb/sdk/internal/system/assets/open_metrics.py +299 -0
  303. wandb/sdk/internal/system/assets/tpu.py +154 -0
  304. wandb/sdk/internal/system/assets/trainium.py +399 -0
  305. wandb/sdk/internal/system/env_probe_helpers.py +13 -0
  306. wandb/sdk/internal/system/system_info.py +249 -0
  307. wandb/sdk/internal/system/system_monitor.py +229 -0
  308. wandb/sdk/internal/tb_watcher.py +518 -0
  309. wandb/sdk/internal/thread_local_settings.py +18 -0
  310. wandb/sdk/internal/writer.py +206 -0
  311. wandb/sdk/launch/__init__.py +14 -0
  312. wandb/sdk/launch/_launch.py +330 -0
  313. wandb/sdk/launch/_launch_add.py +255 -0
  314. wandb/sdk/launch/_project_spec.py +566 -0
  315. wandb/sdk/launch/agent/__init__.py +5 -0
  316. wandb/sdk/launch/agent/agent.py +924 -0
  317. wandb/sdk/launch/agent/config.py +296 -0
  318. wandb/sdk/launch/agent/job_status_tracker.py +53 -0
  319. wandb/sdk/launch/agent/run_queue_item_file_saver.py +45 -0
  320. wandb/sdk/launch/builder/__init__.py +0 -0
  321. wandb/sdk/launch/builder/abstract.py +156 -0
  322. wandb/sdk/launch/builder/build.py +297 -0
  323. wandb/sdk/launch/builder/context_manager.py +235 -0
  324. wandb/sdk/launch/builder/docker_builder.py +177 -0
  325. wandb/sdk/launch/builder/kaniko_builder.py +595 -0
  326. wandb/sdk/launch/builder/noop.py +58 -0
  327. wandb/sdk/launch/builder/templates/_wandb_bootstrap.py +188 -0
  328. wandb/sdk/launch/builder/templates/dockerfile.py +92 -0
  329. wandb/sdk/launch/create_job.py +528 -0
  330. wandb/sdk/launch/environment/abstract.py +29 -0
  331. wandb/sdk/launch/environment/aws_environment.py +322 -0
  332. wandb/sdk/launch/environment/azure_environment.py +105 -0
  333. wandb/sdk/launch/environment/gcp_environment.py +335 -0
  334. wandb/sdk/launch/environment/local_environment.py +66 -0
  335. wandb/sdk/launch/errors.py +19 -0
  336. wandb/sdk/launch/git_reference.py +109 -0
  337. wandb/sdk/launch/inputs/files.py +148 -0
  338. wandb/sdk/launch/inputs/internal.py +315 -0
  339. wandb/sdk/launch/inputs/manage.py +113 -0
  340. wandb/sdk/launch/inputs/schema.py +39 -0
  341. wandb/sdk/launch/loader.py +249 -0
  342. wandb/sdk/launch/registry/abstract.py +48 -0
  343. wandb/sdk/launch/registry/anon.py +29 -0
  344. wandb/sdk/launch/registry/azure_container_registry.py +124 -0
  345. wandb/sdk/launch/registry/elastic_container_registry.py +192 -0
  346. wandb/sdk/launch/registry/google_artifact_registry.py +219 -0
  347. wandb/sdk/launch/registry/local_registry.py +67 -0
  348. wandb/sdk/launch/runner/__init__.py +0 -0
  349. wandb/sdk/launch/runner/abstract.py +195 -0
  350. wandb/sdk/launch/runner/kubernetes_monitor.py +474 -0
  351. wandb/sdk/launch/runner/kubernetes_runner.py +963 -0
  352. wandb/sdk/launch/runner/local_container.py +301 -0
  353. wandb/sdk/launch/runner/local_process.py +78 -0
  354. wandb/sdk/launch/runner/sagemaker_runner.py +426 -0
  355. wandb/sdk/launch/runner/vertex_runner.py +230 -0
  356. wandb/sdk/launch/sweeps/__init__.py +39 -0
  357. wandb/sdk/launch/sweeps/scheduler.py +742 -0
  358. wandb/sdk/launch/sweeps/scheduler_sweep.py +91 -0
  359. wandb/sdk/launch/sweeps/utils.py +316 -0
  360. wandb/sdk/launch/utils.py +746 -0
  361. wandb/sdk/launch/wandb_reference.py +138 -0
  362. wandb/sdk/lib/__init__.py +5 -0
  363. wandb/sdk/lib/_settings_toposort_generate.py +159 -0
  364. wandb/sdk/lib/_settings_toposort_generated.py +250 -0
  365. wandb/sdk/lib/_wburls_generate.py +25 -0
  366. wandb/sdk/lib/_wburls_generated.py +22 -0
  367. wandb/sdk/lib/apikey.py +273 -0
  368. wandb/sdk/lib/capped_dict.py +26 -0
  369. wandb/sdk/lib/config_util.py +101 -0
  370. wandb/sdk/lib/credentials.py +141 -0
  371. wandb/sdk/lib/deprecate.py +42 -0
  372. wandb/sdk/lib/disabled.py +29 -0
  373. wandb/sdk/lib/exit_hooks.py +54 -0
  374. wandb/sdk/lib/file_stream_utils.py +118 -0
  375. wandb/sdk/lib/filenames.py +64 -0
  376. wandb/sdk/lib/filesystem.py +372 -0
  377. wandb/sdk/lib/fsm.py +174 -0
  378. wandb/sdk/lib/gitlib.py +239 -0
  379. wandb/sdk/lib/gql_request.py +65 -0
  380. wandb/sdk/lib/handler_util.py +21 -0
  381. wandb/sdk/lib/hashutil.py +84 -0
  382. wandb/sdk/lib/import_hooks.py +275 -0
  383. wandb/sdk/lib/ipython.py +146 -0
  384. wandb/sdk/lib/json_util.py +80 -0
  385. wandb/sdk/lib/lazyloader.py +63 -0
  386. wandb/sdk/lib/mailbox.py +460 -0
  387. wandb/sdk/lib/module.py +69 -0
  388. wandb/sdk/lib/paths.py +106 -0
  389. wandb/sdk/lib/preinit.py +42 -0
  390. wandb/sdk/lib/printer.py +313 -0
  391. wandb/sdk/lib/proto_util.py +90 -0
  392. wandb/sdk/lib/redirect.py +845 -0
  393. wandb/sdk/lib/reporting.py +99 -0
  394. wandb/sdk/lib/retry.py +289 -0
  395. wandb/sdk/lib/run_moment.py +78 -0
  396. wandb/sdk/lib/runid.py +12 -0
  397. wandb/sdk/lib/server.py +52 -0
  398. wandb/sdk/lib/service_connection.py +216 -0
  399. wandb/sdk/lib/service_token.py +94 -0
  400. wandb/sdk/lib/sock_client.py +295 -0
  401. wandb/sdk/lib/sparkline.py +45 -0
  402. wandb/sdk/lib/telemetry.py +100 -0
  403. wandb/sdk/lib/timed_input.py +133 -0
  404. wandb/sdk/lib/timer.py +19 -0
  405. wandb/sdk/lib/tracelog.py +255 -0
  406. wandb/sdk/lib/wburls.py +46 -0
  407. wandb/sdk/service/__init__.py +0 -0
  408. wandb/sdk/service/_startup_debug.py +22 -0
  409. wandb/sdk/service/port_file.py +53 -0
  410. wandb/sdk/service/server.py +116 -0
  411. wandb/sdk/service/server_sock.py +276 -0
  412. wandb/sdk/service/service.py +242 -0
  413. wandb/sdk/service/streams.py +417 -0
  414. wandb/sdk/verify/__init__.py +0 -0
  415. wandb/sdk/verify/verify.py +501 -0
  416. wandb/sdk/wandb_alerts.py +12 -0
  417. wandb/sdk/wandb_config.py +322 -0
  418. wandb/sdk/wandb_helper.py +54 -0
  419. wandb/sdk/wandb_init.py +1266 -0
  420. wandb/sdk/wandb_login.py +349 -0
  421. wandb/sdk/wandb_metric.py +110 -0
  422. wandb/sdk/wandb_require.py +97 -0
  423. wandb/sdk/wandb_require_helpers.py +44 -0
  424. wandb/sdk/wandb_run.py +4236 -0
  425. wandb/sdk/wandb_settings.py +2001 -0
  426. wandb/sdk/wandb_setup.py +409 -0
  427. wandb/sdk/wandb_summary.py +150 -0
  428. wandb/sdk/wandb_sweep.py +119 -0
  429. wandb/sdk/wandb_sync.py +81 -0
  430. wandb/sdk/wandb_watch.py +144 -0
  431. wandb/sklearn.py +35 -0
  432. wandb/sync/__init__.py +3 -0
  433. wandb/sync/sync.py +443 -0
  434. wandb/trigger.py +29 -0
  435. wandb/util.py +1956 -0
  436. wandb/vendor/__init__.py +0 -0
  437. wandb/vendor/gql-0.2.0/setup.py +40 -0
  438. wandb/vendor/gql-0.2.0/tests/__init__.py +0 -0
  439. wandb/vendor/gql-0.2.0/tests/starwars/__init__.py +0 -0
  440. wandb/vendor/gql-0.2.0/tests/starwars/fixtures.py +96 -0
  441. wandb/vendor/gql-0.2.0/tests/starwars/schema.py +146 -0
  442. wandb/vendor/gql-0.2.0/tests/starwars/test_dsl.py +293 -0
  443. wandb/vendor/gql-0.2.0/tests/starwars/test_query.py +355 -0
  444. wandb/vendor/gql-0.2.0/tests/starwars/test_validation.py +171 -0
  445. wandb/vendor/gql-0.2.0/tests/test_client.py +31 -0
  446. wandb/vendor/gql-0.2.0/tests/test_transport.py +89 -0
  447. wandb/vendor/gql-0.2.0/wandb_gql/__init__.py +4 -0
  448. wandb/vendor/gql-0.2.0/wandb_gql/client.py +75 -0
  449. wandb/vendor/gql-0.2.0/wandb_gql/dsl.py +152 -0
  450. wandb/vendor/gql-0.2.0/wandb_gql/gql.py +10 -0
  451. wandb/vendor/gql-0.2.0/wandb_gql/transport/__init__.py +0 -0
  452. wandb/vendor/gql-0.2.0/wandb_gql/transport/http.py +6 -0
  453. wandb/vendor/gql-0.2.0/wandb_gql/transport/local_schema.py +15 -0
  454. wandb/vendor/gql-0.2.0/wandb_gql/transport/requests.py +46 -0
  455. wandb/vendor/gql-0.2.0/wandb_gql/utils.py +21 -0
  456. wandb/vendor/graphql-core-1.1/setup.py +86 -0
  457. wandb/vendor/graphql-core-1.1/wandb_graphql/__init__.py +287 -0
  458. wandb/vendor/graphql-core-1.1/wandb_graphql/error/__init__.py +6 -0
  459. wandb/vendor/graphql-core-1.1/wandb_graphql/error/base.py +42 -0
  460. wandb/vendor/graphql-core-1.1/wandb_graphql/error/format_error.py +11 -0
  461. wandb/vendor/graphql-core-1.1/wandb_graphql/error/located_error.py +29 -0
  462. wandb/vendor/graphql-core-1.1/wandb_graphql/error/syntax_error.py +36 -0
  463. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/__init__.py +26 -0
  464. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/base.py +311 -0
  465. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executor.py +398 -0
  466. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/__init__.py +0 -0
  467. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/asyncio.py +53 -0
  468. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/gevent.py +22 -0
  469. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/process.py +32 -0
  470. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/sync.py +7 -0
  471. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/thread.py +35 -0
  472. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/executors/utils.py +6 -0
  473. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/__init__.py +0 -0
  474. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/executor.py +66 -0
  475. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/fragment.py +252 -0
  476. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/resolver.py +151 -0
  477. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/experimental/utils.py +7 -0
  478. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/middleware.py +57 -0
  479. wandb/vendor/graphql-core-1.1/wandb_graphql/execution/values.py +145 -0
  480. wandb/vendor/graphql-core-1.1/wandb_graphql/graphql.py +60 -0
  481. wandb/vendor/graphql-core-1.1/wandb_graphql/language/__init__.py +0 -0
  482. wandb/vendor/graphql-core-1.1/wandb_graphql/language/ast.py +1349 -0
  483. wandb/vendor/graphql-core-1.1/wandb_graphql/language/base.py +19 -0
  484. wandb/vendor/graphql-core-1.1/wandb_graphql/language/lexer.py +435 -0
  485. wandb/vendor/graphql-core-1.1/wandb_graphql/language/location.py +30 -0
  486. wandb/vendor/graphql-core-1.1/wandb_graphql/language/parser.py +779 -0
  487. wandb/vendor/graphql-core-1.1/wandb_graphql/language/printer.py +193 -0
  488. wandb/vendor/graphql-core-1.1/wandb_graphql/language/source.py +18 -0
  489. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor.py +222 -0
  490. wandb/vendor/graphql-core-1.1/wandb_graphql/language/visitor_meta.py +82 -0
  491. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/__init__.py +0 -0
  492. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/cached_property.py +17 -0
  493. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/contain_subset.py +28 -0
  494. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/default_ordered_dict.py +40 -0
  495. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/ordereddict.py +8 -0
  496. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/pair_set.py +43 -0
  497. wandb/vendor/graphql-core-1.1/wandb_graphql/pyutils/version.py +78 -0
  498. wandb/vendor/graphql-core-1.1/wandb_graphql/type/__init__.py +67 -0
  499. wandb/vendor/graphql-core-1.1/wandb_graphql/type/definition.py +619 -0
  500. wandb/vendor/graphql-core-1.1/wandb_graphql/type/directives.py +132 -0
  501. wandb/vendor/graphql-core-1.1/wandb_graphql/type/introspection.py +440 -0
  502. wandb/vendor/graphql-core-1.1/wandb_graphql/type/scalars.py +131 -0
  503. wandb/vendor/graphql-core-1.1/wandb_graphql/type/schema.py +100 -0
  504. wandb/vendor/graphql-core-1.1/wandb_graphql/type/typemap.py +145 -0
  505. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/__init__.py +0 -0
  506. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/assert_valid_name.py +9 -0
  507. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_from_value.py +65 -0
  508. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_code.py +49 -0
  509. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/ast_to_dict.py +24 -0
  510. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/base.py +75 -0
  511. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_ast_schema.py +291 -0
  512. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/build_client_schema.py +250 -0
  513. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/concat_ast.py +9 -0
  514. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/extend_schema.py +357 -0
  515. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_field_def.py +27 -0
  516. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/get_operation_ast.py +21 -0
  517. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/introspection_query.py +90 -0
  518. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_literal_value.py +67 -0
  519. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/is_valid_value.py +66 -0
  520. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/quoted_or_list.py +21 -0
  521. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/schema_printer.py +168 -0
  522. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/suggestion_list.py +56 -0
  523. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_comparators.py +69 -0
  524. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_from_ast.py +21 -0
  525. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/type_info.py +149 -0
  526. wandb/vendor/graphql-core-1.1/wandb_graphql/utils/value_from_ast.py +69 -0
  527. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/__init__.py +4 -0
  528. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/__init__.py +79 -0
  529. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/arguments_of_correct_type.py +24 -0
  530. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/base.py +8 -0
  531. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/default_values_of_correct_type.py +44 -0
  532. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fields_on_correct_type.py +113 -0
  533. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/fragments_on_composite_types.py +33 -0
  534. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_argument_names.py +70 -0
  535. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_directives.py +97 -0
  536. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_fragment_names.py +19 -0
  537. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/known_type_names.py +43 -0
  538. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/lone_anonymous_operation.py +23 -0
  539. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_fragment_cycles.py +59 -0
  540. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_undefined_variables.py +36 -0
  541. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_fragments.py +38 -0
  542. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/no_unused_variables.py +37 -0
  543. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/overlapping_fields_can_be_merged.py +529 -0
  544. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/possible_fragment_spreads.py +44 -0
  545. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/provided_non_null_arguments.py +46 -0
  546. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/scalar_leafs.py +33 -0
  547. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_argument_names.py +32 -0
  548. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_fragment_names.py +28 -0
  549. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_input_field_names.py +33 -0
  550. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_operation_names.py +31 -0
  551. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/unique_variable_names.py +27 -0
  552. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_are_input_types.py +21 -0
  553. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/rules/variables_in_allowed_position.py +53 -0
  554. wandb/vendor/graphql-core-1.1/wandb_graphql/validation/validation.py +158 -0
  555. wandb/vendor/promise-2.3.0/conftest.py +30 -0
  556. wandb/vendor/promise-2.3.0/setup.py +64 -0
  557. wandb/vendor/promise-2.3.0/tests/__init__.py +0 -0
  558. wandb/vendor/promise-2.3.0/tests/conftest.py +8 -0
  559. wandb/vendor/promise-2.3.0/tests/test_awaitable.py +32 -0
  560. wandb/vendor/promise-2.3.0/tests/test_awaitable_35.py +47 -0
  561. wandb/vendor/promise-2.3.0/tests/test_benchmark.py +116 -0
  562. wandb/vendor/promise-2.3.0/tests/test_complex_threads.py +23 -0
  563. wandb/vendor/promise-2.3.0/tests/test_dataloader.py +452 -0
  564. wandb/vendor/promise-2.3.0/tests/test_dataloader_awaitable_35.py +99 -0
  565. wandb/vendor/promise-2.3.0/tests/test_dataloader_extra.py +65 -0
  566. wandb/vendor/promise-2.3.0/tests/test_extra.py +670 -0
  567. wandb/vendor/promise-2.3.0/tests/test_issues.py +132 -0
  568. wandb/vendor/promise-2.3.0/tests/test_promise_list.py +70 -0
  569. wandb/vendor/promise-2.3.0/tests/test_spec.py +584 -0
  570. wandb/vendor/promise-2.3.0/tests/test_thread_safety.py +115 -0
  571. wandb/vendor/promise-2.3.0/tests/utils.py +3 -0
  572. wandb/vendor/promise-2.3.0/wandb_promise/__init__.py +38 -0
  573. wandb/vendor/promise-2.3.0/wandb_promise/async_.py +135 -0
  574. wandb/vendor/promise-2.3.0/wandb_promise/compat.py +32 -0
  575. wandb/vendor/promise-2.3.0/wandb_promise/dataloader.py +326 -0
  576. wandb/vendor/promise-2.3.0/wandb_promise/iterate_promise.py +12 -0
  577. wandb/vendor/promise-2.3.0/wandb_promise/promise.py +848 -0
  578. wandb/vendor/promise-2.3.0/wandb_promise/promise_list.py +151 -0
  579. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/__init__.py +0 -0
  580. wandb/vendor/promise-2.3.0/wandb_promise/pyutils/version.py +83 -0
  581. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/__init__.py +0 -0
  582. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/asyncio.py +22 -0
  583. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/gevent.py +21 -0
  584. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/immediate.py +27 -0
  585. wandb/vendor/promise-2.3.0/wandb_promise/schedulers/thread.py +18 -0
  586. wandb/vendor/promise-2.3.0/wandb_promise/utils.py +56 -0
  587. wandb/vendor/pygments/__init__.py +90 -0
  588. wandb/vendor/pygments/cmdline.py +568 -0
  589. wandb/vendor/pygments/console.py +74 -0
  590. wandb/vendor/pygments/filter.py +74 -0
  591. wandb/vendor/pygments/filters/__init__.py +350 -0
  592. wandb/vendor/pygments/formatter.py +95 -0
  593. wandb/vendor/pygments/formatters/__init__.py +153 -0
  594. wandb/vendor/pygments/formatters/_mapping.py +85 -0
  595. wandb/vendor/pygments/formatters/bbcode.py +109 -0
  596. wandb/vendor/pygments/formatters/html.py +851 -0
  597. wandb/vendor/pygments/formatters/img.py +600 -0
  598. wandb/vendor/pygments/formatters/irc.py +182 -0
  599. wandb/vendor/pygments/formatters/latex.py +482 -0
  600. wandb/vendor/pygments/formatters/other.py +160 -0
  601. wandb/vendor/pygments/formatters/rtf.py +147 -0
  602. wandb/vendor/pygments/formatters/svg.py +153 -0
  603. wandb/vendor/pygments/formatters/terminal.py +136 -0
  604. wandb/vendor/pygments/formatters/terminal256.py +309 -0
  605. wandb/vendor/pygments/lexer.py +871 -0
  606. wandb/vendor/pygments/lexers/__init__.py +329 -0
  607. wandb/vendor/pygments/lexers/_asy_builtins.py +1645 -0
  608. wandb/vendor/pygments/lexers/_cl_builtins.py +232 -0
  609. wandb/vendor/pygments/lexers/_cocoa_builtins.py +72 -0
  610. wandb/vendor/pygments/lexers/_csound_builtins.py +1346 -0
  611. wandb/vendor/pygments/lexers/_lasso_builtins.py +5327 -0
  612. wandb/vendor/pygments/lexers/_lua_builtins.py +295 -0
  613. wandb/vendor/pygments/lexers/_mapping.py +500 -0
  614. wandb/vendor/pygments/lexers/_mql_builtins.py +1172 -0
  615. wandb/vendor/pygments/lexers/_openedge_builtins.py +2547 -0
  616. wandb/vendor/pygments/lexers/_php_builtins.py +4756 -0
  617. wandb/vendor/pygments/lexers/_postgres_builtins.py +621 -0
  618. wandb/vendor/pygments/lexers/_scilab_builtins.py +3094 -0
  619. wandb/vendor/pygments/lexers/_sourcemod_builtins.py +1163 -0
  620. wandb/vendor/pygments/lexers/_stan_builtins.py +532 -0
  621. wandb/vendor/pygments/lexers/_stata_builtins.py +419 -0
  622. wandb/vendor/pygments/lexers/_tsql_builtins.py +1004 -0
  623. wandb/vendor/pygments/lexers/_vim_builtins.py +1939 -0
  624. wandb/vendor/pygments/lexers/actionscript.py +240 -0
  625. wandb/vendor/pygments/lexers/agile.py +24 -0
  626. wandb/vendor/pygments/lexers/algebra.py +221 -0
  627. wandb/vendor/pygments/lexers/ambient.py +76 -0
  628. wandb/vendor/pygments/lexers/ampl.py +87 -0
  629. wandb/vendor/pygments/lexers/apl.py +101 -0
  630. wandb/vendor/pygments/lexers/archetype.py +318 -0
  631. wandb/vendor/pygments/lexers/asm.py +641 -0
  632. wandb/vendor/pygments/lexers/automation.py +374 -0
  633. wandb/vendor/pygments/lexers/basic.py +500 -0
  634. wandb/vendor/pygments/lexers/bibtex.py +160 -0
  635. wandb/vendor/pygments/lexers/business.py +612 -0
  636. wandb/vendor/pygments/lexers/c_cpp.py +252 -0
  637. wandb/vendor/pygments/lexers/c_like.py +541 -0
  638. wandb/vendor/pygments/lexers/capnproto.py +78 -0
  639. wandb/vendor/pygments/lexers/chapel.py +102 -0
  640. wandb/vendor/pygments/lexers/clean.py +288 -0
  641. wandb/vendor/pygments/lexers/compiled.py +34 -0
  642. wandb/vendor/pygments/lexers/configs.py +833 -0
  643. wandb/vendor/pygments/lexers/console.py +114 -0
  644. wandb/vendor/pygments/lexers/crystal.py +393 -0
  645. wandb/vendor/pygments/lexers/csound.py +366 -0
  646. wandb/vendor/pygments/lexers/css.py +689 -0
  647. wandb/vendor/pygments/lexers/d.py +251 -0
  648. wandb/vendor/pygments/lexers/dalvik.py +125 -0
  649. wandb/vendor/pygments/lexers/data.py +555 -0
  650. wandb/vendor/pygments/lexers/diff.py +165 -0
  651. wandb/vendor/pygments/lexers/dotnet.py +691 -0
  652. wandb/vendor/pygments/lexers/dsls.py +878 -0
  653. wandb/vendor/pygments/lexers/dylan.py +289 -0
  654. wandb/vendor/pygments/lexers/ecl.py +125 -0
  655. wandb/vendor/pygments/lexers/eiffel.py +65 -0
  656. wandb/vendor/pygments/lexers/elm.py +121 -0
  657. wandb/vendor/pygments/lexers/erlang.py +533 -0
  658. wandb/vendor/pygments/lexers/esoteric.py +277 -0
  659. wandb/vendor/pygments/lexers/ezhil.py +69 -0
  660. wandb/vendor/pygments/lexers/factor.py +344 -0
  661. wandb/vendor/pygments/lexers/fantom.py +250 -0
  662. wandb/vendor/pygments/lexers/felix.py +273 -0
  663. wandb/vendor/pygments/lexers/forth.py +177 -0
  664. wandb/vendor/pygments/lexers/fortran.py +205 -0
  665. wandb/vendor/pygments/lexers/foxpro.py +428 -0
  666. wandb/vendor/pygments/lexers/functional.py +21 -0
  667. wandb/vendor/pygments/lexers/go.py +101 -0
  668. wandb/vendor/pygments/lexers/grammar_notation.py +213 -0
  669. wandb/vendor/pygments/lexers/graph.py +80 -0
  670. wandb/vendor/pygments/lexers/graphics.py +553 -0
  671. wandb/vendor/pygments/lexers/haskell.py +843 -0
  672. wandb/vendor/pygments/lexers/haxe.py +936 -0
  673. wandb/vendor/pygments/lexers/hdl.py +382 -0
  674. wandb/vendor/pygments/lexers/hexdump.py +103 -0
  675. wandb/vendor/pygments/lexers/html.py +602 -0
  676. wandb/vendor/pygments/lexers/idl.py +270 -0
  677. wandb/vendor/pygments/lexers/igor.py +288 -0
  678. wandb/vendor/pygments/lexers/inferno.py +96 -0
  679. wandb/vendor/pygments/lexers/installers.py +322 -0
  680. wandb/vendor/pygments/lexers/int_fiction.py +1343 -0
  681. wandb/vendor/pygments/lexers/iolang.py +63 -0
  682. wandb/vendor/pygments/lexers/j.py +146 -0
  683. wandb/vendor/pygments/lexers/javascript.py +1525 -0
  684. wandb/vendor/pygments/lexers/julia.py +333 -0
  685. wandb/vendor/pygments/lexers/jvm.py +1573 -0
  686. wandb/vendor/pygments/lexers/lisp.py +2621 -0
  687. wandb/vendor/pygments/lexers/make.py +202 -0
  688. wandb/vendor/pygments/lexers/markup.py +595 -0
  689. wandb/vendor/pygments/lexers/math.py +21 -0
  690. wandb/vendor/pygments/lexers/matlab.py +663 -0
  691. wandb/vendor/pygments/lexers/ml.py +769 -0
  692. wandb/vendor/pygments/lexers/modeling.py +358 -0
  693. wandb/vendor/pygments/lexers/modula2.py +1561 -0
  694. wandb/vendor/pygments/lexers/monte.py +204 -0
  695. wandb/vendor/pygments/lexers/ncl.py +894 -0
  696. wandb/vendor/pygments/lexers/nimrod.py +159 -0
  697. wandb/vendor/pygments/lexers/nit.py +64 -0
  698. wandb/vendor/pygments/lexers/nix.py +136 -0
  699. wandb/vendor/pygments/lexers/oberon.py +105 -0
  700. wandb/vendor/pygments/lexers/objective.py +504 -0
  701. wandb/vendor/pygments/lexers/ooc.py +85 -0
  702. wandb/vendor/pygments/lexers/other.py +41 -0
  703. wandb/vendor/pygments/lexers/parasail.py +79 -0
  704. wandb/vendor/pygments/lexers/parsers.py +835 -0
  705. wandb/vendor/pygments/lexers/pascal.py +644 -0
  706. wandb/vendor/pygments/lexers/pawn.py +199 -0
  707. wandb/vendor/pygments/lexers/perl.py +620 -0
  708. wandb/vendor/pygments/lexers/php.py +267 -0
  709. wandb/vendor/pygments/lexers/praat.py +294 -0
  710. wandb/vendor/pygments/lexers/prolog.py +306 -0
  711. wandb/vendor/pygments/lexers/python.py +939 -0
  712. wandb/vendor/pygments/lexers/qvt.py +152 -0
  713. wandb/vendor/pygments/lexers/r.py +453 -0
  714. wandb/vendor/pygments/lexers/rdf.py +270 -0
  715. wandb/vendor/pygments/lexers/rebol.py +431 -0
  716. wandb/vendor/pygments/lexers/resource.py +85 -0
  717. wandb/vendor/pygments/lexers/rnc.py +67 -0
  718. wandb/vendor/pygments/lexers/roboconf.py +82 -0
  719. wandb/vendor/pygments/lexers/robotframework.py +560 -0
  720. wandb/vendor/pygments/lexers/ruby.py +519 -0
  721. wandb/vendor/pygments/lexers/rust.py +220 -0
  722. wandb/vendor/pygments/lexers/sas.py +228 -0
  723. wandb/vendor/pygments/lexers/scripting.py +1222 -0
  724. wandb/vendor/pygments/lexers/shell.py +794 -0
  725. wandb/vendor/pygments/lexers/smalltalk.py +195 -0
  726. wandb/vendor/pygments/lexers/smv.py +79 -0
  727. wandb/vendor/pygments/lexers/snobol.py +83 -0
  728. wandb/vendor/pygments/lexers/special.py +103 -0
  729. wandb/vendor/pygments/lexers/sql.py +681 -0
  730. wandb/vendor/pygments/lexers/stata.py +108 -0
  731. wandb/vendor/pygments/lexers/supercollider.py +90 -0
  732. wandb/vendor/pygments/lexers/tcl.py +145 -0
  733. wandb/vendor/pygments/lexers/templates.py +2283 -0
  734. wandb/vendor/pygments/lexers/testing.py +207 -0
  735. wandb/vendor/pygments/lexers/text.py +25 -0
  736. wandb/vendor/pygments/lexers/textedit.py +169 -0
  737. wandb/vendor/pygments/lexers/textfmts.py +297 -0
  738. wandb/vendor/pygments/lexers/theorem.py +458 -0
  739. wandb/vendor/pygments/lexers/trafficscript.py +54 -0
  740. wandb/vendor/pygments/lexers/typoscript.py +226 -0
  741. wandb/vendor/pygments/lexers/urbi.py +133 -0
  742. wandb/vendor/pygments/lexers/varnish.py +190 -0
  743. wandb/vendor/pygments/lexers/verification.py +111 -0
  744. wandb/vendor/pygments/lexers/web.py +24 -0
  745. wandb/vendor/pygments/lexers/webmisc.py +988 -0
  746. wandb/vendor/pygments/lexers/whiley.py +116 -0
  747. wandb/vendor/pygments/lexers/x10.py +69 -0
  748. wandb/vendor/pygments/modeline.py +44 -0
  749. wandb/vendor/pygments/plugin.py +68 -0
  750. wandb/vendor/pygments/regexopt.py +92 -0
  751. wandb/vendor/pygments/scanner.py +105 -0
  752. wandb/vendor/pygments/sphinxext.py +158 -0
  753. wandb/vendor/pygments/style.py +155 -0
  754. wandb/vendor/pygments/styles/__init__.py +80 -0
  755. wandb/vendor/pygments/styles/abap.py +29 -0
  756. wandb/vendor/pygments/styles/algol.py +63 -0
  757. wandb/vendor/pygments/styles/algol_nu.py +63 -0
  758. wandb/vendor/pygments/styles/arduino.py +98 -0
  759. wandb/vendor/pygments/styles/autumn.py +65 -0
  760. wandb/vendor/pygments/styles/borland.py +51 -0
  761. wandb/vendor/pygments/styles/bw.py +49 -0
  762. wandb/vendor/pygments/styles/colorful.py +81 -0
  763. wandb/vendor/pygments/styles/default.py +73 -0
  764. wandb/vendor/pygments/styles/emacs.py +72 -0
  765. wandb/vendor/pygments/styles/friendly.py +72 -0
  766. wandb/vendor/pygments/styles/fruity.py +42 -0
  767. wandb/vendor/pygments/styles/igor.py +29 -0
  768. wandb/vendor/pygments/styles/lovelace.py +97 -0
  769. wandb/vendor/pygments/styles/manni.py +75 -0
  770. wandb/vendor/pygments/styles/monokai.py +106 -0
  771. wandb/vendor/pygments/styles/murphy.py +80 -0
  772. wandb/vendor/pygments/styles/native.py +65 -0
  773. wandb/vendor/pygments/styles/paraiso_dark.py +125 -0
  774. wandb/vendor/pygments/styles/paraiso_light.py +125 -0
  775. wandb/vendor/pygments/styles/pastie.py +75 -0
  776. wandb/vendor/pygments/styles/perldoc.py +69 -0
  777. wandb/vendor/pygments/styles/rainbow_dash.py +89 -0
  778. wandb/vendor/pygments/styles/rrt.py +33 -0
  779. wandb/vendor/pygments/styles/sas.py +44 -0
  780. wandb/vendor/pygments/styles/stata.py +40 -0
  781. wandb/vendor/pygments/styles/tango.py +141 -0
  782. wandb/vendor/pygments/styles/trac.py +63 -0
  783. wandb/vendor/pygments/styles/vim.py +63 -0
  784. wandb/vendor/pygments/styles/vs.py +38 -0
  785. wandb/vendor/pygments/styles/xcode.py +51 -0
  786. wandb/vendor/pygments/token.py +213 -0
  787. wandb/vendor/pygments/unistring.py +217 -0
  788. wandb/vendor/pygments/util.py +388 -0
  789. wandb/vendor/pynvml/__init__.py +0 -0
  790. wandb/vendor/pynvml/pynvml.py +4779 -0
  791. wandb/vendor/watchdog_0_9_0/wandb_watchdog/__init__.py +17 -0
  792. wandb/vendor/watchdog_0_9_0/wandb_watchdog/events.py +615 -0
  793. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/__init__.py +98 -0
  794. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/api.py +369 -0
  795. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents.py +172 -0
  796. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/fsevents2.py +239 -0
  797. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify.py +218 -0
  798. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_buffer.py +81 -0
  799. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/inotify_c.py +575 -0
  800. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/kqueue.py +730 -0
  801. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/polling.py +145 -0
  802. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/read_directory_changes.py +133 -0
  803. wandb/vendor/watchdog_0_9_0/wandb_watchdog/observers/winapi.py +348 -0
  804. wandb/vendor/watchdog_0_9_0/wandb_watchdog/patterns.py +265 -0
  805. wandb/vendor/watchdog_0_9_0/wandb_watchdog/tricks/__init__.py +174 -0
  806. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/__init__.py +151 -0
  807. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/bricks.py +249 -0
  808. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/compat.py +29 -0
  809. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/decorators.py +198 -0
  810. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/delayed_queue.py +88 -0
  811. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/dirsnapshot.py +293 -0
  812. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/echo.py +157 -0
  813. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/event_backport.py +41 -0
  814. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/importlib2.py +40 -0
  815. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/platform.py +57 -0
  816. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/unicode_paths.py +64 -0
  817. wandb/vendor/watchdog_0_9_0/wandb_watchdog/utils/win32stat.py +123 -0
  818. wandb/vendor/watchdog_0_9_0/wandb_watchdog/version.py +28 -0
  819. wandb/vendor/watchdog_0_9_0/wandb_watchdog/watchmedo.py +577 -0
  820. wandb/wandb_agent.py +588 -0
  821. wandb/wandb_controller.py +721 -0
  822. wandb/wandb_run.py +9 -0
  823. wandb-0.18.2.dist-info/METADATA +213 -0
  824. wandb-0.18.2.dist-info/RECORD +827 -0
  825. wandb-0.18.2.dist-info/WHEEL +5 -0
  826. wandb-0.18.2.dist-info/entry_points.txt +3 -0
  827. wandb-0.18.2.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,914 @@
1
+ import datetime
2
+ import math
3
+ import typing as t
4
+
5
+ from wandb.util import (
6
+ _is_artifact_string,
7
+ _is_artifact_version_weave_dict,
8
+ get_module,
9
+ is_numpy_array,
10
+ )
11
+
12
+ np = get_module("numpy") # intentionally not required
13
+
14
+ if t.TYPE_CHECKING:
15
+ from wandb.sdk.artifacts.artifact import Artifact
16
+
17
+ ConvertibleToType = t.Union["Type", t.Type["Type"], type, t.Any]
18
+
19
+
20
+ class TypeRegistry:
21
+ """A resolver for python objects that can deserialize JSON dicts.
22
+
23
+ Additional types can be registered via the .add call.
24
+ """
25
+
26
+ _types_by_name = None
27
+ _types_by_class = None
28
+
29
+ @staticmethod
30
+ def types_by_name():
31
+ if TypeRegistry._types_by_name is None:
32
+ TypeRegistry._types_by_name = {}
33
+ return TypeRegistry._types_by_name
34
+
35
+ @staticmethod
36
+ def types_by_class():
37
+ if TypeRegistry._types_by_class is None:
38
+ TypeRegistry._types_by_class = {}
39
+ return TypeRegistry._types_by_class
40
+
41
+ @staticmethod
42
+ def add(wb_type: t.Type["Type"]) -> None:
43
+ assert issubclass(wb_type, Type)
44
+ TypeRegistry.types_by_name().update({wb_type.name: wb_type})
45
+ for name in wb_type.legacy_names:
46
+ TypeRegistry.types_by_name().update({name: wb_type})
47
+ TypeRegistry.types_by_class().update(
48
+ {_type: wb_type for _type in wb_type.types}
49
+ )
50
+
51
+ @staticmethod
52
+ def type_of(py_obj: t.Optional[t.Any]) -> "Type":
53
+ # Special case handler for common case of np.nans. np.nan
54
+ # is of type 'float', but should be treated as a None. This is
55
+ # because np.nan can co-exist with other types in dataframes,
56
+ # but will be ultimately treated as a None. Ignoring type since
57
+ # mypy does not trust that py_obj is a float by the time it is
58
+ # passed to isnan.
59
+ if py_obj.__class__ is float and math.isnan(py_obj): # type: ignore
60
+ return NoneType()
61
+
62
+ # TODO: generalize this to handle other config input types
63
+ if _is_artifact_string(py_obj) or _is_artifact_version_weave_dict(py_obj):
64
+ return TypeRegistry.types_by_name().get("artifactVersion")()
65
+
66
+ class_handler = TypeRegistry.types_by_class().get(py_obj.__class__)
67
+ _type = None
68
+ if class_handler:
69
+ _type = class_handler.from_obj(py_obj)
70
+ else:
71
+ _type = PythonObjectType.from_obj(py_obj)
72
+ return _type
73
+
74
+ @staticmethod
75
+ def type_from_dict(
76
+ json_dict: t.Dict[str, t.Any], artifact: t.Optional["Artifact"] = None
77
+ ) -> "Type":
78
+ wb_type = json_dict.get("wb_type")
79
+ if wb_type is None:
80
+ TypeError("json_dict must contain `wb_type` key")
81
+ _type = TypeRegistry.types_by_name().get(wb_type)
82
+ if _type is None:
83
+ TypeError(f"missing type handler for {wb_type}")
84
+ return _type.from_json(json_dict, artifact)
85
+
86
+ @staticmethod
87
+ def type_from_dtype(dtype: ConvertibleToType) -> "Type":
88
+ # The dtype is already an instance of Type
89
+ if isinstance(dtype, Type):
90
+ wbtype: Type = dtype
91
+
92
+ # The dtype is a subclass of Type
93
+ elif isinstance(dtype, type) and issubclass(dtype, Type):
94
+ wbtype = dtype()
95
+
96
+ # The dtype is a subclass of generic python type
97
+ elif isinstance(dtype, type):
98
+ handler = TypeRegistry.types_by_class().get(dtype)
99
+
100
+ # and we have a registered handler
101
+ if handler:
102
+ wbtype = handler()
103
+
104
+ # else, fallback to object type
105
+ else:
106
+ wbtype = PythonObjectType.from_obj(dtype)
107
+
108
+ # The dtype is a list, then we resolve the list notation
109
+ elif isinstance(dtype, list):
110
+ if len(dtype) == 0:
111
+ wbtype = ListType()
112
+ elif len(dtype) == 1:
113
+ wbtype = ListType(TypeRegistry.type_from_dtype(dtype[0]))
114
+
115
+ # lists of more than 1 are treated as unions
116
+ else:
117
+ wbtype = UnionType([TypeRegistry.type_from_dtype(dt) for dt in dtype])
118
+
119
+ # The dtype is a dict, then we resolve the dict notation
120
+ elif isinstance(dtype, dict):
121
+ wbtype = TypedDictType(
122
+ {key: TypeRegistry.type_from_dtype(dtype[key]) for key in dtype}
123
+ )
124
+
125
+ # The dtype is a concrete instance, which we will treat as a constant
126
+ else:
127
+ wbtype = ConstType(dtype)
128
+
129
+ return wbtype
130
+
131
+
132
+ def _params_obj_to_json_obj(
133
+ params_obj: t.Any,
134
+ artifact: t.Optional["Artifact"] = None,
135
+ ) -> t.Any:
136
+ """Helper method."""
137
+ if params_obj.__class__ is dict:
138
+ return {
139
+ key: _params_obj_to_json_obj(params_obj[key], artifact)
140
+ for key in params_obj
141
+ }
142
+ elif params_obj.__class__ in [list, set, tuple, frozenset]:
143
+ return [_params_obj_to_json_obj(item, artifact) for item in list(params_obj)]
144
+ elif isinstance(params_obj, Type):
145
+ return params_obj.to_json(artifact)
146
+ else:
147
+ return params_obj
148
+
149
+
150
+ def _json_obj_to_params_obj(
151
+ json_obj: t.Any, artifact: t.Optional["Artifact"] = None
152
+ ) -> t.Any:
153
+ """Helper method."""
154
+ if json_obj.__class__ is dict:
155
+ if "wb_type" in json_obj:
156
+ return TypeRegistry.type_from_dict(json_obj, artifact)
157
+ else:
158
+ return {
159
+ key: _json_obj_to_params_obj(json_obj[key], artifact)
160
+ for key in json_obj
161
+ }
162
+ elif json_obj.__class__ is list:
163
+ return [_json_obj_to_params_obj(item, artifact) for item in json_obj]
164
+ else:
165
+ return json_obj
166
+
167
+
168
+ class Type:
169
+ """The most generic type that all types subclass.
170
+
171
+ It provides simple serialization and deserialization as well as equality checks.
172
+ A name class-level property must be uniquely set by subclasses.
173
+ """
174
+
175
+ # Subclasses must override with a unique name. This is used to identify the
176
+ # class during serializations and deserializations
177
+ name: t.ClassVar[str] = ""
178
+
179
+ # List of names by which this class can deserialize
180
+ legacy_names: t.ClassVar[t.List[str]] = []
181
+
182
+ # Subclasses may override with a list of `types` which this Type is capable
183
+ # of being initialized. This is used by the Type Registry when calling `TypeRegistry.type_of`.
184
+ # Some types will have an empty list - for example `Union`. There is no raw python type which
185
+ # inherently maps to a Union and therefore the list should be empty.
186
+ types: t.ClassVar[t.List[type]] = []
187
+
188
+ # Contains the further specification of the Type
189
+ _params: t.Dict[str, t.Any]
190
+
191
+ def __init__(*args, **kwargs):
192
+ pass
193
+
194
+ @property
195
+ def params(self):
196
+ if not hasattr(self, "_params") or self._params is None:
197
+ self._params = {}
198
+ return self._params
199
+
200
+ def assign(self, py_obj: t.Optional[t.Any] = None) -> "Type":
201
+ """Assign a python object to the type.
202
+
203
+ May to be overridden by subclasses
204
+
205
+ Args:
206
+ py_obj (any, optional): Any python object which the user wishes to assign to
207
+ this type
208
+
209
+ Returns:
210
+ Type: a new type representing the result of the assignment.
211
+ """
212
+ return self.assign_type(TypeRegistry.type_of(py_obj))
213
+
214
+ def assign_type(self, wb_type: "Type") -> "Type":
215
+ # Default - should be overridden
216
+ if isinstance(wb_type, self.__class__) and self.params == wb_type.params:
217
+ return self
218
+ else:
219
+ return InvalidType()
220
+
221
+ def to_json(self, artifact: t.Optional["Artifact"] = None) -> t.Dict[str, t.Any]:
222
+ """Generate a jsonable dictionary serialization the type.
223
+
224
+ If overridden by subclass, ensure that `from_json` is equivalently overridden.
225
+
226
+ Args:
227
+ artifact (wandb.Artifact, optional): If the serialization is being performed
228
+ for a particular artifact, pass that artifact. Defaults to None.
229
+
230
+ Returns:
231
+ dict: Representation of the type
232
+ """
233
+ res = {
234
+ "wb_type": self.name,
235
+ "params": _params_obj_to_json_obj(self.params, artifact),
236
+ }
237
+ if res["params"] is None or res["params"] == {}:
238
+ del res["params"]
239
+
240
+ return res
241
+
242
+ @classmethod
243
+ def from_json(
244
+ cls,
245
+ json_dict: t.Dict[str, t.Any],
246
+ artifact: t.Optional["Artifact"] = None,
247
+ ) -> "Type":
248
+ """Construct a new instance of the type using a JSON dictionary.
249
+
250
+ The mirror function of `to_json`. If overridden by subclass, ensure that
251
+ `to_json` is equivalently overridden.
252
+
253
+ Returns:
254
+ _Type: an instance of a subclass of the _Type class.
255
+ """
256
+ return cls(**_json_obj_to_params_obj(json_dict.get("params", {}), artifact))
257
+
258
+ @classmethod
259
+ def from_obj(cls, py_obj: t.Optional[t.Any] = None) -> "Type":
260
+ return cls()
261
+
262
+ def explain(self, other: t.Any, depth=0) -> str:
263
+ """Explain why an item is not assignable to a type.
264
+
265
+ Assumes that the caller has already validated that the assignment fails.
266
+
267
+ Args:
268
+ other (any): Any object depth (int, optional): depth of the type checking.
269
+ Defaults to 0.
270
+
271
+ Returns:
272
+ str: human-readable explanation
273
+ """
274
+ wbtype = TypeRegistry.type_of(other)
275
+ gap = "".join(["\t"] * depth)
276
+ if depth > 0:
277
+ return f"{gap}{wbtype} not assignable to {self}"
278
+ else:
279
+ return f"{gap}{other} of type {wbtype} is not assignable to {self}"
280
+
281
+ def __repr__(self):
282
+ rep = self.name.capitalize()
283
+ if len(self.params.keys()) > 0:
284
+ rep += "("
285
+ for ndx, key in enumerate(self.params.keys()):
286
+ if ndx > 0:
287
+ rep += ", "
288
+ rep += key + ":" + str(self.params[key])
289
+ rep += ")"
290
+ return rep
291
+
292
+ def __eq__(self, other):
293
+ return self is other or (
294
+ isinstance(self, Type)
295
+ and isinstance(other, Type)
296
+ and self.name == other.name
297
+ and self.params.keys() == other.params.keys()
298
+ and all([self.params[k] == other.params[k] for k in self.params])
299
+ )
300
+
301
+
302
+ class InvalidType(Type):
303
+ """A disallowed type.
304
+
305
+ Assignments to a InvalidType result in a Never Type. InvalidType is basically the
306
+ invalid case.
307
+ """
308
+
309
+ name = "invalid"
310
+ types: t.ClassVar[t.List[type]] = []
311
+
312
+ def assign_type(self, wb_type: "Type") -> "InvalidType":
313
+ return self
314
+
315
+
316
+ class AnyType(Type):
317
+ """An object that can be any type.
318
+
319
+ Assignments to an AnyType result in the AnyType except None which results in an
320
+ InvalidType.
321
+ """
322
+
323
+ name = "any"
324
+ types: t.ClassVar[t.List[type]] = []
325
+
326
+ def assign_type(self, wb_type: "Type") -> t.Union["AnyType", InvalidType]:
327
+ return (
328
+ self
329
+ if not (isinstance(wb_type, NoneType) or isinstance(wb_type, InvalidType))
330
+ else InvalidType()
331
+ )
332
+
333
+
334
+ class UnknownType(Type):
335
+ """An object with an unknown type.
336
+
337
+ All assignments to an UnknownType result in the type of the assigned object except
338
+ `None` which results in a InvalidType.
339
+ """
340
+
341
+ name = "unknown"
342
+ types: t.ClassVar[t.List[type]] = []
343
+
344
+ def assign_type(self, wb_type: "Type") -> "Type":
345
+ return wb_type if not isinstance(wb_type, NoneType) else InvalidType()
346
+
347
+
348
+ class NoneType(Type):
349
+ name = "none"
350
+ types: t.ClassVar[t.List[type]] = [None.__class__]
351
+
352
+
353
+ class StringType(Type):
354
+ name = "string"
355
+ types: t.ClassVar[t.List[type]] = [str]
356
+
357
+
358
+ class NumberType(Type):
359
+ name = "number"
360
+ types: t.ClassVar[t.List[type]] = [int, float]
361
+
362
+
363
+ if np:
364
+ NumberType.types.append(np.byte)
365
+ NumberType.types.append(np.short)
366
+ NumberType.types.append(np.ushort)
367
+ NumberType.types.append(np.intc)
368
+ NumberType.types.append(np.uintc)
369
+ NumberType.types.append(np.int_)
370
+ NumberType.types.append(np.uint)
371
+ NumberType.types.append(np.longlong)
372
+ NumberType.types.append(np.ulonglong)
373
+ NumberType.types.append(np.half)
374
+ NumberType.types.append(np.float16)
375
+ NumberType.types.append(np.single)
376
+ NumberType.types.append(np.double)
377
+ NumberType.types.append(np.longdouble)
378
+ NumberType.types.append(np.csingle)
379
+ NumberType.types.append(np.cdouble)
380
+ NumberType.types.append(np.clongdouble)
381
+ NumberType.types.append(np.int8)
382
+ NumberType.types.append(np.int16)
383
+ NumberType.types.append(np.int32)
384
+ NumberType.types.append(np.int64)
385
+ NumberType.types.append(np.uint8)
386
+ NumberType.types.append(np.uint16)
387
+ NumberType.types.append(np.uint32)
388
+ NumberType.types.append(np.uint64)
389
+ NumberType.types.append(np.intp)
390
+ NumberType.types.append(np.uintp)
391
+ NumberType.types.append(np.float32)
392
+ NumberType.types.append(np.float64)
393
+ NumberType.types.append(np.complex64)
394
+ NumberType.types.append(np.complex128)
395
+
396
+ numpy_major_version = np.__version__.split(".")[0]
397
+ if int(numpy_major_version) < 2:
398
+ NumberType.types.append(np.float_)
399
+ NumberType.types.append(np.complex_)
400
+
401
+
402
+ class TimestampType(Type):
403
+ name = "timestamp"
404
+ types: t.ClassVar[t.List[type]] = [datetime.datetime, datetime.date]
405
+
406
+
407
+ if np:
408
+ TimestampType.types.append(np.datetime64)
409
+
410
+
411
+ class BooleanType(Type):
412
+ name = "boolean"
413
+ types: t.ClassVar[t.List[type]] = [bool]
414
+
415
+
416
+ if np:
417
+ BooleanType.types.append(np.bool_)
418
+
419
+
420
+ class PythonObjectType(Type):
421
+ """A backup type that keeps track of the python object name."""
422
+
423
+ name = "pythonObject"
424
+ legacy_names = ["object"]
425
+ types: t.ClassVar[t.List[type]] = []
426
+
427
+ def __init__(self, class_name: str):
428
+ self.params.update({"class_name": class_name})
429
+
430
+ @classmethod
431
+ def from_obj(cls, py_obj: t.Optional[t.Any] = None) -> "PythonObjectType":
432
+ return cls(py_obj.__class__.__name__)
433
+
434
+
435
+ class ConstType(Type):
436
+ """A constant value (currently only primitives supported)."""
437
+
438
+ name = "const"
439
+ types: t.ClassVar[t.List[type]] = []
440
+
441
+ def __init__(self, val: t.Optional[t.Any] = None, is_set: t.Optional[bool] = False):
442
+ if val.__class__ not in [str, int, float, bool, set, list, None.__class__]:
443
+ TypeError(
444
+ f"ConstType only supports str, int, float, bool, set, list, and None types. Found {val}"
445
+ )
446
+ if is_set or isinstance(val, set):
447
+ is_set = True
448
+ assert isinstance(val, set) or isinstance(val, list)
449
+ val = set(val)
450
+
451
+ self.params.update({"val": val, "is_set": is_set})
452
+
453
+ def assign(self, py_obj: t.Optional[t.Any] = None) -> "Type":
454
+ return self.assign_type(ConstType(py_obj))
455
+
456
+ @classmethod
457
+ def from_obj(cls, py_obj: t.Optional[t.Any] = None) -> "ConstType":
458
+ return cls(py_obj)
459
+
460
+ def __repr__(self):
461
+ return str(self.params["val"])
462
+
463
+
464
+ def _flatten_union_types(wb_types: t.List[Type]) -> t.List[Type]:
465
+ final_types = []
466
+ for allowed_type in wb_types:
467
+ if isinstance(allowed_type, UnionType):
468
+ internal_types = _flatten_union_types(allowed_type.params["allowed_types"])
469
+ for internal_type in internal_types:
470
+ final_types.append(internal_type)
471
+ else:
472
+ final_types.append(allowed_type)
473
+ return final_types
474
+
475
+
476
+ def _union_assigner(
477
+ allowed_types: t.List[Type],
478
+ obj_or_type: t.Union[Type, t.Optional[t.Any]],
479
+ type_mode=False,
480
+ ) -> t.Union[t.List[Type], InvalidType]:
481
+ resolved_types = []
482
+ valid = False
483
+ unknown_count = 0
484
+
485
+ for allowed_type in allowed_types:
486
+ if valid:
487
+ resolved_types.append(allowed_type)
488
+ else:
489
+ if isinstance(allowed_type, UnknownType):
490
+ unknown_count += 1
491
+ else:
492
+ if type_mode:
493
+ assert isinstance(obj_or_type, Type)
494
+ assigned_type = allowed_type.assign_type(obj_or_type)
495
+ else:
496
+ assigned_type = allowed_type.assign(obj_or_type)
497
+ if isinstance(assigned_type, InvalidType):
498
+ resolved_types.append(allowed_type)
499
+ else:
500
+ resolved_types.append(assigned_type)
501
+ valid = True
502
+
503
+ if not valid:
504
+ if unknown_count == 0:
505
+ return InvalidType()
506
+ else:
507
+ if type_mode:
508
+ assert isinstance(obj_or_type, Type)
509
+ new_type = obj_or_type
510
+ else:
511
+ new_type = UnknownType().assign(obj_or_type)
512
+ if isinstance(new_type, InvalidType):
513
+ return InvalidType()
514
+ else:
515
+ resolved_types.append(new_type)
516
+ unknown_count -= 1
517
+
518
+ for _ in range(unknown_count):
519
+ resolved_types.append(UnknownType())
520
+
521
+ resolved_types = _flatten_union_types(resolved_types)
522
+ resolved_types.sort(key=str)
523
+ return resolved_types
524
+
525
+
526
+ class UnionType(Type):
527
+ """An "or" of types."""
528
+
529
+ name = "union"
530
+ types: t.ClassVar[t.List[type]] = []
531
+
532
+ def __init__(
533
+ self,
534
+ allowed_types: t.Optional[t.Sequence[ConvertibleToType]] = None,
535
+ ):
536
+ assert allowed_types is None or (allowed_types.__class__ is list)
537
+ if allowed_types is None:
538
+ wb_types = []
539
+ else:
540
+ wb_types = [TypeRegistry.type_from_dtype(dt) for dt in allowed_types]
541
+
542
+ wb_types = _flatten_union_types(wb_types)
543
+ wb_types.sort(key=str)
544
+ self.params.update({"allowed_types": wb_types})
545
+
546
+ def assign(
547
+ self, py_obj: t.Optional[t.Any] = None
548
+ ) -> t.Union["UnionType", InvalidType]:
549
+ resolved_types = _union_assigner(
550
+ self.params["allowed_types"], py_obj, type_mode=False
551
+ )
552
+ if isinstance(resolved_types, InvalidType):
553
+ return InvalidType()
554
+ return self.__class__(resolved_types)
555
+
556
+ def assign_type(self, wb_type: "Type") -> t.Union["UnionType", InvalidType]:
557
+ if isinstance(wb_type, UnionType):
558
+ assignees = wb_type.params["allowed_types"]
559
+ else:
560
+ assignees = [wb_type]
561
+
562
+ resolved_types = self.params["allowed_types"]
563
+ for assignee in assignees:
564
+ resolved_types = _union_assigner(resolved_types, assignee, type_mode=True)
565
+ if isinstance(resolved_types, InvalidType):
566
+ return InvalidType()
567
+
568
+ return self.__class__(resolved_types)
569
+
570
+ def explain(self, other: t.Any, depth=0) -> str:
571
+ exp = super().explain(other, depth)
572
+ for ndx, subtype in enumerate(self.params["allowed_types"]):
573
+ if ndx > 0:
574
+ exp += "\n{}and".format("".join(["\t"] * depth))
575
+ exp += "\n" + subtype.explain(other, depth=depth + 1)
576
+ return exp
577
+
578
+ def __repr__(self):
579
+ return "{}".format(" or ".join([str(t) for t in self.params["allowed_types"]]))
580
+
581
+
582
+ def OptionalType(dtype: ConvertibleToType) -> UnionType: # noqa: N802
583
+ """Function that mimics the Type class API for constructing an "Optional Type".
584
+
585
+ This is just a Union[wb_type, NoneType].
586
+
587
+ Args:
588
+ dtype (Type): type to be optional
589
+
590
+ Returns:
591
+ Type: Optional version of the type.
592
+ """
593
+ return UnionType([TypeRegistry.type_from_dtype(dtype), NoneType()])
594
+
595
+
596
+ class ListType(Type):
597
+ """A list of homogeneous types."""
598
+
599
+ name = "list"
600
+ types: t.ClassVar[t.List[type]] = [list, tuple, set, frozenset]
601
+
602
+ def __init__(
603
+ self,
604
+ element_type: t.Optional[ConvertibleToType] = None,
605
+ length: t.Optional[int] = None,
606
+ ):
607
+ if element_type is None:
608
+ wb_type: Type = UnknownType()
609
+ else:
610
+ wb_type = TypeRegistry.type_from_dtype(element_type)
611
+
612
+ self.params.update({"element_type": wb_type, "length": length})
613
+
614
+ @classmethod
615
+ def from_obj(cls, py_obj: t.Optional[t.Any] = None) -> "ListType":
616
+ if py_obj is None or not hasattr(py_obj, "__iter__"):
617
+ raise TypeError("ListType.from_obj expects py_obj to by list-like")
618
+ else:
619
+ if hasattr(py_obj, "tolist"):
620
+ py_list = py_obj.tolist()
621
+ else:
622
+ py_list = list(py_obj)
623
+ elm_type = (
624
+ UnknownType() if None not in py_list else OptionalType(UnknownType())
625
+ )
626
+ for item in py_list:
627
+ _elm_type = elm_type.assign(item)
628
+ # Commenting this out since we don't want to crash user code at this point, but rather
629
+ # retain an invalid internal list type.
630
+ # if isinstance(_elm_type, InvalidType):
631
+ # raise TypeError(
632
+ # "List contained incompatible types. Item at index {}: \n{}".format(
633
+ # ndx, elm_type.explain(item, 1)
634
+ # )
635
+ # )
636
+
637
+ elm_type = _elm_type
638
+
639
+ return cls(elm_type, len(py_list))
640
+
641
+ def assign_type(self, wb_type: "Type") -> t.Union["ListType", InvalidType]:
642
+ if isinstance(wb_type, ListType):
643
+ assigned_type = self.params["element_type"].assign_type(
644
+ wb_type.params["element_type"]
645
+ )
646
+ if not isinstance(assigned_type, InvalidType):
647
+ return ListType(
648
+ assigned_type,
649
+ None
650
+ if self.params["length"] != wb_type.params["length"]
651
+ else self.params["length"],
652
+ )
653
+
654
+ return InvalidType()
655
+
656
+ def assign(
657
+ self, py_obj: t.Optional[t.Any] = None
658
+ ) -> t.Union["ListType", InvalidType]:
659
+ if hasattr(py_obj, "__iter__"):
660
+ new_element_type = self.params["element_type"]
661
+ # The following ignore is needed since the above hasattr(py_obj, "__iter__") enforces iteration
662
+ # error: Argument 1 to "list" has incompatible type "Optional[Any]"; expected "Iterable[Any]"
663
+ py_list = list(py_obj) # type: ignore
664
+ for obj in py_list:
665
+ new_element_type = new_element_type.assign(obj)
666
+ if isinstance(new_element_type, InvalidType):
667
+ return InvalidType()
668
+ return ListType(new_element_type, len(py_list))
669
+
670
+ return InvalidType()
671
+
672
+ def explain(self, other: t.Any, depth=0) -> str:
673
+ exp = super().explain(other, depth)
674
+ gap = "".join(["\t"] * depth)
675
+ if ( # yes, this is a bit verbose, but the mypy typechecker likes it this way
676
+ isinstance(other, list)
677
+ or isinstance(other, tuple)
678
+ or isinstance(other, set)
679
+ or isinstance(other, frozenset)
680
+ ):
681
+ new_element_type = self.params["element_type"]
682
+ for ndx, obj in enumerate(list(other)):
683
+ _new_element_type = new_element_type.assign(obj)
684
+ if isinstance(_new_element_type, InvalidType):
685
+ exp += "\n{}Index {}:\n{}".format(
686
+ gap, ndx, new_element_type.explain(obj, depth + 1)
687
+ )
688
+ break
689
+ new_element_type = _new_element_type
690
+ return exp
691
+
692
+ def __repr__(self):
693
+ return "{}[]".format(self.params["element_type"])
694
+
695
+
696
+ class NDArrayType(Type):
697
+ """Represents a list of homogeneous types."""
698
+
699
+ name = "ndarray"
700
+ types: t.ClassVar[t.List[type]] = [] # will manually add type if np is available
701
+ _serialization_path: t.Optional[t.Dict[str, str]]
702
+
703
+ def __init__(
704
+ self,
705
+ shape: t.Sequence[int],
706
+ serialization_path: t.Optional[t.Dict[str, str]] = None,
707
+ ):
708
+ self.params.update({"shape": list(shape)})
709
+ self._serialization_path = serialization_path
710
+
711
+ @classmethod
712
+ def from_obj(cls, py_obj: t.Optional[t.Any] = None) -> "NDArrayType":
713
+ if is_numpy_array(py_obj):
714
+ return cls(py_obj.shape) # type: ignore
715
+ elif isinstance(py_obj, list):
716
+ shape = []
717
+ target = py_obj
718
+ while isinstance(target, list):
719
+ dim = len(target)
720
+ shape.append(dim)
721
+ if dim > 0:
722
+ target = target[0]
723
+ return cls(shape)
724
+ else:
725
+ raise TypeError(
726
+ "NDArrayType.from_obj expects py_obj to be ndarray or list, found {}".format(
727
+ py_obj.__class__
728
+ )
729
+ )
730
+
731
+ def assign_type(self, wb_type: "Type") -> t.Union["NDArrayType", InvalidType]:
732
+ if (
733
+ isinstance(wb_type, NDArrayType)
734
+ and self.params["shape"] == wb_type.params["shape"]
735
+ ):
736
+ return self
737
+ elif isinstance(wb_type, ListType):
738
+ # Should we return error here?
739
+ return self
740
+
741
+ return InvalidType()
742
+
743
+ def assign(
744
+ self, py_obj: t.Optional[t.Any] = None
745
+ ) -> t.Union["NDArrayType", InvalidType]:
746
+ if is_numpy_array(py_obj) or isinstance(py_obj, list):
747
+ py_type = self.from_obj(py_obj)
748
+ return self.assign_type(py_type)
749
+
750
+ return InvalidType()
751
+
752
+ def to_json(self, artifact: t.Optional["Artifact"] = None) -> t.Dict[str, t.Any]:
753
+ # custom override to support serialization path outside of params internal dict
754
+ res = {
755
+ "wb_type": self.name,
756
+ "params": {
757
+ "shape": self.params["shape"],
758
+ "serialization_path": self._serialization_path,
759
+ },
760
+ }
761
+
762
+ return res
763
+
764
+ def _get_serialization_path(self) -> t.Optional[t.Dict[str, str]]:
765
+ return self._serialization_path
766
+
767
+ def _set_serialization_path(self, path: str, key: str) -> None:
768
+ self._serialization_path = {"path": path, "key": key}
769
+
770
+ def _clear_serialization_path(self) -> None:
771
+ self._serialization_path = None
772
+
773
+
774
+ if np:
775
+ NDArrayType.types.append(np.ndarray)
776
+
777
+ # class KeyPolicy:
778
+ # EXACT = "E" # require exact key match
779
+ # SUBSET = "S" # all known keys are optional and unknown keys are disallowed
780
+ # UNRESTRICTED = "U" # all known keys are optional and unknown keys are Unknown
781
+
782
+
783
+ class TypedDictType(Type):
784
+ """Represents a dictionary object where each key can have a type."""
785
+
786
+ name = "typedDict"
787
+ legacy_names = ["dictionary"]
788
+ types: t.ClassVar[t.List[type]] = [dict]
789
+
790
+ def __init__(
791
+ self,
792
+ type_map: t.Optional[t.Dict[str, ConvertibleToType]] = None,
793
+ ):
794
+ if type_map is None:
795
+ type_map = {}
796
+ self.params.update(
797
+ {
798
+ "type_map": {
799
+ key: TypeRegistry.type_from_dtype(type_map[key]) for key in type_map
800
+ }
801
+ }
802
+ )
803
+
804
+ @classmethod
805
+ def from_obj(cls, py_obj: t.Optional[t.Any] = None) -> "TypedDictType":
806
+ if not isinstance(py_obj, dict):
807
+ TypeError("TypedDictType.from_obj expects a dictionary")
808
+
809
+ assert isinstance(py_obj, dict) # helps mypy type checker
810
+ return cls({key: TypeRegistry.type_of(py_obj[key]) for key in py_obj})
811
+
812
+ def assign_type(self, wb_type: "Type") -> t.Union["TypedDictType", InvalidType]:
813
+ if (
814
+ isinstance(wb_type, TypedDictType)
815
+ and len(
816
+ set(wb_type.params["type_map"].keys())
817
+ - set(self.params["type_map"].keys())
818
+ )
819
+ == 0
820
+ ):
821
+ type_map = {}
822
+ for key in self.params["type_map"]:
823
+ type_map[key] = self.params["type_map"][key].assign_type(
824
+ wb_type.params["type_map"].get(key, UnknownType())
825
+ )
826
+ if isinstance(type_map[key], InvalidType):
827
+ return InvalidType()
828
+ return TypedDictType(type_map)
829
+
830
+ return InvalidType()
831
+
832
+ def assign(
833
+ self, py_obj: t.Optional[t.Any] = None
834
+ ) -> t.Union["TypedDictType", InvalidType]:
835
+ if (
836
+ isinstance(py_obj, dict)
837
+ and len(set(py_obj.keys()) - set(self.params["type_map"].keys())) == 0
838
+ ):
839
+ type_map = {}
840
+ for key in self.params["type_map"]:
841
+ type_map[key] = self.params["type_map"][key].assign(
842
+ py_obj.get(key, None)
843
+ )
844
+ if isinstance(type_map[key], InvalidType):
845
+ return InvalidType()
846
+ return TypedDictType(type_map)
847
+
848
+ return InvalidType()
849
+
850
+ def explain(self, other: t.Any, depth=0) -> str:
851
+ exp = super().explain(other, depth)
852
+ gap = "".join(["\t"] * depth)
853
+ if isinstance(other, dict):
854
+ extra_keys = set(other.keys()) - set(self.params["type_map"].keys())
855
+ if len(extra_keys) > 0:
856
+ exp += "\n{}Found extra keys: {}".format(
857
+ gap, ",".join(list(extra_keys))
858
+ )
859
+
860
+ for key in self.params["type_map"]:
861
+ val = other.get(key, None)
862
+ if isinstance(self.params["type_map"][key].assign(val), InvalidType):
863
+ exp += "\n{}Key '{}':\n{}".format(
864
+ gap,
865
+ key,
866
+ self.params["type_map"][key].explain(val, depth=depth + 1),
867
+ )
868
+ return exp
869
+
870
+ def __repr__(self):
871
+ return "{}".format(self.params["type_map"])
872
+
873
+
874
+ # Special Types
875
+ TypeRegistry.add(InvalidType)
876
+ TypeRegistry.add(AnyType)
877
+ TypeRegistry.add(UnknownType)
878
+
879
+ # Types with default type mappings
880
+ TypeRegistry.add(NoneType)
881
+ TypeRegistry.add(StringType)
882
+ TypeRegistry.add(TimestampType)
883
+ TypeRegistry.add(NumberType)
884
+ TypeRegistry.add(BooleanType)
885
+ TypeRegistry.add(ListType)
886
+ TypeRegistry.add(TypedDictType)
887
+
888
+ # Types without default type mappings
889
+ TypeRegistry.add(UnionType)
890
+ TypeRegistry.add(PythonObjectType)
891
+ TypeRegistry.add(ConstType)
892
+
893
+ # Common Industry Types
894
+ TypeRegistry.add(NDArrayType)
895
+
896
+ __all__ = [
897
+ "TypeRegistry",
898
+ "InvalidType",
899
+ "UnknownType",
900
+ "AnyType",
901
+ "NoneType",
902
+ "StringType",
903
+ "NumberType",
904
+ "TimestampType",
905
+ "BooleanType",
906
+ "ListType",
907
+ "TypedDictType",
908
+ "UnionType",
909
+ "PythonObjectType",
910
+ "ConstType",
911
+ "OptionalType",
912
+ "Type",
913
+ "NDArrayType",
914
+ ]