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,115 @@
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
16
+
17
+ import numpy as np
18
+
19
+ from .... import opcodes
20
+ from ....core import EntityData
21
+ from ....serialization.serializables import KeyField
22
+ from ....tensor.core import TensorOrder
23
+ from ...preprocessing import normalize
24
+ from .core import PairwiseDistances
25
+
26
+
27
+ class CosineDistances(PairwiseDistances):
28
+ _op_type_ = opcodes.PAIRWISE_COSINE_DISTANCES
29
+
30
+ x = KeyField("x")
31
+ y = KeyField("y")
32
+
33
+ @classmethod
34
+ def _set_inputs(cls, op: "CosineDistances", inputs: List[EntityData]):
35
+ super()._set_inputs(op, inputs)
36
+ op.x, op.y = inputs[:2]
37
+
38
+ def __call__(self, x, y=None):
39
+ x, y = self.check_pairwise_arrays(x, y)
40
+ return self.new_tensor(
41
+ [x, y], shape=(x.shape[0], y.shape[0]), order=TensorOrder.C_ORDER
42
+ )
43
+
44
+
45
+ def cosine_similarity(X, Y=None, dense_output=True):
46
+ """Compute cosine similarity between samples in X and Y.
47
+
48
+ Cosine similarity, or the cosine kernel, computes similarity as the
49
+ normalized dot product of X and Y:
50
+
51
+ K(X, Y) = <X, Y> / (||X||*||Y||)
52
+
53
+ On L2-normalized data, this function is equivalent to linear_kernel.
54
+
55
+ Read more in the :ref:`User Guide <cosine_similarity>`.
56
+
57
+ Parameters
58
+ ----------
59
+ X : Tensor or sparse tensor, shape: (n_samples_X, n_features)
60
+ Input data.
61
+
62
+ Y : Tensor or sparse tensor, shape: (n_samples_Y, n_features)
63
+ Input data. If ``None``, the output will be the pairwise
64
+ similarities between all samples in ``X``.
65
+
66
+ dense_output : boolean (optional), default True
67
+ Whether to return dense output even when the input is sparse. If
68
+ ``False``, the output is sparse if both input tensors are sparse.
69
+
70
+ Returns
71
+ -------
72
+ kernel matrix : Tensor
73
+ A tensor with shape (n_samples_X, n_samples_Y).
74
+ """
75
+ X, Y = PairwiseDistances.check_pairwise_arrays(X, Y)
76
+
77
+ X_normalized = normalize(X, copy=True)
78
+ if X is Y:
79
+ Y_normalized = X_normalized
80
+ else:
81
+ Y_normalized = normalize(Y, copy=True)
82
+
83
+ K = X_normalized.dot(Y_normalized.T)
84
+ if dense_output:
85
+ K = K.todense()
86
+ return K
87
+
88
+
89
+ def cosine_distances(X, Y=None):
90
+ """Compute cosine distance between samples in X and Y.
91
+
92
+ Cosine distance is defined as 1.0 minus the cosine similarity.
93
+
94
+ Read more in the :ref:`User Guide <metrics>`.
95
+
96
+ Parameters
97
+ ----------
98
+ X : array_like, sparse matrix
99
+ with shape (n_samples_X, n_features).
100
+
101
+ Y : array_like, sparse matrix (optional)
102
+ with shape (n_samples_Y, n_features).
103
+
104
+ Returns
105
+ -------
106
+ distance matrix : Tensor
107
+ A tensor with shape (n_samples_X, n_samples_Y).
108
+
109
+ See also
110
+ --------
111
+ maxframe.learn.metrics.pairwise.cosine_similarity
112
+ maxframe.tensor.spatial.distance.cosine : dense matrices only
113
+ """
114
+ op = CosineDistances(x=X, y=Y, dtype=np.dtype(np.float64))
115
+ return op(X, y=Y)
@@ -0,0 +1,176 @@
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
16
+
17
+ import numpy as np
18
+
19
+ from .... import opcodes
20
+ from .... import tensor as mt
21
+ from ....config import options
22
+ from ....core import EntityData
23
+ from ....serialization.serializables import BoolField, KeyField
24
+ from ....tensor.core import TensorOrder
25
+ from ...utils.validation import check_array
26
+ from .core import PairwiseDistances
27
+
28
+
29
+ class EuclideanDistances(PairwiseDistances):
30
+ _op_type_ = opcodes.PAIRWISE_EUCLIDEAN_DISTANCES
31
+
32
+ x = KeyField("X")
33
+ y = KeyField("Y", default=None)
34
+ x_norm_squared = KeyField("X_norm_squared", default=None)
35
+ y_norm_squared = KeyField("Y_norm_squared", default=None)
36
+ squared = BoolField("squared", default=None)
37
+
38
+ @classmethod
39
+ def _set_inputs(cls, op: "EuclideanDistances", inputs: List[EntityData]):
40
+ super()._set_inputs(op, inputs)
41
+ input_iter = iter(inputs)
42
+ op.x = next(input_iter)
43
+ if op.y is not None:
44
+ op.y = next(input_iter)
45
+ if op.x_norm_squared is not None:
46
+ op.x_norm_squared = next(input_iter)
47
+ if op.y_norm_squared is not None:
48
+ op.y_norm_squared = next(input_iter)
49
+
50
+ def __call__(self, X, Y=None, Y_norm_squared=None, X_norm_squared=None):
51
+ # If norms are passed as float32, they are unused. If arrays are passed as
52
+ # float32, norms needs to be recomputed on upcast chunks.
53
+ # TODO: use a float64 accumulator in row_norms to avoid the latter.
54
+ if X_norm_squared is not None:
55
+ XX = check_array(X_norm_squared)
56
+ if XX.shape == (1, X.shape[0]):
57
+ XX = XX.T
58
+ elif XX.shape != (X.shape[0], 1):
59
+ raise ValueError("Incompatible dimensions for X and X_norm_squared")
60
+ if XX.dtype == np.float32:
61
+ XX = self.x_norm_squared = None
62
+ else:
63
+ XX = None
64
+
65
+ if X is Y and XX is not None:
66
+ # shortcut in the common case euclidean_distances(X, X)
67
+ YY = XX.T
68
+ elif Y_norm_squared is not None:
69
+ YY = mt.atleast_2d(Y_norm_squared)
70
+
71
+ if YY.shape != (1, Y.shape[0]):
72
+ raise ValueError("Incompatible dimensions for Y and Y_norm_squared")
73
+ if YY.dtype == np.float32:
74
+ YY = self.y_norm_squared = None
75
+ else:
76
+ YY = None
77
+
78
+ inputs = [X, Y]
79
+ if XX is not None:
80
+ inputs.append(XX)
81
+ if YY is not None:
82
+ inputs.append(YY)
83
+ return self.new_tensor(
84
+ inputs, shape=(X.shape[0], Y.shape[0]), order=TensorOrder.C_ORDER
85
+ )
86
+
87
+
88
+ def euclidean_distances(
89
+ X, Y=None, Y_norm_squared=None, squared=False, X_norm_squared=None
90
+ ):
91
+ """
92
+ Considering the rows of X (and Y=X) as vectors, compute the
93
+ distance matrix between each pair of vectors.
94
+
95
+ For efficiency reasons, the euclidean distance between a pair of row
96
+ vector x and y is computed as::
97
+
98
+ dist(x, y) = sqrt(dot(x, x) - 2 * dot(x, y) + dot(y, y))
99
+
100
+ This formulation has two advantages over other ways of computing distances.
101
+ First, it is computationally efficient when dealing with sparse data.
102
+ Second, if one argument varies but the other remains unchanged, then
103
+ `dot(x, x)` and/or `dot(y, y)` can be pre-computed.
104
+
105
+ However, this is not the most precise way of doing this computation, and
106
+ the distance matrix returned by this function may not be exactly
107
+ symmetric as required by, e.g., ``scipy.spatial.distance`` functions.
108
+
109
+ Read more in the :ref:`User Guide <metrics>`.
110
+
111
+ Parameters
112
+ ----------
113
+ X : {array-like, sparse matrix}, shape (n_samples_1, n_features)
114
+
115
+ Y : {array-like, sparse matrix}, shape (n_samples_2, n_features)
116
+
117
+ Y_norm_squared : array-like, shape (n_samples_2, ), optional
118
+ Pre-computed dot-products of vectors in Y (e.g.,
119
+ ``(Y**2).sum(axis=1)``)
120
+ May be ignored in some cases, see the note below.
121
+
122
+ squared : boolean, optional
123
+ Return squared Euclidean distances.
124
+
125
+ X_norm_squared : array-like, shape = [n_samples_1], optional
126
+ Pre-computed dot-products of vectors in X (e.g.,
127
+ ``(X**2).sum(axis=1)``)
128
+ May be ignored in some cases, see the note below.
129
+
130
+ Notes
131
+ -----
132
+ To achieve better accuracy, `X_norm_squared` and `Y_norm_squared` may be
133
+ unused if they are passed as ``float32``.
134
+
135
+ Returns
136
+ -------
137
+ distances : tensor, shape (n_samples_1, n_samples_2)
138
+
139
+ Examples
140
+ --------
141
+ >>> from maxframe.learn.metrics.pairwise import euclidean_distances
142
+ >>> X = [[0, 1], [1, 1]]
143
+ >>> # distance between rows of X
144
+ >>> euclidean_distances(X, X).execute()
145
+ array([[0., 1.],
146
+ [1., 0.]])
147
+ >>> # get distance to origin
148
+ >>> euclidean_distances(X, [[0, 0]]).execute()
149
+ array([[1. ],
150
+ [1.41421356]])
151
+
152
+ See also
153
+ --------
154
+ paired_distances : distances betweens pairs of elements of X and Y.
155
+ """
156
+ if X.dtype == np.float32:
157
+ if Y is None:
158
+ dtype = X.dtype
159
+ elif Y.dtype == np.float32:
160
+ dtype = np.float32
161
+ else:
162
+ dtype = np.float64
163
+ else:
164
+ dtype = np.float64
165
+
166
+ X, Y = EuclideanDistances.check_pairwise_arrays(X, Y)
167
+ op = EuclideanDistances(
168
+ x=X,
169
+ y=Y,
170
+ x_norm_squared=X_norm_squared,
171
+ y_norm_squared=Y_norm_squared,
172
+ squared=squared,
173
+ dtype=np.dtype(dtype),
174
+ chunk_store_limit=options.chunk_store_limit,
175
+ )
176
+ return op(X, Y=Y, Y_norm_squared=Y_norm_squared, X_norm_squared=X_norm_squared)
@@ -0,0 +1,96 @@
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
16
+
17
+ import numpy as np
18
+
19
+ from .... import opcodes
20
+ from ....core import EntityData
21
+ from ....serialization.serializables import BoolField, KeyField
22
+ from ....tensor.core import TensorOrder
23
+ from .core import PairwiseDistances
24
+
25
+
26
+ class HaversineDistances(PairwiseDistances):
27
+ _op_type_ = opcodes.PAIRWISE_HAVERSINE_DISTANCES
28
+
29
+ x = KeyField("x")
30
+ y = KeyField("y")
31
+ # for test purpose
32
+ use_sklearn = BoolField("use_sklearn", default=True)
33
+
34
+ @classmethod
35
+ def _set_inputs(cls, op: "HaversineDistances", inputs: List[EntityData]):
36
+ super()._set_inputs(op, inputs)
37
+ op.x, op.y = op._inputs[:2]
38
+
39
+ def __call__(self, X, Y=None):
40
+ X, Y = self.check_pairwise_arrays(X, Y)
41
+ if self.y is None:
42
+ self.y = Y
43
+
44
+ if X.shape[1] != 2 or Y.shape[1] != 2:
45
+ raise ValueError("Haversine distance only valid in 2 dimensions")
46
+ if X.issparse() or Y.issparse():
47
+ raise TypeError("Haversine distance requires inputs dense")
48
+
49
+ return self.new_tensor(
50
+ [X, Y], shape=(X.shape[0], Y.shape[0]), order=TensorOrder.C_ORDER
51
+ )
52
+
53
+
54
+ def haversine_distances(X, Y=None):
55
+ """Compute the Haversine distance between samples in X and Y
56
+
57
+ The Haversine (or great circle) distance is the angular distance between
58
+ two points on the surface of a sphere. The first distance of each point is
59
+ assumed to be the latitude, the second is the longitude, given in radians.
60
+ The dimension of the data must be 2.
61
+
62
+ .. math::
63
+ D(x, y) = 2\\arcsin[\\sqrt{\\sin^2((x1 - y1) / 2)
64
+ + \\cos(x1)\\cos(y1)\\sin^2((x2 - y2) / 2)}]
65
+
66
+ Parameters
67
+ ----------
68
+ X : array_like, shape (n_samples_1, 2)
69
+
70
+ Y : array_like, shape (n_samples_2, 2), optional
71
+
72
+ Returns
73
+ -------
74
+ distance : {Tensor}, shape (n_samples_1, n_samples_2)
75
+
76
+ Notes
77
+ -----
78
+ As the Earth is nearly spherical, the haversine formula provides a good
79
+ approximation of the distance between two points of the Earth surface, with
80
+ a less than 1% error on average.
81
+
82
+ Examples
83
+ --------
84
+ We want to calculate the distance between the Ezeiza Airport
85
+ (Buenos Aires, Argentina) and the Charles de Gaulle Airport (Paris, France)
86
+
87
+ >>> from maxframe.learn.metrics.pairwise import haversine_distances
88
+ >>> bsas = [-34.83333, -58.5166646]
89
+ >>> paris = [49.0083899664, 2.53844117956]
90
+ >>> result = haversine_distances([bsas, paris])
91
+ >>> (result * 6371000/1000).execute() # multiply by Earth radius to get kilometers
92
+ array([[ 0. , 11279.45379464],
93
+ [11279.45379464, 0. ]])
94
+ """
95
+ op = HaversineDistances(x=X, y=Y, dtype=np.dtype(np.float64))
96
+ return op(X, Y=Y)
@@ -0,0 +1,80 @@
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
16
+
17
+ import numpy as np
18
+
19
+ from .... import opcodes
20
+ from ....core import EntityData
21
+ from ....serialization.serializables import KeyField
22
+ from ....tensor.core import TensorOrder
23
+ from .core import PairwiseDistances
24
+
25
+
26
+ class ManhattanDistances(PairwiseDistances):
27
+ _op_type_ = opcodes.PAIRWISE_MANHATTAN_DISTANCES
28
+
29
+ x = KeyField("x")
30
+ y = KeyField("y")
31
+
32
+ @classmethod
33
+ def _set_inputs(cls, op: "ManhattanDistances", inputs: List[EntityData]):
34
+ super()._set_inputs(op, inputs)
35
+ op.x, op.y = inputs[:2]
36
+
37
+ def __call__(self, X, Y=None):
38
+ X, Y = self.check_pairwise_arrays(X, Y)
39
+ if self.y is None:
40
+ self.y = Y
41
+ shape = (X.shape[0], Y.shape[0])
42
+
43
+ return self.new_tensor([X, Y], shape=shape, order=TensorOrder.C_ORDER)
44
+
45
+
46
+ def manhattan_distances(X, Y=None):
47
+ """ Compute the L1 distances between the vectors in X and Y.
48
+
49
+ Read more in the :ref:`User Guide <metrics>`.
50
+
51
+ Parameters
52
+ ----------
53
+ X : array_like
54
+ A tensor with shape (n_samples_X, n_features).
55
+
56
+ Y : array_like, optional
57
+ A tensor with shape (n_samples_Y, n_features).
58
+
59
+ Returns
60
+ -------
61
+ D : Tensor
62
+ Shape is (n_samples_X, n_samples_Y) and D contains
63
+ the pairwise L1 distances.
64
+
65
+ Examples
66
+ --------
67
+ >>> from maxframe.learn.metrics.pairwise import manhattan_distances
68
+ >>> manhattan_distances([[3]], [[3]]).execute() #doctest:+ELLIPSIS
69
+ array([[0.]])
70
+ >>> manhattan_distances([[3]], [[2]]).execute() #doctest:+ELLIPSIS
71
+ array([[1.]])
72
+ >>> manhattan_distances([[2]], [[3]]).execute() #doctest:+ELLIPSIS
73
+ array([[1.]])
74
+ >>> manhattan_distances([[1, 2], [3, 4]],\
75
+ [[1, 2], [0, 3]]).execute() #doctest:+ELLIPSIS
76
+ array([[0., 2.],
77
+ [4., 4.]])
78
+ """
79
+ op = ManhattanDistances(x=X, y=Y, dtype=np.dtype(np.float64))
80
+ return op(X, Y=Y)
@@ -0,0 +1,127 @@
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 warnings
16
+ from functools import partial
17
+
18
+ try:
19
+ from sklearn.exceptions import DataConversionWarning
20
+ except ImportError: # pragma: no cover
21
+ DataConversionWarning = None
22
+
23
+ from ....tensor.spatial import distance
24
+ from ...utils.validation import check_non_negative
25
+ from .core import PairwiseDistances
26
+ from .cosine import cosine_distances
27
+ from .euclidean import euclidean_distances
28
+ from .haversine import haversine_distances
29
+ from .manhattan import manhattan_distances
30
+
31
+ _VALID_METRICS = [
32
+ "euclidean",
33
+ "l2",
34
+ "l1",
35
+ "manhattan",
36
+ "cityblock",
37
+ "braycurtis",
38
+ "canberra",
39
+ "chebyshev",
40
+ "correlation",
41
+ "cosine",
42
+ "dice",
43
+ "hamming",
44
+ "jaccard",
45
+ "kulsinski",
46
+ "mahalanobis",
47
+ "matching",
48
+ "minkowski",
49
+ "rogerstanimoto",
50
+ "russellrao",
51
+ "seuclidean",
52
+ "sokalmichener",
53
+ "sokalsneath",
54
+ "sqeuclidean",
55
+ "yule",
56
+ "wminkowski",
57
+ "haversine",
58
+ ]
59
+
60
+ # Helper functions - distance
61
+ PAIRWISE_DISTANCE_FUNCTIONS = {
62
+ # If updating this dictionary, update the doc in both distance_metrics()
63
+ # and also in pairwise_distances()!
64
+ "cityblock": manhattan_distances,
65
+ "cosine": cosine_distances,
66
+ "euclidean": euclidean_distances,
67
+ "haversine": haversine_distances,
68
+ "l2": euclidean_distances,
69
+ "l1": manhattan_distances,
70
+ "manhattan": manhattan_distances,
71
+ "precomputed": None, # HACK: precomputed is always allowed, never called
72
+ }
73
+
74
+ # These distances require boolean tensors, when using maxframe.tensor.spatial.distance
75
+ PAIRWISE_BOOLEAN_FUNCTIONS = [
76
+ "dice",
77
+ "jaccard",
78
+ "kulsinski",
79
+ "matching",
80
+ "rogerstanimoto",
81
+ "russellrao",
82
+ "sokalmichener",
83
+ "sokalsneath",
84
+ "yule",
85
+ ]
86
+
87
+
88
+ def pairwise_distances(X, Y=None, metric="euclidean", **kwds):
89
+ if (
90
+ metric not in _VALID_METRICS
91
+ and not callable(metric)
92
+ and metric != "precomputed"
93
+ ):
94
+ raise ValueError(
95
+ f"Unknown metric {metric}. Valid metrics are {_VALID_METRICS}, "
96
+ "or 'precomputed', or a callable"
97
+ )
98
+
99
+ if metric == "precomputed":
100
+ X, _ = PairwiseDistances.check_pairwise_arrays(X, Y, precomputed=True)
101
+
102
+ whom = (
103
+ "`pairwise_distances`. Precomputed distance "
104
+ " need to have non-negative values."
105
+ )
106
+ X = check_non_negative(X, whom=whom)
107
+ return X
108
+ elif metric in PAIRWISE_DISTANCE_FUNCTIONS:
109
+ func = PAIRWISE_DISTANCE_FUNCTIONS[metric]
110
+ else:
111
+ # including when metric is callable
112
+ dtype = bool if metric in PAIRWISE_BOOLEAN_FUNCTIONS else None
113
+
114
+ if (
115
+ dtype == bool
116
+ and (X.dtype != bool or (Y is not None and Y.dtype != bool))
117
+ and DataConversionWarning is not None
118
+ ):
119
+ msg = f"Data was converted to boolean for metric {metric}"
120
+ warnings.warn(msg, DataConversionWarning)
121
+
122
+ X, Y = PairwiseDistances.check_pairwise_arrays(X, Y, dtype=dtype)
123
+ if X is Y:
124
+ return distance.squareform(distance.pdist(X, metric=metric, **kwds))
125
+ func = partial(distance.cdist, metric=metric, **kwds)
126
+
127
+ return func(X, Y, **kwds)