maxframe 2.4.0rc1__cp312-cp312-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.
Files changed (1122) hide show
  1. maxframe/__init__.py +33 -0
  2. maxframe/_utils.cp312-win32.pyd +0 -0
  3. maxframe/_utils.pxd +33 -0
  4. maxframe/_utils.pyi +21 -0
  5. maxframe/_utils.pyx +561 -0
  6. maxframe/codegen/__init__.py +27 -0
  7. maxframe/codegen/core.py +597 -0
  8. maxframe/codegen/spe/__init__.py +16 -0
  9. maxframe/codegen/spe/core.py +307 -0
  10. maxframe/codegen/spe/dataframe/__init__.py +38 -0
  11. maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
  12. maxframe/codegen/spe/dataframe/accessors/base.py +71 -0
  13. maxframe/codegen/spe/dataframe/accessors/dict_.py +89 -0
  14. maxframe/codegen/spe/dataframe/accessors/list_.py +44 -0
  15. maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
  16. maxframe/codegen/spe/dataframe/arithmetic.py +89 -0
  17. maxframe/codegen/spe/dataframe/datasource.py +181 -0
  18. maxframe/codegen/spe/dataframe/datastore.py +204 -0
  19. maxframe/codegen/spe/dataframe/extensions.py +63 -0
  20. maxframe/codegen/spe/dataframe/fetch.py +26 -0
  21. maxframe/codegen/spe/dataframe/groupby.py +312 -0
  22. maxframe/codegen/spe/dataframe/indexing.py +333 -0
  23. maxframe/codegen/spe/dataframe/merge.py +110 -0
  24. maxframe/codegen/spe/dataframe/misc.py +264 -0
  25. maxframe/codegen/spe/dataframe/missing.py +64 -0
  26. maxframe/codegen/spe/dataframe/reduction.py +183 -0
  27. maxframe/codegen/spe/dataframe/reshape.py +46 -0
  28. maxframe/codegen/spe/dataframe/sort.py +104 -0
  29. maxframe/codegen/spe/dataframe/statistics.py +46 -0
  30. maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
  31. maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
  32. maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
  33. maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +304 -0
  34. maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +134 -0
  35. maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
  36. maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
  37. maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
  38. maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
  39. maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +95 -0
  40. maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
  41. maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
  42. maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
  43. maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
  44. maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
  45. maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
  46. maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
  47. maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
  48. maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
  49. maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
  50. maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
  51. maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +202 -0
  52. maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
  53. maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
  54. maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
  55. maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
  56. maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
  57. maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
  58. maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
  59. maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
  60. maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
  61. maxframe/codegen/spe/dataframe/tests/test_groupby.py +288 -0
  62. maxframe/codegen/spe/dataframe/tests/test_merge.py +426 -0
  63. maxframe/codegen/spe/dataframe/tests/test_reduction.py +117 -0
  64. maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
  65. maxframe/codegen/spe/dataframe/tests/test_sort.py +179 -0
  66. maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
  67. maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
  68. maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
  69. maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
  70. maxframe/codegen/spe/dataframe/tseries.py +55 -0
  71. maxframe/codegen/spe/dataframe/udf.py +62 -0
  72. maxframe/codegen/spe/dataframe/value_counts.py +31 -0
  73. maxframe/codegen/spe/dataframe/window.py +65 -0
  74. maxframe/codegen/spe/learn/__init__.py +15 -0
  75. maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
  76. maxframe/codegen/spe/learn/contrib/lightgbm.py +161 -0
  77. maxframe/codegen/spe/learn/contrib/models.py +41 -0
  78. maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
  79. maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
  80. maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
  81. maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
  82. maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
  83. maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +99 -0
  84. maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
  85. maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
  86. maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
  87. maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
  88. maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
  89. maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
  90. maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
  91. maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
  92. maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
  93. maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
  94. maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
  95. maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
  96. maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
  97. maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
  98. maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
  99. maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
  100. maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
  101. maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
  102. maxframe/codegen/spe/learn/utils/__init__.py +15 -0
  103. maxframe/codegen/spe/learn/utils/checks.py +55 -0
  104. maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
  105. maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
  106. maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
  107. maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
  108. maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
  109. maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
  110. maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
  111. maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
  112. maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
  113. maxframe/codegen/spe/learn/utils/validation.py +35 -0
  114. maxframe/codegen/spe/objects.py +26 -0
  115. maxframe/codegen/spe/remote.py +29 -0
  116. maxframe/codegen/spe/tensor/__init__.py +31 -0
  117. maxframe/codegen/spe/tensor/arithmetic.py +95 -0
  118. maxframe/codegen/spe/tensor/core.py +41 -0
  119. maxframe/codegen/spe/tensor/datasource.py +166 -0
  120. maxframe/codegen/spe/tensor/extensions.py +35 -0
  121. maxframe/codegen/spe/tensor/fetch.py +26 -0
  122. maxframe/codegen/spe/tensor/fft.py +74 -0
  123. maxframe/codegen/spe/tensor/indexing.py +63 -0
  124. maxframe/codegen/spe/tensor/linalg.py +90 -0
  125. maxframe/codegen/spe/tensor/merge.py +31 -0
  126. maxframe/codegen/spe/tensor/misc.py +175 -0
  127. maxframe/codegen/spe/tensor/random.py +29 -0
  128. maxframe/codegen/spe/tensor/reduction.py +39 -0
  129. maxframe/codegen/spe/tensor/reshape.py +26 -0
  130. maxframe/codegen/spe/tensor/sort.py +42 -0
  131. maxframe/codegen/spe/tensor/spatial.py +45 -0
  132. maxframe/codegen/spe/tensor/special.py +35 -0
  133. maxframe/codegen/spe/tensor/statistics.py +68 -0
  134. maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
  135. maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
  136. maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
  137. maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
  138. maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
  139. maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
  140. maxframe/codegen/spe/tensor/tests/test_linalg.py +52 -0
  141. maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
  142. maxframe/codegen/spe/tensor/tests/test_misc.py +144 -0
  143. maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
  144. maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
  145. maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
  146. maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
  147. maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
  148. maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
  149. maxframe/codegen/spe/tensor/tests/test_statistics.py +43 -0
  150. maxframe/codegen/spe/tests/__init__.py +13 -0
  151. maxframe/codegen/spe/tests/test_remote.py +29 -0
  152. maxframe/codegen/spe/tests/test_spe_codegen.py +135 -0
  153. maxframe/codegen/spe/utils.py +56 -0
  154. maxframe/codegen/tests/__init__.py +13 -0
  155. maxframe/codegen/tests/test_codegen.py +67 -0
  156. maxframe/config/__init__.py +15 -0
  157. maxframe/config/config.py +630 -0
  158. maxframe/config/tests/__init__.py +13 -0
  159. maxframe/config/tests/test_config.py +114 -0
  160. maxframe/config/tests/test_validators.py +46 -0
  161. maxframe/config/validators.py +142 -0
  162. maxframe/conftest.py +261 -0
  163. maxframe/core/__init__.py +53 -0
  164. maxframe/core/accessor.py +45 -0
  165. maxframe/core/base.py +157 -0
  166. maxframe/core/context.py +110 -0
  167. maxframe/core/entity/__init__.py +34 -0
  168. maxframe/core/entity/core.py +150 -0
  169. maxframe/core/entity/executable.py +337 -0
  170. maxframe/core/entity/objects.py +115 -0
  171. maxframe/core/entity/output_types.py +101 -0
  172. maxframe/core/entity/tests/__init__.py +13 -0
  173. maxframe/core/entity/tests/test_objects.py +42 -0
  174. maxframe/core/entity/tileables.py +376 -0
  175. maxframe/core/entity/utils.py +39 -0
  176. maxframe/core/graph/__init__.py +22 -0
  177. maxframe/core/graph/builder/__init__.py +15 -0
  178. maxframe/core/graph/builder/base.py +90 -0
  179. maxframe/core/graph/builder/tileable.py +34 -0
  180. maxframe/core/graph/builder/utils.py +37 -0
  181. maxframe/core/graph/core.cp312-win32.pyd +0 -0
  182. maxframe/core/graph/core.pyx +478 -0
  183. maxframe/core/graph/entity.py +187 -0
  184. maxframe/core/graph/tests/__init__.py +13 -0
  185. maxframe/core/graph/tests/test_graph.py +205 -0
  186. maxframe/core/mode.py +101 -0
  187. maxframe/core/operator/__init__.py +32 -0
  188. maxframe/core/operator/base.py +481 -0
  189. maxframe/core/operator/core.py +307 -0
  190. maxframe/core/operator/fetch.py +40 -0
  191. maxframe/core/operator/objects.py +43 -0
  192. maxframe/core/operator/shuffle.py +45 -0
  193. maxframe/core/operator/tests/__init__.py +13 -0
  194. maxframe/core/operator/tests/test_core.py +64 -0
  195. maxframe/core/operator/utils.py +68 -0
  196. maxframe/core/tests/__init__.py +13 -0
  197. maxframe/core/tests/test_mode.py +75 -0
  198. maxframe/dataframe/__init__.py +90 -0
  199. maxframe/dataframe/accessors/__init__.py +20 -0
  200. maxframe/dataframe/accessors/compat.py +45 -0
  201. maxframe/dataframe/accessors/datetime_/__init__.py +35 -0
  202. maxframe/dataframe/accessors/datetime_/accessor.py +67 -0
  203. maxframe/dataframe/accessors/datetime_/core.py +106 -0
  204. maxframe/dataframe/accessors/datetime_/tests/__init__.py +13 -0
  205. maxframe/dataframe/accessors/datetime_/tests/test_datetime_accessor.py +41 -0
  206. maxframe/dataframe/accessors/dict_/__init__.py +45 -0
  207. maxframe/dataframe/accessors/dict_/accessor.py +39 -0
  208. maxframe/dataframe/accessors/dict_/contains.py +72 -0
  209. maxframe/dataframe/accessors/dict_/core.py +48 -0
  210. maxframe/dataframe/accessors/dict_/getitem.py +140 -0
  211. maxframe/dataframe/accessors/dict_/length.py +64 -0
  212. maxframe/dataframe/accessors/dict_/remove.py +75 -0
  213. maxframe/dataframe/accessors/dict_/setitem.py +79 -0
  214. maxframe/dataframe/accessors/dict_/tests/__init__.py +13 -0
  215. maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +168 -0
  216. maxframe/dataframe/accessors/list_/__init__.py +39 -0
  217. maxframe/dataframe/accessors/list_/accessor.py +39 -0
  218. maxframe/dataframe/accessors/list_/core.py +48 -0
  219. maxframe/dataframe/accessors/list_/getitem.py +128 -0
  220. maxframe/dataframe/accessors/list_/length.py +64 -0
  221. maxframe/dataframe/accessors/list_/tests/__init__.py +13 -0
  222. maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +81 -0
  223. maxframe/dataframe/accessors/plotting/__init__.py +40 -0
  224. maxframe/dataframe/accessors/plotting/core.py +78 -0
  225. maxframe/dataframe/accessors/plotting/tests/__init__.py +13 -0
  226. maxframe/dataframe/accessors/plotting/tests/test_plotting_accessor.py +136 -0
  227. maxframe/dataframe/accessors/string_/__init__.py +36 -0
  228. maxframe/dataframe/accessors/string_/accessor.py +215 -0
  229. maxframe/dataframe/accessors/string_/core.py +226 -0
  230. maxframe/dataframe/accessors/string_/tests/__init__.py +13 -0
  231. maxframe/dataframe/accessors/string_/tests/test_string_accessor.py +73 -0
  232. maxframe/dataframe/accessors/struct_/__init__.py +39 -0
  233. maxframe/dataframe/accessors/struct_/accessor.py +39 -0
  234. maxframe/dataframe/accessors/struct_/core.py +43 -0
  235. maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
  236. maxframe/dataframe/accessors/struct_/field.py +123 -0
  237. maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
  238. maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
  239. maxframe/dataframe/arithmetic/__init__.py +373 -0
  240. maxframe/dataframe/arithmetic/abs.py +33 -0
  241. maxframe/dataframe/arithmetic/add.py +60 -0
  242. maxframe/dataframe/arithmetic/arccos.py +28 -0
  243. maxframe/dataframe/arithmetic/arccosh.py +28 -0
  244. maxframe/dataframe/arithmetic/arcsin.py +28 -0
  245. maxframe/dataframe/arithmetic/arcsinh.py +28 -0
  246. maxframe/dataframe/arithmetic/arctan.py +28 -0
  247. maxframe/dataframe/arithmetic/arctanh.py +28 -0
  248. maxframe/dataframe/arithmetic/between.py +106 -0
  249. maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
  250. maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
  251. maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
  252. maxframe/dataframe/arithmetic/ceil.py +28 -0
  253. maxframe/dataframe/arithmetic/core.py +361 -0
  254. maxframe/dataframe/arithmetic/cos.py +28 -0
  255. maxframe/dataframe/arithmetic/cosh.py +28 -0
  256. maxframe/dataframe/arithmetic/degrees.py +28 -0
  257. maxframe/dataframe/arithmetic/docstring.py +416 -0
  258. maxframe/dataframe/arithmetic/dot.py +237 -0
  259. maxframe/dataframe/arithmetic/equal.py +58 -0
  260. maxframe/dataframe/arithmetic/exp.py +28 -0
  261. maxframe/dataframe/arithmetic/exp2.py +28 -0
  262. maxframe/dataframe/arithmetic/expm1.py +28 -0
  263. maxframe/dataframe/arithmetic/floor.py +28 -0
  264. maxframe/dataframe/arithmetic/floordiv.py +64 -0
  265. maxframe/dataframe/arithmetic/greater.py +59 -0
  266. maxframe/dataframe/arithmetic/greater_equal.py +59 -0
  267. maxframe/dataframe/arithmetic/invert.py +33 -0
  268. maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
  269. maxframe/dataframe/arithmetic/less.py +57 -0
  270. maxframe/dataframe/arithmetic/less_equal.py +59 -0
  271. maxframe/dataframe/arithmetic/log.py +28 -0
  272. maxframe/dataframe/arithmetic/log10.py +28 -0
  273. maxframe/dataframe/arithmetic/log2.py +28 -0
  274. maxframe/dataframe/arithmetic/maximum.py +33 -0
  275. maxframe/dataframe/arithmetic/minimum.py +33 -0
  276. maxframe/dataframe/arithmetic/mod.py +60 -0
  277. maxframe/dataframe/arithmetic/multiply.py +60 -0
  278. maxframe/dataframe/arithmetic/negative.py +33 -0
  279. maxframe/dataframe/arithmetic/not_equal.py +58 -0
  280. maxframe/dataframe/arithmetic/power.py +68 -0
  281. maxframe/dataframe/arithmetic/radians.py +28 -0
  282. maxframe/dataframe/arithmetic/round.py +144 -0
  283. maxframe/dataframe/arithmetic/sin.py +28 -0
  284. maxframe/dataframe/arithmetic/sinh.py +28 -0
  285. maxframe/dataframe/arithmetic/sqrt.py +28 -0
  286. maxframe/dataframe/arithmetic/subtract.py +64 -0
  287. maxframe/dataframe/arithmetic/tan.py +28 -0
  288. maxframe/dataframe/arithmetic/tanh.py +28 -0
  289. maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
  290. maxframe/dataframe/arithmetic/tests/test_arithmetic.py +747 -0
  291. maxframe/dataframe/arithmetic/truediv.py +64 -0
  292. maxframe/dataframe/arithmetic/trunc.py +28 -0
  293. maxframe/dataframe/core.py +2386 -0
  294. maxframe/dataframe/datasource/__init__.py +33 -0
  295. maxframe/dataframe/datasource/core.py +112 -0
  296. maxframe/dataframe/datasource/dataframe.py +59 -0
  297. maxframe/dataframe/datasource/date_range.py +512 -0
  298. maxframe/dataframe/datasource/direct.py +57 -0
  299. maxframe/dataframe/datasource/from_dict.py +124 -0
  300. maxframe/dataframe/datasource/from_index.py +58 -0
  301. maxframe/dataframe/datasource/from_records.py +191 -0
  302. maxframe/dataframe/datasource/from_tensor.py +503 -0
  303. maxframe/dataframe/datasource/index.py +117 -0
  304. maxframe/dataframe/datasource/read_csv.py +534 -0
  305. maxframe/dataframe/datasource/read_odps_query.py +536 -0
  306. maxframe/dataframe/datasource/read_odps_table.py +295 -0
  307. maxframe/dataframe/datasource/read_parquet.py +278 -0
  308. maxframe/dataframe/datasource/series.py +55 -0
  309. maxframe/dataframe/datasource/tests/__init__.py +13 -0
  310. maxframe/dataframe/datasource/tests/test_datasource.py +663 -0
  311. maxframe/dataframe/datastore/__init__.py +41 -0
  312. maxframe/dataframe/datastore/core.py +28 -0
  313. maxframe/dataframe/datastore/direct.py +268 -0
  314. maxframe/dataframe/datastore/tests/__init__.py +13 -0
  315. maxframe/dataframe/datastore/tests/test_to_odps.py +99 -0
  316. maxframe/dataframe/datastore/to_csv.py +219 -0
  317. maxframe/dataframe/datastore/to_json.py +215 -0
  318. maxframe/dataframe/datastore/to_odps.py +285 -0
  319. maxframe/dataframe/datastore/to_parquet.py +121 -0
  320. maxframe/dataframe/extensions/__init__.py +70 -0
  321. maxframe/dataframe/extensions/accessor.py +35 -0
  322. maxframe/dataframe/extensions/apply_chunk.py +733 -0
  323. maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
  324. maxframe/dataframe/extensions/collect_kv.py +126 -0
  325. maxframe/dataframe/extensions/extract_kv.py +177 -0
  326. maxframe/dataframe/extensions/flatjson.py +133 -0
  327. maxframe/dataframe/extensions/flatmap.py +329 -0
  328. maxframe/dataframe/extensions/map_reduce.py +263 -0
  329. maxframe/dataframe/extensions/rebalance.py +62 -0
  330. maxframe/dataframe/extensions/reshuffle.py +83 -0
  331. maxframe/dataframe/extensions/tests/__init__.py +13 -0
  332. maxframe/dataframe/extensions/tests/test_apply_chunk.py +194 -0
  333. maxframe/dataframe/extensions/tests/test_extensions.py +198 -0
  334. maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
  335. maxframe/dataframe/fetch/__init__.py +15 -0
  336. maxframe/dataframe/fetch/core.py +97 -0
  337. maxframe/dataframe/groupby/__init__.py +105 -0
  338. maxframe/dataframe/groupby/aggregation.py +485 -0
  339. maxframe/dataframe/groupby/apply.py +235 -0
  340. maxframe/dataframe/groupby/apply_chunk.py +407 -0
  341. maxframe/dataframe/groupby/core.py +342 -0
  342. maxframe/dataframe/groupby/cum.py +102 -0
  343. maxframe/dataframe/groupby/expanding.py +264 -0
  344. maxframe/dataframe/groupby/extensions.py +26 -0
  345. maxframe/dataframe/groupby/fill.py +149 -0
  346. maxframe/dataframe/groupby/getitem.py +105 -0
  347. maxframe/dataframe/groupby/head.py +115 -0
  348. maxframe/dataframe/groupby/rank.py +136 -0
  349. maxframe/dataframe/groupby/rolling.py +206 -0
  350. maxframe/dataframe/groupby/sample.py +214 -0
  351. maxframe/dataframe/groupby/shift.py +114 -0
  352. maxframe/dataframe/groupby/tests/__init__.py +13 -0
  353. maxframe/dataframe/groupby/tests/test_groupby.py +373 -0
  354. maxframe/dataframe/groupby/transform.py +264 -0
  355. maxframe/dataframe/indexing/__init__.py +104 -0
  356. maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
  357. maxframe/dataframe/indexing/align.py +350 -0
  358. maxframe/dataframe/indexing/at.py +83 -0
  359. maxframe/dataframe/indexing/droplevel.py +195 -0
  360. maxframe/dataframe/indexing/filter.py +169 -0
  361. maxframe/dataframe/indexing/get_level_values.py +76 -0
  362. maxframe/dataframe/indexing/getitem.py +205 -0
  363. maxframe/dataframe/indexing/iat.py +82 -0
  364. maxframe/dataframe/indexing/iloc.py +711 -0
  365. maxframe/dataframe/indexing/insert.py +118 -0
  366. maxframe/dataframe/indexing/loc.py +694 -0
  367. maxframe/dataframe/indexing/reindex.py +541 -0
  368. maxframe/dataframe/indexing/rename.py +445 -0
  369. maxframe/dataframe/indexing/rename_axis.py +217 -0
  370. maxframe/dataframe/indexing/reorder_levels.py +143 -0
  371. maxframe/dataframe/indexing/reset_index.py +427 -0
  372. maxframe/dataframe/indexing/sample.py +232 -0
  373. maxframe/dataframe/indexing/set_axis.py +197 -0
  374. maxframe/dataframe/indexing/set_index.py +128 -0
  375. maxframe/dataframe/indexing/setitem.py +133 -0
  376. maxframe/dataframe/indexing/swaplevel.py +185 -0
  377. maxframe/dataframe/indexing/take.py +99 -0
  378. maxframe/dataframe/indexing/tests/__init__.py +13 -0
  379. maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
  380. maxframe/dataframe/indexing/truncate.py +140 -0
  381. maxframe/dataframe/indexing/where.py +300 -0
  382. maxframe/dataframe/indexing/xs.py +148 -0
  383. maxframe/dataframe/initializer.py +298 -0
  384. maxframe/dataframe/merge/__init__.py +53 -0
  385. maxframe/dataframe/merge/append.py +120 -0
  386. maxframe/dataframe/merge/combine.py +244 -0
  387. maxframe/dataframe/merge/combine_first.py +120 -0
  388. maxframe/dataframe/merge/compare.py +387 -0
  389. maxframe/dataframe/merge/concat.py +500 -0
  390. maxframe/dataframe/merge/merge.py +806 -0
  391. maxframe/dataframe/merge/tests/__init__.py +13 -0
  392. maxframe/dataframe/merge/tests/test_merge.py +390 -0
  393. maxframe/dataframe/merge/update.py +271 -0
  394. maxframe/dataframe/misc/__init__.py +145 -0
  395. maxframe/dataframe/misc/_duplicate.py +56 -0
  396. maxframe/dataframe/misc/apply.py +730 -0
  397. maxframe/dataframe/misc/astype.py +237 -0
  398. maxframe/dataframe/misc/case_when.py +145 -0
  399. maxframe/dataframe/misc/check_monotonic.py +84 -0
  400. maxframe/dataframe/misc/check_unique.py +82 -0
  401. maxframe/dataframe/misc/clip.py +145 -0
  402. maxframe/dataframe/misc/cut.py +386 -0
  403. maxframe/dataframe/misc/describe.py +278 -0
  404. maxframe/dataframe/misc/diff.py +210 -0
  405. maxframe/dataframe/misc/drop.py +473 -0
  406. maxframe/dataframe/misc/drop_duplicates.py +251 -0
  407. maxframe/dataframe/misc/duplicated.py +292 -0
  408. maxframe/dataframe/misc/eval.py +730 -0
  409. maxframe/dataframe/misc/explode.py +171 -0
  410. maxframe/dataframe/misc/factorize.py +160 -0
  411. maxframe/dataframe/misc/get_dummies.py +241 -0
  412. maxframe/dataframe/misc/infer_dtypes.py +251 -0
  413. maxframe/dataframe/misc/isin.py +220 -0
  414. maxframe/dataframe/misc/map.py +360 -0
  415. maxframe/dataframe/misc/memory_usage.py +248 -0
  416. maxframe/dataframe/misc/pct_change.py +68 -0
  417. maxframe/dataframe/misc/qcut.py +104 -0
  418. maxframe/dataframe/misc/rechunk.py +59 -0
  419. maxframe/dataframe/misc/repeat.py +159 -0
  420. maxframe/dataframe/misc/select_dtypes.py +104 -0
  421. maxframe/dataframe/misc/shift.py +259 -0
  422. maxframe/dataframe/misc/tests/__init__.py +13 -0
  423. maxframe/dataframe/misc/tests/test_misc.py +649 -0
  424. maxframe/dataframe/misc/to_numeric.py +181 -0
  425. maxframe/dataframe/misc/transform.py +346 -0
  426. maxframe/dataframe/misc/transpose.py +148 -0
  427. maxframe/dataframe/misc/valid_index.py +115 -0
  428. maxframe/dataframe/misc/value_counts.py +206 -0
  429. maxframe/dataframe/missing/__init__.py +53 -0
  430. maxframe/dataframe/missing/checkna.py +231 -0
  431. maxframe/dataframe/missing/dropna.py +294 -0
  432. maxframe/dataframe/missing/fillna.py +283 -0
  433. maxframe/dataframe/missing/replace.py +446 -0
  434. maxframe/dataframe/missing/tests/__init__.py +13 -0
  435. maxframe/dataframe/missing/tests/test_missing.py +90 -0
  436. maxframe/dataframe/operators.py +231 -0
  437. maxframe/dataframe/reduction/__init__.py +129 -0
  438. maxframe/dataframe/reduction/aggregation.py +502 -0
  439. maxframe/dataframe/reduction/all.py +78 -0
  440. maxframe/dataframe/reduction/any.py +78 -0
  441. maxframe/dataframe/reduction/argmax.py +103 -0
  442. maxframe/dataframe/reduction/argmin.py +103 -0
  443. maxframe/dataframe/reduction/core.py +923 -0
  444. maxframe/dataframe/reduction/count.py +63 -0
  445. maxframe/dataframe/reduction/cov.py +166 -0
  446. maxframe/dataframe/reduction/cummax.py +30 -0
  447. maxframe/dataframe/reduction/cummin.py +30 -0
  448. maxframe/dataframe/reduction/cumprod.py +30 -0
  449. maxframe/dataframe/reduction/cumsum.py +30 -0
  450. maxframe/dataframe/reduction/custom_reduction.py +42 -0
  451. maxframe/dataframe/reduction/idxmax.py +185 -0
  452. maxframe/dataframe/reduction/idxmin.py +185 -0
  453. maxframe/dataframe/reduction/kurtosis.py +111 -0
  454. maxframe/dataframe/reduction/max.py +65 -0
  455. maxframe/dataframe/reduction/mean.py +63 -0
  456. maxframe/dataframe/reduction/median.py +56 -0
  457. maxframe/dataframe/reduction/min.py +65 -0
  458. maxframe/dataframe/reduction/mode.py +190 -0
  459. maxframe/dataframe/reduction/nunique.py +149 -0
  460. maxframe/dataframe/reduction/prod.py +81 -0
  461. maxframe/dataframe/reduction/reduction_size.py +36 -0
  462. maxframe/dataframe/reduction/sem.py +73 -0
  463. maxframe/dataframe/reduction/skew.py +93 -0
  464. maxframe/dataframe/reduction/std.py +53 -0
  465. maxframe/dataframe/reduction/str_concat.py +51 -0
  466. maxframe/dataframe/reduction/sum.py +81 -0
  467. maxframe/dataframe/reduction/tests/__init__.py +13 -0
  468. maxframe/dataframe/reduction/tests/test_reduction.py +598 -0
  469. maxframe/dataframe/reduction/unique.py +153 -0
  470. maxframe/dataframe/reduction/var.py +76 -0
  471. maxframe/dataframe/reshape/__init__.py +38 -0
  472. maxframe/dataframe/reshape/melt.py +169 -0
  473. maxframe/dataframe/reshape/pivot.py +233 -0
  474. maxframe/dataframe/reshape/pivot_table.py +275 -0
  475. maxframe/dataframe/reshape/stack.py +240 -0
  476. maxframe/dataframe/reshape/unstack.py +114 -0
  477. maxframe/dataframe/sort/__init__.py +49 -0
  478. maxframe/dataframe/sort/argsort.py +68 -0
  479. maxframe/dataframe/sort/core.py +37 -0
  480. maxframe/dataframe/sort/nlargest.py +238 -0
  481. maxframe/dataframe/sort/nsmallest.py +228 -0
  482. maxframe/dataframe/sort/rank.py +147 -0
  483. maxframe/dataframe/sort/sort_index.py +153 -0
  484. maxframe/dataframe/sort/sort_values.py +308 -0
  485. maxframe/dataframe/sort/tests/__init__.py +13 -0
  486. maxframe/dataframe/sort/tests/test_sort.py +85 -0
  487. maxframe/dataframe/statistics/__init__.py +33 -0
  488. maxframe/dataframe/statistics/corr.py +284 -0
  489. maxframe/dataframe/statistics/quantile.py +338 -0
  490. maxframe/dataframe/statistics/tests/__init__.py +13 -0
  491. maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
  492. maxframe/dataframe/tests/__init__.py +13 -0
  493. maxframe/dataframe/tests/test_initializer.py +60 -0
  494. maxframe/dataframe/tests/test_typing.py +119 -0
  495. maxframe/dataframe/tests/test_utils.py +169 -0
  496. maxframe/dataframe/tseries/__init__.py +32 -0
  497. maxframe/dataframe/tseries/at_time.py +61 -0
  498. maxframe/dataframe/tseries/between_time.py +122 -0
  499. maxframe/dataframe/tseries/tests/__init__.py +13 -0
  500. maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
  501. maxframe/dataframe/tseries/to_datetime.py +299 -0
  502. maxframe/dataframe/typing_.py +196 -0
  503. maxframe/dataframe/ufunc/__init__.py +27 -0
  504. maxframe/dataframe/ufunc/tensor.py +54 -0
  505. maxframe/dataframe/ufunc/ufunc.py +53 -0
  506. maxframe/dataframe/utils.py +1728 -0
  507. maxframe/dataframe/window/__init__.py +29 -0
  508. maxframe/dataframe/window/aggregation.py +100 -0
  509. maxframe/dataframe/window/core.py +82 -0
  510. maxframe/dataframe/window/ewm.py +247 -0
  511. maxframe/dataframe/window/expanding.py +151 -0
  512. maxframe/dataframe/window/rolling.py +389 -0
  513. maxframe/dataframe/window/tests/__init__.py +13 -0
  514. maxframe/dataframe/window/tests/test_ewm.py +70 -0
  515. maxframe/dataframe/window/tests/test_expanding.py +60 -0
  516. maxframe/dataframe/window/tests/test_rolling.py +57 -0
  517. maxframe/env.py +37 -0
  518. maxframe/errors.py +52 -0
  519. maxframe/extension.py +131 -0
  520. maxframe/io/__init__.py +13 -0
  521. maxframe/io/objects/__init__.py +24 -0
  522. maxframe/io/objects/core.py +156 -0
  523. maxframe/io/objects/tensor.py +133 -0
  524. maxframe/io/objects/tests/__init__.py +13 -0
  525. maxframe/io/objects/tests/test_object_io.py +85 -0
  526. maxframe/io/odpsio/__init__.py +24 -0
  527. maxframe/io/odpsio/arrow.py +161 -0
  528. maxframe/io/odpsio/schema.py +533 -0
  529. maxframe/io/odpsio/tableio.py +736 -0
  530. maxframe/io/odpsio/tests/__init__.py +13 -0
  531. maxframe/io/odpsio/tests/test_arrow.py +132 -0
  532. maxframe/io/odpsio/tests/test_schema.py +582 -0
  533. maxframe/io/odpsio/tests/test_tableio.py +205 -0
  534. maxframe/io/odpsio/tests/test_volumeio.py +75 -0
  535. maxframe/io/odpsio/volumeio.py +102 -0
  536. maxframe/learn/__init__.py +25 -0
  537. maxframe/learn/cluster/__init__.py +15 -0
  538. maxframe/learn/cluster/_kmeans.py +782 -0
  539. maxframe/learn/contrib/__init__.py +17 -0
  540. maxframe/learn/contrib/graph/__init__.py +15 -0
  541. maxframe/learn/contrib/graph/connected_components.py +216 -0
  542. maxframe/learn/contrib/graph/tests/__init__.py +13 -0
  543. maxframe/learn/contrib/graph/tests/test_connected_components.py +53 -0
  544. maxframe/learn/contrib/lightgbm/__init__.py +33 -0
  545. maxframe/learn/contrib/lightgbm/_predict.py +138 -0
  546. maxframe/learn/contrib/lightgbm/_train.py +163 -0
  547. maxframe/learn/contrib/lightgbm/callback.py +114 -0
  548. maxframe/learn/contrib/lightgbm/classifier.py +199 -0
  549. maxframe/learn/contrib/lightgbm/core.py +372 -0
  550. maxframe/learn/contrib/lightgbm/dataset.py +153 -0
  551. maxframe/learn/contrib/lightgbm/regressor.py +29 -0
  552. maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
  553. maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
  554. maxframe/learn/contrib/llm/__init__.py +17 -0
  555. maxframe/learn/contrib/llm/core.py +105 -0
  556. maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
  557. maxframe/learn/contrib/llm/deploy/config.py +221 -0
  558. maxframe/learn/contrib/llm/deploy/core.py +247 -0
  559. maxframe/learn/contrib/llm/deploy/framework.py +35 -0
  560. maxframe/learn/contrib/llm/deploy/loader.py +360 -0
  561. maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
  562. maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
  563. maxframe/learn/contrib/llm/models/__init__.py +16 -0
  564. maxframe/learn/contrib/llm/models/dashscope.py +114 -0
  565. maxframe/learn/contrib/llm/models/managed.py +119 -0
  566. maxframe/learn/contrib/llm/models/openai.py +72 -0
  567. maxframe/learn/contrib/llm/multi_modal.py +135 -0
  568. maxframe/learn/contrib/llm/tests/__init__.py +13 -0
  569. maxframe/learn/contrib/llm/tests/test_core.py +34 -0
  570. maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
  571. maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
  572. maxframe/learn/contrib/llm/text.py +608 -0
  573. maxframe/learn/contrib/models.py +109 -0
  574. maxframe/learn/contrib/pytorch/__init__.py +16 -0
  575. maxframe/learn/contrib/pytorch/run_function.py +110 -0
  576. maxframe/learn/contrib/pytorch/run_script.py +102 -0
  577. maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
  578. maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
  579. maxframe/learn/contrib/utils.py +108 -0
  580. maxframe/learn/contrib/xgboost/__init__.py +33 -0
  581. maxframe/learn/contrib/xgboost/callback.py +86 -0
  582. maxframe/learn/contrib/xgboost/classifier.py +119 -0
  583. maxframe/learn/contrib/xgboost/core.py +469 -0
  584. maxframe/learn/contrib/xgboost/dmatrix.py +157 -0
  585. maxframe/learn/contrib/xgboost/predict.py +133 -0
  586. maxframe/learn/contrib/xgboost/regressor.py +91 -0
  587. maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
  588. maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
  589. maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
  590. maxframe/learn/contrib/xgboost/train.py +181 -0
  591. maxframe/learn/core.py +344 -0
  592. maxframe/learn/datasets/__init__.py +20 -0
  593. maxframe/learn/datasets/samples_generator.py +628 -0
  594. maxframe/learn/linear_model/__init__.py +15 -0
  595. maxframe/learn/linear_model/_base.py +220 -0
  596. maxframe/learn/linear_model/_lin_reg.py +175 -0
  597. maxframe/learn/metrics/__init__.py +31 -0
  598. maxframe/learn/metrics/_check_targets.py +95 -0
  599. maxframe/learn/metrics/_classification.py +1266 -0
  600. maxframe/learn/metrics/_ranking.py +477 -0
  601. maxframe/learn/metrics/_regression.py +256 -0
  602. maxframe/learn/metrics/_scorer.py +60 -0
  603. maxframe/learn/metrics/pairwise/__init__.py +21 -0
  604. maxframe/learn/metrics/pairwise/core.py +77 -0
  605. maxframe/learn/metrics/pairwise/cosine.py +115 -0
  606. maxframe/learn/metrics/pairwise/euclidean.py +176 -0
  607. maxframe/learn/metrics/pairwise/haversine.py +96 -0
  608. maxframe/learn/metrics/pairwise/manhattan.py +80 -0
  609. maxframe/learn/metrics/pairwise/pairwise.py +127 -0
  610. maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
  611. maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
  612. maxframe/learn/metrics/tests/__init__.py +13 -0
  613. maxframe/learn/metrics/tests/test_scorer.py +26 -0
  614. maxframe/learn/model_selection/__init__.py +15 -0
  615. maxframe/learn/model_selection/_split.py +451 -0
  616. maxframe/learn/model_selection/tests/__init__.py +13 -0
  617. maxframe/learn/model_selection/tests/test_split.py +156 -0
  618. maxframe/learn/preprocessing/__init__.py +16 -0
  619. maxframe/learn/preprocessing/_data/__init__.py +17 -0
  620. maxframe/learn/preprocessing/_data/min_max_scaler.py +401 -0
  621. maxframe/learn/preprocessing/_data/normalize.py +127 -0
  622. maxframe/learn/preprocessing/_data/standard_scaler.py +512 -0
  623. maxframe/learn/preprocessing/_data/utils.py +79 -0
  624. maxframe/learn/preprocessing/_label/__init__.py +16 -0
  625. maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
  626. maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
  627. maxframe/learn/utils/__init__.py +20 -0
  628. maxframe/learn/utils/_encode.py +312 -0
  629. maxframe/learn/utils/checks.py +160 -0
  630. maxframe/learn/utils/core.py +121 -0
  631. maxframe/learn/utils/extmath.py +246 -0
  632. maxframe/learn/utils/multiclass.py +292 -0
  633. maxframe/learn/utils/odpsio.py +262 -0
  634. maxframe/learn/utils/shuffle.py +114 -0
  635. maxframe/learn/utils/sparsefuncs.py +87 -0
  636. maxframe/learn/utils/validation.py +775 -0
  637. maxframe/lib/__init__.py +13 -0
  638. maxframe/lib/aio/__init__.py +27 -0
  639. maxframe/lib/aio/_runners.py +162 -0
  640. maxframe/lib/aio/_threads.py +35 -0
  641. maxframe/lib/aio/base.py +82 -0
  642. maxframe/lib/aio/file.py +85 -0
  643. maxframe/lib/aio/isolation.py +100 -0
  644. maxframe/lib/aio/lru.py +242 -0
  645. maxframe/lib/aio/parallelism.py +37 -0
  646. maxframe/lib/aio/tests/__init__.py +13 -0
  647. maxframe/lib/aio/tests/test_aio_file.py +55 -0
  648. maxframe/lib/compat.py +185 -0
  649. maxframe/lib/compression.py +55 -0
  650. maxframe/lib/cython/__init__.py +13 -0
  651. maxframe/lib/cython/libcpp.pxd +30 -0
  652. maxframe/lib/dtypes_extension/__init__.py +30 -0
  653. maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +609 -0
  654. maxframe/lib/dtypes_extension/blob.py +304 -0
  655. maxframe/lib/dtypes_extension/dtypes.py +106 -0
  656. maxframe/lib/dtypes_extension/tests/__init__.py +13 -0
  657. maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
  658. maxframe/lib/dtypes_extension/tests/test_dtypes.py +63 -0
  659. maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
  660. maxframe/lib/filesystem/__init__.py +22 -0
  661. maxframe/lib/filesystem/_glob.py +173 -0
  662. maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
  663. maxframe/lib/filesystem/_oss_lib/common.py +274 -0
  664. maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
  665. maxframe/lib/filesystem/_oss_lib/handle.py +180 -0
  666. maxframe/lib/filesystem/arrow.py +240 -0
  667. maxframe/lib/filesystem/base.py +327 -0
  668. maxframe/lib/filesystem/core.py +95 -0
  669. maxframe/lib/filesystem/fshandler.py +136 -0
  670. maxframe/lib/filesystem/fsmap.py +164 -0
  671. maxframe/lib/filesystem/hdfs.py +31 -0
  672. maxframe/lib/filesystem/local.py +120 -0
  673. maxframe/lib/filesystem/oss.py +283 -0
  674. maxframe/lib/filesystem/tests/__init__.py +13 -0
  675. maxframe/lib/filesystem/tests/test_filesystem.py +205 -0
  676. maxframe/lib/filesystem/tests/test_fshandler.py +281 -0
  677. maxframe/lib/filesystem/tests/test_oss.py +220 -0
  678. maxframe/lib/functools_compat.py +81 -0
  679. maxframe/lib/mmh3.cp312-win32.pyd +0 -0
  680. maxframe/lib/mmh3.pyi +43 -0
  681. maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
  682. maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
  683. maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
  684. maxframe/lib/sparse/__init__.py +856 -0
  685. maxframe/lib/sparse/array.py +1616 -0
  686. maxframe/lib/sparse/core.py +90 -0
  687. maxframe/lib/sparse/linalg.py +31 -0
  688. maxframe/lib/sparse/matrix.py +244 -0
  689. maxframe/lib/sparse/tests/__init__.py +13 -0
  690. maxframe/lib/sparse/tests/test_sparse.py +476 -0
  691. maxframe/lib/sparse/vector.py +148 -0
  692. maxframe/lib/tblib/LICENSE +20 -0
  693. maxframe/lib/tblib/__init__.py +327 -0
  694. maxframe/lib/tblib/cpython.py +83 -0
  695. maxframe/lib/tblib/decorators.py +44 -0
  696. maxframe/lib/tblib/pickling_support.py +90 -0
  697. maxframe/lib/tests/__init__.py +13 -0
  698. maxframe/lib/tests/test_wrapped_pickle.py +51 -0
  699. maxframe/lib/version.py +620 -0
  700. maxframe/lib/wrapped_pickle.py +177 -0
  701. maxframe/mixin.py +157 -0
  702. maxframe/opcodes.py +654 -0
  703. maxframe/protocol.py +611 -0
  704. maxframe/remote/__init__.py +18 -0
  705. maxframe/remote/core.py +212 -0
  706. maxframe/remote/run_script.py +124 -0
  707. maxframe/serialization/__init__.py +39 -0
  708. maxframe/serialization/arrow.py +107 -0
  709. maxframe/serialization/blob.py +32 -0
  710. maxframe/serialization/core.cp312-win32.pyd +0 -0
  711. maxframe/serialization/core.pxd +50 -0
  712. maxframe/serialization/core.pyi +66 -0
  713. maxframe/serialization/core.pyx +1282 -0
  714. maxframe/serialization/exception.py +90 -0
  715. maxframe/serialization/maxframe_objects.py +39 -0
  716. maxframe/serialization/numpy.py +110 -0
  717. maxframe/serialization/pandas.py +278 -0
  718. maxframe/serialization/scipy.py +71 -0
  719. maxframe/serialization/serializables/__init__.py +55 -0
  720. maxframe/serialization/serializables/core.py +469 -0
  721. maxframe/serialization/serializables/field.py +624 -0
  722. maxframe/serialization/serializables/field_type.py +592 -0
  723. maxframe/serialization/serializables/tests/__init__.py +13 -0
  724. maxframe/serialization/serializables/tests/test_field_type.py +119 -0
  725. maxframe/serialization/serializables/tests/test_serializable.py +313 -0
  726. maxframe/serialization/tests/__init__.py +13 -0
  727. maxframe/serialization/tests/test_serial.py +516 -0
  728. maxframe/session.py +1250 -0
  729. maxframe/sperunner.py +165 -0
  730. maxframe/tensor/__init__.py +325 -0
  731. maxframe/tensor/arithmetic/__init__.py +322 -0
  732. maxframe/tensor/arithmetic/abs.py +66 -0
  733. maxframe/tensor/arithmetic/absolute.py +66 -0
  734. maxframe/tensor/arithmetic/add.py +112 -0
  735. maxframe/tensor/arithmetic/angle.py +70 -0
  736. maxframe/tensor/arithmetic/arccos.py +101 -0
  737. maxframe/tensor/arithmetic/arccosh.py +89 -0
  738. maxframe/tensor/arithmetic/arcsin.py +92 -0
  739. maxframe/tensor/arithmetic/arcsinh.py +84 -0
  740. maxframe/tensor/arithmetic/arctan.py +104 -0
  741. maxframe/tensor/arithmetic/arctan2.py +126 -0
  742. maxframe/tensor/arithmetic/arctanh.py +84 -0
  743. maxframe/tensor/arithmetic/around.py +112 -0
  744. maxframe/tensor/arithmetic/bitand.py +93 -0
  745. maxframe/tensor/arithmetic/bitor.py +100 -0
  746. maxframe/tensor/arithmetic/bitxor.py +93 -0
  747. maxframe/tensor/arithmetic/cbrt.py +64 -0
  748. maxframe/tensor/arithmetic/ceil.py +69 -0
  749. maxframe/tensor/arithmetic/clip.py +165 -0
  750. maxframe/tensor/arithmetic/conj.py +72 -0
  751. maxframe/tensor/arithmetic/copysign.py +76 -0
  752. maxframe/tensor/arithmetic/core.py +546 -0
  753. maxframe/tensor/arithmetic/cos.py +83 -0
  754. maxframe/tensor/arithmetic/cosh.py +70 -0
  755. maxframe/tensor/arithmetic/deg2rad.py +70 -0
  756. maxframe/tensor/arithmetic/degrees.py +75 -0
  757. maxframe/tensor/arithmetic/divide.py +112 -0
  758. maxframe/tensor/arithmetic/equal.py +74 -0
  759. maxframe/tensor/arithmetic/exp.py +104 -0
  760. maxframe/tensor/arithmetic/exp2.py +65 -0
  761. maxframe/tensor/arithmetic/expm1.py +77 -0
  762. maxframe/tensor/arithmetic/fabs.py +72 -0
  763. maxframe/tensor/arithmetic/fix.py +67 -0
  764. maxframe/tensor/arithmetic/float_power.py +101 -0
  765. maxframe/tensor/arithmetic/floor.py +75 -0
  766. maxframe/tensor/arithmetic/floordiv.py +92 -0
  767. maxframe/tensor/arithmetic/fmax.py +103 -0
  768. maxframe/tensor/arithmetic/fmin.py +104 -0
  769. maxframe/tensor/arithmetic/fmod.py +97 -0
  770. maxframe/tensor/arithmetic/frexp.py +96 -0
  771. maxframe/tensor/arithmetic/greater.py +75 -0
  772. maxframe/tensor/arithmetic/greater_equal.py +67 -0
  773. maxframe/tensor/arithmetic/hypot.py +75 -0
  774. maxframe/tensor/arithmetic/i0.py +87 -0
  775. maxframe/tensor/arithmetic/imag.py +65 -0
  776. maxframe/tensor/arithmetic/invert.py +108 -0
  777. maxframe/tensor/arithmetic/isclose.py +114 -0
  778. maxframe/tensor/arithmetic/iscomplex.py +62 -0
  779. maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
  780. maxframe/tensor/arithmetic/isfinite.py +104 -0
  781. maxframe/tensor/arithmetic/isinf.py +101 -0
  782. maxframe/tensor/arithmetic/isnan.py +80 -0
  783. maxframe/tensor/arithmetic/isreal.py +61 -0
  784. maxframe/tensor/arithmetic/ldexp.py +97 -0
  785. maxframe/tensor/arithmetic/less.py +67 -0
  786. maxframe/tensor/arithmetic/less_equal.py +67 -0
  787. maxframe/tensor/arithmetic/log.py +90 -0
  788. maxframe/tensor/arithmetic/log10.py +83 -0
  789. maxframe/tensor/arithmetic/log1p.py +93 -0
  790. maxframe/tensor/arithmetic/log2.py +83 -0
  791. maxframe/tensor/arithmetic/logaddexp.py +78 -0
  792. maxframe/tensor/arithmetic/logaddexp2.py +76 -0
  793. maxframe/tensor/arithmetic/logical_and.py +79 -0
  794. maxframe/tensor/arithmetic/logical_not.py +72 -0
  795. maxframe/tensor/arithmetic/logical_or.py +80 -0
  796. maxframe/tensor/arithmetic/logical_xor.py +86 -0
  797. maxframe/tensor/arithmetic/lshift.py +80 -0
  798. maxframe/tensor/arithmetic/maximum.py +106 -0
  799. maxframe/tensor/arithmetic/minimum.py +106 -0
  800. maxframe/tensor/arithmetic/mod.py +102 -0
  801. maxframe/tensor/arithmetic/modf.py +87 -0
  802. maxframe/tensor/arithmetic/multiply.py +114 -0
  803. maxframe/tensor/arithmetic/nan_to_num.py +97 -0
  804. maxframe/tensor/arithmetic/negative.py +63 -0
  805. maxframe/tensor/arithmetic/nextafter.py +66 -0
  806. maxframe/tensor/arithmetic/not_equal.py +70 -0
  807. maxframe/tensor/arithmetic/positive.py +45 -0
  808. maxframe/tensor/arithmetic/power.py +104 -0
  809. maxframe/tensor/arithmetic/rad2deg.py +69 -0
  810. maxframe/tensor/arithmetic/radians.py +75 -0
  811. maxframe/tensor/arithmetic/real.py +68 -0
  812. maxframe/tensor/arithmetic/reciprocal.py +78 -0
  813. maxframe/tensor/arithmetic/rint.py +66 -0
  814. maxframe/tensor/arithmetic/rshift.py +79 -0
  815. maxframe/tensor/arithmetic/setimag.py +27 -0
  816. maxframe/tensor/arithmetic/setreal.py +27 -0
  817. maxframe/tensor/arithmetic/sign.py +79 -0
  818. maxframe/tensor/arithmetic/signbit.py +63 -0
  819. maxframe/tensor/arithmetic/sin.py +96 -0
  820. maxframe/tensor/arithmetic/sinc.py +100 -0
  821. maxframe/tensor/arithmetic/sinh.py +91 -0
  822. maxframe/tensor/arithmetic/spacing.py +70 -0
  823. maxframe/tensor/arithmetic/sqrt.py +79 -0
  824. maxframe/tensor/arithmetic/square.py +67 -0
  825. maxframe/tensor/arithmetic/subtract.py +83 -0
  826. maxframe/tensor/arithmetic/tan.py +86 -0
  827. maxframe/tensor/arithmetic/tanh.py +90 -0
  828. maxframe/tensor/arithmetic/tests/__init__.py +13 -0
  829. maxframe/tensor/arithmetic/tests/test_arithmetic.py +449 -0
  830. maxframe/tensor/arithmetic/truediv.py +102 -0
  831. maxframe/tensor/arithmetic/trunc.py +70 -0
  832. maxframe/tensor/arithmetic/utils.py +91 -0
  833. maxframe/tensor/array_utils.py +164 -0
  834. maxframe/tensor/core.py +597 -0
  835. maxframe/tensor/datasource/__init__.py +40 -0
  836. maxframe/tensor/datasource/arange.py +154 -0
  837. maxframe/tensor/datasource/array.py +399 -0
  838. maxframe/tensor/datasource/core.py +114 -0
  839. maxframe/tensor/datasource/diag.py +140 -0
  840. maxframe/tensor/datasource/diagflat.py +69 -0
  841. maxframe/tensor/datasource/empty.py +167 -0
  842. maxframe/tensor/datasource/eye.py +95 -0
  843. maxframe/tensor/datasource/from_dataframe.py +68 -0
  844. maxframe/tensor/datasource/from_dense.py +37 -0
  845. maxframe/tensor/datasource/from_sparse.py +45 -0
  846. maxframe/tensor/datasource/full.py +184 -0
  847. maxframe/tensor/datasource/identity.py +54 -0
  848. maxframe/tensor/datasource/indices.py +115 -0
  849. maxframe/tensor/datasource/linspace.py +140 -0
  850. maxframe/tensor/datasource/meshgrid.py +135 -0
  851. maxframe/tensor/datasource/ones.py +178 -0
  852. maxframe/tensor/datasource/scalar.py +40 -0
  853. maxframe/tensor/datasource/tests/__init__.py +13 -0
  854. maxframe/tensor/datasource/tests/test_datasource.py +310 -0
  855. maxframe/tensor/datasource/tri_array.py +107 -0
  856. maxframe/tensor/datasource/zeros.py +192 -0
  857. maxframe/tensor/extensions/__init__.py +33 -0
  858. maxframe/tensor/extensions/accessor.py +25 -0
  859. maxframe/tensor/extensions/apply_chunk.py +137 -0
  860. maxframe/tensor/extensions/rebalance.py +65 -0
  861. maxframe/tensor/fetch/__init__.py +15 -0
  862. maxframe/tensor/fetch/core.py +54 -0
  863. maxframe/tensor/fft/__init__.py +32 -0
  864. maxframe/tensor/fft/core.py +168 -0
  865. maxframe/tensor/fft/fft.py +112 -0
  866. maxframe/tensor/fft/fft2.py +118 -0
  867. maxframe/tensor/fft/fftfreq.py +80 -0
  868. maxframe/tensor/fft/fftn.py +123 -0
  869. maxframe/tensor/fft/fftshift.py +79 -0
  870. maxframe/tensor/fft/hfft.py +112 -0
  871. maxframe/tensor/fft/ifft.py +114 -0
  872. maxframe/tensor/fft/ifft2.py +115 -0
  873. maxframe/tensor/fft/ifftn.py +123 -0
  874. maxframe/tensor/fft/ifftshift.py +73 -0
  875. maxframe/tensor/fft/ihfft.py +93 -0
  876. maxframe/tensor/fft/irfft.py +118 -0
  877. maxframe/tensor/fft/irfft2.py +62 -0
  878. maxframe/tensor/fft/irfftn.py +114 -0
  879. maxframe/tensor/fft/rfft.py +116 -0
  880. maxframe/tensor/fft/rfft2.py +63 -0
  881. maxframe/tensor/fft/rfftfreq.py +87 -0
  882. maxframe/tensor/fft/rfftn.py +113 -0
  883. maxframe/tensor/indexing/__init__.py +47 -0
  884. maxframe/tensor/indexing/choose.py +198 -0
  885. maxframe/tensor/indexing/compress.py +122 -0
  886. maxframe/tensor/indexing/core.py +190 -0
  887. maxframe/tensor/indexing/extract.py +69 -0
  888. maxframe/tensor/indexing/fill_diagonal.py +180 -0
  889. maxframe/tensor/indexing/flatnonzero.py +58 -0
  890. maxframe/tensor/indexing/getitem.py +144 -0
  891. maxframe/tensor/indexing/nonzero.py +118 -0
  892. maxframe/tensor/indexing/setitem.py +142 -0
  893. maxframe/tensor/indexing/slice.py +32 -0
  894. maxframe/tensor/indexing/take.py +128 -0
  895. maxframe/tensor/indexing/tests/__init__.py +13 -0
  896. maxframe/tensor/indexing/tests/test_indexing.py +232 -0
  897. maxframe/tensor/indexing/unravel_index.py +103 -0
  898. maxframe/tensor/lib/__init__.py +16 -0
  899. maxframe/tensor/lib/index_tricks.py +404 -0
  900. maxframe/tensor/linalg/__init__.py +43 -0
  901. maxframe/tensor/linalg/_einsumfunc.py +1025 -0
  902. maxframe/tensor/linalg/cholesky.py +117 -0
  903. maxframe/tensor/linalg/dot.py +145 -0
  904. maxframe/tensor/linalg/einsum.py +339 -0
  905. maxframe/tensor/linalg/inner.py +36 -0
  906. maxframe/tensor/linalg/inv.py +83 -0
  907. maxframe/tensor/linalg/lstsq.py +100 -0
  908. maxframe/tensor/linalg/lu.py +115 -0
  909. maxframe/tensor/linalg/matmul.py +225 -0
  910. maxframe/tensor/linalg/matrix_norm.py +75 -0
  911. maxframe/tensor/linalg/norm.py +249 -0
  912. maxframe/tensor/linalg/qr.py +124 -0
  913. maxframe/tensor/linalg/solve.py +72 -0
  914. maxframe/tensor/linalg/solve_triangular.py +103 -0
  915. maxframe/tensor/linalg/svd.py +167 -0
  916. maxframe/tensor/linalg/tensordot.py +213 -0
  917. maxframe/tensor/linalg/vdot.py +73 -0
  918. maxframe/tensor/linalg/vector_norm.py +113 -0
  919. maxframe/tensor/merge/__init__.py +21 -0
  920. maxframe/tensor/merge/append.py +74 -0
  921. maxframe/tensor/merge/column_stack.py +63 -0
  922. maxframe/tensor/merge/concatenate.py +103 -0
  923. maxframe/tensor/merge/dstack.py +71 -0
  924. maxframe/tensor/merge/hstack.py +70 -0
  925. maxframe/tensor/merge/stack.py +130 -0
  926. maxframe/tensor/merge/tests/__init__.py +13 -0
  927. maxframe/tensor/merge/tests/test_merge.py +79 -0
  928. maxframe/tensor/merge/vstack.py +74 -0
  929. maxframe/tensor/misc/__init__.py +72 -0
  930. maxframe/tensor/misc/argwhere.py +72 -0
  931. maxframe/tensor/misc/array_split.py +46 -0
  932. maxframe/tensor/misc/astype.py +121 -0
  933. maxframe/tensor/misc/atleast_1d.py +72 -0
  934. maxframe/tensor/misc/atleast_2d.py +70 -0
  935. maxframe/tensor/misc/atleast_3d.py +85 -0
  936. maxframe/tensor/misc/broadcast_arrays.py +57 -0
  937. maxframe/tensor/misc/broadcast_to.py +89 -0
  938. maxframe/tensor/misc/copy.py +64 -0
  939. maxframe/tensor/misc/copyto.py +130 -0
  940. maxframe/tensor/misc/delete.py +104 -0
  941. maxframe/tensor/misc/diff.py +115 -0
  942. maxframe/tensor/misc/dsplit.py +68 -0
  943. maxframe/tensor/misc/ediff1d.py +74 -0
  944. maxframe/tensor/misc/expand_dims.py +85 -0
  945. maxframe/tensor/misc/flatten.py +63 -0
  946. maxframe/tensor/misc/flip.py +90 -0
  947. maxframe/tensor/misc/fliplr.py +64 -0
  948. maxframe/tensor/misc/flipud.py +68 -0
  949. maxframe/tensor/misc/hsplit.py +85 -0
  950. maxframe/tensor/misc/in1d.py +94 -0
  951. maxframe/tensor/misc/insert.py +139 -0
  952. maxframe/tensor/misc/isin.py +130 -0
  953. maxframe/tensor/misc/moveaxis.py +83 -0
  954. maxframe/tensor/misc/ndim.py +53 -0
  955. maxframe/tensor/misc/ravel.py +90 -0
  956. maxframe/tensor/misc/repeat.py +129 -0
  957. maxframe/tensor/misc/result_type.py +88 -0
  958. maxframe/tensor/misc/roll.py +124 -0
  959. maxframe/tensor/misc/rollaxis.py +77 -0
  960. maxframe/tensor/misc/searchsorted.py +147 -0
  961. maxframe/tensor/misc/setdiff1d.py +58 -0
  962. maxframe/tensor/misc/shape.py +89 -0
  963. maxframe/tensor/misc/split.py +190 -0
  964. maxframe/tensor/misc/squeeze.py +117 -0
  965. maxframe/tensor/misc/swapaxes.py +113 -0
  966. maxframe/tensor/misc/tests/__init__.py +13 -0
  967. maxframe/tensor/misc/tests/test_misc.py +112 -0
  968. maxframe/tensor/misc/tile.py +109 -0
  969. maxframe/tensor/misc/transpose.py +133 -0
  970. maxframe/tensor/misc/trapezoid.py +123 -0
  971. maxframe/tensor/misc/unique.py +227 -0
  972. maxframe/tensor/misc/vsplit.py +74 -0
  973. maxframe/tensor/misc/where.py +129 -0
  974. maxframe/tensor/operators.py +83 -0
  975. maxframe/tensor/random/__init__.py +166 -0
  976. maxframe/tensor/random/beta.py +87 -0
  977. maxframe/tensor/random/binomial.py +135 -0
  978. maxframe/tensor/random/bytes.py +37 -0
  979. maxframe/tensor/random/chisquare.py +108 -0
  980. maxframe/tensor/random/choice.py +187 -0
  981. maxframe/tensor/random/core.py +249 -0
  982. maxframe/tensor/random/dirichlet.py +121 -0
  983. maxframe/tensor/random/exponential.py +92 -0
  984. maxframe/tensor/random/f.py +133 -0
  985. maxframe/tensor/random/gamma.py +126 -0
  986. maxframe/tensor/random/geometric.py +91 -0
  987. maxframe/tensor/random/gumbel.py +165 -0
  988. maxframe/tensor/random/hypergeometric.py +146 -0
  989. maxframe/tensor/random/laplace.py +131 -0
  990. maxframe/tensor/random/logistic.py +127 -0
  991. maxframe/tensor/random/lognormal.py +157 -0
  992. maxframe/tensor/random/logseries.py +120 -0
  993. maxframe/tensor/random/multinomial.py +131 -0
  994. maxframe/tensor/random/multivariate_normal.py +190 -0
  995. maxframe/tensor/random/negative_binomial.py +123 -0
  996. maxframe/tensor/random/noncentral_chisquare.py +130 -0
  997. maxframe/tensor/random/noncentral_f.py +124 -0
  998. maxframe/tensor/random/normal.py +141 -0
  999. maxframe/tensor/random/pareto.py +138 -0
  1000. maxframe/tensor/random/permutation.py +107 -0
  1001. maxframe/tensor/random/poisson.py +109 -0
  1002. maxframe/tensor/random/power.py +140 -0
  1003. maxframe/tensor/random/rand.py +80 -0
  1004. maxframe/tensor/random/randint.py +119 -0
  1005. maxframe/tensor/random/randn.py +94 -0
  1006. maxframe/tensor/random/random_integers.py +121 -0
  1007. maxframe/tensor/random/random_sample.py +84 -0
  1008. maxframe/tensor/random/rayleigh.py +108 -0
  1009. maxframe/tensor/random/shuffle.py +61 -0
  1010. maxframe/tensor/random/standard_cauchy.py +103 -0
  1011. maxframe/tensor/random/standard_exponential.py +70 -0
  1012. maxframe/tensor/random/standard_gamma.py +118 -0
  1013. maxframe/tensor/random/standard_normal.py +72 -0
  1014. maxframe/tensor/random/standard_t.py +133 -0
  1015. maxframe/tensor/random/tests/__init__.py +13 -0
  1016. maxframe/tensor/random/tests/test_random.py +165 -0
  1017. maxframe/tensor/random/triangular.py +117 -0
  1018. maxframe/tensor/random/uniform.py +129 -0
  1019. maxframe/tensor/random/vonmises.py +129 -0
  1020. maxframe/tensor/random/wald.py +112 -0
  1021. maxframe/tensor/random/weibull.py +138 -0
  1022. maxframe/tensor/random/zipf.py +120 -0
  1023. maxframe/tensor/rechunk/__init__.py +26 -0
  1024. maxframe/tensor/rechunk/rechunk.py +43 -0
  1025. maxframe/tensor/reduction/__init__.py +64 -0
  1026. maxframe/tensor/reduction/all.py +101 -0
  1027. maxframe/tensor/reduction/allclose.py +86 -0
  1028. maxframe/tensor/reduction/any.py +103 -0
  1029. maxframe/tensor/reduction/argmax.py +101 -0
  1030. maxframe/tensor/reduction/argmin.py +101 -0
  1031. maxframe/tensor/reduction/array_equal.py +63 -0
  1032. maxframe/tensor/reduction/core.py +166 -0
  1033. maxframe/tensor/reduction/count_nonzero.py +80 -0
  1034. maxframe/tensor/reduction/cumprod.py +95 -0
  1035. maxframe/tensor/reduction/cumsum.py +99 -0
  1036. maxframe/tensor/reduction/max.py +118 -0
  1037. maxframe/tensor/reduction/mean.py +122 -0
  1038. maxframe/tensor/reduction/min.py +118 -0
  1039. maxframe/tensor/reduction/nanargmax.py +80 -0
  1040. maxframe/tensor/reduction/nanargmin.py +74 -0
  1041. maxframe/tensor/reduction/nancumprod.py +89 -0
  1042. maxframe/tensor/reduction/nancumsum.py +92 -0
  1043. maxframe/tensor/reduction/nanmax.py +109 -0
  1044. maxframe/tensor/reduction/nanmean.py +105 -0
  1045. maxframe/tensor/reduction/nanmin.py +109 -0
  1046. maxframe/tensor/reduction/nanprod.py +92 -0
  1047. maxframe/tensor/reduction/nanstd.py +124 -0
  1048. maxframe/tensor/reduction/nansum.py +113 -0
  1049. maxframe/tensor/reduction/nanvar.py +149 -0
  1050. maxframe/tensor/reduction/prod.py +128 -0
  1051. maxframe/tensor/reduction/std.py +132 -0
  1052. maxframe/tensor/reduction/sum.py +123 -0
  1053. maxframe/tensor/reduction/tests/__init__.py +13 -0
  1054. maxframe/tensor/reduction/tests/test_reduction.py +189 -0
  1055. maxframe/tensor/reduction/var.py +176 -0
  1056. maxframe/tensor/reshape/__init__.py +15 -0
  1057. maxframe/tensor/reshape/reshape.py +192 -0
  1058. maxframe/tensor/reshape/tests/__init__.py +13 -0
  1059. maxframe/tensor/reshape/tests/test_reshape.py +35 -0
  1060. maxframe/tensor/sort/__init__.py +18 -0
  1061. maxframe/tensor/sort/argpartition.py +98 -0
  1062. maxframe/tensor/sort/argsort.py +150 -0
  1063. maxframe/tensor/sort/partition.py +228 -0
  1064. maxframe/tensor/sort/sort.py +295 -0
  1065. maxframe/tensor/spatial/__init__.py +15 -0
  1066. maxframe/tensor/spatial/distance/__init__.py +17 -0
  1067. maxframe/tensor/spatial/distance/cdist.py +421 -0
  1068. maxframe/tensor/spatial/distance/pdist.py +398 -0
  1069. maxframe/tensor/spatial/distance/squareform.py +153 -0
  1070. maxframe/tensor/special/__init__.py +175 -0
  1071. maxframe/tensor/special/airy.py +55 -0
  1072. maxframe/tensor/special/bessel.py +199 -0
  1073. maxframe/tensor/special/core.py +99 -0
  1074. maxframe/tensor/special/ellip_func_integrals.py +155 -0
  1075. maxframe/tensor/special/ellip_harm.py +55 -0
  1076. maxframe/tensor/special/err_fresnel.py +223 -0
  1077. maxframe/tensor/special/gamma_funcs.py +303 -0
  1078. maxframe/tensor/special/hypergeometric_funcs.py +69 -0
  1079. maxframe/tensor/special/info_theory.py +189 -0
  1080. maxframe/tensor/special/misc.py +163 -0
  1081. maxframe/tensor/special/statistical.py +56 -0
  1082. maxframe/tensor/statistics/__init__.py +24 -0
  1083. maxframe/tensor/statistics/average.py +143 -0
  1084. maxframe/tensor/statistics/bincount.py +133 -0
  1085. maxframe/tensor/statistics/corrcoef.py +77 -0
  1086. maxframe/tensor/statistics/cov.py +222 -0
  1087. maxframe/tensor/statistics/digitize.py +126 -0
  1088. maxframe/tensor/statistics/histogram.py +520 -0
  1089. maxframe/tensor/statistics/median.py +85 -0
  1090. maxframe/tensor/statistics/percentile.py +175 -0
  1091. maxframe/tensor/statistics/ptp.py +89 -0
  1092. maxframe/tensor/statistics/quantile.py +290 -0
  1093. maxframe/tensor/ufunc/__init__.py +24 -0
  1094. maxframe/tensor/ufunc/ufunc.py +198 -0
  1095. maxframe/tensor/utils.py +719 -0
  1096. maxframe/tests/__init__.py +13 -0
  1097. maxframe/tests/test_protocol.py +178 -0
  1098. maxframe/tests/test_udf.py +61 -0
  1099. maxframe/tests/test_utils.py +627 -0
  1100. maxframe/tests/utils.py +245 -0
  1101. maxframe/typing_.py +42 -0
  1102. maxframe/udf.py +435 -0
  1103. maxframe/utils.py +1774 -0
  1104. maxframe-2.4.0rc1.dist-info/METADATA +109 -0
  1105. maxframe-2.4.0rc1.dist-info/RECORD +1122 -0
  1106. maxframe-2.4.0rc1.dist-info/WHEEL +5 -0
  1107. maxframe-2.4.0rc1.dist-info/top_level.txt +3 -0
  1108. maxframe_client/__init__.py +16 -0
  1109. maxframe_client/clients/__init__.py +13 -0
  1110. maxframe_client/clients/framedriver.py +137 -0
  1111. maxframe_client/conftest.py +15 -0
  1112. maxframe_client/fetcher.py +411 -0
  1113. maxframe_client/session/__init__.py +22 -0
  1114. maxframe_client/session/consts.py +39 -0
  1115. maxframe_client/session/graph.py +125 -0
  1116. maxframe_client/session/odps.py +813 -0
  1117. maxframe_client/session/task.py +329 -0
  1118. maxframe_client/session/tests/__init__.py +13 -0
  1119. maxframe_client/session/tests/test_task.py +115 -0
  1120. maxframe_client/tests/__init__.py +13 -0
  1121. maxframe_client/tests/test_fetcher.py +215 -0
  1122. maxframe_client/tests/test_session.py +409 -0
@@ -0,0 +1,1025 @@
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 itertools
16
+
17
+ from ..datasource.array import tensor as astensor
18
+
19
+ __all__ = ["parse_einsum_input", "einsum_path"]
20
+
21
+ einsum_symbols = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
22
+ einsum_symbols_set = set(einsum_symbols)
23
+
24
+
25
+ def _flop_count(idx_contraction, inner, num_terms, size_dictionary):
26
+ """
27
+ Computes the number of FLOPS in the contraction.
28
+
29
+ Parameters
30
+ ----------
31
+ idx_contraction : iterable
32
+ The indices involved in the contraction
33
+ inner : bool
34
+ Does this contraction require an inner product?
35
+ num_terms : int
36
+ The number of terms in a contraction
37
+ size_dictionary : dict
38
+ The size of each of the indices in idx_contraction
39
+
40
+ Returns
41
+ -------
42
+ flop_count : int
43
+ The total number of FLOPS required for the contraction.
44
+
45
+ Examples
46
+ --------
47
+
48
+ >>> _flop_count('abc', False, 1, {'a': 2, 'b':3, 'c':5})
49
+ 30
50
+
51
+ >>> _flop_count('abc', True, 2, {'a': 2, 'b':3, 'c':5})
52
+ 60
53
+
54
+ """
55
+
56
+ overall_size = _compute_size_by_dict(idx_contraction, size_dictionary)
57
+ op_factor = max(1, num_terms - 1)
58
+ if inner:
59
+ op_factor += 1
60
+
61
+ return overall_size * op_factor
62
+
63
+
64
+ def _compute_size_by_dict(indices, idx_dict):
65
+ """
66
+ Computes the product of the elements in indices based on the dictionary
67
+ idx_dict.
68
+
69
+ Parameters
70
+ ----------
71
+ indices : iterable
72
+ Indices to base the product on.
73
+ idx_dict : dictionary
74
+ Dictionary of index sizes
75
+
76
+ Returns
77
+ -------
78
+ ret : int
79
+ The resulting product.
80
+
81
+ Examples
82
+ --------
83
+ >>> _compute_size_by_dict('abbc', {'a': 2, 'b':3, 'c':5})
84
+ 90
85
+
86
+ """
87
+ ret = 1
88
+ for i in indices:
89
+ ret *= idx_dict[i]
90
+ return ret
91
+
92
+
93
+ def _find_contraction(positions, input_sets, output_set):
94
+ """
95
+ Finds the contraction for a given set of input and output sets.
96
+
97
+ Parameters
98
+ ----------
99
+ positions : iterable
100
+ Integer positions of terms used in the contraction.
101
+ input_sets : list
102
+ List of sets that represent the lhs side of the einsum subscript
103
+ output_set : set
104
+ Set that represents the rhs side of the overall einsum subscript
105
+
106
+ Returns
107
+ -------
108
+ new_result : set
109
+ The indices of the resulting contraction
110
+ remaining : list
111
+ List of sets that have not been contracted, the new set is appended to
112
+ the end of this list
113
+ idx_removed : set
114
+ Indices removed from the entire contraction
115
+ idx_contraction : set
116
+ The indices used in the current contraction
117
+
118
+ Examples
119
+ --------
120
+
121
+ # A simple dot product test case
122
+ >>> pos = (0, 1)
123
+ >>> isets = [set('ab'), set('bc')]
124
+ >>> oset = set('ac')
125
+ >>> _find_contraction(pos, isets, oset)
126
+ ({'a', 'c'}, [{'a', 'c'}], {'b'}, {'a', 'b', 'c'})
127
+
128
+ # A more complex case with additional terms in the contraction
129
+ >>> pos = (0, 2)
130
+ >>> isets = [set('abd'), set('ac'), set('bdc')]
131
+ >>> oset = set('ac')
132
+ >>> _find_contraction(pos, isets, oset)
133
+ ({'a', 'c'}, [{'a', 'c'}, {'a', 'c'}], {'b', 'd'}, {'a', 'b', 'c', 'd'})
134
+ """
135
+
136
+ idx_contract = set()
137
+ idx_remain = output_set.copy()
138
+ remaining = []
139
+ for ind, value in enumerate(input_sets):
140
+ if ind in positions:
141
+ idx_contract |= value
142
+ else:
143
+ remaining.append(value)
144
+ idx_remain |= value
145
+
146
+ new_result = idx_remain & idx_contract
147
+ idx_removed = idx_contract - new_result
148
+ remaining.append(new_result)
149
+
150
+ return (new_result, remaining, idx_removed, idx_contract)
151
+
152
+
153
+ def _optimal_path(input_sets, output_set, idx_dict, memory_limit):
154
+ """
155
+ Computes all possible pair contractions, sieves the results based
156
+ on ``memory_limit`` and returns the lowest cost path. This algorithm
157
+ scales factorial with respect to the elements in the list ``input_sets``.
158
+
159
+ Parameters
160
+ ----------
161
+ input_sets : list
162
+ List of sets that represent the lhs side of the einsum subscript
163
+ output_set : set
164
+ Set that represents the rhs side of the overall einsum subscript
165
+ idx_dict : dictionary
166
+ Dictionary of index sizes
167
+ memory_limit : int
168
+ The maximum number of elements in a temporary array
169
+
170
+ Returns
171
+ -------
172
+ path : list
173
+ The optimal contraction order within the memory limit constraint.
174
+
175
+ Examples
176
+ --------
177
+ >>> isets = [set('abd'), set('ac'), set('bdc')]
178
+ >>> oset = set()
179
+ >>> idx_sizes = {'a': 1, 'b':2, 'c':3, 'd':4}
180
+ >>> _optimal_path(isets, oset, idx_sizes, 5000)
181
+ [(0, 2), (0, 1)]
182
+ """
183
+
184
+ full_results = [(0, [], input_sets)]
185
+ for iteration in range(len(input_sets) - 1):
186
+ iter_results = []
187
+
188
+ # Compute all unique pairs
189
+ for curr in full_results:
190
+ cost, positions, remaining = curr
191
+ for con in itertools.combinations(range(len(input_sets) - iteration), 2):
192
+ # Find the contraction
193
+ cont = _find_contraction(con, remaining, output_set)
194
+ new_result, new_input_sets, idx_removed, idx_contract = cont
195
+
196
+ # Sieve the results based on memory_limit
197
+ new_size = _compute_size_by_dict(new_result, idx_dict)
198
+ if new_size > memory_limit:
199
+ continue
200
+
201
+ # Build (total_cost, positions, indices_remaining)
202
+ total_cost = cost + _flop_count(
203
+ idx_contract, idx_removed, len(con), idx_dict
204
+ )
205
+ new_pos = positions + [con]
206
+ iter_results.append((total_cost, new_pos, new_input_sets))
207
+
208
+ # Update combinatorial list, if we did not find anything return best
209
+ # path + remaining contractions
210
+ if iter_results:
211
+ full_results = iter_results
212
+ else:
213
+ path = min(full_results, key=lambda x: x[0])[1]
214
+ path += [tuple(range(len(input_sets) - iteration))]
215
+ return path
216
+
217
+ # If we have not found anything return single einsum contraction
218
+ if len(full_results) == 0:
219
+ return [tuple(range(len(input_sets)))]
220
+
221
+ path = min(full_results, key=lambda x: x[0])[1]
222
+ return path
223
+
224
+
225
+ def _parse_possible_contraction(
226
+ positions, input_sets, output_set, idx_dict, memory_limit, path_cost, naive_cost
227
+ ):
228
+ """Compute the cost (removed size + flops) and resultant indices for
229
+ performing the contraction specified by ``positions``.
230
+
231
+ Parameters
232
+ ----------
233
+ positions : tuple of int
234
+ The locations of the proposed tensors to contract.
235
+ input_sets : list of sets
236
+ The indices found on each tensors.
237
+ output_set : set
238
+ The output indices of the expression.
239
+ idx_dict : dict
240
+ Mapping of each index to its size.
241
+ memory_limit : int
242
+ The total allowed size for an intermediary tensor.
243
+ path_cost : int
244
+ The contraction cost so far.
245
+ naive_cost : int
246
+ The cost of the unoptimized expression.
247
+
248
+ Returns
249
+ -------
250
+ cost : (int, int)
251
+ A tuple containing the size of any indices removed, and the flop cost.
252
+ positions : tuple of int
253
+ The locations of the proposed tensors to contract.
254
+ new_input_sets : list of sets
255
+ The resulting new list of indices if this proposed contraction is performed.
256
+
257
+ """
258
+
259
+ # Find the contraction
260
+ contract = _find_contraction(positions, input_sets, output_set)
261
+ idx_result, new_input_sets, idx_removed, idx_contract = contract
262
+
263
+ # Sieve the results based on memory_limit
264
+ new_size = _compute_size_by_dict(idx_result, idx_dict)
265
+ if new_size > memory_limit:
266
+ return None
267
+
268
+ # Build sort tuple
269
+ old_sizes = (_compute_size_by_dict(input_sets[p], idx_dict) for p in positions)
270
+ removed_size = sum(old_sizes) - new_size
271
+
272
+ # NB: removed_size used to be just the size of any removed indices i.e.:
273
+ # helpers.compute_size_by_dict(idx_removed, idx_dict)
274
+ cost = _flop_count(idx_contract, idx_removed, len(positions), idx_dict)
275
+ sort = (-removed_size, cost)
276
+
277
+ # Sieve based on total cost as well
278
+ if (path_cost + cost) > naive_cost:
279
+ return None
280
+
281
+ # Add contraction to possible choices
282
+ return [sort, positions, new_input_sets]
283
+
284
+
285
+ def _update_other_results(results, best):
286
+ """Update the positions and provisional input_sets of ``results`` based on
287
+ performing the contraction result ``best``. Remove any involving the tensors
288
+ contracted.
289
+
290
+ Parameters
291
+ ----------
292
+ results : list
293
+ List of contraction results produced by ``_parse_possible_contraction``.
294
+ best : list
295
+ The best contraction of ``results`` i.e. the one that will be performed.
296
+
297
+ Returns
298
+ -------
299
+ mod_results : list
300
+ The list of modified results, updated with outcome of ``best`` contraction.
301
+ """
302
+
303
+ best_con = best[1]
304
+ bx, by = best_con
305
+ mod_results = []
306
+
307
+ for cost, (x, y), con_sets in results:
308
+ # Ignore results involving tensors just contracted
309
+ if x in best_con or y in best_con:
310
+ continue
311
+
312
+ # Update the input_sets
313
+ del con_sets[by - int(by > x) - int(by > y)]
314
+ del con_sets[bx - int(bx > x) - int(bx > y)]
315
+ con_sets.insert(-1, best[2][-1])
316
+
317
+ # Update the position indices
318
+ mod_con = x - int(x > bx) - int(x > by), y - int(y > bx) - int(y > by)
319
+ mod_results.append((cost, mod_con, con_sets))
320
+
321
+ return mod_results
322
+
323
+
324
+ def _greedy_path(input_sets, output_set, idx_dict, memory_limit):
325
+ """
326
+ Finds the path by contracting the best pair until the input list is
327
+ exhausted. The best pair is found by minimizing the tuple
328
+ ``(-prod(indices_removed), cost)``. What this amounts to is prioritizing
329
+ matrix multiplication or inner product operations, then Hadamard like
330
+ operations, and finally outer operations. Outer products are limited by
331
+ ``memory_limit``. This algorithm scales cubically with respect to the
332
+ number of elements in the list ``input_sets``.
333
+
334
+ Parameters
335
+ ----------
336
+ input_sets : list
337
+ List of sets that represent the lhs side of the einsum subscript
338
+ output_set : set
339
+ Set that represents the rhs side of the overall einsum subscript
340
+ idx_dict : dictionary
341
+ Dictionary of index sizes
342
+ memory_limit_limit : int
343
+ The maximum number of elements in a temporary array
344
+
345
+ Returns
346
+ -------
347
+ path : list
348
+ The greedy contraction order within the memory limit constraint.
349
+
350
+ Examples
351
+ --------
352
+ >>> isets = [set('abd'), set('ac'), set('bdc')]
353
+ >>> oset = set()
354
+ >>> idx_sizes = {'a': 1, 'b':2, 'c':3, 'd':4}
355
+ >>> _greedy_path(isets, oset, idx_sizes, 5000)
356
+ [(0, 2), (0, 1)]
357
+ """
358
+
359
+ # Handle trivial cases that leaked through
360
+ if len(input_sets) == 1:
361
+ return [(0,)]
362
+ elif len(input_sets) == 2:
363
+ return [(0, 1)]
364
+
365
+ # Build up a naive cost
366
+ contract = _find_contraction(range(len(input_sets)), input_sets, output_set)
367
+ idx_result, new_input_sets, idx_removed, idx_contract = contract
368
+ naive_cost = _flop_count(idx_contract, idx_removed, len(input_sets), idx_dict)
369
+
370
+ # Initially iterate over all pairs
371
+ comb_iter = itertools.combinations(range(len(input_sets)), 2)
372
+ known_contractions = []
373
+
374
+ path_cost = 0
375
+ path = []
376
+
377
+ for iteration in range(len(input_sets) - 1):
378
+ # Iterate over all pairs on first step, only previously found pairs on subsequent steps
379
+ for positions in comb_iter:
380
+ # Always initially ignore outer products
381
+ if input_sets[positions[0]].isdisjoint(input_sets[positions[1]]):
382
+ continue
383
+
384
+ result = _parse_possible_contraction(
385
+ positions,
386
+ input_sets,
387
+ output_set,
388
+ idx_dict,
389
+ memory_limit,
390
+ path_cost,
391
+ naive_cost,
392
+ )
393
+ if result is not None:
394
+ known_contractions.append(result)
395
+
396
+ # If we do not have a inner contraction, rescan pairs including outer products
397
+ if len(known_contractions) == 0: # pragma: no cover
398
+ # Then check the outer products
399
+ for positions in itertools.combinations(range(len(input_sets)), 2):
400
+ result = _parse_possible_contraction(
401
+ positions,
402
+ input_sets,
403
+ output_set,
404
+ idx_dict,
405
+ memory_limit,
406
+ path_cost,
407
+ naive_cost,
408
+ )
409
+ if result is not None:
410
+ known_contractions.append(result)
411
+
412
+ # If we still did not find any remaining contractions, default back to einsum like behavior
413
+ if len(known_contractions) == 0:
414
+ path.append(tuple(range(len(input_sets))))
415
+ break
416
+
417
+ # Sort based on first index
418
+ best = min(known_contractions, key=lambda x: x[0])
419
+
420
+ # Now propagate as many unused contractions as possible to next iteration
421
+ known_contractions = _update_other_results(known_contractions, best)
422
+
423
+ # Next iteration only compute contractions with the new tensor
424
+ # All other contractions have been accounted for
425
+ input_sets = best[2]
426
+ new_tensor_pos = len(input_sets) - 1
427
+ comb_iter = ((i, new_tensor_pos) for i in range(new_tensor_pos))
428
+
429
+ # Update path and total cost
430
+ path.append(best[1])
431
+ path_cost += best[0][1]
432
+
433
+ return path
434
+
435
+
436
+ def _can_dot(inputs, result, idx_removed):
437
+ """
438
+ Checks if we can use BLAS (np.tensordot) call and its beneficial to do so.
439
+
440
+ Parameters
441
+ ----------
442
+ inputs : list of str
443
+ Specifies the subscripts for summation.
444
+ result : str
445
+ Resulting summation.
446
+ idx_removed : set
447
+ Indices that are removed in the summation
448
+
449
+
450
+ Returns
451
+ -------
452
+ type : bool
453
+ Returns true if BLAS should and can be used, else False
454
+
455
+ Notes
456
+ -----
457
+ If the operations is BLAS level 1 or 2 and is not already aligned
458
+ we default back to einsum as the memory movement to copy is more
459
+ costly than the operation itself.
460
+
461
+
462
+ Examples
463
+ --------
464
+
465
+ # Standard GEMM operation
466
+ >>> _can_dot(['ij', 'jk'], 'ik', set('j'))
467
+ True
468
+
469
+ # Can use the standard BLAS, but requires odd data movement
470
+ >>> _can_dot(['ijj', 'jk'], 'ik', set('j'))
471
+ False
472
+
473
+ # DDOT where the memory is not aligned
474
+ >>> _can_dot(['ijk', 'ikj'], '', set('ijk'))
475
+ False
476
+
477
+ """
478
+
479
+ # All `dot` calls remove indices
480
+ if len(idx_removed) == 0:
481
+ return False
482
+
483
+ # BLAS can only handle two operands
484
+ if len(inputs) != 2:
485
+ return False
486
+
487
+ input_left, input_right = inputs
488
+
489
+ for c in set(input_left + input_right):
490
+ # can't deal with repeated indices on same input or more than 2 total
491
+ nl, nr = input_left.count(c), input_right.count(c)
492
+ if (nl > 1) or (nr > 1) or (nl + nr > 2):
493
+ return False
494
+
495
+ # can't do implicit summation or dimension collapse e.g.
496
+ # "ab,bc->c" (implicitly sum over 'a')
497
+ # "ab,ca->ca" (take diagonal of 'a')
498
+ if nl + nr - 1 == int(c in result):
499
+ return False
500
+
501
+ # Build a few temporaries
502
+ set_left = set(input_left)
503
+ set_right = set(input_right)
504
+ keep_left = set_left - idx_removed
505
+ keep_right = set_right - idx_removed
506
+ rs = len(idx_removed)
507
+
508
+ # At this point we are a DOT, GEMV, or GEMM operation
509
+
510
+ # Handle inner products
511
+
512
+ # DDOT with aligned data
513
+ if input_left == input_right:
514
+ return True
515
+
516
+ # DDOT without aligned data (better to use einsum)
517
+ if set_left == set_right:
518
+ return False
519
+
520
+ # Handle the 4 possible (aligned) GEMV or GEMM cases
521
+
522
+ # GEMM or GEMV no transpose
523
+ if input_left[-rs:] == input_right[:rs]:
524
+ return True
525
+
526
+ # GEMM or GEMV transpose both
527
+ if input_left[:rs] == input_right[-rs:]:
528
+ return True
529
+
530
+ # GEMM or GEMV transpose right
531
+ if input_left[-rs:] == input_right[-rs:]:
532
+ return True
533
+
534
+ # GEMM or GEMV transpose left
535
+ if input_left[:rs] == input_right[:rs]:
536
+ return True
537
+
538
+ # Einsum is faster than GEMV if we have to copy data
539
+ if not keep_left or not keep_right:
540
+ return False
541
+
542
+ # We are a matrix-matrix product, but we need to copy data
543
+ return True
544
+
545
+
546
+ def parse_einsum_input(operands):
547
+ """
548
+ A reproduction of einsum c side einsum parsing in python.
549
+
550
+ Returns
551
+ -------
552
+ input_strings : str
553
+ Parsed input strings
554
+ output_string : str
555
+ Parsed output string
556
+ operands : list of array_like
557
+ The operands to use in the numpy contraction
558
+
559
+ Examples
560
+ --------
561
+ The operand list is simplified to reduce printing:
562
+
563
+ >>> import maxframe.tensor as mt
564
+ >>> mt.random.seed(123)
565
+ >>> a = mt.random.rand(4, 4)
566
+ >>> b = mt.random.rand(4, 4, 4)
567
+ >>> parse_einsum_input(('...a,...a->...', a, b))
568
+ ('za,xza', 'xz', [a, b]) # may vary
569
+
570
+ >>> parse_einsum_input((a, [Ellipsis, 0], b, [Ellipsis, 0]))
571
+ ('za,xza', 'xz', [a, b]) # may vary
572
+ """
573
+
574
+ if len(operands) == 0:
575
+ raise ValueError("No input operands")
576
+
577
+ if isinstance(operands[0], str):
578
+ subscripts = operands[0].replace(" ", "")
579
+ operands = [astensor(v) for v in operands[1:]]
580
+
581
+ # Ensure all characters are valid
582
+ for s in subscripts:
583
+ if s in ".,->":
584
+ continue
585
+ if s not in einsum_symbols:
586
+ raise ValueError(f"Character {s} is not a valid symbol.")
587
+
588
+ else: # pragma: no cover
589
+ tmp_operands = list(operands)
590
+ operand_list = []
591
+ subscript_list = []
592
+ for p in range(len(operands) // 2):
593
+ operand_list.append(tmp_operands.pop(0))
594
+ subscript_list.append(tmp_operands.pop(0))
595
+
596
+ output_list = tmp_operands[-1] if len(tmp_operands) else None
597
+ operands = [astensor(v) for v in operand_list]
598
+ subscripts = ""
599
+ last = len(subscript_list) - 1
600
+ for num, sub in enumerate(subscript_list):
601
+ for s in sub:
602
+ if s is Ellipsis:
603
+ subscripts += "..."
604
+ elif isinstance(s, int):
605
+ subscripts += einsum_symbols[s]
606
+ else:
607
+ raise TypeError(
608
+ "For this input type lists must contain "
609
+ "either int or Ellipsis"
610
+ )
611
+ if num != last:
612
+ subscripts += ","
613
+
614
+ if output_list is not None:
615
+ subscripts += "->"
616
+ for s in output_list:
617
+ if s is Ellipsis:
618
+ subscripts += "..."
619
+ elif isinstance(s, int):
620
+ subscripts += einsum_symbols[s]
621
+ else:
622
+ raise TypeError(
623
+ "For this input type lists must contain "
624
+ "either int or Ellipsis"
625
+ )
626
+ # Check for proper "->"
627
+ if ("-" in subscripts) or (">" in subscripts):
628
+ invalid = (subscripts.count("-") > 1) or (subscripts.count(">") > 1)
629
+ if invalid or (subscripts.count("->") != 1):
630
+ raise ValueError("Subscripts can only contain one '->'.")
631
+
632
+ # Parse ellipses
633
+ if "." in subscripts:
634
+ used = subscripts.replace(".", "").replace(",", "").replace("->", "")
635
+ unused = list(einsum_symbols_set - set(used))
636
+ ellipse_inds = "".join(unused)
637
+ longest = 0
638
+
639
+ if "->" in subscripts:
640
+ input_tmp, output_sub = subscripts.split("->")
641
+ split_subscripts = input_tmp.split(",")
642
+ out_sub = True
643
+ else:
644
+ split_subscripts = subscripts.split(",")
645
+ out_sub = False
646
+
647
+ for num, sub in enumerate(split_subscripts):
648
+ if "." in sub:
649
+ if (sub.count(".") != 3) or (sub.count("...") != 1):
650
+ raise ValueError("Invalid Ellipses.")
651
+
652
+ # Take into account numerical values
653
+ if operands[num].shape == ():
654
+ ellipse_count = 0
655
+ else:
656
+ ellipse_count = max(operands[num].ndim, 1)
657
+ ellipse_count -= len(sub) - 3
658
+
659
+ if ellipse_count > longest:
660
+ longest = ellipse_count
661
+
662
+ if ellipse_count < 0:
663
+ raise ValueError("Ellipses lengths do not match.")
664
+ elif ellipse_count == 0:
665
+ split_subscripts[num] = sub.replace("...", "")
666
+ else:
667
+ rep_inds = ellipse_inds[-ellipse_count:]
668
+ split_subscripts[num] = sub.replace("...", rep_inds)
669
+
670
+ subscripts = ",".join(split_subscripts)
671
+ if longest == 0:
672
+ out_ellipse = ""
673
+ else:
674
+ out_ellipse = ellipse_inds[-longest:]
675
+
676
+ if out_sub:
677
+ subscripts += "->" + output_sub.replace("...", out_ellipse)
678
+ else:
679
+ # Special care for outputless ellipses
680
+ output_subscript = ""
681
+ tmp_subscripts = subscripts.replace(",", "")
682
+ for s in sorted(set(tmp_subscripts)):
683
+ if s not in (einsum_symbols):
684
+ raise ValueError(f"Character {s} is not a valid symbol.")
685
+ if tmp_subscripts.count(s) == 1:
686
+ output_subscript += s
687
+ normal_inds = "".join(sorted(set(output_subscript) - set(out_ellipse)))
688
+
689
+ subscripts += "->" + out_ellipse + normal_inds
690
+
691
+ # Build output string if does not exist
692
+ if "->" in subscripts:
693
+ input_subscripts, output_subscript = subscripts.split("->")
694
+ else:
695
+ input_subscripts = subscripts
696
+ # Build output subscripts
697
+ tmp_subscripts = subscripts.replace(",", "")
698
+ output_subscript = ""
699
+ for s in sorted(set(tmp_subscripts)):
700
+ if s not in einsum_symbols:
701
+ raise ValueError(f"Character {s} is not a valid symbol.")
702
+ if tmp_subscripts.count(s) == 1:
703
+ output_subscript += s
704
+
705
+ # Make sure output subscripts are in the input
706
+ for char in output_subscript:
707
+ if char not in input_subscripts:
708
+ raise ValueError(f"Output character {char} did not appear in the input")
709
+
710
+ # Make sure number operands is equivalent to the number of terms
711
+ if len(input_subscripts.split(",")) != len(operands):
712
+ raise ValueError(
713
+ "Number of einsum subscripts must be equal to the number of operands."
714
+ )
715
+
716
+ return (input_subscripts, output_subscript, operands)
717
+
718
+
719
+ def _einsum_path_dispatcher(*operands, **kwargs):
720
+ # NOTE: technically, we should only dispatch on array-like arguments, not
721
+ # subscripts (given as strings). But separating operands into
722
+ # arrays/subscripts is a little tricky/slow (given einsum's two supported
723
+ # signatures), so as a practical shortcut we dispatch on everything.
724
+ # Strings will be ignored for dispatching since they don't define
725
+ # __array_function__.
726
+ return operands
727
+
728
+
729
+ def einsum_path(*operands, **kwargs):
730
+ """
731
+ einsum_path(subscripts, *operands, optimize='greedy')
732
+
733
+ Evaluates the lowest cost contraction order for an einsum expression by
734
+ considering the creation of intermediate arrays.
735
+
736
+ Parameters
737
+ ----------
738
+ subscripts : str
739
+ Specifies the subscripts for summation.
740
+ *operands : list of array_like
741
+ These are the arrays for the operation.
742
+ optimize : {bool, list, tuple, 'greedy', 'optimal'}
743
+ Choose the type of path. If a tuple is provided, the second argument is
744
+ assumed to be the maximum intermediate size created. If only a single
745
+ argument is provided the largest input or output array size is used
746
+ as a maximum intermediate size.
747
+
748
+ * if a list is given that starts with ``einsum_path``, uses this as the
749
+ contraction path
750
+ * if False no optimization is taken
751
+ * if True defaults to the 'greedy' algorithm
752
+ * 'optimal' An algorithm that combinatorially explores all possible
753
+ ways of contracting the listed tensors and choosest the least costly
754
+ path. Scales exponentially with the number of terms in the
755
+ contraction.
756
+ * 'greedy' An algorithm that chooses the best pair contraction
757
+ at each step. Effectively, this algorithm searches the largest inner,
758
+ Hadamard, and then outer products at each step. Scales cubically with
759
+ the number of terms in the contraction. Equivalent to the 'optimal'
760
+ path for most contractions.
761
+
762
+ Default is 'greedy'.
763
+
764
+ Returns
765
+ -------
766
+ path : list of tuples
767
+ A list representation of the einsum path.
768
+ string_repr : str
769
+ A printable representation of the einsum path.
770
+
771
+ Notes
772
+ -----
773
+ The resulting path indicates which terms of the input contraction should be
774
+ contracted first, the result of this contraction is then appended to the
775
+ end of the contraction list. This list can then be iterated over until all
776
+ intermediate contractions are complete.
777
+
778
+ See Also
779
+ --------
780
+ einsum, linalg.multi_dot
781
+
782
+ Examples
783
+ --------
784
+
785
+ We can begin with a chain dot example. In this case, it is optimal to
786
+ contract the ``b`` and ``c`` tensors first as represented by the first
787
+ element of the path ``(1, 2)``. The resulting tensor is added to the end
788
+ of the contraction and the remaining contraction ``(0, 1)`` is then
789
+ completed.
790
+
791
+ >>> np.random.seed(123)
792
+ >>> a = np.random.rand(2, 2)
793
+ >>> b = np.random.rand(2, 5)
794
+ >>> c = np.random.rand(5, 2)
795
+ >>> path_info = np.einsum_path('ij,jk,kl->il', a, b, c, optimize='greedy')
796
+ >>> print(path_info[0])
797
+ ['einsum_path', (1, 2), (0, 1)]
798
+ >>> print(path_info[1])
799
+ Complete contraction: ij,jk,kl->il # may vary
800
+ Naive scaling: 4
801
+ Optimized scaling: 3
802
+ Naive FLOP count: 1.600e+02
803
+ Optimized FLOP count: 5.600e+01
804
+ Theoretical speedup: 2.857
805
+ Largest intermediate: 4.000e+00 elements
806
+ -------------------------------------------------------------------------
807
+ scaling current remaining
808
+ -------------------------------------------------------------------------
809
+ 3 kl,jk->jl ij,jl->il
810
+ 3 jl,ij->il il->il
811
+
812
+
813
+ A more complex index transformation example.
814
+
815
+ >>> I = np.random.rand(10, 10, 10, 10)
816
+ >>> C = np.random.rand(10, 10)
817
+ >>> path_info = np.einsum_path('ea,fb,abcd,gc,hd->efgh', C, C, I, C, C,
818
+ ... optimize='greedy')
819
+
820
+ >>> print(path_info[0])
821
+ ['einsum_path', (0, 2), (0, 3), (0, 2), (0, 1)]
822
+ >>> print(path_info[1])
823
+ Complete contraction: ea,fb,abcd,gc,hd->efgh # may vary
824
+ Naive scaling: 8
825
+ Optimized scaling: 5
826
+ Naive FLOP count: 8.000e+08
827
+ Optimized FLOP count: 8.000e+05
828
+ Theoretical speedup: 1000.000
829
+ Largest intermediate: 1.000e+04 elements
830
+ --------------------------------------------------------------------------
831
+ scaling current remaining
832
+ --------------------------------------------------------------------------
833
+ 5 abcd,ea->bcde fb,gc,hd,bcde->efgh
834
+ 5 bcde,fb->cdef gc,hd,cdef->efgh
835
+ 5 cdef,gc->defg hd,defg->efgh
836
+ 5 defg,hd->efgh efgh->efgh
837
+ """
838
+
839
+ # Make sure all keywords are valid
840
+ valid_contract_kwargs = ["optimize", "einsum_call"]
841
+ unknown_kwargs = [k for (k, v) in kwargs.items() if k not in valid_contract_kwargs]
842
+ if len(unknown_kwargs):
843
+ raise TypeError(f"Did not understand the following kwargs: {unknown_kwargs!r}")
844
+
845
+ # Figure out what the path really is
846
+ path_type = kwargs.pop("optimize", True)
847
+ if path_type is True:
848
+ path_type = "greedy"
849
+ if path_type is None:
850
+ path_type = False
851
+
852
+ memory_limit = None
853
+
854
+ # No optimization or a named path algorithm
855
+ if (path_type is False) or isinstance(path_type, str):
856
+ pass
857
+
858
+ # Given an explicit path
859
+ elif len(path_type) and (path_type[0] == "einsum_path"): # pragma: no cover
860
+ pass
861
+
862
+ # Path tuple with memory limit
863
+ elif (
864
+ (len(path_type) == 2)
865
+ and isinstance(path_type[0], str)
866
+ and isinstance(path_type[1], (int, float))
867
+ ): # pragma: no cover
868
+ memory_limit = int(path_type[1])
869
+ path_type = path_type[0]
870
+
871
+ else: # pragma: no cover
872
+ raise TypeError(f"Did not understand the path: {path_type}")
873
+
874
+ # Hidden option, only einsum should call this
875
+ einsum_call_arg = kwargs.pop("einsum_call", False)
876
+
877
+ # Python side parsing
878
+ input_subscripts, output_subscript, operands = parse_einsum_input(operands)
879
+
880
+ # Build a few useful list and sets
881
+ input_list = input_subscripts.split(",")
882
+ input_sets = [set(x) for x in input_list]
883
+ output_set = set(output_subscript)
884
+ indices = set(input_subscripts.replace(",", ""))
885
+
886
+ # Get length of each unique dimension and ensure all dimensions are correct
887
+ dimension_dict = {}
888
+ broadcast_indices = [[] for x in range(len(input_list))]
889
+ for tnum, term in enumerate(input_list):
890
+ sh = operands[tnum].shape
891
+ if len(sh) != len(term):
892
+ raise ValueError(
893
+ "Einstein sum subscript %s does not contain the "
894
+ "correct number of indices for operand %d."
895
+ % (input_subscripts[tnum], tnum)
896
+ )
897
+ for cnum, char in enumerate(term):
898
+ dim = sh[cnum]
899
+
900
+ # Build out broadcast indices
901
+ if dim == 1:
902
+ broadcast_indices[tnum].append(char)
903
+
904
+ if char in dimension_dict.keys():
905
+ # For broadcasting cases we always want the largest dim size
906
+ if dimension_dict[char] == 1:
907
+ dimension_dict[char] = dim
908
+ elif dim not in (1, dimension_dict[char]):
909
+ raise ValueError(
910
+ "Size of label '%s' for operand %d (%d) "
911
+ "does not match previous terms (%d)."
912
+ % (char, tnum, dimension_dict[char], dim)
913
+ )
914
+ else:
915
+ dimension_dict[char] = dim
916
+
917
+ # Convert broadcast inds to sets
918
+ broadcast_indices = [set(x) for x in broadcast_indices]
919
+
920
+ # Compute size of each input array plus the output array
921
+ size_list = [
922
+ _compute_size_by_dict(term, dimension_dict)
923
+ for term in input_list + [output_subscript]
924
+ ]
925
+ max_size = max(size_list)
926
+
927
+ if memory_limit is None:
928
+ memory_arg = max_size
929
+ else:
930
+ memory_arg = memory_limit
931
+
932
+ # Compute naive cost
933
+ # This isn't quite right, need to look into exactly how einsum does this
934
+ inner_product = (sum(len(x) for x in input_sets) - len(indices)) > 0
935
+ naive_cost = _flop_count(indices, inner_product, len(input_list), dimension_dict)
936
+
937
+ # Compute the path
938
+ if (path_type is False) or (len(input_list) in [1, 2]) or (indices == output_set):
939
+ # Nothing to be optimized, leave it to einsum
940
+ path = [tuple(range(len(input_list)))]
941
+ elif path_type == "greedy":
942
+ path = _greedy_path(input_sets, output_set, dimension_dict, memory_arg)
943
+ elif path_type == "optimal":
944
+ path = _optimal_path(input_sets, output_set, dimension_dict, memory_arg)
945
+ elif path_type[0] == "einsum_path": # pragma: no cover
946
+ path = path_type[1:]
947
+ else: # pragma: no cover
948
+ raise KeyError("Path name %s not found", path_type)
949
+
950
+ cost_list, scale_list, size_list, contraction_list = [], [], [], []
951
+
952
+ # Build contraction tuple (positions, gemm, einsum_str, remaining)
953
+ for cnum, contract_inds in enumerate(path):
954
+ # Make sure we remove inds from right to left
955
+ contract_inds = tuple(sorted(list(contract_inds), reverse=True))
956
+
957
+ contract = _find_contraction(contract_inds, input_sets, output_set)
958
+ out_inds, input_sets, idx_removed, idx_contract = contract
959
+
960
+ cost = _flop_count(
961
+ idx_contract, idx_removed, len(contract_inds), dimension_dict
962
+ )
963
+ cost_list.append(cost)
964
+ scale_list.append(len(idx_contract))
965
+ size_list.append(_compute_size_by_dict(out_inds, dimension_dict))
966
+
967
+ bcast = set()
968
+ tmp_inputs = []
969
+ for x in contract_inds:
970
+ tmp_inputs.append(input_list.pop(x))
971
+ bcast |= broadcast_indices.pop(x)
972
+
973
+ new_bcast_inds = bcast - idx_removed
974
+
975
+ # If we're broadcasting, nix blas
976
+ if not len(idx_removed & bcast):
977
+ do_blas = _can_dot(tmp_inputs, out_inds, idx_removed)
978
+ else:
979
+ do_blas = False
980
+
981
+ # Last contraction
982
+ if (cnum - len(path)) == -1:
983
+ idx_result = output_subscript
984
+ else:
985
+ sort_result = [(dimension_dict[ind], ind) for ind in out_inds]
986
+ idx_result = "".join([x[1] for x in sorted(sort_result)])
987
+
988
+ input_list.append(idx_result)
989
+ broadcast_indices.append(new_bcast_inds)
990
+ einsum_str = ",".join(tmp_inputs) + "->" + idx_result
991
+
992
+ contraction = (contract_inds, idx_removed, einsum_str, input_list[:], do_blas)
993
+ contraction_list.append(contraction)
994
+
995
+ opt_cost = sum(cost_list) + 1
996
+
997
+ if einsum_call_arg:
998
+ return (operands, contraction_list)
999
+
1000
+ # Return the path along with a nice string representation
1001
+ overall_contraction = input_subscripts + "->" + output_subscript
1002
+ header = ("scaling", "current", "remaining")
1003
+
1004
+ speedup = naive_cost / opt_cost
1005
+ max_i = max(size_list)
1006
+
1007
+ path_print = " Complete contraction: %s\n" % overall_contraction # noqa: E221
1008
+ path_print += " Naive scaling: %d\n" % len(indices)
1009
+ path_print += " Optimized scaling: %d\n" % max(scale_list)
1010
+ path_print += " Naive FLOP count: %.3e\n" % naive_cost
1011
+ path_print += " Optimized FLOP count: %.3e\n" % opt_cost
1012
+ path_print += " Theoretical speedup: %3.3f\n" % speedup
1013
+ path_print += " Largest intermediate: %.3e elements\n" % max_i
1014
+ path_print += "-" * 74 + "\n"
1015
+ path_print += "%6s %24s %40s\n" % header
1016
+ path_print += "-" * 74
1017
+
1018
+ for n, contraction in enumerate(contraction_list):
1019
+ inds, idx_rm, einsum_str, remaining, blas = contraction
1020
+ remaining_str = ",".join(remaining) + "->" + output_subscript
1021
+ path_run = (scale_list[n], einsum_str, remaining_str)
1022
+ path_print += "\n%4d %24s %40s" % path_run
1023
+
1024
+ path = ["einsum_path"] + path
1025
+ return path, path_print