maxframe 0.1.0b5__cp310-cp310-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.
- maxframe/__init__.py +32 -0
- maxframe/_utils.cpython-310-darwin.so +0 -0
- maxframe/_utils.pxd +33 -0
- maxframe/_utils.pyx +547 -0
- maxframe/codegen.py +528 -0
- maxframe/config/__init__.py +15 -0
- maxframe/config/config.py +443 -0
- maxframe/config/tests/__init__.py +13 -0
- maxframe/config/tests/test_config.py +103 -0
- maxframe/config/tests/test_validators.py +34 -0
- maxframe/config/validators.py +57 -0
- maxframe/conftest.py +139 -0
- maxframe/core/__init__.py +65 -0
- maxframe/core/base.py +156 -0
- maxframe/core/entity/__init__.py +44 -0
- maxframe/core/entity/chunks.py +68 -0
- maxframe/core/entity/core.py +152 -0
- maxframe/core/entity/executable.py +337 -0
- maxframe/core/entity/fuse.py +73 -0
- maxframe/core/entity/objects.py +100 -0
- maxframe/core/entity/output_types.py +90 -0
- maxframe/core/entity/tileables.py +438 -0
- maxframe/core/entity/utils.py +24 -0
- maxframe/core/graph/__init__.py +17 -0
- maxframe/core/graph/builder/__init__.py +16 -0
- maxframe/core/graph/builder/base.py +86 -0
- maxframe/core/graph/builder/chunk.py +430 -0
- maxframe/core/graph/builder/tileable.py +34 -0
- maxframe/core/graph/builder/utils.py +41 -0
- maxframe/core/graph/core.cpython-310-darwin.so +0 -0
- maxframe/core/graph/core.pyx +467 -0
- maxframe/core/graph/entity.py +171 -0
- maxframe/core/graph/tests/__init__.py +13 -0
- maxframe/core/graph/tests/test_graph.py +205 -0
- maxframe/core/mode.py +96 -0
- maxframe/core/operator/__init__.py +34 -0
- maxframe/core/operator/base.py +450 -0
- maxframe/core/operator/core.py +276 -0
- maxframe/core/operator/fetch.py +53 -0
- maxframe/core/operator/fuse.py +29 -0
- maxframe/core/operator/objects.py +72 -0
- maxframe/core/operator/shuffle.py +111 -0
- maxframe/core/operator/tests/__init__.py +13 -0
- maxframe/core/operator/tests/test_core.py +64 -0
- maxframe/core/tests/__init__.py +13 -0
- maxframe/core/tests/test_mode.py +75 -0
- maxframe/dataframe/__init__.py +81 -0
- maxframe/dataframe/arithmetic/__init__.py +359 -0
- maxframe/dataframe/arithmetic/abs.py +33 -0
- maxframe/dataframe/arithmetic/add.py +60 -0
- maxframe/dataframe/arithmetic/arccos.py +28 -0
- maxframe/dataframe/arithmetic/arccosh.py +28 -0
- maxframe/dataframe/arithmetic/arcsin.py +28 -0
- maxframe/dataframe/arithmetic/arcsinh.py +28 -0
- maxframe/dataframe/arithmetic/arctan.py +28 -0
- maxframe/dataframe/arithmetic/arctanh.py +28 -0
- maxframe/dataframe/arithmetic/around.py +152 -0
- maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
- maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
- maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
- maxframe/dataframe/arithmetic/ceil.py +28 -0
- maxframe/dataframe/arithmetic/core.py +342 -0
- maxframe/dataframe/arithmetic/cos.py +28 -0
- maxframe/dataframe/arithmetic/cosh.py +28 -0
- maxframe/dataframe/arithmetic/degrees.py +28 -0
- maxframe/dataframe/arithmetic/docstring.py +442 -0
- maxframe/dataframe/arithmetic/equal.py +56 -0
- maxframe/dataframe/arithmetic/exp.py +28 -0
- maxframe/dataframe/arithmetic/exp2.py +28 -0
- maxframe/dataframe/arithmetic/expm1.py +28 -0
- maxframe/dataframe/arithmetic/floor.py +28 -0
- maxframe/dataframe/arithmetic/floordiv.py +64 -0
- maxframe/dataframe/arithmetic/greater.py +57 -0
- maxframe/dataframe/arithmetic/greater_equal.py +57 -0
- maxframe/dataframe/arithmetic/invert.py +33 -0
- maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
- maxframe/dataframe/arithmetic/less.py +57 -0
- maxframe/dataframe/arithmetic/less_equal.py +57 -0
- maxframe/dataframe/arithmetic/log.py +28 -0
- maxframe/dataframe/arithmetic/log10.py +28 -0
- maxframe/dataframe/arithmetic/log2.py +28 -0
- maxframe/dataframe/arithmetic/mod.py +60 -0
- maxframe/dataframe/arithmetic/multiply.py +60 -0
- maxframe/dataframe/arithmetic/negative.py +33 -0
- maxframe/dataframe/arithmetic/not_equal.py +56 -0
- maxframe/dataframe/arithmetic/power.py +68 -0
- maxframe/dataframe/arithmetic/radians.py +28 -0
- maxframe/dataframe/arithmetic/sin.py +28 -0
- maxframe/dataframe/arithmetic/sinh.py +28 -0
- maxframe/dataframe/arithmetic/sqrt.py +28 -0
- maxframe/dataframe/arithmetic/subtract.py +64 -0
- maxframe/dataframe/arithmetic/tan.py +28 -0
- maxframe/dataframe/arithmetic/tanh.py +28 -0
- maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
- maxframe/dataframe/arithmetic/truediv.py +64 -0
- maxframe/dataframe/arithmetic/trunc.py +28 -0
- maxframe/dataframe/arrays.py +864 -0
- maxframe/dataframe/core.py +2417 -0
- maxframe/dataframe/datasource/__init__.py +15 -0
- maxframe/dataframe/datasource/core.py +81 -0
- maxframe/dataframe/datasource/dataframe.py +59 -0
- maxframe/dataframe/datasource/date_range.py +504 -0
- maxframe/dataframe/datasource/from_index.py +54 -0
- maxframe/dataframe/datasource/from_records.py +107 -0
- maxframe/dataframe/datasource/from_tensor.py +419 -0
- maxframe/dataframe/datasource/index.py +117 -0
- maxframe/dataframe/datasource/read_csv.py +528 -0
- maxframe/dataframe/datasource/read_odps_query.py +299 -0
- maxframe/dataframe/datasource/read_odps_table.py +253 -0
- maxframe/dataframe/datasource/read_parquet.py +421 -0
- maxframe/dataframe/datasource/series.py +55 -0
- maxframe/dataframe/datasource/tests/__init__.py +13 -0
- maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
- maxframe/dataframe/datastore/__init__.py +26 -0
- maxframe/dataframe/datastore/core.py +19 -0
- maxframe/dataframe/datastore/to_csv.py +227 -0
- maxframe/dataframe/datastore/to_odps.py +162 -0
- maxframe/dataframe/extensions/__init__.py +41 -0
- maxframe/dataframe/extensions/accessor.py +50 -0
- maxframe/dataframe/extensions/reshuffle.py +83 -0
- maxframe/dataframe/extensions/tests/__init__.py +13 -0
- maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
- maxframe/dataframe/fetch/__init__.py +15 -0
- maxframe/dataframe/fetch/core.py +86 -0
- maxframe/dataframe/groupby/__init__.py +82 -0
- maxframe/dataframe/groupby/aggregation.py +350 -0
- maxframe/dataframe/groupby/apply.py +251 -0
- maxframe/dataframe/groupby/core.py +179 -0
- maxframe/dataframe/groupby/cum.py +124 -0
- maxframe/dataframe/groupby/fill.py +141 -0
- maxframe/dataframe/groupby/getitem.py +92 -0
- maxframe/dataframe/groupby/head.py +105 -0
- maxframe/dataframe/groupby/sample.py +214 -0
- maxframe/dataframe/groupby/tests/__init__.py +13 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
- maxframe/dataframe/groupby/transform.py +255 -0
- maxframe/dataframe/indexing/__init__.py +84 -0
- maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
- maxframe/dataframe/indexing/align.py +349 -0
- maxframe/dataframe/indexing/at.py +83 -0
- maxframe/dataframe/indexing/getitem.py +204 -0
- maxframe/dataframe/indexing/iat.py +37 -0
- maxframe/dataframe/indexing/iloc.py +566 -0
- maxframe/dataframe/indexing/insert.py +86 -0
- maxframe/dataframe/indexing/loc.py +411 -0
- maxframe/dataframe/indexing/reindex.py +526 -0
- maxframe/dataframe/indexing/rename.py +462 -0
- maxframe/dataframe/indexing/rename_axis.py +209 -0
- maxframe/dataframe/indexing/reset_index.py +402 -0
- maxframe/dataframe/indexing/sample.py +221 -0
- maxframe/dataframe/indexing/set_axis.py +194 -0
- maxframe/dataframe/indexing/set_index.py +61 -0
- maxframe/dataframe/indexing/setitem.py +130 -0
- maxframe/dataframe/indexing/tests/__init__.py +13 -0
- maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
- maxframe/dataframe/indexing/where.py +308 -0
- maxframe/dataframe/initializer.py +288 -0
- maxframe/dataframe/merge/__init__.py +32 -0
- maxframe/dataframe/merge/append.py +121 -0
- maxframe/dataframe/merge/concat.py +325 -0
- maxframe/dataframe/merge/merge.py +593 -0
- maxframe/dataframe/merge/tests/__init__.py +13 -0
- maxframe/dataframe/merge/tests/test_merge.py +215 -0
- maxframe/dataframe/misc/__init__.py +134 -0
- maxframe/dataframe/misc/_duplicate.py +46 -0
- maxframe/dataframe/misc/accessor.py +276 -0
- maxframe/dataframe/misc/apply.py +692 -0
- maxframe/dataframe/misc/astype.py +236 -0
- maxframe/dataframe/misc/case_when.py +141 -0
- maxframe/dataframe/misc/check_monotonic.py +84 -0
- maxframe/dataframe/misc/cut.py +383 -0
- maxframe/dataframe/misc/datetimes.py +79 -0
- maxframe/dataframe/misc/describe.py +108 -0
- maxframe/dataframe/misc/diff.py +210 -0
- maxframe/dataframe/misc/drop.py +440 -0
- maxframe/dataframe/misc/drop_duplicates.py +248 -0
- maxframe/dataframe/misc/duplicated.py +292 -0
- maxframe/dataframe/misc/eval.py +728 -0
- maxframe/dataframe/misc/explode.py +171 -0
- maxframe/dataframe/misc/get_dummies.py +208 -0
- maxframe/dataframe/misc/isin.py +217 -0
- maxframe/dataframe/misc/map.py +236 -0
- maxframe/dataframe/misc/melt.py +162 -0
- maxframe/dataframe/misc/memory_usage.py +248 -0
- maxframe/dataframe/misc/pct_change.py +150 -0
- maxframe/dataframe/misc/pivot_table.py +262 -0
- maxframe/dataframe/misc/qcut.py +104 -0
- maxframe/dataframe/misc/select_dtypes.py +104 -0
- maxframe/dataframe/misc/shift.py +256 -0
- maxframe/dataframe/misc/stack.py +238 -0
- maxframe/dataframe/misc/string_.py +221 -0
- maxframe/dataframe/misc/tests/__init__.py +13 -0
- maxframe/dataframe/misc/tests/test_misc.py +468 -0
- maxframe/dataframe/misc/to_numeric.py +178 -0
- maxframe/dataframe/misc/transform.py +361 -0
- maxframe/dataframe/misc/transpose.py +136 -0
- maxframe/dataframe/misc/value_counts.py +182 -0
- maxframe/dataframe/missing/__init__.py +53 -0
- maxframe/dataframe/missing/checkna.py +223 -0
- maxframe/dataframe/missing/dropna.py +280 -0
- maxframe/dataframe/missing/fillna.py +275 -0
- maxframe/dataframe/missing/replace.py +439 -0
- maxframe/dataframe/missing/tests/__init__.py +13 -0
- maxframe/dataframe/missing/tests/test_missing.py +89 -0
- maxframe/dataframe/operators.py +273 -0
- maxframe/dataframe/plotting/__init__.py +40 -0
- maxframe/dataframe/plotting/core.py +78 -0
- maxframe/dataframe/plotting/tests/__init__.py +13 -0
- maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
- maxframe/dataframe/reduction/__init__.py +107 -0
- maxframe/dataframe/reduction/aggregation.py +344 -0
- maxframe/dataframe/reduction/all.py +78 -0
- maxframe/dataframe/reduction/any.py +78 -0
- maxframe/dataframe/reduction/core.py +837 -0
- maxframe/dataframe/reduction/count.py +59 -0
- maxframe/dataframe/reduction/cummax.py +30 -0
- maxframe/dataframe/reduction/cummin.py +30 -0
- maxframe/dataframe/reduction/cumprod.py +30 -0
- maxframe/dataframe/reduction/cumsum.py +30 -0
- maxframe/dataframe/reduction/custom_reduction.py +42 -0
- maxframe/dataframe/reduction/kurtosis.py +104 -0
- maxframe/dataframe/reduction/max.py +65 -0
- maxframe/dataframe/reduction/mean.py +61 -0
- maxframe/dataframe/reduction/min.py +65 -0
- maxframe/dataframe/reduction/nunique.py +141 -0
- maxframe/dataframe/reduction/prod.py +76 -0
- maxframe/dataframe/reduction/reduction_size.py +36 -0
- maxframe/dataframe/reduction/sem.py +69 -0
- maxframe/dataframe/reduction/skew.py +89 -0
- maxframe/dataframe/reduction/std.py +53 -0
- maxframe/dataframe/reduction/str_concat.py +48 -0
- maxframe/dataframe/reduction/sum.py +77 -0
- maxframe/dataframe/reduction/tests/__init__.py +13 -0
- maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
- maxframe/dataframe/reduction/unique.py +90 -0
- maxframe/dataframe/reduction/var.py +72 -0
- maxframe/dataframe/sort/__init__.py +34 -0
- maxframe/dataframe/sort/core.py +36 -0
- maxframe/dataframe/sort/sort_index.py +153 -0
- maxframe/dataframe/sort/sort_values.py +311 -0
- maxframe/dataframe/sort/tests/__init__.py +13 -0
- maxframe/dataframe/sort/tests/test_sort.py +81 -0
- maxframe/dataframe/statistics/__init__.py +33 -0
- maxframe/dataframe/statistics/corr.py +280 -0
- maxframe/dataframe/statistics/quantile.py +341 -0
- maxframe/dataframe/statistics/tests/__init__.py +13 -0
- maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
- maxframe/dataframe/tests/__init__.py +13 -0
- maxframe/dataframe/tests/test_initializer.py +29 -0
- maxframe/dataframe/tseries/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
- maxframe/dataframe/tseries/to_datetime.py +297 -0
- maxframe/dataframe/ufunc/__init__.py +27 -0
- maxframe/dataframe/ufunc/tensor.py +54 -0
- maxframe/dataframe/ufunc/ufunc.py +52 -0
- maxframe/dataframe/utils.py +1267 -0
- maxframe/dataframe/window/__init__.py +29 -0
- maxframe/dataframe/window/aggregation.py +96 -0
- maxframe/dataframe/window/core.py +69 -0
- maxframe/dataframe/window/ewm.py +249 -0
- maxframe/dataframe/window/expanding.py +147 -0
- maxframe/dataframe/window/rolling.py +376 -0
- maxframe/dataframe/window/tests/__init__.py +13 -0
- maxframe/dataframe/window/tests/test_ewm.py +70 -0
- maxframe/dataframe/window/tests/test_expanding.py +66 -0
- maxframe/dataframe/window/tests/test_rolling.py +57 -0
- maxframe/env.py +33 -0
- maxframe/errors.py +21 -0
- maxframe/extension.py +81 -0
- maxframe/learn/__init__.py +17 -0
- maxframe/learn/contrib/__init__.py +17 -0
- maxframe/learn/contrib/pytorch/__init__.py +16 -0
- maxframe/learn/contrib/pytorch/run_function.py +110 -0
- maxframe/learn/contrib/pytorch/run_script.py +102 -0
- maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
- maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
- maxframe/learn/contrib/utils.py +52 -0
- maxframe/learn/contrib/xgboost/__init__.py +26 -0
- maxframe/learn/contrib/xgboost/classifier.py +86 -0
- maxframe/learn/contrib/xgboost/core.py +156 -0
- maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
- maxframe/learn/contrib/xgboost/predict.py +138 -0
- maxframe/learn/contrib/xgboost/regressor.py +78 -0
- maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
- maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
- maxframe/learn/contrib/xgboost/train.py +121 -0
- maxframe/learn/utils/__init__.py +15 -0
- maxframe/learn/utils/core.py +29 -0
- maxframe/lib/__init__.py +15 -0
- maxframe/lib/aio/__init__.py +27 -0
- maxframe/lib/aio/_runners.py +162 -0
- maxframe/lib/aio/_threads.py +35 -0
- maxframe/lib/aio/base.py +82 -0
- maxframe/lib/aio/file.py +85 -0
- maxframe/lib/aio/isolation.py +100 -0
- maxframe/lib/aio/lru.py +242 -0
- maxframe/lib/aio/parallelism.py +37 -0
- maxframe/lib/aio/tests/__init__.py +13 -0
- maxframe/lib/aio/tests/test_aio_file.py +55 -0
- maxframe/lib/compression.py +55 -0
- maxframe/lib/cython/__init__.py +13 -0
- maxframe/lib/cython/libcpp.pxd +30 -0
- maxframe/lib/filesystem/__init__.py +21 -0
- maxframe/lib/filesystem/_glob.py +173 -0
- maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
- maxframe/lib/filesystem/_oss_lib/common.py +198 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
- maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
- maxframe/lib/filesystem/arrow.py +236 -0
- maxframe/lib/filesystem/base.py +263 -0
- maxframe/lib/filesystem/core.py +95 -0
- maxframe/lib/filesystem/fsmap.py +164 -0
- maxframe/lib/filesystem/hdfs.py +31 -0
- maxframe/lib/filesystem/local.py +112 -0
- maxframe/lib/filesystem/oss.py +157 -0
- maxframe/lib/filesystem/tests/__init__.py +13 -0
- maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
- maxframe/lib/filesystem/tests/test_oss.py +182 -0
- maxframe/lib/functools_compat.py +81 -0
- maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
- maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
- maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
- maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
- maxframe/lib/sparse/__init__.py +861 -0
- maxframe/lib/sparse/array.py +1604 -0
- maxframe/lib/sparse/core.py +92 -0
- maxframe/lib/sparse/matrix.py +241 -0
- maxframe/lib/sparse/tests/__init__.py +15 -0
- maxframe/lib/sparse/tests/test_sparse.py +476 -0
- maxframe/lib/sparse/vector.py +150 -0
- maxframe/lib/tblib/LICENSE +20 -0
- maxframe/lib/tblib/__init__.py +327 -0
- maxframe/lib/tblib/cpython.py +83 -0
- maxframe/lib/tblib/decorators.py +44 -0
- maxframe/lib/tblib/pickling_support.py +90 -0
- maxframe/lib/tests/__init__.py +13 -0
- maxframe/lib/tests/test_wrapped_pickle.py +51 -0
- maxframe/lib/version.py +620 -0
- maxframe/lib/wrapped_pickle.py +139 -0
- maxframe/mixin.py +100 -0
- maxframe/odpsio/__init__.py +21 -0
- maxframe/odpsio/arrow.py +91 -0
- maxframe/odpsio/schema.py +364 -0
- maxframe/odpsio/tableio.py +322 -0
- maxframe/odpsio/tests/__init__.py +13 -0
- maxframe/odpsio/tests/test_arrow.py +88 -0
- maxframe/odpsio/tests/test_schema.py +297 -0
- maxframe/odpsio/tests/test_tableio.py +136 -0
- maxframe/odpsio/tests/test_volumeio.py +90 -0
- maxframe/odpsio/volumeio.py +95 -0
- maxframe/opcodes.py +590 -0
- maxframe/protocol.py +415 -0
- maxframe/remote/__init__.py +18 -0
- maxframe/remote/core.py +210 -0
- maxframe/remote/run_script.py +121 -0
- maxframe/serialization/__init__.py +26 -0
- maxframe/serialization/arrow.py +95 -0
- maxframe/serialization/core.cpython-310-darwin.so +0 -0
- maxframe/serialization/core.pxd +44 -0
- maxframe/serialization/core.pyi +61 -0
- maxframe/serialization/core.pyx +1094 -0
- maxframe/serialization/exception.py +86 -0
- maxframe/serialization/maxframe_objects.py +39 -0
- maxframe/serialization/numpy.py +91 -0
- maxframe/serialization/pandas.py +202 -0
- maxframe/serialization/scipy.py +71 -0
- maxframe/serialization/serializables/__init__.py +55 -0
- maxframe/serialization/serializables/core.py +262 -0
- maxframe/serialization/serializables/field.py +624 -0
- maxframe/serialization/serializables/field_type.py +589 -0
- maxframe/serialization/serializables/tests/__init__.py +13 -0
- maxframe/serialization/serializables/tests/test_field_type.py +121 -0
- maxframe/serialization/serializables/tests/test_serializable.py +250 -0
- maxframe/serialization/tests/__init__.py +13 -0
- maxframe/serialization/tests/test_serial.py +412 -0
- maxframe/session.py +1310 -0
- maxframe/tensor/__init__.py +183 -0
- maxframe/tensor/arithmetic/__init__.py +315 -0
- maxframe/tensor/arithmetic/abs.py +68 -0
- maxframe/tensor/arithmetic/absolute.py +68 -0
- maxframe/tensor/arithmetic/add.py +82 -0
- maxframe/tensor/arithmetic/angle.py +72 -0
- maxframe/tensor/arithmetic/arccos.py +104 -0
- maxframe/tensor/arithmetic/arccosh.py +91 -0
- maxframe/tensor/arithmetic/arcsin.py +94 -0
- maxframe/tensor/arithmetic/arcsinh.py +86 -0
- maxframe/tensor/arithmetic/arctan.py +106 -0
- maxframe/tensor/arithmetic/arctan2.py +128 -0
- maxframe/tensor/arithmetic/arctanh.py +86 -0
- maxframe/tensor/arithmetic/around.py +114 -0
- maxframe/tensor/arithmetic/bitand.py +95 -0
- maxframe/tensor/arithmetic/bitor.py +102 -0
- maxframe/tensor/arithmetic/bitxor.py +95 -0
- maxframe/tensor/arithmetic/cbrt.py +66 -0
- maxframe/tensor/arithmetic/ceil.py +71 -0
- maxframe/tensor/arithmetic/clip.py +165 -0
- maxframe/tensor/arithmetic/conj.py +74 -0
- maxframe/tensor/arithmetic/copysign.py +78 -0
- maxframe/tensor/arithmetic/core.py +544 -0
- maxframe/tensor/arithmetic/cos.py +85 -0
- maxframe/tensor/arithmetic/cosh.py +72 -0
- maxframe/tensor/arithmetic/deg2rad.py +72 -0
- maxframe/tensor/arithmetic/degrees.py +77 -0
- maxframe/tensor/arithmetic/divide.py +114 -0
- maxframe/tensor/arithmetic/equal.py +76 -0
- maxframe/tensor/arithmetic/exp.py +106 -0
- maxframe/tensor/arithmetic/exp2.py +67 -0
- maxframe/tensor/arithmetic/expm1.py +79 -0
- maxframe/tensor/arithmetic/fabs.py +74 -0
- maxframe/tensor/arithmetic/fix.py +69 -0
- maxframe/tensor/arithmetic/float_power.py +103 -0
- maxframe/tensor/arithmetic/floor.py +77 -0
- maxframe/tensor/arithmetic/floordiv.py +94 -0
- maxframe/tensor/arithmetic/fmax.py +105 -0
- maxframe/tensor/arithmetic/fmin.py +106 -0
- maxframe/tensor/arithmetic/fmod.py +99 -0
- maxframe/tensor/arithmetic/frexp.py +92 -0
- maxframe/tensor/arithmetic/greater.py +77 -0
- maxframe/tensor/arithmetic/greater_equal.py +69 -0
- maxframe/tensor/arithmetic/hypot.py +77 -0
- maxframe/tensor/arithmetic/i0.py +89 -0
- maxframe/tensor/arithmetic/imag.py +67 -0
- maxframe/tensor/arithmetic/invert.py +110 -0
- maxframe/tensor/arithmetic/isclose.py +115 -0
- maxframe/tensor/arithmetic/iscomplex.py +64 -0
- maxframe/tensor/arithmetic/isfinite.py +106 -0
- maxframe/tensor/arithmetic/isinf.py +103 -0
- maxframe/tensor/arithmetic/isnan.py +82 -0
- maxframe/tensor/arithmetic/isreal.py +63 -0
- maxframe/tensor/arithmetic/ldexp.py +99 -0
- maxframe/tensor/arithmetic/less.py +69 -0
- maxframe/tensor/arithmetic/less_equal.py +69 -0
- maxframe/tensor/arithmetic/log.py +92 -0
- maxframe/tensor/arithmetic/log10.py +85 -0
- maxframe/tensor/arithmetic/log1p.py +95 -0
- maxframe/tensor/arithmetic/log2.py +85 -0
- maxframe/tensor/arithmetic/logaddexp.py +80 -0
- maxframe/tensor/arithmetic/logaddexp2.py +78 -0
- maxframe/tensor/arithmetic/logical_and.py +81 -0
- maxframe/tensor/arithmetic/logical_not.py +74 -0
- maxframe/tensor/arithmetic/logical_or.py +82 -0
- maxframe/tensor/arithmetic/logical_xor.py +88 -0
- maxframe/tensor/arithmetic/lshift.py +82 -0
- maxframe/tensor/arithmetic/maximum.py +108 -0
- maxframe/tensor/arithmetic/minimum.py +108 -0
- maxframe/tensor/arithmetic/mod.py +104 -0
- maxframe/tensor/arithmetic/modf.py +83 -0
- maxframe/tensor/arithmetic/multiply.py +81 -0
- maxframe/tensor/arithmetic/nan_to_num.py +99 -0
- maxframe/tensor/arithmetic/negative.py +65 -0
- maxframe/tensor/arithmetic/nextafter.py +68 -0
- maxframe/tensor/arithmetic/not_equal.py +72 -0
- maxframe/tensor/arithmetic/positive.py +47 -0
- maxframe/tensor/arithmetic/power.py +106 -0
- maxframe/tensor/arithmetic/rad2deg.py +71 -0
- maxframe/tensor/arithmetic/radians.py +77 -0
- maxframe/tensor/arithmetic/real.py +70 -0
- maxframe/tensor/arithmetic/reciprocal.py +76 -0
- maxframe/tensor/arithmetic/rint.py +68 -0
- maxframe/tensor/arithmetic/rshift.py +81 -0
- maxframe/tensor/arithmetic/setimag.py +29 -0
- maxframe/tensor/arithmetic/setreal.py +29 -0
- maxframe/tensor/arithmetic/sign.py +81 -0
- maxframe/tensor/arithmetic/signbit.py +65 -0
- maxframe/tensor/arithmetic/sin.py +98 -0
- maxframe/tensor/arithmetic/sinc.py +102 -0
- maxframe/tensor/arithmetic/sinh.py +93 -0
- maxframe/tensor/arithmetic/spacing.py +72 -0
- maxframe/tensor/arithmetic/sqrt.py +81 -0
- maxframe/tensor/arithmetic/square.py +69 -0
- maxframe/tensor/arithmetic/subtract.py +81 -0
- maxframe/tensor/arithmetic/tan.py +88 -0
- maxframe/tensor/arithmetic/tanh.py +92 -0
- maxframe/tensor/arithmetic/tests/__init__.py +15 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
- maxframe/tensor/arithmetic/truediv.py +104 -0
- maxframe/tensor/arithmetic/trunc.py +72 -0
- maxframe/tensor/arithmetic/utils.py +65 -0
- maxframe/tensor/array_utils.py +186 -0
- maxframe/tensor/base/__init__.py +34 -0
- maxframe/tensor/base/astype.py +119 -0
- maxframe/tensor/base/atleast_1d.py +74 -0
- maxframe/tensor/base/broadcast_to.py +89 -0
- maxframe/tensor/base/ravel.py +92 -0
- maxframe/tensor/base/tests/__init__.py +13 -0
- maxframe/tensor/base/tests/test_base.py +114 -0
- maxframe/tensor/base/transpose.py +125 -0
- maxframe/tensor/base/unique.py +205 -0
- maxframe/tensor/base/where.py +127 -0
- maxframe/tensor/core.py +724 -0
- maxframe/tensor/datasource/__init__.py +32 -0
- maxframe/tensor/datasource/arange.py +156 -0
- maxframe/tensor/datasource/array.py +415 -0
- maxframe/tensor/datasource/core.py +109 -0
- maxframe/tensor/datasource/empty.py +169 -0
- maxframe/tensor/datasource/from_dataframe.py +70 -0
- maxframe/tensor/datasource/from_dense.py +54 -0
- maxframe/tensor/datasource/from_sparse.py +47 -0
- maxframe/tensor/datasource/full.py +186 -0
- maxframe/tensor/datasource/ones.py +173 -0
- maxframe/tensor/datasource/scalar.py +40 -0
- maxframe/tensor/datasource/tests/__init__.py +13 -0
- maxframe/tensor/datasource/tests/test_datasource.py +278 -0
- maxframe/tensor/datasource/zeros.py +188 -0
- maxframe/tensor/fetch/__init__.py +15 -0
- maxframe/tensor/fetch/core.py +54 -0
- maxframe/tensor/indexing/__init__.py +47 -0
- maxframe/tensor/indexing/choose.py +196 -0
- maxframe/tensor/indexing/compress.py +124 -0
- maxframe/tensor/indexing/core.py +190 -0
- maxframe/tensor/indexing/extract.py +71 -0
- maxframe/tensor/indexing/fill_diagonal.py +183 -0
- maxframe/tensor/indexing/flatnonzero.py +60 -0
- maxframe/tensor/indexing/getitem.py +175 -0
- maxframe/tensor/indexing/nonzero.py +120 -0
- maxframe/tensor/indexing/setitem.py +132 -0
- maxframe/tensor/indexing/slice.py +29 -0
- maxframe/tensor/indexing/take.py +130 -0
- maxframe/tensor/indexing/tests/__init__.py +15 -0
- maxframe/tensor/indexing/tests/test_indexing.py +234 -0
- maxframe/tensor/indexing/unravel_index.py +103 -0
- maxframe/tensor/merge/__init__.py +15 -0
- maxframe/tensor/merge/stack.py +132 -0
- maxframe/tensor/merge/tests/__init__.py +13 -0
- maxframe/tensor/merge/tests/test_merge.py +52 -0
- maxframe/tensor/operators.py +123 -0
- maxframe/tensor/random/__init__.py +168 -0
- maxframe/tensor/random/beta.py +87 -0
- maxframe/tensor/random/binomial.py +137 -0
- maxframe/tensor/random/bytes.py +39 -0
- maxframe/tensor/random/chisquare.py +110 -0
- maxframe/tensor/random/choice.py +186 -0
- maxframe/tensor/random/core.py +234 -0
- maxframe/tensor/random/dirichlet.py +123 -0
- maxframe/tensor/random/exponential.py +94 -0
- maxframe/tensor/random/f.py +135 -0
- maxframe/tensor/random/gamma.py +128 -0
- maxframe/tensor/random/geometric.py +93 -0
- maxframe/tensor/random/gumbel.py +167 -0
- maxframe/tensor/random/hypergeometric.py +148 -0
- maxframe/tensor/random/laplace.py +133 -0
- maxframe/tensor/random/logistic.py +129 -0
- maxframe/tensor/random/lognormal.py +159 -0
- maxframe/tensor/random/logseries.py +122 -0
- maxframe/tensor/random/multinomial.py +133 -0
- maxframe/tensor/random/multivariate_normal.py +192 -0
- maxframe/tensor/random/negative_binomial.py +125 -0
- maxframe/tensor/random/noncentral_chisquare.py +132 -0
- maxframe/tensor/random/noncentral_f.py +126 -0
- maxframe/tensor/random/normal.py +143 -0
- maxframe/tensor/random/pareto.py +140 -0
- maxframe/tensor/random/permutation.py +104 -0
- maxframe/tensor/random/poisson.py +111 -0
- maxframe/tensor/random/power.py +142 -0
- maxframe/tensor/random/rand.py +82 -0
- maxframe/tensor/random/randint.py +121 -0
- maxframe/tensor/random/randn.py +96 -0
- maxframe/tensor/random/random_integers.py +123 -0
- maxframe/tensor/random/random_sample.py +86 -0
- maxframe/tensor/random/rayleigh.py +110 -0
- maxframe/tensor/random/shuffle.py +61 -0
- maxframe/tensor/random/standard_cauchy.py +105 -0
- maxframe/tensor/random/standard_exponential.py +72 -0
- maxframe/tensor/random/standard_gamma.py +120 -0
- maxframe/tensor/random/standard_normal.py +74 -0
- maxframe/tensor/random/standard_t.py +135 -0
- maxframe/tensor/random/tests/__init__.py +15 -0
- maxframe/tensor/random/tests/test_random.py +167 -0
- maxframe/tensor/random/triangular.py +119 -0
- maxframe/tensor/random/uniform.py +131 -0
- maxframe/tensor/random/vonmises.py +131 -0
- maxframe/tensor/random/wald.py +114 -0
- maxframe/tensor/random/weibull.py +140 -0
- maxframe/tensor/random/zipf.py +122 -0
- maxframe/tensor/rechunk/__init__.py +26 -0
- maxframe/tensor/rechunk/rechunk.py +43 -0
- maxframe/tensor/reduction/__init__.py +66 -0
- maxframe/tensor/reduction/all.py +103 -0
- maxframe/tensor/reduction/allclose.py +88 -0
- maxframe/tensor/reduction/any.py +105 -0
- maxframe/tensor/reduction/argmax.py +103 -0
- maxframe/tensor/reduction/argmin.py +103 -0
- maxframe/tensor/reduction/array_equal.py +64 -0
- maxframe/tensor/reduction/core.py +168 -0
- maxframe/tensor/reduction/count_nonzero.py +81 -0
- maxframe/tensor/reduction/cumprod.py +97 -0
- maxframe/tensor/reduction/cumsum.py +101 -0
- maxframe/tensor/reduction/max.py +120 -0
- maxframe/tensor/reduction/mean.py +123 -0
- maxframe/tensor/reduction/min.py +120 -0
- maxframe/tensor/reduction/nanargmax.py +82 -0
- maxframe/tensor/reduction/nanargmin.py +76 -0
- maxframe/tensor/reduction/nancumprod.py +91 -0
- maxframe/tensor/reduction/nancumsum.py +94 -0
- maxframe/tensor/reduction/nanmax.py +111 -0
- maxframe/tensor/reduction/nanmean.py +106 -0
- maxframe/tensor/reduction/nanmin.py +111 -0
- maxframe/tensor/reduction/nanprod.py +94 -0
- maxframe/tensor/reduction/nanstd.py +126 -0
- maxframe/tensor/reduction/nansum.py +115 -0
- maxframe/tensor/reduction/nanvar.py +149 -0
- maxframe/tensor/reduction/prod.py +130 -0
- maxframe/tensor/reduction/std.py +134 -0
- maxframe/tensor/reduction/sum.py +125 -0
- maxframe/tensor/reduction/tests/__init__.py +13 -0
- maxframe/tensor/reduction/tests/test_reduction.py +181 -0
- maxframe/tensor/reduction/var.py +176 -0
- maxframe/tensor/reshape/__init__.py +17 -0
- maxframe/tensor/reshape/reshape.py +188 -0
- maxframe/tensor/reshape/tests/__init__.py +15 -0
- maxframe/tensor/reshape/tests/test_reshape.py +37 -0
- maxframe/tensor/statistics/__init__.py +13 -0
- maxframe/tensor/statistics/percentile.py +175 -0
- maxframe/tensor/statistics/quantile.py +288 -0
- maxframe/tensor/ufunc/__init__.py +26 -0
- maxframe/tensor/ufunc/ufunc.py +200 -0
- maxframe/tensor/utils.py +718 -0
- maxframe/tests/__init__.py +13 -0
- maxframe/tests/test_codegen.py +69 -0
- maxframe/tests/test_protocol.py +144 -0
- maxframe/tests/test_utils.py +376 -0
- maxframe/tests/utils.py +164 -0
- maxframe/typing_.py +37 -0
- maxframe/udf.py +134 -0
- maxframe/utils.py +1114 -0
- maxframe-0.1.0b5.dist-info/METADATA +104 -0
- maxframe-0.1.0b5.dist-info/RECORD +647 -0
- maxframe-0.1.0b5.dist-info/WHEEL +5 -0
- maxframe-0.1.0b5.dist-info/top_level.txt +3 -0
- maxframe_client/__init__.py +17 -0
- maxframe_client/clients/__init__.py +13 -0
- maxframe_client/clients/framedriver.py +118 -0
- maxframe_client/clients/spe.py +104 -0
- maxframe_client/conftest.py +15 -0
- maxframe_client/fetcher.py +264 -0
- maxframe_client/session/__init__.py +22 -0
- maxframe_client/session/consts.py +36 -0
- maxframe_client/session/graph.py +119 -0
- maxframe_client/session/odps.py +482 -0
- maxframe_client/session/task.py +280 -0
- maxframe_client/session/tests/__init__.py +13 -0
- maxframe_client/session/tests/test_task.py +85 -0
- maxframe_client/tests/__init__.py +13 -0
- maxframe_client/tests/test_fetcher.py +89 -0
- maxframe_client/tests/test_session.py +255 -0
maxframe/tensor/utils.py
ADDED
|
@@ -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
|