maxframe 0.1.0b5__cp38-cp38-macosx_11_0_arm64.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 (647) hide show
  1. maxframe/__init__.py +32 -0
  2. maxframe/_utils.cpython-38-darwin.so +0 -0
  3. maxframe/_utils.pxd +33 -0
  4. maxframe/_utils.pyx +547 -0
  5. maxframe/codegen.py +528 -0
  6. maxframe/config/__init__.py +15 -0
  7. maxframe/config/config.py +443 -0
  8. maxframe/config/tests/__init__.py +13 -0
  9. maxframe/config/tests/test_config.py +103 -0
  10. maxframe/config/tests/test_validators.py +34 -0
  11. maxframe/config/validators.py +57 -0
  12. maxframe/conftest.py +139 -0
  13. maxframe/core/__init__.py +65 -0
  14. maxframe/core/base.py +156 -0
  15. maxframe/core/entity/__init__.py +44 -0
  16. maxframe/core/entity/chunks.py +68 -0
  17. maxframe/core/entity/core.py +152 -0
  18. maxframe/core/entity/executable.py +337 -0
  19. maxframe/core/entity/fuse.py +73 -0
  20. maxframe/core/entity/objects.py +100 -0
  21. maxframe/core/entity/output_types.py +90 -0
  22. maxframe/core/entity/tileables.py +438 -0
  23. maxframe/core/entity/utils.py +24 -0
  24. maxframe/core/graph/__init__.py +17 -0
  25. maxframe/core/graph/builder/__init__.py +16 -0
  26. maxframe/core/graph/builder/base.py +86 -0
  27. maxframe/core/graph/builder/chunk.py +430 -0
  28. maxframe/core/graph/builder/tileable.py +34 -0
  29. maxframe/core/graph/builder/utils.py +41 -0
  30. maxframe/core/graph/core.cpython-38-darwin.so +0 -0
  31. maxframe/core/graph/core.pyx +467 -0
  32. maxframe/core/graph/entity.py +171 -0
  33. maxframe/core/graph/tests/__init__.py +13 -0
  34. maxframe/core/graph/tests/test_graph.py +205 -0
  35. maxframe/core/mode.py +96 -0
  36. maxframe/core/operator/__init__.py +34 -0
  37. maxframe/core/operator/base.py +450 -0
  38. maxframe/core/operator/core.py +276 -0
  39. maxframe/core/operator/fetch.py +53 -0
  40. maxframe/core/operator/fuse.py +29 -0
  41. maxframe/core/operator/objects.py +72 -0
  42. maxframe/core/operator/shuffle.py +111 -0
  43. maxframe/core/operator/tests/__init__.py +13 -0
  44. maxframe/core/operator/tests/test_core.py +64 -0
  45. maxframe/core/tests/__init__.py +13 -0
  46. maxframe/core/tests/test_mode.py +75 -0
  47. maxframe/dataframe/__init__.py +81 -0
  48. maxframe/dataframe/arithmetic/__init__.py +359 -0
  49. maxframe/dataframe/arithmetic/abs.py +33 -0
  50. maxframe/dataframe/arithmetic/add.py +60 -0
  51. maxframe/dataframe/arithmetic/arccos.py +28 -0
  52. maxframe/dataframe/arithmetic/arccosh.py +28 -0
  53. maxframe/dataframe/arithmetic/arcsin.py +28 -0
  54. maxframe/dataframe/arithmetic/arcsinh.py +28 -0
  55. maxframe/dataframe/arithmetic/arctan.py +28 -0
  56. maxframe/dataframe/arithmetic/arctanh.py +28 -0
  57. maxframe/dataframe/arithmetic/around.py +152 -0
  58. maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
  59. maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
  60. maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
  61. maxframe/dataframe/arithmetic/ceil.py +28 -0
  62. maxframe/dataframe/arithmetic/core.py +342 -0
  63. maxframe/dataframe/arithmetic/cos.py +28 -0
  64. maxframe/dataframe/arithmetic/cosh.py +28 -0
  65. maxframe/dataframe/arithmetic/degrees.py +28 -0
  66. maxframe/dataframe/arithmetic/docstring.py +442 -0
  67. maxframe/dataframe/arithmetic/equal.py +56 -0
  68. maxframe/dataframe/arithmetic/exp.py +28 -0
  69. maxframe/dataframe/arithmetic/exp2.py +28 -0
  70. maxframe/dataframe/arithmetic/expm1.py +28 -0
  71. maxframe/dataframe/arithmetic/floor.py +28 -0
  72. maxframe/dataframe/arithmetic/floordiv.py +64 -0
  73. maxframe/dataframe/arithmetic/greater.py +57 -0
  74. maxframe/dataframe/arithmetic/greater_equal.py +57 -0
  75. maxframe/dataframe/arithmetic/invert.py +33 -0
  76. maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
  77. maxframe/dataframe/arithmetic/less.py +57 -0
  78. maxframe/dataframe/arithmetic/less_equal.py +57 -0
  79. maxframe/dataframe/arithmetic/log.py +28 -0
  80. maxframe/dataframe/arithmetic/log10.py +28 -0
  81. maxframe/dataframe/arithmetic/log2.py +28 -0
  82. maxframe/dataframe/arithmetic/mod.py +60 -0
  83. maxframe/dataframe/arithmetic/multiply.py +60 -0
  84. maxframe/dataframe/arithmetic/negative.py +33 -0
  85. maxframe/dataframe/arithmetic/not_equal.py +56 -0
  86. maxframe/dataframe/arithmetic/power.py +68 -0
  87. maxframe/dataframe/arithmetic/radians.py +28 -0
  88. maxframe/dataframe/arithmetic/sin.py +28 -0
  89. maxframe/dataframe/arithmetic/sinh.py +28 -0
  90. maxframe/dataframe/arithmetic/sqrt.py +28 -0
  91. maxframe/dataframe/arithmetic/subtract.py +64 -0
  92. maxframe/dataframe/arithmetic/tan.py +28 -0
  93. maxframe/dataframe/arithmetic/tanh.py +28 -0
  94. maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
  95. maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
  96. maxframe/dataframe/arithmetic/truediv.py +64 -0
  97. maxframe/dataframe/arithmetic/trunc.py +28 -0
  98. maxframe/dataframe/arrays.py +864 -0
  99. maxframe/dataframe/core.py +2417 -0
  100. maxframe/dataframe/datasource/__init__.py +15 -0
  101. maxframe/dataframe/datasource/core.py +81 -0
  102. maxframe/dataframe/datasource/dataframe.py +59 -0
  103. maxframe/dataframe/datasource/date_range.py +504 -0
  104. maxframe/dataframe/datasource/from_index.py +54 -0
  105. maxframe/dataframe/datasource/from_records.py +107 -0
  106. maxframe/dataframe/datasource/from_tensor.py +419 -0
  107. maxframe/dataframe/datasource/index.py +117 -0
  108. maxframe/dataframe/datasource/read_csv.py +528 -0
  109. maxframe/dataframe/datasource/read_odps_query.py +299 -0
  110. maxframe/dataframe/datasource/read_odps_table.py +253 -0
  111. maxframe/dataframe/datasource/read_parquet.py +421 -0
  112. maxframe/dataframe/datasource/series.py +55 -0
  113. maxframe/dataframe/datasource/tests/__init__.py +13 -0
  114. maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
  115. maxframe/dataframe/datastore/__init__.py +26 -0
  116. maxframe/dataframe/datastore/core.py +19 -0
  117. maxframe/dataframe/datastore/to_csv.py +227 -0
  118. maxframe/dataframe/datastore/to_odps.py +162 -0
  119. maxframe/dataframe/extensions/__init__.py +41 -0
  120. maxframe/dataframe/extensions/accessor.py +50 -0
  121. maxframe/dataframe/extensions/reshuffle.py +83 -0
  122. maxframe/dataframe/extensions/tests/__init__.py +13 -0
  123. maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
  124. maxframe/dataframe/fetch/__init__.py +15 -0
  125. maxframe/dataframe/fetch/core.py +86 -0
  126. maxframe/dataframe/groupby/__init__.py +82 -0
  127. maxframe/dataframe/groupby/aggregation.py +350 -0
  128. maxframe/dataframe/groupby/apply.py +251 -0
  129. maxframe/dataframe/groupby/core.py +179 -0
  130. maxframe/dataframe/groupby/cum.py +124 -0
  131. maxframe/dataframe/groupby/fill.py +141 -0
  132. maxframe/dataframe/groupby/getitem.py +92 -0
  133. maxframe/dataframe/groupby/head.py +105 -0
  134. maxframe/dataframe/groupby/sample.py +214 -0
  135. maxframe/dataframe/groupby/tests/__init__.py +13 -0
  136. maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
  137. maxframe/dataframe/groupby/transform.py +255 -0
  138. maxframe/dataframe/indexing/__init__.py +84 -0
  139. maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
  140. maxframe/dataframe/indexing/align.py +349 -0
  141. maxframe/dataframe/indexing/at.py +83 -0
  142. maxframe/dataframe/indexing/getitem.py +204 -0
  143. maxframe/dataframe/indexing/iat.py +37 -0
  144. maxframe/dataframe/indexing/iloc.py +566 -0
  145. maxframe/dataframe/indexing/insert.py +86 -0
  146. maxframe/dataframe/indexing/loc.py +411 -0
  147. maxframe/dataframe/indexing/reindex.py +526 -0
  148. maxframe/dataframe/indexing/rename.py +462 -0
  149. maxframe/dataframe/indexing/rename_axis.py +209 -0
  150. maxframe/dataframe/indexing/reset_index.py +402 -0
  151. maxframe/dataframe/indexing/sample.py +221 -0
  152. maxframe/dataframe/indexing/set_axis.py +194 -0
  153. maxframe/dataframe/indexing/set_index.py +61 -0
  154. maxframe/dataframe/indexing/setitem.py +130 -0
  155. maxframe/dataframe/indexing/tests/__init__.py +13 -0
  156. maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
  157. maxframe/dataframe/indexing/where.py +308 -0
  158. maxframe/dataframe/initializer.py +288 -0
  159. maxframe/dataframe/merge/__init__.py +32 -0
  160. maxframe/dataframe/merge/append.py +121 -0
  161. maxframe/dataframe/merge/concat.py +325 -0
  162. maxframe/dataframe/merge/merge.py +593 -0
  163. maxframe/dataframe/merge/tests/__init__.py +13 -0
  164. maxframe/dataframe/merge/tests/test_merge.py +215 -0
  165. maxframe/dataframe/misc/__init__.py +134 -0
  166. maxframe/dataframe/misc/_duplicate.py +46 -0
  167. maxframe/dataframe/misc/accessor.py +276 -0
  168. maxframe/dataframe/misc/apply.py +692 -0
  169. maxframe/dataframe/misc/astype.py +236 -0
  170. maxframe/dataframe/misc/case_when.py +141 -0
  171. maxframe/dataframe/misc/check_monotonic.py +84 -0
  172. maxframe/dataframe/misc/cut.py +383 -0
  173. maxframe/dataframe/misc/datetimes.py +79 -0
  174. maxframe/dataframe/misc/describe.py +108 -0
  175. maxframe/dataframe/misc/diff.py +210 -0
  176. maxframe/dataframe/misc/drop.py +440 -0
  177. maxframe/dataframe/misc/drop_duplicates.py +248 -0
  178. maxframe/dataframe/misc/duplicated.py +292 -0
  179. maxframe/dataframe/misc/eval.py +728 -0
  180. maxframe/dataframe/misc/explode.py +171 -0
  181. maxframe/dataframe/misc/get_dummies.py +208 -0
  182. maxframe/dataframe/misc/isin.py +217 -0
  183. maxframe/dataframe/misc/map.py +236 -0
  184. maxframe/dataframe/misc/melt.py +162 -0
  185. maxframe/dataframe/misc/memory_usage.py +248 -0
  186. maxframe/dataframe/misc/pct_change.py +150 -0
  187. maxframe/dataframe/misc/pivot_table.py +262 -0
  188. maxframe/dataframe/misc/qcut.py +104 -0
  189. maxframe/dataframe/misc/select_dtypes.py +104 -0
  190. maxframe/dataframe/misc/shift.py +256 -0
  191. maxframe/dataframe/misc/stack.py +238 -0
  192. maxframe/dataframe/misc/string_.py +221 -0
  193. maxframe/dataframe/misc/tests/__init__.py +13 -0
  194. maxframe/dataframe/misc/tests/test_misc.py +468 -0
  195. maxframe/dataframe/misc/to_numeric.py +178 -0
  196. maxframe/dataframe/misc/transform.py +361 -0
  197. maxframe/dataframe/misc/transpose.py +136 -0
  198. maxframe/dataframe/misc/value_counts.py +182 -0
  199. maxframe/dataframe/missing/__init__.py +53 -0
  200. maxframe/dataframe/missing/checkna.py +223 -0
  201. maxframe/dataframe/missing/dropna.py +280 -0
  202. maxframe/dataframe/missing/fillna.py +275 -0
  203. maxframe/dataframe/missing/replace.py +439 -0
  204. maxframe/dataframe/missing/tests/__init__.py +13 -0
  205. maxframe/dataframe/missing/tests/test_missing.py +89 -0
  206. maxframe/dataframe/operators.py +273 -0
  207. maxframe/dataframe/plotting/__init__.py +40 -0
  208. maxframe/dataframe/plotting/core.py +78 -0
  209. maxframe/dataframe/plotting/tests/__init__.py +13 -0
  210. maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
  211. maxframe/dataframe/reduction/__init__.py +107 -0
  212. maxframe/dataframe/reduction/aggregation.py +344 -0
  213. maxframe/dataframe/reduction/all.py +78 -0
  214. maxframe/dataframe/reduction/any.py +78 -0
  215. maxframe/dataframe/reduction/core.py +837 -0
  216. maxframe/dataframe/reduction/count.py +59 -0
  217. maxframe/dataframe/reduction/cummax.py +30 -0
  218. maxframe/dataframe/reduction/cummin.py +30 -0
  219. maxframe/dataframe/reduction/cumprod.py +30 -0
  220. maxframe/dataframe/reduction/cumsum.py +30 -0
  221. maxframe/dataframe/reduction/custom_reduction.py +42 -0
  222. maxframe/dataframe/reduction/kurtosis.py +104 -0
  223. maxframe/dataframe/reduction/max.py +65 -0
  224. maxframe/dataframe/reduction/mean.py +61 -0
  225. maxframe/dataframe/reduction/min.py +65 -0
  226. maxframe/dataframe/reduction/nunique.py +141 -0
  227. maxframe/dataframe/reduction/prod.py +76 -0
  228. maxframe/dataframe/reduction/reduction_size.py +36 -0
  229. maxframe/dataframe/reduction/sem.py +69 -0
  230. maxframe/dataframe/reduction/skew.py +89 -0
  231. maxframe/dataframe/reduction/std.py +53 -0
  232. maxframe/dataframe/reduction/str_concat.py +48 -0
  233. maxframe/dataframe/reduction/sum.py +77 -0
  234. maxframe/dataframe/reduction/tests/__init__.py +13 -0
  235. maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
  236. maxframe/dataframe/reduction/unique.py +90 -0
  237. maxframe/dataframe/reduction/var.py +72 -0
  238. maxframe/dataframe/sort/__init__.py +34 -0
  239. maxframe/dataframe/sort/core.py +36 -0
  240. maxframe/dataframe/sort/sort_index.py +153 -0
  241. maxframe/dataframe/sort/sort_values.py +311 -0
  242. maxframe/dataframe/sort/tests/__init__.py +13 -0
  243. maxframe/dataframe/sort/tests/test_sort.py +81 -0
  244. maxframe/dataframe/statistics/__init__.py +33 -0
  245. maxframe/dataframe/statistics/corr.py +280 -0
  246. maxframe/dataframe/statistics/quantile.py +341 -0
  247. maxframe/dataframe/statistics/tests/__init__.py +13 -0
  248. maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
  249. maxframe/dataframe/tests/__init__.py +13 -0
  250. maxframe/dataframe/tests/test_initializer.py +29 -0
  251. maxframe/dataframe/tseries/__init__.py +13 -0
  252. maxframe/dataframe/tseries/tests/__init__.py +13 -0
  253. maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
  254. maxframe/dataframe/tseries/to_datetime.py +297 -0
  255. maxframe/dataframe/ufunc/__init__.py +27 -0
  256. maxframe/dataframe/ufunc/tensor.py +54 -0
  257. maxframe/dataframe/ufunc/ufunc.py +52 -0
  258. maxframe/dataframe/utils.py +1267 -0
  259. maxframe/dataframe/window/__init__.py +29 -0
  260. maxframe/dataframe/window/aggregation.py +96 -0
  261. maxframe/dataframe/window/core.py +69 -0
  262. maxframe/dataframe/window/ewm.py +249 -0
  263. maxframe/dataframe/window/expanding.py +147 -0
  264. maxframe/dataframe/window/rolling.py +376 -0
  265. maxframe/dataframe/window/tests/__init__.py +13 -0
  266. maxframe/dataframe/window/tests/test_ewm.py +70 -0
  267. maxframe/dataframe/window/tests/test_expanding.py +66 -0
  268. maxframe/dataframe/window/tests/test_rolling.py +57 -0
  269. maxframe/env.py +33 -0
  270. maxframe/errors.py +21 -0
  271. maxframe/extension.py +81 -0
  272. maxframe/learn/__init__.py +17 -0
  273. maxframe/learn/contrib/__init__.py +17 -0
  274. maxframe/learn/contrib/pytorch/__init__.py +16 -0
  275. maxframe/learn/contrib/pytorch/run_function.py +110 -0
  276. maxframe/learn/contrib/pytorch/run_script.py +102 -0
  277. maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
  278. maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
  279. maxframe/learn/contrib/utils.py +52 -0
  280. maxframe/learn/contrib/xgboost/__init__.py +26 -0
  281. maxframe/learn/contrib/xgboost/classifier.py +86 -0
  282. maxframe/learn/contrib/xgboost/core.py +156 -0
  283. maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
  284. maxframe/learn/contrib/xgboost/predict.py +138 -0
  285. maxframe/learn/contrib/xgboost/regressor.py +78 -0
  286. maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
  287. maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
  288. maxframe/learn/contrib/xgboost/train.py +121 -0
  289. maxframe/learn/utils/__init__.py +15 -0
  290. maxframe/learn/utils/core.py +29 -0
  291. maxframe/lib/__init__.py +15 -0
  292. maxframe/lib/aio/__init__.py +27 -0
  293. maxframe/lib/aio/_runners.py +162 -0
  294. maxframe/lib/aio/_threads.py +35 -0
  295. maxframe/lib/aio/base.py +82 -0
  296. maxframe/lib/aio/file.py +85 -0
  297. maxframe/lib/aio/isolation.py +100 -0
  298. maxframe/lib/aio/lru.py +242 -0
  299. maxframe/lib/aio/parallelism.py +37 -0
  300. maxframe/lib/aio/tests/__init__.py +13 -0
  301. maxframe/lib/aio/tests/test_aio_file.py +55 -0
  302. maxframe/lib/compression.py +55 -0
  303. maxframe/lib/cython/__init__.py +13 -0
  304. maxframe/lib/cython/libcpp.pxd +30 -0
  305. maxframe/lib/filesystem/__init__.py +21 -0
  306. maxframe/lib/filesystem/_glob.py +173 -0
  307. maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
  308. maxframe/lib/filesystem/_oss_lib/common.py +198 -0
  309. maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
  310. maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
  311. maxframe/lib/filesystem/arrow.py +236 -0
  312. maxframe/lib/filesystem/base.py +263 -0
  313. maxframe/lib/filesystem/core.py +95 -0
  314. maxframe/lib/filesystem/fsmap.py +164 -0
  315. maxframe/lib/filesystem/hdfs.py +31 -0
  316. maxframe/lib/filesystem/local.py +112 -0
  317. maxframe/lib/filesystem/oss.py +157 -0
  318. maxframe/lib/filesystem/tests/__init__.py +13 -0
  319. maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
  320. maxframe/lib/filesystem/tests/test_oss.py +182 -0
  321. maxframe/lib/functools_compat.py +81 -0
  322. maxframe/lib/mmh3.cpython-38-darwin.so +0 -0
  323. maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
  324. maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
  325. maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
  326. maxframe/lib/sparse/__init__.py +861 -0
  327. maxframe/lib/sparse/array.py +1604 -0
  328. maxframe/lib/sparse/core.py +92 -0
  329. maxframe/lib/sparse/matrix.py +241 -0
  330. maxframe/lib/sparse/tests/__init__.py +15 -0
  331. maxframe/lib/sparse/tests/test_sparse.py +476 -0
  332. maxframe/lib/sparse/vector.py +150 -0
  333. maxframe/lib/tblib/LICENSE +20 -0
  334. maxframe/lib/tblib/__init__.py +327 -0
  335. maxframe/lib/tblib/cpython.py +83 -0
  336. maxframe/lib/tblib/decorators.py +44 -0
  337. maxframe/lib/tblib/pickling_support.py +90 -0
  338. maxframe/lib/tests/__init__.py +13 -0
  339. maxframe/lib/tests/test_wrapped_pickle.py +51 -0
  340. maxframe/lib/version.py +620 -0
  341. maxframe/lib/wrapped_pickle.py +139 -0
  342. maxframe/mixin.py +100 -0
  343. maxframe/odpsio/__init__.py +21 -0
  344. maxframe/odpsio/arrow.py +91 -0
  345. maxframe/odpsio/schema.py +364 -0
  346. maxframe/odpsio/tableio.py +322 -0
  347. maxframe/odpsio/tests/__init__.py +13 -0
  348. maxframe/odpsio/tests/test_arrow.py +88 -0
  349. maxframe/odpsio/tests/test_schema.py +297 -0
  350. maxframe/odpsio/tests/test_tableio.py +136 -0
  351. maxframe/odpsio/tests/test_volumeio.py +90 -0
  352. maxframe/odpsio/volumeio.py +95 -0
  353. maxframe/opcodes.py +590 -0
  354. maxframe/protocol.py +415 -0
  355. maxframe/remote/__init__.py +18 -0
  356. maxframe/remote/core.py +210 -0
  357. maxframe/remote/run_script.py +121 -0
  358. maxframe/serialization/__init__.py +26 -0
  359. maxframe/serialization/arrow.py +95 -0
  360. maxframe/serialization/core.cpython-38-darwin.so +0 -0
  361. maxframe/serialization/core.pxd +44 -0
  362. maxframe/serialization/core.pyi +61 -0
  363. maxframe/serialization/core.pyx +1094 -0
  364. maxframe/serialization/exception.py +86 -0
  365. maxframe/serialization/maxframe_objects.py +39 -0
  366. maxframe/serialization/numpy.py +91 -0
  367. maxframe/serialization/pandas.py +202 -0
  368. maxframe/serialization/scipy.py +71 -0
  369. maxframe/serialization/serializables/__init__.py +55 -0
  370. maxframe/serialization/serializables/core.py +262 -0
  371. maxframe/serialization/serializables/field.py +624 -0
  372. maxframe/serialization/serializables/field_type.py +589 -0
  373. maxframe/serialization/serializables/tests/__init__.py +13 -0
  374. maxframe/serialization/serializables/tests/test_field_type.py +121 -0
  375. maxframe/serialization/serializables/tests/test_serializable.py +250 -0
  376. maxframe/serialization/tests/__init__.py +13 -0
  377. maxframe/serialization/tests/test_serial.py +412 -0
  378. maxframe/session.py +1310 -0
  379. maxframe/tensor/__init__.py +183 -0
  380. maxframe/tensor/arithmetic/__init__.py +315 -0
  381. maxframe/tensor/arithmetic/abs.py +68 -0
  382. maxframe/tensor/arithmetic/absolute.py +68 -0
  383. maxframe/tensor/arithmetic/add.py +82 -0
  384. maxframe/tensor/arithmetic/angle.py +72 -0
  385. maxframe/tensor/arithmetic/arccos.py +104 -0
  386. maxframe/tensor/arithmetic/arccosh.py +91 -0
  387. maxframe/tensor/arithmetic/arcsin.py +94 -0
  388. maxframe/tensor/arithmetic/arcsinh.py +86 -0
  389. maxframe/tensor/arithmetic/arctan.py +106 -0
  390. maxframe/tensor/arithmetic/arctan2.py +128 -0
  391. maxframe/tensor/arithmetic/arctanh.py +86 -0
  392. maxframe/tensor/arithmetic/around.py +114 -0
  393. maxframe/tensor/arithmetic/bitand.py +95 -0
  394. maxframe/tensor/arithmetic/bitor.py +102 -0
  395. maxframe/tensor/arithmetic/bitxor.py +95 -0
  396. maxframe/tensor/arithmetic/cbrt.py +66 -0
  397. maxframe/tensor/arithmetic/ceil.py +71 -0
  398. maxframe/tensor/arithmetic/clip.py +165 -0
  399. maxframe/tensor/arithmetic/conj.py +74 -0
  400. maxframe/tensor/arithmetic/copysign.py +78 -0
  401. maxframe/tensor/arithmetic/core.py +544 -0
  402. maxframe/tensor/arithmetic/cos.py +85 -0
  403. maxframe/tensor/arithmetic/cosh.py +72 -0
  404. maxframe/tensor/arithmetic/deg2rad.py +72 -0
  405. maxframe/tensor/arithmetic/degrees.py +77 -0
  406. maxframe/tensor/arithmetic/divide.py +114 -0
  407. maxframe/tensor/arithmetic/equal.py +76 -0
  408. maxframe/tensor/arithmetic/exp.py +106 -0
  409. maxframe/tensor/arithmetic/exp2.py +67 -0
  410. maxframe/tensor/arithmetic/expm1.py +79 -0
  411. maxframe/tensor/arithmetic/fabs.py +74 -0
  412. maxframe/tensor/arithmetic/fix.py +69 -0
  413. maxframe/tensor/arithmetic/float_power.py +103 -0
  414. maxframe/tensor/arithmetic/floor.py +77 -0
  415. maxframe/tensor/arithmetic/floordiv.py +94 -0
  416. maxframe/tensor/arithmetic/fmax.py +105 -0
  417. maxframe/tensor/arithmetic/fmin.py +106 -0
  418. maxframe/tensor/arithmetic/fmod.py +99 -0
  419. maxframe/tensor/arithmetic/frexp.py +92 -0
  420. maxframe/tensor/arithmetic/greater.py +77 -0
  421. maxframe/tensor/arithmetic/greater_equal.py +69 -0
  422. maxframe/tensor/arithmetic/hypot.py +77 -0
  423. maxframe/tensor/arithmetic/i0.py +89 -0
  424. maxframe/tensor/arithmetic/imag.py +67 -0
  425. maxframe/tensor/arithmetic/invert.py +110 -0
  426. maxframe/tensor/arithmetic/isclose.py +115 -0
  427. maxframe/tensor/arithmetic/iscomplex.py +64 -0
  428. maxframe/tensor/arithmetic/isfinite.py +106 -0
  429. maxframe/tensor/arithmetic/isinf.py +103 -0
  430. maxframe/tensor/arithmetic/isnan.py +82 -0
  431. maxframe/tensor/arithmetic/isreal.py +63 -0
  432. maxframe/tensor/arithmetic/ldexp.py +99 -0
  433. maxframe/tensor/arithmetic/less.py +69 -0
  434. maxframe/tensor/arithmetic/less_equal.py +69 -0
  435. maxframe/tensor/arithmetic/log.py +92 -0
  436. maxframe/tensor/arithmetic/log10.py +85 -0
  437. maxframe/tensor/arithmetic/log1p.py +95 -0
  438. maxframe/tensor/arithmetic/log2.py +85 -0
  439. maxframe/tensor/arithmetic/logaddexp.py +80 -0
  440. maxframe/tensor/arithmetic/logaddexp2.py +78 -0
  441. maxframe/tensor/arithmetic/logical_and.py +81 -0
  442. maxframe/tensor/arithmetic/logical_not.py +74 -0
  443. maxframe/tensor/arithmetic/logical_or.py +82 -0
  444. maxframe/tensor/arithmetic/logical_xor.py +88 -0
  445. maxframe/tensor/arithmetic/lshift.py +82 -0
  446. maxframe/tensor/arithmetic/maximum.py +108 -0
  447. maxframe/tensor/arithmetic/minimum.py +108 -0
  448. maxframe/tensor/arithmetic/mod.py +104 -0
  449. maxframe/tensor/arithmetic/modf.py +83 -0
  450. maxframe/tensor/arithmetic/multiply.py +81 -0
  451. maxframe/tensor/arithmetic/nan_to_num.py +99 -0
  452. maxframe/tensor/arithmetic/negative.py +65 -0
  453. maxframe/tensor/arithmetic/nextafter.py +68 -0
  454. maxframe/tensor/arithmetic/not_equal.py +72 -0
  455. maxframe/tensor/arithmetic/positive.py +47 -0
  456. maxframe/tensor/arithmetic/power.py +106 -0
  457. maxframe/tensor/arithmetic/rad2deg.py +71 -0
  458. maxframe/tensor/arithmetic/radians.py +77 -0
  459. maxframe/tensor/arithmetic/real.py +70 -0
  460. maxframe/tensor/arithmetic/reciprocal.py +76 -0
  461. maxframe/tensor/arithmetic/rint.py +68 -0
  462. maxframe/tensor/arithmetic/rshift.py +81 -0
  463. maxframe/tensor/arithmetic/setimag.py +29 -0
  464. maxframe/tensor/arithmetic/setreal.py +29 -0
  465. maxframe/tensor/arithmetic/sign.py +81 -0
  466. maxframe/tensor/arithmetic/signbit.py +65 -0
  467. maxframe/tensor/arithmetic/sin.py +98 -0
  468. maxframe/tensor/arithmetic/sinc.py +102 -0
  469. maxframe/tensor/arithmetic/sinh.py +93 -0
  470. maxframe/tensor/arithmetic/spacing.py +72 -0
  471. maxframe/tensor/arithmetic/sqrt.py +81 -0
  472. maxframe/tensor/arithmetic/square.py +69 -0
  473. maxframe/tensor/arithmetic/subtract.py +81 -0
  474. maxframe/tensor/arithmetic/tan.py +88 -0
  475. maxframe/tensor/arithmetic/tanh.py +92 -0
  476. maxframe/tensor/arithmetic/tests/__init__.py +15 -0
  477. maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
  478. maxframe/tensor/arithmetic/truediv.py +104 -0
  479. maxframe/tensor/arithmetic/trunc.py +72 -0
  480. maxframe/tensor/arithmetic/utils.py +65 -0
  481. maxframe/tensor/array_utils.py +186 -0
  482. maxframe/tensor/base/__init__.py +34 -0
  483. maxframe/tensor/base/astype.py +119 -0
  484. maxframe/tensor/base/atleast_1d.py +74 -0
  485. maxframe/tensor/base/broadcast_to.py +89 -0
  486. maxframe/tensor/base/ravel.py +92 -0
  487. maxframe/tensor/base/tests/__init__.py +13 -0
  488. maxframe/tensor/base/tests/test_base.py +114 -0
  489. maxframe/tensor/base/transpose.py +125 -0
  490. maxframe/tensor/base/unique.py +205 -0
  491. maxframe/tensor/base/where.py +127 -0
  492. maxframe/tensor/core.py +724 -0
  493. maxframe/tensor/datasource/__init__.py +32 -0
  494. maxframe/tensor/datasource/arange.py +156 -0
  495. maxframe/tensor/datasource/array.py +415 -0
  496. maxframe/tensor/datasource/core.py +109 -0
  497. maxframe/tensor/datasource/empty.py +169 -0
  498. maxframe/tensor/datasource/from_dataframe.py +70 -0
  499. maxframe/tensor/datasource/from_dense.py +54 -0
  500. maxframe/tensor/datasource/from_sparse.py +47 -0
  501. maxframe/tensor/datasource/full.py +186 -0
  502. maxframe/tensor/datasource/ones.py +173 -0
  503. maxframe/tensor/datasource/scalar.py +40 -0
  504. maxframe/tensor/datasource/tests/__init__.py +13 -0
  505. maxframe/tensor/datasource/tests/test_datasource.py +278 -0
  506. maxframe/tensor/datasource/zeros.py +188 -0
  507. maxframe/tensor/fetch/__init__.py +15 -0
  508. maxframe/tensor/fetch/core.py +54 -0
  509. maxframe/tensor/indexing/__init__.py +47 -0
  510. maxframe/tensor/indexing/choose.py +196 -0
  511. maxframe/tensor/indexing/compress.py +124 -0
  512. maxframe/tensor/indexing/core.py +190 -0
  513. maxframe/tensor/indexing/extract.py +71 -0
  514. maxframe/tensor/indexing/fill_diagonal.py +183 -0
  515. maxframe/tensor/indexing/flatnonzero.py +60 -0
  516. maxframe/tensor/indexing/getitem.py +175 -0
  517. maxframe/tensor/indexing/nonzero.py +120 -0
  518. maxframe/tensor/indexing/setitem.py +132 -0
  519. maxframe/tensor/indexing/slice.py +29 -0
  520. maxframe/tensor/indexing/take.py +130 -0
  521. maxframe/tensor/indexing/tests/__init__.py +15 -0
  522. maxframe/tensor/indexing/tests/test_indexing.py +234 -0
  523. maxframe/tensor/indexing/unravel_index.py +103 -0
  524. maxframe/tensor/merge/__init__.py +15 -0
  525. maxframe/tensor/merge/stack.py +132 -0
  526. maxframe/tensor/merge/tests/__init__.py +13 -0
  527. maxframe/tensor/merge/tests/test_merge.py +52 -0
  528. maxframe/tensor/operators.py +123 -0
  529. maxframe/tensor/random/__init__.py +168 -0
  530. maxframe/tensor/random/beta.py +87 -0
  531. maxframe/tensor/random/binomial.py +137 -0
  532. maxframe/tensor/random/bytes.py +39 -0
  533. maxframe/tensor/random/chisquare.py +110 -0
  534. maxframe/tensor/random/choice.py +186 -0
  535. maxframe/tensor/random/core.py +234 -0
  536. maxframe/tensor/random/dirichlet.py +123 -0
  537. maxframe/tensor/random/exponential.py +94 -0
  538. maxframe/tensor/random/f.py +135 -0
  539. maxframe/tensor/random/gamma.py +128 -0
  540. maxframe/tensor/random/geometric.py +93 -0
  541. maxframe/tensor/random/gumbel.py +167 -0
  542. maxframe/tensor/random/hypergeometric.py +148 -0
  543. maxframe/tensor/random/laplace.py +133 -0
  544. maxframe/tensor/random/logistic.py +129 -0
  545. maxframe/tensor/random/lognormal.py +159 -0
  546. maxframe/tensor/random/logseries.py +122 -0
  547. maxframe/tensor/random/multinomial.py +133 -0
  548. maxframe/tensor/random/multivariate_normal.py +192 -0
  549. maxframe/tensor/random/negative_binomial.py +125 -0
  550. maxframe/tensor/random/noncentral_chisquare.py +132 -0
  551. maxframe/tensor/random/noncentral_f.py +126 -0
  552. maxframe/tensor/random/normal.py +143 -0
  553. maxframe/tensor/random/pareto.py +140 -0
  554. maxframe/tensor/random/permutation.py +104 -0
  555. maxframe/tensor/random/poisson.py +111 -0
  556. maxframe/tensor/random/power.py +142 -0
  557. maxframe/tensor/random/rand.py +82 -0
  558. maxframe/tensor/random/randint.py +121 -0
  559. maxframe/tensor/random/randn.py +96 -0
  560. maxframe/tensor/random/random_integers.py +123 -0
  561. maxframe/tensor/random/random_sample.py +86 -0
  562. maxframe/tensor/random/rayleigh.py +110 -0
  563. maxframe/tensor/random/shuffle.py +61 -0
  564. maxframe/tensor/random/standard_cauchy.py +105 -0
  565. maxframe/tensor/random/standard_exponential.py +72 -0
  566. maxframe/tensor/random/standard_gamma.py +120 -0
  567. maxframe/tensor/random/standard_normal.py +74 -0
  568. maxframe/tensor/random/standard_t.py +135 -0
  569. maxframe/tensor/random/tests/__init__.py +15 -0
  570. maxframe/tensor/random/tests/test_random.py +167 -0
  571. maxframe/tensor/random/triangular.py +119 -0
  572. maxframe/tensor/random/uniform.py +131 -0
  573. maxframe/tensor/random/vonmises.py +131 -0
  574. maxframe/tensor/random/wald.py +114 -0
  575. maxframe/tensor/random/weibull.py +140 -0
  576. maxframe/tensor/random/zipf.py +122 -0
  577. maxframe/tensor/rechunk/__init__.py +26 -0
  578. maxframe/tensor/rechunk/rechunk.py +43 -0
  579. maxframe/tensor/reduction/__init__.py +66 -0
  580. maxframe/tensor/reduction/all.py +103 -0
  581. maxframe/tensor/reduction/allclose.py +88 -0
  582. maxframe/tensor/reduction/any.py +105 -0
  583. maxframe/tensor/reduction/argmax.py +103 -0
  584. maxframe/tensor/reduction/argmin.py +103 -0
  585. maxframe/tensor/reduction/array_equal.py +64 -0
  586. maxframe/tensor/reduction/core.py +168 -0
  587. maxframe/tensor/reduction/count_nonzero.py +81 -0
  588. maxframe/tensor/reduction/cumprod.py +97 -0
  589. maxframe/tensor/reduction/cumsum.py +101 -0
  590. maxframe/tensor/reduction/max.py +120 -0
  591. maxframe/tensor/reduction/mean.py +123 -0
  592. maxframe/tensor/reduction/min.py +120 -0
  593. maxframe/tensor/reduction/nanargmax.py +82 -0
  594. maxframe/tensor/reduction/nanargmin.py +76 -0
  595. maxframe/tensor/reduction/nancumprod.py +91 -0
  596. maxframe/tensor/reduction/nancumsum.py +94 -0
  597. maxframe/tensor/reduction/nanmax.py +111 -0
  598. maxframe/tensor/reduction/nanmean.py +106 -0
  599. maxframe/tensor/reduction/nanmin.py +111 -0
  600. maxframe/tensor/reduction/nanprod.py +94 -0
  601. maxframe/tensor/reduction/nanstd.py +126 -0
  602. maxframe/tensor/reduction/nansum.py +115 -0
  603. maxframe/tensor/reduction/nanvar.py +149 -0
  604. maxframe/tensor/reduction/prod.py +130 -0
  605. maxframe/tensor/reduction/std.py +134 -0
  606. maxframe/tensor/reduction/sum.py +125 -0
  607. maxframe/tensor/reduction/tests/__init__.py +13 -0
  608. maxframe/tensor/reduction/tests/test_reduction.py +181 -0
  609. maxframe/tensor/reduction/var.py +176 -0
  610. maxframe/tensor/reshape/__init__.py +17 -0
  611. maxframe/tensor/reshape/reshape.py +188 -0
  612. maxframe/tensor/reshape/tests/__init__.py +15 -0
  613. maxframe/tensor/reshape/tests/test_reshape.py +37 -0
  614. maxframe/tensor/statistics/__init__.py +13 -0
  615. maxframe/tensor/statistics/percentile.py +175 -0
  616. maxframe/tensor/statistics/quantile.py +288 -0
  617. maxframe/tensor/ufunc/__init__.py +26 -0
  618. maxframe/tensor/ufunc/ufunc.py +200 -0
  619. maxframe/tensor/utils.py +718 -0
  620. maxframe/tests/__init__.py +13 -0
  621. maxframe/tests/test_codegen.py +69 -0
  622. maxframe/tests/test_protocol.py +144 -0
  623. maxframe/tests/test_utils.py +376 -0
  624. maxframe/tests/utils.py +164 -0
  625. maxframe/typing_.py +37 -0
  626. maxframe/udf.py +134 -0
  627. maxframe/utils.py +1114 -0
  628. maxframe-0.1.0b5.dist-info/METADATA +104 -0
  629. maxframe-0.1.0b5.dist-info/RECORD +647 -0
  630. maxframe-0.1.0b5.dist-info/WHEEL +5 -0
  631. maxframe-0.1.0b5.dist-info/top_level.txt +2 -0
  632. maxframe_client/__init__.py +17 -0
  633. maxframe_client/clients/__init__.py +13 -0
  634. maxframe_client/clients/framedriver.py +118 -0
  635. maxframe_client/clients/spe.py +104 -0
  636. maxframe_client/conftest.py +15 -0
  637. maxframe_client/fetcher.py +264 -0
  638. maxframe_client/session/__init__.py +22 -0
  639. maxframe_client/session/consts.py +36 -0
  640. maxframe_client/session/graph.py +119 -0
  641. maxframe_client/session/odps.py +482 -0
  642. maxframe_client/session/task.py +280 -0
  643. maxframe_client/session/tests/__init__.py +13 -0
  644. maxframe_client/session/tests/test_task.py +85 -0
  645. maxframe_client/tests/__init__.py +13 -0
  646. maxframe_client/tests/test_fetcher.py +89 -0
  647. maxframe_client/tests/test_session.py +255 -0
@@ -0,0 +1,119 @@
1
+ # Copyright 1999-2024 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import itertools
16
+ import logging
17
+ import warnings
18
+ from dataclasses import dataclass
19
+ from typing import Any, Dict, List, Tuple, Union
20
+ from weakref import WeakSet
21
+
22
+ from maxframe.core import ChunkType, TileableGraph, TileableType, enter_mode
23
+ from maxframe.core.operator import Fetch
24
+ from maxframe.session import AbstractSession
25
+ from maxframe.utils import build_fetch, copy_tileables
26
+
27
+ logger = logging.getLogger(__name__)
28
+
29
+
30
+ @dataclass
31
+ class ChunkFetchInfo:
32
+ tileable: TileableType
33
+ chunk: ChunkType
34
+ indexes: List[Union[int, slice]]
35
+ data: Any = None
36
+
37
+
38
+ _submitted_tileables = WeakSet()
39
+
40
+
41
+ @enter_mode(build=True, kernel=True)
42
+ def gen_submit_tileable_graph(
43
+ session: AbstractSession,
44
+ result_tileables: List[TileableType],
45
+ tileable_to_copied: Dict[TileableType, TileableType] = None,
46
+ warn_duplicated_execution: bool = False,
47
+ ) -> Tuple[TileableGraph, List[TileableType]]:
48
+ tileable_to_copied = (
49
+ tileable_to_copied if tileable_to_copied is not None else dict()
50
+ )
51
+ indexer = itertools.count()
52
+ result_to_index = {t: i for t, i in zip(result_tileables, indexer)}
53
+ result = list()
54
+ to_execute_tileables = list()
55
+ graph = TileableGraph(result)
56
+
57
+ q = list(result_tileables)
58
+ while q:
59
+ tileable = q.pop()
60
+ if tileable in tileable_to_copied:
61
+ continue
62
+ if tileable.cache and tileable not in result_to_index:
63
+ result_to_index[tileable] = next(indexer)
64
+ outputs = tileable.op.outputs
65
+ inputs = tileable.inputs if session not in tileable._executed_sessions else []
66
+ new_inputs = []
67
+ all_inputs_processed = True
68
+ for inp in inputs:
69
+ if inp in tileable_to_copied:
70
+ new_inputs.append(tileable_to_copied[inp])
71
+ elif session in inp._executed_sessions:
72
+ # executed, gen fetch
73
+ fetch_input = build_fetch(inp).data
74
+ tileable_to_copied[inp] = fetch_input
75
+ graph.add_node(fetch_input)
76
+ new_inputs.append(fetch_input)
77
+ else:
78
+ # some input not processed before
79
+ all_inputs_processed = False
80
+ # put back tileable
81
+ q.append(tileable)
82
+ q.append(inp)
83
+ break
84
+ if all_inputs_processed:
85
+ if isinstance(tileable.op, Fetch):
86
+ new_outputs = [tileable]
87
+ elif session in tileable._executed_sessions:
88
+ new_outputs = []
89
+ for out in outputs:
90
+ fetch_out = tileable_to_copied.get(out, build_fetch(out).data)
91
+ new_outputs.append(fetch_out)
92
+ else:
93
+ new_outputs = [
94
+ t.data for t in copy_tileables(outputs, inputs=new_inputs)
95
+ ]
96
+ for out, new_out in zip(outputs, new_outputs):
97
+ tileable_to_copied[out] = new_out
98
+ graph.add_node(new_out)
99
+ for new_inp in new_inputs:
100
+ graph.add_edge(new_inp, new_out)
101
+
102
+ # process results
103
+ result.extend([None] * len(result_to_index))
104
+ for t, i in result_to_index.items():
105
+ result[i] = tileable_to_copied[t]
106
+ to_execute_tileables.append(t)
107
+
108
+ if warn_duplicated_execution:
109
+ for n, c in tileable_to_copied.items():
110
+ if not isinstance(c.op, Fetch) and n in _submitted_tileables:
111
+ warnings.warn(
112
+ f"Tileable {repr(n)} has been submitted before", RuntimeWarning
113
+ )
114
+ # add all nodes into submitted tileables
115
+ _submitted_tileables.update(
116
+ n for n, c in tileable_to_copied.items() if not isinstance(c.op, Fetch)
117
+ )
118
+
119
+ return graph, to_execute_tileables
@@ -0,0 +1,482 @@
1
+ # Copyright 1999-2024 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import abc
16
+ import asyncio
17
+ import logging
18
+ import time
19
+ import weakref
20
+ from numbers import Integral
21
+ from typing import Dict, List, Mapping, Optional, Tuple, Union
22
+ from urllib.parse import urlparse
23
+
24
+ import numpy as np
25
+ import pandas as pd
26
+ from odps import ODPS
27
+
28
+ from maxframe.config import options
29
+ from maxframe.core import Entity, TileableGraph, enter_mode
30
+ from maxframe.dataframe import read_odps_table
31
+ from maxframe.dataframe.core import DATAFRAME_TYPE, SERIES_TYPE
32
+ from maxframe.dataframe.datasource import PandasDataSourceOperator
33
+ from maxframe.dataframe.datasource.read_odps_table import DataFrameReadODPSTable
34
+ from maxframe.odpsio import HaloTableIO, pandas_to_arrow, pandas_to_odps_schema
35
+ from maxframe.protocol import (
36
+ DagInfo,
37
+ DagStatus,
38
+ ODPSTableResultInfo,
39
+ ResultInfo,
40
+ SessionInfo,
41
+ )
42
+ from maxframe.session import (
43
+ AbstractSession,
44
+ ExecutionInfo,
45
+ IsolatedAsyncSession,
46
+ Profiling,
47
+ Progress,
48
+ )
49
+ from maxframe.typing_ import TileableType
50
+ from maxframe.utils import ToThreadMixin, build_temp_table_name
51
+
52
+ from ..clients.framedriver import FrameDriverClient
53
+ from ..fetcher import get_fetcher_cls
54
+ from .consts import RESTFUL_SESSION_INSECURE_SCHEME, RESTFUL_SESSION_SECURE_SCHEME
55
+ from .graph import gen_submit_tileable_graph
56
+
57
+ logger = logging.getLogger(__name__)
58
+
59
+
60
+ class MaxFrameServiceCaller(metaclass=abc.ABCMeta):
61
+ @abc.abstractmethod
62
+ def create_session(self) -> SessionInfo:
63
+ raise NotImplementedError
64
+
65
+ @abc.abstractmethod
66
+ def delete_session(self) -> None:
67
+ raise NotImplementedError
68
+
69
+ @abc.abstractmethod
70
+ def submit_dag(
71
+ self, dag: TileableGraph, managed_input_infos: Dict[str, ResultInfo]
72
+ ) -> DagInfo:
73
+ raise NotImplementedError
74
+
75
+ @abc.abstractmethod
76
+ def get_dag_info(self, dag_id: str) -> DagInfo:
77
+ raise NotImplementedError
78
+
79
+ @abc.abstractmethod
80
+ def cancel_dag(self, dag_id: str) -> DagInfo:
81
+ raise NotImplementedError
82
+
83
+ @abc.abstractmethod
84
+ def decref(self, tileable_keys: List[str]) -> None:
85
+ raise NotImplementedError
86
+
87
+ def get_logview_address(self, dag_id=None, hours=None) -> Optional[str]:
88
+ return None
89
+
90
+
91
+ class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
92
+ _odps_entry: Optional[ODPS]
93
+ _tileable_to_infos: Mapping[TileableType, ResultInfo]
94
+
95
+ @classmethod
96
+ async def init(
97
+ cls,
98
+ address: str,
99
+ session_id: Optional[str] = None,
100
+ backend: str = None,
101
+ odps_entry: Optional[ODPS] = None,
102
+ timeout: Optional[float] = None,
103
+ **kwargs,
104
+ ) -> "AbstractSession":
105
+ session_obj = cls(
106
+ address, session_id, odps_entry=odps_entry, timeout=timeout, **kwargs
107
+ )
108
+ await session_obj._init(address)
109
+ return session_obj
110
+
111
+ def __init__(
112
+ self,
113
+ address: str,
114
+ session_id: str,
115
+ odps_entry: Optional[ODPS] = None,
116
+ timeout: Optional[float] = None,
117
+ **kwargs,
118
+ ):
119
+ super().__init__(address, session_id)
120
+ self.timeout = timeout
121
+ self._odps_entry = odps_entry or ODPS.from_global() or ODPS.from_environments()
122
+ self._tileable_to_infos = weakref.WeakKeyDictionary()
123
+
124
+ self._caller = self._create_caller(odps_entry, address, **kwargs)
125
+
126
+ @classmethod
127
+ def _create_caller(
128
+ cls, odps_entry: ODPS, address: str, **kwargs
129
+ ) -> MaxFrameServiceCaller:
130
+ raise NotImplementedError
131
+
132
+ async def _init(self, _address: str):
133
+ session_info = await self.ensure_async_call(self._caller.create_session)
134
+ self._session_id = session_info.session_id
135
+ await self._show_logview_address()
136
+
137
+ def _upload_and_get_read_tileable(self, t: TileableType) -> Optional[TileableType]:
138
+ if (
139
+ not isinstance(t.op, PandasDataSourceOperator)
140
+ or t.op.get_data() is None
141
+ or t.inputs
142
+ ):
143
+ return None
144
+
145
+ schema, table_meta = pandas_to_odps_schema(t, unknown_as_string=True)
146
+ if self._odps_entry.exist_table(table_meta.table_name):
147
+ self._odps_entry.delete_table(table_meta.table_name)
148
+ table_name = build_temp_table_name(self.session_id, t.key)
149
+ table_obj = self._odps_entry.create_table(
150
+ table_name, schema, lifecycle=options.session.temp_table_lifecycle
151
+ )
152
+
153
+ data = t.op.get_data()
154
+ batch_size = options.session.upload_batch_size
155
+
156
+ if len(data):
157
+ halo_client = HaloTableIO(self._odps_entry)
158
+ with halo_client.open_writer(table_obj.full_table_name) as writer:
159
+ for batch_start in range(0, len(data), batch_size):
160
+ if isinstance(data, pd.Index):
161
+ batch = data[batch_start : batch_start + batch_size]
162
+ else:
163
+ batch = data.iloc[batch_start : batch_start + batch_size]
164
+ arrow_batch, _ = pandas_to_arrow(batch)
165
+ writer.write(arrow_batch)
166
+
167
+ read_tileable = read_odps_table(
168
+ table_obj.full_table_name,
169
+ columns=table_meta.table_column_names,
170
+ index_col=table_meta.table_index_column_names,
171
+ output_type=table_meta.type,
172
+ )
173
+ if isinstance(read_tileable, DATAFRAME_TYPE):
174
+ if list(read_tileable.dtypes.index) != list(t.dtypes.index):
175
+ read_tileable.columns = list(t.dtypes.index)
176
+ elif isinstance(read_tileable, SERIES_TYPE):
177
+ if read_tileable.name != t.name:
178
+ read_tileable.name = t.name
179
+ else: # INDEX_TYPE
180
+ if list(read_tileable.names) != list(t.names):
181
+ read_tileable.names = t.names
182
+ read_tileable._key = t.key
183
+ read_tileable.params = t.params
184
+ return read_tileable.data
185
+
186
+ @enter_mode(kernel=True, build=True)
187
+ def _scan_and_replace_pandas_sources(
188
+ self, graph: TileableGraph
189
+ ) -> Dict[TileableType, TileableType]:
190
+ """Replaces Pandas data sources with temp table sources in the graph"""
191
+ replacements = dict()
192
+ for t in graph:
193
+ replaced = self._upload_and_get_read_tileable(t)
194
+ if replaced is None:
195
+ continue
196
+ replacements[t] = replaced
197
+
198
+ for src, replaced in replacements.items():
199
+ successors = list(graph.successors(src))
200
+ graph.remove_node(src)
201
+ graph.add_node(replaced)
202
+ for pred in replaced.inputs or ():
203
+ graph.add_node(pred)
204
+ graph.add_edge(pred, replaced)
205
+
206
+ for succ in successors:
207
+ graph.add_edge(replaced, succ)
208
+ succ.inputs = [replacements.get(t, t) for t in succ.inputs]
209
+
210
+ graph.results = [replacements.get(t, t) for t in graph.results]
211
+ return replacements
212
+
213
+ @enter_mode(kernel=True, build=True)
214
+ def _get_input_infos(self, tileables: List[TileableType]) -> Dict[str, ResultInfo]:
215
+ """Generate ResultInfo structs from generated temp tables"""
216
+ infos = dict()
217
+ for t in tileables:
218
+ key = t.key
219
+ if not isinstance(t.op, DataFrameReadODPSTable):
220
+ if not isinstance(t.inputs[0].op, DataFrameReadODPSTable):
221
+ continue
222
+ t = t.inputs[0]
223
+ infos[key] = ODPSTableResultInfo(full_table_name=t.op.table_name)
224
+ return infos
225
+
226
+ async def execute(self, *tileables, **kwargs) -> ExecutionInfo:
227
+ tileables = [
228
+ tileable.data if isinstance(tileable, Entity) else tileable
229
+ for tileable in tileables
230
+ ]
231
+ tileable_to_copied = dict()
232
+ tileable_graph, to_execute_tileables = gen_submit_tileable_graph(
233
+ self, tileables, tileable_to_copied
234
+ )
235
+ source_replacements = self._scan_and_replace_pandas_sources(tileable_graph)
236
+
237
+ # we need to manage uploaded data sources with refcounting mechanism
238
+ # as nodes in tileable_graph are copied, we need to use original nodes
239
+ copied_to_tileable = {v: k for k, v in tileable_to_copied.items()}
240
+ for replaced_src in source_replacements.keys():
241
+ copied_to_tileable[replaced_src]._attach_session(self)
242
+
243
+ replaced_infos = self._get_input_infos(list(source_replacements.values()))
244
+ dag_info = await self.ensure_async_call(
245
+ self._caller.submit_dag, tileable_graph, replaced_infos
246
+ )
247
+
248
+ await self._show_logview_address(dag_info.dag_id)
249
+
250
+ progress = Progress()
251
+ profiling = Profiling()
252
+ aio_task = asyncio.create_task(
253
+ self._run_in_background(dag_info, to_execute_tileables, progress)
254
+ )
255
+ return ExecutionInfo(
256
+ aio_task,
257
+ progress,
258
+ profiling,
259
+ asyncio.get_running_loop(),
260
+ to_execute_tileables,
261
+ )
262
+
263
+ async def _run_in_background(
264
+ self, dag_info: DagInfo, tileables: List, progress: Progress
265
+ ):
266
+ start_time = time.time()
267
+ dag_id = dag_info.dag_id
268
+ wait_timeout = 10
269
+ with enter_mode(build=True, kernel=True):
270
+ key_to_tileables = {t.key: t for t in tileables}
271
+
272
+ try:
273
+ while True:
274
+ elapsed_time = time.time() - start_time
275
+ timeout_val = (
276
+ min(self.timeout - elapsed_time, wait_timeout)
277
+ if self.timeout
278
+ else wait_timeout
279
+ )
280
+ if timeout_val <= 0:
281
+ raise TimeoutError("Running DAG timed out")
282
+
283
+ dag_info: DagInfo = await self.ensure_async_call(
284
+ self._caller.get_dag_info, dag_id
285
+ )
286
+ progress.value = dag_info.progress
287
+ if dag_info.status != DagStatus.RUNNING:
288
+ break
289
+ await asyncio.sleep(timeout_val)
290
+ except asyncio.CancelledError:
291
+ dag_info = await self.ensure_async_call(self._caller.cancel_dag, dag_id)
292
+ if dag_info.status != DagStatus.CANCELLED: # pragma: no cover
293
+ raise
294
+ finally:
295
+ if dag_info.status == DagStatus.SUCCEEDED:
296
+ progress.value = 1.0
297
+ elif dag_info.status == DagStatus.FAILED:
298
+ dag_info.error_info.reraise()
299
+
300
+ if dag_info.status in (DagStatus.RUNNING, DagStatus.CANCELLED):
301
+ return
302
+
303
+ for key, result_info in dag_info.tileable_to_result_infos.items():
304
+ t = key_to_tileables[key]
305
+ fetcher = get_fetcher_cls(result_info.result_type)(self._odps_entry)
306
+ await fetcher.update_tileable_meta(t, result_info)
307
+ self._tileable_to_infos[t] = result_info
308
+
309
+ def _get_data_tileable_and_indexes(
310
+ self, tileable: TileableType
311
+ ) -> Tuple[TileableType, List[Union[slice, Integral]]]:
312
+ from maxframe.dataframe.indexing.iloc import (
313
+ DataFrameIlocGetItem,
314
+ SeriesIlocGetItem,
315
+ )
316
+ from maxframe.tensor.indexing import TensorIndex
317
+
318
+ slice_op_types = TensorIndex, DataFrameIlocGetItem, SeriesIlocGetItem
319
+
320
+ if isinstance(tileable, Entity):
321
+ tileable = tileable.data
322
+
323
+ indexes = None
324
+ while tileable not in self._tileable_to_infos:
325
+ # if tileable's op is slice, try to check input
326
+ if isinstance(tileable.op, slice_op_types):
327
+ indexes = tileable.op.indexes
328
+ tileable = tileable.inputs[0]
329
+ if not all(isinstance(index, (slice, Integral)) for index in indexes):
330
+ raise ValueError("Only support fetch data slices")
331
+ else:
332
+ raise ValueError(f"Cannot fetch unexecuted tileable: {tileable!r}")
333
+
334
+ return tileable, indexes
335
+
336
+ async def fetch(self, *tileables, **kwargs) -> list:
337
+ results = []
338
+ tileables = [
339
+ tileable.data if isinstance(tileable, Entity) else tileable
340
+ for tileable in tileables
341
+ ]
342
+ with enter_mode(build=True):
343
+ for tileable in tileables:
344
+ data_tileable, indexes = self._get_data_tileable_and_indexes(tileable)
345
+ info = self._tileable_to_infos[data_tileable]
346
+ fetcher = get_fetcher_cls(info.result_type)(self._odps_entry)
347
+ results.append(await fetcher.fetch(tileable, info, indexes))
348
+ return results
349
+
350
+ async def decref(self, *tileable_keys):
351
+ return await self.ensure_async_call(self._caller.decref, list(tileable_keys))
352
+
353
+ async def destroy(self):
354
+ await self.ensure_async_call(self._caller.delete_session)
355
+ await super().destroy()
356
+
357
+ async def _get_ref_counts(self) -> Dict[str, int]:
358
+ pass
359
+
360
+ async def fetch_tileable_op_logs(
361
+ self,
362
+ tileable_op_key: str,
363
+ offsets: Union[Dict[str, List[int]], str, int],
364
+ sizes: Union[Dict[str, List[int]], str, int],
365
+ ) -> Dict:
366
+ pass
367
+
368
+ async def get_total_n_cpu(self):
369
+ pass
370
+
371
+ async def get_cluster_versions(self) -> List[str]:
372
+ raise NotImplementedError
373
+
374
+ async def get_web_endpoint(self) -> Optional[str]:
375
+ raise NotImplementedError
376
+
377
+ async def create_remote_object(
378
+ self, session_id: str, name: str, object_cls, *args, **kwargs
379
+ ):
380
+ raise NotImplementedError
381
+
382
+ async def get_remote_object(self, session_id: str, name: str):
383
+ raise NotImplementedError
384
+
385
+ async def destroy_remote_object(self, session_id: str, name: str):
386
+ raise NotImplementedError
387
+
388
+ async def create_mutable_tensor(
389
+ self,
390
+ shape: tuple,
391
+ dtype: Union[np.dtype, str],
392
+ name: str = None,
393
+ default_value: Union[int, float] = 0,
394
+ chunk_size: Union[int, Tuple] = None,
395
+ ):
396
+ raise NotImplementedError
397
+
398
+ async def get_mutable_tensor(self, name: str):
399
+ raise NotImplementedError
400
+
401
+ async def get_logview_address(self, hours=None) -> Optional[str]:
402
+ return await self.get_dag_logview_address(None, hours)
403
+
404
+ async def get_dag_logview_address(self, dag_id=None, hours=None) -> Optional[str]:
405
+ return await self.ensure_async_call(
406
+ self._caller.get_logview_address, dag_id, hours
407
+ )
408
+
409
+ async def _show_logview_address(self, dag_id=None, hours=None):
410
+ identity = f"Session ID: {self._session_id}"
411
+ if dag_id:
412
+ identity += f", DAG ID: {dag_id}"
413
+
414
+ logview_addr = await self.get_dag_logview_address(dag_id, hours)
415
+ if logview_addr:
416
+ logger.info("%s, Logview: %s", identity, logview_addr)
417
+ else:
418
+ logger.info("%s, Logview address does not exist", identity)
419
+
420
+
421
+ class MaxFrameRestCaller(MaxFrameServiceCaller):
422
+ _client: FrameDriverClient
423
+ _session_id: Optional[str]
424
+
425
+ def __init__(self, client: FrameDriverClient):
426
+ self._client = client
427
+ self._session_id = None
428
+
429
+ async def create_session(self) -> SessionInfo:
430
+ info = await self._client.create_session(options.to_dict(remote_only=True))
431
+ self._session_id = info.session_id
432
+ return info
433
+
434
+ async def delete_session(self) -> None:
435
+ await self._client.delete_session(self._session_id)
436
+
437
+ async def submit_dag(
438
+ self, dag: TileableGraph, managed_input_infos: Dict[str, ResultInfo]
439
+ ) -> DagInfo:
440
+ return await self._client.submit_dag(self._session_id, dag, managed_input_infos)
441
+
442
+ async def get_dag_info(self, dag_id: str) -> DagInfo:
443
+ return await self._client.get_dag_info(self._session_id, dag_id)
444
+
445
+ async def cancel_dag(self, dag_id: str) -> DagInfo:
446
+ return await self._client.cancel_dag(self._session_id, dag_id)
447
+
448
+ async def decref(self, tileable_keys: List[str]) -> None:
449
+ return await self._client.decref(self._session_id, tileable_keys)
450
+
451
+
452
+ class MaxFrameRestSession(MaxFrameSession):
453
+ schemes = [RESTFUL_SESSION_INSECURE_SCHEME, RESTFUL_SESSION_SECURE_SCHEME]
454
+
455
+ def __init__(
456
+ self,
457
+ address: str,
458
+ session_id: str,
459
+ odps_entry: Optional[ODPS] = None,
460
+ timeout: Optional[float] = None,
461
+ new: bool = True,
462
+ **kwargs,
463
+ ):
464
+ parsed_endpoint = urlparse(address)
465
+ scheme = (
466
+ "http"
467
+ if parsed_endpoint.scheme == RESTFUL_SESSION_INSECURE_SCHEME
468
+ else "https"
469
+ )
470
+ real_endpoint = address.replace(f"{parsed_endpoint.scheme}://", f"{scheme}://")
471
+
472
+ super().__init__(
473
+ real_endpoint, session_id, odps_entry=odps_entry, timeout=timeout
474
+ )
475
+
476
+ @classmethod
477
+ def _create_caller(cls, odps_entry: ODPS, address: str, **kwargs):
478
+ return MaxFrameRestCaller(FrameDriverClient(address))
479
+
480
+
481
+ def register_session_schemes(overwrite: bool = False):
482
+ MaxFrameRestSession.register_schemes(overwrite=overwrite)