maxframe 0.1.0b5__cp38-cp38-macosx_11_0_arm64.whl

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

Potentially problematic release.


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

Files changed (647) hide show
  1. maxframe/__init__.py +32 -0
  2. maxframe/_utils.cpython-38-darwin.so +0 -0
  3. maxframe/_utils.pxd +33 -0
  4. maxframe/_utils.pyx +547 -0
  5. maxframe/codegen.py +528 -0
  6. maxframe/config/__init__.py +15 -0
  7. maxframe/config/config.py +443 -0
  8. maxframe/config/tests/__init__.py +13 -0
  9. maxframe/config/tests/test_config.py +103 -0
  10. maxframe/config/tests/test_validators.py +34 -0
  11. maxframe/config/validators.py +57 -0
  12. maxframe/conftest.py +139 -0
  13. maxframe/core/__init__.py +65 -0
  14. maxframe/core/base.py +156 -0
  15. maxframe/core/entity/__init__.py +44 -0
  16. maxframe/core/entity/chunks.py +68 -0
  17. maxframe/core/entity/core.py +152 -0
  18. maxframe/core/entity/executable.py +337 -0
  19. maxframe/core/entity/fuse.py +73 -0
  20. maxframe/core/entity/objects.py +100 -0
  21. maxframe/core/entity/output_types.py +90 -0
  22. maxframe/core/entity/tileables.py +438 -0
  23. maxframe/core/entity/utils.py +24 -0
  24. maxframe/core/graph/__init__.py +17 -0
  25. maxframe/core/graph/builder/__init__.py +16 -0
  26. maxframe/core/graph/builder/base.py +86 -0
  27. maxframe/core/graph/builder/chunk.py +430 -0
  28. maxframe/core/graph/builder/tileable.py +34 -0
  29. maxframe/core/graph/builder/utils.py +41 -0
  30. maxframe/core/graph/core.cpython-38-darwin.so +0 -0
  31. maxframe/core/graph/core.pyx +467 -0
  32. maxframe/core/graph/entity.py +171 -0
  33. maxframe/core/graph/tests/__init__.py +13 -0
  34. maxframe/core/graph/tests/test_graph.py +205 -0
  35. maxframe/core/mode.py +96 -0
  36. maxframe/core/operator/__init__.py +34 -0
  37. maxframe/core/operator/base.py +450 -0
  38. maxframe/core/operator/core.py +276 -0
  39. maxframe/core/operator/fetch.py +53 -0
  40. maxframe/core/operator/fuse.py +29 -0
  41. maxframe/core/operator/objects.py +72 -0
  42. maxframe/core/operator/shuffle.py +111 -0
  43. maxframe/core/operator/tests/__init__.py +13 -0
  44. maxframe/core/operator/tests/test_core.py +64 -0
  45. maxframe/core/tests/__init__.py +13 -0
  46. maxframe/core/tests/test_mode.py +75 -0
  47. maxframe/dataframe/__init__.py +81 -0
  48. maxframe/dataframe/arithmetic/__init__.py +359 -0
  49. maxframe/dataframe/arithmetic/abs.py +33 -0
  50. maxframe/dataframe/arithmetic/add.py +60 -0
  51. maxframe/dataframe/arithmetic/arccos.py +28 -0
  52. maxframe/dataframe/arithmetic/arccosh.py +28 -0
  53. maxframe/dataframe/arithmetic/arcsin.py +28 -0
  54. maxframe/dataframe/arithmetic/arcsinh.py +28 -0
  55. maxframe/dataframe/arithmetic/arctan.py +28 -0
  56. maxframe/dataframe/arithmetic/arctanh.py +28 -0
  57. maxframe/dataframe/arithmetic/around.py +152 -0
  58. maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
  59. maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
  60. maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
  61. maxframe/dataframe/arithmetic/ceil.py +28 -0
  62. maxframe/dataframe/arithmetic/core.py +342 -0
  63. maxframe/dataframe/arithmetic/cos.py +28 -0
  64. maxframe/dataframe/arithmetic/cosh.py +28 -0
  65. maxframe/dataframe/arithmetic/degrees.py +28 -0
  66. maxframe/dataframe/arithmetic/docstring.py +442 -0
  67. maxframe/dataframe/arithmetic/equal.py +56 -0
  68. maxframe/dataframe/arithmetic/exp.py +28 -0
  69. maxframe/dataframe/arithmetic/exp2.py +28 -0
  70. maxframe/dataframe/arithmetic/expm1.py +28 -0
  71. maxframe/dataframe/arithmetic/floor.py +28 -0
  72. maxframe/dataframe/arithmetic/floordiv.py +64 -0
  73. maxframe/dataframe/arithmetic/greater.py +57 -0
  74. maxframe/dataframe/arithmetic/greater_equal.py +57 -0
  75. maxframe/dataframe/arithmetic/invert.py +33 -0
  76. maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
  77. maxframe/dataframe/arithmetic/less.py +57 -0
  78. maxframe/dataframe/arithmetic/less_equal.py +57 -0
  79. maxframe/dataframe/arithmetic/log.py +28 -0
  80. maxframe/dataframe/arithmetic/log10.py +28 -0
  81. maxframe/dataframe/arithmetic/log2.py +28 -0
  82. maxframe/dataframe/arithmetic/mod.py +60 -0
  83. maxframe/dataframe/arithmetic/multiply.py +60 -0
  84. maxframe/dataframe/arithmetic/negative.py +33 -0
  85. maxframe/dataframe/arithmetic/not_equal.py +56 -0
  86. maxframe/dataframe/arithmetic/power.py +68 -0
  87. maxframe/dataframe/arithmetic/radians.py +28 -0
  88. maxframe/dataframe/arithmetic/sin.py +28 -0
  89. maxframe/dataframe/arithmetic/sinh.py +28 -0
  90. maxframe/dataframe/arithmetic/sqrt.py +28 -0
  91. maxframe/dataframe/arithmetic/subtract.py +64 -0
  92. maxframe/dataframe/arithmetic/tan.py +28 -0
  93. maxframe/dataframe/arithmetic/tanh.py +28 -0
  94. maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
  95. maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
  96. maxframe/dataframe/arithmetic/truediv.py +64 -0
  97. maxframe/dataframe/arithmetic/trunc.py +28 -0
  98. maxframe/dataframe/arrays.py +864 -0
  99. maxframe/dataframe/core.py +2417 -0
  100. maxframe/dataframe/datasource/__init__.py +15 -0
  101. maxframe/dataframe/datasource/core.py +81 -0
  102. maxframe/dataframe/datasource/dataframe.py +59 -0
  103. maxframe/dataframe/datasource/date_range.py +504 -0
  104. maxframe/dataframe/datasource/from_index.py +54 -0
  105. maxframe/dataframe/datasource/from_records.py +107 -0
  106. maxframe/dataframe/datasource/from_tensor.py +419 -0
  107. maxframe/dataframe/datasource/index.py +117 -0
  108. maxframe/dataframe/datasource/read_csv.py +528 -0
  109. maxframe/dataframe/datasource/read_odps_query.py +299 -0
  110. maxframe/dataframe/datasource/read_odps_table.py +253 -0
  111. maxframe/dataframe/datasource/read_parquet.py +421 -0
  112. maxframe/dataframe/datasource/series.py +55 -0
  113. maxframe/dataframe/datasource/tests/__init__.py +13 -0
  114. maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
  115. maxframe/dataframe/datastore/__init__.py +26 -0
  116. maxframe/dataframe/datastore/core.py +19 -0
  117. maxframe/dataframe/datastore/to_csv.py +227 -0
  118. maxframe/dataframe/datastore/to_odps.py +162 -0
  119. maxframe/dataframe/extensions/__init__.py +41 -0
  120. maxframe/dataframe/extensions/accessor.py +50 -0
  121. maxframe/dataframe/extensions/reshuffle.py +83 -0
  122. maxframe/dataframe/extensions/tests/__init__.py +13 -0
  123. maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
  124. maxframe/dataframe/fetch/__init__.py +15 -0
  125. maxframe/dataframe/fetch/core.py +86 -0
  126. maxframe/dataframe/groupby/__init__.py +82 -0
  127. maxframe/dataframe/groupby/aggregation.py +350 -0
  128. maxframe/dataframe/groupby/apply.py +251 -0
  129. maxframe/dataframe/groupby/core.py +179 -0
  130. maxframe/dataframe/groupby/cum.py +124 -0
  131. maxframe/dataframe/groupby/fill.py +141 -0
  132. maxframe/dataframe/groupby/getitem.py +92 -0
  133. maxframe/dataframe/groupby/head.py +105 -0
  134. maxframe/dataframe/groupby/sample.py +214 -0
  135. maxframe/dataframe/groupby/tests/__init__.py +13 -0
  136. maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
  137. maxframe/dataframe/groupby/transform.py +255 -0
  138. maxframe/dataframe/indexing/__init__.py +84 -0
  139. maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
  140. maxframe/dataframe/indexing/align.py +349 -0
  141. maxframe/dataframe/indexing/at.py +83 -0
  142. maxframe/dataframe/indexing/getitem.py +204 -0
  143. maxframe/dataframe/indexing/iat.py +37 -0
  144. maxframe/dataframe/indexing/iloc.py +566 -0
  145. maxframe/dataframe/indexing/insert.py +86 -0
  146. maxframe/dataframe/indexing/loc.py +411 -0
  147. maxframe/dataframe/indexing/reindex.py +526 -0
  148. maxframe/dataframe/indexing/rename.py +462 -0
  149. maxframe/dataframe/indexing/rename_axis.py +209 -0
  150. maxframe/dataframe/indexing/reset_index.py +402 -0
  151. maxframe/dataframe/indexing/sample.py +221 -0
  152. maxframe/dataframe/indexing/set_axis.py +194 -0
  153. maxframe/dataframe/indexing/set_index.py +61 -0
  154. maxframe/dataframe/indexing/setitem.py +130 -0
  155. maxframe/dataframe/indexing/tests/__init__.py +13 -0
  156. maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
  157. maxframe/dataframe/indexing/where.py +308 -0
  158. maxframe/dataframe/initializer.py +288 -0
  159. maxframe/dataframe/merge/__init__.py +32 -0
  160. maxframe/dataframe/merge/append.py +121 -0
  161. maxframe/dataframe/merge/concat.py +325 -0
  162. maxframe/dataframe/merge/merge.py +593 -0
  163. maxframe/dataframe/merge/tests/__init__.py +13 -0
  164. maxframe/dataframe/merge/tests/test_merge.py +215 -0
  165. maxframe/dataframe/misc/__init__.py +134 -0
  166. maxframe/dataframe/misc/_duplicate.py +46 -0
  167. maxframe/dataframe/misc/accessor.py +276 -0
  168. maxframe/dataframe/misc/apply.py +692 -0
  169. maxframe/dataframe/misc/astype.py +236 -0
  170. maxframe/dataframe/misc/case_when.py +141 -0
  171. maxframe/dataframe/misc/check_monotonic.py +84 -0
  172. maxframe/dataframe/misc/cut.py +383 -0
  173. maxframe/dataframe/misc/datetimes.py +79 -0
  174. maxframe/dataframe/misc/describe.py +108 -0
  175. maxframe/dataframe/misc/diff.py +210 -0
  176. maxframe/dataframe/misc/drop.py +440 -0
  177. maxframe/dataframe/misc/drop_duplicates.py +248 -0
  178. maxframe/dataframe/misc/duplicated.py +292 -0
  179. maxframe/dataframe/misc/eval.py +728 -0
  180. maxframe/dataframe/misc/explode.py +171 -0
  181. maxframe/dataframe/misc/get_dummies.py +208 -0
  182. maxframe/dataframe/misc/isin.py +217 -0
  183. maxframe/dataframe/misc/map.py +236 -0
  184. maxframe/dataframe/misc/melt.py +162 -0
  185. maxframe/dataframe/misc/memory_usage.py +248 -0
  186. maxframe/dataframe/misc/pct_change.py +150 -0
  187. maxframe/dataframe/misc/pivot_table.py +262 -0
  188. maxframe/dataframe/misc/qcut.py +104 -0
  189. maxframe/dataframe/misc/select_dtypes.py +104 -0
  190. maxframe/dataframe/misc/shift.py +256 -0
  191. maxframe/dataframe/misc/stack.py +238 -0
  192. maxframe/dataframe/misc/string_.py +221 -0
  193. maxframe/dataframe/misc/tests/__init__.py +13 -0
  194. maxframe/dataframe/misc/tests/test_misc.py +468 -0
  195. maxframe/dataframe/misc/to_numeric.py +178 -0
  196. maxframe/dataframe/misc/transform.py +361 -0
  197. maxframe/dataframe/misc/transpose.py +136 -0
  198. maxframe/dataframe/misc/value_counts.py +182 -0
  199. maxframe/dataframe/missing/__init__.py +53 -0
  200. maxframe/dataframe/missing/checkna.py +223 -0
  201. maxframe/dataframe/missing/dropna.py +280 -0
  202. maxframe/dataframe/missing/fillna.py +275 -0
  203. maxframe/dataframe/missing/replace.py +439 -0
  204. maxframe/dataframe/missing/tests/__init__.py +13 -0
  205. maxframe/dataframe/missing/tests/test_missing.py +89 -0
  206. maxframe/dataframe/operators.py +273 -0
  207. maxframe/dataframe/plotting/__init__.py +40 -0
  208. maxframe/dataframe/plotting/core.py +78 -0
  209. maxframe/dataframe/plotting/tests/__init__.py +13 -0
  210. maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
  211. maxframe/dataframe/reduction/__init__.py +107 -0
  212. maxframe/dataframe/reduction/aggregation.py +344 -0
  213. maxframe/dataframe/reduction/all.py +78 -0
  214. maxframe/dataframe/reduction/any.py +78 -0
  215. maxframe/dataframe/reduction/core.py +837 -0
  216. maxframe/dataframe/reduction/count.py +59 -0
  217. maxframe/dataframe/reduction/cummax.py +30 -0
  218. maxframe/dataframe/reduction/cummin.py +30 -0
  219. maxframe/dataframe/reduction/cumprod.py +30 -0
  220. maxframe/dataframe/reduction/cumsum.py +30 -0
  221. maxframe/dataframe/reduction/custom_reduction.py +42 -0
  222. maxframe/dataframe/reduction/kurtosis.py +104 -0
  223. maxframe/dataframe/reduction/max.py +65 -0
  224. maxframe/dataframe/reduction/mean.py +61 -0
  225. maxframe/dataframe/reduction/min.py +65 -0
  226. maxframe/dataframe/reduction/nunique.py +141 -0
  227. maxframe/dataframe/reduction/prod.py +76 -0
  228. maxframe/dataframe/reduction/reduction_size.py +36 -0
  229. maxframe/dataframe/reduction/sem.py +69 -0
  230. maxframe/dataframe/reduction/skew.py +89 -0
  231. maxframe/dataframe/reduction/std.py +53 -0
  232. maxframe/dataframe/reduction/str_concat.py +48 -0
  233. maxframe/dataframe/reduction/sum.py +77 -0
  234. maxframe/dataframe/reduction/tests/__init__.py +13 -0
  235. maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
  236. maxframe/dataframe/reduction/unique.py +90 -0
  237. maxframe/dataframe/reduction/var.py +72 -0
  238. maxframe/dataframe/sort/__init__.py +34 -0
  239. maxframe/dataframe/sort/core.py +36 -0
  240. maxframe/dataframe/sort/sort_index.py +153 -0
  241. maxframe/dataframe/sort/sort_values.py +311 -0
  242. maxframe/dataframe/sort/tests/__init__.py +13 -0
  243. maxframe/dataframe/sort/tests/test_sort.py +81 -0
  244. maxframe/dataframe/statistics/__init__.py +33 -0
  245. maxframe/dataframe/statistics/corr.py +280 -0
  246. maxframe/dataframe/statistics/quantile.py +341 -0
  247. maxframe/dataframe/statistics/tests/__init__.py +13 -0
  248. maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
  249. maxframe/dataframe/tests/__init__.py +13 -0
  250. maxframe/dataframe/tests/test_initializer.py +29 -0
  251. maxframe/dataframe/tseries/__init__.py +13 -0
  252. maxframe/dataframe/tseries/tests/__init__.py +13 -0
  253. maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
  254. maxframe/dataframe/tseries/to_datetime.py +297 -0
  255. maxframe/dataframe/ufunc/__init__.py +27 -0
  256. maxframe/dataframe/ufunc/tensor.py +54 -0
  257. maxframe/dataframe/ufunc/ufunc.py +52 -0
  258. maxframe/dataframe/utils.py +1267 -0
  259. maxframe/dataframe/window/__init__.py +29 -0
  260. maxframe/dataframe/window/aggregation.py +96 -0
  261. maxframe/dataframe/window/core.py +69 -0
  262. maxframe/dataframe/window/ewm.py +249 -0
  263. maxframe/dataframe/window/expanding.py +147 -0
  264. maxframe/dataframe/window/rolling.py +376 -0
  265. maxframe/dataframe/window/tests/__init__.py +13 -0
  266. maxframe/dataframe/window/tests/test_ewm.py +70 -0
  267. maxframe/dataframe/window/tests/test_expanding.py +66 -0
  268. maxframe/dataframe/window/tests/test_rolling.py +57 -0
  269. maxframe/env.py +33 -0
  270. maxframe/errors.py +21 -0
  271. maxframe/extension.py +81 -0
  272. maxframe/learn/__init__.py +17 -0
  273. maxframe/learn/contrib/__init__.py +17 -0
  274. maxframe/learn/contrib/pytorch/__init__.py +16 -0
  275. maxframe/learn/contrib/pytorch/run_function.py +110 -0
  276. maxframe/learn/contrib/pytorch/run_script.py +102 -0
  277. maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
  278. maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
  279. maxframe/learn/contrib/utils.py +52 -0
  280. maxframe/learn/contrib/xgboost/__init__.py +26 -0
  281. maxframe/learn/contrib/xgboost/classifier.py +86 -0
  282. maxframe/learn/contrib/xgboost/core.py +156 -0
  283. maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
  284. maxframe/learn/contrib/xgboost/predict.py +138 -0
  285. maxframe/learn/contrib/xgboost/regressor.py +78 -0
  286. maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
  287. maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
  288. maxframe/learn/contrib/xgboost/train.py +121 -0
  289. maxframe/learn/utils/__init__.py +15 -0
  290. maxframe/learn/utils/core.py +29 -0
  291. maxframe/lib/__init__.py +15 -0
  292. maxframe/lib/aio/__init__.py +27 -0
  293. maxframe/lib/aio/_runners.py +162 -0
  294. maxframe/lib/aio/_threads.py +35 -0
  295. maxframe/lib/aio/base.py +82 -0
  296. maxframe/lib/aio/file.py +85 -0
  297. maxframe/lib/aio/isolation.py +100 -0
  298. maxframe/lib/aio/lru.py +242 -0
  299. maxframe/lib/aio/parallelism.py +37 -0
  300. maxframe/lib/aio/tests/__init__.py +13 -0
  301. maxframe/lib/aio/tests/test_aio_file.py +55 -0
  302. maxframe/lib/compression.py +55 -0
  303. maxframe/lib/cython/__init__.py +13 -0
  304. maxframe/lib/cython/libcpp.pxd +30 -0
  305. maxframe/lib/filesystem/__init__.py +21 -0
  306. maxframe/lib/filesystem/_glob.py +173 -0
  307. maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
  308. maxframe/lib/filesystem/_oss_lib/common.py +198 -0
  309. maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
  310. maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
  311. maxframe/lib/filesystem/arrow.py +236 -0
  312. maxframe/lib/filesystem/base.py +263 -0
  313. maxframe/lib/filesystem/core.py +95 -0
  314. maxframe/lib/filesystem/fsmap.py +164 -0
  315. maxframe/lib/filesystem/hdfs.py +31 -0
  316. maxframe/lib/filesystem/local.py +112 -0
  317. maxframe/lib/filesystem/oss.py +157 -0
  318. maxframe/lib/filesystem/tests/__init__.py +13 -0
  319. maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
  320. maxframe/lib/filesystem/tests/test_oss.py +182 -0
  321. maxframe/lib/functools_compat.py +81 -0
  322. maxframe/lib/mmh3.cpython-38-darwin.so +0 -0
  323. maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
  324. maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
  325. maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
  326. maxframe/lib/sparse/__init__.py +861 -0
  327. maxframe/lib/sparse/array.py +1604 -0
  328. maxframe/lib/sparse/core.py +92 -0
  329. maxframe/lib/sparse/matrix.py +241 -0
  330. maxframe/lib/sparse/tests/__init__.py +15 -0
  331. maxframe/lib/sparse/tests/test_sparse.py +476 -0
  332. maxframe/lib/sparse/vector.py +150 -0
  333. maxframe/lib/tblib/LICENSE +20 -0
  334. maxframe/lib/tblib/__init__.py +327 -0
  335. maxframe/lib/tblib/cpython.py +83 -0
  336. maxframe/lib/tblib/decorators.py +44 -0
  337. maxframe/lib/tblib/pickling_support.py +90 -0
  338. maxframe/lib/tests/__init__.py +13 -0
  339. maxframe/lib/tests/test_wrapped_pickle.py +51 -0
  340. maxframe/lib/version.py +620 -0
  341. maxframe/lib/wrapped_pickle.py +139 -0
  342. maxframe/mixin.py +100 -0
  343. maxframe/odpsio/__init__.py +21 -0
  344. maxframe/odpsio/arrow.py +91 -0
  345. maxframe/odpsio/schema.py +364 -0
  346. maxframe/odpsio/tableio.py +322 -0
  347. maxframe/odpsio/tests/__init__.py +13 -0
  348. maxframe/odpsio/tests/test_arrow.py +88 -0
  349. maxframe/odpsio/tests/test_schema.py +297 -0
  350. maxframe/odpsio/tests/test_tableio.py +136 -0
  351. maxframe/odpsio/tests/test_volumeio.py +90 -0
  352. maxframe/odpsio/volumeio.py +95 -0
  353. maxframe/opcodes.py +590 -0
  354. maxframe/protocol.py +415 -0
  355. maxframe/remote/__init__.py +18 -0
  356. maxframe/remote/core.py +210 -0
  357. maxframe/remote/run_script.py +121 -0
  358. maxframe/serialization/__init__.py +26 -0
  359. maxframe/serialization/arrow.py +95 -0
  360. maxframe/serialization/core.cpython-38-darwin.so +0 -0
  361. maxframe/serialization/core.pxd +44 -0
  362. maxframe/serialization/core.pyi +61 -0
  363. maxframe/serialization/core.pyx +1094 -0
  364. maxframe/serialization/exception.py +86 -0
  365. maxframe/serialization/maxframe_objects.py +39 -0
  366. maxframe/serialization/numpy.py +91 -0
  367. maxframe/serialization/pandas.py +202 -0
  368. maxframe/serialization/scipy.py +71 -0
  369. maxframe/serialization/serializables/__init__.py +55 -0
  370. maxframe/serialization/serializables/core.py +262 -0
  371. maxframe/serialization/serializables/field.py +624 -0
  372. maxframe/serialization/serializables/field_type.py +589 -0
  373. maxframe/serialization/serializables/tests/__init__.py +13 -0
  374. maxframe/serialization/serializables/tests/test_field_type.py +121 -0
  375. maxframe/serialization/serializables/tests/test_serializable.py +250 -0
  376. maxframe/serialization/tests/__init__.py +13 -0
  377. maxframe/serialization/tests/test_serial.py +412 -0
  378. maxframe/session.py +1310 -0
  379. maxframe/tensor/__init__.py +183 -0
  380. maxframe/tensor/arithmetic/__init__.py +315 -0
  381. maxframe/tensor/arithmetic/abs.py +68 -0
  382. maxframe/tensor/arithmetic/absolute.py +68 -0
  383. maxframe/tensor/arithmetic/add.py +82 -0
  384. maxframe/tensor/arithmetic/angle.py +72 -0
  385. maxframe/tensor/arithmetic/arccos.py +104 -0
  386. maxframe/tensor/arithmetic/arccosh.py +91 -0
  387. maxframe/tensor/arithmetic/arcsin.py +94 -0
  388. maxframe/tensor/arithmetic/arcsinh.py +86 -0
  389. maxframe/tensor/arithmetic/arctan.py +106 -0
  390. maxframe/tensor/arithmetic/arctan2.py +128 -0
  391. maxframe/tensor/arithmetic/arctanh.py +86 -0
  392. maxframe/tensor/arithmetic/around.py +114 -0
  393. maxframe/tensor/arithmetic/bitand.py +95 -0
  394. maxframe/tensor/arithmetic/bitor.py +102 -0
  395. maxframe/tensor/arithmetic/bitxor.py +95 -0
  396. maxframe/tensor/arithmetic/cbrt.py +66 -0
  397. maxframe/tensor/arithmetic/ceil.py +71 -0
  398. maxframe/tensor/arithmetic/clip.py +165 -0
  399. maxframe/tensor/arithmetic/conj.py +74 -0
  400. maxframe/tensor/arithmetic/copysign.py +78 -0
  401. maxframe/tensor/arithmetic/core.py +544 -0
  402. maxframe/tensor/arithmetic/cos.py +85 -0
  403. maxframe/tensor/arithmetic/cosh.py +72 -0
  404. maxframe/tensor/arithmetic/deg2rad.py +72 -0
  405. maxframe/tensor/arithmetic/degrees.py +77 -0
  406. maxframe/tensor/arithmetic/divide.py +114 -0
  407. maxframe/tensor/arithmetic/equal.py +76 -0
  408. maxframe/tensor/arithmetic/exp.py +106 -0
  409. maxframe/tensor/arithmetic/exp2.py +67 -0
  410. maxframe/tensor/arithmetic/expm1.py +79 -0
  411. maxframe/tensor/arithmetic/fabs.py +74 -0
  412. maxframe/tensor/arithmetic/fix.py +69 -0
  413. maxframe/tensor/arithmetic/float_power.py +103 -0
  414. maxframe/tensor/arithmetic/floor.py +77 -0
  415. maxframe/tensor/arithmetic/floordiv.py +94 -0
  416. maxframe/tensor/arithmetic/fmax.py +105 -0
  417. maxframe/tensor/arithmetic/fmin.py +106 -0
  418. maxframe/tensor/arithmetic/fmod.py +99 -0
  419. maxframe/tensor/arithmetic/frexp.py +92 -0
  420. maxframe/tensor/arithmetic/greater.py +77 -0
  421. maxframe/tensor/arithmetic/greater_equal.py +69 -0
  422. maxframe/tensor/arithmetic/hypot.py +77 -0
  423. maxframe/tensor/arithmetic/i0.py +89 -0
  424. maxframe/tensor/arithmetic/imag.py +67 -0
  425. maxframe/tensor/arithmetic/invert.py +110 -0
  426. maxframe/tensor/arithmetic/isclose.py +115 -0
  427. maxframe/tensor/arithmetic/iscomplex.py +64 -0
  428. maxframe/tensor/arithmetic/isfinite.py +106 -0
  429. maxframe/tensor/arithmetic/isinf.py +103 -0
  430. maxframe/tensor/arithmetic/isnan.py +82 -0
  431. maxframe/tensor/arithmetic/isreal.py +63 -0
  432. maxframe/tensor/arithmetic/ldexp.py +99 -0
  433. maxframe/tensor/arithmetic/less.py +69 -0
  434. maxframe/tensor/arithmetic/less_equal.py +69 -0
  435. maxframe/tensor/arithmetic/log.py +92 -0
  436. maxframe/tensor/arithmetic/log10.py +85 -0
  437. maxframe/tensor/arithmetic/log1p.py +95 -0
  438. maxframe/tensor/arithmetic/log2.py +85 -0
  439. maxframe/tensor/arithmetic/logaddexp.py +80 -0
  440. maxframe/tensor/arithmetic/logaddexp2.py +78 -0
  441. maxframe/tensor/arithmetic/logical_and.py +81 -0
  442. maxframe/tensor/arithmetic/logical_not.py +74 -0
  443. maxframe/tensor/arithmetic/logical_or.py +82 -0
  444. maxframe/tensor/arithmetic/logical_xor.py +88 -0
  445. maxframe/tensor/arithmetic/lshift.py +82 -0
  446. maxframe/tensor/arithmetic/maximum.py +108 -0
  447. maxframe/tensor/arithmetic/minimum.py +108 -0
  448. maxframe/tensor/arithmetic/mod.py +104 -0
  449. maxframe/tensor/arithmetic/modf.py +83 -0
  450. maxframe/tensor/arithmetic/multiply.py +81 -0
  451. maxframe/tensor/arithmetic/nan_to_num.py +99 -0
  452. maxframe/tensor/arithmetic/negative.py +65 -0
  453. maxframe/tensor/arithmetic/nextafter.py +68 -0
  454. maxframe/tensor/arithmetic/not_equal.py +72 -0
  455. maxframe/tensor/arithmetic/positive.py +47 -0
  456. maxframe/tensor/arithmetic/power.py +106 -0
  457. maxframe/tensor/arithmetic/rad2deg.py +71 -0
  458. maxframe/tensor/arithmetic/radians.py +77 -0
  459. maxframe/tensor/arithmetic/real.py +70 -0
  460. maxframe/tensor/arithmetic/reciprocal.py +76 -0
  461. maxframe/tensor/arithmetic/rint.py +68 -0
  462. maxframe/tensor/arithmetic/rshift.py +81 -0
  463. maxframe/tensor/arithmetic/setimag.py +29 -0
  464. maxframe/tensor/arithmetic/setreal.py +29 -0
  465. maxframe/tensor/arithmetic/sign.py +81 -0
  466. maxframe/tensor/arithmetic/signbit.py +65 -0
  467. maxframe/tensor/arithmetic/sin.py +98 -0
  468. maxframe/tensor/arithmetic/sinc.py +102 -0
  469. maxframe/tensor/arithmetic/sinh.py +93 -0
  470. maxframe/tensor/arithmetic/spacing.py +72 -0
  471. maxframe/tensor/arithmetic/sqrt.py +81 -0
  472. maxframe/tensor/arithmetic/square.py +69 -0
  473. maxframe/tensor/arithmetic/subtract.py +81 -0
  474. maxframe/tensor/arithmetic/tan.py +88 -0
  475. maxframe/tensor/arithmetic/tanh.py +92 -0
  476. maxframe/tensor/arithmetic/tests/__init__.py +15 -0
  477. maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
  478. maxframe/tensor/arithmetic/truediv.py +104 -0
  479. maxframe/tensor/arithmetic/trunc.py +72 -0
  480. maxframe/tensor/arithmetic/utils.py +65 -0
  481. maxframe/tensor/array_utils.py +186 -0
  482. maxframe/tensor/base/__init__.py +34 -0
  483. maxframe/tensor/base/astype.py +119 -0
  484. maxframe/tensor/base/atleast_1d.py +74 -0
  485. maxframe/tensor/base/broadcast_to.py +89 -0
  486. maxframe/tensor/base/ravel.py +92 -0
  487. maxframe/tensor/base/tests/__init__.py +13 -0
  488. maxframe/tensor/base/tests/test_base.py +114 -0
  489. maxframe/tensor/base/transpose.py +125 -0
  490. maxframe/tensor/base/unique.py +205 -0
  491. maxframe/tensor/base/where.py +127 -0
  492. maxframe/tensor/core.py +724 -0
  493. maxframe/tensor/datasource/__init__.py +32 -0
  494. maxframe/tensor/datasource/arange.py +156 -0
  495. maxframe/tensor/datasource/array.py +415 -0
  496. maxframe/tensor/datasource/core.py +109 -0
  497. maxframe/tensor/datasource/empty.py +169 -0
  498. maxframe/tensor/datasource/from_dataframe.py +70 -0
  499. maxframe/tensor/datasource/from_dense.py +54 -0
  500. maxframe/tensor/datasource/from_sparse.py +47 -0
  501. maxframe/tensor/datasource/full.py +186 -0
  502. maxframe/tensor/datasource/ones.py +173 -0
  503. maxframe/tensor/datasource/scalar.py +40 -0
  504. maxframe/tensor/datasource/tests/__init__.py +13 -0
  505. maxframe/tensor/datasource/tests/test_datasource.py +278 -0
  506. maxframe/tensor/datasource/zeros.py +188 -0
  507. maxframe/tensor/fetch/__init__.py +15 -0
  508. maxframe/tensor/fetch/core.py +54 -0
  509. maxframe/tensor/indexing/__init__.py +47 -0
  510. maxframe/tensor/indexing/choose.py +196 -0
  511. maxframe/tensor/indexing/compress.py +124 -0
  512. maxframe/tensor/indexing/core.py +190 -0
  513. maxframe/tensor/indexing/extract.py +71 -0
  514. maxframe/tensor/indexing/fill_diagonal.py +183 -0
  515. maxframe/tensor/indexing/flatnonzero.py +60 -0
  516. maxframe/tensor/indexing/getitem.py +175 -0
  517. maxframe/tensor/indexing/nonzero.py +120 -0
  518. maxframe/tensor/indexing/setitem.py +132 -0
  519. maxframe/tensor/indexing/slice.py +29 -0
  520. maxframe/tensor/indexing/take.py +130 -0
  521. maxframe/tensor/indexing/tests/__init__.py +15 -0
  522. maxframe/tensor/indexing/tests/test_indexing.py +234 -0
  523. maxframe/tensor/indexing/unravel_index.py +103 -0
  524. maxframe/tensor/merge/__init__.py +15 -0
  525. maxframe/tensor/merge/stack.py +132 -0
  526. maxframe/tensor/merge/tests/__init__.py +13 -0
  527. maxframe/tensor/merge/tests/test_merge.py +52 -0
  528. maxframe/tensor/operators.py +123 -0
  529. maxframe/tensor/random/__init__.py +168 -0
  530. maxframe/tensor/random/beta.py +87 -0
  531. maxframe/tensor/random/binomial.py +137 -0
  532. maxframe/tensor/random/bytes.py +39 -0
  533. maxframe/tensor/random/chisquare.py +110 -0
  534. maxframe/tensor/random/choice.py +186 -0
  535. maxframe/tensor/random/core.py +234 -0
  536. maxframe/tensor/random/dirichlet.py +123 -0
  537. maxframe/tensor/random/exponential.py +94 -0
  538. maxframe/tensor/random/f.py +135 -0
  539. maxframe/tensor/random/gamma.py +128 -0
  540. maxframe/tensor/random/geometric.py +93 -0
  541. maxframe/tensor/random/gumbel.py +167 -0
  542. maxframe/tensor/random/hypergeometric.py +148 -0
  543. maxframe/tensor/random/laplace.py +133 -0
  544. maxframe/tensor/random/logistic.py +129 -0
  545. maxframe/tensor/random/lognormal.py +159 -0
  546. maxframe/tensor/random/logseries.py +122 -0
  547. maxframe/tensor/random/multinomial.py +133 -0
  548. maxframe/tensor/random/multivariate_normal.py +192 -0
  549. maxframe/tensor/random/negative_binomial.py +125 -0
  550. maxframe/tensor/random/noncentral_chisquare.py +132 -0
  551. maxframe/tensor/random/noncentral_f.py +126 -0
  552. maxframe/tensor/random/normal.py +143 -0
  553. maxframe/tensor/random/pareto.py +140 -0
  554. maxframe/tensor/random/permutation.py +104 -0
  555. maxframe/tensor/random/poisson.py +111 -0
  556. maxframe/tensor/random/power.py +142 -0
  557. maxframe/tensor/random/rand.py +82 -0
  558. maxframe/tensor/random/randint.py +121 -0
  559. maxframe/tensor/random/randn.py +96 -0
  560. maxframe/tensor/random/random_integers.py +123 -0
  561. maxframe/tensor/random/random_sample.py +86 -0
  562. maxframe/tensor/random/rayleigh.py +110 -0
  563. maxframe/tensor/random/shuffle.py +61 -0
  564. maxframe/tensor/random/standard_cauchy.py +105 -0
  565. maxframe/tensor/random/standard_exponential.py +72 -0
  566. maxframe/tensor/random/standard_gamma.py +120 -0
  567. maxframe/tensor/random/standard_normal.py +74 -0
  568. maxframe/tensor/random/standard_t.py +135 -0
  569. maxframe/tensor/random/tests/__init__.py +15 -0
  570. maxframe/tensor/random/tests/test_random.py +167 -0
  571. maxframe/tensor/random/triangular.py +119 -0
  572. maxframe/tensor/random/uniform.py +131 -0
  573. maxframe/tensor/random/vonmises.py +131 -0
  574. maxframe/tensor/random/wald.py +114 -0
  575. maxframe/tensor/random/weibull.py +140 -0
  576. maxframe/tensor/random/zipf.py +122 -0
  577. maxframe/tensor/rechunk/__init__.py +26 -0
  578. maxframe/tensor/rechunk/rechunk.py +43 -0
  579. maxframe/tensor/reduction/__init__.py +66 -0
  580. maxframe/tensor/reduction/all.py +103 -0
  581. maxframe/tensor/reduction/allclose.py +88 -0
  582. maxframe/tensor/reduction/any.py +105 -0
  583. maxframe/tensor/reduction/argmax.py +103 -0
  584. maxframe/tensor/reduction/argmin.py +103 -0
  585. maxframe/tensor/reduction/array_equal.py +64 -0
  586. maxframe/tensor/reduction/core.py +168 -0
  587. maxframe/tensor/reduction/count_nonzero.py +81 -0
  588. maxframe/tensor/reduction/cumprod.py +97 -0
  589. maxframe/tensor/reduction/cumsum.py +101 -0
  590. maxframe/tensor/reduction/max.py +120 -0
  591. maxframe/tensor/reduction/mean.py +123 -0
  592. maxframe/tensor/reduction/min.py +120 -0
  593. maxframe/tensor/reduction/nanargmax.py +82 -0
  594. maxframe/tensor/reduction/nanargmin.py +76 -0
  595. maxframe/tensor/reduction/nancumprod.py +91 -0
  596. maxframe/tensor/reduction/nancumsum.py +94 -0
  597. maxframe/tensor/reduction/nanmax.py +111 -0
  598. maxframe/tensor/reduction/nanmean.py +106 -0
  599. maxframe/tensor/reduction/nanmin.py +111 -0
  600. maxframe/tensor/reduction/nanprod.py +94 -0
  601. maxframe/tensor/reduction/nanstd.py +126 -0
  602. maxframe/tensor/reduction/nansum.py +115 -0
  603. maxframe/tensor/reduction/nanvar.py +149 -0
  604. maxframe/tensor/reduction/prod.py +130 -0
  605. maxframe/tensor/reduction/std.py +134 -0
  606. maxframe/tensor/reduction/sum.py +125 -0
  607. maxframe/tensor/reduction/tests/__init__.py +13 -0
  608. maxframe/tensor/reduction/tests/test_reduction.py +181 -0
  609. maxframe/tensor/reduction/var.py +176 -0
  610. maxframe/tensor/reshape/__init__.py +17 -0
  611. maxframe/tensor/reshape/reshape.py +188 -0
  612. maxframe/tensor/reshape/tests/__init__.py +15 -0
  613. maxframe/tensor/reshape/tests/test_reshape.py +37 -0
  614. maxframe/tensor/statistics/__init__.py +13 -0
  615. maxframe/tensor/statistics/percentile.py +175 -0
  616. maxframe/tensor/statistics/quantile.py +288 -0
  617. maxframe/tensor/ufunc/__init__.py +26 -0
  618. maxframe/tensor/ufunc/ufunc.py +200 -0
  619. maxframe/tensor/utils.py +718 -0
  620. maxframe/tests/__init__.py +13 -0
  621. maxframe/tests/test_codegen.py +69 -0
  622. maxframe/tests/test_protocol.py +144 -0
  623. maxframe/tests/test_utils.py +376 -0
  624. maxframe/tests/utils.py +164 -0
  625. maxframe/typing_.py +37 -0
  626. maxframe/udf.py +134 -0
  627. maxframe/utils.py +1114 -0
  628. maxframe-0.1.0b5.dist-info/METADATA +104 -0
  629. maxframe-0.1.0b5.dist-info/RECORD +647 -0
  630. maxframe-0.1.0b5.dist-info/WHEEL +5 -0
  631. maxframe-0.1.0b5.dist-info/top_level.txt +2 -0
  632. maxframe_client/__init__.py +17 -0
  633. maxframe_client/clients/__init__.py +13 -0
  634. maxframe_client/clients/framedriver.py +118 -0
  635. maxframe_client/clients/spe.py +104 -0
  636. maxframe_client/conftest.py +15 -0
  637. maxframe_client/fetcher.py +264 -0
  638. maxframe_client/session/__init__.py +22 -0
  639. maxframe_client/session/consts.py +36 -0
  640. maxframe_client/session/graph.py +119 -0
  641. maxframe_client/session/odps.py +482 -0
  642. maxframe_client/session/task.py +280 -0
  643. maxframe_client/session/tests/__init__.py +13 -0
  644. maxframe_client/session/tests/test_task.py +85 -0
  645. maxframe_client/tests/__init__.py +13 -0
  646. maxframe_client/tests/test_fetcher.py +89 -0
  647. maxframe_client/tests/test_session.py +255 -0
@@ -0,0 +1,718 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # Copyright 1999-2024 Alibaba Group Holding Ltd.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ import inspect
18
+ import itertools
19
+ import operator
20
+ from collections import OrderedDict
21
+ from collections.abc import Iterable
22
+ from functools import lru_cache, wraps
23
+ from math import ceil
24
+ from numbers import Integral
25
+ from typing import Dict, List, Union
26
+
27
+ import numpy as np
28
+
29
+ try:
30
+ import tiledb
31
+ except (ImportError, OSError): # pragma: no cover
32
+ tildb = None
33
+
34
+ from ..core import ExecutableTuple
35
+ from ..lib.mmh3 import hash_from_buffer
36
+ from ..utils import lazy_import
37
+
38
+ cp = lazy_import("cupy", rename="cp")
39
+
40
+
41
+ def normalize_shape(shape):
42
+ if isinstance(shape, Iterable):
43
+ return tuple(shape)
44
+ else:
45
+ return (shape,)
46
+
47
+
48
+ def normalize_chunk_sizes(shape, chunk_size):
49
+ shape = normalize_shape(shape)
50
+ if not isinstance(chunk_size, tuple):
51
+ if isinstance(chunk_size, Iterable):
52
+ chunk_size = tuple(chunk_size)
53
+ elif isinstance(chunk_size, int):
54
+ chunk_size = (chunk_size,) * len(shape)
55
+
56
+ if len(shape) != len(chunk_size):
57
+ raise ValueError(
58
+ "Chunks must have the same dimemsion, "
59
+ f"got shape: {shape}, chunks: {chunk_size}"
60
+ )
61
+
62
+ chunk_sizes = []
63
+ for size, chunk in zip(shape, chunk_size):
64
+ if isinstance(chunk, Iterable):
65
+ if not isinstance(chunk, tuple):
66
+ chunk = tuple(chunk)
67
+
68
+ # if chunk is (np.nan,), it means we need to concat
69
+ # all chunks together.
70
+ if chunk == (np.nan,):
71
+ chunk = (size,)
72
+
73
+ if sum(chunk) != size:
74
+ raise ValueError(
75
+ "chunks shape should be of the same length, "
76
+ f"got shape: {size}, chunks: {chunk}"
77
+ )
78
+ chunk_sizes.append(chunk)
79
+ else:
80
+ assert isinstance(chunk, int)
81
+
82
+ if size == 0:
83
+ sizes = (0,)
84
+ else:
85
+ sizes = tuple(chunk for _ in range(int(size / chunk))) + (
86
+ tuple() if size % chunk == 0 else (size % chunk,)
87
+ )
88
+ chunk_sizes.append(sizes)
89
+
90
+ return tuple(chunk_sizes)
91
+
92
+
93
+ def broadcast_shape(*shapes):
94
+ if len(shapes) == 1:
95
+ return shapes[0]
96
+
97
+ out_shapes = []
98
+ for ss in itertools.zip_longest(*[reversed(s) for s in shapes], fillvalue=-1):
99
+ shape = max(s for s in ss if s != -1)
100
+ if any(i != -1 and i != 1 and i != shape and not np.isnan(i) for i in ss):
101
+ raise ValueError(
102
+ "Operators could not be broadcast together "
103
+ "with shape {0}".format(" ".join(map(str, shapes)))
104
+ )
105
+ out_shapes.append(shape)
106
+ return tuple(reversed(out_shapes))
107
+
108
+
109
+ def get_chunk_slices(nsplits, idx):
110
+ return tuple(
111
+ slice(sum(nsplit[:idx]), sum(nsplit[: idx + 1]))
112
+ for idx, nsplit in zip(idx, nsplits)
113
+ )
114
+
115
+
116
+ def gen_random_seeds(n, random_state):
117
+ assert isinstance(random_state, np.random.RandomState)
118
+ return tuple(np.frombuffer(random_state.bytes(n * 4), dtype=np.uint32).tolist())
119
+
120
+
121
+ def validate_axis(ndim, axis, argname=None):
122
+ if axis >= ndim or axis < -ndim:
123
+ raise np.AxisError(axis, ndim=ndim, msg_prefix=argname)
124
+
125
+ return axis if axis >= 0 else ndim + axis
126
+
127
+
128
+ def normalize_axis_tuple(axis, ndim, argname=None, allow_duplicate=False):
129
+ """
130
+ Normalizes an axis argument into a tuple of non-negative integer axes.
131
+
132
+ This handles shorthands such as ``1`` and converts them to ``(1,)``,
133
+ as well as performing the handling of negative indices covered by
134
+ `normalize_axis_index`.
135
+
136
+ By default, this forbids axes from being specified multiple times.
137
+
138
+ Used internally by multi-axis-checking logic.
139
+
140
+ Parameters
141
+ ----------
142
+ axis : int, iterable of int
143
+ The un-normalized index or indices of the axis.
144
+ ndim : int
145
+ The number of dimensions of the array that `axis` should be normalized
146
+ against.
147
+ argname : str, optional
148
+ A prefix to put before the error message, typically the name of the
149
+ argument.
150
+ allow_duplicate : bool, optional
151
+ If False, the default, disallow an axis from being specified twice.
152
+
153
+ Returns
154
+ -------
155
+ normalized_axes : tuple of int
156
+ The normalized axis index, such that `0 <= normalized_axis < ndim`
157
+
158
+ Raises
159
+ ------
160
+ AxisError
161
+ If any axis provided is out of range
162
+ ValueError
163
+ If an axis is repeated
164
+
165
+ See also
166
+ --------
167
+ normalize_axis_index : normalizing a single scalar axis
168
+ """
169
+ # Optimization to speed-up the most common cases.
170
+ if type(axis) not in (tuple, list):
171
+ try:
172
+ axis = [operator.index(axis)]
173
+ except TypeError:
174
+ pass
175
+ # Going via an iterator directly is slower than via list comprehension.
176
+ axis = tuple([validate_axis(ndim, ax, argname) for ax in axis])
177
+ if not allow_duplicate and len(set(axis)) != len(axis):
178
+ if argname:
179
+ raise ValueError(f"repeated axis in `{argname}` argument")
180
+ else:
181
+ raise ValueError("repeated axis")
182
+ return axis
183
+
184
+
185
+ def validate_order(dtype, order):
186
+ if getattr(dtype, "fields", None) is None:
187
+ if order is not None:
188
+ raise ValueError("Cannot specify order when the array has no fields")
189
+ else:
190
+ return
191
+
192
+ need_check = True
193
+ if order is None:
194
+ order = list(dtype.names)
195
+ need_check = False
196
+ elif isinstance(order, (list, tuple)):
197
+ order = list(order)
198
+ else:
199
+ order = [order]
200
+ if need_check:
201
+ for o in order:
202
+ if o not in dtype.fields:
203
+ raise ValueError(f"unknown field name: {o}")
204
+ return order
205
+
206
+
207
+ def inject_dtype(dtype):
208
+ def inner(func):
209
+ @wraps(func)
210
+ def call(*tensors, **kw):
211
+ kw["dtype"] = np.dtype(dtype)
212
+ ret = func(*tensors, **kw)
213
+ if ret is NotImplemented:
214
+ reverse_func = getattr(
215
+ inspect.getmodule(func), f"r{func.__name__}", None
216
+ )
217
+ if reverse_func is not None:
218
+ ret = reverse_func(*tensors[::-1], **kw)
219
+ if ret is NotImplemented:
220
+ raise TypeError(
221
+ "unsupported operator type(s) for {0}: '{1}' and '{2}".format(
222
+ func.__name__, *[type(t) for t in tensors]
223
+ )
224
+ )
225
+ return ret
226
+
227
+ return call
228
+
229
+ return inner
230
+
231
+
232
+ def infer_dtype(np_func, multi_outputs=False, empty=True, reverse=False, check=True):
233
+ def make_arg(arg):
234
+ if empty:
235
+ return np.empty((1,) * max(1, arg.ndim), dtype=arg.dtype)
236
+ else:
237
+ if hasattr(arg, "op") and hasattr(arg.op, "data"):
238
+ arg = arg.op.data
239
+ return arg[(0,) * max(1, arg.ndim)]
240
+
241
+ tensor_ufunc = "__tensor_ufunc__"
242
+
243
+ def is_arg(arg):
244
+ if hasattr(arg, tensor_ufunc):
245
+ return False
246
+ return hasattr(arg, "ndim") and hasattr(arg, "dtype")
247
+
248
+ def inner(func):
249
+ @wraps(func)
250
+ def h(*tensors, **kw):
251
+ usr_dtype = np.dtype(kw.pop("dtype")) if "dtype" in kw else None
252
+ args = [make_arg(t) if is_arg(t) else t for t in tensors]
253
+ if reverse:
254
+ args = args[::-1]
255
+ np_kw = dict(
256
+ (k, make_arg(v) if hasattr(v, "op") else v)
257
+ for k, v in kw.items()
258
+ if is_arg(v) and k != "out"
259
+ )
260
+
261
+ dtype = None
262
+ if not any(
263
+ hasattr(arg, tensor_ufunc)
264
+ for arg in itertools.chain(args, np_kw.values())
265
+ ):
266
+ # skip infer if encounter maxframe DataFrame etc
267
+ # that implements __tensor_ufunc__
268
+ try:
269
+ with np.errstate(all="ignore"):
270
+ if multi_outputs:
271
+ dtype = np_func(*args, **np_kw)[0].dtype
272
+ else:
273
+ dtype = np_func(*args, **np_kw).dtype
274
+ except: # noqa: E722
275
+ dtype = None
276
+
277
+ if usr_dtype and dtype:
278
+ can_cast_kwargs = {}
279
+ if kw.get("casting") is not None:
280
+ can_cast_kwargs["casting"] = kw.get("casting")
281
+ if check and not np.can_cast(dtype, usr_dtype, **can_cast_kwargs):
282
+ raise TypeError(
283
+ "No loop matching the specified signature "
284
+ f"and casting was found for ufunc {np_func}"
285
+ )
286
+ kw["dtype"] = usr_dtype
287
+ else:
288
+ kw["dtype"] = dtype
289
+
290
+ ret = func(*tensors, **kw)
291
+ if ret is NotImplemented:
292
+ reverse_func = (
293
+ getattr(inspect.getmodule(func), f"r{func.__name__}", None)
294
+ if not reverse
295
+ else None
296
+ )
297
+ if reverse_func is not None:
298
+ ret = reverse_func(*tensors[::-1], **kw)
299
+ if ret is NotImplemented:
300
+ raise TypeError(
301
+ "unsupported operator type(s) for {0}: '{1}' and '{2}".format(
302
+ func.__name__, *[type(t) for t in tensors]
303
+ )
304
+ )
305
+ return ret
306
+
307
+ return h
308
+
309
+ return inner
310
+
311
+
312
+ def index_ndim(index):
313
+ from .core import Tensor
314
+
315
+ if isinstance(index, Tensor) and index.dtype == np.bool_:
316
+ # boolean indexing will occupy the ndim
317
+ return index.ndim
318
+
319
+ return 1 if index is not None else 0
320
+
321
+
322
+ def replace_ellipsis(index, ndim):
323
+ all_illipsis = list(i for i, idx in enumerate(index) if idx is Ellipsis)
324
+ if len(all_illipsis) > 1:
325
+ raise IndexError("an index can only have a single ellipsis ('...')")
326
+ if not all_illipsis:
327
+ return index
328
+
329
+ illipsis_index = all_illipsis[0]
330
+ n_extra = ndim - sum([index_ndim(i) for i in index]) + 1
331
+ return (
332
+ index[:illipsis_index] + (slice(None),) * n_extra + index[illipsis_index + 1 :]
333
+ )
334
+
335
+
336
+ def calc_sliced_size(size: int, sliceobj: slice) -> int:
337
+ if np.isnan(size):
338
+ return np.nan
339
+
340
+ start, stop, step = sliceobj.indices(size)
341
+ return int(ceil(abs((stop - start) / float(step))))
342
+
343
+
344
+ def calc_object_length(obj, size=None):
345
+ if np.isscalar(obj):
346
+ return 1
347
+ elif isinstance(obj, slice):
348
+ return calc_sliced_size(size, obj)
349
+ else:
350
+ return len(obj)
351
+
352
+
353
+ def slice_split(
354
+ index: Union[int, slice], sizes: List[int]
355
+ ) -> Dict[int, Union[int, slice]]:
356
+ size = sum(sizes)
357
+
358
+ if isinstance(index, Integral):
359
+ index = index if index >= 0 else size + index
360
+ i = 0
361
+ ind = index
362
+ lens = list(sizes)
363
+ while ind >= lens[0]:
364
+ i += 1
365
+ ind -= lens.pop(0)
366
+ return {i: ind}
367
+
368
+ assert isinstance(index, slice)
369
+ start, stop, step = index.indices(size)
370
+
371
+ slice_all = slice(None)
372
+
373
+ if index == slice_all:
374
+ return dict((k, slice_all) for k in range(len(sizes)))
375
+
376
+ d = dict()
377
+ if step > 0:
378
+ for i, length in enumerate(sizes):
379
+ if start < length and stop > 0:
380
+ d[i] = slice(start, min(stop, length), step)
381
+ start = (start - length) % step
382
+ else:
383
+ start = start - length
384
+ stop -= length
385
+ else:
386
+ rstart = start # running start
387
+ chunk_boundaries = np.cumsum(sizes)
388
+ for i, chunk_stop in reversed(list(enumerate(chunk_boundaries))):
389
+ # create a chunk start and stop
390
+ if i == 0:
391
+ chunk_start = 0
392
+ else:
393
+ chunk_start = chunk_boundaries[i - 1]
394
+
395
+ # if our slice is in this chunk
396
+ if (chunk_start <= rstart < chunk_stop) and (rstart > stop):
397
+ d[i] = slice(
398
+ rstart - chunk_stop,
399
+ max(chunk_start - chunk_stop - 1, stop - chunk_stop),
400
+ step,
401
+ )
402
+
403
+ # compute the next running start point,
404
+ offset = (rstart - (chunk_start - 1)) % step
405
+ rstart = chunk_start + offset - 1
406
+
407
+ # replace 0:20:1 with : if appropriate
408
+ for k, v in d.items():
409
+ if v == slice(0, sizes[k], 1):
410
+ d[k] = slice(None, None, None)
411
+
412
+ if not d: # special case x[:0]
413
+ d[0] = slice(0, 0, 1)
414
+
415
+ return d
416
+
417
+
418
+ def is_asc_sorted(arr):
419
+ arr = np.asarray(arr)
420
+ if len(arr) == 0:
421
+ return True
422
+ return np.all(arr[:-1] <= arr[1:])
423
+
424
+
425
+ def split_indexes_into_chunks(nsplits, indexes, ret_is_asc=True):
426
+ indexes = np.asarray(indexes)
427
+ chunk_idxes = np.empty_like(indexes)
428
+ cum_nsplits = [np.cumsum(nsplit) for nsplit in nsplits]
429
+ for i, cum_nsplit, index in zip(itertools.count(0), cum_nsplits, indexes):
430
+ # handle negative value in index
431
+ if hasattr(index, "flags") and not index.flags.writeable:
432
+ index = index.copy()
433
+ index = np.add(index, cum_nsplit[-1], out=index, where=index < 0)
434
+ sorted_idx = np.argsort(index)
435
+
436
+ if np.any(index >= cum_nsplit[-1]):
437
+ idx = index[index >= cum_nsplit[-1]][0]
438
+ raise IndexError(f"index {idx} is out of bounds with size {cum_nsplit[-1]}")
439
+
440
+ chunk_idx = np.searchsorted(cum_nsplit, index[sorted_idx], side="right")
441
+ chunk_idxes[i, sorted_idx] = chunk_idx
442
+
443
+ chunk_idxes_asc = False
444
+ if ret_is_asc:
445
+ chunk_idxes_asc = is_asc_sorted(np.lexsort(chunk_idxes[::-1]))
446
+
447
+ chunk_index_to_indexes = OrderedDict()
448
+ chunk_index_to_poses = OrderedDict()
449
+ poses = np.arange(len(indexes[0]))
450
+ for idx in itertools.product(*(range(len(nsplit)) for nsplit in nsplits)):
451
+ cond = (chunk_idxes == np.array(idx).reshape((len(idx), 1))).all(axis=0)
452
+ filtered = indexes[:, cond]
453
+ for i in range(len(indexes)):
454
+ filtered[i] = filtered[i] - (
455
+ cum_nsplits[i][idx[i] - 1] if idx[i] > 0 else 0
456
+ )
457
+ chunk_index_to_indexes[idx] = filtered
458
+ chunk_index_to_poses[idx] = poses[cond]
459
+
460
+ if ret_is_asc:
461
+ return chunk_index_to_indexes, chunk_index_to_poses, chunk_idxes_asc
462
+ return chunk_index_to_indexes, chunk_index_to_poses
463
+
464
+
465
+ def calc_pos(fancy_index_shape, pos, xp=np):
466
+ if isinstance(pos, dict):
467
+ pos = xp.concatenate(list(pos.values()))
468
+ select_pos = xp.empty(fancy_index_shape, dtype=int)
469
+ select_pos.flat[pos] = xp.arange(select_pos.size)
470
+ return select_pos
471
+
472
+
473
+ def decide_unify_split(*splits):
474
+ # TODO (jisheng): In the future, we need more sophisticated way to decide the rechunk split
475
+ # right now, for (2, 2) and (3, 1), we get the rechunk split as (2, 1, 1)
476
+ if not splits:
477
+ return ()
478
+ raw_splits = splits
479
+ # support broadcasting rules
480
+ # decide_unify_splits((1,), (5,)) --> (5,)
481
+ splits = set(s for s in splits if ((len(s) > 1) or (len(s) == 1 and s[0] != 1)))
482
+ if len(splits) == 1:
483
+ return splits.pop()
484
+ if len(splits) == 0:
485
+ return raw_splits[0]
486
+
487
+ if any(np.isnan(sum(s)) for s in splits):
488
+ raise ValueError(f"Tensor chunk sizes are unknown: {splits}")
489
+ if len(set(sum(s) for s in splits)) > 1:
490
+ raise ValueError(f"Splits not of same size: {splits}")
491
+
492
+ q = [list(s) for s in splits]
493
+ size = sum(q[0])
494
+ cum = 0
495
+
496
+ res = []
497
+ while cum < size:
498
+ m = min(s[0] for s in q)
499
+ res.append(m)
500
+ for s in q:
501
+ s[0] -= m
502
+ if s[0] == 0:
503
+ s.pop(0)
504
+
505
+ cum += m
506
+
507
+ return tuple(res)
508
+
509
+
510
+ def check_out_param(out, t, casting):
511
+ from .base import broadcast_to
512
+
513
+ if not hasattr(out, "shape"):
514
+ raise TypeError("return arrays must be a tensor")
515
+
516
+ try:
517
+ broadcast_to(t, out.shape)
518
+ except ValueError:
519
+ raise ValueError(
520
+ "operators could not be broadcast together "
521
+ "with shapes ({0}) ({1})".format(
522
+ ",".join(str(s) for s in t.shape), ",".join(str(s) for s in out.shape)
523
+ )
524
+ )
525
+
526
+ if not np.can_cast(t.dtype, out.dtype, casting):
527
+ raise TypeError(
528
+ f"output (typecode '{t.dtype.char}') could not be coerced "
529
+ f"to provided output parameter (typecode '{out.dtype.char}') "
530
+ f"according to the casting rule ''{casting}''"
531
+ )
532
+
533
+
534
+ def check_random_state(seed):
535
+ """
536
+ Turn seed into a mt.random.RandomState instance
537
+
538
+ :param seed:
539
+ If seed is None, return the RandomState singleton used by mt.random.
540
+ If seed is an int, return a new RandomState instance seeded with seed.
541
+ If seed is already a RandomState instance, return it.
542
+ Otherwise raise ValueError.
543
+ :return:
544
+ """
545
+ from numpy import random as np_mtrand
546
+
547
+ from . import random as mtrand
548
+
549
+ if seed is None or seed is mtrand or seed is np_mtrand:
550
+ return mtrand._random_state
551
+ if isinstance(seed, (Integral, np.integer)):
552
+ return mtrand.RandomState(seed)
553
+ if isinstance(seed, np.random.RandomState):
554
+ return mtrand.RandomState.from_numpy(seed)
555
+ if isinstance(seed, mtrand.RandomState):
556
+ return seed
557
+ raise ValueError(f"{seed} cannot be used to seed a mt.random.RandomState instance")
558
+
559
+
560
+ def filter_inputs(inputs):
561
+ from ..core import ENTITY_TYPE
562
+
563
+ return [inp for inp in inputs if isinstance(inp, ENTITY_TYPE)]
564
+
565
+
566
+ # As TileDB Ctx's creation is a bit time-consuming,
567
+ # we just cache the Ctx
568
+ # also remember the arguments should be hashable
569
+ @lru_cache(10)
570
+ def _create_tiledb_ctx(conf_tuple):
571
+ if conf_tuple is not None:
572
+ return tiledb.Ctx(dict(conf_tuple))
573
+ return tiledb.Ctx()
574
+
575
+
576
+ def get_tiledb_ctx(conf):
577
+ key = tuple(conf.items()) if conf is not None else None
578
+ return _create_tiledb_ctx(key)
579
+
580
+
581
+ # this function is only used for pandas' compatibility
582
+ def to_numpy(pdf):
583
+ try:
584
+ return pdf.to_numpy()
585
+ except AttributeError: # pragma: no cover
586
+ return pdf.values
587
+
588
+
589
+ def check_order(order_str, available_options="KACF", err_msg="order not understood"):
590
+ order_str = order_str.upper()
591
+ if order_str not in available_options:
592
+ raise TypeError(err_msg)
593
+
594
+
595
+ def get_order(
596
+ order_str, to_keep_order, available_options="KACF", err_msg="order not understood"
597
+ ):
598
+ from .core import TensorOrder
599
+
600
+ check_order(order_str, available_options=available_options, err_msg=err_msg)
601
+
602
+ if order_str in "KA":
603
+ return to_keep_order
604
+ elif order_str == "C":
605
+ return TensorOrder.C_ORDER
606
+ else:
607
+ return TensorOrder.F_ORDER
608
+
609
+
610
+ def reverse_order(old_order):
611
+ from .core import TensorOrder
612
+
613
+ assert isinstance(old_order, TensorOrder)
614
+ return (
615
+ TensorOrder.C_ORDER if old_order == TensorOrder.F_ORDER else TensorOrder.F_ORDER
616
+ )
617
+
618
+
619
+ def hash_on_axis(ar, axis, n_dest):
620
+ ar = np.asarray(ar)
621
+ # cannot be scalar
622
+ assert ar.ndim > 0
623
+ axis = validate_axis(ar.ndim, axis)
624
+
625
+ if n_dest == 1:
626
+ return np.zeros(ar.shape[axis], dtype=np.uint32)
627
+
628
+ if ar.ndim > 2:
629
+ ret = np.empty(ar.shape[axis], dtype=np.uint32)
630
+
631
+ def _hash_to_dest(data):
632
+ i = data[0]
633
+ idx = (slice(None),) * axis + (i,)
634
+ ret[i] = hash_from_buffer(memoryview(ar[idx])) % n_dest
635
+
636
+ np.apply_along_axis(_hash_to_dest, 0, np.arange(ar.shape[axis])[np.newaxis, :])
637
+ return ret
638
+ else:
639
+
640
+ def _hash_to_dest(data):
641
+ return hash_from_buffer(memoryview(data)) % n_dest
642
+
643
+ if ar.ndim == 1:
644
+ ar = ar.reshape(ar.size, 1)
645
+ return np.apply_along_axis(_hash_to_dest, 1 - axis, ar)
646
+
647
+
648
+ def fetch_corner_data(tensor, session=None):
649
+ print_option = np.get_printoptions()
650
+ # only fetch corner data when data > threshold
651
+ threshold = print_option["threshold"]
652
+ # number of edge items to print
653
+ edgeitems = print_option["edgeitems"]
654
+
655
+ # we fetch corner data based on the fact that
656
+ # the tensor must have been executed,
657
+ # thus the size could not be NaN
658
+ if tensor.size > threshold:
659
+ # two edges for each exis
660
+ indices_iter = list(itertools.product(*(range(2) for _ in range(tensor.ndim))))
661
+ corners = np.empty(shape=(2,) * tensor.ndim, dtype=object)
662
+ shape = [0 for _ in range(tensor.ndim)]
663
+ for indices in indices_iter:
664
+ slc = []
665
+ for ax, i in enumerate(indices):
666
+ size = tensor.shape[ax]
667
+ if size > edgeitems * 2 + 2:
668
+ # fetch two more elements
669
+ if i == 0:
670
+ slc.append(slice(edgeitems + 1))
671
+ else:
672
+ slc.append(slice(-edgeitems - 1, None))
673
+ shape[ax] += edgeitems + 1
674
+ else:
675
+ i_sep = size // 2
676
+ if i == 0:
677
+ slc.append(slice(i_sep))
678
+ shape[ax] += i_sep
679
+ else:
680
+ slc.append(slice(i_sep, None))
681
+ shape[ax] += size - i_sep
682
+ corners[indices] = tensor[tuple(slc)]
683
+ # fetch together
684
+ fetched = ExecutableTuple(corners.flat).fetch(session=session)
685
+ for indices, f in zip(indices_iter, fetched):
686
+ corners[indices] = f
687
+ return np.block(corners.tolist())
688
+ else:
689
+ return tensor.fetch(session=session)
690
+
691
+
692
+ def implement_scipy(scipy_fun):
693
+ import re
694
+ import textwrap
695
+
696
+ def wrapper(fun):
697
+ if scipy_fun is None:
698
+ return None
699
+ if not fun.__doc__:
700
+ doc_str = textwrap.dedent(scipy_fun.__doc__)
701
+ lines = []
702
+ for line in doc_str.splitlines(keepends=False):
703
+ # skip function headers
704
+ if line.startswith(scipy_fun.__name__ + "("):
705
+ continue
706
+ # skip version marks
707
+ if line.strip().startswith(".. versionadded::"):
708
+ continue
709
+ # skip examples
710
+ if line.strip() == "Examples":
711
+ break
712
+ lines.append(line)
713
+ doc_str = "\n".join(lines).strip()
714
+ # remove trailing empty sections
715
+ fun.__doc__ = re.sub(r"[A-Za-z]+\n-+$", "", doc_str).strip()
716
+ return fun
717
+
718
+ return wrapper