maxframe 1.3.0__cp38-cp38-win32.whl → 2.0.0b1__cp38-cp38-win32.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.

Potentially problematic release.


This version of maxframe might be problematic. Click here for more details.

Files changed (643) hide show
  1. maxframe/_utils.cp38-win32.pyd +0 -0
  2. maxframe/_utils.pyi +21 -0
  3. maxframe/_utils.pyx +4 -3
  4. maxframe/codegen/__init__.py +27 -0
  5. maxframe/{codegen.py → codegen/core.py} +49 -43
  6. maxframe/codegen/spe/__init__.py +16 -0
  7. maxframe/codegen/spe/core.py +307 -0
  8. maxframe/codegen/spe/dataframe/__init__.py +37 -0
  9. maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
  10. maxframe/codegen/spe/dataframe/accessors/base.py +53 -0
  11. maxframe/codegen/spe/dataframe/accessors/dict_.py +194 -0
  12. maxframe/codegen/spe/dataframe/accessors/list_.py +80 -0
  13. maxframe/codegen/spe/dataframe/arithmetic.py +84 -0
  14. maxframe/codegen/spe/dataframe/datasource.py +181 -0
  15. maxframe/codegen/spe/dataframe/datastore.py +204 -0
  16. maxframe/codegen/spe/dataframe/extensions.py +63 -0
  17. maxframe/codegen/spe/dataframe/fetch.py +26 -0
  18. maxframe/codegen/spe/dataframe/groupby.py +224 -0
  19. maxframe/codegen/spe/dataframe/indexing.py +238 -0
  20. maxframe/codegen/spe/dataframe/merge.py +73 -0
  21. maxframe/codegen/spe/dataframe/misc.py +286 -0
  22. maxframe/codegen/spe/dataframe/missing.py +64 -0
  23. maxframe/codegen/spe/dataframe/reduction.py +160 -0
  24. maxframe/codegen/spe/dataframe/sort.py +83 -0
  25. maxframe/codegen/spe/dataframe/statistics.py +46 -0
  26. maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
  27. maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
  28. maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
  29. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +310 -0
  30. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +137 -0
  31. maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
  32. maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
  33. maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
  34. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +76 -0
  35. maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
  36. maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
  37. maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
  38. maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
  39. maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
  40. maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
  41. maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
  42. maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
  43. maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
  44. maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
  45. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +234 -0
  46. maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
  47. maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
  48. maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
  49. maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
  50. maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
  51. maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
  52. maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
  53. maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
  54. maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
  55. maxframe/codegen/spe/dataframe/tests/test_groupby.py +225 -0
  56. maxframe/codegen/spe/dataframe/tests/test_merge.py +400 -0
  57. maxframe/codegen/spe/dataframe/tests/test_reduction.py +104 -0
  58. maxframe/codegen/spe/dataframe/tests/test_sort.py +159 -0
  59. maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
  60. maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
  61. maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
  62. maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
  63. maxframe/codegen/spe/dataframe/tseries.py +46 -0
  64. maxframe/codegen/spe/dataframe/udf.py +62 -0
  65. maxframe/codegen/spe/dataframe/value_counts.py +31 -0
  66. maxframe/codegen/spe/dataframe/window.py +65 -0
  67. maxframe/codegen/spe/learn/__init__.py +15 -0
  68. maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
  69. maxframe/codegen/spe/learn/contrib/lightgbm.py +160 -0
  70. maxframe/codegen/spe/learn/contrib/models.py +41 -0
  71. maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
  72. maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
  73. maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
  74. maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
  75. maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
  76. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +98 -0
  77. maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
  78. maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
  79. maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
  80. maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
  81. maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
  82. maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
  83. maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
  84. maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
  85. maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
  86. maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
  87. maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
  88. maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
  89. maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
  90. maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
  91. maxframe/codegen/spe/learn/utils/__init__.py +15 -0
  92. maxframe/codegen/spe/learn/utils/checks.py +55 -0
  93. maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
  94. maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
  95. maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
  96. maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
  97. maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
  98. maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
  99. maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
  100. maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
  101. maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
  102. maxframe/codegen/spe/learn/utils/validation.py +35 -0
  103. maxframe/codegen/spe/objects.py +26 -0
  104. maxframe/codegen/spe/remote.py +29 -0
  105. maxframe/codegen/spe/tensor/__init__.py +28 -0
  106. maxframe/codegen/spe/tensor/arithmetic.py +95 -0
  107. maxframe/codegen/spe/tensor/core.py +41 -0
  108. maxframe/codegen/spe/tensor/datasource.py +165 -0
  109. maxframe/codegen/spe/tensor/extensions.py +35 -0
  110. maxframe/codegen/spe/tensor/fetch.py +26 -0
  111. maxframe/codegen/spe/tensor/indexing.py +63 -0
  112. maxframe/codegen/spe/tensor/linalg.py +63 -0
  113. maxframe/codegen/spe/tensor/merge.py +31 -0
  114. maxframe/codegen/spe/tensor/misc.py +121 -0
  115. maxframe/codegen/spe/tensor/random.py +29 -0
  116. maxframe/codegen/spe/tensor/reduction.py +39 -0
  117. maxframe/codegen/spe/tensor/reshape.py +26 -0
  118. maxframe/codegen/spe/tensor/sort.py +42 -0
  119. maxframe/codegen/spe/tensor/special.py +35 -0
  120. maxframe/codegen/spe/tensor/statistics.py +24 -0
  121. maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
  122. maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
  123. maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
  124. maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
  125. maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
  126. maxframe/codegen/spe/tensor/tests/test_linalg.py +38 -0
  127. maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
  128. maxframe/codegen/spe/tensor/tests/test_misc.py +94 -0
  129. maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
  130. maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
  131. maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
  132. maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
  133. maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
  134. maxframe/codegen/spe/tensor/tests/test_statistics.py +29 -0
  135. maxframe/codegen/spe/tests/__init__.py +13 -0
  136. maxframe/codegen/spe/tests/test_remote.py +29 -0
  137. maxframe/codegen/spe/tests/test_spe_codegen.py +141 -0
  138. maxframe/codegen/spe/utils.py +54 -0
  139. maxframe/codegen/tests/__init__.py +13 -0
  140. maxframe/{tests → codegen/tests}/test_codegen.py +3 -5
  141. maxframe/config/__init__.py +1 -1
  142. maxframe/config/config.py +50 -23
  143. maxframe/config/tests/test_config.py +4 -12
  144. maxframe/config/validators.py +5 -0
  145. maxframe/conftest.py +38 -10
  146. maxframe/core/__init__.py +1 -0
  147. maxframe/core/context.py +110 -0
  148. maxframe/core/entity/__init__.py +1 -0
  149. maxframe/core/entity/core.py +0 -7
  150. maxframe/core/entity/objects.py +19 -5
  151. maxframe/core/entity/output_types.py +11 -0
  152. maxframe/core/entity/tests/test_objects.py +11 -12
  153. maxframe/core/entity/tileables.py +3 -1
  154. maxframe/core/entity/utils.py +15 -0
  155. maxframe/core/graph/__init__.py +6 -1
  156. maxframe/core/graph/builder/base.py +5 -1
  157. maxframe/core/graph/core.cp38-win32.pyd +0 -0
  158. maxframe/core/graph/core.pyx +17 -6
  159. maxframe/core/graph/entity.py +18 -6
  160. maxframe/core/operator/__init__.py +8 -3
  161. maxframe/core/operator/base.py +35 -12
  162. maxframe/core/operator/core.py +37 -14
  163. maxframe/core/operator/fetch.py +5 -18
  164. maxframe/core/operator/objects.py +0 -20
  165. maxframe/core/operator/shuffle.py +6 -72
  166. maxframe/dataframe/__init__.py +1 -0
  167. maxframe/dataframe/accessors/datetime_/core.py +7 -4
  168. maxframe/dataframe/accessors/string_/core.py +9 -6
  169. maxframe/dataframe/arithmetic/core.py +31 -20
  170. maxframe/dataframe/arithmetic/tests/test_arithmetic.py +6 -0
  171. maxframe/dataframe/core.py +98 -91
  172. maxframe/dataframe/datasource/core.py +8 -1
  173. maxframe/dataframe/datasource/date_range.py +8 -0
  174. maxframe/dataframe/datasource/from_index.py +9 -5
  175. maxframe/dataframe/datasource/from_records.py +9 -2
  176. maxframe/dataframe/datasource/from_tensor.py +32 -21
  177. maxframe/dataframe/datasource/read_csv.py +8 -2
  178. maxframe/dataframe/datasource/read_odps_query.py +33 -3
  179. maxframe/dataframe/datasource/read_odps_table.py +20 -5
  180. maxframe/dataframe/datasource/read_parquet.py +8 -3
  181. maxframe/dataframe/datasource/tests/test_datasource.py +33 -0
  182. maxframe/dataframe/datastore/tests/test_to_odps.py +52 -1
  183. maxframe/dataframe/datastore/to_csv.py +7 -3
  184. maxframe/dataframe/datastore/to_odps.py +42 -6
  185. maxframe/dataframe/extensions/__init__.py +6 -1
  186. maxframe/dataframe/extensions/apply_chunk.py +96 -136
  187. maxframe/dataframe/extensions/flatjson.py +3 -2
  188. maxframe/dataframe/extensions/flatmap.py +15 -7
  189. maxframe/dataframe/fetch/core.py +12 -1
  190. maxframe/dataframe/groupby/__init__.py +7 -0
  191. maxframe/dataframe/groupby/aggregation.py +62 -9
  192. maxframe/dataframe/groupby/apply.py +50 -74
  193. maxframe/dataframe/groupby/apply_chunk.py +393 -0
  194. maxframe/dataframe/groupby/core.py +80 -17
  195. maxframe/dataframe/groupby/extensions.py +26 -0
  196. maxframe/dataframe/groupby/fill.py +9 -4
  197. maxframe/dataframe/groupby/sample.py +7 -7
  198. maxframe/dataframe/groupby/tests/test_groupby.py +3 -3
  199. maxframe/dataframe/groupby/transform.py +57 -54
  200. maxframe/dataframe/indexing/align.py +7 -6
  201. maxframe/dataframe/indexing/getitem.py +9 -8
  202. maxframe/dataframe/indexing/iloc.py +28 -23
  203. maxframe/dataframe/indexing/insert.py +7 -3
  204. maxframe/dataframe/indexing/loc.py +9 -8
  205. maxframe/dataframe/indexing/reindex.py +36 -30
  206. maxframe/dataframe/indexing/rename_axis.py +18 -10
  207. maxframe/dataframe/indexing/reset_index.py +0 -2
  208. maxframe/dataframe/indexing/sample.py +13 -9
  209. maxframe/dataframe/indexing/set_axis.py +9 -6
  210. maxframe/dataframe/indexing/setitem.py +8 -5
  211. maxframe/dataframe/indexing/where.py +12 -9
  212. maxframe/dataframe/merge/__init__.py +0 -1
  213. maxframe/dataframe/merge/concat.py +10 -31
  214. maxframe/dataframe/merge/merge.py +2 -24
  215. maxframe/dataframe/misc/__init__.py +6 -0
  216. maxframe/dataframe/misc/_duplicate.py +7 -3
  217. maxframe/dataframe/misc/apply.py +106 -139
  218. maxframe/dataframe/misc/astype.py +3 -2
  219. maxframe/dataframe/misc/case_when.py +11 -7
  220. maxframe/dataframe/misc/cut.py +11 -10
  221. maxframe/dataframe/misc/describe.py +7 -3
  222. maxframe/dataframe/misc/drop.py +13 -11
  223. maxframe/dataframe/misc/eval.py +0 -2
  224. maxframe/dataframe/misc/get_dummies.py +78 -49
  225. maxframe/dataframe/misc/isin.py +13 -10
  226. maxframe/dataframe/misc/map.py +21 -6
  227. maxframe/dataframe/misc/melt.py +8 -1
  228. maxframe/dataframe/misc/pivot.py +232 -0
  229. maxframe/dataframe/misc/pivot_table.py +52 -40
  230. maxframe/dataframe/misc/rechunk.py +59 -0
  231. maxframe/dataframe/misc/shift.py +7 -4
  232. maxframe/dataframe/misc/stack.py +5 -3
  233. maxframe/dataframe/misc/tests/test_misc.py +167 -1
  234. maxframe/dataframe/misc/transform.py +63 -65
  235. maxframe/dataframe/misc/value_counts.py +7 -4
  236. maxframe/dataframe/missing/dropna.py +16 -7
  237. maxframe/dataframe/missing/fillna.py +18 -10
  238. maxframe/dataframe/missing/replace.py +10 -6
  239. maxframe/dataframe/missing/tests/test_missing.py +2 -2
  240. maxframe/dataframe/operators.py +1 -27
  241. maxframe/dataframe/reduction/aggregation.py +128 -3
  242. maxframe/dataframe/reduction/core.py +20 -6
  243. maxframe/dataframe/reduction/median.py +1 -1
  244. maxframe/dataframe/reduction/tests/test_reduction.py +33 -0
  245. maxframe/dataframe/reduction/unique.py +53 -7
  246. maxframe/dataframe/statistics/corr.py +9 -6
  247. maxframe/dataframe/statistics/quantile.py +9 -6
  248. maxframe/dataframe/tseries/to_datetime.py +6 -4
  249. maxframe/dataframe/utils.py +219 -31
  250. maxframe/dataframe/window/rolling.py +7 -4
  251. maxframe/env.py +1 -0
  252. maxframe/errors.py +9 -0
  253. maxframe/extension.py +13 -2
  254. maxframe/io/objects/core.py +67 -51
  255. maxframe/io/objects/tensor.py +73 -17
  256. maxframe/io/objects/tests/test_object_io.py +8 -55
  257. maxframe/io/odpsio/arrow.py +15 -2
  258. maxframe/io/odpsio/schema.py +43 -13
  259. maxframe/io/odpsio/tableio.py +63 -11
  260. maxframe/io/odpsio/tests/test_arrow.py +1 -2
  261. maxframe/io/odpsio/tests/test_schema.py +114 -1
  262. maxframe/io/odpsio/tests/test_tableio.py +42 -0
  263. maxframe/io/odpsio/tests/test_volumeio.py +22 -48
  264. maxframe/learn/__init__.py +2 -2
  265. maxframe/learn/contrib/__init__.py +2 -2
  266. maxframe/learn/contrib/graph/connected_components.py +2 -1
  267. maxframe/learn/contrib/lightgbm/__init__.py +33 -0
  268. maxframe/learn/contrib/lightgbm/_predict.py +138 -0
  269. maxframe/learn/contrib/lightgbm/_train.py +163 -0
  270. maxframe/learn/contrib/lightgbm/callback.py +114 -0
  271. maxframe/learn/contrib/lightgbm/classifier.py +199 -0
  272. maxframe/learn/contrib/lightgbm/core.py +372 -0
  273. maxframe/learn/contrib/lightgbm/dataset.py +153 -0
  274. maxframe/learn/contrib/lightgbm/regressor.py +29 -0
  275. maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
  276. maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
  277. maxframe/learn/contrib/llm/models/dashscope.py +34 -0
  278. maxframe/learn/contrib/llm/models/managed.py +15 -0
  279. maxframe/learn/contrib/llm/multi_modal.py +92 -0
  280. maxframe/learn/contrib/llm/text.py +21 -5
  281. maxframe/learn/contrib/models.py +38 -9
  282. maxframe/learn/contrib/utils.py +55 -0
  283. maxframe/learn/contrib/xgboost/callback.py +86 -0
  284. maxframe/learn/contrib/xgboost/classifier.py +26 -30
  285. maxframe/learn/contrib/xgboost/core.py +53 -42
  286. maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
  287. maxframe/learn/contrib/xgboost/predict.py +13 -8
  288. maxframe/learn/contrib/xgboost/regressor.py +28 -27
  289. maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
  290. maxframe/learn/contrib/xgboost/train.py +59 -16
  291. maxframe/learn/core.py +252 -0
  292. maxframe/learn/datasets/__init__.py +20 -0
  293. maxframe/learn/datasets/samples_generator.py +628 -0
  294. maxframe/learn/linear_model/__init__.py +15 -0
  295. maxframe/learn/linear_model/_base.py +163 -0
  296. maxframe/learn/linear_model/_lin_reg.py +175 -0
  297. maxframe/learn/metrics/__init__.py +25 -0
  298. maxframe/learn/metrics/_check_targets.py +95 -0
  299. maxframe/learn/metrics/_classification.py +1121 -0
  300. maxframe/learn/metrics/_regression.py +256 -0
  301. maxframe/learn/model_selection/__init__.py +15 -0
  302. maxframe/learn/model_selection/_split.py +451 -0
  303. maxframe/learn/model_selection/tests/__init__.py +13 -0
  304. maxframe/learn/model_selection/tests/test_split.py +156 -0
  305. maxframe/learn/preprocessing/__init__.py +16 -0
  306. maxframe/learn/preprocessing/_data/__init__.py +17 -0
  307. maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
  308. maxframe/learn/preprocessing/_data/normalize.py +127 -0
  309. maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
  310. maxframe/learn/preprocessing/_data/utils.py +79 -0
  311. maxframe/learn/preprocessing/_label/__init__.py +16 -0
  312. maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
  313. maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
  314. maxframe/learn/utils/__init__.py +4 -0
  315. maxframe/learn/utils/_encode.py +314 -0
  316. maxframe/learn/utils/checks.py +161 -0
  317. maxframe/learn/utils/core.py +33 -0
  318. maxframe/learn/utils/extmath.py +176 -0
  319. maxframe/learn/utils/multiclass.py +292 -0
  320. maxframe/learn/utils/shuffle.py +114 -0
  321. maxframe/learn/utils/sparsefuncs.py +87 -0
  322. maxframe/learn/utils/validation.py +775 -0
  323. maxframe/lib/__init__.py +0 -2
  324. maxframe/lib/compat.py +145 -0
  325. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  326. maxframe/lib/mmh3.cp38-win32.pyd +0 -0
  327. maxframe/lib/sparse/__init__.py +10 -15
  328. maxframe/lib/sparse/array.py +45 -33
  329. maxframe/lib/sparse/core.py +0 -2
  330. maxframe/lib/sparse/linalg.py +31 -0
  331. maxframe/lib/sparse/matrix.py +5 -2
  332. maxframe/lib/sparse/tests/__init__.py +0 -2
  333. maxframe/lib/sparse/tests/test_sparse.py +53 -53
  334. maxframe/lib/sparse/vector.py +0 -2
  335. maxframe/mixin.py +59 -2
  336. maxframe/opcodes.py +13 -5
  337. maxframe/protocol.py +67 -14
  338. maxframe/remote/core.py +16 -14
  339. maxframe/remote/run_script.py +6 -3
  340. maxframe/serialization/__init__.py +2 -0
  341. maxframe/serialization/core.cp38-win32.pyd +0 -0
  342. maxframe/serialization/core.pxd +3 -0
  343. maxframe/serialization/core.pyi +3 -1
  344. maxframe/serialization/core.pyx +82 -4
  345. maxframe/serialization/pandas.py +5 -1
  346. maxframe/serialization/serializables/core.py +6 -5
  347. maxframe/serialization/serializables/field.py +2 -2
  348. maxframe/serialization/serializables/tests/test_field_type.py +3 -5
  349. maxframe/serialization/tests/test_serial.py +27 -0
  350. maxframe/session.py +4 -71
  351. maxframe/sperunner.py +165 -0
  352. maxframe/tensor/__init__.py +35 -2
  353. maxframe/tensor/arithmetic/__init__.py +2 -4
  354. maxframe/tensor/arithmetic/abs.py +0 -2
  355. maxframe/tensor/arithmetic/absolute.py +0 -2
  356. maxframe/tensor/arithmetic/add.py +34 -4
  357. maxframe/tensor/arithmetic/angle.py +0 -2
  358. maxframe/tensor/arithmetic/arccos.py +1 -4
  359. maxframe/tensor/arithmetic/arccosh.py +1 -3
  360. maxframe/tensor/arithmetic/arcsin.py +0 -2
  361. maxframe/tensor/arithmetic/arcsinh.py +0 -2
  362. maxframe/tensor/arithmetic/arctan.py +0 -2
  363. maxframe/tensor/arithmetic/arctan2.py +0 -2
  364. maxframe/tensor/arithmetic/arctanh.py +0 -2
  365. maxframe/tensor/arithmetic/around.py +0 -2
  366. maxframe/tensor/arithmetic/bitand.py +0 -2
  367. maxframe/tensor/arithmetic/bitor.py +1 -3
  368. maxframe/tensor/arithmetic/bitxor.py +1 -3
  369. maxframe/tensor/arithmetic/cbrt.py +0 -2
  370. maxframe/tensor/arithmetic/ceil.py +0 -2
  371. maxframe/tensor/arithmetic/clip.py +13 -13
  372. maxframe/tensor/arithmetic/conj.py +0 -2
  373. maxframe/tensor/arithmetic/copysign.py +0 -2
  374. maxframe/tensor/arithmetic/core.py +47 -39
  375. maxframe/tensor/arithmetic/cos.py +1 -3
  376. maxframe/tensor/arithmetic/cosh.py +0 -2
  377. maxframe/tensor/arithmetic/deg2rad.py +0 -2
  378. maxframe/tensor/arithmetic/degrees.py +0 -2
  379. maxframe/tensor/arithmetic/divide.py +0 -2
  380. maxframe/tensor/arithmetic/equal.py +0 -2
  381. maxframe/tensor/arithmetic/exp.py +1 -3
  382. maxframe/tensor/arithmetic/exp2.py +0 -2
  383. maxframe/tensor/arithmetic/expm1.py +0 -2
  384. maxframe/tensor/arithmetic/fabs.py +0 -2
  385. maxframe/tensor/arithmetic/fix.py +0 -2
  386. maxframe/tensor/arithmetic/float_power.py +0 -2
  387. maxframe/tensor/arithmetic/floor.py +0 -2
  388. maxframe/tensor/arithmetic/floordiv.py +0 -2
  389. maxframe/tensor/arithmetic/fmax.py +0 -2
  390. maxframe/tensor/arithmetic/fmin.py +0 -2
  391. maxframe/tensor/arithmetic/fmod.py +0 -2
  392. maxframe/tensor/arithmetic/frexp.py +6 -2
  393. maxframe/tensor/arithmetic/greater.py +0 -2
  394. maxframe/tensor/arithmetic/greater_equal.py +0 -2
  395. maxframe/tensor/arithmetic/hypot.py +0 -2
  396. maxframe/tensor/arithmetic/i0.py +1 -3
  397. maxframe/tensor/arithmetic/imag.py +0 -2
  398. maxframe/tensor/arithmetic/invert.py +1 -3
  399. maxframe/tensor/arithmetic/isclose.py +0 -2
  400. maxframe/tensor/arithmetic/iscomplex.py +0 -2
  401. maxframe/tensor/arithmetic/isfinite.py +1 -3
  402. maxframe/tensor/arithmetic/isinf.py +0 -2
  403. maxframe/tensor/arithmetic/isnan.py +0 -2
  404. maxframe/tensor/arithmetic/isreal.py +0 -2
  405. maxframe/tensor/arithmetic/ldexp.py +0 -2
  406. maxframe/tensor/arithmetic/less.py +0 -2
  407. maxframe/tensor/arithmetic/less_equal.py +0 -2
  408. maxframe/tensor/arithmetic/log.py +1 -3
  409. maxframe/tensor/arithmetic/log10.py +1 -3
  410. maxframe/tensor/arithmetic/log1p.py +1 -3
  411. maxframe/tensor/arithmetic/log2.py +1 -3
  412. maxframe/tensor/arithmetic/logaddexp.py +0 -2
  413. maxframe/tensor/arithmetic/logaddexp2.py +0 -2
  414. maxframe/tensor/arithmetic/logical_and.py +0 -2
  415. maxframe/tensor/arithmetic/logical_not.py +1 -3
  416. maxframe/tensor/arithmetic/logical_or.py +0 -2
  417. maxframe/tensor/arithmetic/logical_xor.py +0 -2
  418. maxframe/tensor/arithmetic/lshift.py +0 -2
  419. maxframe/tensor/arithmetic/maximum.py +0 -2
  420. maxframe/tensor/arithmetic/minimum.py +0 -2
  421. maxframe/tensor/arithmetic/mod.py +0 -2
  422. maxframe/tensor/arithmetic/modf.py +6 -2
  423. maxframe/tensor/arithmetic/multiply.py +37 -4
  424. maxframe/tensor/arithmetic/nan_to_num.py +0 -2
  425. maxframe/tensor/arithmetic/negative.py +0 -2
  426. maxframe/tensor/arithmetic/nextafter.py +0 -2
  427. maxframe/tensor/arithmetic/not_equal.py +0 -2
  428. maxframe/tensor/arithmetic/positive.py +0 -2
  429. maxframe/tensor/arithmetic/power.py +0 -2
  430. maxframe/tensor/arithmetic/rad2deg.py +0 -2
  431. maxframe/tensor/arithmetic/radians.py +0 -2
  432. maxframe/tensor/arithmetic/real.py +0 -2
  433. maxframe/tensor/arithmetic/reciprocal.py +5 -3
  434. maxframe/tensor/arithmetic/rint.py +1 -3
  435. maxframe/tensor/arithmetic/rshift.py +0 -2
  436. maxframe/tensor/arithmetic/setimag.py +0 -2
  437. maxframe/tensor/arithmetic/setreal.py +0 -2
  438. maxframe/tensor/arithmetic/sign.py +0 -2
  439. maxframe/tensor/arithmetic/signbit.py +0 -2
  440. maxframe/tensor/arithmetic/sin.py +0 -2
  441. maxframe/tensor/arithmetic/sinc.py +1 -3
  442. maxframe/tensor/arithmetic/sinh.py +0 -2
  443. maxframe/tensor/arithmetic/spacing.py +0 -2
  444. maxframe/tensor/arithmetic/sqrt.py +0 -2
  445. maxframe/tensor/arithmetic/square.py +0 -2
  446. maxframe/tensor/arithmetic/subtract.py +4 -2
  447. maxframe/tensor/arithmetic/tan.py +0 -2
  448. maxframe/tensor/arithmetic/tanh.py +0 -2
  449. maxframe/tensor/arithmetic/tests/__init__.py +0 -2
  450. maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
  451. maxframe/tensor/arithmetic/truediv.py +0 -2
  452. maxframe/tensor/arithmetic/trunc.py +0 -2
  453. maxframe/tensor/arithmetic/utils.py +32 -6
  454. maxframe/tensor/array_utils.py +3 -25
  455. maxframe/tensor/core.py +6 -6
  456. maxframe/tensor/datasource/__init__.py +10 -2
  457. maxframe/tensor/datasource/arange.py +0 -2
  458. maxframe/tensor/datasource/array.py +3 -22
  459. maxframe/tensor/datasource/core.py +15 -10
  460. maxframe/tensor/datasource/diag.py +140 -0
  461. maxframe/tensor/datasource/diagflat.py +69 -0
  462. maxframe/tensor/datasource/empty.py +0 -2
  463. maxframe/tensor/datasource/eye.py +95 -0
  464. maxframe/tensor/datasource/from_dataframe.py +0 -2
  465. maxframe/tensor/datasource/from_dense.py +0 -17
  466. maxframe/tensor/datasource/from_sparse.py +0 -2
  467. maxframe/tensor/datasource/full.py +0 -2
  468. maxframe/tensor/datasource/identity.py +54 -0
  469. maxframe/tensor/datasource/indices.py +115 -0
  470. maxframe/tensor/datasource/linspace.py +140 -0
  471. maxframe/tensor/datasource/meshgrid.py +135 -0
  472. maxframe/tensor/datasource/ones.py +8 -3
  473. maxframe/tensor/datasource/tests/test_datasource.py +32 -1
  474. maxframe/tensor/datasource/tri_array.py +107 -0
  475. maxframe/tensor/datasource/zeros.py +7 -3
  476. maxframe/tensor/extensions/__init__.py +31 -0
  477. maxframe/tensor/extensions/accessor.py +25 -0
  478. maxframe/tensor/extensions/apply_chunk.py +137 -0
  479. maxframe/tensor/indexing/__init__.py +1 -1
  480. maxframe/tensor/indexing/choose.py +8 -6
  481. maxframe/tensor/indexing/compress.py +0 -2
  482. maxframe/tensor/indexing/extract.py +0 -2
  483. maxframe/tensor/indexing/fill_diagonal.py +9 -6
  484. maxframe/tensor/indexing/flatnonzero.py +1 -3
  485. maxframe/tensor/indexing/getitem.py +10 -43
  486. maxframe/tensor/indexing/nonzero.py +2 -4
  487. maxframe/tensor/indexing/setitem.py +19 -9
  488. maxframe/tensor/indexing/slice.py +6 -3
  489. maxframe/tensor/indexing/take.py +0 -2
  490. maxframe/tensor/indexing/tests/__init__.py +0 -2
  491. maxframe/tensor/indexing/tests/test_indexing.py +0 -2
  492. maxframe/tensor/indexing/unravel_index.py +6 -6
  493. maxframe/tensor/lib/__init__.py +16 -0
  494. maxframe/tensor/lib/index_tricks.py +404 -0
  495. maxframe/tensor/linalg/__init__.py +36 -0
  496. maxframe/tensor/linalg/dot.py +145 -0
  497. maxframe/tensor/linalg/inner.py +36 -0
  498. maxframe/tensor/linalg/inv.py +83 -0
  499. maxframe/tensor/linalg/lu.py +115 -0
  500. maxframe/tensor/linalg/matmul.py +225 -0
  501. maxframe/tensor/linalg/qr.py +124 -0
  502. maxframe/tensor/linalg/solve_triangular.py +103 -0
  503. maxframe/tensor/linalg/svd.py +167 -0
  504. maxframe/tensor/linalg/tensordot.py +213 -0
  505. maxframe/tensor/linalg/vdot.py +73 -0
  506. maxframe/tensor/merge/__init__.py +4 -0
  507. maxframe/tensor/merge/append.py +74 -0
  508. maxframe/tensor/merge/column_stack.py +63 -0
  509. maxframe/tensor/merge/concatenate.py +3 -2
  510. maxframe/tensor/merge/dstack.py +71 -0
  511. maxframe/tensor/merge/hstack.py +70 -0
  512. maxframe/tensor/merge/stack.py +0 -2
  513. maxframe/tensor/merge/tests/test_merge.py +0 -2
  514. maxframe/tensor/misc/__init__.py +18 -5
  515. maxframe/tensor/misc/astype.py +10 -8
  516. maxframe/tensor/misc/broadcast_to.py +1 -1
  517. maxframe/tensor/misc/copy.py +64 -0
  518. maxframe/tensor/misc/diff.py +115 -0
  519. maxframe/tensor/misc/flatten.py +63 -0
  520. maxframe/tensor/misc/in1d.py +94 -0
  521. maxframe/tensor/misc/isin.py +130 -0
  522. maxframe/tensor/misc/ndim.py +53 -0
  523. maxframe/tensor/misc/ravel.py +0 -2
  524. maxframe/tensor/misc/repeat.py +129 -0
  525. maxframe/tensor/misc/searchsorted.py +147 -0
  526. maxframe/tensor/misc/setdiff1d.py +58 -0
  527. maxframe/tensor/misc/squeeze.py +117 -0
  528. maxframe/tensor/misc/swapaxes.py +113 -0
  529. maxframe/tensor/misc/tests/test_misc.py +0 -2
  530. maxframe/tensor/misc/transpose.py +8 -4
  531. maxframe/tensor/misc/trapezoid.py +123 -0
  532. maxframe/tensor/misc/unique.py +0 -1
  533. maxframe/tensor/misc/where.py +10 -8
  534. maxframe/tensor/operators.py +0 -34
  535. maxframe/tensor/random/__init__.py +3 -5
  536. maxframe/tensor/random/binomial.py +0 -2
  537. maxframe/tensor/random/bytes.py +0 -2
  538. maxframe/tensor/random/chisquare.py +0 -2
  539. maxframe/tensor/random/choice.py +9 -8
  540. maxframe/tensor/random/core.py +20 -5
  541. maxframe/tensor/random/dirichlet.py +0 -2
  542. maxframe/tensor/random/exponential.py +0 -2
  543. maxframe/tensor/random/f.py +2 -4
  544. maxframe/tensor/random/gamma.py +0 -2
  545. maxframe/tensor/random/geometric.py +0 -2
  546. maxframe/tensor/random/gumbel.py +0 -2
  547. maxframe/tensor/random/hypergeometric.py +0 -2
  548. maxframe/tensor/random/laplace.py +2 -4
  549. maxframe/tensor/random/logistic.py +0 -2
  550. maxframe/tensor/random/lognormal.py +0 -2
  551. maxframe/tensor/random/logseries.py +0 -2
  552. maxframe/tensor/random/multinomial.py +0 -2
  553. maxframe/tensor/random/multivariate_normal.py +0 -2
  554. maxframe/tensor/random/negative_binomial.py +0 -2
  555. maxframe/tensor/random/noncentral_chisquare.py +0 -2
  556. maxframe/tensor/random/noncentral_f.py +1 -3
  557. maxframe/tensor/random/normal.py +0 -2
  558. maxframe/tensor/random/pareto.py +0 -2
  559. maxframe/tensor/random/permutation.py +6 -3
  560. maxframe/tensor/random/poisson.py +0 -2
  561. maxframe/tensor/random/power.py +0 -2
  562. maxframe/tensor/random/rand.py +0 -2
  563. maxframe/tensor/random/randint.py +0 -2
  564. maxframe/tensor/random/randn.py +0 -2
  565. maxframe/tensor/random/random_integers.py +0 -2
  566. maxframe/tensor/random/random_sample.py +0 -2
  567. maxframe/tensor/random/rayleigh.py +0 -2
  568. maxframe/tensor/random/standard_cauchy.py +0 -2
  569. maxframe/tensor/random/standard_exponential.py +0 -2
  570. maxframe/tensor/random/standard_gamma.py +0 -2
  571. maxframe/tensor/random/standard_normal.py +0 -2
  572. maxframe/tensor/random/standard_t.py +0 -2
  573. maxframe/tensor/random/tests/__init__.py +0 -2
  574. maxframe/tensor/random/tests/test_random.py +0 -2
  575. maxframe/tensor/random/triangular.py +0 -2
  576. maxframe/tensor/random/uniform.py +0 -2
  577. maxframe/tensor/random/vonmises.py +0 -2
  578. maxframe/tensor/random/wald.py +0 -2
  579. maxframe/tensor/random/weibull.py +0 -2
  580. maxframe/tensor/random/zipf.py +0 -2
  581. maxframe/tensor/reduction/__init__.py +0 -2
  582. maxframe/tensor/reduction/all.py +0 -2
  583. maxframe/tensor/reduction/allclose.py +0 -2
  584. maxframe/tensor/reduction/any.py +0 -2
  585. maxframe/tensor/reduction/argmax.py +1 -3
  586. maxframe/tensor/reduction/argmin.py +1 -3
  587. maxframe/tensor/reduction/array_equal.py +0 -2
  588. maxframe/tensor/reduction/core.py +0 -2
  589. maxframe/tensor/reduction/count_nonzero.py +0 -2
  590. maxframe/tensor/reduction/cumprod.py +0 -2
  591. maxframe/tensor/reduction/cumsum.py +0 -2
  592. maxframe/tensor/reduction/max.py +0 -2
  593. maxframe/tensor/reduction/mean.py +0 -2
  594. maxframe/tensor/reduction/min.py +0 -2
  595. maxframe/tensor/reduction/nanargmax.py +0 -2
  596. maxframe/tensor/reduction/nanargmin.py +0 -2
  597. maxframe/tensor/reduction/nancumprod.py +0 -2
  598. maxframe/tensor/reduction/nancumsum.py +0 -2
  599. maxframe/tensor/reduction/nanmax.py +0 -2
  600. maxframe/tensor/reduction/nanmean.py +0 -2
  601. maxframe/tensor/reduction/nanmin.py +0 -2
  602. maxframe/tensor/reduction/nanprod.py +0 -2
  603. maxframe/tensor/reduction/nanstd.py +0 -2
  604. maxframe/tensor/reduction/nansum.py +0 -2
  605. maxframe/tensor/reduction/nanvar.py +0 -2
  606. maxframe/tensor/reduction/prod.py +0 -2
  607. maxframe/tensor/reduction/std.py +0 -2
  608. maxframe/tensor/reduction/sum.py +0 -2
  609. maxframe/tensor/reduction/tests/test_reduction.py +1 -4
  610. maxframe/tensor/reduction/var.py +0 -2
  611. maxframe/tensor/reshape/__init__.py +0 -2
  612. maxframe/tensor/reshape/reshape.py +6 -5
  613. maxframe/tensor/reshape/tests/__init__.py +0 -2
  614. maxframe/tensor/reshape/tests/test_reshape.py +0 -2
  615. maxframe/tensor/sort/__init__.py +16 -0
  616. maxframe/tensor/sort/argsort.py +150 -0
  617. maxframe/tensor/sort/sort.py +295 -0
  618. maxframe/tensor/special/__init__.py +37 -0
  619. maxframe/tensor/special/core.py +38 -0
  620. maxframe/tensor/special/misc.py +142 -0
  621. maxframe/tensor/special/statistical.py +56 -0
  622. maxframe/tensor/statistics/__init__.py +5 -0
  623. maxframe/tensor/statistics/average.py +143 -0
  624. maxframe/tensor/statistics/bincount.py +133 -0
  625. maxframe/tensor/statistics/quantile.py +10 -8
  626. maxframe/tensor/ufunc/__init__.py +0 -2
  627. maxframe/tensor/ufunc/ufunc.py +0 -2
  628. maxframe/tensor/utils.py +21 -3
  629. maxframe/tests/test_protocol.py +3 -3
  630. maxframe/tests/test_utils.py +210 -1
  631. maxframe/tests/utils.py +67 -1
  632. maxframe/udf.py +76 -6
  633. maxframe/utils.py +418 -17
  634. {maxframe-1.3.0.dist-info → maxframe-2.0.0b1.dist-info}/METADATA +5 -1
  635. maxframe-2.0.0b1.dist-info/RECORD +939 -0
  636. maxframe_client/clients/framedriver.py +19 -3
  637. maxframe_client/fetcher.py +113 -6
  638. maxframe_client/session/odps.py +173 -38
  639. maxframe_client/session/task.py +3 -1
  640. maxframe_client/tests/test_session.py +41 -5
  641. maxframe-1.3.0.dist-info/RECORD +0 -705
  642. {maxframe-1.3.0.dist-info → maxframe-2.0.0b1.dist-info}/WHEEL +0 -0
  643. {maxframe-1.3.0.dist-info → maxframe-2.0.0b1.dist-info}/top_level.txt +0 -0
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import os
15
16
  from typing import Any, Dict, List
16
17
 
17
18
  import msgpack
@@ -34,6 +35,13 @@ from maxframe.utils import (
34
35
  wait_http_response,
35
36
  )
36
37
 
38
+ # use long timeout period for debuggers
39
+ _client_req_timeout = (
40
+ None
41
+ if "VSCODE_PID" not in os.environ and "PYCHARM_HOSTED" not in os.environ
42
+ else 1024
43
+ )
44
+
37
45
 
38
46
  class FrameDriverClient:
39
47
  def __init__(self, endpoint: str):
@@ -45,13 +53,18 @@ class FrameDriverClient:
45
53
  )
46
54
  req_url = f"{self._endpoint}/api/sessions"
47
55
  resp = await httpclient.AsyncHTTPClient().fetch(
48
- req_url, method="POST", body=serialize_serializable(req_body)
56
+ req_url,
57
+ method="POST",
58
+ body=serialize_serializable(req_body),
59
+ request_timeout=_client_req_timeout,
49
60
  )
50
61
  return SessionInfo.from_json(msgpack.loads(resp.body))
51
62
 
52
63
  async def get_session(self, session_id: str) -> SessionInfo:
53
64
  req_url = f"{self._endpoint}/api/sessions/{session_id}"
54
- resp = await httpclient.AsyncHTTPClient().fetch(req_url, method="GET")
65
+ resp = await httpclient.AsyncHTTPClient().fetch(
66
+ req_url, method="GET", request_timeout=_client_req_timeout
67
+ )
55
68
  return SessionInfo.from_json(msgpack.loads(resp.body))
56
69
 
57
70
  async def delete_session(self, session_id: str):
@@ -73,12 +86,15 @@ class FrameDriverClient:
73
86
  req_url,
74
87
  method="POST",
75
88
  body=serialize_serializable(ProtocolBody(body=req_body)),
89
+ request_timeout=_client_req_timeout,
76
90
  )
77
91
  return DagInfo.from_json(msgpack.loads(resp.body))
78
92
 
79
93
  async def get_dag_info(self, session_id: str, dag_id: str) -> DagInfo:
80
94
  req_url = f"{self._endpoint}/api/sessions/{session_id}/dags/{dag_id}"
81
- resp = await httpclient.AsyncHTTPClient().fetch(req_url, method="GET")
95
+ resp = await httpclient.AsyncHTTPClient().fetch(
96
+ req_url, method="GET", request_timeout=_client_req_timeout
97
+ )
82
98
  return DagInfo.from_json(msgpack.loads(resp.body))
83
99
 
84
100
  async def wait_dag(self, session_id: str, dag_id: str, timeout: TimeoutType = None):
@@ -12,6 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import sys
15
16
  from abc import ABC, abstractmethod
16
17
  from numbers import Integral
17
18
  from typing import Any, Dict, List, Optional, Tuple, Type, Union
@@ -21,6 +22,7 @@ import pyarrow as pa
21
22
  from odps import ODPS
22
23
  from odps.models import ExternalVolume
23
24
 
25
+ from maxframe import utils
24
26
  from maxframe.core import OBJECT_TYPE
25
27
  from maxframe.dataframe.core import DATAFRAME_TYPE
26
28
  from maxframe.io.objects import get_object_io_handler
@@ -33,6 +35,7 @@ from maxframe.io.odpsio import (
33
35
  odps_schema_to_pandas_dtypes,
34
36
  )
35
37
  from maxframe.protocol import (
38
+ ConstantResultInfo,
36
39
  DataFrameTableMeta,
37
40
  ODPSTableResultInfo,
38
41
  ODPSVolumeResultInfo,
@@ -41,10 +44,19 @@ from maxframe.protocol import (
41
44
  )
42
45
  from maxframe.tensor.core import TENSOR_TYPE
43
46
  from maxframe.typing_ import PandasObjectTypes, TileableType
44
- from maxframe.utils import ToThreadMixin, sync_pyodps_options
47
+ from maxframe.utils import (
48
+ ToThreadMixin,
49
+ estimate_pandas_size,
50
+ estimate_table_size,
51
+ sync_pyodps_options,
52
+ )
45
53
 
46
54
  _result_fetchers: Dict[ResultType, Type["ResultFetcher"]] = dict()
47
55
 
56
+ _FetchIndexType = Optional[List[Union[None, Integral, slice]]]
57
+
58
+ _VOLUME_LOAD_RETRY_TIMES = 5
59
+
48
60
 
49
61
  def register_fetcher(fetcher_cls: Type["ResultFetcher"]):
50
62
  _result_fetchers[fetcher_cls.result_type] = fetcher_cls
@@ -74,10 +86,18 @@ class ResultFetcher(ABC):
74
86
  self,
75
87
  tileable: TileableType,
76
88
  info: ResultInfo,
77
- indexes: List[Union[None, Integral, slice]],
89
+ indexes: _FetchIndexType,
78
90
  ) -> Any:
79
91
  raise NotImplementedError
80
92
 
93
+ @abstractmethod
94
+ def estimate_size(
95
+ self,
96
+ tileable: TileableType,
97
+ info: ResultInfo,
98
+ ) -> Union[int, float]:
99
+ raise NotImplementedError
100
+
81
101
 
82
102
  @register_fetcher
83
103
  class NullFetcher(ResultFetcher):
@@ -94,10 +114,58 @@ class NullFetcher(ResultFetcher):
94
114
  self,
95
115
  tileable: TileableType,
96
116
  info: ODPSTableResultInfo,
97
- indexes: List[Union[None, Integral, slice]],
117
+ indexes: _FetchIndexType,
98
118
  ) -> None:
99
119
  return
100
120
 
121
+ def estimate_size(
122
+ self,
123
+ tileable: TileableType,
124
+ info: ResultInfo,
125
+ ) -> Union[int, float]:
126
+ return 0
127
+
128
+
129
+ @register_fetcher
130
+ class ConstantFetcher(ResultFetcher):
131
+ result_type = ResultType.CONSTANT
132
+
133
+ async def update_tileable_meta(
134
+ self,
135
+ tileable: TileableType,
136
+ info: ConstantResultInfo,
137
+ ) -> None:
138
+ if isinstance(tileable, DATAFRAME_TYPE) and tileable.dtypes is None:
139
+ tileable.refresh_from_dtypes(info.data.dtypes)
140
+ if tileable.shape and any(pd.isna(x) for x in tileable.shape):
141
+ tileable.params = {"shape": info.data.shape}
142
+
143
+ async def fetch(
144
+ self,
145
+ tileable: TileableType,
146
+ info: ConstantResultInfo,
147
+ indexes: List[Union[None, Integral, slice]],
148
+ ) -> Any:
149
+ result = info.data
150
+ if indexes:
151
+ if isinstance(indexes, List):
152
+ indexes = tuple(indexes)
153
+ if isinstance(result, (pd.DataFrame, pd.Series)):
154
+ result = result.iloc[indexes]
155
+ else:
156
+ result = result[indexes]
157
+ return result
158
+
159
+ def estimate_size(
160
+ self,
161
+ tileable: TileableType,
162
+ info: ConstantResultInfo,
163
+ ) -> Union[int, float]:
164
+ if isinstance(info.data, (pd.DataFrame, pd.Series, pd.Index)):
165
+ return estimate_pandas_size(info.data)
166
+ else:
167
+ return sys.getsizeof(info.data)
168
+
101
169
 
102
170
  @register_fetcher
103
171
  class ODPSTableFetcher(ToThreadMixin, ResultFetcher):
@@ -220,7 +288,7 @@ class ODPSTableFetcher(ToThreadMixin, ResultFetcher):
220
288
  self,
221
289
  tileable: TileableType,
222
290
  info: ODPSTableResultInfo,
223
- indexes: List[Union[None, Integral, slice]],
291
+ indexes: _FetchIndexType,
224
292
  ) -> PandasObjectTypes:
225
293
  table_meta = build_dataframe_table_meta(tileable)
226
294
  arrow_table: pa.Table = await self.to_thread(
@@ -228,6 +296,15 @@ class ODPSTableFetcher(ToThreadMixin, ResultFetcher):
228
296
  )
229
297
  return arrow_to_pandas(arrow_table, table_meta)
230
298
 
299
+ def estimate_size(
300
+ self,
301
+ tileable: TileableType,
302
+ info: ODPSTableResultInfo,
303
+ ) -> Union[int, float]:
304
+ return estimate_table_size(
305
+ self._odps_entry, info.full_table_name, info.partition_specs
306
+ )
307
+
231
308
 
232
309
  @register_fetcher
233
310
  class ODPSVolumeFetcher(ToThreadMixin, ResultFetcher):
@@ -238,7 +315,29 @@ class ODPSVolumeFetcher(ToThreadMixin, ResultFetcher):
238
315
  tileable: TileableType,
239
316
  info: ODPSVolumeResultInfo,
240
317
  ) -> None:
241
- return
318
+ def volume_fetch_func():
319
+ reader = ODPSVolumeReader(
320
+ self._odps_entry,
321
+ info.volume_name,
322
+ info.volume_path,
323
+ replace_internal_host=True,
324
+ )
325
+ io_handler = get_object_io_handler(tileable)()
326
+ return utils.call_with_retry(
327
+ io_handler.read_object_meta,
328
+ reader,
329
+ tileable,
330
+ retry_timeout=_VOLUME_LOAD_RETRY_TIMES,
331
+ delay=2,
332
+ )
333
+
334
+ volume = await self.to_thread(self._odps_entry.get_volume, info.volume_name)
335
+ if isinstance(volume, ExternalVolume):
336
+ meta = await self.to_thread(volume_fetch_func)
337
+ meta.pop("nsplits", None)
338
+ tileable.params = meta
339
+ else:
340
+ raise NotImplementedError(f"Volume type {type(volume)} not supported")
242
341
 
243
342
  async def _fetch_object(
244
343
  self,
@@ -266,8 +365,16 @@ class ODPSVolumeFetcher(ToThreadMixin, ResultFetcher):
266
365
  self,
267
366
  tileable: TileableType,
268
367
  info: ODPSVolumeResultInfo,
269
- indexes: List[Union[Integral, slice]],
368
+ indexes: _FetchIndexType,
270
369
  ) -> Any:
271
370
  if isinstance(tileable, (OBJECT_TYPE, TENSOR_TYPE)):
272
371
  return await self._fetch_object(tileable, info, indexes)
273
372
  raise NotImplementedError(f"Fetching {type(tileable)} not implemented")
373
+
374
+ def estimate_size(
375
+ self,
376
+ tileable: TileableType,
377
+ info: ResultInfo,
378
+ ) -> Union[int, float]:
379
+ # todo estimate size of volume
380
+ return float("inf")
@@ -19,26 +19,30 @@ import logging
19
19
  import time
20
20
  import weakref
21
21
  from numbers import Integral
22
- from typing import Any, Dict, List, Mapping, Optional, Tuple, Union
22
+ from typing import Any, Callable, Dict, List, Mapping, Optional, Tuple, Union
23
23
  from urllib.parse import urlparse
24
24
 
25
25
  import numpy as np
26
26
  import pandas as pd
27
27
  from odps import ODPS
28
28
  from odps import options as odps_options
29
+ from odps.config import option_context as odps_option_context
29
30
  from odps.console import in_ipython_frontend
30
31
 
32
+ from maxframe.codegen import CodeGenResult
33
+ from maxframe.codegen.spe import SPECodeGenerator
31
34
  from maxframe.config import options
32
35
  from maxframe.core import Entity, TileableGraph, build_fetch, enter_mode
33
- from maxframe.core.operator import Fetch
36
+ from maxframe.core.operator import Fetch, estimate_tileable_execution_size
34
37
  from maxframe.dataframe import read_odps_table
35
- from maxframe.dataframe.core import DATAFRAME_TYPE, SERIES_TYPE
38
+ from maxframe.dataframe.core import DATAFRAME_TYPE, INDEX_TYPE, SERIES_TYPE
36
39
  from maxframe.dataframe.datasource import PandasDataSourceOperator
37
40
  from maxframe.dataframe.datasource.read_odps_table import DataFrameReadODPSTable
38
41
  from maxframe.errors import (
39
42
  MaxFrameError,
40
43
  NoTaskServerResponseError,
41
44
  SessionAlreadyClosedError,
45
+ TileableNotExecutedError,
42
46
  )
43
47
  from maxframe.io.objects import get_object_io_handler
44
48
  from maxframe.io.odpsio import (
@@ -48,8 +52,9 @@ from maxframe.io.odpsio import (
48
52
  pandas_to_odps_schema,
49
53
  )
50
54
  from maxframe.protocol import (
55
+ ConstantResultInfo,
51
56
  DagInfo,
52
- DagStatus,
57
+ ExecutionStatus,
53
58
  ODPSTableResultInfo,
54
59
  ODPSVolumeResultInfo,
55
60
  ResultInfo,
@@ -62,13 +67,16 @@ from maxframe.session import (
62
67
  Profiling,
63
68
  Progress,
64
69
  )
70
+ from maxframe.sperunner import SPEDagRunner
65
71
  from maxframe.tensor.datasource import ArrayDataSource
66
72
  from maxframe.typing_ import TileableType
67
73
  from maxframe.utils import (
68
74
  ToThreadMixin,
69
75
  build_session_volume_name,
70
76
  build_temp_table_name,
77
+ estimate_pandas_size,
71
78
  get_default_table_properties,
79
+ no_default,
72
80
  str_to_bool,
73
81
  sync_pyodps_options,
74
82
  )
@@ -92,6 +100,7 @@ class MaxFrameServiceCaller(metaclass=abc.ABCMeta):
92
100
  sql_settings.get("odps.task.wlm.quota", None),
93
101
  options.spe.task.settings.get("odps.task.wlm.quota", None),
94
102
  options.pythonpack.task.settings.get("odps.task.wlm.quota", None),
103
+ options.dpe.task.settings.get("odps.task.wlm.quota", None),
95
104
  quota_name,
96
105
  }.difference([None])
97
106
  if len(quota_settings) >= 2:
@@ -165,6 +174,41 @@ class MaxFrameServiceCaller(metaclass=abc.ABCMeta):
165
174
  return None
166
175
 
167
176
 
177
+ class LocalSPEDagRunner(SPEDagRunner):
178
+ def __init__(
179
+ self,
180
+ session_id: str,
181
+ subdag_id: str,
182
+ subdag: TileableGraph,
183
+ generated: CodeGenResult,
184
+ settings: Dict[str, Any],
185
+ odps_entry: Optional[ODPS] = None,
186
+ tileable_to_info: Mapping[TileableType, ResultInfo] = None,
187
+ data_tileable_getter: Optional[
188
+ Callable[[TileableType], Tuple[TileableType, Any]]
189
+ ] = None,
190
+ loop: asyncio.AbstractEventLoop = None,
191
+ ):
192
+ super().__init__(session_id, subdag_id, subdag, generated, settings)
193
+ self._odps = self._odps or odps_entry
194
+ self._tileable_key_to_info = {
195
+ t.key: v for t, v in ({} or tileable_to_info).items()
196
+ }
197
+ self._data_tileable_getter = data_tileable_getter or (lambda x: (x, None))
198
+ self._loop = loop
199
+
200
+ def fetch_data_by_tileable(self, t: TileableType) -> Any:
201
+ tileable, index = self._data_tileable_getter(t)
202
+ result_info = self._tileable_key_to_info[tileable.key]
203
+ fetcher = get_fetcher_cls(result_info.result_type)(self._odps)
204
+ return asyncio.run_coroutine_threadsafe(
205
+ fetcher.fetch(t, result_info, index), self._loop
206
+ ).result()
207
+
208
+ def store_data(self, key: str, value: Any) -> ResultInfo:
209
+ return ConstantResultInfo(data=value)
210
+
211
+
168
212
  class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
169
213
  _odps_entry: Optional[ODPS]
170
214
  _tileable_to_infos: Mapping[TileableType, ResultInfo]
@@ -216,7 +260,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
216
260
  await self._show_logview_address()
217
261
 
218
262
  def _upload_and_get_table_read_tileable(
219
- self, t: TileableType
263
+ self, t: TileableType, data: Any
220
264
  ) -> Optional[TileableType]:
221
265
  table_schema, table_meta = pandas_to_odps_schema(t, unknown_as_string=True)
222
266
  if self._odps_entry.exist_table(table_meta.table_name):
@@ -224,9 +268,15 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
224
268
  table_meta.table_name, hints=options.sql.settings
225
269
  )
226
270
  table_name = build_temp_table_name(self.session_id, t.key)
271
+ schema = (
272
+ self._last_settings.get("session.default_schema", None)
273
+ if self._last_settings.get("session.enable_schema", False)
274
+ else None
275
+ )
227
276
  table_obj = self._odps_entry.create_table(
228
277
  table_name,
229
278
  table_schema,
279
+ schema=schema,
230
280
  lifecycle=options.session.temp_table_lifecycle,
231
281
  hints=options.sql.settings,
232
282
  if_not_exists=True,
@@ -234,7 +284,6 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
234
284
  or get_default_table_properties(),
235
285
  )
236
286
 
237
- data = t.op.get_data()
238
287
  batch_size = options.session.upload_batch_size
239
288
 
240
289
  if len(data):
@@ -268,7 +317,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
268
317
  return read_tileable.data
269
318
 
270
319
  def _upload_and_get_vol_read_tileable(
271
- self, t: TileableType
320
+ self, t: TileableType, data: Any
272
321
  ) -> Optional[TileableType]:
273
322
  vol_name = build_session_volume_name(self.session_id)
274
323
  writer = ODPSVolumeWriter(
@@ -278,21 +327,35 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
278
327
  replace_internal_host=self._replace_internal_host,
279
328
  )
280
329
  io_handler = get_object_io_handler(t)
281
- io_handler().write_object(writer, t, t.op.data)
330
+ io_handler().write_object(writer, t, data)
282
331
  return build_fetch(t).data
283
332
 
333
+ def _get_local_data(self, t: TileableType) -> Any:
334
+ if isinstance(t.op, (ArrayDataSource, PandasDataSourceOperator)):
335
+ # scenario 1: tensor or DataFrame input
336
+ if t.inputs:
337
+ return no_default
338
+ return t.op.get_data()
339
+ if isinstance(t.op, Fetch):
340
+ # scenario 2: local data
341
+ key_to_tileables = {t.key: t for t in self._tileable_to_infos.keys()}
342
+ if t.key not in key_to_tileables:
343
+ return no_default
344
+ src_info = self._tileable_to_infos[key_to_tileables[t.key]]
345
+ if not isinstance(src_info, ConstantResultInfo):
346
+ return no_default
347
+ return src_info.data
348
+ return no_default
349
+
284
350
  def _upload_and_get_read_tileable(self, t: TileableType) -> Optional[TileableType]:
285
- if (
286
- not isinstance(t.op, (ArrayDataSource, PandasDataSourceOperator))
287
- or t.op.get_data() is None
288
- or t.inputs
289
- ):
290
- return None
351
+ local_data = self._get_local_data(t)
352
+ if local_data is no_default:
353
+ return
291
354
  with sync_pyodps_options():
292
- if isinstance(t.op, PandasDataSourceOperator):
293
- return self._upload_and_get_table_read_tileable(t)
355
+ if isinstance(t, DATAFRAME_TYPE + SERIES_TYPE + INDEX_TYPE):
356
+ return self._upload_and_get_table_read_tileable(t, local_data)
294
357
  else:
295
- return self._upload_and_get_vol_read_tileable(t)
358
+ return self._upload_and_get_vol_read_tileable(t, local_data)
296
359
 
297
360
  @enter_mode(kernel=True, build=True)
298
361
  def _scan_and_replace_local_sources(
@@ -316,7 +379,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
316
379
 
317
380
  for succ in successors:
318
381
  graph.add_edge(replaced, succ)
319
- succ.op._set_inputs([replacements.get(t, t) for t in succ.inputs])
382
+ succ.op.inputs = [replacements.get(t, t) for t in succ.inputs]
320
383
 
321
384
  graph.results = [replacements.get(t, t) for t in graph.results]
322
385
  return replacements
@@ -364,6 +427,34 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
364
427
  self._last_settings = copy.deepcopy(new_settings)
365
428
  return update
366
429
 
430
+ def _is_local_executable(self, tileable_graph: TileableGraph) -> bool:
431
+ from maxframe.codegen.spe.core import get_op_adapter
432
+
433
+ local_exec_size_limit = options.local_execution.size_limit
434
+ if not options.local_execution.enabled or not local_exec_size_limit:
435
+ return False
436
+
437
+ # make sure all ops registered in SPE
438
+ try:
439
+ for tileable in tileable_graph:
440
+ get_op_adapter(type(tileable.op))
441
+ except KeyError:
442
+ return False
443
+
444
+ fetch_sizes = dict()
445
+ for inp in tileable_graph.iter_indep():
446
+ if not isinstance(inp.op, Fetch):
447
+ continue
448
+ local_data = self._get_local_data(inp)
449
+ # todo add resolution of sizes of tensor data type here
450
+ if isinstance(local_data, (pd.DataFrame, pd.Series, pd.Index)):
451
+ fetch_sizes[inp.key] = estimate_pandas_size(local_data)
452
+
453
+ est_exec_size = estimate_tileable_execution_size(
454
+ tileable_graph, fetch_sizes=fetch_sizes
455
+ )
456
+ return local_exec_size_limit and est_exec_size < local_exec_size_limit
457
+
367
458
  async def execute(self, *tileables, **kwargs) -> ExecutionInfo:
368
459
  tileables = [
369
460
  tileable.data if isinstance(tileable, Entity) else tileable
@@ -373,6 +464,20 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
373
464
  tileable_graph, to_execute_tileables = gen_submit_tileable_graph(
374
465
  self, tileables, tileable_to_copied
375
466
  )
467
+
468
+ if self._is_local_executable(tileable_graph):
469
+ return await self._execute_locally(tileable_graph, to_execute_tileables)
470
+ else:
471
+ return await self._execute_in_service(
472
+ tileable_graph, to_execute_tileables, tileable_to_copied
473
+ )
474
+
475
+ async def _execute_in_service(
476
+ self,
477
+ tileable_graph: TileableGraph,
478
+ to_execute_tileables: List[TileableType],
479
+ tileable_to_copied: Dict[TileableType, TileableType],
480
+ ) -> ExecutionInfo:
376
481
  source_replacements = self._scan_and_replace_local_sources(tileable_graph)
377
482
 
378
483
  # we need to manage uploaded data sources with refcounting mechanism
@@ -394,7 +499,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
394
499
  progress = Progress()
395
500
  profiling = Profiling()
396
501
  aio_task = asyncio.create_task(
397
- self._run_in_background(dag_info, to_execute_tileables, progress)
502
+ self._run_remotely_in_background(dag_info, to_execute_tileables, progress)
398
503
  )
399
504
  return ExecutionInfo(
400
505
  aio_task,
@@ -404,7 +509,7 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
404
509
  to_execute_tileables,
405
510
  )
406
511
 
407
- async def _run_in_background(
512
+ async def _run_remotely_in_background(
408
513
  self, dag_info: DagInfo, tileables: List, progress: Progress
409
514
  ):
410
515
  start_time = time.time()
@@ -458,20 +563,20 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
458
563
  f"Cannot find DAG with ID {dag_id} in session {session_id}"
459
564
  )
460
565
  progress.value = dag_info.progress
461
- if dag_info.status != DagStatus.RUNNING:
566
+ if dag_info.status != ExecutionStatus.RUNNING:
462
567
  break
463
568
  await asyncio.sleep(timeout_val)
464
569
  except asyncio.CancelledError:
465
570
  dag_info = await self.ensure_async_call(self._caller.cancel_dag, dag_id)
466
- if dag_info.status != DagStatus.CANCELLED: # pragma: no cover
571
+ if dag_info.status != ExecutionStatus.CANCELLED: # pragma: no cover
467
572
  raise
468
573
  finally:
469
- if dag_info.status == DagStatus.SUCCEEDED:
574
+ if dag_info.status == ExecutionStatus.SUCCEEDED:
470
575
  progress.value = 1.0
471
- elif dag_info.status == DagStatus.FAILED:
576
+ elif dag_info.status == ExecutionStatus.FAILED:
472
577
  dag_info.error_info.reraise()
473
578
 
474
- if dag_info.status in (DagStatus.RUNNING, DagStatus.CANCELLED):
579
+ if dag_info.status in (ExecutionStatus.RUNNING, ExecutionStatus.CANCELLED):
475
580
  return
476
581
 
477
582
  for key, result_info in dag_info.tileable_to_result_infos.items():
@@ -480,6 +585,45 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
480
585
  await fetcher.update_tileable_meta(t, result_info)
481
586
  self._tileable_to_infos[t] = result_info
482
587
 
588
+ async def _execute_locally(
589
+ self,
590
+ tileable_graph: TileableGraph,
591
+ to_execute_tileables: List[TileableType],
592
+ ):
593
+ cur_loop = asyncio.get_running_loop()
594
+
595
+ def run_sync(subdag_id):
596
+ codegen = SPECodeGenerator(self.session_id, subdag_id)
597
+ generated_code = codegen.generate(tileable_graph)
598
+
599
+ runner = LocalSPEDagRunner(
600
+ self._session_id,
601
+ subdag_id,
602
+ tileable_graph,
603
+ generated_code,
604
+ settings={},
605
+ odps_entry=self._odps_entry,
606
+ tileable_to_info=self._tileable_to_infos,
607
+ loop=cur_loop,
608
+ )
609
+ with odps_option_context():
610
+ self._odps_entry.to_global()
611
+ key_to_info = runner.run()
612
+ for tileable in to_execute_tileables:
613
+ self._tileable_to_infos[tileable] = key_to_info[tileable.key]
614
+
615
+ mock_subdag_id = f"subdag_local_{int(time.time())}"
616
+ progress = Progress()
617
+ profiling = Profiling()
618
+ aio_task = asyncio.create_task(self.to_thread(run_sync, mock_subdag_id))
619
+ return ExecutionInfo(
620
+ aio_task,
621
+ progress,
622
+ profiling,
623
+ asyncio.get_running_loop(),
624
+ to_execute_tileables,
625
+ )
626
+
483
627
  def _get_data_tileable_and_indexes(
484
628
  self, tileable: TileableType
485
629
  ) -> Tuple[TileableType, List[Union[slice, Integral]]]:
@@ -503,7 +647,9 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
503
647
  if not all(isinstance(index, (slice, Integral)) for index in indexes):
504
648
  raise ValueError("Only support fetch data slices")
505
649
  else:
506
- raise ValueError(f"Cannot fetch unexecuted tileable: {tileable!r}")
650
+ raise TileableNotExecutedError(
651
+ f"Cannot fetch unexecuted tileable: {tileable!r}"
652
+ )
507
653
 
508
654
  return tileable, indexes
509
655
 
@@ -548,17 +694,6 @@ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
548
694
  async def get_web_endpoint(self) -> Optional[str]:
549
695
  raise NotImplementedError
550
696
 
551
- async def create_remote_object(
552
- self, session_id: str, name: str, object_cls, *args, **kwargs
553
- ):
554
- raise NotImplementedError
555
-
556
- async def get_remote_object(self, session_id: str, name: str):
557
- raise NotImplementedError
558
-
559
- async def destroy_remote_object(self, session_id: str, name: str):
560
- raise NotImplementedError
561
-
562
697
  async def create_mutable_tensor(
563
698
  self,
564
699
  shape: tuple,
@@ -602,7 +737,7 @@ class MaxFrameRestCaller(MaxFrameServiceCaller):
602
737
  self._session_id = None
603
738
 
604
739
  async def create_session(self) -> SessionInfo:
605
- info = await self._client.create_session(options.to_dict(remote_only=True))
740
+ info = await self._client.create_session(self.get_settings_to_upload())
606
741
  self._session_id = info.session_id
607
742
  return info
608
743
 
@@ -180,7 +180,9 @@ class MaxFrameInstanceCaller(MaxFrameServiceCaller):
180
180
  if status_json.get("status") == "Running":
181
181
  break
182
182
  if time.time() - check_time > timeout:
183
- raise TimeoutError("Check session startup time out")
183
+ raise TimeoutError(
184
+ f"Check session startup time out. Instance ID: {self._instance.id}"
185
+ )
184
186
  time.sleep(interval)
185
187
  interval = min(max_interval, interval * 2)
186
188