maxframe 2.0.0b2__cp37-cp37m-win32.whl → 2.3.0rc1__cp37-cp37m-win32.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of maxframe might be problematic. Click here for more details.

Files changed (443) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cp37-win32.pyd +0 -0
  3. maxframe/_utils.pyx +14 -1
  4. maxframe/codegen/core.py +9 -8
  5. maxframe/codegen/spe/core.py +1 -1
  6. maxframe/codegen/spe/dataframe/__init__.py +1 -0
  7. maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
  8. maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
  9. maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
  10. maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
  11. maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
  12. maxframe/codegen/spe/dataframe/groupby.py +88 -0
  13. maxframe/codegen/spe/dataframe/indexing.py +99 -4
  14. maxframe/codegen/spe/dataframe/merge.py +38 -1
  15. maxframe/codegen/spe/dataframe/misc.py +11 -33
  16. maxframe/codegen/spe/dataframe/reduction.py +32 -9
  17. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  18. maxframe/codegen/spe/dataframe/sort.py +39 -18
  19. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
  20. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
  21. maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
  22. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
  23. maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
  24. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
  25. maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
  26. maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
  27. maxframe/codegen/spe/dataframe/tests/test_reduction.py +13 -0
  28. maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
  29. maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
  30. maxframe/codegen/spe/dataframe/tseries.py +9 -0
  31. maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
  32. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
  33. maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
  34. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  35. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  36. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  37. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  38. maxframe/codegen/spe/tensor/__init__.py +3 -0
  39. maxframe/codegen/spe/tensor/datasource.py +1 -0
  40. maxframe/codegen/spe/tensor/fft.py +74 -0
  41. maxframe/codegen/spe/tensor/linalg.py +29 -2
  42. maxframe/codegen/spe/tensor/misc.py +79 -25
  43. maxframe/codegen/spe/tensor/spatial.py +45 -0
  44. maxframe/codegen/spe/tensor/statistics.py +44 -0
  45. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  46. maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
  47. maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
  48. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  49. maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
  50. maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
  51. maxframe/codegen/spe/utils.py +2 -0
  52. maxframe/config/config.py +73 -9
  53. maxframe/config/tests/test_validators.py +13 -1
  54. maxframe/config/validators.py +49 -0
  55. maxframe/conftest.py +54 -17
  56. maxframe/core/accessor.py +2 -2
  57. maxframe/core/base.py +2 -1
  58. maxframe/core/entity/core.py +5 -0
  59. maxframe/core/entity/tileables.py +3 -1
  60. maxframe/core/graph/core.cp37-win32.pyd +0 -0
  61. maxframe/core/graph/entity.py +8 -3
  62. maxframe/core/mode.py +6 -1
  63. maxframe/core/operator/base.py +9 -2
  64. maxframe/core/operator/core.py +10 -2
  65. maxframe/core/operator/utils.py +13 -0
  66. maxframe/dataframe/__init__.py +12 -5
  67. maxframe/dataframe/accessors/__init__.py +1 -1
  68. maxframe/dataframe/accessors/compat.py +45 -0
  69. maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
  70. maxframe/dataframe/accessors/dict_/contains.py +7 -16
  71. maxframe/dataframe/accessors/dict_/core.py +48 -0
  72. maxframe/dataframe/accessors/dict_/getitem.py +17 -21
  73. maxframe/dataframe/accessors/dict_/length.py +7 -16
  74. maxframe/dataframe/accessors/dict_/remove.py +6 -18
  75. maxframe/dataframe/accessors/dict_/setitem.py +8 -18
  76. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
  77. maxframe/dataframe/accessors/list_/__init__.py +2 -2
  78. maxframe/dataframe/accessors/list_/core.py +48 -0
  79. maxframe/dataframe/accessors/list_/getitem.py +12 -19
  80. maxframe/dataframe/accessors/list_/length.py +7 -16
  81. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
  82. maxframe/dataframe/accessors/string_/__init__.py +4 -1
  83. maxframe/dataframe/accessors/struct_/__init__.py +37 -0
  84. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  85. maxframe/dataframe/accessors/struct_/core.py +43 -0
  86. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  87. maxframe/dataframe/accessors/struct_/field.py +123 -0
  88. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  89. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  90. maxframe/dataframe/arithmetic/__init__.py +18 -4
  91. maxframe/dataframe/arithmetic/between.py +106 -0
  92. maxframe/dataframe/arithmetic/dot.py +237 -0
  93. maxframe/dataframe/arithmetic/maximum.py +33 -0
  94. maxframe/dataframe/arithmetic/minimum.py +33 -0
  95. maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
  96. maxframe/dataframe/core.py +161 -224
  97. maxframe/dataframe/datasource/__init__.py +18 -0
  98. maxframe/dataframe/datasource/core.py +6 -0
  99. maxframe/dataframe/datasource/direct.py +57 -0
  100. maxframe/dataframe/datasource/from_dict.py +124 -0
  101. maxframe/dataframe/datasource/from_index.py +1 -1
  102. maxframe/dataframe/datasource/from_records.py +77 -0
  103. maxframe/dataframe/datasource/from_tensor.py +109 -41
  104. maxframe/dataframe/datasource/read_csv.py +21 -14
  105. maxframe/dataframe/datasource/read_odps_query.py +29 -6
  106. maxframe/dataframe/datasource/read_odps_table.py +32 -10
  107. maxframe/dataframe/datasource/read_parquet.py +38 -39
  108. maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
  109. maxframe/dataframe/datastore/__init__.py +11 -1
  110. maxframe/dataframe/datastore/direct.py +268 -0
  111. maxframe/dataframe/datastore/to_csv.py +29 -41
  112. maxframe/dataframe/datastore/to_odps.py +36 -4
  113. maxframe/dataframe/extensions/__init__.py +20 -4
  114. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  115. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  116. maxframe/dataframe/extensions/collect_kv.py +126 -0
  117. maxframe/dataframe/extensions/extract_kv.py +177 -0
  118. maxframe/dataframe/extensions/flatjson.py +2 -1
  119. maxframe/dataframe/extensions/map_reduce.py +263 -0
  120. maxframe/dataframe/extensions/rebalance.py +62 -0
  121. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  122. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  123. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  124. maxframe/dataframe/groupby/__init__.py +17 -2
  125. maxframe/dataframe/groupby/aggregation.py +86 -49
  126. maxframe/dataframe/groupby/apply.py +1 -1
  127. maxframe/dataframe/groupby/apply_chunk.py +19 -5
  128. maxframe/dataframe/groupby/core.py +116 -16
  129. maxframe/dataframe/groupby/cum.py +4 -25
  130. maxframe/dataframe/groupby/expanding.py +264 -0
  131. maxframe/dataframe/groupby/fill.py +1 -1
  132. maxframe/dataframe/groupby/getitem.py +12 -5
  133. maxframe/dataframe/groupby/head.py +11 -1
  134. maxframe/dataframe/groupby/rank.py +136 -0
  135. maxframe/dataframe/groupby/rolling.py +206 -0
  136. maxframe/dataframe/groupby/shift.py +114 -0
  137. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  138. maxframe/dataframe/indexing/__init__.py +22 -2
  139. maxframe/dataframe/indexing/droplevel.py +195 -0
  140. maxframe/dataframe/indexing/filter.py +169 -0
  141. maxframe/dataframe/indexing/get_level_values.py +76 -0
  142. maxframe/dataframe/indexing/iat.py +45 -0
  143. maxframe/dataframe/indexing/iloc.py +152 -12
  144. maxframe/dataframe/indexing/insert.py +46 -18
  145. maxframe/dataframe/indexing/loc.py +287 -7
  146. maxframe/dataframe/indexing/reindex.py +14 -5
  147. maxframe/dataframe/indexing/rename.py +6 -0
  148. maxframe/dataframe/indexing/rename_axis.py +2 -2
  149. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  150. maxframe/dataframe/indexing/reset_index.py +33 -6
  151. maxframe/dataframe/indexing/sample.py +8 -0
  152. maxframe/dataframe/indexing/setitem.py +3 -3
  153. maxframe/dataframe/indexing/swaplevel.py +185 -0
  154. maxframe/dataframe/indexing/take.py +99 -0
  155. maxframe/dataframe/indexing/truncate.py +140 -0
  156. maxframe/dataframe/indexing/where.py +0 -11
  157. maxframe/dataframe/indexing/xs.py +148 -0
  158. maxframe/dataframe/merge/__init__.py +15 -1
  159. maxframe/dataframe/merge/append.py +97 -98
  160. maxframe/dataframe/merge/combine.py +244 -0
  161. maxframe/dataframe/merge/combine_first.py +120 -0
  162. maxframe/dataframe/merge/compare.py +387 -0
  163. maxframe/dataframe/merge/concat.py +183 -0
  164. maxframe/dataframe/merge/update.py +271 -0
  165. maxframe/dataframe/misc/__init__.py +28 -11
  166. maxframe/dataframe/misc/_duplicate.py +10 -4
  167. maxframe/dataframe/misc/apply.py +1 -1
  168. maxframe/dataframe/misc/check_unique.py +82 -0
  169. maxframe/dataframe/misc/clip.py +145 -0
  170. maxframe/dataframe/misc/describe.py +175 -9
  171. maxframe/dataframe/misc/drop.py +31 -0
  172. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  173. maxframe/dataframe/misc/duplicated.py +2 -2
  174. maxframe/dataframe/misc/get_dummies.py +5 -1
  175. maxframe/dataframe/misc/infer_dtypes.py +251 -0
  176. maxframe/dataframe/misc/isin.py +2 -2
  177. maxframe/dataframe/misc/map.py +125 -18
  178. maxframe/dataframe/misc/repeat.py +159 -0
  179. maxframe/dataframe/misc/tests/test_misc.py +48 -3
  180. maxframe/dataframe/misc/to_numeric.py +3 -0
  181. maxframe/dataframe/misc/transform.py +12 -5
  182. maxframe/dataframe/misc/transpose.py +13 -1
  183. maxframe/dataframe/misc/valid_index.py +115 -0
  184. maxframe/dataframe/misc/value_counts.py +38 -4
  185. maxframe/dataframe/missing/checkna.py +14 -6
  186. maxframe/dataframe/missing/dropna.py +5 -0
  187. maxframe/dataframe/missing/fillna.py +1 -1
  188. maxframe/dataframe/missing/replace.py +7 -4
  189. maxframe/dataframe/reduction/__init__.py +35 -16
  190. maxframe/dataframe/reduction/aggregation.py +43 -14
  191. maxframe/dataframe/reduction/all.py +2 -2
  192. maxframe/dataframe/reduction/any.py +2 -2
  193. maxframe/dataframe/reduction/argmax.py +103 -0
  194. maxframe/dataframe/reduction/argmin.py +103 -0
  195. maxframe/dataframe/reduction/core.py +80 -24
  196. maxframe/dataframe/reduction/count.py +13 -9
  197. maxframe/dataframe/reduction/cov.py +166 -0
  198. maxframe/dataframe/reduction/cummax.py +2 -2
  199. maxframe/dataframe/reduction/cummin.py +2 -2
  200. maxframe/dataframe/reduction/cumprod.py +2 -2
  201. maxframe/dataframe/reduction/cumsum.py +2 -2
  202. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  203. maxframe/dataframe/reduction/idxmax.py +185 -0
  204. maxframe/dataframe/reduction/idxmin.py +185 -0
  205. maxframe/dataframe/reduction/kurtosis.py +37 -30
  206. maxframe/dataframe/reduction/max.py +2 -2
  207. maxframe/dataframe/reduction/mean.py +9 -7
  208. maxframe/dataframe/reduction/median.py +2 -2
  209. maxframe/dataframe/reduction/min.py +2 -2
  210. maxframe/dataframe/reduction/mode.py +144 -0
  211. maxframe/dataframe/reduction/nunique.py +19 -11
  212. maxframe/dataframe/reduction/prod.py +18 -13
  213. maxframe/dataframe/reduction/reduction_size.py +2 -2
  214. maxframe/dataframe/reduction/sem.py +13 -9
  215. maxframe/dataframe/reduction/skew.py +31 -27
  216. maxframe/dataframe/reduction/str_concat.py +10 -7
  217. maxframe/dataframe/reduction/sum.py +18 -14
  218. maxframe/dataframe/reduction/tests/test_reduction.py +12 -0
  219. maxframe/dataframe/reduction/unique.py +20 -3
  220. maxframe/dataframe/reduction/var.py +16 -12
  221. maxframe/dataframe/reshape/__init__.py +38 -0
  222. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  223. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  224. maxframe/dataframe/reshape/unstack.py +114 -0
  225. maxframe/dataframe/sort/__init__.py +16 -1
  226. maxframe/dataframe/sort/argsort.py +68 -0
  227. maxframe/dataframe/sort/core.py +2 -1
  228. maxframe/dataframe/sort/nlargest.py +238 -0
  229. maxframe/dataframe/sort/nsmallest.py +228 -0
  230. maxframe/dataframe/sort/rank.py +147 -0
  231. maxframe/dataframe/statistics/__init__.py +3 -3
  232. maxframe/dataframe/statistics/corr.py +1 -0
  233. maxframe/dataframe/statistics/quantile.py +2 -2
  234. maxframe/dataframe/tests/test_typing.py +104 -0
  235. maxframe/dataframe/tests/test_utils.py +66 -2
  236. maxframe/dataframe/tseries/__init__.py +19 -0
  237. maxframe/dataframe/tseries/at_time.py +61 -0
  238. maxframe/dataframe/tseries/between_time.py +122 -0
  239. maxframe/dataframe/typing_.py +185 -0
  240. maxframe/dataframe/utils.py +125 -52
  241. maxframe/dataframe/window/aggregation.py +8 -4
  242. maxframe/dataframe/window/core.py +14 -1
  243. maxframe/dataframe/window/ewm.py +1 -3
  244. maxframe/dataframe/window/expanding.py +37 -35
  245. maxframe/dataframe/window/rolling.py +49 -39
  246. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  247. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  248. maxframe/env.py +7 -4
  249. maxframe/errors.py +2 -2
  250. maxframe/io/odpsio/schema.py +9 -3
  251. maxframe/io/odpsio/tableio.py +7 -2
  252. maxframe/io/odpsio/tests/test_schema.py +198 -83
  253. maxframe/learn/__init__.py +10 -2
  254. maxframe/learn/cluster/__init__.py +15 -0
  255. maxframe/learn/cluster/_kmeans.py +782 -0
  256. maxframe/learn/contrib/llm/core.py +18 -7
  257. maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
  258. maxframe/learn/contrib/llm/deploy/config.py +221 -0
  259. maxframe/learn/contrib/llm/deploy/core.py +247 -0
  260. maxframe/learn/contrib/llm/deploy/framework.py +35 -0
  261. maxframe/learn/contrib/llm/deploy/loader.py +360 -0
  262. maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
  263. maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
  264. maxframe/learn/contrib/llm/models/__init__.py +1 -0
  265. maxframe/learn/contrib/llm/models/dashscope.py +12 -6
  266. maxframe/learn/contrib/llm/models/managed.py +76 -11
  267. maxframe/learn/contrib/llm/models/openai.py +72 -0
  268. maxframe/learn/contrib/llm/tests/__init__.py +13 -0
  269. maxframe/learn/contrib/llm/tests/test_core.py +34 -0
  270. maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
  271. maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
  272. maxframe/learn/contrib/llm/text.py +348 -42
  273. maxframe/learn/contrib/models.py +4 -1
  274. maxframe/learn/contrib/xgboost/classifier.py +2 -0
  275. maxframe/learn/contrib/xgboost/core.py +113 -4
  276. maxframe/learn/contrib/xgboost/predict.py +4 -2
  277. maxframe/learn/contrib/xgboost/regressor.py +5 -0
  278. maxframe/learn/contrib/xgboost/train.py +7 -2
  279. maxframe/learn/core.py +66 -0
  280. maxframe/learn/linear_model/_base.py +58 -1
  281. maxframe/learn/linear_model/_lin_reg.py +1 -1
  282. maxframe/learn/metrics/__init__.py +6 -0
  283. maxframe/learn/metrics/_classification.py +145 -0
  284. maxframe/learn/metrics/_ranking.py +477 -0
  285. maxframe/learn/metrics/_scorer.py +60 -0
  286. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  287. maxframe/learn/metrics/pairwise/core.py +77 -0
  288. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  289. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  290. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  291. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  292. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  293. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  294. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  295. maxframe/learn/metrics/tests/__init__.py +13 -0
  296. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  297. maxframe/learn/preprocessing/_data/min_max_scaler.py +34 -23
  298. maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
  299. maxframe/learn/utils/__init__.py +2 -1
  300. maxframe/learn/utils/checks.py +1 -2
  301. maxframe/learn/utils/core.py +59 -0
  302. maxframe/learn/utils/extmath.py +79 -9
  303. maxframe/learn/utils/odpsio.py +262 -0
  304. maxframe/learn/utils/validation.py +2 -2
  305. maxframe/lib/compat.py +40 -0
  306. maxframe/lib/dtypes_extension/__init__.py +16 -1
  307. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  308. maxframe/lib/dtypes_extension/blob.py +304 -0
  309. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  310. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  311. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  312. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  313. maxframe/lib/filesystem/_oss_lib/common.py +124 -50
  314. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  315. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  316. maxframe/lib/filesystem/base.py +1 -1
  317. maxframe/lib/filesystem/core.py +1 -1
  318. maxframe/lib/filesystem/oss.py +115 -46
  319. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  320. maxframe/lib/mmh3.cp37-win32.pyd +0 -0
  321. maxframe/lib/wrapped_pickle.py +10 -0
  322. maxframe/opcodes.py +41 -15
  323. maxframe/protocol.py +12 -0
  324. maxframe/remote/core.py +4 -0
  325. maxframe/serialization/__init__.py +11 -2
  326. maxframe/serialization/arrow.py +38 -13
  327. maxframe/serialization/blob.py +32 -0
  328. maxframe/serialization/core.cp37-win32.pyd +0 -0
  329. maxframe/serialization/core.pyx +39 -1
  330. maxframe/serialization/exception.py +2 -4
  331. maxframe/serialization/numpy.py +11 -0
  332. maxframe/serialization/pandas.py +46 -9
  333. maxframe/serialization/serializables/core.py +2 -2
  334. maxframe/serialization/tests/test_serial.py +31 -4
  335. maxframe/tensor/__init__.py +38 -8
  336. maxframe/tensor/arithmetic/__init__.py +19 -10
  337. maxframe/tensor/arithmetic/core.py +2 -2
  338. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  339. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
  340. maxframe/tensor/core.py +6 -2
  341. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  342. maxframe/tensor/extensions/__init__.py +2 -0
  343. maxframe/tensor/extensions/apply_chunk.py +3 -3
  344. maxframe/tensor/extensions/rebalance.py +65 -0
  345. maxframe/tensor/fft/__init__.py +32 -0
  346. maxframe/tensor/fft/core.py +168 -0
  347. maxframe/tensor/fft/fft.py +112 -0
  348. maxframe/tensor/fft/fft2.py +118 -0
  349. maxframe/tensor/fft/fftfreq.py +80 -0
  350. maxframe/tensor/fft/fftn.py +123 -0
  351. maxframe/tensor/fft/fftshift.py +79 -0
  352. maxframe/tensor/fft/hfft.py +112 -0
  353. maxframe/tensor/fft/ifft.py +114 -0
  354. maxframe/tensor/fft/ifft2.py +115 -0
  355. maxframe/tensor/fft/ifftn.py +123 -0
  356. maxframe/tensor/fft/ifftshift.py +73 -0
  357. maxframe/tensor/fft/ihfft.py +93 -0
  358. maxframe/tensor/fft/irfft.py +118 -0
  359. maxframe/tensor/fft/irfft2.py +62 -0
  360. maxframe/tensor/fft/irfftn.py +114 -0
  361. maxframe/tensor/fft/rfft.py +116 -0
  362. maxframe/tensor/fft/rfft2.py +63 -0
  363. maxframe/tensor/fft/rfftfreq.py +87 -0
  364. maxframe/tensor/fft/rfftn.py +113 -0
  365. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  366. maxframe/tensor/linalg/__init__.py +7 -0
  367. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  368. maxframe/tensor/linalg/cholesky.py +117 -0
  369. maxframe/tensor/linalg/einsum.py +339 -0
  370. maxframe/tensor/linalg/lstsq.py +100 -0
  371. maxframe/tensor/linalg/matrix_norm.py +75 -0
  372. maxframe/tensor/linalg/norm.py +249 -0
  373. maxframe/tensor/linalg/solve.py +72 -0
  374. maxframe/tensor/linalg/solve_triangular.py +2 -2
  375. maxframe/tensor/linalg/vector_norm.py +113 -0
  376. maxframe/tensor/misc/__init__.py +24 -1
  377. maxframe/tensor/misc/argwhere.py +72 -0
  378. maxframe/tensor/misc/array_split.py +46 -0
  379. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  380. maxframe/tensor/misc/copyto.py +130 -0
  381. maxframe/tensor/misc/delete.py +104 -0
  382. maxframe/tensor/misc/dsplit.py +68 -0
  383. maxframe/tensor/misc/ediff1d.py +74 -0
  384. maxframe/tensor/misc/expand_dims.py +85 -0
  385. maxframe/tensor/misc/flip.py +90 -0
  386. maxframe/tensor/misc/fliplr.py +64 -0
  387. maxframe/tensor/misc/flipud.py +68 -0
  388. maxframe/tensor/misc/hsplit.py +85 -0
  389. maxframe/tensor/misc/insert.py +139 -0
  390. maxframe/tensor/misc/moveaxis.py +83 -0
  391. maxframe/tensor/misc/result_type.py +88 -0
  392. maxframe/tensor/misc/roll.py +124 -0
  393. maxframe/tensor/misc/rollaxis.py +77 -0
  394. maxframe/tensor/misc/shape.py +89 -0
  395. maxframe/tensor/misc/split.py +190 -0
  396. maxframe/tensor/misc/tile.py +109 -0
  397. maxframe/tensor/misc/vsplit.py +74 -0
  398. maxframe/tensor/reduction/array_equal.py +2 -1
  399. maxframe/tensor/sort/__init__.py +2 -0
  400. maxframe/tensor/sort/argpartition.py +98 -0
  401. maxframe/tensor/sort/partition.py +228 -0
  402. maxframe/tensor/spatial/__init__.py +15 -0
  403. maxframe/tensor/spatial/distance/__init__.py +17 -0
  404. maxframe/tensor/spatial/distance/cdist.py +421 -0
  405. maxframe/tensor/spatial/distance/pdist.py +398 -0
  406. maxframe/tensor/spatial/distance/squareform.py +153 -0
  407. maxframe/tensor/special/__init__.py +159 -21
  408. maxframe/tensor/special/airy.py +55 -0
  409. maxframe/tensor/special/bessel.py +199 -0
  410. maxframe/tensor/special/core.py +65 -4
  411. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  412. maxframe/tensor/special/ellip_harm.py +55 -0
  413. maxframe/tensor/special/err_fresnel.py +223 -0
  414. maxframe/tensor/special/gamma_funcs.py +303 -0
  415. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  416. maxframe/tensor/special/info_theory.py +189 -0
  417. maxframe/tensor/special/misc.py +21 -0
  418. maxframe/tensor/statistics/__init__.py +6 -0
  419. maxframe/tensor/statistics/corrcoef.py +77 -0
  420. maxframe/tensor/statistics/cov.py +222 -0
  421. maxframe/tensor/statistics/digitize.py +126 -0
  422. maxframe/tensor/statistics/histogram.py +520 -0
  423. maxframe/tensor/statistics/median.py +85 -0
  424. maxframe/tensor/statistics/ptp.py +89 -0
  425. maxframe/tensor/utils.py +3 -3
  426. maxframe/tests/test_udf.py +61 -0
  427. maxframe/tests/test_utils.py +51 -6
  428. maxframe/tests/utils.py +0 -2
  429. maxframe/typing_.py +2 -0
  430. maxframe/udf.py +130 -9
  431. maxframe/utils.py +254 -27
  432. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
  433. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
  434. maxframe_client/fetcher.py +35 -4
  435. maxframe_client/session/odps.py +7 -2
  436. maxframe_client/session/task.py +8 -1
  437. maxframe_client/tests/test_fetcher.py +76 -3
  438. maxframe_client/tests/test_session.py +28 -1
  439. maxframe/dataframe/arrays.py +0 -864
  440. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  441. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  442. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
  443. {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
@@ -20,6 +20,11 @@ import pandas as pd
20
20
  from pandas.api.extensions import ExtensionArray
21
21
  from pandas.arrays import IntervalArray
22
22
 
23
+ try:
24
+ from pandas.tseries.offsets import BaseOffset as PdBaseOffset
25
+ except ImportError:
26
+ PdBaseOffset = type("FakeBaseOffset", (), {})
27
+
23
28
  from ..utils import no_default
24
29
  from .core import Serializer, buffered
25
30
 
@@ -39,14 +44,16 @@ class DataFrameSerializer(Serializer):
39
44
  self, serialized: List, context: Dict, subs: List[Any]
40
45
  ) -> pd.DataFrame:
41
46
  dtypes, idx = subs[:2]
42
- seriess = [pd.Series(d, index=idx) for d in subs[2:]]
47
+ seriess = [
48
+ pd.Series(d, name=nm, index=idx).astype(dt)
49
+ for d, (nm, dt) in zip(subs[2:], dtypes.items())
50
+ ]
43
51
  if seriess:
44
- df = pd.concat([pd.Series(d, index=idx) for d in subs[2:]], axis=1)
52
+ df = pd.concat(seriess, axis=1)
53
+ df.columns = dtypes.index
45
54
  else:
46
55
  df = pd.DataFrame([], index=idx)
47
- df.columns = dtypes.index
48
- df.index = idx
49
- return df.astype(dtypes)
56
+ return df
50
57
 
51
58
 
52
59
  class SeriesSerializer(Serializer):
@@ -63,9 +70,26 @@ class SeriesSerializer(Serializer):
63
70
  return pd.Series(data, index=idx, name=name).astype(dtype)
64
71
 
65
72
 
73
+ class PeriodSerializer(Serializer):
74
+ def serial(self, obj: pd.Period, context: Dict):
75
+ return [obj.strftime("%Y-%m-%d %H:%M:%S"), obj.freqstr], [], True
76
+
77
+ def deserial(self, serialized, context: Dict, subs: List):
78
+ return pd.Period(serialized[0], freq=serialized[1])
79
+
80
+
81
+ class PdOffsetSerializer(Serializer):
82
+ def serial(self, obj: PdBaseOffset, context: Dict):
83
+ return [obj.freqstr], [], True
84
+
85
+ def deserial(self, serialized, context: Dict, subs: List):
86
+ return pd.tseries.frequencies.to_offset(serialized[0])
87
+
88
+
66
89
  _TYPE_CHAR_MULTI_INDEX = "M"
67
90
  _TYPE_CHAR_RANGE_INDEX = "R"
68
91
  _TYPE_CHAR_CATEGORICAL_INDEX = "C"
92
+ _TYPE_CHAR_DATETIME_INDEX = "D"
69
93
 
70
94
 
71
95
  class IndexSerializer(Serializer):
@@ -80,6 +104,9 @@ class IndexSerializer(Serializer):
80
104
  elif isinstance(obj, pd.CategoricalIndex):
81
105
  data = [obj.name, obj.values]
82
106
  header = [_TYPE_CHAR_CATEGORICAL_INDEX]
107
+ elif isinstance(obj, pd.DatetimeIndex):
108
+ data = [obj.name, obj.values]
109
+ header = [_TYPE_CHAR_DATETIME_INDEX, obj.freqstr, None]
83
110
  else:
84
111
  if getattr(obj.dtype, "hasobject", False):
85
112
  values = obj.tolist()
@@ -100,6 +127,10 @@ class IndexSerializer(Serializer):
100
127
  elif header[0] == _TYPE_CHAR_CATEGORICAL_INDEX:
101
128
  name, data = subs[:2]
102
129
  return pd.CategoricalIndex(data, name=name)
130
+ elif header[0] == _TYPE_CHAR_DATETIME_INDEX:
131
+ name, data = subs[:2]
132
+ freq, tz = header[1:]
133
+ return pd.DatetimeIndex(data, name=name, freq=freq, tz=tz)
103
134
  elif header[0] is None: # Normal index
104
135
  dtype, name, values = subs
105
136
  return pd.Index(values, dtype=dtype, name=name)
@@ -162,9 +193,12 @@ class PdTimestampSerializer(Serializer):
162
193
  zone_info = []
163
194
  ts = obj.to_pydatetime().timestamp()
164
195
  elements = [int(ts), obj.microsecond, obj.nanosecond]
165
- if hasattr(obj, "unit"):
166
- elements.append(str(obj.unit))
167
- return elements, zone_info, bool(zone_info)
196
+ for attr in ("unit", "freqstr"):
197
+ if getattr(obj, attr, None):
198
+ elements.append(str(getattr(obj, attr)))
199
+ else:
200
+ elements.append(None)
201
+ return elements, zone_info, not bool(zone_info)
168
202
 
169
203
  def deserial(self, serialized: List, context: Dict, subs: List):
170
204
  if subs:
@@ -196,7 +230,8 @@ class PdTimestampSerializer(Serializer):
196
230
  "nanosecond": serialized[2],
197
231
  }
198
232
  if len(serialized) >= 4:
199
- kwargs["unit"] = serialized[3]
233
+ ext_kw = dict(zip(("unit", "freq"), serialized[3:]))
234
+ kwargs.update({k: v for k, v in ext_kw.items() if v})
200
235
  val = pd.Timestamp(**kwargs)
201
236
  return val
202
237
 
@@ -238,4 +273,6 @@ CategoricalSerializer.register(pd.Categorical)
238
273
  ArraySerializer.register(ExtensionArray)
239
274
  PdTimestampSerializer.register(pd.Timestamp)
240
275
  PdTimedeltaSerializer.register(pd.Timedelta)
276
+ PeriodSerializer.register(pd.Period)
277
+ PdOffsetSerializer.register(PdBaseOffset)
241
278
  NoDefaultSerializer.register(type(no_default))
@@ -453,8 +453,8 @@ class SerializableSerializer(Serializer):
453
453
  self._set_field_values(obj, primitives, cls_to_prim_key, True)
454
454
  if obj_class._NON_PRIMITIVE_FIELDS:
455
455
  self._set_field_values(obj, subs[0], cls_to_non_prim_key, False)
456
- obj.__on_deserialize__()
457
- return obj
456
+ ret = obj.__on_deserialize__()
457
+ return obj if ret is None else ret
458
458
 
459
459
 
460
460
  class NoFieldValueSerializer(Serializer):
@@ -81,6 +81,11 @@ class CustomNamedTuple(NamedTuple):
81
81
  b"abcd",
82
82
  "abcd",
83
83
  slice(3, 9, 2),
84
+ slice(3, None, None),
85
+ slice(pd.Timestamp.now(), None, None),
86
+ range(10),
87
+ range(2, 10),
88
+ range(2, 10, 3),
84
89
  ["uvw", ("mno", "sdaf"), 4, 6.7],
85
90
  CustomNamedTuple("abcd", 13451),
86
91
  datetime.datetime.now(),
@@ -173,7 +178,7 @@ def test_timezones(val):
173
178
  ],
174
179
  )
175
180
  @switch_unpickle
176
- def test_numpy(val):
181
+ def test_numpy_arrays(val):
177
182
  deserialized = deserialize(*serialize(val))
178
183
  assert type(val) == type(deserialized)
179
184
  np.testing.assert_equal(val, deserialized)
@@ -181,6 +186,13 @@ def test_numpy(val):
181
186
  assert deserialized.flags.f_contiguous
182
187
 
183
188
 
189
+ @switch_unpickle
190
+ def test_numpy_random_state():
191
+ rs1 = np.random.RandomState(131)
192
+ rs2 = deserialize(*serialize(rs1))
193
+ assert rs1.rand() == rs2.rand()
194
+
195
+
184
196
  @switch_unpickle
185
197
  def test_pandas():
186
198
  val = pd.Series([1, 2, 3, 4], name="nm")
@@ -213,16 +225,25 @@ def test_pandas():
213
225
  val = pd.CategoricalIndex(np.random.choice(list("abcd"), size=(1000,)))
214
226
  pd.testing.assert_index_equal(val, deserialize(*serialize(val)))
215
227
 
228
+ val = pd.DatetimeIndex([pd.Timestamp("2025-08-01 12:31:21")], freq="D")
229
+ pd.testing.assert_index_equal(val, deserialize(*serialize(val)))
230
+
231
+ val = pd.Period("2025-08-01", freq="D")
232
+ assert val == deserialize(*serialize(val))
233
+
234
+ val = pd.tseries.offsets.MonthEnd()
235
+ assert val == deserialize(*serialize(val))
236
+
216
237
 
217
238
  @switch_unpickle
218
239
  @pytest.mark.skipif(_arrow_dtype_supported, reason="pandas doesn't support ArrowDtype")
219
240
  def test_fake_arrow_dtype_serde():
220
241
  serializer = DtypeSerializer()
221
- payload, data, ok = serializer.serial(
242
+ payload, data, is_leaf = serializer.serial(
222
243
  FakeArrowDtype(pa.map_(pa.int64(), pa.string())), dict()
223
244
  )
224
245
 
225
- assert ok
246
+ assert is_leaf
226
247
  assert data == []
227
248
  assert payload == ["PA", "map<int64, string>"]
228
249
  new_dtype = serializer.deserial(payload, dict(), list())
@@ -233,6 +254,10 @@ def test_fake_arrow_dtype_serde():
233
254
  @switch_unpickle
234
255
  def test_arrow():
235
256
  test_array = np.random.rand(1000)
257
+ test_cplx_array = pa.array(
258
+ [["abc", "def"], ["ghi"], None],
259
+ type=pa.list_(pa.string()),
260
+ )
236
261
  test_df = pd.DataFrame(
237
262
  {
238
263
  "a": np.random.rand(1000),
@@ -242,14 +267,16 @@ def test_arrow():
242
267
  )
243
268
  test_vals = [
244
269
  pa.array(test_array),
270
+ test_cplx_array,
245
271
  pa.chunked_array([pa.array(test_array), pa.array(test_array)]),
272
+ pa.chunked_array([test_cplx_array, test_cplx_array]),
246
273
  pa.RecordBatch.from_pandas(test_df),
247
274
  pa.Table.from_pandas(test_df),
248
275
  ]
249
276
  for val in test_vals:
250
277
  deserialized = deserialize(*serialize(val))
251
278
  assert type(val) is type(deserialized)
252
- np.testing.assert_equal(val, deserialized)
279
+ assert str(val) == str(deserialized)
253
280
 
254
281
 
255
282
  @pytest.mark.parametrize(
@@ -12,7 +12,7 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- from . import extensions, fetch, linalg, random, special, statistics
15
+ from . import extensions, fetch, fft, linalg, random, spatial, special, statistics
16
16
  from .arithmetic import absolute
17
17
  from .arithmetic import absolute as abs
18
18
  from .arithmetic import (
@@ -58,6 +58,7 @@ from .arithmetic import invert as bitwise_not
58
58
  from .arithmetic import (
59
59
  isclose,
60
60
  iscomplex,
61
+ iscomplexobj,
61
62
  isfinite,
62
63
  isinf,
63
64
  isnan,
@@ -152,32 +153,49 @@ from .indexing import (
152
153
  take,
153
154
  unravel_index,
154
155
  )
155
- from .linalg.dot import dot
156
- from .linalg.inner import inner, innerproduct
157
- from .linalg.matmul import matmul
158
- from .linalg.tensordot import tensordot
159
- from .linalg.vdot import vdot
156
+ from .linalg import dot, einsum, inner, innerproduct, matmul, tensordot, vdot
160
157
  from .merge import append, column_stack, concatenate, dstack, hstack, stack, vstack
161
158
  from .misc import (
159
+ argwhere,
160
+ array_split,
162
161
  astype,
163
162
  atleast_1d,
164
163
  atleast_2d,
165
164
  atleast_3d,
165
+ broadcast_arrays,
166
166
  broadcast_to,
167
167
  copy,
168
+ copyto,
169
+ delete,
168
170
  diff,
171
+ dsplit,
172
+ ediff1d,
173
+ expand_dims,
174
+ flip,
175
+ fliplr,
176
+ flipud,
177
+ hsplit,
169
178
  in1d,
179
+ insert,
170
180
  isin,
181
+ moveaxis,
171
182
  ndim,
172
183
  ravel,
173
184
  repeat,
185
+ result_type,
186
+ roll,
187
+ rollaxis,
174
188
  searchsorted,
175
189
  setdiff1d,
190
+ shape,
191
+ split,
176
192
  squeeze,
177
193
  swapaxes,
194
+ tile,
178
195
  transpose,
179
196
  trapezoid,
180
197
  unique,
198
+ vsplit,
181
199
  where,
182
200
  )
183
201
  from .rechunk import rechunk
@@ -214,8 +232,20 @@ from .reduction import prod
214
232
  from .reduction import prod as product
215
233
  from .reduction import std, sum, var
216
234
  from .reshape import reshape
217
- from .sort import argsort, sort
218
- from .statistics import average, bincount, percentile, quantile
235
+ from .sort import argpartition, argsort, partition, sort
236
+ from .statistics import (
237
+ average,
238
+ bincount,
239
+ corrcoef,
240
+ cov,
241
+ digitize,
242
+ histogram,
243
+ histogram_bin_edges,
244
+ median,
245
+ percentile,
246
+ ptp,
247
+ quantile,
248
+ )
219
249
  from .ufunc import ufunc
220
250
 
221
251
  # isort: off
@@ -63,6 +63,7 @@ from .imag import TensorImag, imag
63
63
  from .invert import TensorInvert, invert
64
64
  from .isclose import TensorIsclose, isclose
65
65
  from .iscomplex import TensorIsComplex, iscomplex
66
+ from .iscomplexobj import iscomplexobj
66
67
  from .isfinite import TensorIsFinite, isfinite
67
68
  from .isinf import TensorIsInf, isinf
68
69
  from .isnan import TensorIsNan, isnan
@@ -117,14 +118,6 @@ from .truediv import TensorTrueDiv, truediv
117
118
  from .trunc import TensorTrunc, trunc
118
119
 
119
120
 
120
- def _wrap_iop(func):
121
- def inner(self, *args, **kwargs):
122
- kwargs["out"] = self
123
- return func(self, *args, **kwargs)
124
-
125
- return inner
126
-
127
-
128
121
  def _install():
129
122
  from ..core import TENSOR_TYPE, Tensor, TensorData
130
123
  from ..datasource import tensor as astensor
@@ -150,6 +143,22 @@ def _install():
150
143
 
151
144
  return eq
152
145
 
146
+ def _wrap_iop(func):
147
+ def inner(self, *args, **kwargs):
148
+ kwargs["out"] = self
149
+ return func(self, *args, **kwargs)
150
+
151
+ return inner
152
+
153
+ def _wrap_magic(func):
154
+ def inner(lhs, rhs, **kwargs):
155
+ ret = func(lhs, rhs, **kwargs)
156
+ if isinstance(ret, TENSOR_TYPE):
157
+ ret.op.extra_params["magic"] = True
158
+ return ret
159
+
160
+ return inner
161
+
153
162
  for cls in TENSOR_TYPE:
154
163
  setattr(cls, "__add__", add)
155
164
  setattr(cls, "__iadd__", _wrap_iop(add))
@@ -182,8 +191,8 @@ def _install():
182
191
  setattr(cls, "__irshift__", _wrap_iop(rshift))
183
192
  setattr(cls, "__rrshift__", rrshift)
184
193
 
185
- setattr(cls, "__eq__", _wrap_equal(equal))
186
- setattr(cls, "__ne__", not_equal)
194
+ setattr(cls, "__eq__", _wrap_magic(_wrap_equal(equal)))
195
+ setattr(cls, "__ne__", _wrap_magic(not_equal))
187
196
  setattr(cls, "__lt__", less)
188
197
  setattr(cls, "__le__", less_equal)
189
198
  setattr(cls, "__gt__", greater)
@@ -415,8 +415,8 @@ class TensorOutBinOp(TensorOperator, TensorElementWiseWithInputs):
415
415
  dtype = [r.dtype for r in self._fun(np.empty(1, dtype=x.dtype))]
416
416
 
417
417
  out = out or (None, None)
418
- out1 = out1 or out[0]
419
- out2 = out2 or out[1]
418
+ out1 = out1 if out1 is not None else out[0]
419
+ out2 = out2 if out2 is not None else out[1]
420
420
  x, out1, out2, where = self._process_inputs(x, out1, out2, where)
421
421
  shape = x.shape
422
422
  order1 = self._calc_order(x, out1)
@@ -0,0 +1,53 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import numpy as np
16
+
17
+
18
+ def iscomplexobj(x):
19
+ """
20
+ Check for a complex type or an array of complex numbers.
21
+
22
+ The type of the input is checked, not the value. Even if the input
23
+ has an imaginary part equal to zero, `iscomplexobj` evaluates to True.
24
+
25
+ Parameters
26
+ ----------
27
+ x : any
28
+ The input can be of any type and shape.
29
+
30
+ Returns
31
+ -------
32
+ iscomplexobj : bool
33
+ The return value, True if `x` is of a complex type or has at least
34
+ one complex element.
35
+
36
+ See Also
37
+ --------
38
+ isrealobj, iscomplex
39
+
40
+ Examples
41
+ --------
42
+ >>> import maxframe.tensor as mt
43
+ >>> mt.iscomplexobj(1)
44
+ False
45
+ >>> mt.iscomplexobj(1+0j)
46
+ True
47
+ >>> mt.iscomplexobj([3, 1+0j, True])
48
+ True
49
+ """
50
+ from ..datasource.array import tensor as astensor
51
+
52
+ t = astensor(x)
53
+ return issubclass(t.dtype.type, np.complexfloating)
@@ -16,7 +16,6 @@ import numpy as np
16
16
  import pytest
17
17
  import scipy.sparse as sps
18
18
 
19
- from ....core import enter_mode
20
19
  from ....utils import collect_leaf_operators
21
20
  from ...core import SparseTensor, Tensor
22
21
  from ...datasource import array, empty, ones, tensor
@@ -391,14 +390,6 @@ def test_get_set_real():
391
390
  a.real = [2, 4]
392
391
 
393
392
 
394
- def test_build_mode():
395
- t1 = ones((2, 3), chunk_size=2)
396
- assert t1 == 2
397
-
398
- with enter_mode(build=True):
399
- assert t1 != 2
400
-
401
-
402
393
  def test_unary_op_func_name():
403
394
  # make sure all the unary op has defined the func name.
404
395
 
@@ -450,3 +441,9 @@ def test_tree_arithmetic():
450
441
  assert len(t.inputs) == 3
451
442
  assert len(t.inputs[0].inputs) == 4
452
443
  assert len(t.inputs[-1].inputs) == 2
444
+
445
+
446
+ def test_iscomplexobj():
447
+ assert not iscomplexobj(1)
448
+ assert iscomplexobj(1 + 0j)
449
+ assert iscomplexobj([3, 1 + 0j, True])
maxframe/tensor/core.py CHANGED
@@ -35,6 +35,7 @@ from ..serialization.serializables import (
35
35
  Serializable,
36
36
  StringField,
37
37
  )
38
+ from ..utils import make_dtype
38
39
  from .utils import fetch_corner_data, get_chunk_slices
39
40
 
40
41
  logger = logging.getLogger(__name__)
@@ -73,7 +74,7 @@ class TensorData(HasShapeTileableData, _ExecuteAndFetchMixin):
73
74
  super().__init__(
74
75
  _op=op,
75
76
  _shape=shape,
76
- _dtype=dtype,
77
+ _dtype=make_dtype(dtype),
77
78
  _order=order,
78
79
  **kw,
79
80
  )
@@ -250,6 +251,9 @@ class Tensor(HasShapeTileable):
250
251
  def __len__(self):
251
252
  return len(self._data)
252
253
 
254
+ def __bool__(self):
255
+ return True if is_build_mode() else bool(self.to_numpy())
256
+
253
257
  @property
254
258
  def shape(self):
255
259
  return self._data.shape
@@ -520,7 +524,7 @@ class Tensor(HasShapeTileable):
520
524
  >>> a.execute()
521
525
  array([1, 2, 3, 4])
522
526
  """
523
- from .misc import partition
527
+ from .sort import partition
524
528
 
525
529
  self._data = partition(self, kth, axis=axis, kind=kind, order=order, **kw).data
526
530
 
@@ -207,7 +207,8 @@ def test_set_tensor_inputs():
207
207
  assert t3.op.inputs == [t1.data, t2.data]
208
208
  assert t3.inputs == [t1.data, t2.data]
209
209
 
210
- with pytest.raises(StopIteration):
210
+ msg = "Unexpected StopIteration happened"
211
+ with pytest.raises(RuntimeError, match=msg):
211
212
  t3.inputs = []
212
213
 
213
214
  t1 = tensor([1, 2], chunk_size=2)
@@ -15,12 +15,14 @@
15
15
  from ...core import CachedAccessor
16
16
  from .accessor import TensorMaxFrameAccessor
17
17
  from .apply_chunk import apply_chunk
18
+ from .rebalance import rebalance
18
19
 
19
20
 
20
21
  def _install():
21
22
  from ..core import TENSOR_TYPE
22
23
 
23
24
  TensorMaxFrameAccessor._register("apply_chunk", apply_chunk)
25
+ TensorMaxFrameAccessor._register("rebalance", rebalance)
24
26
 
25
27
  if TensorMaxFrameAccessor._api_count:
26
28
  for t in TENSOR_TYPE:
@@ -33,9 +33,9 @@ class TensorApplyChunk(TensorOperator, TensorOperatorMixin):
33
33
 
34
34
  func = FunctionField("func")
35
35
  elementwise = BoolField("elementwise")
36
- args = TupleField("args")
37
- kwargs = DictField("kwargs")
38
- with_chunk_index = BoolField("with_chunk_index")
36
+ args = TupleField("args", default=None)
37
+ kwargs = DictField("kwargs", default=None)
38
+ with_chunk_index = BoolField("with_chunk_index", default=False)
39
39
 
40
40
  @classmethod
41
41
  def _set_inputs(cls, op: "TensorApplyChunk", inputs):
@@ -0,0 +1,65 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from ... import opcodes
16
+ from ...serialization.serializables import Float64Field, Int64Field
17
+ from ..operators import TensorOperator, TensorOperatorMixin
18
+
19
+
20
+ class RebalanceMixin:
21
+ def __call__(self, in_obj):
22
+ self._output_types = in_obj.op.output_types
23
+ return self.new_tileable([in_obj], kws=[in_obj.params])
24
+
25
+
26
+ class TensorRebalance(RebalanceMixin, TensorOperatorMixin, TensorOperator):
27
+ _op_type_ = opcodes.REBALANCE
28
+
29
+ axis = Int64Field("axis", default=None)
30
+ factor = Float64Field("factor", default=None)
31
+ num_partitions = Int64Field("num_partitions", default=None)
32
+
33
+ def __init__(self, output_types=None, **kw):
34
+ super().__init__(_output_types=output_types, **kw)
35
+
36
+
37
+ def rebalance(tensor, axis=0, factor=None, num_partitions=None):
38
+ """
39
+ Make data more balanced across entire cluster.
40
+
41
+ Parameters
42
+ ----------
43
+ axis : int
44
+ The axis to rebalance.
45
+ factor : float
46
+ Specified so that number of chunks after balance is
47
+ total number of input chunks * factor.
48
+ num_partitions : int
49
+ Specified so the number of chunks are at most
50
+ num_partitions.
51
+
52
+ Returns
53
+ -------
54
+ Tensor
55
+ Result of tensor after rebalanced.
56
+ """
57
+ if num_partitions is None and factor is None:
58
+ raise ValueError("Need to specify num_partitions or factor")
59
+ if num_partitions is not None and factor is not None:
60
+ raise ValueError(
61
+ "num_partitions and factor cannot be specified at the same time"
62
+ )
63
+
64
+ op = TensorRebalance(axis=axis, factor=factor, num_partitions=num_partitions)
65
+ return op(tensor)
@@ -0,0 +1,32 @@
1
+ # Copyright 1999-2025 Alibaba Group Holding Ltd.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from .fft import TensorFFT, fft
16
+ from .fft2 import TensorFFT2, fft2
17
+ from .fftfreq import TensorFFTFreq, fftfreq
18
+ from .fftn import TensorFFTN, fftn
19
+ from .fftshift import TensorFFTShift, fftshift
20
+ from .hfft import TensorHFFT, hfft
21
+ from .ifft import TensorIFFT, ifft
22
+ from .ifft2 import TensorIFFT2, ifft2
23
+ from .ifftn import TensorIFFTN, ifftn
24
+ from .ifftshift import TensorIFFTShift, ifftshift
25
+ from .ihfft import TensorIHFFT, ihfft
26
+ from .irfft import TensorIRFFT, irfft
27
+ from .irfft2 import TensorIRFFT2, irfft2
28
+ from .irfftn import TensorIRFFTN, irfftn
29
+ from .rfft import TensorRFFT, rfft
30
+ from .rfft2 import TensorRFFT2, rfft2
31
+ from .rfftfreq import TensorRFFTFreq, rfftfreq
32
+ from .rfftn import TensorRFFTN, rfftn