maxframe 1.3.1__cp39-cp39-win_amd64.whl → 2.0.0b1__cp39-cp39-win_amd64.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 (639) hide show
  1. maxframe/_utils.cp39-win_amd64.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.cp39-win_amd64.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 +9 -8
  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 +65 -3
  242. maxframe/dataframe/reduction/core.py +3 -1
  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/models.py +38 -9
  278. maxframe/learn/contrib/utils.py +55 -0
  279. maxframe/learn/contrib/xgboost/callback.py +86 -0
  280. maxframe/learn/contrib/xgboost/classifier.py +26 -30
  281. maxframe/learn/contrib/xgboost/core.py +53 -42
  282. maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
  283. maxframe/learn/contrib/xgboost/predict.py +16 -9
  284. maxframe/learn/contrib/xgboost/regressor.py +28 -27
  285. maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
  286. maxframe/learn/contrib/xgboost/train.py +59 -16
  287. maxframe/learn/core.py +252 -0
  288. maxframe/learn/datasets/__init__.py +20 -0
  289. maxframe/learn/datasets/samples_generator.py +628 -0
  290. maxframe/learn/linear_model/__init__.py +15 -0
  291. maxframe/learn/linear_model/_base.py +163 -0
  292. maxframe/learn/linear_model/_lin_reg.py +175 -0
  293. maxframe/learn/metrics/__init__.py +25 -0
  294. maxframe/learn/metrics/_check_targets.py +95 -0
  295. maxframe/learn/metrics/_classification.py +1121 -0
  296. maxframe/learn/metrics/_regression.py +256 -0
  297. maxframe/learn/model_selection/__init__.py +15 -0
  298. maxframe/learn/model_selection/_split.py +451 -0
  299. maxframe/learn/model_selection/tests/__init__.py +13 -0
  300. maxframe/learn/model_selection/tests/test_split.py +156 -0
  301. maxframe/learn/preprocessing/__init__.py +16 -0
  302. maxframe/learn/preprocessing/_data/__init__.py +17 -0
  303. maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
  304. maxframe/learn/preprocessing/_data/normalize.py +127 -0
  305. maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
  306. maxframe/learn/preprocessing/_data/utils.py +79 -0
  307. maxframe/learn/preprocessing/_label/__init__.py +16 -0
  308. maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
  309. maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
  310. maxframe/learn/utils/__init__.py +4 -0
  311. maxframe/learn/utils/_encode.py +314 -0
  312. maxframe/learn/utils/checks.py +161 -0
  313. maxframe/learn/utils/core.py +33 -0
  314. maxframe/learn/utils/extmath.py +176 -0
  315. maxframe/learn/utils/multiclass.py +292 -0
  316. maxframe/learn/utils/shuffle.py +114 -0
  317. maxframe/learn/utils/sparsefuncs.py +87 -0
  318. maxframe/learn/utils/validation.py +775 -0
  319. maxframe/lib/__init__.py +0 -2
  320. maxframe/lib/compat.py +145 -0
  321. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  322. maxframe/lib/mmh3.cp39-win_amd64.pyd +0 -0
  323. maxframe/lib/sparse/__init__.py +10 -15
  324. maxframe/lib/sparse/array.py +45 -33
  325. maxframe/lib/sparse/core.py +0 -2
  326. maxframe/lib/sparse/linalg.py +31 -0
  327. maxframe/lib/sparse/matrix.py +5 -2
  328. maxframe/lib/sparse/tests/__init__.py +0 -2
  329. maxframe/lib/sparse/tests/test_sparse.py +53 -53
  330. maxframe/lib/sparse/vector.py +0 -2
  331. maxframe/mixin.py +59 -2
  332. maxframe/opcodes.py +13 -5
  333. maxframe/protocol.py +67 -14
  334. maxframe/remote/core.py +16 -14
  335. maxframe/remote/run_script.py +6 -3
  336. maxframe/serialization/__init__.py +2 -0
  337. maxframe/serialization/core.cp39-win_amd64.pyd +0 -0
  338. maxframe/serialization/core.pxd +3 -0
  339. maxframe/serialization/core.pyi +3 -1
  340. maxframe/serialization/core.pyx +82 -4
  341. maxframe/serialization/pandas.py +5 -1
  342. maxframe/serialization/serializables/core.py +6 -5
  343. maxframe/serialization/serializables/field.py +2 -2
  344. maxframe/serialization/serializables/tests/test_field_type.py +3 -5
  345. maxframe/serialization/tests/test_serial.py +27 -0
  346. maxframe/session.py +4 -71
  347. maxframe/sperunner.py +165 -0
  348. maxframe/tensor/__init__.py +35 -2
  349. maxframe/tensor/arithmetic/__init__.py +2 -4
  350. maxframe/tensor/arithmetic/abs.py +0 -2
  351. maxframe/tensor/arithmetic/absolute.py +0 -2
  352. maxframe/tensor/arithmetic/add.py +34 -4
  353. maxframe/tensor/arithmetic/angle.py +0 -2
  354. maxframe/tensor/arithmetic/arccos.py +1 -4
  355. maxframe/tensor/arithmetic/arccosh.py +1 -3
  356. maxframe/tensor/arithmetic/arcsin.py +0 -2
  357. maxframe/tensor/arithmetic/arcsinh.py +0 -2
  358. maxframe/tensor/arithmetic/arctan.py +0 -2
  359. maxframe/tensor/arithmetic/arctan2.py +0 -2
  360. maxframe/tensor/arithmetic/arctanh.py +0 -2
  361. maxframe/tensor/arithmetic/around.py +0 -2
  362. maxframe/tensor/arithmetic/bitand.py +0 -2
  363. maxframe/tensor/arithmetic/bitor.py +1 -3
  364. maxframe/tensor/arithmetic/bitxor.py +1 -3
  365. maxframe/tensor/arithmetic/cbrt.py +0 -2
  366. maxframe/tensor/arithmetic/ceil.py +0 -2
  367. maxframe/tensor/arithmetic/clip.py +13 -13
  368. maxframe/tensor/arithmetic/conj.py +0 -2
  369. maxframe/tensor/arithmetic/copysign.py +0 -2
  370. maxframe/tensor/arithmetic/core.py +47 -39
  371. maxframe/tensor/arithmetic/cos.py +1 -3
  372. maxframe/tensor/arithmetic/cosh.py +0 -2
  373. maxframe/tensor/arithmetic/deg2rad.py +0 -2
  374. maxframe/tensor/arithmetic/degrees.py +0 -2
  375. maxframe/tensor/arithmetic/divide.py +0 -2
  376. maxframe/tensor/arithmetic/equal.py +0 -2
  377. maxframe/tensor/arithmetic/exp.py +1 -3
  378. maxframe/tensor/arithmetic/exp2.py +0 -2
  379. maxframe/tensor/arithmetic/expm1.py +0 -2
  380. maxframe/tensor/arithmetic/fabs.py +0 -2
  381. maxframe/tensor/arithmetic/fix.py +0 -2
  382. maxframe/tensor/arithmetic/float_power.py +0 -2
  383. maxframe/tensor/arithmetic/floor.py +0 -2
  384. maxframe/tensor/arithmetic/floordiv.py +0 -2
  385. maxframe/tensor/arithmetic/fmax.py +0 -2
  386. maxframe/tensor/arithmetic/fmin.py +0 -2
  387. maxframe/tensor/arithmetic/fmod.py +0 -2
  388. maxframe/tensor/arithmetic/frexp.py +6 -2
  389. maxframe/tensor/arithmetic/greater.py +0 -2
  390. maxframe/tensor/arithmetic/greater_equal.py +0 -2
  391. maxframe/tensor/arithmetic/hypot.py +0 -2
  392. maxframe/tensor/arithmetic/i0.py +1 -3
  393. maxframe/tensor/arithmetic/imag.py +0 -2
  394. maxframe/tensor/arithmetic/invert.py +1 -3
  395. maxframe/tensor/arithmetic/isclose.py +0 -2
  396. maxframe/tensor/arithmetic/iscomplex.py +0 -2
  397. maxframe/tensor/arithmetic/isfinite.py +1 -3
  398. maxframe/tensor/arithmetic/isinf.py +0 -2
  399. maxframe/tensor/arithmetic/isnan.py +0 -2
  400. maxframe/tensor/arithmetic/isreal.py +0 -2
  401. maxframe/tensor/arithmetic/ldexp.py +0 -2
  402. maxframe/tensor/arithmetic/less.py +0 -2
  403. maxframe/tensor/arithmetic/less_equal.py +0 -2
  404. maxframe/tensor/arithmetic/log.py +1 -3
  405. maxframe/tensor/arithmetic/log10.py +1 -3
  406. maxframe/tensor/arithmetic/log1p.py +1 -3
  407. maxframe/tensor/arithmetic/log2.py +1 -3
  408. maxframe/tensor/arithmetic/logaddexp.py +0 -2
  409. maxframe/tensor/arithmetic/logaddexp2.py +0 -2
  410. maxframe/tensor/arithmetic/logical_and.py +0 -2
  411. maxframe/tensor/arithmetic/logical_not.py +1 -3
  412. maxframe/tensor/arithmetic/logical_or.py +0 -2
  413. maxframe/tensor/arithmetic/logical_xor.py +0 -2
  414. maxframe/tensor/arithmetic/lshift.py +0 -2
  415. maxframe/tensor/arithmetic/maximum.py +0 -2
  416. maxframe/tensor/arithmetic/minimum.py +0 -2
  417. maxframe/tensor/arithmetic/mod.py +0 -2
  418. maxframe/tensor/arithmetic/modf.py +6 -2
  419. maxframe/tensor/arithmetic/multiply.py +37 -4
  420. maxframe/tensor/arithmetic/nan_to_num.py +0 -2
  421. maxframe/tensor/arithmetic/negative.py +0 -2
  422. maxframe/tensor/arithmetic/nextafter.py +0 -2
  423. maxframe/tensor/arithmetic/not_equal.py +0 -2
  424. maxframe/tensor/arithmetic/positive.py +0 -2
  425. maxframe/tensor/arithmetic/power.py +0 -2
  426. maxframe/tensor/arithmetic/rad2deg.py +0 -2
  427. maxframe/tensor/arithmetic/radians.py +0 -2
  428. maxframe/tensor/arithmetic/real.py +0 -2
  429. maxframe/tensor/arithmetic/reciprocal.py +5 -3
  430. maxframe/tensor/arithmetic/rint.py +1 -3
  431. maxframe/tensor/arithmetic/rshift.py +0 -2
  432. maxframe/tensor/arithmetic/setimag.py +0 -2
  433. maxframe/tensor/arithmetic/setreal.py +0 -2
  434. maxframe/tensor/arithmetic/sign.py +0 -2
  435. maxframe/tensor/arithmetic/signbit.py +0 -2
  436. maxframe/tensor/arithmetic/sin.py +0 -2
  437. maxframe/tensor/arithmetic/sinc.py +1 -3
  438. maxframe/tensor/arithmetic/sinh.py +0 -2
  439. maxframe/tensor/arithmetic/spacing.py +0 -2
  440. maxframe/tensor/arithmetic/sqrt.py +0 -2
  441. maxframe/tensor/arithmetic/square.py +0 -2
  442. maxframe/tensor/arithmetic/subtract.py +4 -2
  443. maxframe/tensor/arithmetic/tan.py +0 -2
  444. maxframe/tensor/arithmetic/tanh.py +0 -2
  445. maxframe/tensor/arithmetic/tests/__init__.py +0 -2
  446. maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
  447. maxframe/tensor/arithmetic/truediv.py +0 -2
  448. maxframe/tensor/arithmetic/trunc.py +0 -2
  449. maxframe/tensor/arithmetic/utils.py +32 -6
  450. maxframe/tensor/array_utils.py +3 -25
  451. maxframe/tensor/core.py +6 -6
  452. maxframe/tensor/datasource/__init__.py +10 -2
  453. maxframe/tensor/datasource/arange.py +0 -2
  454. maxframe/tensor/datasource/array.py +3 -22
  455. maxframe/tensor/datasource/core.py +15 -10
  456. maxframe/tensor/datasource/diag.py +140 -0
  457. maxframe/tensor/datasource/diagflat.py +69 -0
  458. maxframe/tensor/datasource/empty.py +0 -2
  459. maxframe/tensor/datasource/eye.py +95 -0
  460. maxframe/tensor/datasource/from_dataframe.py +0 -2
  461. maxframe/tensor/datasource/from_dense.py +0 -17
  462. maxframe/tensor/datasource/from_sparse.py +0 -2
  463. maxframe/tensor/datasource/full.py +0 -2
  464. maxframe/tensor/datasource/identity.py +54 -0
  465. maxframe/tensor/datasource/indices.py +115 -0
  466. maxframe/tensor/datasource/linspace.py +140 -0
  467. maxframe/tensor/datasource/meshgrid.py +135 -0
  468. maxframe/tensor/datasource/ones.py +8 -3
  469. maxframe/tensor/datasource/tests/test_datasource.py +32 -1
  470. maxframe/tensor/datasource/tri_array.py +107 -0
  471. maxframe/tensor/datasource/zeros.py +7 -3
  472. maxframe/tensor/extensions/__init__.py +31 -0
  473. maxframe/tensor/extensions/accessor.py +25 -0
  474. maxframe/tensor/extensions/apply_chunk.py +137 -0
  475. maxframe/tensor/indexing/__init__.py +1 -1
  476. maxframe/tensor/indexing/choose.py +8 -6
  477. maxframe/tensor/indexing/compress.py +0 -2
  478. maxframe/tensor/indexing/extract.py +0 -2
  479. maxframe/tensor/indexing/fill_diagonal.py +9 -6
  480. maxframe/tensor/indexing/flatnonzero.py +1 -3
  481. maxframe/tensor/indexing/getitem.py +10 -43
  482. maxframe/tensor/indexing/nonzero.py +2 -4
  483. maxframe/tensor/indexing/setitem.py +19 -9
  484. maxframe/tensor/indexing/slice.py +6 -3
  485. maxframe/tensor/indexing/take.py +0 -2
  486. maxframe/tensor/indexing/tests/__init__.py +0 -2
  487. maxframe/tensor/indexing/tests/test_indexing.py +0 -2
  488. maxframe/tensor/indexing/unravel_index.py +6 -6
  489. maxframe/tensor/lib/__init__.py +16 -0
  490. maxframe/tensor/lib/index_tricks.py +404 -0
  491. maxframe/tensor/linalg/__init__.py +36 -0
  492. maxframe/tensor/linalg/dot.py +145 -0
  493. maxframe/tensor/linalg/inner.py +36 -0
  494. maxframe/tensor/linalg/inv.py +83 -0
  495. maxframe/tensor/linalg/lu.py +115 -0
  496. maxframe/tensor/linalg/matmul.py +225 -0
  497. maxframe/tensor/linalg/qr.py +124 -0
  498. maxframe/tensor/linalg/solve_triangular.py +103 -0
  499. maxframe/tensor/linalg/svd.py +167 -0
  500. maxframe/tensor/linalg/tensordot.py +213 -0
  501. maxframe/tensor/linalg/vdot.py +73 -0
  502. maxframe/tensor/merge/__init__.py +4 -0
  503. maxframe/tensor/merge/append.py +74 -0
  504. maxframe/tensor/merge/column_stack.py +63 -0
  505. maxframe/tensor/merge/concatenate.py +3 -2
  506. maxframe/tensor/merge/dstack.py +71 -0
  507. maxframe/tensor/merge/hstack.py +70 -0
  508. maxframe/tensor/merge/stack.py +0 -2
  509. maxframe/tensor/merge/tests/test_merge.py +0 -2
  510. maxframe/tensor/misc/__init__.py +18 -5
  511. maxframe/tensor/misc/astype.py +10 -8
  512. maxframe/tensor/misc/broadcast_to.py +1 -1
  513. maxframe/tensor/misc/copy.py +64 -0
  514. maxframe/tensor/misc/diff.py +115 -0
  515. maxframe/tensor/misc/flatten.py +63 -0
  516. maxframe/tensor/misc/in1d.py +94 -0
  517. maxframe/tensor/misc/isin.py +130 -0
  518. maxframe/tensor/misc/ndim.py +53 -0
  519. maxframe/tensor/misc/ravel.py +0 -2
  520. maxframe/tensor/misc/repeat.py +129 -0
  521. maxframe/tensor/misc/searchsorted.py +147 -0
  522. maxframe/tensor/misc/setdiff1d.py +58 -0
  523. maxframe/tensor/misc/squeeze.py +117 -0
  524. maxframe/tensor/misc/swapaxes.py +113 -0
  525. maxframe/tensor/misc/tests/test_misc.py +0 -2
  526. maxframe/tensor/misc/transpose.py +8 -4
  527. maxframe/tensor/misc/trapezoid.py +123 -0
  528. maxframe/tensor/misc/unique.py +0 -1
  529. maxframe/tensor/misc/where.py +10 -8
  530. maxframe/tensor/operators.py +0 -34
  531. maxframe/tensor/random/__init__.py +3 -5
  532. maxframe/tensor/random/binomial.py +0 -2
  533. maxframe/tensor/random/bytes.py +0 -2
  534. maxframe/tensor/random/chisquare.py +0 -2
  535. maxframe/tensor/random/choice.py +9 -8
  536. maxframe/tensor/random/core.py +20 -5
  537. maxframe/tensor/random/dirichlet.py +0 -2
  538. maxframe/tensor/random/exponential.py +0 -2
  539. maxframe/tensor/random/f.py +2 -4
  540. maxframe/tensor/random/gamma.py +0 -2
  541. maxframe/tensor/random/geometric.py +0 -2
  542. maxframe/tensor/random/gumbel.py +0 -2
  543. maxframe/tensor/random/hypergeometric.py +0 -2
  544. maxframe/tensor/random/laplace.py +2 -4
  545. maxframe/tensor/random/logistic.py +0 -2
  546. maxframe/tensor/random/lognormal.py +0 -2
  547. maxframe/tensor/random/logseries.py +0 -2
  548. maxframe/tensor/random/multinomial.py +0 -2
  549. maxframe/tensor/random/multivariate_normal.py +0 -2
  550. maxframe/tensor/random/negative_binomial.py +0 -2
  551. maxframe/tensor/random/noncentral_chisquare.py +0 -2
  552. maxframe/tensor/random/noncentral_f.py +1 -3
  553. maxframe/tensor/random/normal.py +0 -2
  554. maxframe/tensor/random/pareto.py +0 -2
  555. maxframe/tensor/random/permutation.py +6 -3
  556. maxframe/tensor/random/poisson.py +0 -2
  557. maxframe/tensor/random/power.py +0 -2
  558. maxframe/tensor/random/rand.py +0 -2
  559. maxframe/tensor/random/randint.py +0 -2
  560. maxframe/tensor/random/randn.py +0 -2
  561. maxframe/tensor/random/random_integers.py +0 -2
  562. maxframe/tensor/random/random_sample.py +0 -2
  563. maxframe/tensor/random/rayleigh.py +0 -2
  564. maxframe/tensor/random/standard_cauchy.py +0 -2
  565. maxframe/tensor/random/standard_exponential.py +0 -2
  566. maxframe/tensor/random/standard_gamma.py +0 -2
  567. maxframe/tensor/random/standard_normal.py +0 -2
  568. maxframe/tensor/random/standard_t.py +0 -2
  569. maxframe/tensor/random/tests/__init__.py +0 -2
  570. maxframe/tensor/random/tests/test_random.py +0 -2
  571. maxframe/tensor/random/triangular.py +0 -2
  572. maxframe/tensor/random/uniform.py +0 -2
  573. maxframe/tensor/random/vonmises.py +0 -2
  574. maxframe/tensor/random/wald.py +0 -2
  575. maxframe/tensor/random/weibull.py +0 -2
  576. maxframe/tensor/random/zipf.py +0 -2
  577. maxframe/tensor/reduction/__init__.py +0 -2
  578. maxframe/tensor/reduction/all.py +0 -2
  579. maxframe/tensor/reduction/allclose.py +0 -2
  580. maxframe/tensor/reduction/any.py +0 -2
  581. maxframe/tensor/reduction/argmax.py +1 -3
  582. maxframe/tensor/reduction/argmin.py +1 -3
  583. maxframe/tensor/reduction/array_equal.py +0 -2
  584. maxframe/tensor/reduction/core.py +0 -2
  585. maxframe/tensor/reduction/count_nonzero.py +0 -2
  586. maxframe/tensor/reduction/cumprod.py +0 -2
  587. maxframe/tensor/reduction/cumsum.py +0 -2
  588. maxframe/tensor/reduction/max.py +0 -2
  589. maxframe/tensor/reduction/mean.py +0 -2
  590. maxframe/tensor/reduction/min.py +0 -2
  591. maxframe/tensor/reduction/nanargmax.py +0 -2
  592. maxframe/tensor/reduction/nanargmin.py +0 -2
  593. maxframe/tensor/reduction/nancumprod.py +0 -2
  594. maxframe/tensor/reduction/nancumsum.py +0 -2
  595. maxframe/tensor/reduction/nanmax.py +0 -2
  596. maxframe/tensor/reduction/nanmean.py +0 -2
  597. maxframe/tensor/reduction/nanmin.py +0 -2
  598. maxframe/tensor/reduction/nanprod.py +0 -2
  599. maxframe/tensor/reduction/nanstd.py +0 -2
  600. maxframe/tensor/reduction/nansum.py +0 -2
  601. maxframe/tensor/reduction/nanvar.py +0 -2
  602. maxframe/tensor/reduction/prod.py +0 -2
  603. maxframe/tensor/reduction/std.py +0 -2
  604. maxframe/tensor/reduction/sum.py +0 -2
  605. maxframe/tensor/reduction/tests/test_reduction.py +1 -4
  606. maxframe/tensor/reduction/var.py +0 -2
  607. maxframe/tensor/reshape/__init__.py +0 -2
  608. maxframe/tensor/reshape/reshape.py +6 -5
  609. maxframe/tensor/reshape/tests/__init__.py +0 -2
  610. maxframe/tensor/reshape/tests/test_reshape.py +0 -2
  611. maxframe/tensor/sort/__init__.py +16 -0
  612. maxframe/tensor/sort/argsort.py +150 -0
  613. maxframe/tensor/sort/sort.py +295 -0
  614. maxframe/tensor/special/__init__.py +37 -0
  615. maxframe/tensor/special/core.py +38 -0
  616. maxframe/tensor/special/misc.py +142 -0
  617. maxframe/tensor/special/statistical.py +56 -0
  618. maxframe/tensor/statistics/__init__.py +5 -0
  619. maxframe/tensor/statistics/average.py +143 -0
  620. maxframe/tensor/statistics/bincount.py +133 -0
  621. maxframe/tensor/statistics/quantile.py +10 -8
  622. maxframe/tensor/ufunc/__init__.py +0 -2
  623. maxframe/tensor/ufunc/ufunc.py +0 -2
  624. maxframe/tensor/utils.py +21 -3
  625. maxframe/tests/test_protocol.py +3 -3
  626. maxframe/tests/test_utils.py +210 -1
  627. maxframe/tests/utils.py +67 -1
  628. maxframe/udf.py +76 -6
  629. maxframe/utils.py +418 -17
  630. {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/METADATA +4 -1
  631. maxframe-2.0.0b1.dist-info/RECORD +939 -0
  632. {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/WHEEL +1 -1
  633. maxframe_client/clients/framedriver.py +19 -3
  634. maxframe_client/fetcher.py +113 -6
  635. maxframe_client/session/odps.py +173 -38
  636. maxframe_client/session/task.py +3 -1
  637. maxframe_client/tests/test_session.py +41 -5
  638. maxframe-1.3.1.dist-info/RECORD +0 -705
  639. {maxframe-1.3.1.dist-info → maxframe-2.0.0b1.dist-info}/top_level.txt +0 -0
@@ -16,6 +16,7 @@ from typing import Any, Dict, Type
16
16
 
17
17
  from ...serialization import load_type
18
18
  from ...serialization.serializables import StringField
19
+ from ...utils import extract_class_name
19
20
  from .core import Entity
20
21
  from .executable import _ToObjectMixin
21
22
  from .tileables import TileableData
@@ -36,7 +37,7 @@ class ObjectData(TileableData, _ToObjectMixin):
36
37
  if getattr(cls, "_entity_class", None) is not None:
37
38
  return cls._entity_class
38
39
  assert cls.__qualname__[-4:] == "Data"
39
- target_class_name = cls.__module__ + "#" + cls.__qualname__[:-4]
40
+ target_class_name = extract_class_name(cls)[:-4]
40
41
  cls._entity_class = load_type(target_class_name, Object)
41
42
  return cls._entity_class
42
43
 
@@ -57,15 +58,18 @@ class ObjectData(TileableData, _ToObjectMixin):
57
58
  if isinstance(obj_cls, type):
58
59
  if isinstance(obj_cls, type) and issubclass(obj_cls, Object):
59
60
  obj_cls = obj_cls.get_data_class()
60
- kw["object_class"] = obj_cls.__module__ + "#" + obj_cls.__qualname__
61
+ kw["object_class"] = extract_class_name(obj_cls)
61
62
 
62
63
  super().__init__(_op=op, _nsplits=nsplits, **kw)
63
64
  if self.object_class is None and type(self) is not ObjectData:
64
65
  cls = type(self)
65
- self.object_class = cls.__module__ + "#" + cls.__qualname__
66
+ self.object_class = extract_class_name(cls)
66
67
 
67
68
  def __repr__(self):
68
- return f"Object <op={type(self.op).__name__}, key={self.key}>"
69
+ return (
70
+ f"{type(self).__name__[:-4]} "
71
+ f"<op={type(self.op).__name__}, key={self.key}>"
72
+ )
69
73
 
70
74
  @property
71
75
  def params(self):
@@ -75,6 +79,7 @@ class ObjectData(TileableData, _ToObjectMixin):
75
79
  @params.setter
76
80
  def params(self, new_params: Dict[str, Any]):
77
81
  params = new_params.copy()
82
+ params.pop("object_class", None)
78
83
  if params: # pragma: no cover
79
84
  raise TypeError(f"Unknown params: {list(params)}")
80
85
 
@@ -89,11 +94,20 @@ class Object(Entity, _ToObjectMixin):
89
94
  _allow_data_type_ = (ObjectData,)
90
95
  type_name = "Object"
91
96
 
97
+ def __new__(cls, data=None, **kw):
98
+ if (
99
+ cls is Object
100
+ and isinstance(data, ObjectData)
101
+ and type(data) is not ObjectData
102
+ ):
103
+ return data.get_entity_class()(data, **kw)
104
+ return super().__new__(cls)
105
+
92
106
  @classmethod
93
107
  def get_data_class(cls) -> Type[ObjectData]:
94
108
  if getattr(cls, "_data_class", None) is not None:
95
109
  return cls._data_class
96
- target_class_name = cls.__module__ + "#" + cls.__qualname__ + "Data"
110
+ target_class_name = extract_class_name(cls) + "Data"
97
111
  cls._data_class = load_type(target_class_name, ObjectData)
98
112
  return cls._data_class
99
113
 
@@ -39,6 +39,17 @@ class OutputType(Enum):
39
39
  return [cls(ot) for ot in output_types] if output_types is not None else None
40
40
 
41
41
 
42
+ df_output_types = {
43
+ OutputType.dataframe,
44
+ OutputType.dataframe_groupby,
45
+ OutputType.series,
46
+ OutputType.series_groupby,
47
+ OutputType.df_or_series,
48
+ OutputType.index,
49
+ OutputType.categorical,
50
+ }
51
+
52
+
42
53
  _OUTPUT_TYPE_TO_TILEABLE_TYPES = {OutputType.object: OBJECT_TYPE}
43
54
  _OUTPUT_TYPE_TO_FETCH_CLS = {}
44
55
 
@@ -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
+ from ....utils import extract_class_name
15
16
  from ..objects import Object, ObjectData
16
17
 
17
18
 
@@ -26,18 +27,16 @@ class TestSubObject(Object):
26
27
  def test_object_init():
27
28
  assert TestSubObjectData.get_entity_class() is TestSubObject
28
29
 
29
- obj = ObjectData(
30
- object_class=TestSubObjectData.__module__ + "#" + TestSubObjectData.__name__
31
- )
32
- assert isinstance(obj, TestSubObjectData)
30
+ obj_data = ObjectData(object_class=extract_class_name(TestSubObjectData))
31
+ assert isinstance(obj_data, TestSubObjectData)
32
+ obj = Object(obj_data)
33
+ assert isinstance(obj, TestSubObject)
33
34
 
34
- obj = ObjectData(object_class=TestSubObjectData)
35
- assert isinstance(obj, TestSubObjectData)
35
+ obj_data = ObjectData(object_class=TestSubObjectData)
36
+ assert isinstance(obj_data, TestSubObjectData)
36
37
 
37
- obj = ObjectData(
38
- object_class=TestSubObject.__module__ + "#" + TestSubObject.__name__
39
- )
40
- assert isinstance(obj, TestSubObjectData)
38
+ obj_data = ObjectData(object_class=extract_class_name(TestSubObject))
39
+ assert isinstance(obj_data, TestSubObjectData)
41
40
 
42
- obj = ObjectData(object_class=TestSubObject)
43
- assert isinstance(obj, TestSubObjectData)
41
+ obj_data = ObjectData(object_class=TestSubObject)
42
+ assert isinstance(obj_data, TestSubObjectData)
@@ -172,6 +172,8 @@ class TileableData(EntityData, _ExecutableMixin):
172
172
  def __init__(self: TileableType, *args, **kwargs):
173
173
  if kwargs.get("chunks") is not None:
174
174
  self._chunks = kwargs.pop("chunks")
175
+ if "nsplits" in kwargs:
176
+ kwargs["_nsplits"] = kwargs.pop("nsplits")
175
177
  if kwargs.get("_nsplits", None) is not None:
176
178
  kwargs["_nsplits"] = tuple(tuple(s) for s in kwargs["_nsplits"])
177
179
 
@@ -198,7 +200,7 @@ class TileableData(EntityData, _ExecutableMixin):
198
200
 
199
201
  @property
200
202
  def chunks(self) -> list:
201
- return getattr(self, "_chunks", None)
203
+ return getattr(self, "_chunks", None) or self._extra_params.get("_chunks")
202
204
 
203
205
  @property
204
206
  def nsplits(self):
@@ -12,6 +12,9 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import numpy as np
16
+
17
+ from ...typing_ import TileableType
15
18
  from ...utils import calc_nsplits, has_unknown_shape
16
19
 
17
20
 
@@ -22,3 +25,15 @@ def refresh_tileable_shape(tileable):
22
25
  shape = tuple(sum(ns) for ns in nsplits)
23
26
  tileable._nsplits = nsplits
24
27
  tileable._shape = shape
28
+
29
+
30
+ def fill_chunk_slices(tileable: TileableType) -> None:
31
+ if tileable is None or not tileable.nsplits or not tileable.chunks:
32
+ # errors may occurred
33
+ return
34
+ acc_splits = tuple((0,) + tuple(np.cumsum(sp)) for sp in tileable.nsplits)
35
+ for chunk in tileable.chunks:
36
+ chunk.slices = list(
37
+ (acc_splits[i][chunk.index[i]], acc_splits[i][chunk.index[i] + 1])
38
+ for i in range(tileable.ndim)
39
+ )
@@ -14,4 +14,9 @@
14
14
 
15
15
  from .builder import TileableGraphBuilder
16
16
  from .core import DAG, DirectedGraph, GraphContainsCycleError
17
- from .entity import EntityGraph, GraphSerializer, TileableGraph
17
+ from .entity import EntityGraph, GraphSerializer, SerializableGraph, TileableGraph
18
+
19
+ try:
20
+ from ._internal import SubDAG
21
+ except ImportError: # pragma: no cover
22
+ pass
@@ -41,6 +41,10 @@ class AbstractGraphBuilder(ABC):
41
41
  ): # pylint: disable=no-self-use
42
42
  return node not in visited
43
43
 
44
+ @classmethod
45
+ def _get_node_outputs(cls, node: EntityType):
46
+ return node.op.outputs
47
+
44
48
  def _add_nodes(
45
49
  self,
46
50
  graph: EntityGraph,
@@ -70,7 +74,7 @@ class AbstractGraphBuilder(ABC):
70
74
  graph.add_node(c)
71
75
  if not graph.has_successor(c, node):
72
76
  graph.add_edge(c, node)
73
- for out in c.op.outputs:
77
+ for out in self._get_node_outputs(c):
74
78
  if self._if_add_node(out, visited):
75
79
  nodes.append(out)
76
80
 
Binary file
@@ -309,13 +309,19 @@ cdef class DirectedGraph:
309
309
  return val
310
310
 
311
311
  def _extract_operators(self, node):
312
+ if getattr(node, "opfunc", None) is not None:
313
+ return [node.opfunc]
312
314
  return [node.op]
313
315
 
314
316
  def to_dot(
315
317
  self,
316
318
  graph_attrs=None,
317
319
  node_attrs=None,
318
- trunc_key=5, result_chunk_keys=None, show_columns=False):
320
+ trunc_key=5,
321
+ result_chunk_keys=None,
322
+ show_columns=False,
323
+ with_op_id=True,
324
+ ):
319
325
 
320
326
  sio = StringIO()
321
327
  sio.write('digraph {\n')
@@ -344,20 +350,25 @@ cdef class DirectedGraph:
344
350
 
345
351
  for node in self.iter_nodes():
346
352
  for op in self._extract_operators(node):
347
- op_name = type(op).__name__
353
+ op_name = op.op_name
348
354
  if op.stage is not None:
349
355
  op_name = f'{op_name}:{op.stage.name}'
350
356
  if op.key in visited:
351
357
  continue
358
+
359
+ op_key_id = op.key[:trunc_key]
360
+ if with_op_id:
361
+ op_key_id += f"_{id(op)}"
362
+
352
363
  for input_chunk in (op.inputs or []):
353
364
  if input_chunk.key not in visited:
354
365
  sio.write(f'"Chunk:{self._gen_chunk_key(input_chunk, trunc_key)}" {chunk_style}\n')
355
366
  visited.add(input_chunk.key)
356
367
  if op.key not in visited:
357
- sio.write(f'"{op_name}:{op.key[:trunc_key]}_{id(op)}" {operator_style}\n')
368
+ sio.write(f'"{op_name}:{op_key_id}" {operator_style}\n')
358
369
  visited.add(op.key)
359
370
  sio.write(f'"Chunk:{self._gen_chunk_key(input_chunk, trunc_key)}" -> '
360
- f'"{op_name}:{op.key[:trunc_key]}_{id(op)}"\n')
371
+ f'"{op_name}:{op_key_id}"\n')
361
372
 
362
373
  for output_chunk in (op.outputs or []):
363
374
  if output_chunk.key not in visited:
@@ -367,9 +378,9 @@ cdef class DirectedGraph:
367
378
  sio.write(f'"Chunk:{self._gen_chunk_key(output_chunk, trunc_key)}" {tmp_chunk_style}\n')
368
379
  visited.add(output_chunk.key)
369
380
  if op.key not in visited:
370
- sio.write(f'"{op_name}:{op.key[:trunc_key]}_{id(op)}" {operator_style}\n')
381
+ sio.write(f'"{op_name}:{op_key_id}" {operator_style}\n')
371
382
  visited.add(op.key)
372
- sio.write(f'"{op_name}:{op.key[:trunc_key]}_{id(op)}" -> '
383
+ sio.write(f'"{op_name}:{op_key_id}" -> '
373
384
  f'"Chunk:{self._gen_chunk_key(output_chunk, trunc_key)}"')
374
385
  if show_columns:
375
386
  sio.write(f' [ label={get_col_names(output_chunk)} ]')
@@ -16,10 +16,17 @@ from abc import ABCMeta, abstractmethod
16
16
  from typing import Dict, Iterable, List
17
17
 
18
18
  from ...core import Tileable
19
- from ...serialization.core import buffered
20
- from ...serialization.serializables import BoolField, DictField, ListField, Serializable
19
+ from ...serialization.core import buffered, load_type
20
+ from ...serialization.serializables import (
21
+ BoolField,
22
+ DictField,
23
+ ListField,
24
+ Serializable,
25
+ StringField,
26
+ )
21
27
  from ...serialization.serializables.core import SerializableSerializer
22
- from ...utils import tokenize
28
+ from ...utils import extract_class_name, tokenize
29
+ from ..operator import Fetch
23
30
  from .core import DAG
24
31
 
25
32
 
@@ -110,11 +117,10 @@ class SerializableGraph(Serializable):
110
117
  _predecessors = DictField("predecessors")
111
118
  _successors = DictField("successors")
112
119
  _results = ListField("results")
120
+ _graph_cls = StringField("graph_cls")
113
121
 
114
122
  @classmethod
115
123
  def from_graph(cls, graph: EntityGraph) -> "SerializableGraph":
116
- from ..operator import Fetch
117
-
118
124
  return SerializableGraph(
119
125
  _is_chunk=False,
120
126
  _fetch_nodes=[chunk for chunk in graph if isinstance(chunk.op, Fetch)],
@@ -122,10 +128,16 @@ class SerializableGraph(Serializable):
122
128
  _predecessors=graph._predecessors,
123
129
  _successors=graph._successors,
124
130
  _results=graph.results,
131
+ _graph_cls=extract_class_name(type(graph)),
125
132
  )
126
133
 
127
134
  def to_graph(self) -> EntityGraph:
128
- graph = TileableGraph(self._results)
135
+ graph_cls = (
136
+ load_type(self._graph_cls, EntityGraph)
137
+ if hasattr(self, "_graph_cls") and self._graph_cls
138
+ else TileableGraph
139
+ )
140
+ graph = graph_cls(self._results)
129
141
  graph._nodes.update(self._nodes)
130
142
  graph._predecessors.update(self._predecessors)
131
143
  graph._successors.update(self._successors)
@@ -20,8 +20,13 @@ from .base import (
20
20
  OperatorStage,
21
21
  VirtualOperator,
22
22
  )
23
- from .core import TileableOperatorMixin, estimate_size, execute
24
- from .fetch import Fetch, FetchMixin, FetchShuffle, ShuffleFetchType
25
- from .objects import MergeDictOperator, ObjectFetch, ObjectOperator, ObjectOperatorMixin
23
+ from .core import (
24
+ TileableOperatorMixin,
25
+ estimate_size,
26
+ estimate_tileable_execution_size,
27
+ execute,
28
+ )
29
+ from .fetch import Fetch, FetchMixin, FetchShuffle
30
+ from .objects import ObjectFetch, ObjectOperator, ObjectOperatorMixin
26
31
  from .shuffle import MapReduceOperator, ShuffleProxy
27
32
  from .utils import add_fetch_builder, build_fetch
@@ -16,7 +16,7 @@ import weakref
16
16
  from copy import deepcopy
17
17
  from enum import Enum
18
18
  from functools import lru_cache, partial
19
- from typing import Any, Dict, List, Optional, Tuple, Type, Union
19
+ from typing import Any, Dict, List, MutableMapping, Optional, Tuple, Type, Union
20
20
 
21
21
  from ...serialization.core import Placeholder
22
22
  from ...serialization.serializables import (
@@ -88,6 +88,8 @@ class SchedulingHint(Serializable):
88
88
  priority = Int32Field("priority", default=None)
89
89
  expect_engine = StringField("expect_engine", default=None)
90
90
  expect_resources = DictField("expect_resources", FieldTypes.string, default=None)
91
+ # id of gang scheduling for machine learning trainings
92
+ gang_scheduling_id = StringField("gang_scheduling_id", default=None)
91
93
 
92
94
  @classproperty
93
95
  @lru_cache(1)
@@ -127,7 +129,7 @@ def _install_scheduling_hint_properties(cls: Type["Operator"]):
127
129
  class OperatorLogicKeyGeneratorMixin:
128
130
  """
129
131
  This generator will generate an unique and deterministic key for operator compute logic. It should be same
130
- for different run if the compute logic doesn't change. This id will be used in subtask speculative
132
+ for different run if the compute logic doesn't change. This id will be used in substep speculative
131
133
  execution and hbo scheduling and so on.
132
134
  """
133
135
 
@@ -264,6 +266,10 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
264
266
  else:
265
267
  extras[k] = kwargs.pop(k)
266
268
 
269
+ @property
270
+ def op_name(self) -> str:
271
+ return type(self).__name__
272
+
267
273
  def __repr__(self):
268
274
  if self.stage is None:
269
275
  return f"{type(self).__name__} <key={self.key}>"
@@ -280,12 +286,13 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
280
286
  def _get_inputs_data(cls, inputs):
281
287
  return [cls._get_entity_data(inp) for inp in inputs]
282
288
 
283
- def _set_inputs(self, inputs):
289
+ @classmethod
290
+ def _set_inputs(cls, op: "Operator", inputs: List[EntityData]):
284
291
  if inputs is not None:
285
- inputs = self._get_inputs_data(inputs)
286
- if hasattr(self, "check_inputs"):
287
- self.check_inputs(inputs)
288
- setattr(self, "_inputs", inputs)
292
+ inputs = cls._get_inputs_data(inputs)
293
+ if hasattr(op, "check_inputs"):
294
+ op.check_inputs(inputs)
295
+ setattr(op, "_inputs", inputs)
289
296
 
290
297
  def replace_input(self, index: int, replaced_input: ENTITY_TYPE):
291
298
  """
@@ -299,7 +306,7 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
299
306
  The replaced input object.
300
307
  """
301
308
  self.inputs[index] = replaced_input
302
- self._set_inputs(self.inputs)
309
+ self._set_inputs(self, self.inputs)
303
310
 
304
311
  @property
305
312
  def inputs(self) -> List[Union[ENTITY_TYPE]]:
@@ -310,7 +317,7 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
310
317
 
311
318
  @inputs.setter
312
319
  def inputs(self, vals):
313
- self._set_inputs(vals)
320
+ self._set_inputs(self, vals)
314
321
 
315
322
  @property
316
323
  def output_limit(self) -> int:
@@ -358,6 +365,9 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
358
365
  def is_gpu(self) -> bool:
359
366
  return self.gpu
360
367
 
368
+ def has_custom_code(self) -> bool:
369
+ return False
370
+
361
371
  @property
362
372
  def retryable(self) -> bool:
363
373
  return True
@@ -386,6 +396,18 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
386
396
  new_op.extra_params = deepcopy(extra_params)
387
397
  return new_op
388
398
 
399
+ @classmethod
400
+ def estimate_size(
401
+ cls, ctx: MutableMapping[str, Union[int, float]], op: "Operator"
402
+ ) -> None:
403
+ try:
404
+ total_input_size = sum(ctx[inp.key] for inp in (op.inputs or ()))
405
+ for out in op.outputs:
406
+ ctx[out.key] = total_input_size // len(op.outputs)
407
+ except KeyError:
408
+ for out in op.outputs:
409
+ ctx[out.key] = float("inf")
410
+
389
411
  def on_output_modify(self, new_output):
390
412
  # when `create_view` is True, if the output is modified,
391
413
  # the modification should be set back to the input.
@@ -445,6 +467,7 @@ class HasInput(Operator):
445
467
  def input(self):
446
468
  return self._input
447
469
 
448
- def _set_inputs(self, inputs):
449
- super()._set_inputs(inputs)
450
- self._input = self._inputs[0]
470
+ @classmethod
471
+ def _set_inputs(cls, op: "Operator", inputs: List[EntityData]):
472
+ super()._set_inputs(op, inputs)
473
+ op._input = op._inputs[0]
@@ -12,11 +12,16 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ import math
15
16
  import sys
16
- from typing import Any, Callable, Dict, List, Type
17
+ from collections import defaultdict
18
+ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Type, Union
17
19
 
18
20
  import numpy as np
19
21
 
22
+ if TYPE_CHECKING:
23
+ from .. import TileableGraph
24
+
20
25
  try:
21
26
  from numpy.core._exceptions import UFuncTypeError
22
27
  except ImportError: # pragma: no cover
@@ -117,7 +122,7 @@ class TileableOperatorMixin:
117
122
  if output_limit is None:
118
123
  output_limit = getattr(self, "output_limit")
119
124
 
120
- self._set_inputs(inputs)
125
+ self._set_inputs(self, inputs)
121
126
  if self.gpu is None:
122
127
  self.gpu = self._check_if_gpu(self._inputs)
123
128
  if getattr(self, "_key", None) is None:
@@ -182,20 +187,13 @@ class TileableOperatorMixin:
182
187
 
183
188
  return self.new_tileables(inputs, kws=kws, **kw)[0]
184
189
 
185
- @classmethod
186
- def concat_tileable_chunks(cls, tileable: TileableType):
187
- raise NotImplementedError
188
-
189
- @classmethod
190
- def create_tileable_from_chunks(
191
- cls, chunks: List[ChunkType], inputs: List[TileableType] = None, **kw
192
- ) -> TileableType:
193
- raise NotImplementedError
194
-
195
- def get_fetch_op_cls(self, obj: ChunkType):
190
+ def get_fetch_op_cls(self, obj: Union[ChunkType, OutputType]):
196
191
  from .shuffle import ShuffleProxy
197
192
 
198
- output_types = get_output_types(obj, unknown_as=OutputType.object)
193
+ if isinstance(obj, OutputType):
194
+ output_types = [obj or OutputType.object]
195
+ else:
196
+ output_types = get_output_types(obj, unknown_as=OutputType.object)
199
197
  fetch_cls, fetch_shuffle_cls = get_fetch_class(output_types[0])
200
198
  if isinstance(self, ShuffleProxy):
201
199
  cls = fetch_shuffle_cls
@@ -274,3 +272,28 @@ def estimate_size(results: Dict[str, Any], op: OperatorType):
274
272
  _op_type_to_size_estimator[type(op)] = size_estimator
275
273
  return size_estimator(results, op)
276
274
  raise KeyError(f"No handler found for op: {op} to estimate size")
275
+
276
+
277
+ def estimate_tileable_execution_size(
278
+ tileable_graph: "TileableGraph",
279
+ fetch_sizes: Optional[Dict[str, int]] = None,
280
+ ) -> Union[int, float]:
281
+ ctx = dict()
282
+ ctx.update(fetch_sizes)
283
+ ref_counts = defaultdict(lambda: 0)
284
+ max_size = 0
285
+
286
+ for tileable in tileable_graph:
287
+ for key in set(inp.key for inp in tileable.inputs or ()):
288
+ ref_counts[key] += 1
289
+
290
+ for tileable in tileable_graph.topological_iter():
291
+ estimate_size(ctx, tileable.op)
292
+ max_size = max(max_size, sum(ctx.values()))
293
+ if math.isinf(max_size):
294
+ return float("inf")
295
+ for inp in set(inp.key for inp in tileable.inputs or ()):
296
+ ref_counts[inp] -= 1
297
+ if ref_counts[inp] <= 0:
298
+ ctx.pop(inp, None)
299
+ return max_size
@@ -12,16 +12,8 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- import enum
16
-
17
15
  from ... import opcodes
18
- from ...serialization.serializables import (
19
- FieldTypes,
20
- Int32Field,
21
- ListField,
22
- ReferenceField,
23
- StringField,
24
- )
16
+ from ...serialization.serializables import Int32Field, StringField
25
17
  from .base import Operator
26
18
  from .core import TileableOperatorMixin
27
19
 
@@ -42,12 +34,7 @@ class FetchMixin(TileableOperatorMixin):
42
34
  class FetchShuffle(Operator):
43
35
  _op_type_ = opcodes.FETCH_SHUFFLE
44
36
 
45
- source_keys = ListField("source_keys", FieldTypes.string)
46
- n_mappers = Int32Field("n_mappers")
47
- n_reducers = Int32Field("n_reducers")
48
- shuffle_fetch_type = ReferenceField("shuffle_fetch_type")
49
-
50
-
51
- class ShuffleFetchType(enum.Enum):
52
- FETCH_BY_KEY = 0
53
- FETCH_BY_INDEX = 1
37
+ shuffle_key = StringField("shuffle_key", default=None)
38
+ reducer_id = Int32Field("reducer_id", default=None)
39
+ n_mappers = Int32Field("n_mappers", default=None)
40
+ n_reducers = Int32Field("n_reducers", default=None)
@@ -12,7 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from ...serialization.serializables import BoolField
16
15
  from ..entity import OutputType, register_fetch_class
17
16
  from .base import Operator
18
17
  from .core import TileableOperatorMixin
@@ -42,22 +41,3 @@ class ObjectFetch(FetchMixin, ObjectOperatorMixin, Fetch):
42
41
 
43
42
 
44
43
  register_fetch_class(OutputType.object, ObjectFetch, None)
45
-
46
-
47
- class MergeDictOperator(ObjectOperator, ObjectOperatorMixin):
48
- _merge = BoolField("merge")
49
-
50
- def __init__(self, merge=None, **kw):
51
- super().__init__(_merge=merge, **kw)
52
-
53
- @property
54
- def merge(self):
55
- return self._merge
56
-
57
- @classmethod
58
- def concat_tileable_chunks(cls, tileable):
59
- assert not tileable.is_coarse()
60
-
61
- op = cls(merge=True)
62
- chunk = cls(merge=True).new_chunk(tileable.chunks)
63
- return op.new_tileable([tileable], chunks=[chunk], nsplits=((1,),))