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,467 @@
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 logging
16
+ from collections import deque
17
+ from io import StringIO
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ cdef class DirectedGraph:
23
+ cdef readonly:
24
+ dict _nodes
25
+ dict _predecessors
26
+ dict _successors
27
+
28
+ def __init__(self):
29
+ self._nodes = dict()
30
+ self._predecessors = dict()
31
+ self._successors = dict()
32
+
33
+ def __iter__(self):
34
+ return iter(self._nodes)
35
+
36
+ def __contains__(self, n):
37
+ return n in self._nodes
38
+
39
+ def __len__(self):
40
+ return len(self._nodes)
41
+
42
+ def __getitem__(self, n):
43
+ return self._successors[n]
44
+
45
+ def contains(self, node):
46
+ return node in self._nodes
47
+
48
+ def add_node(self, node, node_attr=None, **node_attrs):
49
+ if node_attr is None:
50
+ node_attr = node_attrs
51
+ else:
52
+ try:
53
+ node_attr.update(node_attrs)
54
+ except AttributeError:
55
+ raise TypeError('The node_attr argument must be a dictionary')
56
+ self._add_node(node, node_attr)
57
+
58
+ cdef inline _add_node(self, node, dict node_attr=None):
59
+ if node_attr is None:
60
+ node_attr = dict()
61
+ if node not in self._nodes:
62
+ self._nodes[node] = node_attr
63
+ self._successors[node] = dict()
64
+ self._predecessors[node] = dict()
65
+ else:
66
+ self._nodes[node].update(node_attr)
67
+
68
+ def remove_node(self, node):
69
+ if node not in self._nodes:
70
+ raise KeyError(f'Node {node} does not exist '
71
+ f'in the directed graph')
72
+
73
+ del self._nodes[node]
74
+
75
+ for succ in self._successors[node]:
76
+ del self._predecessors[succ][node]
77
+ del self._successors[node]
78
+
79
+ for pred in self._predecessors[node]:
80
+ del self._successors[pred][node]
81
+ del self._predecessors[node]
82
+
83
+ def add_edge(self, u, v, edge_attr=None, **edge_attrs):
84
+ if edge_attr is None:
85
+ edge_attr = edge_attrs
86
+ else:
87
+ try:
88
+ edge_attr.update(edge_attrs)
89
+ except AttributeError:
90
+ raise TypeError('The edge_attr argument must be a dictionary')
91
+ self._add_edge(u, v, edge_attr)
92
+
93
+ cdef inline _add_edge(self, u, v, edge_attr=None):
94
+ cdef:
95
+ dict u_succ, v_pred
96
+
97
+ if u not in self._nodes:
98
+ raise KeyError(f'Node {u} does not exist in the directed graph')
99
+ if v not in self._nodes:
100
+ raise KeyError(f'Node {v} does not exist in the directed graph')
101
+
102
+ if edge_attr is None:
103
+ edge_attr = dict()
104
+
105
+ u_succ = self._successors[u]
106
+ if v in u_succ:
107
+ u_succ[v].update(edge_attr)
108
+ else:
109
+ u_succ[v] = edge_attr
110
+
111
+ v_pred = self._predecessors[v]
112
+ if u not in v_pred:
113
+ # `update` is not necessary, as they point to the same object
114
+ v_pred[u] = edge_attr
115
+
116
+ def remove_edge(self, u, v):
117
+ try:
118
+ del self._successors[u][v]
119
+ del self._predecessors[v][u]
120
+ except KeyError:
121
+ raise KeyError(f'Edge {u}->{v} does not exist in the directed graph')
122
+
123
+ def has_successor(self, u, v):
124
+ return (u in self._successors) and (v in self._successors[u])
125
+
126
+ def has_predecessor(self, u, v):
127
+ return (u in self._predecessors) and (v in self._predecessors[u])
128
+
129
+ def iter_nodes(self, data=False):
130
+ if data:
131
+ return iter(self._nodes.items())
132
+ return iter(self._nodes)
133
+
134
+ def iter_successors(self, n):
135
+ try:
136
+ return iter(self._successors[n])
137
+ except KeyError:
138
+ raise KeyError(f'Node {n} does not exist in the directed graph')
139
+
140
+ cpdef list successors(self, n):
141
+ try:
142
+ return list(self._successors[n])
143
+ except KeyError:
144
+ raise KeyError(f'Node {n} does not exist in the directed graph')
145
+
146
+ def iter_predecessors(self, n):
147
+ try:
148
+ return iter(self._predecessors[n])
149
+ except KeyError:
150
+ raise KeyError(f'Node {n} does not exist in the directed graph')
151
+
152
+ cpdef list predecessors(self, n):
153
+ try:
154
+ return list(self._predecessors[n])
155
+ except KeyError:
156
+ raise KeyError(f'Node {n} does not exist in the directed graph')
157
+
158
+ cpdef int count_successors(self, n):
159
+ return len(self._successors[n])
160
+
161
+ cpdef int count_predecessors(self, n):
162
+ return len(self._predecessors[n])
163
+
164
+ def iter_indep(self, bint reverse=False):
165
+ cdef dict preds
166
+ preds = self._predecessors if not reverse else self._successors
167
+ for n, p in preds.items():
168
+ if len(p) == 0:
169
+ yield n
170
+
171
+ cpdef int count_indep(self, reverse=False):
172
+ cdef:
173
+ dict preds
174
+ int result = 0
175
+ preds = self._predecessors if not reverse else self._successors
176
+ for n, p in preds.items():
177
+ if len(p) == 0:
178
+ result += 1
179
+ return result
180
+
181
+ def dfs(self, start=None, visit_predicate=None, successors=None, reverse=False):
182
+ cdef:
183
+ set visited = set()
184
+ list stack
185
+ bint visit_all = False
186
+
187
+ if reverse:
188
+ pred_fun, succ_fun = self.successors, self.predecessors
189
+ else:
190
+ pred_fun, succ_fun = self.predecessors, self.successors
191
+
192
+ if start:
193
+ if not isinstance(start, (list, tuple)):
194
+ start = [start]
195
+ stack = list(start)
196
+ else:
197
+ stack = list(self.iter_indep(reverse=reverse))
198
+
199
+ def _default_visit_predicate(n, visited):
200
+ cdef list preds
201
+ preds = pred_fun(n)
202
+ return not preds or all(pred in visited for pred in preds)
203
+
204
+ successors = successors or succ_fun
205
+ visit_all = (visit_predicate == 'all')
206
+ visit_predicate = visit_predicate or _default_visit_predicate
207
+
208
+ while stack:
209
+ node = stack.pop()
210
+ if node in visited:
211
+ continue
212
+ preds = self.predecessors(node)
213
+ if visit_all or visit_predicate(node, visited):
214
+ yield node
215
+ visited.add(node)
216
+ stack.extend(n for n in successors(node) if n not in visited)
217
+ else:
218
+ stack.append(node)
219
+ stack.extend(n for n in preds if n not in visited)
220
+
221
+ def bfs(self, start=None, visit_predicate=None, successors=None, reverse=False):
222
+ cdef:
223
+ object queue
224
+ object node
225
+ set visited = set()
226
+ bint visit_all = False
227
+
228
+ if reverse:
229
+ pred_fun, succ_fun = self.successors, self.predecessors
230
+ else:
231
+ pred_fun, succ_fun = self.predecessors, self.successors
232
+
233
+ if start is not None:
234
+ if not isinstance(start, (list, tuple)):
235
+ start = [start]
236
+ queue = deque(start)
237
+ else:
238
+ queue = deque(self.iter_indep(reverse=reverse))
239
+
240
+ def _default_visit_predicate(n, visited):
241
+ preds = pred_fun(n)
242
+ return not preds or all(pred in visited for pred in preds)
243
+
244
+ successors = successors or succ_fun
245
+ visit_all = (visit_predicate == 'all')
246
+ visit_predicate = visit_predicate or _default_visit_predicate
247
+
248
+ while queue:
249
+ node = queue.popleft()
250
+ if node in visited:
251
+ continue
252
+ preds = pred_fun(node)
253
+ if visit_all or visit_predicate(node, visited):
254
+ yield node
255
+ visited.add(node)
256
+ queue.extend(n for n in successors(node) if n not in visited)
257
+ else:
258
+ queue.append(node)
259
+ queue.extend(n for n in preds if n not in visited)
260
+
261
+ def copy(self):
262
+ cdef DirectedGraph graph = type(self)()
263
+ for n in self:
264
+ if n not in graph._nodes:
265
+ graph._add_node(n)
266
+ for succ in self.iter_successors(n):
267
+ if succ not in graph._nodes:
268
+ graph._add_node(succ)
269
+ graph._add_edge(n, succ)
270
+ return graph
271
+
272
+ def copyto(self, DirectedGraph other_graph):
273
+ if other_graph is self:
274
+ return
275
+
276
+ other_graph._nodes = self._nodes.copy()
277
+ other_graph._predecessors = self._predecessors.copy()
278
+ other_graph._successors = self._successors.copy()
279
+
280
+ def build_undirected(self):
281
+ cdef DirectedGraph graph = DirectedGraph()
282
+ for n in self:
283
+ if n not in graph._nodes:
284
+ graph._add_node(n)
285
+ for succ in self._successors[n]:
286
+ if succ not in graph._nodes:
287
+ graph._add_node(succ)
288
+ graph._add_edge(n, succ)
289
+ graph._add_edge(succ, n)
290
+ return graph
291
+
292
+ def build_reversed(self):
293
+ cdef DirectedGraph graph = type(self)()
294
+ for n in self:
295
+ if n not in graph._nodes:
296
+ graph._add_node(n)
297
+ for succ in self._successors[n]:
298
+ if succ not in graph._nodes:
299
+ graph._add_node(succ)
300
+ graph._add_edge(succ, n)
301
+ return graph
302
+
303
+ @classmethod
304
+ def _repr_in_dot(cls, val):
305
+ if isinstance(val, bool):
306
+ return 'true' if val else 'false'
307
+ if isinstance(val, str):
308
+ return f'"{val}"'
309
+ return val
310
+
311
+ def _extract_operators(self, node):
312
+ return [node.op]
313
+
314
+ def to_dot(
315
+ self,
316
+ graph_attrs=None,
317
+ node_attrs=None,
318
+ trunc_key=5, result_chunk_keys=None, show_columns=False):
319
+
320
+ sio = StringIO()
321
+ sio.write('digraph {\n')
322
+ sio.write('splines=curved\n')
323
+ sio.write('rankdir=BT\n')
324
+
325
+ if graph_attrs:
326
+ sio.write('graph [{0}];\n'.format(
327
+ ' '.join(f'{k}={self._repr_in_dot(v)}' for k, v in graph_attrs.items())))
328
+ if node_attrs:
329
+ sio.write('node [{0}];\n'.format(
330
+ ' '.join(f'{k}={self._repr_in_dot(v)}' for k, v in node_attrs.items())))
331
+
332
+ chunk_style = '[shape=box]'
333
+ operator_style = '[shape=circle]'
334
+
335
+ visited = set()
336
+
337
+ def get_col_names(obj):
338
+ if hasattr(obj, "dtypes"):
339
+ return f"\"{','.join(list(obj.dtypes.index))}\""
340
+ elif hasattr(obj, "name"):
341
+ return f"\"{obj.name}\""
342
+ else:
343
+ return "\"N/A\""
344
+
345
+ for node in self.iter_nodes():
346
+ for op in self._extract_operators(node):
347
+ op_name = type(op).__name__
348
+ if op.stage is not None:
349
+ op_name = f'{op_name}:{op.stage.name}'
350
+ if op.key in visited:
351
+ continue
352
+ for input_chunk in (op.inputs or []):
353
+ if input_chunk.key not in visited:
354
+ sio.write(f'"Chunk:{self._gen_chunk_key(input_chunk, trunc_key)}" {chunk_style}\n')
355
+ visited.add(input_chunk.key)
356
+ if op.key not in visited:
357
+ sio.write(f'"{op_name}:{op.key[:trunc_key]}" {operator_style}\n')
358
+ visited.add(op.key)
359
+ sio.write(f'"Chunk:{self._gen_chunk_key(input_chunk, trunc_key)}" -> '
360
+ f'"{op_name}:{op.key[:trunc_key]}"\n')
361
+
362
+ for output_chunk in (op.outputs or []):
363
+ if output_chunk.key not in visited:
364
+ tmp_chunk_style = chunk_style
365
+ if result_chunk_keys and output_chunk.key in result_chunk_keys:
366
+ tmp_chunk_style = '[shape=box,style=filled,fillcolor=cadetblue1]'
367
+ sio.write(f'"Chunk:{self._gen_chunk_key(output_chunk, trunc_key)}" {tmp_chunk_style}\n')
368
+ visited.add(output_chunk.key)
369
+ if op.key not in visited:
370
+ sio.write(f'"{op_name}:{op.key[:trunc_key]}" {operator_style}\n')
371
+ visited.add(op.key)
372
+ sio.write(f'"{op_name}:{op.key[:trunc_key]}" -> '
373
+ f'"Chunk:{self._gen_chunk_key(output_chunk, trunc_key)}"')
374
+ if show_columns:
375
+ sio.write(f' [ label={get_col_names(output_chunk)} ]')
376
+ sio.write("\n")
377
+
378
+ sio.write('}')
379
+ return sio.getvalue()
380
+
381
+ @classmethod
382
+ def _gen_chunk_key(cls, chunk, trunc_key):
383
+ if "_" in chunk.key:
384
+ key, index = chunk.key.split("_", 1)
385
+ return "_".join([key[:trunc_key], index])
386
+ else: # pragma: no cover
387
+ return chunk.key[:trunc_key]
388
+
389
+ def _repr_svg_(self): # pragma: no cover
390
+ from graphviz import Source
391
+ return Source(self.to_dot())._repr_svg_()
392
+
393
+ def _repr_mimebundle_(self, *args, **kw): # pragma: no cover
394
+ from graphviz import Source
395
+ return Source(self.to_dot())._repr_mimebundle_(*args, **kw)
396
+
397
+ def compose(self, list keys=None):
398
+ from ...optimizes.chunk_graph.fuse import Fusion
399
+
400
+ return Fusion(self).compose(keys=keys)
401
+
402
+ def decompose(self, nodes=None):
403
+ from ...optimizes.chunk_graph.fuse import Fusion
404
+
405
+ Fusion(self).decompose(nodes=nodes)
406
+
407
+ def view(self, filename='default', graph_attrs=None, trunc_key=5, node_attrs=None, result_chunk_keys=None, show_columns=False): # pragma: no cover
408
+ from graphviz import Source
409
+
410
+ g = Source(self.to_dot(graph_attrs, node_attrs, trunc_key=trunc_key, result_chunk_keys=result_chunk_keys, show_columns=show_columns))
411
+ g.view(filename=filename, cleanup=True)
412
+
413
+ def to_dag(self):
414
+ dag = DAG()
415
+ dag._nodes = self._nodes.copy()
416
+ dag._predecessors = self._predecessors.copy()
417
+ dag._successors = self._successors.copy()
418
+ return dag
419
+
420
+
421
+ class GraphContainsCycleError(Exception):
422
+ pass
423
+
424
+
425
+ cdef class DAG(DirectedGraph):
426
+ def to_dag(self):
427
+ return self
428
+
429
+ def topological_iter(self, succ_checker=None, reverse=False):
430
+ cdef:
431
+ dict preds, succs
432
+ set visited = set()
433
+ list stack
434
+
435
+ if len(self) == 0:
436
+ return
437
+
438
+ if reverse:
439
+ preds, succs = self._successors, self._predecessors
440
+ else:
441
+ preds, succs = self._predecessors, self._successors
442
+
443
+ # copy predecessors and successors
444
+ succs = dict((k, set(v)) for k, v in succs.items())
445
+ preds = dict((k, set(v)) for k, v in preds.items())
446
+
447
+ def _default_succ_checker(_, predecessors):
448
+ return len(predecessors) == 0
449
+
450
+ succ_checker = succ_checker or _default_succ_checker
451
+
452
+ stack = list((p for p, l in preds.items() if len(l) == 0))
453
+ if not stack:
454
+ raise GraphContainsCycleError
455
+ while stack:
456
+ node = stack.pop()
457
+ yield node
458
+ visited.add(node)
459
+ for succ in succs.get(node, {}):
460
+ if succ in visited:
461
+ raise GraphContainsCycleError
462
+ succ_preds = preds[succ]
463
+ succ_preds.remove(node)
464
+ if succ_checker(succ, succ_preds):
465
+ stack.append(succ)
466
+ if len(visited) != len(self):
467
+ raise GraphContainsCycleError
@@ -0,0 +1,171 @@
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
+ from abc import ABCMeta, abstractmethod
16
+ from typing import Dict, Iterable, List, Union
17
+
18
+ from ...core import Chunk, Tileable
19
+ from ...serialization.core import buffered
20
+ from ...serialization.serializables import BoolField, DictField, ListField, Serializable
21
+ from ...serialization.serializables.core import SerializableSerializer
22
+ from ...utils import tokenize
23
+ from .core import DAG
24
+
25
+
26
+ class EntityGraph(DAG, metaclass=ABCMeta):
27
+ @property
28
+ @abstractmethod
29
+ def results(self):
30
+ """
31
+ Return result tileables or chunks.
32
+
33
+ Returns
34
+ -------
35
+ results
36
+ """
37
+
38
+ @results.setter
39
+ @abstractmethod
40
+ def results(self, new_results):
41
+ """
42
+ Set result tileables or chunks.
43
+
44
+ Parameters
45
+ ----------
46
+ new_results
47
+
48
+ Returns
49
+ -------
50
+
51
+ """
52
+
53
+ def copy(self) -> "EntityGraph":
54
+ graph = super().copy()
55
+ graph.results = self.results.copy()
56
+ return graph
57
+
58
+
59
+ class TileableGraph(EntityGraph, Iterable[Tileable]):
60
+ _result_tileables: List[Tileable]
61
+ # logic key is a unique and deterministic key for `TileableGraph`. For
62
+ # multiple runs the logic key will remain same if the computational logic
63
+ # doesn't change. And it can be used to some optimization when running a
64
+ # same `execute`, like HBO.
65
+ _logic_key: str
66
+
67
+ def __init__(self, result_tileables: List[Tileable] = None):
68
+ super().__init__()
69
+ self._result_tileables = result_tileables
70
+
71
+ @property
72
+ def result_tileables(self):
73
+ return self._result_tileables
74
+
75
+ @property
76
+ def results(self):
77
+ return self._result_tileables
78
+
79
+ @results.setter
80
+ def results(self, new_results):
81
+ self._result_tileables = new_results
82
+
83
+ @property
84
+ def logic_key(self):
85
+ if not hasattr(self, "_logic_key") or self._logic_key is None:
86
+ token_keys = []
87
+ for node in self.bfs():
88
+ logic_key = node.op.get_logic_key()
89
+ if hasattr(node.op, "logic_key") and node.op.logic_key is None:
90
+ node.op.logic_key = logic_key
91
+ token_keys.append(
92
+ tokenize(logic_key, **node.extra_params)
93
+ if node.extra_params
94
+ else logic_key
95
+ )
96
+ self._logic_key = tokenize(*token_keys)
97
+ return self._logic_key
98
+
99
+
100
+ class ChunkGraph(EntityGraph, Iterable[Chunk]):
101
+ _result_chunks: List[Chunk]
102
+
103
+ def __init__(self, result_chunks: List[Chunk] = None):
104
+ super().__init__()
105
+ self._result_chunks = result_chunks
106
+
107
+ @property
108
+ def result_chunks(self):
109
+ return self._result_chunks
110
+
111
+ @property
112
+ def results(self):
113
+ return self._result_chunks
114
+
115
+ @results.setter
116
+ def results(self, new_results):
117
+ self._result_chunks = new_results
118
+
119
+
120
+ class SerializableGraph(Serializable):
121
+ _is_chunk = BoolField("is_chunk")
122
+ # TODO(qinxuye): remove this logic when we handle fetch elegantly,
123
+ # now, the node in the graph and inputs for operator may be inconsistent,
124
+ # for example, an operator's inputs may be chunks,
125
+ # but in the graph, the predecessors are all fetch chunks,
126
+ # we serialize the fetch chunks first to make sure when operator's inputs
127
+ # are serialized, they will just be marked as serialized and skip serialization.
128
+ _fetch_nodes = ListField("fetch_nodes")
129
+ _nodes = DictField("nodes")
130
+ _predecessors = DictField("predecessors")
131
+ _successors = DictField("successors")
132
+ _results = ListField("results")
133
+
134
+ @classmethod
135
+ def from_graph(cls, graph: Union[TileableGraph, ChunkGraph]) -> "SerializableGraph":
136
+ from ..operator import Fetch
137
+
138
+ is_chunk = isinstance(graph, ChunkGraph)
139
+ return SerializableGraph(
140
+ _is_chunk=is_chunk,
141
+ _fetch_nodes=[chunk for chunk in graph if isinstance(chunk.op, Fetch)],
142
+ _nodes=graph._nodes,
143
+ _predecessors=graph._predecessors,
144
+ _successors=graph._successors,
145
+ _results=graph.results,
146
+ )
147
+
148
+ def to_graph(self) -> Union[TileableGraph, ChunkGraph]:
149
+ graph_cls = ChunkGraph if self._is_chunk else TileableGraph
150
+ graph = graph_cls(self._results)
151
+ graph._nodes.update(self._nodes)
152
+ graph._predecessors.update(self._predecessors)
153
+ graph._successors.update(self._successors)
154
+ return graph
155
+
156
+
157
+ class GraphSerializer(SerializableSerializer):
158
+ @buffered
159
+ def serial(self, obj: Union[TileableGraph, ChunkGraph], context: Dict):
160
+ serializable_graph = SerializableGraph.from_graph(obj)
161
+ return [], [serializable_graph], False
162
+
163
+ def deserial(
164
+ self, serialized: List, context: Dict, subs: List
165
+ ) -> Union[TileableGraph, ChunkGraph]:
166
+ serializable_graph: SerializableGraph = subs[0]
167
+ return serializable_graph.to_graph()
168
+
169
+
170
+ GraphSerializer.register(EntityGraph)
171
+ SerializableSerializer.register(SerializableGraph)
@@ -0,0 +1,13 @@
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.