maxframe 2.3.0__cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.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.
Files changed (1117) hide show
  1. maxframe/__init__.py +33 -0
  2. maxframe/_utils.cpython-312-x86_64-linux-gnu.so +0 -0
  3. maxframe/_utils.pxd +33 -0
  4. maxframe/_utils.pyi +21 -0
  5. maxframe/_utils.pyx +561 -0
  6. maxframe/codegen/__init__.py +27 -0
  7. maxframe/codegen/core.py +597 -0
  8. maxframe/codegen/spe/__init__.py +16 -0
  9. maxframe/codegen/spe/core.py +307 -0
  10. maxframe/codegen/spe/dataframe/__init__.py +38 -0
  11. maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
  12. maxframe/codegen/spe/dataframe/accessors/base.py +71 -0
  13. maxframe/codegen/spe/dataframe/accessors/dict_.py +89 -0
  14. maxframe/codegen/spe/dataframe/accessors/list_.py +44 -0
  15. maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
  16. maxframe/codegen/spe/dataframe/arithmetic.py +89 -0
  17. maxframe/codegen/spe/dataframe/datasource.py +181 -0
  18. maxframe/codegen/spe/dataframe/datastore.py +204 -0
  19. maxframe/codegen/spe/dataframe/extensions.py +63 -0
  20. maxframe/codegen/spe/dataframe/fetch.py +26 -0
  21. maxframe/codegen/spe/dataframe/groupby.py +312 -0
  22. maxframe/codegen/spe/dataframe/indexing.py +333 -0
  23. maxframe/codegen/spe/dataframe/merge.py +110 -0
  24. maxframe/codegen/spe/dataframe/misc.py +264 -0
  25. maxframe/codegen/spe/dataframe/missing.py +64 -0
  26. maxframe/codegen/spe/dataframe/reduction.py +183 -0
  27. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  28. maxframe/codegen/spe/dataframe/sort.py +104 -0
  29. maxframe/codegen/spe/dataframe/statistics.py +46 -0
  30. maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
  31. maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
  32. maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
  33. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +304 -0
  34. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +134 -0
  35. maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
  36. maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
  37. maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
  38. maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
  39. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +95 -0
  40. maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
  41. maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
  42. maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
  43. maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
  44. maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
  45. maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
  46. maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
  47. maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
  48. maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
  49. maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
  50. maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
  51. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +202 -0
  52. maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
  53. maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
  54. maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
  55. maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
  56. maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
  57. maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
  58. maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
  59. maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
  60. maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
  61. maxframe/codegen/spe/dataframe/tests/test_groupby.py +288 -0
  62. maxframe/codegen/spe/dataframe/tests/test_merge.py +426 -0
  63. maxframe/codegen/spe/dataframe/tests/test_reduction.py +117 -0
  64. maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
  65. maxframe/codegen/spe/dataframe/tests/test_sort.py +179 -0
  66. maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
  67. maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
  68. maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
  69. maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
  70. maxframe/codegen/spe/dataframe/tseries.py +55 -0
  71. maxframe/codegen/spe/dataframe/udf.py +62 -0
  72. maxframe/codegen/spe/dataframe/value_counts.py +31 -0
  73. maxframe/codegen/spe/dataframe/window.py +65 -0
  74. maxframe/codegen/spe/learn/__init__.py +15 -0
  75. maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
  76. maxframe/codegen/spe/learn/contrib/lightgbm.py +161 -0
  77. maxframe/codegen/spe/learn/contrib/models.py +41 -0
  78. maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
  79. maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
  80. maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
  81. maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
  82. maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
  83. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +99 -0
  84. maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
  85. maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
  86. maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
  87. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  88. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  89. maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
  90. maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
  91. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  92. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  93. maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
  94. maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
  95. maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
  96. maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
  97. maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
  98. maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
  99. maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
  100. maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
  101. maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
  102. maxframe/codegen/spe/learn/utils/__init__.py +15 -0
  103. maxframe/codegen/spe/learn/utils/checks.py +55 -0
  104. maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
  105. maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
  106. maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
  107. maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
  108. maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
  109. maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
  110. maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
  111. maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
  112. maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
  113. maxframe/codegen/spe/learn/utils/validation.py +35 -0
  114. maxframe/codegen/spe/objects.py +26 -0
  115. maxframe/codegen/spe/remote.py +29 -0
  116. maxframe/codegen/spe/tensor/__init__.py +31 -0
  117. maxframe/codegen/spe/tensor/arithmetic.py +95 -0
  118. maxframe/codegen/spe/tensor/core.py +41 -0
  119. maxframe/codegen/spe/tensor/datasource.py +166 -0
  120. maxframe/codegen/spe/tensor/extensions.py +35 -0
  121. maxframe/codegen/spe/tensor/fetch.py +26 -0
  122. maxframe/codegen/spe/tensor/fft.py +74 -0
  123. maxframe/codegen/spe/tensor/indexing.py +63 -0
  124. maxframe/codegen/spe/tensor/linalg.py +90 -0
  125. maxframe/codegen/spe/tensor/merge.py +31 -0
  126. maxframe/codegen/spe/tensor/misc.py +175 -0
  127. maxframe/codegen/spe/tensor/random.py +29 -0
  128. maxframe/codegen/spe/tensor/reduction.py +39 -0
  129. maxframe/codegen/spe/tensor/reshape.py +26 -0
  130. maxframe/codegen/spe/tensor/sort.py +42 -0
  131. maxframe/codegen/spe/tensor/spatial.py +45 -0
  132. maxframe/codegen/spe/tensor/special.py +35 -0
  133. maxframe/codegen/spe/tensor/statistics.py +68 -0
  134. maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
  135. maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
  136. maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
  137. maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
  138. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  139. maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
  140. maxframe/codegen/spe/tensor/tests/test_linalg.py +52 -0
  141. maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
  142. maxframe/codegen/spe/tensor/tests/test_misc.py +144 -0
  143. maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
  144. maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
  145. maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
  146. maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
  147. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  148. maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
  149. maxframe/codegen/spe/tensor/tests/test_statistics.py +43 -0
  150. maxframe/codegen/spe/tests/__init__.py +13 -0
  151. maxframe/codegen/spe/tests/test_remote.py +29 -0
  152. maxframe/codegen/spe/tests/test_spe_codegen.py +135 -0
  153. maxframe/codegen/spe/utils.py +56 -0
  154. maxframe/codegen/tests/__init__.py +13 -0
  155. maxframe/codegen/tests/test_codegen.py +67 -0
  156. maxframe/config/__init__.py +15 -0
  157. maxframe/config/config.py +630 -0
  158. maxframe/config/tests/__init__.py +13 -0
  159. maxframe/config/tests/test_config.py +114 -0
  160. maxframe/config/tests/test_validators.py +46 -0
  161. maxframe/config/validators.py +142 -0
  162. maxframe/conftest.py +261 -0
  163. maxframe/core/__init__.py +53 -0
  164. maxframe/core/accessor.py +45 -0
  165. maxframe/core/base.py +157 -0
  166. maxframe/core/context.py +110 -0
  167. maxframe/core/entity/__init__.py +34 -0
  168. maxframe/core/entity/core.py +150 -0
  169. maxframe/core/entity/executable.py +337 -0
  170. maxframe/core/entity/objects.py +115 -0
  171. maxframe/core/entity/output_types.py +98 -0
  172. maxframe/core/entity/tests/__init__.py +13 -0
  173. maxframe/core/entity/tests/test_objects.py +42 -0
  174. maxframe/core/entity/tileables.py +369 -0
  175. maxframe/core/entity/utils.py +39 -0
  176. maxframe/core/graph/__init__.py +22 -0
  177. maxframe/core/graph/builder/__init__.py +15 -0
  178. maxframe/core/graph/builder/base.py +91 -0
  179. maxframe/core/graph/builder/tileable.py +34 -0
  180. maxframe/core/graph/builder/utils.py +37 -0
  181. maxframe/core/graph/core.cpython-312-x86_64-linux-gnu.so +0 -0
  182. maxframe/core/graph/core.pyx +478 -0
  183. maxframe/core/graph/entity.py +164 -0
  184. maxframe/core/graph/tests/__init__.py +13 -0
  185. maxframe/core/graph/tests/test_graph.py +205 -0
  186. maxframe/core/mode.py +101 -0
  187. maxframe/core/operator/__init__.py +32 -0
  188. maxframe/core/operator/base.py +480 -0
  189. maxframe/core/operator/core.py +307 -0
  190. maxframe/core/operator/fetch.py +40 -0
  191. maxframe/core/operator/objects.py +43 -0
  192. maxframe/core/operator/shuffle.py +45 -0
  193. maxframe/core/operator/tests/__init__.py +13 -0
  194. maxframe/core/operator/tests/test_core.py +64 -0
  195. maxframe/core/operator/utils.py +68 -0
  196. maxframe/core/tests/__init__.py +13 -0
  197. maxframe/core/tests/test_mode.py +75 -0
  198. maxframe/dataframe/__init__.py +89 -0
  199. maxframe/dataframe/accessors/__init__.py +15 -0
  200. maxframe/dataframe/accessors/compat.py +45 -0
  201. maxframe/dataframe/accessors/datetime_/__init__.py +35 -0
  202. maxframe/dataframe/accessors/datetime_/accessor.py +67 -0
  203. maxframe/dataframe/accessors/datetime_/core.py +82 -0
  204. maxframe/dataframe/accessors/datetime_/tests/__init__.py +13 -0
  205. maxframe/dataframe/accessors/datetime_/tests/test_datetime_accessor.py +41 -0
  206. maxframe/dataframe/accessors/dict_/__init__.py +43 -0
  207. maxframe/dataframe/accessors/dict_/accessor.py +39 -0
  208. maxframe/dataframe/accessors/dict_/contains.py +72 -0
  209. maxframe/dataframe/accessors/dict_/core.py +48 -0
  210. maxframe/dataframe/accessors/dict_/getitem.py +140 -0
  211. maxframe/dataframe/accessors/dict_/length.py +64 -0
  212. maxframe/dataframe/accessors/dict_/remove.py +75 -0
  213. maxframe/dataframe/accessors/dict_/setitem.py +79 -0
  214. maxframe/dataframe/accessors/dict_/tests/__init__.py +13 -0
  215. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +168 -0
  216. maxframe/dataframe/accessors/list_/__init__.py +37 -0
  217. maxframe/dataframe/accessors/list_/accessor.py +39 -0
  218. maxframe/dataframe/accessors/list_/core.py +48 -0
  219. maxframe/dataframe/accessors/list_/getitem.py +128 -0
  220. maxframe/dataframe/accessors/list_/length.py +64 -0
  221. maxframe/dataframe/accessors/list_/tests/__init__.py +13 -0
  222. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +81 -0
  223. maxframe/dataframe/accessors/plotting/__init__.py +40 -0
  224. maxframe/dataframe/accessors/plotting/core.py +78 -0
  225. maxframe/dataframe/accessors/plotting/tests/__init__.py +13 -0
  226. maxframe/dataframe/accessors/plotting/tests/test_plotting_accessor.py +136 -0
  227. maxframe/dataframe/accessors/string_/__init__.py +36 -0
  228. maxframe/dataframe/accessors/string_/accessor.py +215 -0
  229. maxframe/dataframe/accessors/string_/core.py +224 -0
  230. maxframe/dataframe/accessors/string_/tests/__init__.py +13 -0
  231. maxframe/dataframe/accessors/string_/tests/test_string_accessor.py +73 -0
  232. maxframe/dataframe/accessors/struct_/__init__.py +37 -0
  233. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  234. maxframe/dataframe/accessors/struct_/core.py +43 -0
  235. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  236. maxframe/dataframe/accessors/struct_/field.py +123 -0
  237. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  238. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  239. maxframe/dataframe/arithmetic/__init__.py +373 -0
  240. maxframe/dataframe/arithmetic/abs.py +33 -0
  241. maxframe/dataframe/arithmetic/add.py +60 -0
  242. maxframe/dataframe/arithmetic/arccos.py +28 -0
  243. maxframe/dataframe/arithmetic/arccosh.py +28 -0
  244. maxframe/dataframe/arithmetic/arcsin.py +28 -0
  245. maxframe/dataframe/arithmetic/arcsinh.py +28 -0
  246. maxframe/dataframe/arithmetic/arctan.py +28 -0
  247. maxframe/dataframe/arithmetic/arctanh.py +28 -0
  248. maxframe/dataframe/arithmetic/between.py +106 -0
  249. maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
  250. maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
  251. maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
  252. maxframe/dataframe/arithmetic/ceil.py +28 -0
  253. maxframe/dataframe/arithmetic/core.py +361 -0
  254. maxframe/dataframe/arithmetic/cos.py +28 -0
  255. maxframe/dataframe/arithmetic/cosh.py +28 -0
  256. maxframe/dataframe/arithmetic/degrees.py +28 -0
  257. maxframe/dataframe/arithmetic/docstring.py +416 -0
  258. maxframe/dataframe/arithmetic/dot.py +237 -0
  259. maxframe/dataframe/arithmetic/equal.py +58 -0
  260. maxframe/dataframe/arithmetic/exp.py +28 -0
  261. maxframe/dataframe/arithmetic/exp2.py +28 -0
  262. maxframe/dataframe/arithmetic/expm1.py +28 -0
  263. maxframe/dataframe/arithmetic/floor.py +28 -0
  264. maxframe/dataframe/arithmetic/floordiv.py +64 -0
  265. maxframe/dataframe/arithmetic/greater.py +59 -0
  266. maxframe/dataframe/arithmetic/greater_equal.py +59 -0
  267. maxframe/dataframe/arithmetic/invert.py +33 -0
  268. maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
  269. maxframe/dataframe/arithmetic/less.py +57 -0
  270. maxframe/dataframe/arithmetic/less_equal.py +59 -0
  271. maxframe/dataframe/arithmetic/log.py +28 -0
  272. maxframe/dataframe/arithmetic/log10.py +28 -0
  273. maxframe/dataframe/arithmetic/log2.py +28 -0
  274. maxframe/dataframe/arithmetic/maximum.py +33 -0
  275. maxframe/dataframe/arithmetic/minimum.py +33 -0
  276. maxframe/dataframe/arithmetic/mod.py +60 -0
  277. maxframe/dataframe/arithmetic/multiply.py +60 -0
  278. maxframe/dataframe/arithmetic/negative.py +33 -0
  279. maxframe/dataframe/arithmetic/not_equal.py +58 -0
  280. maxframe/dataframe/arithmetic/power.py +68 -0
  281. maxframe/dataframe/arithmetic/radians.py +28 -0
  282. maxframe/dataframe/arithmetic/round.py +144 -0
  283. maxframe/dataframe/arithmetic/sin.py +28 -0
  284. maxframe/dataframe/arithmetic/sinh.py +28 -0
  285. maxframe/dataframe/arithmetic/sqrt.py +28 -0
  286. maxframe/dataframe/arithmetic/subtract.py +64 -0
  287. maxframe/dataframe/arithmetic/tan.py +28 -0
  288. maxframe/dataframe/arithmetic/tanh.py +28 -0
  289. maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
  290. maxframe/dataframe/arithmetic/tests/test_arithmetic.py +724 -0
  291. maxframe/dataframe/arithmetic/truediv.py +64 -0
  292. maxframe/dataframe/arithmetic/trunc.py +28 -0
  293. maxframe/dataframe/core.py +2385 -0
  294. maxframe/dataframe/datasource/__init__.py +33 -0
  295. maxframe/dataframe/datasource/core.py +94 -0
  296. maxframe/dataframe/datasource/dataframe.py +59 -0
  297. maxframe/dataframe/datasource/date_range.py +512 -0
  298. maxframe/dataframe/datasource/direct.py +57 -0
  299. maxframe/dataframe/datasource/from_dict.py +124 -0
  300. maxframe/dataframe/datasource/from_index.py +58 -0
  301. maxframe/dataframe/datasource/from_records.py +191 -0
  302. maxframe/dataframe/datasource/from_tensor.py +498 -0
  303. maxframe/dataframe/datasource/index.py +117 -0
  304. maxframe/dataframe/datasource/read_csv.py +541 -0
  305. maxframe/dataframe/datasource/read_odps_query.py +536 -0
  306. maxframe/dataframe/datasource/read_odps_table.py +295 -0
  307. maxframe/dataframe/datasource/read_parquet.py +425 -0
  308. maxframe/dataframe/datasource/series.py +55 -0
  309. maxframe/dataframe/datasource/tests/__init__.py +13 -0
  310. maxframe/dataframe/datasource/tests/test_datasource.py +663 -0
  311. maxframe/dataframe/datastore/__init__.py +36 -0
  312. maxframe/dataframe/datastore/core.py +19 -0
  313. maxframe/dataframe/datastore/direct.py +268 -0
  314. maxframe/dataframe/datastore/tests/__init__.py +13 -0
  315. maxframe/dataframe/datastore/tests/test_to_odps.py +99 -0
  316. maxframe/dataframe/datastore/to_csv.py +219 -0
  317. maxframe/dataframe/datastore/to_odps.py +264 -0
  318. maxframe/dataframe/extensions/__init__.py +70 -0
  319. maxframe/dataframe/extensions/accessor.py +35 -0
  320. maxframe/dataframe/extensions/apply_chunk.py +733 -0
  321. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  322. maxframe/dataframe/extensions/collect_kv.py +126 -0
  323. maxframe/dataframe/extensions/extract_kv.py +177 -0
  324. maxframe/dataframe/extensions/flatjson.py +133 -0
  325. maxframe/dataframe/extensions/flatmap.py +329 -0
  326. maxframe/dataframe/extensions/map_reduce.py +263 -0
  327. maxframe/dataframe/extensions/rebalance.py +62 -0
  328. maxframe/dataframe/extensions/reshuffle.py +83 -0
  329. maxframe/dataframe/extensions/tests/__init__.py +13 -0
  330. maxframe/dataframe/extensions/tests/test_apply_chunk.py +194 -0
  331. maxframe/dataframe/extensions/tests/test_extensions.py +198 -0
  332. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  333. maxframe/dataframe/fetch/__init__.py +15 -0
  334. maxframe/dataframe/fetch/core.py +97 -0
  335. maxframe/dataframe/groupby/__init__.py +105 -0
  336. maxframe/dataframe/groupby/aggregation.py +441 -0
  337. maxframe/dataframe/groupby/apply.py +235 -0
  338. maxframe/dataframe/groupby/apply_chunk.py +407 -0
  339. maxframe/dataframe/groupby/core.py +342 -0
  340. maxframe/dataframe/groupby/cum.py +102 -0
  341. maxframe/dataframe/groupby/expanding.py +264 -0
  342. maxframe/dataframe/groupby/extensions.py +26 -0
  343. maxframe/dataframe/groupby/fill.py +149 -0
  344. maxframe/dataframe/groupby/getitem.py +105 -0
  345. maxframe/dataframe/groupby/head.py +115 -0
  346. maxframe/dataframe/groupby/rank.py +136 -0
  347. maxframe/dataframe/groupby/rolling.py +206 -0
  348. maxframe/dataframe/groupby/sample.py +214 -0
  349. maxframe/dataframe/groupby/shift.py +114 -0
  350. maxframe/dataframe/groupby/tests/__init__.py +13 -0
  351. maxframe/dataframe/groupby/tests/test_groupby.py +373 -0
  352. maxframe/dataframe/groupby/transform.py +264 -0
  353. maxframe/dataframe/indexing/__init__.py +104 -0
  354. maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
  355. maxframe/dataframe/indexing/align.py +350 -0
  356. maxframe/dataframe/indexing/at.py +83 -0
  357. maxframe/dataframe/indexing/droplevel.py +195 -0
  358. maxframe/dataframe/indexing/filter.py +169 -0
  359. maxframe/dataframe/indexing/get_level_values.py +76 -0
  360. maxframe/dataframe/indexing/getitem.py +205 -0
  361. maxframe/dataframe/indexing/iat.py +82 -0
  362. maxframe/dataframe/indexing/iloc.py +711 -0
  363. maxframe/dataframe/indexing/insert.py +118 -0
  364. maxframe/dataframe/indexing/loc.py +694 -0
  365. maxframe/dataframe/indexing/reindex.py +541 -0
  366. maxframe/dataframe/indexing/rename.py +445 -0
  367. maxframe/dataframe/indexing/rename_axis.py +217 -0
  368. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  369. maxframe/dataframe/indexing/reset_index.py +427 -0
  370. maxframe/dataframe/indexing/sample.py +232 -0
  371. maxframe/dataframe/indexing/set_axis.py +197 -0
  372. maxframe/dataframe/indexing/set_index.py +128 -0
  373. maxframe/dataframe/indexing/setitem.py +133 -0
  374. maxframe/dataframe/indexing/swaplevel.py +185 -0
  375. maxframe/dataframe/indexing/take.py +99 -0
  376. maxframe/dataframe/indexing/tests/__init__.py +13 -0
  377. maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
  378. maxframe/dataframe/indexing/truncate.py +140 -0
  379. maxframe/dataframe/indexing/where.py +300 -0
  380. maxframe/dataframe/indexing/xs.py +148 -0
  381. maxframe/dataframe/initializer.py +298 -0
  382. maxframe/dataframe/merge/__init__.py +53 -0
  383. maxframe/dataframe/merge/append.py +120 -0
  384. maxframe/dataframe/merge/combine.py +244 -0
  385. maxframe/dataframe/merge/combine_first.py +120 -0
  386. maxframe/dataframe/merge/compare.py +387 -0
  387. maxframe/dataframe/merge/concat.py +500 -0
  388. maxframe/dataframe/merge/merge.py +806 -0
  389. maxframe/dataframe/merge/tests/__init__.py +13 -0
  390. maxframe/dataframe/merge/tests/test_merge.py +390 -0
  391. maxframe/dataframe/merge/update.py +271 -0
  392. maxframe/dataframe/misc/__init__.py +142 -0
  393. maxframe/dataframe/misc/_duplicate.py +56 -0
  394. maxframe/dataframe/misc/apply.py +730 -0
  395. maxframe/dataframe/misc/astype.py +237 -0
  396. maxframe/dataframe/misc/case_when.py +145 -0
  397. maxframe/dataframe/misc/check_monotonic.py +84 -0
  398. maxframe/dataframe/misc/check_unique.py +82 -0
  399. maxframe/dataframe/misc/clip.py +145 -0
  400. maxframe/dataframe/misc/cut.py +386 -0
  401. maxframe/dataframe/misc/describe.py +278 -0
  402. maxframe/dataframe/misc/diff.py +210 -0
  403. maxframe/dataframe/misc/drop.py +473 -0
  404. maxframe/dataframe/misc/drop_duplicates.py +251 -0
  405. maxframe/dataframe/misc/duplicated.py +292 -0
  406. maxframe/dataframe/misc/eval.py +730 -0
  407. maxframe/dataframe/misc/explode.py +171 -0
  408. maxframe/dataframe/misc/get_dummies.py +241 -0
  409. maxframe/dataframe/misc/infer_dtypes.py +251 -0
  410. maxframe/dataframe/misc/isin.py +220 -0
  411. maxframe/dataframe/misc/map.py +360 -0
  412. maxframe/dataframe/misc/memory_usage.py +248 -0
  413. maxframe/dataframe/misc/pct_change.py +68 -0
  414. maxframe/dataframe/misc/qcut.py +104 -0
  415. maxframe/dataframe/misc/rechunk.py +59 -0
  416. maxframe/dataframe/misc/repeat.py +159 -0
  417. maxframe/dataframe/misc/select_dtypes.py +104 -0
  418. maxframe/dataframe/misc/shift.py +259 -0
  419. maxframe/dataframe/misc/tests/__init__.py +13 -0
  420. maxframe/dataframe/misc/tests/test_misc.py +649 -0
  421. maxframe/dataframe/misc/to_numeric.py +181 -0
  422. maxframe/dataframe/misc/transform.py +346 -0
  423. maxframe/dataframe/misc/transpose.py +148 -0
  424. maxframe/dataframe/misc/valid_index.py +115 -0
  425. maxframe/dataframe/misc/value_counts.py +206 -0
  426. maxframe/dataframe/missing/__init__.py +53 -0
  427. maxframe/dataframe/missing/checkna.py +231 -0
  428. maxframe/dataframe/missing/dropna.py +294 -0
  429. maxframe/dataframe/missing/fillna.py +283 -0
  430. maxframe/dataframe/missing/replace.py +446 -0
  431. maxframe/dataframe/missing/tests/__init__.py +13 -0
  432. maxframe/dataframe/missing/tests/test_missing.py +90 -0
  433. maxframe/dataframe/operators.py +231 -0
  434. maxframe/dataframe/reduction/__init__.py +129 -0
  435. maxframe/dataframe/reduction/aggregation.py +499 -0
  436. maxframe/dataframe/reduction/all.py +78 -0
  437. maxframe/dataframe/reduction/any.py +78 -0
  438. maxframe/dataframe/reduction/argmax.py +103 -0
  439. maxframe/dataframe/reduction/argmin.py +103 -0
  440. maxframe/dataframe/reduction/core.py +907 -0
  441. maxframe/dataframe/reduction/count.py +63 -0
  442. maxframe/dataframe/reduction/cov.py +166 -0
  443. maxframe/dataframe/reduction/cummax.py +30 -0
  444. maxframe/dataframe/reduction/cummin.py +30 -0
  445. maxframe/dataframe/reduction/cumprod.py +30 -0
  446. maxframe/dataframe/reduction/cumsum.py +30 -0
  447. maxframe/dataframe/reduction/custom_reduction.py +42 -0
  448. maxframe/dataframe/reduction/idxmax.py +185 -0
  449. maxframe/dataframe/reduction/idxmin.py +185 -0
  450. maxframe/dataframe/reduction/kurtosis.py +111 -0
  451. maxframe/dataframe/reduction/max.py +65 -0
  452. maxframe/dataframe/reduction/mean.py +63 -0
  453. maxframe/dataframe/reduction/median.py +56 -0
  454. maxframe/dataframe/reduction/min.py +65 -0
  455. maxframe/dataframe/reduction/mode.py +144 -0
  456. maxframe/dataframe/reduction/nunique.py +149 -0
  457. maxframe/dataframe/reduction/prod.py +81 -0
  458. maxframe/dataframe/reduction/reduction_size.py +36 -0
  459. maxframe/dataframe/reduction/sem.py +73 -0
  460. maxframe/dataframe/reduction/skew.py +93 -0
  461. maxframe/dataframe/reduction/std.py +53 -0
  462. maxframe/dataframe/reduction/str_concat.py +51 -0
  463. maxframe/dataframe/reduction/sum.py +81 -0
  464. maxframe/dataframe/reduction/tests/__init__.py +13 -0
  465. maxframe/dataframe/reduction/tests/test_reduction.py +541 -0
  466. maxframe/dataframe/reduction/unique.py +153 -0
  467. maxframe/dataframe/reduction/var.py +76 -0
  468. maxframe/dataframe/reshape/__init__.py +38 -0
  469. maxframe/dataframe/reshape/melt.py +169 -0
  470. maxframe/dataframe/reshape/pivot.py +233 -0
  471. maxframe/dataframe/reshape/pivot_table.py +275 -0
  472. maxframe/dataframe/reshape/stack.py +240 -0
  473. maxframe/dataframe/reshape/unstack.py +114 -0
  474. maxframe/dataframe/sort/__init__.py +49 -0
  475. maxframe/dataframe/sort/argsort.py +68 -0
  476. maxframe/dataframe/sort/core.py +37 -0
  477. maxframe/dataframe/sort/nlargest.py +238 -0
  478. maxframe/dataframe/sort/nsmallest.py +228 -0
  479. maxframe/dataframe/sort/rank.py +147 -0
  480. maxframe/dataframe/sort/sort_index.py +153 -0
  481. maxframe/dataframe/sort/sort_values.py +301 -0
  482. maxframe/dataframe/sort/tests/__init__.py +13 -0
  483. maxframe/dataframe/sort/tests/test_sort.py +81 -0
  484. maxframe/dataframe/statistics/__init__.py +33 -0
  485. maxframe/dataframe/statistics/corr.py +284 -0
  486. maxframe/dataframe/statistics/quantile.py +338 -0
  487. maxframe/dataframe/statistics/tests/__init__.py +13 -0
  488. maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
  489. maxframe/dataframe/tests/__init__.py +13 -0
  490. maxframe/dataframe/tests/test_initializer.py +60 -0
  491. maxframe/dataframe/tests/test_typing.py +119 -0
  492. maxframe/dataframe/tests/test_utils.py +165 -0
  493. maxframe/dataframe/tseries/__init__.py +32 -0
  494. maxframe/dataframe/tseries/at_time.py +61 -0
  495. maxframe/dataframe/tseries/between_time.py +122 -0
  496. maxframe/dataframe/tseries/tests/__init__.py +13 -0
  497. maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
  498. maxframe/dataframe/tseries/to_datetime.py +299 -0
  499. maxframe/dataframe/typing_.py +196 -0
  500. maxframe/dataframe/ufunc/__init__.py +27 -0
  501. maxframe/dataframe/ufunc/tensor.py +54 -0
  502. maxframe/dataframe/ufunc/ufunc.py +53 -0
  503. maxframe/dataframe/utils.py +1651 -0
  504. maxframe/dataframe/window/__init__.py +29 -0
  505. maxframe/dataframe/window/aggregation.py +100 -0
  506. maxframe/dataframe/window/core.py +82 -0
  507. maxframe/dataframe/window/ewm.py +247 -0
  508. maxframe/dataframe/window/expanding.py +151 -0
  509. maxframe/dataframe/window/rolling.py +389 -0
  510. maxframe/dataframe/window/tests/__init__.py +13 -0
  511. maxframe/dataframe/window/tests/test_ewm.py +70 -0
  512. maxframe/dataframe/window/tests/test_expanding.py +60 -0
  513. maxframe/dataframe/window/tests/test_rolling.py +57 -0
  514. maxframe/env.py +37 -0
  515. maxframe/errors.py +47 -0
  516. maxframe/extension.py +107 -0
  517. maxframe/io/__init__.py +13 -0
  518. maxframe/io/objects/__init__.py +24 -0
  519. maxframe/io/objects/core.py +156 -0
  520. maxframe/io/objects/tensor.py +132 -0
  521. maxframe/io/objects/tests/__init__.py +13 -0
  522. maxframe/io/objects/tests/test_object_io.py +79 -0
  523. maxframe/io/odpsio/__init__.py +23 -0
  524. maxframe/io/odpsio/arrow.py +161 -0
  525. maxframe/io/odpsio/schema.py +496 -0
  526. maxframe/io/odpsio/tableio.py +727 -0
  527. maxframe/io/odpsio/tests/__init__.py +13 -0
  528. maxframe/io/odpsio/tests/test_arrow.py +132 -0
  529. maxframe/io/odpsio/tests/test_schema.py +580 -0
  530. maxframe/io/odpsio/tests/test_tableio.py +205 -0
  531. maxframe/io/odpsio/tests/test_volumeio.py +75 -0
  532. maxframe/io/odpsio/volumeio.py +102 -0
  533. maxframe/learn/__init__.py +25 -0
  534. maxframe/learn/cluster/__init__.py +15 -0
  535. maxframe/learn/cluster/_kmeans.py +782 -0
  536. maxframe/learn/contrib/__init__.py +17 -0
  537. maxframe/learn/contrib/graph/__init__.py +15 -0
  538. maxframe/learn/contrib/graph/connected_components.py +216 -0
  539. maxframe/learn/contrib/graph/tests/__init__.py +13 -0
  540. maxframe/learn/contrib/graph/tests/test_connected_components.py +53 -0
  541. maxframe/learn/contrib/lightgbm/__init__.py +33 -0
  542. maxframe/learn/contrib/lightgbm/_predict.py +138 -0
  543. maxframe/learn/contrib/lightgbm/_train.py +163 -0
  544. maxframe/learn/contrib/lightgbm/callback.py +114 -0
  545. maxframe/learn/contrib/lightgbm/classifier.py +199 -0
  546. maxframe/learn/contrib/lightgbm/core.py +372 -0
  547. maxframe/learn/contrib/lightgbm/dataset.py +153 -0
  548. maxframe/learn/contrib/lightgbm/regressor.py +29 -0
  549. maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
  550. maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
  551. maxframe/learn/contrib/llm/__init__.py +17 -0
  552. maxframe/learn/contrib/llm/core.py +86 -0
  553. maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
  554. maxframe/learn/contrib/llm/deploy/config.py +221 -0
  555. maxframe/learn/contrib/llm/deploy/core.py +247 -0
  556. maxframe/learn/contrib/llm/deploy/framework.py +35 -0
  557. maxframe/learn/contrib/llm/deploy/loader.py +360 -0
  558. maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
  559. maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
  560. maxframe/learn/contrib/llm/models/__init__.py +16 -0
  561. maxframe/learn/contrib/llm/models/dashscope.py +114 -0
  562. maxframe/learn/contrib/llm/models/managed.py +119 -0
  563. maxframe/learn/contrib/llm/models/openai.py +72 -0
  564. maxframe/learn/contrib/llm/multi_modal.py +135 -0
  565. maxframe/learn/contrib/llm/tests/__init__.py +13 -0
  566. maxframe/learn/contrib/llm/tests/test_core.py +34 -0
  567. maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
  568. maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
  569. maxframe/learn/contrib/llm/text.py +608 -0
  570. maxframe/learn/contrib/models.py +109 -0
  571. maxframe/learn/contrib/pytorch/__init__.py +16 -0
  572. maxframe/learn/contrib/pytorch/run_function.py +110 -0
  573. maxframe/learn/contrib/pytorch/run_script.py +102 -0
  574. maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
  575. maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
  576. maxframe/learn/contrib/utils.py +108 -0
  577. maxframe/learn/contrib/xgboost/__init__.py +33 -0
  578. maxframe/learn/contrib/xgboost/callback.py +86 -0
  579. maxframe/learn/contrib/xgboost/classifier.py +119 -0
  580. maxframe/learn/contrib/xgboost/core.py +469 -0
  581. maxframe/learn/contrib/xgboost/dmatrix.py +157 -0
  582. maxframe/learn/contrib/xgboost/predict.py +133 -0
  583. maxframe/learn/contrib/xgboost/regressor.py +91 -0
  584. maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
  585. maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
  586. maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
  587. maxframe/learn/contrib/xgboost/train.py +181 -0
  588. maxframe/learn/core.py +344 -0
  589. maxframe/learn/datasets/__init__.py +20 -0
  590. maxframe/learn/datasets/samples_generator.py +628 -0
  591. maxframe/learn/linear_model/__init__.py +15 -0
  592. maxframe/learn/linear_model/_base.py +220 -0
  593. maxframe/learn/linear_model/_lin_reg.py +175 -0
  594. maxframe/learn/metrics/__init__.py +31 -0
  595. maxframe/learn/metrics/_check_targets.py +95 -0
  596. maxframe/learn/metrics/_classification.py +1266 -0
  597. maxframe/learn/metrics/_ranking.py +477 -0
  598. maxframe/learn/metrics/_regression.py +256 -0
  599. maxframe/learn/metrics/_scorer.py +60 -0
  600. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  601. maxframe/learn/metrics/pairwise/core.py +77 -0
  602. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  603. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  604. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  605. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  606. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  607. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  608. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  609. maxframe/learn/metrics/tests/__init__.py +13 -0
  610. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  611. maxframe/learn/model_selection/__init__.py +15 -0
  612. maxframe/learn/model_selection/_split.py +451 -0
  613. maxframe/learn/model_selection/tests/__init__.py +13 -0
  614. maxframe/learn/model_selection/tests/test_split.py +156 -0
  615. maxframe/learn/preprocessing/__init__.py +16 -0
  616. maxframe/learn/preprocessing/_data/__init__.py +17 -0
  617. maxframe/learn/preprocessing/_data/min_max_scaler.py +401 -0
  618. maxframe/learn/preprocessing/_data/normalize.py +127 -0
  619. maxframe/learn/preprocessing/_data/standard_scaler.py +512 -0
  620. maxframe/learn/preprocessing/_data/utils.py +79 -0
  621. maxframe/learn/preprocessing/_label/__init__.py +16 -0
  622. maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
  623. maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
  624. maxframe/learn/utils/__init__.py +20 -0
  625. maxframe/learn/utils/_encode.py +314 -0
  626. maxframe/learn/utils/checks.py +160 -0
  627. maxframe/learn/utils/core.py +121 -0
  628. maxframe/learn/utils/extmath.py +246 -0
  629. maxframe/learn/utils/multiclass.py +292 -0
  630. maxframe/learn/utils/odpsio.py +262 -0
  631. maxframe/learn/utils/shuffle.py +114 -0
  632. maxframe/learn/utils/sparsefuncs.py +87 -0
  633. maxframe/learn/utils/validation.py +775 -0
  634. maxframe/lib/__init__.py +13 -0
  635. maxframe/lib/aio/__init__.py +27 -0
  636. maxframe/lib/aio/_runners.py +162 -0
  637. maxframe/lib/aio/_threads.py +35 -0
  638. maxframe/lib/aio/base.py +82 -0
  639. maxframe/lib/aio/file.py +85 -0
  640. maxframe/lib/aio/isolation.py +100 -0
  641. maxframe/lib/aio/lru.py +242 -0
  642. maxframe/lib/aio/parallelism.py +37 -0
  643. maxframe/lib/aio/tests/__init__.py +13 -0
  644. maxframe/lib/aio/tests/test_aio_file.py +55 -0
  645. maxframe/lib/compat.py +185 -0
  646. maxframe/lib/compression.py +55 -0
  647. maxframe/lib/cython/__init__.py +13 -0
  648. maxframe/lib/cython/libcpp.pxd +30 -0
  649. maxframe/lib/dtypes_extension/__init__.py +30 -0
  650. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  651. maxframe/lib/dtypes_extension/blob.py +304 -0
  652. maxframe/lib/dtypes_extension/dtypes.py +106 -0
  653. maxframe/lib/dtypes_extension/tests/__init__.py +13 -0
  654. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  655. maxframe/lib/dtypes_extension/tests/test_dtypes.py +63 -0
  656. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  657. maxframe/lib/filesystem/__init__.py +21 -0
  658. maxframe/lib/filesystem/_glob.py +173 -0
  659. maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
  660. maxframe/lib/filesystem/_oss_lib/common.py +272 -0
  661. maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
  662. maxframe/lib/filesystem/_oss_lib/handle.py +152 -0
  663. maxframe/lib/filesystem/arrow.py +236 -0
  664. maxframe/lib/filesystem/base.py +263 -0
  665. maxframe/lib/filesystem/core.py +95 -0
  666. maxframe/lib/filesystem/fsmap.py +164 -0
  667. maxframe/lib/filesystem/hdfs.py +31 -0
  668. maxframe/lib/filesystem/local.py +112 -0
  669. maxframe/lib/filesystem/oss.py +226 -0
  670. maxframe/lib/filesystem/tests/__init__.py +13 -0
  671. maxframe/lib/filesystem/tests/test_filesystem.py +225 -0
  672. maxframe/lib/filesystem/tests/test_oss.py +220 -0
  673. maxframe/lib/functools_compat.py +81 -0
  674. maxframe/lib/mmh3.cpython-312-x86_64-linux-gnu.so +0 -0
  675. maxframe/lib/mmh3.pyi +43 -0
  676. maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
  677. maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
  678. maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
  679. maxframe/lib/sparse/__init__.py +856 -0
  680. maxframe/lib/sparse/array.py +1616 -0
  681. maxframe/lib/sparse/core.py +90 -0
  682. maxframe/lib/sparse/linalg.py +31 -0
  683. maxframe/lib/sparse/matrix.py +244 -0
  684. maxframe/lib/sparse/tests/__init__.py +13 -0
  685. maxframe/lib/sparse/tests/test_sparse.py +476 -0
  686. maxframe/lib/sparse/vector.py +148 -0
  687. maxframe/lib/tblib/LICENSE +20 -0
  688. maxframe/lib/tblib/__init__.py +327 -0
  689. maxframe/lib/tblib/cpython.py +83 -0
  690. maxframe/lib/tblib/decorators.py +44 -0
  691. maxframe/lib/tblib/pickling_support.py +90 -0
  692. maxframe/lib/tests/__init__.py +13 -0
  693. maxframe/lib/tests/test_wrapped_pickle.py +51 -0
  694. maxframe/lib/version.py +620 -0
  695. maxframe/lib/wrapped_pickle.py +150 -0
  696. maxframe/mixin.py +157 -0
  697. maxframe/opcodes.py +657 -0
  698. maxframe/protocol.py +607 -0
  699. maxframe/remote/__init__.py +18 -0
  700. maxframe/remote/core.py +212 -0
  701. maxframe/remote/run_script.py +124 -0
  702. maxframe/serialization/__init__.py +39 -0
  703. maxframe/serialization/arrow.py +120 -0
  704. maxframe/serialization/blob.py +32 -0
  705. maxframe/serialization/core.cpython-312-x86_64-linux-gnu.so +0 -0
  706. maxframe/serialization/core.pxd +50 -0
  707. maxframe/serialization/core.pyi +66 -0
  708. maxframe/serialization/core.pyx +1265 -0
  709. maxframe/serialization/exception.py +84 -0
  710. maxframe/serialization/maxframe_objects.py +39 -0
  711. maxframe/serialization/numpy.py +110 -0
  712. maxframe/serialization/pandas.py +278 -0
  713. maxframe/serialization/scipy.py +71 -0
  714. maxframe/serialization/serializables/__init__.py +55 -0
  715. maxframe/serialization/serializables/core.py +469 -0
  716. maxframe/serialization/serializables/field.py +624 -0
  717. maxframe/serialization/serializables/field_type.py +592 -0
  718. maxframe/serialization/serializables/tests/__init__.py +13 -0
  719. maxframe/serialization/serializables/tests/test_field_type.py +119 -0
  720. maxframe/serialization/serializables/tests/test_serializable.py +313 -0
  721. maxframe/serialization/tests/__init__.py +13 -0
  722. maxframe/serialization/tests/test_serial.py +487 -0
  723. maxframe/session.py +1250 -0
  724. maxframe/sperunner.py +165 -0
  725. maxframe/tensor/__init__.py +325 -0
  726. maxframe/tensor/arithmetic/__init__.py +322 -0
  727. maxframe/tensor/arithmetic/abs.py +66 -0
  728. maxframe/tensor/arithmetic/absolute.py +66 -0
  729. maxframe/tensor/arithmetic/add.py +112 -0
  730. maxframe/tensor/arithmetic/angle.py +70 -0
  731. maxframe/tensor/arithmetic/arccos.py +101 -0
  732. maxframe/tensor/arithmetic/arccosh.py +89 -0
  733. maxframe/tensor/arithmetic/arcsin.py +92 -0
  734. maxframe/tensor/arithmetic/arcsinh.py +84 -0
  735. maxframe/tensor/arithmetic/arctan.py +104 -0
  736. maxframe/tensor/arithmetic/arctan2.py +126 -0
  737. maxframe/tensor/arithmetic/arctanh.py +84 -0
  738. maxframe/tensor/arithmetic/around.py +112 -0
  739. maxframe/tensor/arithmetic/bitand.py +93 -0
  740. maxframe/tensor/arithmetic/bitor.py +100 -0
  741. maxframe/tensor/arithmetic/bitxor.py +93 -0
  742. maxframe/tensor/arithmetic/cbrt.py +64 -0
  743. maxframe/tensor/arithmetic/ceil.py +69 -0
  744. maxframe/tensor/arithmetic/clip.py +165 -0
  745. maxframe/tensor/arithmetic/conj.py +72 -0
  746. maxframe/tensor/arithmetic/copysign.py +76 -0
  747. maxframe/tensor/arithmetic/core.py +552 -0
  748. maxframe/tensor/arithmetic/cos.py +83 -0
  749. maxframe/tensor/arithmetic/cosh.py +70 -0
  750. maxframe/tensor/arithmetic/deg2rad.py +70 -0
  751. maxframe/tensor/arithmetic/degrees.py +75 -0
  752. maxframe/tensor/arithmetic/divide.py +112 -0
  753. maxframe/tensor/arithmetic/equal.py +74 -0
  754. maxframe/tensor/arithmetic/exp.py +104 -0
  755. maxframe/tensor/arithmetic/exp2.py +65 -0
  756. maxframe/tensor/arithmetic/expm1.py +77 -0
  757. maxframe/tensor/arithmetic/fabs.py +72 -0
  758. maxframe/tensor/arithmetic/fix.py +67 -0
  759. maxframe/tensor/arithmetic/float_power.py +101 -0
  760. maxframe/tensor/arithmetic/floor.py +75 -0
  761. maxframe/tensor/arithmetic/floordiv.py +92 -0
  762. maxframe/tensor/arithmetic/fmax.py +103 -0
  763. maxframe/tensor/arithmetic/fmin.py +104 -0
  764. maxframe/tensor/arithmetic/fmod.py +97 -0
  765. maxframe/tensor/arithmetic/frexp.py +96 -0
  766. maxframe/tensor/arithmetic/greater.py +75 -0
  767. maxframe/tensor/arithmetic/greater_equal.py +67 -0
  768. maxframe/tensor/arithmetic/hypot.py +75 -0
  769. maxframe/tensor/arithmetic/i0.py +87 -0
  770. maxframe/tensor/arithmetic/imag.py +65 -0
  771. maxframe/tensor/arithmetic/invert.py +108 -0
  772. maxframe/tensor/arithmetic/isclose.py +114 -0
  773. maxframe/tensor/arithmetic/iscomplex.py +62 -0
  774. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  775. maxframe/tensor/arithmetic/isfinite.py +104 -0
  776. maxframe/tensor/arithmetic/isinf.py +101 -0
  777. maxframe/tensor/arithmetic/isnan.py +80 -0
  778. maxframe/tensor/arithmetic/isreal.py +61 -0
  779. maxframe/tensor/arithmetic/ldexp.py +97 -0
  780. maxframe/tensor/arithmetic/less.py +67 -0
  781. maxframe/tensor/arithmetic/less_equal.py +67 -0
  782. maxframe/tensor/arithmetic/log.py +90 -0
  783. maxframe/tensor/arithmetic/log10.py +83 -0
  784. maxframe/tensor/arithmetic/log1p.py +93 -0
  785. maxframe/tensor/arithmetic/log2.py +83 -0
  786. maxframe/tensor/arithmetic/logaddexp.py +78 -0
  787. maxframe/tensor/arithmetic/logaddexp2.py +76 -0
  788. maxframe/tensor/arithmetic/logical_and.py +79 -0
  789. maxframe/tensor/arithmetic/logical_not.py +72 -0
  790. maxframe/tensor/arithmetic/logical_or.py +80 -0
  791. maxframe/tensor/arithmetic/logical_xor.py +86 -0
  792. maxframe/tensor/arithmetic/lshift.py +80 -0
  793. maxframe/tensor/arithmetic/maximum.py +106 -0
  794. maxframe/tensor/arithmetic/minimum.py +106 -0
  795. maxframe/tensor/arithmetic/mod.py +102 -0
  796. maxframe/tensor/arithmetic/modf.py +87 -0
  797. maxframe/tensor/arithmetic/multiply.py +114 -0
  798. maxframe/tensor/arithmetic/nan_to_num.py +97 -0
  799. maxframe/tensor/arithmetic/negative.py +63 -0
  800. maxframe/tensor/arithmetic/nextafter.py +66 -0
  801. maxframe/tensor/arithmetic/not_equal.py +70 -0
  802. maxframe/tensor/arithmetic/positive.py +45 -0
  803. maxframe/tensor/arithmetic/power.py +104 -0
  804. maxframe/tensor/arithmetic/rad2deg.py +69 -0
  805. maxframe/tensor/arithmetic/radians.py +75 -0
  806. maxframe/tensor/arithmetic/real.py +68 -0
  807. maxframe/tensor/arithmetic/reciprocal.py +78 -0
  808. maxframe/tensor/arithmetic/rint.py +66 -0
  809. maxframe/tensor/arithmetic/rshift.py +79 -0
  810. maxframe/tensor/arithmetic/setimag.py +27 -0
  811. maxframe/tensor/arithmetic/setreal.py +27 -0
  812. maxframe/tensor/arithmetic/sign.py +79 -0
  813. maxframe/tensor/arithmetic/signbit.py +63 -0
  814. maxframe/tensor/arithmetic/sin.py +96 -0
  815. maxframe/tensor/arithmetic/sinc.py +100 -0
  816. maxframe/tensor/arithmetic/sinh.py +91 -0
  817. maxframe/tensor/arithmetic/spacing.py +70 -0
  818. maxframe/tensor/arithmetic/sqrt.py +79 -0
  819. maxframe/tensor/arithmetic/square.py +67 -0
  820. maxframe/tensor/arithmetic/subtract.py +83 -0
  821. maxframe/tensor/arithmetic/tan.py +86 -0
  822. maxframe/tensor/arithmetic/tanh.py +90 -0
  823. maxframe/tensor/arithmetic/tests/__init__.py +13 -0
  824. maxframe/tensor/arithmetic/tests/test_arithmetic.py +449 -0
  825. maxframe/tensor/arithmetic/truediv.py +102 -0
  826. maxframe/tensor/arithmetic/trunc.py +70 -0
  827. maxframe/tensor/arithmetic/utils.py +91 -0
  828. maxframe/tensor/array_utils.py +164 -0
  829. maxframe/tensor/core.py +597 -0
  830. maxframe/tensor/datasource/__init__.py +40 -0
  831. maxframe/tensor/datasource/arange.py +154 -0
  832. maxframe/tensor/datasource/array.py +399 -0
  833. maxframe/tensor/datasource/core.py +114 -0
  834. maxframe/tensor/datasource/diag.py +140 -0
  835. maxframe/tensor/datasource/diagflat.py +69 -0
  836. maxframe/tensor/datasource/empty.py +167 -0
  837. maxframe/tensor/datasource/eye.py +95 -0
  838. maxframe/tensor/datasource/from_dataframe.py +68 -0
  839. maxframe/tensor/datasource/from_dense.py +37 -0
  840. maxframe/tensor/datasource/from_sparse.py +45 -0
  841. maxframe/tensor/datasource/full.py +184 -0
  842. maxframe/tensor/datasource/identity.py +54 -0
  843. maxframe/tensor/datasource/indices.py +115 -0
  844. maxframe/tensor/datasource/linspace.py +140 -0
  845. maxframe/tensor/datasource/meshgrid.py +135 -0
  846. maxframe/tensor/datasource/ones.py +178 -0
  847. maxframe/tensor/datasource/scalar.py +40 -0
  848. maxframe/tensor/datasource/tests/__init__.py +13 -0
  849. maxframe/tensor/datasource/tests/test_datasource.py +310 -0
  850. maxframe/tensor/datasource/tri_array.py +107 -0
  851. maxframe/tensor/datasource/zeros.py +192 -0
  852. maxframe/tensor/extensions/__init__.py +33 -0
  853. maxframe/tensor/extensions/accessor.py +25 -0
  854. maxframe/tensor/extensions/apply_chunk.py +137 -0
  855. maxframe/tensor/extensions/rebalance.py +65 -0
  856. maxframe/tensor/fetch/__init__.py +15 -0
  857. maxframe/tensor/fetch/core.py +54 -0
  858. maxframe/tensor/fft/__init__.py +32 -0
  859. maxframe/tensor/fft/core.py +168 -0
  860. maxframe/tensor/fft/fft.py +112 -0
  861. maxframe/tensor/fft/fft2.py +118 -0
  862. maxframe/tensor/fft/fftfreq.py +80 -0
  863. maxframe/tensor/fft/fftn.py +123 -0
  864. maxframe/tensor/fft/fftshift.py +79 -0
  865. maxframe/tensor/fft/hfft.py +112 -0
  866. maxframe/tensor/fft/ifft.py +114 -0
  867. maxframe/tensor/fft/ifft2.py +115 -0
  868. maxframe/tensor/fft/ifftn.py +123 -0
  869. maxframe/tensor/fft/ifftshift.py +73 -0
  870. maxframe/tensor/fft/ihfft.py +93 -0
  871. maxframe/tensor/fft/irfft.py +118 -0
  872. maxframe/tensor/fft/irfft2.py +62 -0
  873. maxframe/tensor/fft/irfftn.py +114 -0
  874. maxframe/tensor/fft/rfft.py +116 -0
  875. maxframe/tensor/fft/rfft2.py +63 -0
  876. maxframe/tensor/fft/rfftfreq.py +87 -0
  877. maxframe/tensor/fft/rfftn.py +113 -0
  878. maxframe/tensor/indexing/__init__.py +47 -0
  879. maxframe/tensor/indexing/choose.py +198 -0
  880. maxframe/tensor/indexing/compress.py +122 -0
  881. maxframe/tensor/indexing/core.py +190 -0
  882. maxframe/tensor/indexing/extract.py +69 -0
  883. maxframe/tensor/indexing/fill_diagonal.py +180 -0
  884. maxframe/tensor/indexing/flatnonzero.py +58 -0
  885. maxframe/tensor/indexing/getitem.py +144 -0
  886. maxframe/tensor/indexing/nonzero.py +118 -0
  887. maxframe/tensor/indexing/setitem.py +142 -0
  888. maxframe/tensor/indexing/slice.py +32 -0
  889. maxframe/tensor/indexing/take.py +128 -0
  890. maxframe/tensor/indexing/tests/__init__.py +13 -0
  891. maxframe/tensor/indexing/tests/test_indexing.py +232 -0
  892. maxframe/tensor/indexing/unravel_index.py +103 -0
  893. maxframe/tensor/lib/__init__.py +16 -0
  894. maxframe/tensor/lib/index_tricks.py +404 -0
  895. maxframe/tensor/linalg/__init__.py +43 -0
  896. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  897. maxframe/tensor/linalg/cholesky.py +117 -0
  898. maxframe/tensor/linalg/dot.py +145 -0
  899. maxframe/tensor/linalg/einsum.py +339 -0
  900. maxframe/tensor/linalg/inner.py +36 -0
  901. maxframe/tensor/linalg/inv.py +83 -0
  902. maxframe/tensor/linalg/lstsq.py +100 -0
  903. maxframe/tensor/linalg/lu.py +115 -0
  904. maxframe/tensor/linalg/matmul.py +225 -0
  905. maxframe/tensor/linalg/matrix_norm.py +75 -0
  906. maxframe/tensor/linalg/norm.py +249 -0
  907. maxframe/tensor/linalg/qr.py +124 -0
  908. maxframe/tensor/linalg/solve.py +72 -0
  909. maxframe/tensor/linalg/solve_triangular.py +103 -0
  910. maxframe/tensor/linalg/svd.py +167 -0
  911. maxframe/tensor/linalg/tensordot.py +213 -0
  912. maxframe/tensor/linalg/vdot.py +73 -0
  913. maxframe/tensor/linalg/vector_norm.py +113 -0
  914. maxframe/tensor/merge/__init__.py +21 -0
  915. maxframe/tensor/merge/append.py +74 -0
  916. maxframe/tensor/merge/column_stack.py +63 -0
  917. maxframe/tensor/merge/concatenate.py +103 -0
  918. maxframe/tensor/merge/dstack.py +71 -0
  919. maxframe/tensor/merge/hstack.py +70 -0
  920. maxframe/tensor/merge/stack.py +130 -0
  921. maxframe/tensor/merge/tests/__init__.py +13 -0
  922. maxframe/tensor/merge/tests/test_merge.py +79 -0
  923. maxframe/tensor/merge/vstack.py +74 -0
  924. maxframe/tensor/misc/__init__.py +72 -0
  925. maxframe/tensor/misc/argwhere.py +72 -0
  926. maxframe/tensor/misc/array_split.py +46 -0
  927. maxframe/tensor/misc/astype.py +121 -0
  928. maxframe/tensor/misc/atleast_1d.py +72 -0
  929. maxframe/tensor/misc/atleast_2d.py +70 -0
  930. maxframe/tensor/misc/atleast_3d.py +85 -0
  931. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  932. maxframe/tensor/misc/broadcast_to.py +89 -0
  933. maxframe/tensor/misc/copy.py +64 -0
  934. maxframe/tensor/misc/copyto.py +130 -0
  935. maxframe/tensor/misc/delete.py +104 -0
  936. maxframe/tensor/misc/diff.py +115 -0
  937. maxframe/tensor/misc/dsplit.py +68 -0
  938. maxframe/tensor/misc/ediff1d.py +74 -0
  939. maxframe/tensor/misc/expand_dims.py +85 -0
  940. maxframe/tensor/misc/flatten.py +63 -0
  941. maxframe/tensor/misc/flip.py +90 -0
  942. maxframe/tensor/misc/fliplr.py +64 -0
  943. maxframe/tensor/misc/flipud.py +68 -0
  944. maxframe/tensor/misc/hsplit.py +85 -0
  945. maxframe/tensor/misc/in1d.py +94 -0
  946. maxframe/tensor/misc/insert.py +139 -0
  947. maxframe/tensor/misc/isin.py +130 -0
  948. maxframe/tensor/misc/moveaxis.py +83 -0
  949. maxframe/tensor/misc/ndim.py +53 -0
  950. maxframe/tensor/misc/ravel.py +90 -0
  951. maxframe/tensor/misc/repeat.py +129 -0
  952. maxframe/tensor/misc/result_type.py +88 -0
  953. maxframe/tensor/misc/roll.py +124 -0
  954. maxframe/tensor/misc/rollaxis.py +77 -0
  955. maxframe/tensor/misc/searchsorted.py +147 -0
  956. maxframe/tensor/misc/setdiff1d.py +58 -0
  957. maxframe/tensor/misc/shape.py +89 -0
  958. maxframe/tensor/misc/split.py +190 -0
  959. maxframe/tensor/misc/squeeze.py +117 -0
  960. maxframe/tensor/misc/swapaxes.py +113 -0
  961. maxframe/tensor/misc/tests/__init__.py +13 -0
  962. maxframe/tensor/misc/tests/test_misc.py +112 -0
  963. maxframe/tensor/misc/tile.py +109 -0
  964. maxframe/tensor/misc/transpose.py +133 -0
  965. maxframe/tensor/misc/trapezoid.py +123 -0
  966. maxframe/tensor/misc/unique.py +205 -0
  967. maxframe/tensor/misc/vsplit.py +74 -0
  968. maxframe/tensor/misc/where.py +129 -0
  969. maxframe/tensor/operators.py +83 -0
  970. maxframe/tensor/random/__init__.py +166 -0
  971. maxframe/tensor/random/beta.py +87 -0
  972. maxframe/tensor/random/binomial.py +135 -0
  973. maxframe/tensor/random/bytes.py +37 -0
  974. maxframe/tensor/random/chisquare.py +108 -0
  975. maxframe/tensor/random/choice.py +187 -0
  976. maxframe/tensor/random/core.py +249 -0
  977. maxframe/tensor/random/dirichlet.py +121 -0
  978. maxframe/tensor/random/exponential.py +92 -0
  979. maxframe/tensor/random/f.py +133 -0
  980. maxframe/tensor/random/gamma.py +126 -0
  981. maxframe/tensor/random/geometric.py +91 -0
  982. maxframe/tensor/random/gumbel.py +165 -0
  983. maxframe/tensor/random/hypergeometric.py +146 -0
  984. maxframe/tensor/random/laplace.py +131 -0
  985. maxframe/tensor/random/logistic.py +127 -0
  986. maxframe/tensor/random/lognormal.py +157 -0
  987. maxframe/tensor/random/logseries.py +120 -0
  988. maxframe/tensor/random/multinomial.py +131 -0
  989. maxframe/tensor/random/multivariate_normal.py +190 -0
  990. maxframe/tensor/random/negative_binomial.py +123 -0
  991. maxframe/tensor/random/noncentral_chisquare.py +130 -0
  992. maxframe/tensor/random/noncentral_f.py +124 -0
  993. maxframe/tensor/random/normal.py +141 -0
  994. maxframe/tensor/random/pareto.py +138 -0
  995. maxframe/tensor/random/permutation.py +107 -0
  996. maxframe/tensor/random/poisson.py +109 -0
  997. maxframe/tensor/random/power.py +140 -0
  998. maxframe/tensor/random/rand.py +80 -0
  999. maxframe/tensor/random/randint.py +119 -0
  1000. maxframe/tensor/random/randn.py +94 -0
  1001. maxframe/tensor/random/random_integers.py +121 -0
  1002. maxframe/tensor/random/random_sample.py +84 -0
  1003. maxframe/tensor/random/rayleigh.py +108 -0
  1004. maxframe/tensor/random/shuffle.py +61 -0
  1005. maxframe/tensor/random/standard_cauchy.py +103 -0
  1006. maxframe/tensor/random/standard_exponential.py +70 -0
  1007. maxframe/tensor/random/standard_gamma.py +118 -0
  1008. maxframe/tensor/random/standard_normal.py +72 -0
  1009. maxframe/tensor/random/standard_t.py +133 -0
  1010. maxframe/tensor/random/tests/__init__.py +13 -0
  1011. maxframe/tensor/random/tests/test_random.py +165 -0
  1012. maxframe/tensor/random/triangular.py +117 -0
  1013. maxframe/tensor/random/uniform.py +129 -0
  1014. maxframe/tensor/random/vonmises.py +129 -0
  1015. maxframe/tensor/random/wald.py +112 -0
  1016. maxframe/tensor/random/weibull.py +138 -0
  1017. maxframe/tensor/random/zipf.py +120 -0
  1018. maxframe/tensor/rechunk/__init__.py +26 -0
  1019. maxframe/tensor/rechunk/rechunk.py +43 -0
  1020. maxframe/tensor/reduction/__init__.py +64 -0
  1021. maxframe/tensor/reduction/all.py +101 -0
  1022. maxframe/tensor/reduction/allclose.py +86 -0
  1023. maxframe/tensor/reduction/any.py +103 -0
  1024. maxframe/tensor/reduction/argmax.py +101 -0
  1025. maxframe/tensor/reduction/argmin.py +101 -0
  1026. maxframe/tensor/reduction/array_equal.py +63 -0
  1027. maxframe/tensor/reduction/core.py +166 -0
  1028. maxframe/tensor/reduction/count_nonzero.py +80 -0
  1029. maxframe/tensor/reduction/cumprod.py +95 -0
  1030. maxframe/tensor/reduction/cumsum.py +99 -0
  1031. maxframe/tensor/reduction/max.py +118 -0
  1032. maxframe/tensor/reduction/mean.py +122 -0
  1033. maxframe/tensor/reduction/min.py +118 -0
  1034. maxframe/tensor/reduction/nanargmax.py +80 -0
  1035. maxframe/tensor/reduction/nanargmin.py +74 -0
  1036. maxframe/tensor/reduction/nancumprod.py +89 -0
  1037. maxframe/tensor/reduction/nancumsum.py +92 -0
  1038. maxframe/tensor/reduction/nanmax.py +109 -0
  1039. maxframe/tensor/reduction/nanmean.py +105 -0
  1040. maxframe/tensor/reduction/nanmin.py +109 -0
  1041. maxframe/tensor/reduction/nanprod.py +92 -0
  1042. maxframe/tensor/reduction/nanstd.py +124 -0
  1043. maxframe/tensor/reduction/nansum.py +113 -0
  1044. maxframe/tensor/reduction/nanvar.py +149 -0
  1045. maxframe/tensor/reduction/prod.py +128 -0
  1046. maxframe/tensor/reduction/std.py +132 -0
  1047. maxframe/tensor/reduction/sum.py +123 -0
  1048. maxframe/tensor/reduction/tests/__init__.py +13 -0
  1049. maxframe/tensor/reduction/tests/test_reduction.py +189 -0
  1050. maxframe/tensor/reduction/var.py +176 -0
  1051. maxframe/tensor/reshape/__init__.py +15 -0
  1052. maxframe/tensor/reshape/reshape.py +192 -0
  1053. maxframe/tensor/reshape/tests/__init__.py +13 -0
  1054. maxframe/tensor/reshape/tests/test_reshape.py +35 -0
  1055. maxframe/tensor/sort/__init__.py +18 -0
  1056. maxframe/tensor/sort/argpartition.py +98 -0
  1057. maxframe/tensor/sort/argsort.py +150 -0
  1058. maxframe/tensor/sort/partition.py +228 -0
  1059. maxframe/tensor/sort/sort.py +295 -0
  1060. maxframe/tensor/spatial/__init__.py +15 -0
  1061. maxframe/tensor/spatial/distance/__init__.py +17 -0
  1062. maxframe/tensor/spatial/distance/cdist.py +421 -0
  1063. maxframe/tensor/spatial/distance/pdist.py +398 -0
  1064. maxframe/tensor/spatial/distance/squareform.py +153 -0
  1065. maxframe/tensor/special/__init__.py +175 -0
  1066. maxframe/tensor/special/airy.py +55 -0
  1067. maxframe/tensor/special/bessel.py +199 -0
  1068. maxframe/tensor/special/core.py +99 -0
  1069. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  1070. maxframe/tensor/special/ellip_harm.py +55 -0
  1071. maxframe/tensor/special/err_fresnel.py +223 -0
  1072. maxframe/tensor/special/gamma_funcs.py +303 -0
  1073. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  1074. maxframe/tensor/special/info_theory.py +189 -0
  1075. maxframe/tensor/special/misc.py +163 -0
  1076. maxframe/tensor/special/statistical.py +56 -0
  1077. maxframe/tensor/statistics/__init__.py +24 -0
  1078. maxframe/tensor/statistics/average.py +143 -0
  1079. maxframe/tensor/statistics/bincount.py +133 -0
  1080. maxframe/tensor/statistics/corrcoef.py +77 -0
  1081. maxframe/tensor/statistics/cov.py +222 -0
  1082. maxframe/tensor/statistics/digitize.py +126 -0
  1083. maxframe/tensor/statistics/histogram.py +520 -0
  1084. maxframe/tensor/statistics/median.py +85 -0
  1085. maxframe/tensor/statistics/percentile.py +175 -0
  1086. maxframe/tensor/statistics/ptp.py +89 -0
  1087. maxframe/tensor/statistics/quantile.py +290 -0
  1088. maxframe/tensor/ufunc/__init__.py +24 -0
  1089. maxframe/tensor/ufunc/ufunc.py +198 -0
  1090. maxframe/tensor/utils.py +716 -0
  1091. maxframe/tests/__init__.py +13 -0
  1092. maxframe/tests/test_protocol.py +178 -0
  1093. maxframe/tests/test_udf.py +61 -0
  1094. maxframe/tests/test_utils.py +618 -0
  1095. maxframe/tests/utils.py +245 -0
  1096. maxframe/typing_.py +42 -0
  1097. maxframe/udf.py +356 -0
  1098. maxframe/utils.py +1774 -0
  1099. maxframe-2.3.0.dist-info/METADATA +109 -0
  1100. maxframe-2.3.0.dist-info/RECORD +1117 -0
  1101. maxframe-2.3.0.dist-info/WHEEL +6 -0
  1102. maxframe-2.3.0.dist-info/top_level.txt +3 -0
  1103. maxframe_client/__init__.py +16 -0
  1104. maxframe_client/clients/__init__.py +13 -0
  1105. maxframe_client/clients/framedriver.py +137 -0
  1106. maxframe_client/conftest.py +15 -0
  1107. maxframe_client/fetcher.py +411 -0
  1108. maxframe_client/session/__init__.py +22 -0
  1109. maxframe_client/session/consts.py +39 -0
  1110. maxframe_client/session/graph.py +125 -0
  1111. maxframe_client/session/odps.py +802 -0
  1112. maxframe_client/session/task.py +329 -0
  1113. maxframe_client/session/tests/__init__.py +13 -0
  1114. maxframe_client/session/tests/test_task.py +115 -0
  1115. maxframe_client/tests/__init__.py +13 -0
  1116. maxframe_client/tests/test_fetcher.py +180 -0
  1117. maxframe_client/tests/test_session.py +409 -0
@@ -0,0 +1,1265 @@
1
+ # distutils: language = c++
2
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ import asyncio
17
+ import contextvars
18
+ import copy
19
+ import datetime
20
+ import hashlib
21
+ import importlib
22
+ import os
23
+ import re
24
+ from collections import OrderedDict
25
+ from functools import partial, wraps
26
+ from typing import Any, Dict, List, Optional, Union
27
+
28
+ import numpy as np
29
+ import pandas as pd
30
+
31
+ from cpython cimport PyObject
32
+ from libc.stdint cimport int32_t, int64_t, uint32_t, uint64_t, uintptr_t
33
+ from libcpp.unordered_map cimport unordered_map
34
+
35
+ from pandas.api.extensions import ExtensionDtype
36
+ from pandas.api.types import pandas_dtype
37
+
38
+ from .._utils import NamedType
39
+
40
+ from .._utils cimport TypeDispatcher
41
+
42
+ from ..lib import wrapped_pickle as pickle
43
+ from ..lib.dtypes_extension import ArrowDtype
44
+ from ..utils import NoDefault, arrow_type_from_str, no_default, str_to_bool
45
+
46
+ # resolve pandas pickle compatibility between <1.2 and >=1.3
47
+ try:
48
+ from pandas.core.internals import blocks as pd_blocks
49
+ if not hasattr(pd_blocks, "new_block") and hasattr(pd_blocks, "make_block"):
50
+ # register missing func that would cause errors
51
+ pd_blocks.new_block = pd_blocks.make_block
52
+ except (ImportError, AttributeError):
53
+ pass
54
+
55
+ try:
56
+ import pyarrow as pa
57
+ except ImportError:
58
+ pa = None
59
+
60
+ try:
61
+ import pytz
62
+ from pytz import BaseTzInfo as PyTZ_BaseTzInfo
63
+ except ImportError:
64
+ PyTZ_BaseTzInfo = type(None)
65
+ try:
66
+ import zoneinfo
67
+ from zoneinfo import ZoneInfo
68
+ except ImportError:
69
+ ZoneInfo = type(None)
70
+
71
+ BUFFER_PICKLE_PROTOCOL = max(pickle.DEFAULT_PROTOCOL, 5)
72
+ cdef bint HAS_PICKLE_BUFFER = pickle.HIGHEST_PROTOCOL >= 5
73
+ cdef bint _PANDAS_HAS_MGR = hasattr(pd.Series([0]), "_mgr")
74
+ cdef bint _ARROW_DTYPE_NOT_SUPPORTED = ArrowDtype is None
75
+
76
+
77
+ cdef TypeDispatcher _serial_dispatcher = TypeDispatcher()
78
+ cdef dict _deserializers = dict()
79
+
80
+ cdef uint32_t _MAX_STR_PRIMITIVE_LEN = 1024
81
+ # prime modulus for serializer ids
82
+ # use the largest prime number smaller than 32767
83
+ cdef int32_t _SERIALIZER_ID_PRIME = 32749
84
+
85
+ # ids for basic serializers
86
+ cdef:
87
+ int PICKLE_SERIALIZER = 0
88
+ int PRIMITIVE_SERIALIZER = 1
89
+ int BYTES_SERIALIZER = 2
90
+ int STR_SERIALIZER = 3
91
+ int TUPLE_SERIALIZER = 4
92
+ int LIST_SERIALIZER = 5
93
+ int DICT_SERIALIZER = 6
94
+ int PY_DATETIME_SERIALIZER = 7
95
+ int PY_DATE_SERIALIZER = 8
96
+ int PY_TIMEDELTA_SERIALIZER = 9
97
+ int PY_TZINFO_SERIALIZER = 10
98
+ int DTYPE_SERIALIZER = 11
99
+ int COMPLEX_SERIALIZER = 12
100
+ int SLICE_SERIALIZER = 13
101
+ int REGEX_SERIALIZER = 14
102
+ int NO_DEFAULT_SERIALIZER = 15
103
+ int ARROW_BUFFER_SERIALIZER = 16
104
+ int RANGE_SERIALIZER = 17
105
+ int PLACEHOLDER_SERIALIZER = 4096
106
+
107
+
108
+ cdef dict _type_cache = dict()
109
+
110
+
111
+ cdef object pickle_serial_hook = contextvars.ContextVar("pickle_serial_hook", default=None)
112
+ cdef object pickle_deserial_hook = contextvars.ContextVar("pickle_deserial_hook", default=None)
113
+
114
+ cdef class PickleHookOptions:
115
+ cdef:
116
+ object _serial_hook
117
+ object _pre_serial_hook
118
+ object _deserial_hook
119
+ object _pre_deserial_hook
120
+
121
+ def __init__(self, serial_hook: object = None, deserial_hook: object = None):
122
+ self._serial_hook = serial_hook
123
+ self._deserial_hook = deserial_hook
124
+
125
+ def __enter__(self):
126
+ self._pre_serial_hook = pickle_serial_hook.set(self._serial_hook)
127
+ self._pre_deserial_hook = pickle_deserial_hook.set(self._deserial_hook)
128
+
129
+ def __exit__(self, exc_type, exc_val, exc_tb):
130
+ pickle_serial_hook.reset(self._pre_serial_hook)
131
+ pickle_deserial_hook.reset(self._pre_deserial_hook)
132
+
133
+
134
+ cdef bint unpickle_allowed
135
+
136
+
137
+ def reload_unpickle_flag():
138
+ global unpickle_allowed
139
+ unpickle_allowed = str_to_bool(
140
+ os.getenv("MAXFRAME_SERIALIZE_UNPICKLE_ALLOWED", "1")
141
+ )
142
+
143
+
144
+ reload_unpickle_flag()
145
+
146
+
147
+ cdef object _load_by_name(str class_name):
148
+ if class_name in _type_cache:
149
+ cls = _type_cache[class_name]
150
+ else:
151
+ try:
152
+ from .deserializer import safe_load_by_name
153
+
154
+ cls = safe_load_by_name(class_name)
155
+ except ImportError:
156
+ if pickle.is_unpickle_forbidden():
157
+ raise
158
+
159
+ mod_name, cls_name = class_name.rsplit("#", 1)
160
+
161
+ try:
162
+ cls = importlib.import_module(mod_name)
163
+ except ImportError as ex:
164
+ raise ImportError(
165
+ f"Failed to import {mod_name} when loading "
166
+ f"class {class_name}, {ex}"
167
+ ) from None
168
+
169
+ for sub_cls_name in cls_name.split("."):
170
+ cls = getattr(cls, sub_cls_name)
171
+ _type_cache[class_name] = cls
172
+ return cls
173
+
174
+
175
+ cpdef object load_type(str class_name, object parent_class):
176
+ cls = _load_by_name(class_name)
177
+ if not isinstance(cls, type):
178
+ raise ValueError(f"Class {class_name} not a type, cannot be deserialized")
179
+ if not issubclass(cls, parent_class):
180
+ raise ValueError(f"Class {class_name} not a {parent_class}")
181
+ return cls
182
+
183
+
184
+ cpdef object load_member(str class_name, object restrict_type):
185
+ member = _load_by_name(class_name)
186
+ if not isinstance(member, restrict_type):
187
+ raise ValueError(
188
+ f"Class {class_name} not a {restrict_type}, cannot be deserialized"
189
+ )
190
+ return member
191
+
192
+
193
+ cpdef void clear_type_cache():
194
+ _type_cache.clear()
195
+
196
+
197
+ cdef Serializer get_deserializer(int32_t deserializer_id):
198
+ return _deserializers[deserializer_id]
199
+
200
+
201
+ cdef class Serializer:
202
+ serializer_id = None
203
+ _public_data_context_key = 0x7fffffff - 1
204
+
205
+ def __cinit__(self):
206
+ # make the value can be referenced with C code
207
+ self._serializer_id = self.serializer_id
208
+
209
+ cpdef bint is_public_data_exist(self, dict context, object key):
210
+ cdef dict public_dict = context.get(self._public_data_context_key, None)
211
+ if public_dict is None:
212
+ return False
213
+ return key in public_dict
214
+
215
+ cpdef put_public_data(self, dict context, object key, object value):
216
+ cdef dict public_dict = context.get(self._public_data_context_key, None)
217
+ if public_dict is None:
218
+ public_dict = context[self._public_data_context_key] = {}
219
+ public_dict[key] = value
220
+
221
+ cpdef get_public_data(self, dict context, object key):
222
+ cdef dict public_dict = context.get(self._public_data_context_key, None)
223
+ if public_dict is None:
224
+ return None
225
+ return public_dict.get(key)
226
+
227
+ cpdef serial(self, object obj, dict context):
228
+ """
229
+ Returns intermediate serialization result of certain object.
230
+ The returned value can be a Placeholder or a tuple comprising
231
+ of three parts: a header, a group of subcomponents and
232
+ a finalizing flag.
233
+
234
+ * Header is a pickle-serializable tuple
235
+ * Subcomponents are parts or buffers for iterative
236
+ serialization.
237
+ * Flag is a boolean value. If true, subcomponents should be
238
+ buffers (for instance, bytes, memory views, GPU buffers,
239
+ etc.) that can be read and written directly. If false,
240
+ subcomponents will be serialized iteratively.
241
+
242
+ Parameters
243
+ ----------
244
+ obj: Any
245
+ Object to serialize
246
+ context: Dict
247
+ Serialization context to help creating Placeholder objects
248
+ for reducing duplicated serialization
249
+
250
+ Returns
251
+ -------
252
+ result: Placeholder | Tuple[Tuple, List, bool]
253
+ Intermediate result of serialization
254
+ """
255
+ raise NotImplementedError
256
+
257
+ cpdef deserial(self, list serialized, dict context, list subs):
258
+ """
259
+ Returns deserialized object given serialized headers and
260
+ deserialized subcomponents.
261
+
262
+ Parameters
263
+ ----------
264
+ serialized: List
265
+ Serialized object header as a tuple
266
+ context
267
+ Serialization context for instantiation of Placeholder
268
+ objects
269
+ subs: List
270
+ Deserialized subcomponents
271
+
272
+ Returns
273
+ -------
274
+ result: Any
275
+ Deserialized objects
276
+ """
277
+ raise NotImplementedError
278
+
279
+ cpdef on_deserial_error(
280
+ self,
281
+ list serialized,
282
+ dict context,
283
+ list subs_serialized,
284
+ int error_index,
285
+ object exc,
286
+ ):
287
+ """
288
+ Returns rewritten exception when subcomponent deserialization fails
289
+
290
+ Parameters
291
+ ----------
292
+ serialized: List
293
+ Serialized object header as a tuple
294
+ context
295
+ Serialization context for instantiation of Placeholder
296
+ objects
297
+ subs_serialized: List
298
+ Serialized subcomponents
299
+ error_index: int
300
+ Index of subcomponent causing error
301
+ exc: BaseException
302
+ Exception raised
303
+
304
+ Returns
305
+ -------
306
+ exc: BaseException | None
307
+ Rewritten exception. If None, original exception is kept.
308
+ """
309
+ return None
310
+
311
+ @classmethod
312
+ def calc_default_serializer_id(cls):
313
+ s = f"{cls.__module__}.{cls.__qualname__}"
314
+ h = hashlib.md5(s.encode())
315
+ return int(h.hexdigest(), 16) % _SERIALIZER_ID_PRIME
316
+
317
+ @classmethod
318
+ def register(cls, obj_type, name=None):
319
+ if (
320
+ cls.serializer_id is None
321
+ or cls.serializer_id == getattr(super(cls, cls), "serializer_id", None)
322
+ ):
323
+ # a class should have its own serializer_id
324
+ # inherited serializer_id not acceptable
325
+ cls.serializer_id = cls.calc_default_serializer_id()
326
+
327
+ inst = cls()
328
+ if name is not None:
329
+ obj_type = NamedType(name, obj_type)
330
+ _serial_dispatcher.register(obj_type, inst)
331
+ if _deserializers.get(cls.serializer_id) is not None:
332
+ assert type(_deserializers[cls.serializer_id]) is cls
333
+ else:
334
+ _deserializers[cls.serializer_id] = inst
335
+
336
+ @classmethod
337
+ def unregister(cls, obj_type, name=None):
338
+ if name is not None:
339
+ obj_type = NamedType(name, obj_type)
340
+ _serial_dispatcher.unregister(obj_type)
341
+ _deserializers.pop(cls.serializer_id, None)
342
+
343
+ @classmethod
344
+ def dump_handlers(cls):
345
+ return _serial_dispatcher.dump_handlers()
346
+
347
+ @classmethod
348
+ def load_handlers(cls, *args):
349
+ _serial_dispatcher.load_handlers(*args)
350
+
351
+
352
+ cdef inline uint64_t _fast_id(PyObject * obj) nogil:
353
+ return <uintptr_t>obj
354
+
355
+
356
+ def fast_id(obj):
357
+ """C version of id() used for serialization"""
358
+ return _fast_id(<PyObject *>obj)
359
+
360
+
361
+ def buffered(func):
362
+ """
363
+ Wrapper for serial() method to reduce duplicated serialization
364
+ """
365
+ @wraps(func)
366
+ def wrapped(self, obj: Any, dict context):
367
+ cdef uint64_t obj_id = _fast_id(<PyObject*>obj)
368
+ if obj_id in context:
369
+ return Placeholder(_fast_id(<PyObject*>obj))
370
+ else:
371
+ context[obj_id] = obj
372
+ return func(self, obj, context)
373
+
374
+ return wrapped
375
+
376
+
377
+ def pickle_buffers(obj):
378
+ cdef list buffers = [None]
379
+
380
+ if HAS_PICKLE_BUFFER:
381
+
382
+ def buffer_cb(x):
383
+ x = x.raw()
384
+ if x.ndim > 1:
385
+ # ravel n-d memoryview
386
+ x = x.cast(x.format)
387
+ buffers.append(memoryview(x))
388
+
389
+ buffers[0] = pickle.dumps(
390
+ obj,
391
+ buffer_callback=buffer_cb,
392
+ protocol=BUFFER_PICKLE_PROTOCOL,
393
+ )
394
+ else: # pragma: no cover
395
+ buffers[0] = pickle.dumps(obj)
396
+ return buffers
397
+
398
+
399
+ def unpickle_buffers(buffers):
400
+ result = pickle.loads(buffers[0], buffers=buffers[1:])
401
+
402
+ # as pandas prior to 1.1.0 use _data instead of _mgr to hold BlockManager,
403
+ # deserializing from high versions may produce mal-functioned pandas objects,
404
+ # thus the patch is needed
405
+ if _PANDAS_HAS_MGR:
406
+ return result
407
+ else: # pragma: no cover
408
+ if hasattr(result, "_mgr") and isinstance(result, (pd.DataFrame, pd.Series)):
409
+ result._data = getattr(result, "_mgr")
410
+ delattr(result, "_mgr")
411
+ return result
412
+
413
+
414
+ cdef class PickleContainer:
415
+ cdef:
416
+ list buffers
417
+
418
+ def __init__(self, list buffers):
419
+ self.buffers = buffers
420
+
421
+ cpdef get(self):
422
+ if not unpickle_allowed:
423
+ raise ValueError("Unpickle not allowed in this environment")
424
+ return unpickle_buffers(self.buffers)
425
+
426
+ cpdef list get_buffers(self):
427
+ return self.buffers
428
+
429
+ def __copy__(self):
430
+ return PickleContainer(self.buffers)
431
+
432
+ def __deepcopy__(self, memo=None):
433
+ return PickleContainer(copy.deepcopy(self.buffers, memo))
434
+
435
+ def __maxframe_tokenize__(self):
436
+ return self.buffers
437
+
438
+ def __reduce__(self):
439
+ return PickleContainer, (self.buffers, )
440
+
441
+
442
+ cdef class PickleSerializer(Serializer):
443
+ serializer_id = PICKLE_SERIALIZER
444
+
445
+ cpdef serial(self, obj: Any, dict context):
446
+ cdef uint64_t obj_id
447
+ cdef object serial_hook
448
+
449
+ serial_hook = pickle_serial_hook.get()
450
+ if serial_hook is not None:
451
+ serial_hook()
452
+
453
+ obj_id = _fast_id(<PyObject*>obj)
454
+ if obj_id in context:
455
+ return Placeholder(obj_id)
456
+ context[obj_id] = obj
457
+
458
+ if type(obj) is PickleContainer:
459
+ return [], (<PickleContainer>obj).get_buffers(), True
460
+ return [], pickle_buffers(obj), True
461
+
462
+ cpdef deserial(self, list serialized, dict context, list subs):
463
+ from .deserializer import deserial_pickle
464
+ cdef object deserial_hook
465
+
466
+ deserial_hook = pickle_deserial_hook.get()
467
+ if deserial_hook is not None:
468
+ deserial_hook()
469
+ return deserial_pickle(serialized, context, subs)
470
+
471
+
472
+ cdef set _primitive_types = {
473
+ type(None),
474
+ bool,
475
+ int,
476
+ float,
477
+ }
478
+
479
+
480
+ cdef class PrimitiveSerializer(Serializer):
481
+ serializer_id = PRIMITIVE_SERIALIZER
482
+
483
+ cpdef serial(self, object obj, dict context):
484
+ return [obj,], [], True
485
+
486
+ cpdef deserial(self, list obj, dict context, list subs):
487
+ return obj[0]
488
+
489
+
490
+ cdef class BytesSerializer(Serializer):
491
+ serializer_id = BYTES_SERIALIZER
492
+
493
+ cpdef serial(self, obj: Any, dict context):
494
+ cdef uint64_t obj_id
495
+ obj_id = _fast_id(<PyObject*>obj)
496
+ if obj_id in context:
497
+ return Placeholder(obj_id)
498
+ context[obj_id] = obj
499
+
500
+ return [], [obj], True
501
+
502
+ cpdef deserial(self, list serialized, dict context, list subs):
503
+ return subs[0]
504
+
505
+
506
+ cdef class StrSerializer(Serializer):
507
+ serializer_id = STR_SERIALIZER
508
+
509
+ cpdef serial(self, obj: Any, dict context):
510
+ cdef uint64_t obj_id
511
+ obj_id = _fast_id(<PyObject*>obj)
512
+ if obj_id in context:
513
+ return Placeholder(obj_id)
514
+ context[obj_id] = obj
515
+
516
+ return [], [(<str>obj).encode()], True
517
+
518
+ cpdef deserial(self, list serialized, dict context, list subs):
519
+ buffer = subs[0]
520
+ if type(buffer) is memoryview:
521
+ buffer = buffer.tobytes()
522
+ return buffer.decode()
523
+
524
+
525
+ cdef class CollectionSerializer(Serializer):
526
+ obj_type = None
527
+
528
+ cdef object _obj_type
529
+
530
+ def __cinit__(self):
531
+ # make the value can be referenced with C code
532
+ self._obj_type = self.obj_type
533
+
534
+ cdef tuple _serial_iterable(self, obj: Any):
535
+ cdef list idx_to_propagate = []
536
+ cdef list obj_to_propagate = []
537
+ cdef list obj_list = <list>obj if type(obj) is list else list(obj)
538
+ cdef int64_t idx
539
+ cdef object item
540
+
541
+ for idx in range(len(obj_list)):
542
+ item = obj_list[idx]
543
+
544
+ if type(item) is bytes and len(<bytes>item) < _MAX_STR_PRIMITIVE_LEN:
545
+ # treat short strings as primitives
546
+ continue
547
+ elif type(item) is str and len(<str>item) < _MAX_STR_PRIMITIVE_LEN:
548
+ # treat short strings as primitives
549
+ continue
550
+ elif type(item) in _primitive_types:
551
+ continue
552
+
553
+ if obj is obj_list:
554
+ obj_list = list(obj)
555
+
556
+ obj_list[idx] = None
557
+ idx_to_propagate.append(idx)
558
+ obj_to_propagate.append(item)
559
+
560
+ return [obj_list, idx_to_propagate], obj_to_propagate, False
561
+
562
+ cpdef serial(self, obj: Any, dict context):
563
+ cdef uint64_t obj_id
564
+ obj_id = _fast_id(<PyObject*>obj)
565
+ if obj_id in context:
566
+ return Placeholder(obj_id)
567
+ context[obj_id] = obj
568
+
569
+ return self._serial_iterable(obj)
570
+
571
+ cdef list _deserial_iterable(self, list serialized, list subs):
572
+ cdef list res_list, idx_to_propagate
573
+ cdef int64_t i
574
+
575
+ res_list, idx_to_propagate = serialized
576
+
577
+ for i in range(len(idx_to_propagate)):
578
+ res_list[idx_to_propagate[i]] = subs[i]
579
+ return res_list
580
+
581
+
582
+ cdef class TupleSerializer(CollectionSerializer):
583
+ serializer_id = TUPLE_SERIALIZER
584
+ obj_type = tuple
585
+
586
+ cpdef serial(self, obj: Any, dict context):
587
+ cdef uint64_t obj_id
588
+ cdef list header
589
+ cdef object data, is_leaf
590
+
591
+ obj_id = _fast_id(<PyObject*>obj)
592
+ if obj_id in context:
593
+ return Placeholder(obj_id)
594
+ context[obj_id] = obj
595
+
596
+ header, data, is_leaf = self._serial_iterable(obj)
597
+ if hasattr(type(obj), "_fields"):
598
+ header.append(type(obj).__module__ + "#" + type(obj).__qualname__)
599
+ else:
600
+ header.append(None)
601
+ return header, data, is_leaf
602
+
603
+ cpdef deserial(self, list serialized, dict context, list subs):
604
+ cdef list res
605
+ cdef str tuple_type_name = serialized[-1]
606
+
607
+ res = self._deserial_iterable(serialized[:-1], subs)
608
+ for v in res:
609
+ assert type(v) is not Placeholder
610
+
611
+ if tuple_type_name is None:
612
+ return tuple(res)
613
+ else:
614
+ tuple_type = load_type(tuple_type_name, tuple)
615
+ return tuple_type(*res)
616
+
617
+
618
+ cdef class ListSerializer(CollectionSerializer):
619
+ serializer_id = LIST_SERIALIZER
620
+ obj_type = list
621
+
622
+ cpdef deserial(self, list serialized, dict context, list subs):
623
+ cdef int64_t idx
624
+ cdef list res = self._deserial_iterable(serialized, subs)
625
+
626
+ result = list(res)
627
+
628
+ for idx, v in enumerate(res):
629
+ if type(v) is Placeholder:
630
+ cb = partial(result.__setitem__, idx)
631
+ (<Placeholder>v).callbacks.append(cb)
632
+ return result
633
+
634
+
635
+ def _dict_key_replacer(ret, key, real_key):
636
+ ret[real_key] = ret.pop(key)
637
+
638
+
639
+ def _dict_value_replacer(context, ret, key, real_value):
640
+ if type(key) is Placeholder:
641
+ key = context[(<Placeholder>key).id]
642
+ ret[key] = real_value
643
+
644
+
645
+ cdef:
646
+ object _TYPE_CHAR_ORDERED_DICT = "O"
647
+
648
+
649
+ cdef class DictSerializer(CollectionSerializer):
650
+ serializer_id = DICT_SERIALIZER
651
+
652
+ cpdef serial(self, obj: Any, dict context):
653
+ cdef uint64_t obj_id
654
+ cdef list key_obj, value_obj
655
+ cdef list key_bufs, value_bufs
656
+
657
+ if type(obj) is dict and len(<dict>obj) == 0:
658
+ return [], [], True
659
+
660
+ obj_id = _fast_id(<PyObject*>obj)
661
+ if obj_id in context:
662
+ return Placeholder(obj_id)
663
+ context[obj_id] = obj
664
+
665
+ if isinstance(obj, OrderedDict):
666
+ ser_type = _TYPE_CHAR_ORDERED_DICT
667
+ else:
668
+ ser_type = None
669
+
670
+ key_obj, key_bufs, _ = self._serial_iterable(obj.keys())
671
+ value_obj, value_bufs, _ = self._serial_iterable(obj.values())
672
+ ser_obj = [key_obj, value_obj, len(key_bufs), ser_type]
673
+ return ser_obj, key_bufs + value_bufs, False
674
+
675
+ cpdef deserial(self, list serialized, dict context, list subs):
676
+ cdef int64_t i, num_key_bufs
677
+ cdef list key_subs, value_subs, keys, values
678
+
679
+ if not serialized:
680
+ return {}
681
+ if len(serialized) == 1:
682
+ # serialized directly
683
+ return serialized[0]
684
+
685
+ key_serialized, value_serialized, num_key_bufs, ser_type = serialized
686
+ key_subs = subs[:num_key_bufs]
687
+ value_subs = subs[num_key_bufs:]
688
+
689
+ keys = self._deserial_iterable(<list>key_serialized, key_subs)
690
+ values = self._deserial_iterable(<list>value_serialized, value_subs)
691
+
692
+ if ser_type == _TYPE_CHAR_ORDERED_DICT:
693
+ ret = OrderedDict(zip(keys, values))
694
+ else:
695
+ ret = dict(zip(keys, values))
696
+
697
+ for i in range(len(keys)):
698
+ k, v = keys[i], values[i]
699
+ if type(k) is Placeholder:
700
+ (<Placeholder>k).callbacks.append(
701
+ partial(_dict_key_replacer, ret, k)
702
+ )
703
+ if type(v) is Placeholder:
704
+ (<Placeholder>v).callbacks.append(
705
+ partial(_dict_value_replacer, context, ret, k)
706
+ )
707
+ return ret
708
+
709
+
710
+ cdef class PyDatetimeSerializer(Serializer):
711
+ serializer_id = PY_DATETIME_SERIALIZER
712
+
713
+ cpdef serial(self, obj: datetime.datetime, dict context):
714
+ cdef list ser_tz = (
715
+ _serial_tz(obj.tzinfo) if obj.tzinfo is not None else None
716
+ )
717
+ return [obj.timestamp(), ser_tz], [], True
718
+
719
+ cpdef deserial(self, list serialized, dict context, list subs):
720
+ cdef object tz = (
721
+ _deserialize_tz(serialized[1]) if serialized[1] is not None else None
722
+ )
723
+ return datetime.datetime.fromtimestamp(serialized[0], tz)
724
+
725
+
726
+ cdef class PyDateSerializer(Serializer):
727
+ serializer_id = PY_DATE_SERIALIZER
728
+
729
+ cpdef serial(self, obj: datetime.date, dict context):
730
+ return [obj.toordinal()], [], True
731
+
732
+ cpdef deserial(self, list serialized, dict context, list subs):
733
+ return datetime.date.fromordinal(serialized[0])
734
+
735
+
736
+ cdef class PyTimedeltaSerializer(Serializer):
737
+ serializer_id = PY_TIMEDELTA_SERIALIZER
738
+
739
+ cpdef serial(self, obj: datetime.timedelta, dict context):
740
+ return [obj.days, obj.seconds, obj.microseconds], [], True
741
+
742
+ cpdef deserial(self, list serialized, dict context, list subs):
743
+ return datetime.timedelta(
744
+ days=serialized[0],
745
+ seconds=serialized[1],
746
+ microseconds=serialized[2],
747
+ )
748
+
749
+
750
+ cdef:
751
+ object _TYPE_CHAR_TZ_BASE = "S"
752
+ object _TYPE_CHAR_TZ_ZONEINFO = "ZI"
753
+ object _TYPE_CHAR_TZ_PYTZ = "PT"
754
+
755
+
756
+ cdef inline list _serial_tz(
757
+ obj: datetime.tzinfo, dt: Optional[datetime.datetime] = None
758
+ ):
759
+ cdef object type_char
760
+ if isinstance(obj, PyTZ_BaseTzInfo):
761
+ return [_TYPE_CHAR_TZ_PYTZ, obj.zone]
762
+ elif isinstance(obj, ZoneInfo):
763
+ return [_TYPE_CHAR_TZ_ZONEINFO, obj.key]
764
+ else:
765
+ dt = dt or datetime.datetime.now()
766
+ return [
767
+ _TYPE_CHAR_TZ_BASE,
768
+ obj.tzname(dt),
769
+ int(obj.utcoffset(dt).total_seconds()),
770
+ ]
771
+
772
+
773
+ cdef inline object _deserialize_tz(list serialized):
774
+ if serialized[0] == _TYPE_CHAR_TZ_PYTZ:
775
+ return pytz.timezone(serialized[1])
776
+ elif serialized[0] == _TYPE_CHAR_TZ_ZONEINFO:
777
+ return zoneinfo.ZoneInfo(serialized[1])
778
+ else:
779
+ if serialized[2] == 0:
780
+ return datetime.timezone.utc
781
+ return datetime.timezone(
782
+ datetime.timedelta(seconds=serialized[2]), name=serialized[1]
783
+ )
784
+
785
+
786
+ cdef class TZInfoSerializer(Serializer):
787
+ serializer_id = PY_TZINFO_SERIALIZER
788
+
789
+ cpdef serial(self, object obj: datetime.tzinfo, dict context):
790
+ return _serial_tz(obj), [], True
791
+
792
+ cpdef deserial(self, list serialized, dict context, list subs):
793
+ return _deserialize_tz(serialized)
794
+
795
+
796
+ cdef:
797
+ object _TYPE_CHAR_DTYPE_NUMPY = "N"
798
+ object _TYPE_CHAR_DTYPE_PANDAS_ARROW = "PA"
799
+ object _TYPE_CHAR_DTYPE_PANDAS_CATEGORICAL = "PC"
800
+ object _TYPE_CHAR_DTYPE_PANDAS_INTERVAL = "PI"
801
+ object _TYPE_CHAR_DTYPE_PANDAS_EXTENSION = "PE"
802
+
803
+
804
+ cdef class DtypeSerializer(Serializer):
805
+ serializer_id = DTYPE_SERIALIZER
806
+
807
+ @staticmethod
808
+ def _sort_fields(list fields):
809
+ return sorted(fields, key=lambda k: fields[k][1])
810
+
811
+ cpdef serial(self, obj: Union[np.dtype, ExtensionDtype], dict context):
812
+ if isinstance(obj, np.dtype):
813
+ try:
814
+ return [
815
+ _TYPE_CHAR_DTYPE_NUMPY, np.lib.format.dtype_to_descr(obj), None
816
+ ], [], True
817
+ except ValueError:
818
+ fields = obj.fields
819
+ new_fields = self._sort_fields(fields)
820
+ desc = np.lib.format.dtype_to_descr(obj[new_fields])
821
+ dtype_new_order = list(fields)
822
+ return [_TYPE_CHAR_DTYPE_NUMPY, desc, dtype_new_order], [], True
823
+ elif isinstance(obj, ExtensionDtype):
824
+ if _ARROW_DTYPE_NOT_SUPPORTED:
825
+ raise ImportError("ArrowDtype is not supported in current environment")
826
+ if isinstance(obj, ArrowDtype):
827
+ return [_TYPE_CHAR_DTYPE_PANDAS_ARROW, str(obj.pyarrow_dtype)], [], True
828
+ elif isinstance(obj, pd.CategoricalDtype):
829
+ return [
830
+ _TYPE_CHAR_DTYPE_PANDAS_CATEGORICAL, obj.ordered
831
+ ], [obj.categories], False
832
+ elif isinstance(obj, pd.IntervalDtype):
833
+ return [
834
+ _TYPE_CHAR_DTYPE_PANDAS_INTERVAL, obj.closed
835
+ ], [obj.subdtype], False
836
+ else:
837
+ return [_TYPE_CHAR_DTYPE_PANDAS_EXTENSION, repr(obj)], [], True
838
+ else:
839
+ raise NotImplementedError(f"Does not support serializing dtype {obj!r}")
840
+
841
+ cpdef deserial(self, list serialized, dict context, list subs):
842
+ cdef str ser_type = serialized[0]
843
+ if ser_type == _TYPE_CHAR_DTYPE_NUMPY:
844
+ try:
845
+ dt = np.lib.format.descr_to_dtype(serialized[1])
846
+ except AttributeError:
847
+ dt = np.dtype(serialized[1])
848
+
849
+ if serialized[2] is not None:
850
+ # fill dtype_new_order field
851
+ dt = dt[serialized[2]]
852
+ return dt
853
+ elif ser_type == _TYPE_CHAR_DTYPE_PANDAS_ARROW:
854
+ if _ARROW_DTYPE_NOT_SUPPORTED:
855
+ raise ImportError("ArrowDtype is not supported in current environment")
856
+ return ArrowDtype(arrow_type_from_str(serialized[1]))
857
+ elif ser_type == _TYPE_CHAR_DTYPE_PANDAS_CATEGORICAL:
858
+ return pd.CategoricalDtype(subs[0], serialized[1])
859
+ elif ser_type == _TYPE_CHAR_DTYPE_PANDAS_INTERVAL:
860
+ return pd.IntervalDtype(subs[0], serialized[1])
861
+ elif ser_type == _TYPE_CHAR_DTYPE_PANDAS_EXTENSION:
862
+ if serialized[1] == "StringDtype": # for legacy pandas version
863
+ return pd.StringDtype()
864
+ return pandas_dtype(serialized[1])
865
+ else:
866
+ raise NotImplementedError(f"Unknown serialization type {ser_type}")
867
+
868
+
869
+ cdef class ComplexSerializer(Serializer):
870
+ serializer_id = COMPLEX_SERIALIZER
871
+
872
+ cpdef serial(self, object obj: complex, dict context):
873
+ cdef complex cplx = <complex>obj
874
+ return [cplx.real, cplx.imag], [], True
875
+
876
+ cpdef deserial(self, list serialized, dict context, list subs):
877
+ return complex(*serialized[:2])
878
+
879
+
880
+ cdef class SliceSerializer(Serializer):
881
+ serializer_id = SLICE_SERIALIZER
882
+
883
+ cpdef serial(self, object obj: slice, dict context):
884
+ cdef list elems = [obj.start, obj.stop, obj.step]
885
+ for x in elems:
886
+ if x is not None and not isinstance(x, int):
887
+ return [], elems, False
888
+ return elems, [], True
889
+
890
+ cpdef deserial(self, list serialized, dict context, list subs):
891
+ if len(serialized) == 0:
892
+ return slice(subs[0], subs[1], subs[2])
893
+ return slice(*serialized[:3])
894
+
895
+
896
+ cdef class RangeSerializer(Serializer):
897
+ serializer_id = RANGE_SERIALIZER
898
+
899
+ cpdef serial(self, object obj: range, dict context):
900
+ return [obj.start, obj.stop, obj.step], [], True
901
+
902
+ cpdef deserial(self, list serialized, dict context, list subs):
903
+ return range(*serialized[:3])
904
+
905
+
906
+ cdef class RegexSerializer(Serializer):
907
+ serializer_id = REGEX_SERIALIZER
908
+
909
+ cpdef serial(self, object obj: re.Pattern, dict context):
910
+ cdef uint64_t obj_id
911
+ obj_id = _fast_id(<PyObject*>obj)
912
+ if obj_id in context:
913
+ return Placeholder(obj_id)
914
+ context[obj_id] = obj
915
+
916
+ return [obj.flags], [(<str>(obj.pattern)).encode()], True
917
+
918
+ cpdef deserial(self, list serialized, dict context, list subs):
919
+ return re.compile((<bytes>(subs[0])).decode(), serialized[0])
920
+
921
+
922
+ cdef class NoDefaultSerializer(Serializer):
923
+ serializer_id = NO_DEFAULT_SERIALIZER
924
+
925
+ cpdef serial(self, object obj, dict context):
926
+ return [], [], True
927
+
928
+ cpdef deserial(self, list obj, dict context, list subs):
929
+ return no_default
930
+
931
+
932
+ cdef class ArrowBufferSerializer(Serializer):
933
+ serializer_id = ARROW_BUFFER_SERIALIZER
934
+
935
+ cpdef serial(self, object obj, dict context):
936
+ return [], [obj], True
937
+
938
+ cpdef deserial(self, list obj, dict context, list subs):
939
+ if not isinstance(subs[0], pa.Buffer):
940
+ return pa.py_buffer(subs[0])
941
+ return subs[0]
942
+
943
+
944
+ cdef class Placeholder:
945
+ """
946
+ Placeholder object to reduce duplicated serialization
947
+
948
+ The object records object identifier and keeps callbacks
949
+ to replace itself in parent objects.
950
+ """
951
+ def __init__(self, uint64_t id_):
952
+ self.id = id_
953
+ self.callbacks = []
954
+
955
+ def __hash__(self):
956
+ return self.id
957
+
958
+ def __eq__(self, other): # pragma: no cover
959
+ if type(other) is not Placeholder:
960
+ return False
961
+ return self.id == other.id
962
+
963
+ def __repr__(self):
964
+ return (
965
+ f"Placeholder(id={self.id}, "
966
+ f"callbacks=[list of {len(self.callbacks)}])"
967
+ )
968
+
969
+
970
+ cdef class PlaceholderSerializer(Serializer):
971
+ serializer_id = PLACEHOLDER_SERIALIZER
972
+
973
+ cpdef serial(self, obj: Any, dict context):
974
+ return [], [], True
975
+
976
+ cpdef deserial(self, list serialized, dict context, list subs):
977
+ return Placeholder(0)
978
+
979
+
980
+ PickleSerializer.register(object)
981
+ for _primitive in _primitive_types:
982
+ PrimitiveSerializer.register(_primitive)
983
+ BytesSerializer.register(bytes)
984
+ BytesSerializer.register(memoryview)
985
+ StrSerializer.register(str)
986
+ ListSerializer.register(list)
987
+ TupleSerializer.register(tuple)
988
+ DictSerializer.register(dict)
989
+ PyDatetimeSerializer.register(datetime.datetime)
990
+ PyDateSerializer.register(datetime.date)
991
+ PyTimedeltaSerializer.register(datetime.timedelta)
992
+ TZInfoSerializer.register(datetime.tzinfo)
993
+ DtypeSerializer.register(np.dtype)
994
+ DtypeSerializer.register(ExtensionDtype)
995
+ ComplexSerializer.register(complex)
996
+ SliceSerializer.register(slice)
997
+ RangeSerializer.register(range)
998
+ RegexSerializer.register(re.Pattern)
999
+ NoDefaultSerializer.register(NoDefault)
1000
+ if pa is not None:
1001
+ ArrowBufferSerializer.register(pa.Buffer)
1002
+ PlaceholderSerializer.register(Placeholder)
1003
+
1004
+
1005
+ cdef class _SerialStackItem:
1006
+ cdef public list serialized
1007
+ cdef public list subs
1008
+ cdef public list subs_serialized
1009
+
1010
+ def __cinit__(self, list serialized, list subs):
1011
+ self.serialized = serialized
1012
+ self.subs = subs
1013
+ self.subs_serialized = []
1014
+
1015
+
1016
+ cdef class _IdContextHolder:
1017
+ cdef public unordered_map[uint64_t, uint64_t] d
1018
+ cdef public uint64_t obj_count
1019
+
1020
+ def __cinit__(self):
1021
+ self.obj_count = 0
1022
+
1023
+
1024
+ cdef tuple _serial_single(
1025
+ obj, dict context, _IdContextHolder id_context_holder
1026
+ ):
1027
+ """Serialize single object and return serialized tuples"""
1028
+ cdef uint64_t obj_id, ordered_id
1029
+ cdef Serializer serializer
1030
+ cdef int serializer_id
1031
+ cdef list common_header, serialized, subs
1032
+
1033
+ while True:
1034
+ name = context.get("serializer")
1035
+ obj_type = type(obj) if name is None else NamedType(name, type(obj))
1036
+ serializer = _serial_dispatcher.get_handler(obj_type)
1037
+ serializer_id = serializer._serializer_id
1038
+ ret_serial = serializer.serial(obj, context)
1039
+ if type(ret_serial) is tuple:
1040
+ # object is serialized, form a common header and return
1041
+ serialized, subs, final = <tuple>ret_serial
1042
+
1043
+ if type(obj) is Placeholder:
1044
+ obj_id = (<Placeholder>obj).id
1045
+ ordered_id = id_context_holder.d[obj_id]
1046
+ else:
1047
+ ordered_id = id_context_holder.obj_count
1048
+ id_context_holder.obj_count += 1
1049
+ # only need to record object ids for non-primitive types
1050
+ if serializer_id != PRIMITIVE_SERIALIZER:
1051
+ obj_id = _fast_id(<PyObject*>obj)
1052
+ id_context_holder.d[obj_id] = ordered_id
1053
+
1054
+ # REMEMBER to change _COMMON_HEADER_LEN when content of
1055
+ # this header changed
1056
+ common_header = [
1057
+ serializer_id, ordered_id, len(subs), final
1058
+ ]
1059
+ break
1060
+ else:
1061
+ # object is converted into another (usually a Placeholder)
1062
+ obj = ret_serial
1063
+ common_header.extend(serialized)
1064
+ return common_header, subs, final
1065
+
1066
+
1067
+ class _SerializeObjectOverflow(Exception):
1068
+ def __init__(self, list cur_serialized, int num_total_serialized):
1069
+ super(_SerializeObjectOverflow, self).__init__(cur_serialized)
1070
+ self.cur_serialized = cur_serialized
1071
+ self.num_total_serialized = num_total_serialized
1072
+
1073
+
1074
+ cpdef object _serialize_with_stack(
1075
+ list serial_stack,
1076
+ list serialized,
1077
+ dict context,
1078
+ _IdContextHolder id_context_holder,
1079
+ list result_bufs_list,
1080
+ int64_t num_overflow = 0,
1081
+ int64_t num_total_serialized = 0,
1082
+ ):
1083
+ cdef _SerialStackItem stack_item
1084
+ cdef list subs
1085
+ cdef bint final
1086
+ cdef int64_t num_sub_serialized
1087
+ cdef bint is_resume = num_total_serialized > 0
1088
+
1089
+ while serial_stack:
1090
+ stack_item = serial_stack[-1]
1091
+ if serialized is not None:
1092
+ # have previously-serialized results, record first
1093
+ stack_item.subs_serialized.append(serialized)
1094
+
1095
+ num_sub_serialized = len(stack_item.subs_serialized)
1096
+ if len(stack_item.subs) == num_sub_serialized:
1097
+ # all subcomponents serialized, serialization of current is done
1098
+ # and we can move to the parent object
1099
+ serialized = stack_item.serialized + stack_item.subs_serialized
1100
+ num_total_serialized += 1
1101
+ serial_stack.pop()
1102
+ else:
1103
+ # serialize next subcomponent at stack top
1104
+ serialized, subs, final = _serial_single(
1105
+ stack_item.subs[num_sub_serialized], context, id_context_holder
1106
+ )
1107
+ num_total_serialized += 1
1108
+ if final or not subs:
1109
+ # the subcomponent is a leaf
1110
+ if subs:
1111
+ result_bufs_list.extend(subs)
1112
+ else:
1113
+ # the subcomponent has its own subcomponents, we push itself
1114
+ # into stack and process its children
1115
+ stack_item = _SerialStackItem(serialized, subs)
1116
+ serial_stack.append(stack_item)
1117
+ # note that the serialized header should not be recorded
1118
+ # as we are now processing the subcomponent itself
1119
+ serialized = None
1120
+ if 0 < num_overflow < num_total_serialized:
1121
+ raise _SerializeObjectOverflow(serialized, num_total_serialized)
1122
+
1123
+ # we keep an empty dict for extra metas required for other modules
1124
+ if is_resume:
1125
+ # returns num of deserialized objects when resumed
1126
+ extra_meta = {"_N": num_total_serialized}
1127
+ else:
1128
+ # otherwise does not record the number to reduce result size
1129
+ extra_meta = {}
1130
+ return [extra_meta, serialized], result_bufs_list
1131
+
1132
+
1133
+ def serialize(obj, dict context = None):
1134
+ """
1135
+ Serialize an object and return a header and buffers.
1136
+ Buffers are intended for zero-copy data manipulation.
1137
+
1138
+ Parameters
1139
+ ----------
1140
+ obj: Any
1141
+ Object to serialize
1142
+ context:
1143
+ Serialization context for instantiation of Placeholder
1144
+ objects
1145
+
1146
+ Returns
1147
+ -------
1148
+ result: Tuple[Tuple, List]
1149
+ Picklable header and buffers
1150
+ """
1151
+ cdef list serial_stack = []
1152
+ cdef list result_bufs_list = []
1153
+ cdef list serialized
1154
+ cdef list subs
1155
+ cdef bint final
1156
+ cdef _IdContextHolder id_context_holder = _IdContextHolder()
1157
+ cdef tuple result
1158
+
1159
+ context = context if context is not None else dict()
1160
+ serialized, subs, final = _serial_single(obj, context, id_context_holder)
1161
+ if final or not subs:
1162
+ # marked as a leaf node, return directly
1163
+ result = [{}, serialized], subs
1164
+ else:
1165
+ serial_stack.append(_SerialStackItem(serialized, subs))
1166
+ result = _serialize_with_stack(
1167
+ serial_stack, None, context, id_context_holder, result_bufs_list
1168
+ )
1169
+ result[0][0]["_PUB"] = context.get(Serializer._public_data_context_key)
1170
+ return result
1171
+
1172
+
1173
+ async def serialize_with_spawn(
1174
+ obj, dict context = None, int spawn_threshold = 100, object executor = None
1175
+ ):
1176
+ """
1177
+ Serialize an object and return a header and buffers.
1178
+ Buffers are intended for zero-copy data manipulation.
1179
+
1180
+ Parameters
1181
+ ----------
1182
+ obj: Any
1183
+ Object to serialize
1184
+ context: Dict
1185
+ Serialization context for instantiation of Placeholder
1186
+ objects
1187
+ spawn_threshold: int
1188
+ Threshold to spawn into a ThreadPoolExecutor
1189
+ executor: ThreadPoolExecutor
1190
+ ThreadPoolExecutor to spawn rest serialization into
1191
+
1192
+ Returns
1193
+ -------
1194
+ result: Tuple[Tuple, List]
1195
+ Picklable header and buffers
1196
+ """
1197
+ cdef list serial_stack = []
1198
+ cdef list result_bufs_list = []
1199
+ cdef list serialized
1200
+ cdef list subs
1201
+ cdef bint final
1202
+ cdef _IdContextHolder id_context_holder = _IdContextHolder()
1203
+ cdef tuple result
1204
+
1205
+ context = context if context is not None else dict()
1206
+ serialized, subs, final = _serial_single(obj, context, id_context_holder)
1207
+ if final or not subs:
1208
+ # marked as a leaf node, return directly
1209
+ result = [{}, serialized], subs
1210
+ else:
1211
+ serial_stack.append(_SerialStackItem(serialized, subs))
1212
+
1213
+ try:
1214
+ result = _serialize_with_stack(
1215
+ serial_stack,
1216
+ None,
1217
+ context,
1218
+ id_context_holder,
1219
+ result_bufs_list,
1220
+ spawn_threshold,
1221
+ )
1222
+ except _SerializeObjectOverflow as ex:
1223
+ result = await asyncio.get_running_loop().run_in_executor(
1224
+ executor,
1225
+ _serialize_with_stack,
1226
+ serial_stack,
1227
+ ex.cur_serialized,
1228
+ context,
1229
+ id_context_holder,
1230
+ result_bufs_list,
1231
+ 0,
1232
+ ex.num_total_serialized,
1233
+ )
1234
+ result[0][0]["_PUB"] = context.get(Serializer._public_data_context_key)
1235
+ return result
1236
+
1237
+
1238
+ cdef object deserialize_impl
1239
+
1240
+
1241
+ def deserialize(list serialized, list buffers, dict context = None):
1242
+ """
1243
+ Deserialize an object with serialized headers and buffers
1244
+
1245
+ Parameters
1246
+ ----------
1247
+ serialized: List
1248
+ Serialized object header
1249
+ buffers: List
1250
+ List of buffers extracted from serialize() calls
1251
+ context: Dict
1252
+ Serialization context for replacing Placeholder
1253
+ objects
1254
+
1255
+ Returns
1256
+ -------
1257
+ result: Any
1258
+ Deserialized object
1259
+ """
1260
+ global deserialize_impl
1261
+
1262
+ if deserialize_impl is None:
1263
+ from .deserializer import deserialize as deserialize_impl
1264
+
1265
+ return deserialize_impl(serialized, buffers, context)