maxframe 0.1.0b5__cp310-cp310-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-310-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-310-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-310-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-310-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 +3 -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,250 @@
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 collections import namedtuple
16
+ from datetime import timezone
17
+
18
+ import numpy as np
19
+ import pandas as pd
20
+ import pytest
21
+
22
+ from ....core import EntityData
23
+ from ....lib.wrapped_pickle import switch_unpickle
24
+ from ... import deserialize, serialize
25
+ from .. import (
26
+ AnyField,
27
+ BoolField,
28
+ BytesField,
29
+ Complex64Field,
30
+ Complex128Field,
31
+ DataFrameField,
32
+ DataTypeField,
33
+ Datetime64Field,
34
+ DictField,
35
+ FieldTypes,
36
+ Float16Field,
37
+ Float32Field,
38
+ Float64Field,
39
+ FunctionField,
40
+ IdentityField,
41
+ IndexField,
42
+ Int8Field,
43
+ Int16Field,
44
+ Int32Field,
45
+ Int64Field,
46
+ IntervalArrayField,
47
+ KeyField,
48
+ ListField,
49
+ NamedTupleField,
50
+ NDArrayField,
51
+ OneOfField,
52
+ ReferenceField,
53
+ Serializable,
54
+ SeriesField,
55
+ SliceField,
56
+ StringField,
57
+ Timedelta64Field,
58
+ TupleField,
59
+ TZInfoField,
60
+ UInt8Field,
61
+ UInt16Field,
62
+ UInt32Field,
63
+ UInt64Field,
64
+ )
65
+
66
+ my_namedtuple = namedtuple("my_namedtuple", "a, b")
67
+
68
+
69
+ @pytest.fixture
70
+ def set_is_ci(request):
71
+ from .. import field
72
+
73
+ old_is_ci = field._is_ci
74
+ try:
75
+ field._is_ci = request.param
76
+ yield
77
+ finally:
78
+ field._is_ci = old_is_ci
79
+
80
+
81
+ class MyHasKey(EntityData):
82
+ def __init__(self, key=None, **kw):
83
+ super().__init__(_key=key, **kw)
84
+ self._id = "1"
85
+
86
+ def __eq__(self, other):
87
+ return isinstance(other, MyHasKey) and other._key == self._key
88
+
89
+
90
+ class MySimpleSerializable(Serializable):
91
+ _id = IdentityField("id")
92
+ _int_val = Int64Field("int_val", default=1000)
93
+ _list_val = ListField("list_val", default_factory=list)
94
+ _ref_val = ReferenceField("ref_val", "MySimpleSerializable")
95
+
96
+
97
+ class MySerializable(Serializable):
98
+ _id = IdentityField("id")
99
+ _any_val = AnyField("any_val")
100
+ _bool_val = BoolField("bool_val")
101
+ _int8_val = Int8Field("int8_val")
102
+ _int16_val = Int16Field("int16_val")
103
+ _int32_val = Int32Field("int32_val")
104
+ _int64_val = Int64Field("int64_val")
105
+ _uint8_val = UInt8Field("uint8_val")
106
+ _uint16_val = UInt16Field("uint16_val")
107
+ _uint32_val = UInt32Field("uint32_val")
108
+ _uint64_val = UInt64Field("uint64_val")
109
+ _float16_val = Float16Field("float16_val")
110
+ _float32_val = Float32Field(
111
+ "float32_val", on_serialize=lambda x: x + 1, on_deserialize=lambda x: x - 1
112
+ )
113
+ _float64_val = Float64Field("float64_val")
114
+ _complex64_val = Complex64Field("complex64_val")
115
+ _complex128_val = Complex128Field("complex128_val")
116
+ _string_val = StringField("string_val")
117
+ _bytes_val = BytesField("bytes_val")
118
+ _key_val = KeyField("key_val")
119
+ _ndarray_val = NDArrayField("ndarray_val")
120
+ _datetime64_val = Datetime64Field("datetime64_val")
121
+ _timedelta64_val = Timedelta64Field("timedelta64_val")
122
+ _datatype_val = DataTypeField("datatype_val")
123
+ _index_val = IndexField("index_val")
124
+ _series_val = SeriesField("series_val")
125
+ _dataframe_val = DataFrameField("dataframe_val")
126
+ _interval_array_val = IntervalArrayField("interval_array_val")
127
+ _slice_val = SliceField("slice_val")
128
+ _function_val = FunctionField("function_val")
129
+ _named_tuple_val = NamedTupleField("named_tuple_val")
130
+ _tzinfo_val = TZInfoField("tzinfo_val")
131
+ _list_val = ListField("list_val", FieldTypes.int64)
132
+ _tuple_val = TupleField("tuple_val", FieldTypes.string)
133
+ _dict_val = DictField("dict_val", FieldTypes.string, FieldTypes.bytes)
134
+ _ref_val = ReferenceField("ref_val", "self")
135
+ _ref_val2 = ReferenceField("ref_val2", MySimpleSerializable)
136
+ _oneof_val = OneOfField(
137
+ "ref_val",
138
+ oneof1_val=f"{__name__}.MySerializable",
139
+ oneof2_val=MySimpleSerializable,
140
+ )
141
+
142
+
143
+ @pytest.mark.parametrize("set_is_ci", [False, True], indirect=True)
144
+ @switch_unpickle
145
+ def test_serializable(set_is_ci):
146
+ my_serializable = MySerializable(
147
+ _id="1",
148
+ _any_val="any_value",
149
+ _bool_val=True,
150
+ _int8_val=-8,
151
+ _int16_val=np.int16(-16),
152
+ _int32_val=-32,
153
+ _int64_val=-64,
154
+ _uint8_val=8,
155
+ _uint16_val=16,
156
+ _uint32_val=np.uint32(32),
157
+ _uint64_val=64,
158
+ _float16_val=1.0,
159
+ _float32_val=np.float32(2.0),
160
+ _float64_val=2.0,
161
+ _complex64_val=np.complex64(1 + 2j),
162
+ _complex128_val=1 + 2j,
163
+ _string_val="string_value",
164
+ _bytes_val=b"bytes_value",
165
+ _key_val=MyHasKey("aaa"),
166
+ _ndarray_val=np.random.rand(4, 3),
167
+ _datetime64_val=pd.Timestamp(123),
168
+ _timedelta64_val=pd.Timedelta(days=1),
169
+ _datatype_val=np.dtype(np.int32),
170
+ _index_val=pd.Index([1, 2]),
171
+ _series_val=pd.Series(["a", "b"]),
172
+ _dataframe_val=pd.DataFrame({"a": [1, 2, 3]}),
173
+ _interval_array_val=pd.arrays.IntervalArray([]),
174
+ _slice_val=slice(1, 10, 2),
175
+ _function_val=lambda x: x + 1,
176
+ _named_tuple_val=my_namedtuple(a=1, b=2),
177
+ _tzinfo_val=timezone.utc,
178
+ _list_val=[1, 2],
179
+ _tuple_val=("a", "b"),
180
+ _dict_val={"a": b"bytes_value"},
181
+ _ref_val=MySerializable(),
182
+ _oneof_val=MySerializable(_id="2"),
183
+ )
184
+
185
+ header, buffers = serialize(my_serializable)
186
+ my_serializable2 = deserialize(header, buffers)
187
+ _assert_serializable_eq(my_serializable, my_serializable2)
188
+
189
+
190
+ def _assert_serializable_eq(my_serializable, my_serializable2):
191
+ for field_name, field in my_serializable._FIELDS.items():
192
+ if not hasattr(my_serializable, field.tag):
193
+ continue
194
+ expect_value = getattr(my_serializable, field_name)
195
+ actual_value = getattr(my_serializable2, field_name)
196
+ if isinstance(expect_value, np.ndarray):
197
+ np.testing.assert_array_equal(expect_value, actual_value)
198
+ elif isinstance(expect_value, pd.DataFrame):
199
+ pd.testing.assert_frame_equal(expect_value, actual_value)
200
+ elif isinstance(expect_value, pd.Series):
201
+ pd.testing.assert_series_equal(expect_value, actual_value)
202
+ elif isinstance(expect_value, pd.Index):
203
+ pd.testing.assert_index_equal(expect_value, actual_value)
204
+ elif isinstance(expect_value, pd.api.extensions.ExtensionArray):
205
+ pd.testing.assert_extension_array_equal(expect_value, actual_value)
206
+ elif isinstance(expect_value, (MySimpleSerializable, MySerializable)):
207
+ _assert_serializable_eq(expect_value, actual_value)
208
+ elif callable(expect_value):
209
+ assert expect_value(1) == actual_value(1)
210
+ else:
211
+ assert expect_value == actual_value
212
+
213
+
214
+ @pytest.mark.parametrize("set_is_ci", [True], indirect=True)
215
+ def test_fields_errors(set_is_ci):
216
+ my_simple = MySimpleSerializable(_id="1", _ref_val=MySimpleSerializable(_id="2"))
217
+ my_serializeble = MySerializable(_oneof_val=my_simple)
218
+
219
+ with pytest.raises(TypeError) as exc_info:
220
+ my_simple._int_val = "10"
221
+ assert "_int_val" in str(exc_info.value)
222
+
223
+ del my_simple._ref_val
224
+ with pytest.raises(AttributeError):
225
+ _ = my_simple._ref_val
226
+
227
+ del my_simple._id
228
+ with pytest.raises(AttributeError):
229
+ _ = my_simple._id
230
+
231
+ assert my_simple._int_val == 1000
232
+ assert my_simple._list_val == []
233
+
234
+ del my_serializeble._oneof_val
235
+ with pytest.raises(AttributeError):
236
+ _ = my_serializeble._oneof_val
237
+
238
+ my_serializeble._ref_val2 = MySimpleSerializable(_id="3")
239
+ del my_serializeble._ref_val2
240
+ with pytest.raises(AttributeError):
241
+ _ = my_serializeble._ref_val2
242
+
243
+ with pytest.raises(TypeError):
244
+ my_serializeble._ref_val = my_simple
245
+
246
+ with pytest.raises(TypeError):
247
+ my_serializeble._oneof_val = 1
248
+
249
+ with pytest.raises(AttributeError):
250
+ del my_serializeble._oneof_val
@@ -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.
@@ -0,0 +1,412 @@
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 datetime
16
+ import re
17
+ import threading
18
+ from collections import OrderedDict, defaultdict
19
+ from typing import Any, Dict, List, NamedTuple
20
+
21
+ import numpy as np
22
+ import pandas as pd
23
+ import pytest
24
+
25
+ try:
26
+ import pyarrow as pa
27
+ except ImportError:
28
+ pa = None
29
+ try:
30
+ import scipy.sparse as sps
31
+ except ImportError:
32
+ sps = None
33
+ try:
34
+ import pytz
35
+ except ImportError:
36
+ pytz = None
37
+ try:
38
+ import zoneinfo
39
+ except ImportError:
40
+ zoneinfo = None
41
+
42
+ from ...lib.sparse import SparseMatrix
43
+ from ...lib.wrapped_pickle import switch_unpickle
44
+ from ...tests.utils import require_cudf, require_cupy
45
+ from ...utils import lazy_import
46
+ from .. import (
47
+ PickleContainer,
48
+ RemoteException,
49
+ deserialize,
50
+ serialize,
51
+ serialize_with_spawn,
52
+ )
53
+ from ..core import ListSerializer, Placeholder
54
+
55
+ cupy = lazy_import("cupy")
56
+ cudf = lazy_import("cudf")
57
+
58
+
59
+ class CustomList(list):
60
+ pass
61
+
62
+
63
+ class CustomNamedTuple(NamedTuple):
64
+ name: str
65
+ idx: int
66
+
67
+
68
+ @pytest.mark.parametrize(
69
+ "val",
70
+ [
71
+ None,
72
+ False,
73
+ 123,
74
+ 3.567,
75
+ 3.5 + 4.3j,
76
+ b"abcd",
77
+ "abcd",
78
+ slice(3, 9, 2),
79
+ ["uvw", ("mno", "sdaf"), 4, 6.7],
80
+ CustomNamedTuple("abcd", 13451),
81
+ datetime.datetime.now(),
82
+ datetime.datetime.now().astimezone(datetime.timezone.utc),
83
+ datetime.date.today(),
84
+ datetime.timedelta(1000, 10, 100, 10),
85
+ re.compile(r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", re.M | re.DOTALL),
86
+ np.dtype(int),
87
+ pd.StringDtype(),
88
+ pd.Timestamp("2023-10-12 11:22:54.134561231"),
89
+ pd.Timestamp("2023-10-12 11:22:54.134561231", tzinfo=datetime.timezone.utc),
90
+ pd.Timedelta(102.234154131),
91
+ {"abc": 5.6, "def": [3.4], "gh": None, "ijk": {}},
92
+ OrderedDict([("abcd", 5.6)]),
93
+ ],
94
+ )
95
+ @switch_unpickle
96
+ def test_core(val):
97
+ deserialized = deserialize(*serialize(val))
98
+ assert type(val) == type(deserialized)
99
+ assert val == deserialized
100
+
101
+
102
+ @switch_unpickle
103
+ def test_strings():
104
+ str_obj = "abcd" * 1024
105
+ obj = [str_obj, str_obj]
106
+ header, bufs = serialize(obj)
107
+ assert len(header) < len(str_obj) * 2
108
+ bufs = [memoryview(buf) for buf in bufs]
109
+ assert obj == deserialize(header, bufs)
110
+
111
+
112
+ @switch_unpickle
113
+ def test_placeholder_obj():
114
+ assert Placeholder(1024) == Placeholder(1024)
115
+ assert hash(Placeholder(1024)) == hash(Placeholder(1024))
116
+ assert Placeholder(1024) != Placeholder(1023)
117
+ assert hash(Placeholder(1024)) != hash(Placeholder(1023))
118
+ assert Placeholder(1024) != 1024
119
+ assert "1024" in repr(Placeholder(1024))
120
+
121
+
122
+ @switch_unpickle
123
+ def test_nested_list():
124
+ val = [b"a" * 1200] * 10
125
+ val[0] = val
126
+ deserialized = deserialize(*serialize(val))
127
+ assert deserialized[0] is deserialized
128
+ assert val[1:] == deserialized[1:]
129
+
130
+
131
+ @switch_unpickle
132
+ def test_nested_dict():
133
+ val = {i: "b" * 100 for i in range(10)}
134
+ val[0] = val
135
+ deserialized = deserialize(*serialize(val))
136
+ assert deserialized[0] is deserialized
137
+
138
+
139
+ @pytest.mark.parametrize(
140
+ "val",
141
+ [
142
+ pytz.timezone("Europe/Berlin") if pytz else None,
143
+ zoneinfo.ZoneInfo("America/New_York") if zoneinfo else None,
144
+ datetime.timezone(datetime.timedelta(hours=7)),
145
+ datetime.timezone(datetime.timedelta(hours=6), name="UTC+6"),
146
+ datetime.timezone.utc,
147
+ ],
148
+ )
149
+ @switch_unpickle
150
+ def test_timezones(val):
151
+ if val is None:
152
+ pytest.skip("Skip due to lack of library")
153
+ deserialized = deserialize(*serialize(val))
154
+ assert type(val) == type(deserialized)
155
+ assert val == deserialized
156
+
157
+
158
+ @pytest.mark.parametrize(
159
+ "val",
160
+ [
161
+ np.array([1024])[0],
162
+ np.array(np.random.rand(100, 100)),
163
+ np.array(np.random.rand(100, 100).T),
164
+ np.array(["a", "bcd", None]),
165
+ ],
166
+ )
167
+ @switch_unpickle
168
+ def test_numpy(val):
169
+ deserialized = deserialize(*serialize(val))
170
+ assert type(val) == type(deserialized)
171
+ np.testing.assert_equal(val, deserialized)
172
+ if val.flags.f_contiguous:
173
+ assert deserialized.flags.f_contiguous
174
+
175
+
176
+ @switch_unpickle
177
+ def test_pandas():
178
+ val = pd.Series([1, 2, 3, 4], name="nm")
179
+ pd.testing.assert_series_equal(val, deserialize(*serialize(val)))
180
+
181
+ val = pd.DataFrame(
182
+ {
183
+ "float_col": np.random.rand(1000),
184
+ "str_col": np.random.choice(list("abcd"), size=(1000,)),
185
+ "int_col": np.random.randint(0, 100, size=(1000,)),
186
+ "str_array_col": pd.array(np.random.choice(list("abcd"), size=(1000,))),
187
+ "cat_col": pd.Categorical(np.random.choice(list("abcd"), size=(1000,))),
188
+ }
189
+ )
190
+ if pa is not None and hasattr(pd, "ArrowDtype"):
191
+ val["arrow_col"] = pd.Series(
192
+ np.random.rand(1000), dtype=pd.ArrowDtype(pa.float64())
193
+ )
194
+ pd.testing.assert_frame_equal(val, deserialize(*serialize(val)))
195
+
196
+ val = pd.MultiIndex.from_arrays(
197
+ [(1, 5, 4, 9, 6), list("BADCE")], names=["C1", "C2"]
198
+ )
199
+ pd.testing.assert_index_equal(val, deserialize(*serialize(val)))
200
+
201
+ val = pd.CategoricalIndex(np.random.choice(list("abcd"), size=(1000,)))
202
+ pd.testing.assert_index_equal(val, deserialize(*serialize(val)))
203
+
204
+
205
+ @pytest.mark.skipif(pa is None, reason="need pyarrow to run the cases")
206
+ @switch_unpickle
207
+ def test_arrow():
208
+ test_array = np.random.rand(1000)
209
+ test_df = pd.DataFrame(
210
+ {
211
+ "a": np.random.rand(1000),
212
+ "b": np.random.choice(list("abcd"), size=(1000,)),
213
+ "c": np.random.randint(0, 100, size=(1000,)),
214
+ }
215
+ )
216
+ test_vals = [
217
+ pa.array(test_array),
218
+ pa.chunked_array([pa.array(test_array), pa.array(test_array)]),
219
+ pa.RecordBatch.from_pandas(test_df),
220
+ pa.Table.from_pandas(test_df),
221
+ ]
222
+ for val in test_vals:
223
+ deserialized = deserialize(*serialize(val))
224
+ assert type(val) is type(deserialized)
225
+ np.testing.assert_equal(val, deserialized)
226
+
227
+
228
+ @pytest.mark.parametrize(
229
+ "np_val",
230
+ [np.random.rand(100, 100), np.random.rand(100, 100).T],
231
+ )
232
+ @require_cupy
233
+ def test_cupy(np_val):
234
+ val = cupy.array(np_val)
235
+ deserialized = deserialize(*serialize(val))
236
+ assert type(val) is type(deserialized)
237
+ cupy.testing.assert_array_equal(val, deserialized)
238
+
239
+
240
+ @require_cudf
241
+ def test_cudf():
242
+ raw_df = pd.DataFrame(
243
+ {
244
+ "a": np.random.rand(1000),
245
+ "b": np.random.choice(list("abcd"), size=(1000,)),
246
+ "c": np.random.randint(0, 100, size=(1000,)),
247
+ }
248
+ )
249
+ test_df = cudf.DataFrame(raw_df)
250
+ cudf.testing.assert_frame_equal(test_df, deserialize(*serialize(test_df)))
251
+
252
+ raw_df.columns = pd.MultiIndex.from_tuples([("a", "a"), ("a", "b"), ("b", "c")])
253
+ test_df = cudf.DataFrame(raw_df)
254
+ cudf.testing.assert_frame_equal(test_df, deserialize(*serialize(test_df)))
255
+
256
+
257
+ @pytest.mark.skipif(sps is None, reason="need scipy to run the test")
258
+ def test_scipy_sparse():
259
+ val = sps.random(100, 100, 0.1, format="csr")
260
+ deserial = deserialize(*serialize(val))
261
+ assert (val != deserial).nnz == 0
262
+
263
+
264
+ @pytest.mark.skipif(sps is None, reason="need scipy to run the test")
265
+ def test_maxframe_sparse():
266
+ val = SparseMatrix(sps.random(100, 100, 0.1, format="csr"))
267
+ deserial = deserialize(*serialize(val))
268
+ assert (val.spmatrix != deserial.spmatrix).nnz == 0
269
+
270
+
271
+ def test_pickle_container():
272
+ def func_to_pk():
273
+ return 1234
274
+
275
+ deserial = deserialize(*serialize(func_to_pk))
276
+ assert func_to_pk() == deserial()
277
+
278
+ with switch_unpickle(forbidden=True):
279
+ deserial = deserialize(*serialize(func_to_pk))
280
+ assert isinstance(deserial, PickleContainer)
281
+
282
+ with switch_unpickle(forbidden=False):
283
+ deserial_val = deserial.get()
284
+ assert deserial_val() == func_to_pk()
285
+
286
+ deserial2 = deserialize(*serialize(deserial))
287
+ assert deserial2() == func_to_pk()
288
+
289
+
290
+ def test_exceptions():
291
+ try:
292
+ raise ValueError("val")
293
+ except BaseException as ex:
294
+ exc = ex
295
+
296
+ deserial = deserialize(*serialize(exc))
297
+ assert isinstance(deserial, ValueError)
298
+ assert deserial.args[0] == exc.args[0]
299
+
300
+ with switch_unpickle(forbidden=True):
301
+ deserial = deserialize(*serialize(exc))
302
+ assert isinstance(deserial, RemoteException)
303
+
304
+ with switch_unpickle(forbidden=False):
305
+ deserial_val = deserial.get()
306
+ assert isinstance(deserial_val, ValueError)
307
+ assert deserial_val.args[0] == exc.args[0]
308
+
309
+ deserial2 = deserialize(*serialize(deserial))
310
+ assert isinstance(deserial2, ValueError)
311
+ assert deserial2.args[0] == exc.args[0]
312
+
313
+
314
+ class MockSerializerForErrors(ListSerializer):
315
+ serializer_id = 25951
316
+ raises = False
317
+
318
+ def on_deserial_error(
319
+ self,
320
+ serialized: List,
321
+ context: Dict,
322
+ subs_serialized: List,
323
+ error_index: int,
324
+ exc: BaseException,
325
+ ):
326
+ assert error_index == 1
327
+ assert subs_serialized[error_index]
328
+ try:
329
+ raise SystemError from exc
330
+ except BaseException as ex:
331
+ return ex
332
+
333
+ def deserial(self, serialized: List, context: Dict, subs: List[Any]):
334
+ if len(subs) == 2 and self.raises:
335
+ raise TypeError
336
+ return super().deserial(serialized, context, subs)
337
+
338
+
339
+ class UnpickleWithError:
340
+ def __getstate__(self):
341
+ return (None,)
342
+
343
+ def __setstate__(self, state):
344
+ raise ValueError
345
+
346
+
347
+ def test_deserial_errors():
348
+ try:
349
+ MockSerializerForErrors.raises = False
350
+ MockSerializerForErrors.register(CustomList)
351
+ ListSerializer.register(CustomList, name="test_name")
352
+
353
+ # error of leaf object is raised
354
+ obj = [1, [[3, UnpickleWithError()]]]
355
+ with pytest.raises(ValueError):
356
+ deserialize(*serialize(obj))
357
+
358
+ # error of leaf object is rewritten in parent object
359
+ obj = CustomList([[1], [[3, UnpickleWithError()]]])
360
+ with pytest.raises(SystemError) as exc_info:
361
+ deserialize(*serialize(obj))
362
+ assert isinstance(exc_info.value.__cause__, ValueError)
363
+
364
+ MockSerializerForErrors.raises = True
365
+
366
+ # error of non-leaf object is raised
367
+ obj = [CustomList([[1], [[2]]])]
368
+ with pytest.raises(TypeError):
369
+ deserialize(*serialize(obj))
370
+ deserialize(*serialize(obj, {"serializer": "test_name"}))
371
+
372
+ # error of non-leaf CustomList is rewritten in parent object
373
+ obj = CustomList([[1], CustomList([[1], [[2]]]), [2]])
374
+ with pytest.raises(SystemError) as exc_info:
375
+ deserialize(*serialize(obj))
376
+ assert isinstance(exc_info.value.__cause__, TypeError)
377
+ deserialize(*serialize(obj, {"serializer": "test_name"}))
378
+ finally:
379
+ MockSerializerForErrors.unregister(CustomList)
380
+ ListSerializer.unregister(CustomList, name="test_name")
381
+ # Above unregister will remove the ListSerializer from deserializers,
382
+ # so we need to register ListSerializer again to make the
383
+ # deserializers correct.
384
+ ListSerializer.register(list)
385
+
386
+
387
+ class MockSerializerForSpawn(ListSerializer):
388
+ thread_calls = defaultdict(lambda: 0)
389
+
390
+ def serial(self, obj: Any, context: Dict):
391
+ self.thread_calls[threading.current_thread().ident] += 1
392
+ return super().serial(obj, context)
393
+
394
+
395
+ @pytest.mark.asyncio
396
+ async def test_spawn_threshold():
397
+ try:
398
+ assert 0 == deserialize(*(await serialize_with_spawn(0)))
399
+
400
+ MockSerializerForSpawn.register(CustomList)
401
+ obj = [CustomList([i]) for i in range(200)]
402
+ serialized = await serialize_with_spawn(obj, spawn_threshold=100)
403
+ assert serialized[0][0]["_N"] == 201
404
+ deserialized = deserialize(*serialized)
405
+ for s, d in zip(obj, deserialized):
406
+ assert s[0] == d[0]
407
+
408
+ calls = MockSerializerForSpawn.thread_calls
409
+ assert sum(calls.values()) == 200
410
+ assert calls[threading.current_thread().ident] == 101
411
+ finally:
412
+ MockSerializerForSpawn.unregister(CustomList)