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
@@ -0,0 +1,51 @@
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 .....learn.metrics.pairwise.cosine import CosineDistances
16
+ from .....learn.metrics.pairwise.euclidean import EuclideanDistances
17
+ from .....learn.metrics.pairwise.haversine import HaversineDistances
18
+ from .....learn.metrics.pairwise.manhattan import ManhattanDistances
19
+ from ...utils import build_method_call_adapter
20
+
21
+ CosineDistancesAdapter = build_method_call_adapter(
22
+ CosineDistances,
23
+ "cosine_distances",
24
+ "x",
25
+ "y",
26
+ source_module="sklearn.metrics.pairwise",
27
+ )
28
+ EuclideanDistancesAdapter = build_method_call_adapter(
29
+ EuclideanDistances,
30
+ "euclidean_distances",
31
+ "x",
32
+ "y",
33
+ y_norm_squared="Y_norm_squared",
34
+ squared="squared",
35
+ x_norm_squared="X_norm_squared",
36
+ source_module="sklearn.metrics.pairwise",
37
+ )
38
+ HaversineDistancesAdapter = build_method_call_adapter(
39
+ HaversineDistances,
40
+ "haversine_distances",
41
+ "x",
42
+ "y",
43
+ source_module="sklearn.metrics.pairwise",
44
+ )
45
+ ManhattanDistancesAdapter = build_method_call_adapter(
46
+ ManhattanDistances,
47
+ "manhattan_distances",
48
+ "x",
49
+ "y",
50
+ source_module="sklearn.metrics.pairwise",
51
+ )
@@ -0,0 +1,36 @@
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 ......learn.metrics.pairwise import euclidean_distances
17
+ from ....core import SPECodeContext
18
+ from ..pairwise import EuclideanDistancesAdapter
19
+
20
+
21
+ def test_euclidean_distances():
22
+ x = mt.random.rand(10, 3)
23
+
24
+ d = euclidean_distances(
25
+ x,
26
+ X_norm_squared=mt.random.rand(10, 1),
27
+ )
28
+
29
+ adapter = EuclideanDistancesAdapter()
30
+ context = SPECodeContext()
31
+ results = adapter.generate_code(d.op, context)
32
+ expected_results = [
33
+ "var_0 = sklearn.metrics.pairwise.euclidean_distances("
34
+ "var_1, var_1, squared=False, X_norm_squared=var_2)"
35
+ ]
36
+ assert results == expected_results
@@ -0,0 +1,59 @@
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 ......learn.metrics import auc, roc_auc_score, roc_curve
17
+ from ....core import SPECodeContext
18
+ from .._ranking import AucOpAdapter, RocAucScoreAdapter, RocCurveAdapter
19
+
20
+
21
+ def test_auc():
22
+ t1 = mt.array([1, 1, 2, 2])
23
+ t2 = mt.array([0.1, 0.4, 0.35, 0.8])
24
+ result = auc(t1, t2)
25
+
26
+ adapter = AucOpAdapter()
27
+ context = SPECodeContext()
28
+ results = adapter.generate_code(result.op, context)
29
+ expected_results = ["var_2 = sk_auc(var_0, var_1)"]
30
+ assert results == expected_results
31
+
32
+
33
+ def test_roc_auc_score():
34
+ t1 = mt.array([0, 0, 1, 1])
35
+ t2 = mt.array([0.1, 0.4, 0.35, 0.8])
36
+ result = roc_auc_score(t1, t2)
37
+
38
+ adapter = RocAucScoreAdapter()
39
+ context = SPECodeContext()
40
+ results = adapter.generate_code(result.op, context)
41
+ expected_results = [
42
+ "var_2 = sk_roc_auc_score("
43
+ "var_0, var_1, average='macro', multi_class='raise')"
44
+ ]
45
+ assert results == expected_results
46
+
47
+
48
+ def test_roc_curve():
49
+ t1 = mt.array([0, 0, 1, 1])
50
+ t2 = mt.array([0.1, 0.4, 0.35, 0.8])
51
+ result = roc_curve(t1, t2)
52
+
53
+ adapter = RocCurveAdapter()
54
+ context = SPECodeContext()
55
+ results = adapter.generate_code(result[0].op, context)
56
+ expected_results = [
57
+ "var_2, var_3, var_4 = sk_roc_curve(" "var_0, var_1, drop_intermediate=True)"
58
+ ]
59
+ assert results == expected_results
@@ -17,6 +17,7 @@ from . import (
17
17
  datasource,
18
18
  extensions,
19
19
  fetch,
20
+ fft,
20
21
  indexing,
21
22
  linalg,
22
23
  merge,
@@ -24,5 +25,7 @@ from . import (
24
25
  random,
25
26
  reduction,
26
27
  reshape,
28
+ spatial,
27
29
  special,
30
+ statistics,
28
31
  )
@@ -142,6 +142,7 @@ class TensorOnesZerosLikeAdapter(SPEOperatorAdapter):
142
142
  ]
143
143
 
144
144
 
145
+ @register_op_adapter(Scalar)
145
146
  class TensorScalarAdapter(SPEOperatorAdapter):
146
147
  def accepts(self, op: Scalar) -> EngineAcceptance:
147
148
  return EngineAcceptance.SUCCESSOR
@@ -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():