maxframe 2.0.0b1__cp37-cp37m-win_amd64.whl → 2.2.0__cp37-cp37m-win_amd64.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 (395) hide show
  1. maxframe/__init__.py +1 -0
  2. maxframe/_utils.cp37-win_amd64.pyd +0 -0
  3. maxframe/_utils.pyx +14 -1
  4. maxframe/codegen/core.py +6 -6
  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 +34 -1
  15. maxframe/codegen/spe/dataframe/misc.py +9 -33
  16. maxframe/codegen/spe/dataframe/reduction.py +14 -9
  17. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  18. maxframe/codegen/spe/dataframe/sort.py +30 -17
  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_reshape.py +79 -0
  28. maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
  29. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
  30. maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
  31. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  32. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  33. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  34. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  35. maxframe/codegen/spe/tensor/__init__.py +3 -0
  36. maxframe/codegen/spe/tensor/fft.py +74 -0
  37. maxframe/codegen/spe/tensor/linalg.py +29 -2
  38. maxframe/codegen/spe/tensor/misc.py +79 -25
  39. maxframe/codegen/spe/tensor/spatial.py +45 -0
  40. maxframe/codegen/spe/tensor/statistics.py +44 -0
  41. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  42. maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
  43. maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
  44. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  45. maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
  46. maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
  47. maxframe/codegen/spe/utils.py +2 -0
  48. maxframe/config/config.py +70 -9
  49. maxframe/config/tests/test_validators.py +13 -1
  50. maxframe/config/validators.py +49 -0
  51. maxframe/conftest.py +44 -17
  52. maxframe/core/accessor.py +2 -2
  53. maxframe/core/entity/core.py +5 -0
  54. maxframe/core/entity/tileables.py +1 -1
  55. maxframe/core/graph/core.cp37-win_amd64.pyd +0 -0
  56. maxframe/core/graph/entity.py +1 -2
  57. maxframe/core/operator/base.py +9 -2
  58. maxframe/core/operator/core.py +10 -2
  59. maxframe/core/operator/utils.py +13 -0
  60. maxframe/dataframe/__init__.py +10 -3
  61. maxframe/dataframe/accessors/__init__.py +1 -1
  62. maxframe/dataframe/accessors/compat.py +45 -0
  63. maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
  64. maxframe/dataframe/accessors/dict_/contains.py +7 -16
  65. maxframe/dataframe/accessors/dict_/core.py +48 -0
  66. maxframe/dataframe/accessors/dict_/getitem.py +17 -21
  67. maxframe/dataframe/accessors/dict_/length.py +7 -16
  68. maxframe/dataframe/accessors/dict_/remove.py +6 -18
  69. maxframe/dataframe/accessors/dict_/setitem.py +8 -18
  70. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
  71. maxframe/dataframe/accessors/list_/__init__.py +2 -2
  72. maxframe/dataframe/accessors/list_/core.py +48 -0
  73. maxframe/dataframe/accessors/list_/getitem.py +12 -19
  74. maxframe/dataframe/accessors/list_/length.py +7 -16
  75. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
  76. maxframe/dataframe/accessors/string_/__init__.py +4 -1
  77. maxframe/dataframe/accessors/struct_/__init__.py +37 -0
  78. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  79. maxframe/dataframe/accessors/struct_/core.py +43 -0
  80. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  81. maxframe/dataframe/accessors/struct_/field.py +123 -0
  82. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  83. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  84. maxframe/dataframe/arithmetic/__init__.py +14 -4
  85. maxframe/dataframe/arithmetic/between.py +106 -0
  86. maxframe/dataframe/arithmetic/dot.py +237 -0
  87. maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
  88. maxframe/dataframe/core.py +63 -118
  89. maxframe/dataframe/datasource/__init__.py +18 -0
  90. maxframe/dataframe/datasource/from_dict.py +124 -0
  91. maxframe/dataframe/datasource/from_index.py +1 -1
  92. maxframe/dataframe/datasource/from_records.py +77 -0
  93. maxframe/dataframe/datasource/from_tensor.py +109 -41
  94. maxframe/dataframe/datasource/read_csv.py +2 -3
  95. maxframe/dataframe/datasource/read_odps_query.py +76 -16
  96. maxframe/dataframe/datasource/tests/test_datasource.py +84 -1
  97. maxframe/dataframe/datastore/__init__.py +5 -1
  98. maxframe/dataframe/datastore/to_csv.py +29 -41
  99. maxframe/dataframe/datastore/to_odps.py +30 -4
  100. maxframe/dataframe/extensions/__init__.py +20 -4
  101. maxframe/dataframe/extensions/apply_chunk.py +32 -6
  102. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  103. maxframe/dataframe/extensions/collect_kv.py +126 -0
  104. maxframe/dataframe/extensions/extract_kv.py +177 -0
  105. maxframe/dataframe/extensions/map_reduce.py +263 -0
  106. maxframe/dataframe/extensions/rebalance.py +62 -0
  107. maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
  108. maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
  109. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  110. maxframe/dataframe/groupby/__init__.py +12 -1
  111. maxframe/dataframe/groupby/aggregation.py +78 -45
  112. maxframe/dataframe/groupby/apply.py +1 -1
  113. maxframe/dataframe/groupby/apply_chunk.py +18 -2
  114. maxframe/dataframe/groupby/core.py +96 -12
  115. maxframe/dataframe/groupby/cum.py +4 -25
  116. maxframe/dataframe/groupby/expanding.py +264 -0
  117. maxframe/dataframe/groupby/fill.py +1 -1
  118. maxframe/dataframe/groupby/getitem.py +12 -5
  119. maxframe/dataframe/groupby/head.py +11 -1
  120. maxframe/dataframe/groupby/rank.py +136 -0
  121. maxframe/dataframe/groupby/rolling.py +206 -0
  122. maxframe/dataframe/groupby/shift.py +114 -0
  123. maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
  124. maxframe/dataframe/indexing/__init__.py +20 -1
  125. maxframe/dataframe/indexing/droplevel.py +195 -0
  126. maxframe/dataframe/indexing/filter.py +169 -0
  127. maxframe/dataframe/indexing/get_level_values.py +76 -0
  128. maxframe/dataframe/indexing/iat.py +45 -0
  129. maxframe/dataframe/indexing/iloc.py +152 -12
  130. maxframe/dataframe/indexing/insert.py +1 -1
  131. maxframe/dataframe/indexing/loc.py +287 -7
  132. maxframe/dataframe/indexing/reindex.py +14 -5
  133. maxframe/dataframe/indexing/rename.py +6 -0
  134. maxframe/dataframe/indexing/rename_axis.py +2 -2
  135. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  136. maxframe/dataframe/indexing/reset_index.py +33 -6
  137. maxframe/dataframe/indexing/sample.py +8 -0
  138. maxframe/dataframe/indexing/setitem.py +3 -3
  139. maxframe/dataframe/indexing/swaplevel.py +185 -0
  140. maxframe/dataframe/indexing/take.py +99 -0
  141. maxframe/dataframe/indexing/truncate.py +140 -0
  142. maxframe/dataframe/indexing/where.py +0 -11
  143. maxframe/dataframe/indexing/xs.py +148 -0
  144. maxframe/dataframe/merge/__init__.py +12 -1
  145. maxframe/dataframe/merge/append.py +97 -98
  146. maxframe/dataframe/merge/combine_first.py +120 -0
  147. maxframe/dataframe/merge/compare.py +387 -0
  148. maxframe/dataframe/merge/concat.py +183 -0
  149. maxframe/dataframe/merge/update.py +271 -0
  150. maxframe/dataframe/misc/__init__.py +16 -10
  151. maxframe/dataframe/misc/_duplicate.py +10 -4
  152. maxframe/dataframe/misc/apply.py +1 -1
  153. maxframe/dataframe/misc/check_unique.py +51 -0
  154. maxframe/dataframe/misc/clip.py +145 -0
  155. maxframe/dataframe/misc/describe.py +175 -9
  156. maxframe/dataframe/misc/drop_duplicates.py +2 -2
  157. maxframe/dataframe/misc/duplicated.py +2 -2
  158. maxframe/dataframe/misc/get_dummies.py +5 -1
  159. maxframe/dataframe/misc/isin.py +2 -2
  160. maxframe/dataframe/misc/map.py +94 -0
  161. maxframe/dataframe/misc/tests/test_misc.py +13 -2
  162. maxframe/dataframe/misc/to_numeric.py +3 -0
  163. maxframe/dataframe/misc/transform.py +12 -5
  164. maxframe/dataframe/misc/transpose.py +13 -1
  165. maxframe/dataframe/misc/valid_index.py +115 -0
  166. maxframe/dataframe/misc/value_counts.py +38 -4
  167. maxframe/dataframe/missing/checkna.py +13 -6
  168. maxframe/dataframe/missing/dropna.py +5 -0
  169. maxframe/dataframe/missing/fillna.py +1 -1
  170. maxframe/dataframe/missing/replace.py +7 -4
  171. maxframe/dataframe/reduction/__init__.py +29 -15
  172. maxframe/dataframe/reduction/aggregation.py +38 -9
  173. maxframe/dataframe/reduction/all.py +2 -2
  174. maxframe/dataframe/reduction/any.py +2 -2
  175. maxframe/dataframe/reduction/argmax.py +100 -0
  176. maxframe/dataframe/reduction/argmin.py +100 -0
  177. maxframe/dataframe/reduction/core.py +65 -18
  178. maxframe/dataframe/reduction/count.py +13 -9
  179. maxframe/dataframe/reduction/cov.py +166 -0
  180. maxframe/dataframe/reduction/cummax.py +2 -2
  181. maxframe/dataframe/reduction/cummin.py +2 -2
  182. maxframe/dataframe/reduction/cumprod.py +2 -2
  183. maxframe/dataframe/reduction/cumsum.py +2 -2
  184. maxframe/dataframe/reduction/custom_reduction.py +2 -2
  185. maxframe/dataframe/reduction/idxmax.py +185 -0
  186. maxframe/dataframe/reduction/idxmin.py +185 -0
  187. maxframe/dataframe/reduction/kurtosis.py +37 -30
  188. maxframe/dataframe/reduction/max.py +2 -2
  189. maxframe/dataframe/reduction/mean.py +9 -7
  190. maxframe/dataframe/reduction/median.py +2 -2
  191. maxframe/dataframe/reduction/min.py +2 -2
  192. maxframe/dataframe/reduction/nunique.py +9 -8
  193. maxframe/dataframe/reduction/prod.py +18 -13
  194. maxframe/dataframe/reduction/reduction_size.py +2 -2
  195. maxframe/dataframe/reduction/sem.py +13 -9
  196. maxframe/dataframe/reduction/skew.py +31 -27
  197. maxframe/dataframe/reduction/str_concat.py +10 -7
  198. maxframe/dataframe/reduction/sum.py +18 -14
  199. maxframe/dataframe/reduction/unique.py +20 -3
  200. maxframe/dataframe/reduction/var.py +16 -12
  201. maxframe/dataframe/reshape/__init__.py +38 -0
  202. maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
  203. maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
  204. maxframe/dataframe/reshape/unstack.py +114 -0
  205. maxframe/dataframe/sort/__init__.py +8 -0
  206. maxframe/dataframe/sort/argsort.py +62 -0
  207. maxframe/dataframe/sort/core.py +1 -0
  208. maxframe/dataframe/sort/nlargest.py +238 -0
  209. maxframe/dataframe/sort/nsmallest.py +228 -0
  210. maxframe/dataframe/statistics/__init__.py +3 -3
  211. maxframe/dataframe/statistics/corr.py +1 -0
  212. maxframe/dataframe/statistics/quantile.py +2 -2
  213. maxframe/dataframe/tests/test_typing.py +104 -0
  214. maxframe/dataframe/tests/test_utils.py +66 -2
  215. maxframe/dataframe/typing_.py +185 -0
  216. maxframe/dataframe/utils.py +95 -26
  217. maxframe/dataframe/window/aggregation.py +8 -4
  218. maxframe/dataframe/window/core.py +14 -1
  219. maxframe/dataframe/window/ewm.py +1 -3
  220. maxframe/dataframe/window/expanding.py +37 -35
  221. maxframe/dataframe/window/rolling.py +49 -39
  222. maxframe/dataframe/window/tests/test_expanding.py +1 -7
  223. maxframe/dataframe/window/tests/test_rolling.py +1 -1
  224. maxframe/env.py +7 -4
  225. maxframe/errors.py +2 -2
  226. maxframe/io/objects/tests/test_object_io.py +4 -2
  227. maxframe/io/odpsio/schema.py +9 -3
  228. maxframe/io/odpsio/tableio.py +7 -2
  229. maxframe/io/odpsio/tests/test_schema.py +198 -83
  230. maxframe/io/odpsio/tests/test_volumeio.py +4 -15
  231. maxframe/io/odpsio/volumeio.py +23 -8
  232. maxframe/learn/__init__.py +10 -2
  233. maxframe/learn/cluster/__init__.py +15 -0
  234. maxframe/learn/cluster/_kmeans.py +782 -0
  235. maxframe/learn/contrib/llm/core.py +2 -0
  236. maxframe/learn/contrib/xgboost/core.py +87 -1
  237. maxframe/learn/contrib/xgboost/train.py +5 -2
  238. maxframe/learn/core.py +66 -0
  239. maxframe/learn/linear_model/_base.py +58 -1
  240. maxframe/learn/linear_model/_lin_reg.py +1 -1
  241. maxframe/learn/metrics/__init__.py +6 -0
  242. maxframe/learn/metrics/_classification.py +145 -0
  243. maxframe/learn/metrics/_ranking.py +477 -0
  244. maxframe/learn/metrics/_scorer.py +60 -0
  245. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  246. maxframe/learn/metrics/pairwise/core.py +77 -0
  247. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  248. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  249. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  250. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  251. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  252. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  253. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  254. maxframe/learn/metrics/tests/__init__.py +13 -0
  255. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  256. maxframe/learn/utils/__init__.py +1 -1
  257. maxframe/learn/utils/checks.py +1 -2
  258. maxframe/learn/utils/core.py +59 -0
  259. maxframe/learn/utils/extmath.py +37 -0
  260. maxframe/learn/utils/odpsio.py +193 -0
  261. maxframe/learn/utils/validation.py +2 -2
  262. maxframe/lib/compat.py +40 -0
  263. maxframe/lib/dtypes_extension/__init__.py +16 -1
  264. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
  265. maxframe/lib/dtypes_extension/blob.py +304 -0
  266. maxframe/lib/dtypes_extension/dtypes.py +40 -0
  267. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  268. maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
  269. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  270. maxframe/lib/filesystem/_oss_lib/common.py +122 -50
  271. maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
  272. maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
  273. maxframe/lib/filesystem/base.py +1 -1
  274. maxframe/lib/filesystem/core.py +1 -1
  275. maxframe/lib/filesystem/oss.py +115 -46
  276. maxframe/lib/filesystem/tests/test_oss.py +74 -36
  277. maxframe/lib/mmh3.cp37-win_amd64.pyd +0 -0
  278. maxframe/lib/wrapped_pickle.py +10 -0
  279. maxframe/opcodes.py +33 -15
  280. maxframe/protocol.py +12 -0
  281. maxframe/serialization/__init__.py +11 -2
  282. maxframe/serialization/arrow.py +38 -13
  283. maxframe/serialization/blob.py +32 -0
  284. maxframe/serialization/core.cp37-win_amd64.pyd +0 -0
  285. maxframe/serialization/core.pyx +39 -1
  286. maxframe/serialization/exception.py +2 -4
  287. maxframe/serialization/numpy.py +11 -0
  288. maxframe/serialization/pandas.py +46 -9
  289. maxframe/serialization/serializables/core.py +2 -2
  290. maxframe/serialization/tests/test_serial.py +29 -2
  291. maxframe/tensor/__init__.py +38 -8
  292. maxframe/tensor/arithmetic/__init__.py +19 -10
  293. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  294. maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -0
  295. maxframe/tensor/core.py +3 -2
  296. maxframe/tensor/datasource/tests/test_datasource.py +2 -1
  297. maxframe/tensor/extensions/__init__.py +2 -0
  298. maxframe/tensor/extensions/apply_chunk.py +3 -3
  299. maxframe/tensor/extensions/rebalance.py +65 -0
  300. maxframe/tensor/fft/__init__.py +32 -0
  301. maxframe/tensor/fft/core.py +168 -0
  302. maxframe/tensor/fft/fft.py +112 -0
  303. maxframe/tensor/fft/fft2.py +118 -0
  304. maxframe/tensor/fft/fftfreq.py +80 -0
  305. maxframe/tensor/fft/fftn.py +123 -0
  306. maxframe/tensor/fft/fftshift.py +79 -0
  307. maxframe/tensor/fft/hfft.py +112 -0
  308. maxframe/tensor/fft/ifft.py +114 -0
  309. maxframe/tensor/fft/ifft2.py +115 -0
  310. maxframe/tensor/fft/ifftn.py +123 -0
  311. maxframe/tensor/fft/ifftshift.py +73 -0
  312. maxframe/tensor/fft/ihfft.py +93 -0
  313. maxframe/tensor/fft/irfft.py +118 -0
  314. maxframe/tensor/fft/irfft2.py +62 -0
  315. maxframe/tensor/fft/irfftn.py +114 -0
  316. maxframe/tensor/fft/rfft.py +116 -0
  317. maxframe/tensor/fft/rfft2.py +63 -0
  318. maxframe/tensor/fft/rfftfreq.py +87 -0
  319. maxframe/tensor/fft/rfftn.py +113 -0
  320. maxframe/tensor/indexing/fill_diagonal.py +1 -7
  321. maxframe/tensor/linalg/__init__.py +7 -0
  322. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  323. maxframe/tensor/linalg/cholesky.py +117 -0
  324. maxframe/tensor/linalg/einsum.py +339 -0
  325. maxframe/tensor/linalg/lstsq.py +100 -0
  326. maxframe/tensor/linalg/matrix_norm.py +75 -0
  327. maxframe/tensor/linalg/norm.py +249 -0
  328. maxframe/tensor/linalg/solve.py +72 -0
  329. maxframe/tensor/linalg/solve_triangular.py +2 -2
  330. maxframe/tensor/linalg/vector_norm.py +113 -0
  331. maxframe/tensor/misc/__init__.py +24 -1
  332. maxframe/tensor/misc/argwhere.py +72 -0
  333. maxframe/tensor/misc/array_split.py +46 -0
  334. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  335. maxframe/tensor/misc/copyto.py +130 -0
  336. maxframe/tensor/misc/delete.py +104 -0
  337. maxframe/tensor/misc/dsplit.py +68 -0
  338. maxframe/tensor/misc/ediff1d.py +74 -0
  339. maxframe/tensor/misc/expand_dims.py +85 -0
  340. maxframe/tensor/misc/flip.py +90 -0
  341. maxframe/tensor/misc/fliplr.py +64 -0
  342. maxframe/tensor/misc/flipud.py +68 -0
  343. maxframe/tensor/misc/hsplit.py +85 -0
  344. maxframe/tensor/misc/insert.py +139 -0
  345. maxframe/tensor/misc/moveaxis.py +83 -0
  346. maxframe/tensor/misc/result_type.py +88 -0
  347. maxframe/tensor/misc/roll.py +124 -0
  348. maxframe/tensor/misc/rollaxis.py +77 -0
  349. maxframe/tensor/misc/shape.py +89 -0
  350. maxframe/tensor/misc/split.py +190 -0
  351. maxframe/tensor/misc/tile.py +109 -0
  352. maxframe/tensor/misc/vsplit.py +74 -0
  353. maxframe/tensor/reduction/array_equal.py +2 -1
  354. maxframe/tensor/sort/__init__.py +2 -0
  355. maxframe/tensor/sort/argpartition.py +98 -0
  356. maxframe/tensor/sort/partition.py +228 -0
  357. maxframe/tensor/spatial/__init__.py +15 -0
  358. maxframe/tensor/spatial/distance/__init__.py +17 -0
  359. maxframe/tensor/spatial/distance/cdist.py +421 -0
  360. maxframe/tensor/spatial/distance/pdist.py +398 -0
  361. maxframe/tensor/spatial/distance/squareform.py +153 -0
  362. maxframe/tensor/special/__init__.py +159 -21
  363. maxframe/tensor/special/airy.py +55 -0
  364. maxframe/tensor/special/bessel.py +199 -0
  365. maxframe/tensor/special/core.py +65 -4
  366. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  367. maxframe/tensor/special/ellip_harm.py +55 -0
  368. maxframe/tensor/special/err_fresnel.py +223 -0
  369. maxframe/tensor/special/gamma_funcs.py +303 -0
  370. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  371. maxframe/tensor/special/info_theory.py +189 -0
  372. maxframe/tensor/special/misc.py +21 -0
  373. maxframe/tensor/statistics/__init__.py +6 -0
  374. maxframe/tensor/statistics/corrcoef.py +77 -0
  375. maxframe/tensor/statistics/cov.py +222 -0
  376. maxframe/tensor/statistics/digitize.py +126 -0
  377. maxframe/tensor/statistics/histogram.py +520 -0
  378. maxframe/tensor/statistics/median.py +85 -0
  379. maxframe/tensor/statistics/ptp.py +89 -0
  380. maxframe/tensor/utils.py +3 -3
  381. maxframe/tests/test_utils.py +43 -1
  382. maxframe/tests/utils.py +3 -13
  383. maxframe/typing_.py +2 -0
  384. maxframe/udf.py +27 -2
  385. maxframe/utils.py +193 -19
  386. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/METADATA +3 -2
  387. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/RECORD +395 -240
  388. maxframe_client/fetcher.py +35 -4
  389. maxframe_client/session/odps.py +7 -2
  390. maxframe_client/tests/test_fetcher.py +76 -3
  391. maxframe_client/tests/test_session.py +4 -1
  392. /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
  393. /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
  394. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/WHEEL +0 -0
  395. {maxframe-2.0.0b1.dist-info → maxframe-2.2.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,74 @@
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 typing import List, Union
16
+
17
+ from ....tensor.fft import TensorFFTFreq, TensorRFFTFreq
18
+ from ....tensor.fft.core import TensorFFTMixin, TensorFFTNMixin, TensorFFTShiftMixin
19
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
20
+
21
+
22
+ @register_op_adapter(TensorFFTMixin)
23
+ class TensorFFTAdapter(SPEOperatorAdapter):
24
+ def generate_code(self, op: TensorFFTMixin, context: SPECodeContext) -> List[str]:
25
+ context.register_import("numpy", "np")
26
+ func_name = type(op).__name__.lower()[6:]
27
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
28
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
29
+ kw_str = self.generate_call_args_with_attributes(
30
+ op, context, kw_keys=["n", "axis", "norm"], skip_none=True
31
+ )
32
+ return [f"{res_var_name} = np.fft.{func_name}({input_var_name}, {kw_str})"]
33
+
34
+
35
+ @register_op_adapter(TensorFFTNMixin)
36
+ class TensorFFTNAdapter(SPEOperatorAdapter):
37
+ def generate_code(self, op: TensorFFTNMixin, context: SPECodeContext) -> List[str]:
38
+ context.register_import("numpy", "np")
39
+ func_name = type(op).__name__.lower()[6:]
40
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
41
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
42
+ kw_str = self.generate_call_args_with_attributes(
43
+ op, context, "shape", kw_keys=["axes", "norm"], skip_none=True
44
+ )
45
+ return [f"{res_var_name} = np.fft.{func_name}({input_var_name}, {kw_str})"]
46
+
47
+
48
+ @register_op_adapter(TensorFFTShiftMixin)
49
+ class TensorFFTShiftAdapter(SPEOperatorAdapter):
50
+ def generate_code(
51
+ self, op: TensorFFTShiftMixin, context: SPECodeContext
52
+ ) -> List[str]:
53
+ context.register_import("numpy", "np")
54
+ func_name = type(op).__name__.lower()[6:]
55
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
56
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
57
+ kw_str = self.generate_call_args_with_attributes(
58
+ op, context, kw_keys=["axes"], skip_none=True
59
+ )
60
+ return [f"{res_var_name} = np.fft.{func_name}({input_var_name}, {kw_str})"]
61
+
62
+
63
+ @register_op_adapter([TensorFFTFreq, TensorRFFTFreq])
64
+ class TensorFFTFreqAdapter(SPEOperatorAdapter):
65
+ def generate_code(
66
+ self, op: Union[TensorFFTFreq, TensorRFFTFreq], context: SPECodeContext
67
+ ) -> List[str]:
68
+ context.register_import("numpy", "np")
69
+ func_name = type(op).__name__.lower()[6:]
70
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
71
+ kw_str = self.generate_call_args_with_attributes(
72
+ op, context, "n", kw_keys=["d"]
73
+ )
74
+ return [f"{res_var_name} = np.fft.{func_name}({kw_str})"]
@@ -15,9 +15,12 @@
15
15
  from typing import List
16
16
 
17
17
  from ....tensor.linalg import (
18
+ TensorCholesky,
19
+ TensorEinsum,
18
20
  TensorInv,
19
21
  TensorLU,
20
22
  TensorMatmul,
23
+ TensorNorm,
21
24
  TensorQR,
22
25
  TensorSolveTriangular,
23
26
  TensorSVD,
@@ -26,17 +29,22 @@ from ....tensor.linalg import (
26
29
  from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
27
30
  from ..utils import build_method_call_adapter
28
31
 
32
+ TensorCholeskyAdapter = build_method_call_adapter(
33
+ TensorCholesky, "cholesky", 0, kw_keys=["lower"], source_module="npl"
34
+ )
29
35
  TensorInvAdapter = build_method_call_adapter(
30
36
  TensorInv, "inv", "input", source_module="npl"
31
37
  )
32
38
  TensorLUAdapter = build_method_call_adapter(
33
39
  TensorLU, "lu", "input", source_module="spl"
34
40
  )
35
- TensorQRAdapter = build_method_call_adapter(TensorQR, "qr", 0, source_module="spl")
36
- TensorSVDAdapter = build_method_call_adapter(TensorSVD, "svd", 0, source_module="spl")
37
41
  TensorMatmulAdapter = build_method_call_adapter(
38
42
  TensorMatmul, "matmul", "a", "b", source_module="np", kw_keys=["casting", "order"]
39
43
  )
44
+ TensorNormAdapter = build_method_call_adapter(
45
+ TensorNorm, "norm", 0, kw_keys=["ord", "axis", "keepdims"], source_module="npl"
46
+ )
47
+ TensorQRAdapter = build_method_call_adapter(TensorQR, "qr", 0, source_module="spl")
40
48
  TensorSolveTriangularAdapter = build_method_call_adapter(
41
49
  TensorSolveTriangular,
42
50
  "solve_triangular",
@@ -45,6 +53,25 @@ TensorSolveTriangularAdapter = build_method_call_adapter(
45
53
  source_module="spl",
46
54
  kw_keys=["lower", "strict"],
47
55
  )
56
+ TensorSVDAdapter = build_method_call_adapter(TensorSVD, "svd", 0, source_module="spl")
57
+
58
+
59
+ @register_op_adapter(TensorEinsum)
60
+ class TensorEinsumAdapter(SPEOperatorAdapter):
61
+ def generate_code(self, op: TensorEinsum, context: SPECodeContext) -> List[str]:
62
+ context.register_import("numpy", "np")
63
+
64
+ inp_var_names_str = ", ".join(
65
+ [context.get_input_tileable_variable(inp) for inp in op.inputs]
66
+ )
67
+ res_var_name = context.get_output_tileable_variable(op.outputs[0])
68
+ subscripts_str = self.translate_var(context, op.subscripts)
69
+ kw_str = self.generate_call_args_with_attributes(
70
+ op, context, kw_keys=["dtype", "order", "casting"]
71
+ )
72
+ return [
73
+ f"{res_var_name} = np.einsum({subscripts_str}, {inp_var_names_str}, {kw_str})"
74
+ ]
48
75
 
49
76
 
50
77
  @register_op_adapter(TensorTensorDot)
@@ -16,11 +16,17 @@ from typing import List
16
16
 
17
17
  import numpy as np
18
18
 
19
+ from ....tensor.indexing import TensorFillDiagonal
19
20
  from ....tensor.misc import (
21
+ TensorArgwhere,
22
+ TensorCopyTo,
23
+ TensorDelete,
20
24
  TensorDiff,
25
+ TensorGetShape,
21
26
  TensorIsIn,
22
27
  TensorRepeat,
23
28
  TensorSearchsorted,
29
+ TensorSplit,
24
30
  TensorSqueeze,
25
31
  TensorSwapAxes,
26
32
  TensorTranspose,
@@ -28,15 +34,39 @@ from ....tensor.misc import (
28
34
  TensorUnique,
29
35
  TensorWhere,
30
36
  )
37
+ from ....tensor.misc.insert import TensorInsert
31
38
  from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
32
39
  from ..utils import build_method_call_adapter
33
40
 
34
41
  _trapz_func = "trapezoid" if hasattr(np, "trapezoid") else "trapz"
35
42
 
36
43
 
44
+ TensorArgwhereAdapter = build_method_call_adapter(
45
+ TensorArgwhere, "argwhere", 0, source_module="np"
46
+ )
47
+ TensorDeleteAdapter = build_method_call_adapter(
48
+ TensorDelete, "delete", 0, "index_obj", kw_keys=["axis"], source_module="np"
49
+ )
37
50
  TensorDiffAdapter = build_method_call_adapter(
38
51
  TensorDiff, "diff", 0, skip_none=True, kw_keys=["n", "axis"], source_module="np"
39
52
  )
53
+ TensorFillDiagonalAdapter = build_method_call_adapter(
54
+ TensorFillDiagonal,
55
+ "fill_diagonal",
56
+ 0,
57
+ "val",
58
+ skip_none=True,
59
+ kw_keys=["wrap"],
60
+ source_module="np",
61
+ )
62
+ TensorInsertAdapter = build_method_call_adapter(
63
+ TensorInsert,
64
+ "insert",
65
+ 0,
66
+ "index_obj",
67
+ kw_keys=["values", "axis"],
68
+ source_module="np",
69
+ )
40
70
  TensorIsInAdapter = build_method_call_adapter(
41
71
  TensorIsIn,
42
72
  "isin",
@@ -62,18 +92,6 @@ TensorSearchsortedAdapter = build_method_call_adapter(
62
92
  kw_keys=["side", "sorter"],
63
93
  source_module="np",
64
94
  )
65
-
66
-
67
- @register_op_adapter(TensorTranspose)
68
- class TensorTransposeAdapter(SPEOperatorAdapter):
69
- def generate_code(self, op: TensorTranspose, context: SPECodeContext) -> List[str]:
70
- context.register_import("numpy", "np")
71
- input_var_name = context.get_input_tileable_variable(op.inputs[0])
72
- res_var_name = context.get_output_tileable_variable(op.outputs[0])
73
- axes_var = self.translate_var(context, op.axes)
74
- return [f"{res_var_name} = np.transpose({input_var_name}, axes={axes_var})"]
75
-
76
-
77
95
  TensorTrapezoidAdapter = build_method_call_adapter(
78
96
  TensorTrapezoid,
79
97
  _trapz_func,
@@ -81,16 +99,60 @@ TensorTrapezoidAdapter = build_method_call_adapter(
81
99
  kw_keys=["y", "x", "dx", "axis"],
82
100
  source_module="np",
83
101
  )
102
+ TensorSqueezeAdapter = build_method_call_adapter(
103
+ TensorSqueeze, "squeeze", 0, kw_keys=["axis"], source_module="np"
104
+ )
105
+ TensorSwapAxesAdapter = build_method_call_adapter(
106
+ TensorSwapAxes, "swapaxes", "axis1", "axis2", source_module="np"
107
+ )
108
+ TensorTransposeAdapter = build_method_call_adapter(
109
+ TensorTranspose, "transpose", 0, kw_keys=["axes"], source_module="np"
110
+ )
111
+ TensorWhereAdapter = build_method_call_adapter(
112
+ TensorWhere, "where", "condition", "x", "y", source_module="np"
113
+ )
84
114
 
85
115
 
86
- @register_op_adapter(TensorSqueeze)
87
- class TensorSqueezeAdapter(SPEOperatorAdapter):
88
- def generate_code(self, op: TensorSqueeze, context: SPECodeContext) -> List[str]:
116
+ @register_op_adapter(TensorCopyTo)
117
+ class TensorCopyToAdapter(SPEOperatorAdapter):
118
+ def generate_code(self, op: TensorCopyTo, context: SPECodeContext) -> List[str]:
89
119
  context.register_import("numpy", "np")
90
- input_var_name = context.get_input_tileable_variable(op.inputs[0])
120
+ dst_var_name = context.get_input_tileable_variable(op.inputs[1])
121
+ src_var_name = context.get_input_tileable_variable(op.inputs[0])
91
122
  res_var_name = context.get_output_tileable_variable(op.outputs[0])
123
+ args_str = self.generate_call_args_with_attributes(
124
+ op, context, kw_keys=["casting", "where"], skip_none=True
125
+ )
126
+ return [
127
+ f"{res_var_name} = {dst_var_name}.copy()",
128
+ f"np.copyto({res_var_name}, {src_var_name}, {args_str})",
129
+ ]
130
+
131
+
132
+ @register_op_adapter(TensorGetShape)
133
+ class TensorGetShapeAdapter(SPEOperatorAdapter):
134
+ def generate_code(self, op: TensorGetShape, context: SPECodeContext) -> List[str]:
135
+ context.register_import("numpy", "np")
136
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
137
+ res_var_names = ", ".join(
138
+ context.get_output_tileable_variable(out) for out in op.outputs
139
+ )
140
+ return [f"{res_var_names} = np.shape({input_var_name})"]
141
+
142
+
143
+ @register_op_adapter(TensorSplit)
144
+ class TensorSplitAdapter(SPEOperatorAdapter):
145
+ def generate_code(self, op: TensorSplit, context: SPECodeContext) -> List[str]:
146
+ context.register_import("numpy", "np")
147
+ input_var_name = context.get_input_tileable_variable(op.inputs[0])
148
+ res_var_names = ", ".join(
149
+ context.get_output_tileable_variable(out) for out in op.outputs
150
+ )
151
+ idx_var = self.translate_var(context, op.indices_or_sections)
92
152
  axis_var = self.translate_var(context, op.axis)
93
- return [f"{res_var_name} = np.squeeze({input_var_name}, axis={axis_var})"]
153
+ return [
154
+ f"{res_var_names} = np.split({input_var_name}, {idx_var} axis={axis_var})"
155
+ ]
94
156
 
95
157
 
96
158
  @register_op_adapter(TensorUnique)
@@ -111,11 +173,3 @@ class TensorUniqueAdapter(SPEOperatorAdapter):
111
173
  f"return_inverse={return_inverse_var}, return_counts={return_counts_var}, "
112
174
  f"axis={axis_var})"
113
175
  ]
114
-
115
-
116
- TensorSwapAxesAdapter = build_method_call_adapter(
117
- TensorSwapAxes, "swapaxes", "axis1", "axis2", source_module="np"
118
- )
119
- TensorWhereAdapter = build_method_call_adapter(
120
- TensorWhere, "where", "condition", "x", "y", source_module="np"
121
- )
@@ -0,0 +1,45 @@
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 ....tensor.spatial.distance.cdist import TensorCDist
16
+ from ....tensor.spatial.distance.pdist import TensorPDist
17
+ from ....tensor.spatial.distance.squareform import TensorSquareForm
18
+ from ..utils import build_method_call_adapter
19
+
20
+ TensorCDistAdapter = build_method_call_adapter(
21
+ TensorCDist,
22
+ "cdist",
23
+ "xa",
24
+ "xb",
25
+ kw_keys=["metric", "p", "w"],
26
+ v="V",
27
+ vi="VI",
28
+ source_module="scipy.spatial.distance",
29
+ )
30
+ TensorPDistAdapter = build_method_call_adapter(
31
+ TensorPDist,
32
+ "pdist",
33
+ 0,
34
+ kw_keys=["metric", "p", "w"],
35
+ v="V",
36
+ vi="VI",
37
+ source_module="scipy.spatial.distance",
38
+ )
39
+ TensorSquareFormAdapter = build_method_call_adapter(
40
+ TensorSquareForm,
41
+ "squareform",
42
+ 0,
43
+ kw_keys=["checks"],
44
+ source_module="scipy.spatial.distance",
45
+ )
@@ -12,7 +12,13 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
+ from typing import List
16
+
15
17
  from ....tensor.statistics.bincount import TensorBinCount
18
+ from ....tensor.statistics.digitize import TensorDigitize
19
+ from ....tensor.statistics.histogram import TensorHistogram, TensorHistogramBinEdges
20
+ from ....tensor.statistics.quantile import TensorQuantile
21
+ from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
16
22
  from ..utils import build_method_call_adapter
17
23
 
18
24
  TensorBinCountAdapter = build_method_call_adapter(
@@ -22,3 +28,41 @@ TensorBinCountAdapter = build_method_call_adapter(
22
28
  kw_keys=["weights", "minlength"],
23
29
  source_module="np",
24
30
  )
31
+ TensorDigitizeAdapter = build_method_call_adapter(
32
+ TensorDigitize,
33
+ "digitize",
34
+ 0,
35
+ kw_keys=["bins", "right"],
36
+ source_module="np",
37
+ )
38
+ TensorHistogramBinEdgesAdapter = build_method_call_adapter(
39
+ TensorHistogramBinEdges,
40
+ "histogram_bin_edges",
41
+ 0,
42
+ kw_keys=["bins", "range", "weights"],
43
+ source_module="np",
44
+ )
45
+ TensorQuantileAdapter = build_method_call_adapter(
46
+ TensorQuantile,
47
+ "quantile",
48
+ 0,
49
+ kw_keys=["q", "axis", "overwrite_input", "interpolation", "keepdims"],
50
+ source_module="np",
51
+ )
52
+
53
+
54
+ @register_op_adapter(TensorHistogram)
55
+ class TensorHistogramAdapter(SPEOperatorAdapter):
56
+ def generate_code(self, op: TensorHistogram, context: SPECodeContext) -> List[str]:
57
+ context.register_import("numpy", "np")
58
+
59
+ inp_var_name = context.get_input_tileable_variable(op.inputs[0])
60
+ res_var_names = ", ".join(
61
+ context.get_output_tileable_variable(out) for out in op.outputs
62
+ )
63
+ if not op.ret_bins:
64
+ res_var_names += ", _"
65
+ kw_str = self.generate_call_args_with_attributes(
66
+ op, context, kw_keys=["bins", "range", "density", "weights"]
67
+ )
68
+ return [f"{res_var_names} = np.histogram({inp_var_name}, {kw_str})"]
@@ -0,0 +1,64 @@
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 maxframe.tensor as mt
16
+
17
+ from ...core import SPECodeContext
18
+ from ..fft import (
19
+ TensorFFTAdapter,
20
+ TensorFFTFreqAdapter,
21
+ TensorFFTNAdapter,
22
+ TensorFFTShiftAdapter,
23
+ )
24
+
25
+
26
+ def test_fft():
27
+ result = mt.fft.fft(mt.exp(2j * mt.pi * mt.arange(8) / 8))
28
+
29
+ adapter = TensorFFTAdapter()
30
+ context = SPECodeContext()
31
+ results = adapter.generate_code(result.op, context)
32
+ expected_results = ["var_1 = np.fft.fft(var_0, axis=-1)"]
33
+ assert results == expected_results
34
+
35
+
36
+ def test_fft2():
37
+ a = mt.mgrid[:5, :5][0]
38
+ result = mt.fft.fft2(a)
39
+
40
+ adapter = TensorFFTNAdapter()
41
+ context = SPECodeContext()
42
+ results = adapter.generate_code(result.op, context)
43
+ expected_results = ["var_1 = np.fft.fft2(var_0, None, axes=(-2, -1))"]
44
+ assert results == expected_results
45
+
46
+
47
+ def test_fftshift():
48
+ result = mt.fft.fftshift(mt.tensor(10), 0.1)
49
+
50
+ adapter = TensorFFTShiftAdapter()
51
+ context = SPECodeContext()
52
+ results = adapter.generate_code(result.op, context)
53
+ expected_results = ["var_1 = np.fft.fftshift(var_0, axes=(0.1,))"]
54
+ assert results == expected_results
55
+
56
+
57
+ def test_fftfreq():
58
+ result = mt.fft.fftfreq(10, 0.1)
59
+
60
+ adapter = TensorFFTFreqAdapter()
61
+ context = SPECodeContext()
62
+ results = adapter.generate_code(result.op, context)
63
+ expected_results = ["var_0 = np.fft.fftfreq(10, d=0.1)"]
64
+ assert results == expected_results
@@ -14,7 +14,21 @@
14
14
 
15
15
  from ..... import tensor as mt
16
16
  from ...core import SPECodeContext
17
- from ..linalg import TensorQRAdapter, TensorTensorDotAdapter
17
+ from ..linalg import TensorEinsumAdapter, TensorQRAdapter, TensorTensorDotAdapter
18
+
19
+
20
+ def test_einsum():
21
+ a = mt.arange(25).reshape(5, 5)
22
+ b = mt.arange(5)
23
+ adapter = TensorEinsumAdapter()
24
+ r = mt.einsum("ij,j", a, b)
25
+ context = SPECodeContext()
26
+ results = adapter.generate_code(r.op, context)
27
+ expected_results = [
28
+ "var_2 = np.einsum('ij,j->i', var_0, var_1, dtype=np.dtype('int64'),"
29
+ " order='K', casting='safe')"
30
+ ]
31
+ assert results == expected_results
18
32
 
19
33
 
20
34
  def test_qr():
@@ -15,7 +15,11 @@
15
15
  from ..... import tensor as mt
16
16
  from ...core import SPECodeContext
17
17
  from ..misc import (
18
+ TensorCopyToAdapter,
19
+ TensorGetShapeAdapter,
20
+ TensorInsertAdapter,
18
21
  TensorIsInAdapter,
22
+ TensorSplitAdapter,
19
23
  TensorSqueezeAdapter,
20
24
  TensorTransposeAdapter,
21
25
  TensorUniqueAdapter,
@@ -40,7 +44,7 @@ def test_transpose():
40
44
  adapter = TensorTransposeAdapter()
41
45
  context = SPECodeContext()
42
46
  results = adapter.generate_code(result.op, context)
43
- expected_results = ["var_1 = np.transpose(var_0, axes=[1, 0, 2])"]
47
+ expected_results = ["var_0 = np.transpose(var_1, axes=[1, 0, 2])"]
44
48
  assert results == expected_results
45
49
 
46
50
 
@@ -50,7 +54,7 @@ def test_squeeze():
50
54
  adapter = TensorSqueezeAdapter()
51
55
  context = SPECodeContext()
52
56
  results = adapter.generate_code(result.op, context)
53
- expected_results = ["var_1 = np.squeeze(var_0, axis=(0,))"]
57
+ expected_results = ["var_0 = np.squeeze(var_1, axis=(0,))"]
54
58
  assert results == expected_results
55
59
 
56
60
 
@@ -92,3 +96,49 @@ def test_unique():
92
96
  "np.unique(var_0, return_index=True, return_inverse=True, return_counts=True, axis=0)"
93
97
  ]
94
98
  assert results == expected_results
99
+
100
+
101
+ def test_insert():
102
+ result = mt.insert(mt.array([[1, 1], [2, 2], [3, 3]]), 1, 5)
103
+
104
+ adapter = TensorInsertAdapter()
105
+ context = SPECodeContext()
106
+ results = adapter.generate_code(result.op, context)
107
+ expected_results = ["var_0 = np.insert(var_1, 1, values=5)"]
108
+ assert results == expected_results
109
+
110
+
111
+ def test_split():
112
+ res_tp = mt.split(mt.array([1, 2, 3, 4, 5, 6]), 3)
113
+
114
+ adapter = TensorSplitAdapter()
115
+ context = SPECodeContext()
116
+ results = adapter.generate_code(res_tp[0].op, context)
117
+ expected_results = ["var_1, var_2, var_3 = np.split(var_0, 3 axis=0)"]
118
+ assert results == expected_results
119
+
120
+
121
+ def test_get_shape():
122
+ inp = mt.array([[1, 1], [2, 2], [3, 3]])
123
+ res = mt.shape(inp[:, inp[0, :] == 1])
124
+
125
+ adapter = TensorGetShapeAdapter()
126
+ context = SPECodeContext()
127
+ results = adapter.generate_code(res[0].op, context)
128
+ expected_results = ["var_1, var_2 = np.shape(var_0)"]
129
+ assert results == expected_results
130
+
131
+
132
+ def test_copyto():
133
+ dest = mt.array([[1, 1], [2, 2], [3, 3]])
134
+ src = mt.array([[1, 1], [2, 2], [3, 4]])
135
+ mt.copyto(dest, src)
136
+
137
+ adapter = TensorCopyToAdapter()
138
+ context = SPECodeContext()
139
+ results = adapter.generate_code(dest.op, context)
140
+ expected_results = [
141
+ "var_2 = var_0.copy()",
142
+ "np.copyto(var_2, var_1, casting='same_kind')",
143
+ ]
144
+ assert results == expected_results
@@ -0,0 +1,33 @@
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 tensor as mt
16
+ from ...core import SPECodeContext
17
+ from ..spatial import TensorCDistAdapter
18
+
19
+
20
+ def test_cdist():
21
+ xa = mt.random.rand(100, 10)
22
+ xb = mt.random.rand(89, 10)
23
+ VI = mt.random.rand(10, 10)
24
+ dist = mt.spatial.distance.cdist(xa, xb, metric="mahalanobis", VI=VI)
25
+
26
+ adapter = TensorCDistAdapter()
27
+ context = SPECodeContext()
28
+ results = adapter.generate_code(dist.op, context)
29
+ expected_results = [
30
+ "var_0 = scipy.spatial.distance.cdist("
31
+ "var_1, var_2, metric='mahalanobis', VI=var_3)"
32
+ ]
33
+ assert results == expected_results
@@ -14,7 +14,7 @@
14
14
 
15
15
  from ..... import tensor as mt
16
16
  from ...core import SPECodeContext
17
- from ..statistics import TensorBinCountAdapter
17
+ from ..statistics import TensorBinCountAdapter, TensorHistogramAdapter
18
18
 
19
19
 
20
20
  def test_bincount():
@@ -27,3 +27,17 @@ def test_bincount():
27
27
  results = adapter.generate_code(result.op, context)
28
28
  expected_results = ["var_0 = np.bincount(var_1, weights=var_2, minlength=0)"]
29
29
  assert results == expected_results
30
+
31
+
32
+ def test_histogram():
33
+ arr = mt.arange(5)
34
+ result, _bins = mt.histogram(arr, bins=3)
35
+
36
+ adapter = TensorHistogramAdapter()
37
+ context = SPECodeContext()
38
+ results = adapter.generate_code(result.op, context)
39
+ expected_results = [
40
+ "var_1, _ = np.histogram(var_0, bins=var_2, range=None, density=None, "
41
+ "weights=None)"
42
+ ]
43
+ assert results == expected_results
@@ -59,12 +59,8 @@ def test_codegen_with_udf(codegen):
59
59
 
60
60
  udf_1_body = base64.b64encode(pickle.dumps(f1, protocol=pickle.DEFAULT_PROTOCOL))
61
61
  udf_2_body = base64.b64encode(pickle.dumps(f2, protocol=pickle.DEFAULT_PROTOCOL))
62
- udf_1_value = (
63
- f"pickled_data = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
64
- )
65
- udf_2_value = (
66
- f"pickled_data = cloudpickle.loads(base64.b64decode({udf_2_body}), buffers=[])"
67
- )
62
+ udf_1_value = f"udf_main_entry = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
63
+ udf_2_value = f"udf_main_entry = cloudpickle.loads(base64.b64decode({udf_2_body}), buffers=[])"
68
64
  udf_1 = f"user_udf_f1_{hashlib.md5(udf_1_value.encode('utf-8')).hexdigest()}"
69
65
  udf_2 = f"user_udf_f2_{hashlib.md5(udf_2_value.encode('utf-8')).hexdigest()}"
70
66
 
@@ -74,9 +70,9 @@ def test_codegen_with_udf(codegen):
74
70
  import base64
75
71
  import cloudpickle
76
72
  {udf_1_value}
77
- {udf_1} = pickled_data
73
+ {udf_1} = udf_main_entry
78
74
  {udf_2_value}
79
- {udf_2} = pickled_data
75
+ {udf_2} = udf_main_entry
80
76
  if not running:
81
77
  raise RuntimeError('CANCELLED')
82
78
  var_0 = np.random.rand(1, 3)
@@ -111,9 +107,7 @@ def test_codegen_with_udf_and_args(codegen):
111
107
  protocol=pickle.DEFAULT_PROTOCOL,
112
108
  )
113
109
  )
114
- udf_1_value = (
115
- f"pickled_data = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
116
- )
110
+ udf_1_value = f"udf_main_entry = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
117
111
  udf_1 = f"user_udf_f1_{hashlib.md5(udf_1_value.encode('utf-8')).hexdigest()}"
118
112
 
119
113
  expected_contents = f"""
@@ -122,7 +116,7 @@ def test_codegen_with_udf_and_args(codegen):
122
116
  import base64
123
117
  import cloudpickle
124
118
  {udf_1_value}
125
- {udf_1} = pickled_data
119
+ {udf_1} = udf_main_entry
126
120
  if not running:
127
121
  raise RuntimeError('CANCELLED')
128
122
  var_0 = np.random.rand(1, 3)
@@ -37,6 +37,8 @@ def build_method_call_adapter(
37
37
  def generate_code(self, op: OperatorType, context: SPECodeContext) -> List[str]:
38
38
  if source_module in _import_aliases:
39
39
  context.register_import(_import_aliases[source_module], source_module)
40
+ elif source_module:
41
+ context.register_import(source_module)
40
42
 
41
43
  input_var_name = source_module or context.get_input_tileable_variable(
42
44
  op.inputs[0]