maxframe 0.1.0b5__cp39-cp39-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-39-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-39-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-39-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-39-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
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
import builtins
|
|
16
|
+
import itertools
|
|
17
|
+
from operator import attrgetter
|
|
18
|
+
from typing import Callable, List
|
|
19
|
+
from weakref import WeakKeyDictionary, WeakSet
|
|
20
|
+
|
|
21
|
+
import numpy as np
|
|
22
|
+
|
|
23
|
+
from ...serialization.serializables import BoolField, FieldTypes, TupleField
|
|
24
|
+
from ...typing_ import OperatorType, TileableType
|
|
25
|
+
from ...utils import on_deserialize_shape, on_serialize_nsplits, on_serialize_shape
|
|
26
|
+
from ..base import Base
|
|
27
|
+
from ..mode import enter_mode
|
|
28
|
+
from .chunks import Chunk
|
|
29
|
+
from .core import Entity, EntityData
|
|
30
|
+
from .executable import _ExecutableMixin
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class NotSupportTile(Exception):
|
|
34
|
+
pass
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class OperatorTilesHandler:
|
|
38
|
+
_handlers = dict()
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def _get_op_cls(cls, op: OperatorType):
|
|
42
|
+
if isinstance(op, type):
|
|
43
|
+
return op
|
|
44
|
+
return type(op)
|
|
45
|
+
|
|
46
|
+
@classmethod
|
|
47
|
+
def register(
|
|
48
|
+
cls, op: OperatorType, tile_handler: Callable[[OperatorType], TileableType]
|
|
49
|
+
):
|
|
50
|
+
cls._handlers[cls._get_op_cls(op)] = tile_handler
|
|
51
|
+
|
|
52
|
+
@classmethod
|
|
53
|
+
def unregister(cls, op: OperatorType):
|
|
54
|
+
del cls._handlers[cls._get_op_cls(op)]
|
|
55
|
+
|
|
56
|
+
@classmethod
|
|
57
|
+
def get_handler(
|
|
58
|
+
cls, op: OperatorType
|
|
59
|
+
) -> Callable[[OperatorType], List[TileableType]]:
|
|
60
|
+
op_cls = cls._get_op_cls(op)
|
|
61
|
+
return cls._handlers.get(op_cls, op_cls.tile)
|
|
62
|
+
|
|
63
|
+
@classmethod
|
|
64
|
+
def _assign_to(
|
|
65
|
+
cls,
|
|
66
|
+
tile_after_tensor_datas: List["TileableData"],
|
|
67
|
+
tile_before_tensor_datas: List["TileableData"],
|
|
68
|
+
):
|
|
69
|
+
assert len(tile_after_tensor_datas) == len(tile_before_tensor_datas)
|
|
70
|
+
|
|
71
|
+
for tile_after_tensor_data, tile_before_tensor_data in zip(
|
|
72
|
+
tile_after_tensor_datas, tile_before_tensor_datas
|
|
73
|
+
):
|
|
74
|
+
if tile_before_tensor_data is None:
|
|
75
|
+
# garbage collected
|
|
76
|
+
continue
|
|
77
|
+
tile_after_tensor_data.copy_to(tile_before_tensor_data)
|
|
78
|
+
tile_before_tensor_data.op.outputs = tile_before_tensor_datas
|
|
79
|
+
|
|
80
|
+
@enter_mode(kernel=True)
|
|
81
|
+
def dispatch(self, op: OperatorType):
|
|
82
|
+
op_cls = self._get_op_cls(op)
|
|
83
|
+
tiled = None
|
|
84
|
+
cause = None
|
|
85
|
+
|
|
86
|
+
if op_cls in self._handlers:
|
|
87
|
+
tiled = self._handlers[op_cls](op)
|
|
88
|
+
else:
|
|
89
|
+
try:
|
|
90
|
+
tiled = op_cls.tile(op)
|
|
91
|
+
except NotImplementedError as ex:
|
|
92
|
+
cause = ex
|
|
93
|
+
for super_cls in op_cls.__mro__:
|
|
94
|
+
if super_cls in self._handlers:
|
|
95
|
+
h = self._handlers[op_cls] = self._handlers[super_cls]
|
|
96
|
+
tiled = h(op)
|
|
97
|
+
break
|
|
98
|
+
|
|
99
|
+
if tiled is not None:
|
|
100
|
+
return tiled if isinstance(tiled, list) else [tiled]
|
|
101
|
+
else:
|
|
102
|
+
raise NotImplementedError(f"{type(op)} does not support tile") from cause
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
handler = OperatorTilesHandler()
|
|
106
|
+
register = OperatorTilesHandler.register
|
|
107
|
+
unregister = OperatorTilesHandler.unregister
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
class _ChunksIndexer:
|
|
111
|
+
__slots__ = ("_tileable",)
|
|
112
|
+
|
|
113
|
+
def __init__(self, tileable):
|
|
114
|
+
self._tileable = tileable
|
|
115
|
+
|
|
116
|
+
def __getitem__(self, item):
|
|
117
|
+
"""
|
|
118
|
+
The indices for `cix` can be [x, y] or [x, :].
|
|
119
|
+
For the former the result will be a single chunk,
|
|
120
|
+
and for the later the result will be a list of chunks (flattened).
|
|
121
|
+
|
|
122
|
+
The length of indices must be the same with `chunk_shape` of tileable.
|
|
123
|
+
"""
|
|
124
|
+
if isinstance(item, int):
|
|
125
|
+
item = (item,)
|
|
126
|
+
if isinstance(item, tuple):
|
|
127
|
+
if len(item) == 0 and self._tileable.is_scalar():
|
|
128
|
+
return self._tileable.chunks[0]
|
|
129
|
+
if len(item) != self._tileable.ndim:
|
|
130
|
+
raise ValueError(
|
|
131
|
+
f"Cannot get chunk by {item}, "
|
|
132
|
+
f"expect length {self._tileable.ndim}"
|
|
133
|
+
)
|
|
134
|
+
slices, singleton = [], True
|
|
135
|
+
for it, dim in zip(item, self._tileable.chunk_shape):
|
|
136
|
+
if isinstance(it, slice):
|
|
137
|
+
slices.append(range(dim)[it])
|
|
138
|
+
singleton = False
|
|
139
|
+
elif np.issubdtype(type(it), np.integer):
|
|
140
|
+
slices.append([it if it >= 0 else dim + it])
|
|
141
|
+
else:
|
|
142
|
+
raise TypeError(
|
|
143
|
+
f"Cannot get chunk by {it}, "
|
|
144
|
+
f"invalid value has type {type(it)}"
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
indexes = tuple(zip(*itertools.product(*slices)))
|
|
148
|
+
|
|
149
|
+
flat_index = np.ravel_multi_index(indexes, self._tileable.chunk_shape)
|
|
150
|
+
if singleton:
|
|
151
|
+
return self._tileable._chunks[flat_index[0]]
|
|
152
|
+
else:
|
|
153
|
+
return [self._tileable._chunks[idx] for idx in flat_index]
|
|
154
|
+
|
|
155
|
+
raise ValueError(f"Cannot get {type(self._tileable).__name__} chunk by {item}")
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
class EntityDataModificationHandler:
|
|
159
|
+
def __init__(self):
|
|
160
|
+
self._data_to_entities = WeakKeyDictionary()
|
|
161
|
+
|
|
162
|
+
def _add_observer(self, data, entity):
|
|
163
|
+
# only tileable data should be considered
|
|
164
|
+
assert isinstance(data, TileableData)
|
|
165
|
+
assert isinstance(entity, Tileable)
|
|
166
|
+
|
|
167
|
+
if data not in self._data_to_entities:
|
|
168
|
+
self._data_to_entities[data] = WeakSet()
|
|
169
|
+
|
|
170
|
+
self._data_to_entities[data].add(entity)
|
|
171
|
+
|
|
172
|
+
@enter_mode(build=True)
|
|
173
|
+
def add_observer(self, data, entity):
|
|
174
|
+
self._add_observer(data, entity)
|
|
175
|
+
|
|
176
|
+
def _update_observe_data(self, observer, data, new_data):
|
|
177
|
+
self._data_to_entities.get(data, set()).discard(observer)
|
|
178
|
+
self._add_observer(new_data, observer)
|
|
179
|
+
|
|
180
|
+
@staticmethod
|
|
181
|
+
def _set_data(entity, data):
|
|
182
|
+
entity._data.detach(entity)
|
|
183
|
+
entity._data = data
|
|
184
|
+
data.attach(entity)
|
|
185
|
+
|
|
186
|
+
@staticmethod
|
|
187
|
+
def _get_data(obj):
|
|
188
|
+
return obj.data if isinstance(obj, Entity) else obj
|
|
189
|
+
|
|
190
|
+
@enter_mode(build=True)
|
|
191
|
+
def data_changed(self, old_data, new_data):
|
|
192
|
+
notified = set()
|
|
193
|
+
processed_data = set()
|
|
194
|
+
old_to_new = {old_data: new_data}
|
|
195
|
+
q = [old_data]
|
|
196
|
+
while len(q) > 0:
|
|
197
|
+
data = q.pop()
|
|
198
|
+
|
|
199
|
+
# handle entities
|
|
200
|
+
for entity in data.entities:
|
|
201
|
+
self._set_data(entity, old_to_new[data])
|
|
202
|
+
notified.add(entity)
|
|
203
|
+
|
|
204
|
+
observers = {
|
|
205
|
+
ob
|
|
206
|
+
for ob in self._data_to_entities.pop(data, set())
|
|
207
|
+
if ob not in notified
|
|
208
|
+
}
|
|
209
|
+
for ob in observers:
|
|
210
|
+
new_data = self._get_data(ob.op.on_input_modify(old_to_new[data]))
|
|
211
|
+
old_data = ob.data
|
|
212
|
+
self._update_observe_data(ob, ob.data, new_data)
|
|
213
|
+
old_to_new[old_data] = new_data
|
|
214
|
+
if old_data not in processed_data:
|
|
215
|
+
q.append(old_data)
|
|
216
|
+
processed_data.add(old_data)
|
|
217
|
+
notified.add(ob)
|
|
218
|
+
|
|
219
|
+
if data.op.create_view:
|
|
220
|
+
old_input_data = data.inputs[0]
|
|
221
|
+
new_input_data = self._get_data(
|
|
222
|
+
data.op.on_output_modify(old_to_new[data])
|
|
223
|
+
)
|
|
224
|
+
old_to_new[old_input_data] = new_input_data
|
|
225
|
+
if old_input_data not in processed_data:
|
|
226
|
+
q.append(old_input_data)
|
|
227
|
+
processed_data.add(old_input_data)
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
entity_view_handler = EntityDataModificationHandler()
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
class TileableData(EntityData, _ExecutableMixin):
|
|
234
|
+
__slots__ = "_cix", "_entities", "_executed_sessions"
|
|
235
|
+
_no_copy_attrs_ = Base._no_copy_attrs_ | {"_cix"}
|
|
236
|
+
|
|
237
|
+
# optional fields
|
|
238
|
+
# `nsplits` means the sizes of chunks for each dimension
|
|
239
|
+
_nsplits = TupleField(
|
|
240
|
+
"nsplits",
|
|
241
|
+
FieldTypes.tuple(FieldTypes.tuple(FieldTypes.uint64)),
|
|
242
|
+
on_serialize=on_serialize_nsplits,
|
|
243
|
+
)
|
|
244
|
+
# cache tileable data, if true, this data will be materialized
|
|
245
|
+
cache = BoolField("cache", default=False)
|
|
246
|
+
|
|
247
|
+
def __init__(self: TileableType, *args, **kwargs):
|
|
248
|
+
if kwargs.get("_nsplits", None) is not None:
|
|
249
|
+
kwargs["_nsplits"] = tuple(tuple(s) for s in kwargs["_nsplits"])
|
|
250
|
+
|
|
251
|
+
super().__init__(*args, **kwargs)
|
|
252
|
+
|
|
253
|
+
try:
|
|
254
|
+
chunks = self._chunks
|
|
255
|
+
if chunks:
|
|
256
|
+
self._chunks = sorted(chunks, key=attrgetter("index"))
|
|
257
|
+
except AttributeError: # pragma: no cover
|
|
258
|
+
pass
|
|
259
|
+
self._entities = WeakSet()
|
|
260
|
+
self._executed_sessions = []
|
|
261
|
+
|
|
262
|
+
def __on_deserialize__(self):
|
|
263
|
+
super(TileableData, self).__on_deserialize__()
|
|
264
|
+
self._entities = WeakSet()
|
|
265
|
+
self._executed_sessions = []
|
|
266
|
+
|
|
267
|
+
@property
|
|
268
|
+
def chunk_shape(self):
|
|
269
|
+
if hasattr(self, "_nsplits") and self._nsplits is not None:
|
|
270
|
+
return tuple(map(len, self._nsplits))
|
|
271
|
+
|
|
272
|
+
@property
|
|
273
|
+
def chunks(self) -> List[Chunk]:
|
|
274
|
+
return getattr(self, "_chunks", None)
|
|
275
|
+
|
|
276
|
+
@property
|
|
277
|
+
def nsplits(self):
|
|
278
|
+
return getattr(self, "_nsplits", None)
|
|
279
|
+
|
|
280
|
+
@nsplits.setter
|
|
281
|
+
def nsplits(self, new_nsplits):
|
|
282
|
+
self._nsplits = new_nsplits
|
|
283
|
+
|
|
284
|
+
@property
|
|
285
|
+
def params(self) -> dict:
|
|
286
|
+
# params return the properties which useful to rebuild a new tileable object
|
|
287
|
+
return dict()
|
|
288
|
+
|
|
289
|
+
@property
|
|
290
|
+
def cix(self):
|
|
291
|
+
if self.ndim == 0:
|
|
292
|
+
return _ChunksIndexer(self)
|
|
293
|
+
|
|
294
|
+
try:
|
|
295
|
+
if getattr(self, "_cix", None) is None:
|
|
296
|
+
self._cix = _ChunksIndexer(self)
|
|
297
|
+
return self._cix
|
|
298
|
+
except (TypeError, ValueError):
|
|
299
|
+
return _ChunksIndexer(self)
|
|
300
|
+
|
|
301
|
+
@property
|
|
302
|
+
def entities(self):
|
|
303
|
+
return self._entities
|
|
304
|
+
|
|
305
|
+
def is_coarse(self):
|
|
306
|
+
if not hasattr(self, "_chunks"):
|
|
307
|
+
return True
|
|
308
|
+
if not self._chunks:
|
|
309
|
+
return True
|
|
310
|
+
return False
|
|
311
|
+
|
|
312
|
+
def attach(self, entity):
|
|
313
|
+
self._entities.add(entity)
|
|
314
|
+
|
|
315
|
+
def detach(self, entity):
|
|
316
|
+
self._entities.discard(entity)
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
class Tileable(Entity):
|
|
320
|
+
def __init__(self, data: TileableType = None, **kw):
|
|
321
|
+
super().__init__(data=data, **kw)
|
|
322
|
+
data = self._data
|
|
323
|
+
if data is not None:
|
|
324
|
+
data.attach(self)
|
|
325
|
+
if data.op.create_view:
|
|
326
|
+
entity_view_handler.add_observer(data.inputs[0], self)
|
|
327
|
+
|
|
328
|
+
def __copy__(self):
|
|
329
|
+
return self._view()
|
|
330
|
+
|
|
331
|
+
def _view(self):
|
|
332
|
+
return super().copy()
|
|
333
|
+
|
|
334
|
+
def copy(self: TileableType) -> TileableType:
|
|
335
|
+
new_op = self.op.copy()
|
|
336
|
+
if new_op.create_view:
|
|
337
|
+
# if the operator is a view, make it a copy
|
|
338
|
+
new_op.create_view = False
|
|
339
|
+
params = []
|
|
340
|
+
for o in self.op.outputs:
|
|
341
|
+
param = o.params
|
|
342
|
+
param["_key"] = o.key
|
|
343
|
+
param.update(o.extra_params)
|
|
344
|
+
params.append(param)
|
|
345
|
+
new_outs = new_op.new_tileables(
|
|
346
|
+
self.op.inputs, kws=params, output_limit=len(params)
|
|
347
|
+
)
|
|
348
|
+
pos = -1
|
|
349
|
+
for i, out in enumerate(self.op.outputs):
|
|
350
|
+
# create a ref to copied one
|
|
351
|
+
new_out = new_outs[i]
|
|
352
|
+
if not hasattr(new_out.data, "_siblings"):
|
|
353
|
+
new_out.data._siblings = []
|
|
354
|
+
new_out.data._siblings.append(out)
|
|
355
|
+
|
|
356
|
+
if self._data is out:
|
|
357
|
+
pos = i
|
|
358
|
+
break
|
|
359
|
+
assert pos >= 0
|
|
360
|
+
return new_outs[pos]
|
|
361
|
+
|
|
362
|
+
@Entity.data.setter
|
|
363
|
+
def data(self, new_data):
|
|
364
|
+
self._check_data(new_data)
|
|
365
|
+
if self._data is None:
|
|
366
|
+
self._data = new_data
|
|
367
|
+
self._data.attach(self)
|
|
368
|
+
else:
|
|
369
|
+
entity_view_handler.data_changed(self._data, new_data)
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
TILEABLE_TYPE = (Tileable, TileableData)
|
|
373
|
+
|
|
374
|
+
|
|
375
|
+
class HasShapeTileableData(TileableData):
|
|
376
|
+
# required fields
|
|
377
|
+
_shape = TupleField(
|
|
378
|
+
"shape",
|
|
379
|
+
FieldTypes.int64,
|
|
380
|
+
on_serialize=on_serialize_shape,
|
|
381
|
+
on_deserialize=on_deserialize_shape,
|
|
382
|
+
)
|
|
383
|
+
|
|
384
|
+
@property
|
|
385
|
+
def ndim(self):
|
|
386
|
+
return len(self.shape)
|
|
387
|
+
|
|
388
|
+
def __len__(self):
|
|
389
|
+
try:
|
|
390
|
+
return int(self.shape[0])
|
|
391
|
+
except (IndexError, ValueError): # pragma: no cover
|
|
392
|
+
return 0
|
|
393
|
+
|
|
394
|
+
@property
|
|
395
|
+
def shape(self):
|
|
396
|
+
if hasattr(self, "_shape") and self._shape is not None:
|
|
397
|
+
return self._shape
|
|
398
|
+
if hasattr(self, "_nsplits") and self._nsplits is not None:
|
|
399
|
+
self._shape = tuple(builtins.sum(nsplit) for nsplit in self._nsplits)
|
|
400
|
+
return self._shape
|
|
401
|
+
|
|
402
|
+
def _update_shape(self, new_shape):
|
|
403
|
+
self._shape = new_shape
|
|
404
|
+
|
|
405
|
+
@property
|
|
406
|
+
def size(self):
|
|
407
|
+
return np.prod(self.shape).item()
|
|
408
|
+
|
|
409
|
+
@property
|
|
410
|
+
def params(self):
|
|
411
|
+
# params return the properties which useful to rebuild a new tileable object
|
|
412
|
+
return {"shape": self.shape}
|
|
413
|
+
|
|
414
|
+
def _equals(self, o):
|
|
415
|
+
return self is o
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
class HasShapeTileable(Tileable):
|
|
419
|
+
__slots__ = ()
|
|
420
|
+
|
|
421
|
+
@property
|
|
422
|
+
def shape(self):
|
|
423
|
+
return self._data.shape
|
|
424
|
+
|
|
425
|
+
@property
|
|
426
|
+
def ndim(self):
|
|
427
|
+
return self._data.ndim
|
|
428
|
+
|
|
429
|
+
@property
|
|
430
|
+
def size(self):
|
|
431
|
+
return self._data.size
|
|
432
|
+
|
|
433
|
+
def execute(self, session=None, **kw):
|
|
434
|
+
result = self.data.execute(session=session, **kw)
|
|
435
|
+
if isinstance(result, TILEABLE_TYPE):
|
|
436
|
+
return self
|
|
437
|
+
else:
|
|
438
|
+
return result
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from ...utils import calc_nsplits, has_unknown_shape
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def refresh_tileable_shape(tileable):
|
|
19
|
+
if has_unknown_shape(tileable):
|
|
20
|
+
# update shape
|
|
21
|
+
nsplits = calc_nsplits({c.index: c.shape for c in tileable.chunks})
|
|
22
|
+
shape = tuple(sum(ns) for ns in nsplits)
|
|
23
|
+
tileable._nsplits = nsplits
|
|
24
|
+
tileable._shape = shape
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from .builder import ChunkGraphBuilder, TileableGraphBuilder, TileContext, TileStatus
|
|
16
|
+
from .core import DAG, DirectedGraph, GraphContainsCycleError
|
|
17
|
+
from .entity import ChunkGraph, EntityGraph, GraphSerializer, TileableGraph
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from .chunk import ChunkGraphBuilder, TileContext, TileStatus
|
|
16
|
+
from .tileable import TileableGraphBuilder
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
from abc import ABC, abstractmethod
|
|
17
|
+
from typing import Generator, List, Set, Union
|
|
18
|
+
|
|
19
|
+
from ....typing_ import EntityType
|
|
20
|
+
from ..entity import ChunkGraph, EntityGraph, TileableGraph
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def _default_inputs_selector(inputs: List[EntityType]) -> List[EntityType]:
|
|
24
|
+
return inputs
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class AbstractGraphBuilder(ABC):
|
|
28
|
+
_graph: EntityGraph
|
|
29
|
+
|
|
30
|
+
def __init__(self, graph: EntityGraph):
|
|
31
|
+
self._graph = graph
|
|
32
|
+
|
|
33
|
+
def _process_node(self, entity: EntityType):
|
|
34
|
+
return entity
|
|
35
|
+
|
|
36
|
+
def _select_inputs(self, inputs: List[EntityType]):
|
|
37
|
+
return inputs
|
|
38
|
+
|
|
39
|
+
def _if_add_node(
|
|
40
|
+
self, node: EntityType, visited: Set
|
|
41
|
+
): # pylint: disable=no-self-use
|
|
42
|
+
return node not in visited
|
|
43
|
+
|
|
44
|
+
def _add_nodes(
|
|
45
|
+
self,
|
|
46
|
+
graph: Union[ChunkGraph, TileableGraph],
|
|
47
|
+
nodes: List[EntityType],
|
|
48
|
+
visited: Set,
|
|
49
|
+
):
|
|
50
|
+
# update visited
|
|
51
|
+
visited.update(nodes)
|
|
52
|
+
|
|
53
|
+
while len(nodes) > 0:
|
|
54
|
+
node = nodes.pop()
|
|
55
|
+
node = self._process_node(node)
|
|
56
|
+
|
|
57
|
+
# mark node as visited
|
|
58
|
+
visited.add(node)
|
|
59
|
+
|
|
60
|
+
# add node to graph if possible
|
|
61
|
+
if not graph.contains(node):
|
|
62
|
+
graph.add_node(node)
|
|
63
|
+
|
|
64
|
+
children = self._select_inputs(node.inputs or [])
|
|
65
|
+
if children:
|
|
66
|
+
node.inputs = children
|
|
67
|
+
for c in children:
|
|
68
|
+
c = self._process_node(c)
|
|
69
|
+
if not graph.contains(c):
|
|
70
|
+
graph.add_node(c)
|
|
71
|
+
if not graph.has_successor(c, node):
|
|
72
|
+
graph.add_edge(c, node)
|
|
73
|
+
for out in c.op.outputs:
|
|
74
|
+
if self._if_add_node(out, visited):
|
|
75
|
+
nodes.append(out)
|
|
76
|
+
|
|
77
|
+
@abstractmethod
|
|
78
|
+
def build(self) -> Generator[Union[EntityGraph, ChunkGraph], None, None]:
|
|
79
|
+
"""
|
|
80
|
+
Build a entity graph.
|
|
81
|
+
|
|
82
|
+
Returns
|
|
83
|
+
-------
|
|
84
|
+
graph : EntityGraph
|
|
85
|
+
Entity graph.
|
|
86
|
+
"""
|