maxframe 0.1.0b5__cp38-cp38-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +32 -0
- maxframe/_utils.cpython-38-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-38-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-38-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-38-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 +2 -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,450 @@
|
|
|
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 functools
|
|
16
|
+
import weakref
|
|
17
|
+
from copy import deepcopy
|
|
18
|
+
from enum import Enum
|
|
19
|
+
from functools import partial
|
|
20
|
+
from typing import Any, Dict, List, Optional, Tuple, Type, Union
|
|
21
|
+
|
|
22
|
+
from ...serialization.core import Placeholder
|
|
23
|
+
from ...serialization.serializables import (
|
|
24
|
+
BoolField,
|
|
25
|
+
DictField,
|
|
26
|
+
FieldTypes,
|
|
27
|
+
Float32Field,
|
|
28
|
+
Int32Field,
|
|
29
|
+
ListField,
|
|
30
|
+
ReferenceField,
|
|
31
|
+
Serializable,
|
|
32
|
+
SerializableMeta,
|
|
33
|
+
StringField,
|
|
34
|
+
TupleField,
|
|
35
|
+
)
|
|
36
|
+
from ...serialization.serializables.core import SerializableSerializer
|
|
37
|
+
from ...typing_ import OperatorType
|
|
38
|
+
from ...utils import AttributeDict, classproperty, get_user_call_point, tokenize
|
|
39
|
+
from ..base import Base
|
|
40
|
+
from ..entity.chunks import Chunk
|
|
41
|
+
from ..entity.core import ENTITY_TYPE, Entity, EntityData
|
|
42
|
+
from ..entity.output_types import OutputType
|
|
43
|
+
from ..entity.tileables import Tileable
|
|
44
|
+
from ..mode import enter_mode
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class OperatorMetaclass(SerializableMeta):
|
|
48
|
+
def __new__(mcs, name: str, bases: Tuple[Type], properties: Dict):
|
|
49
|
+
if "__call__" in properties:
|
|
50
|
+
# if __call__ is specified for an operator,
|
|
51
|
+
# make sure that entering user space
|
|
52
|
+
properties["__call__"] = enter_mode(kernel=False)(properties["__call__"])
|
|
53
|
+
|
|
54
|
+
return super().__new__(mcs, name, bases, properties)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class OperatorStage(Enum):
|
|
58
|
+
map = 0
|
|
59
|
+
reduce = 1
|
|
60
|
+
combine = 2
|
|
61
|
+
agg = 3
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
class SchedulingHint(Serializable):
|
|
65
|
+
# worker to execute, only work for chunk op,
|
|
66
|
+
# if specified, the op should be executed on the specified worker
|
|
67
|
+
# only work for those operator that has no input
|
|
68
|
+
expect_worker = StringField("expect_worker", default=None)
|
|
69
|
+
# band to execute, only work for chunk op,
|
|
70
|
+
# if specified, the op should be executed on the specified band
|
|
71
|
+
# only work for those operator that has no input
|
|
72
|
+
expect_band = TupleField(
|
|
73
|
+
"expect_band",
|
|
74
|
+
FieldTypes.tuple(FieldTypes.string, FieldTypes.string),
|
|
75
|
+
default=None,
|
|
76
|
+
)
|
|
77
|
+
# will this operator be assigned a worker or not
|
|
78
|
+
reassign_worker = BoolField("reassign_worker", default=False)
|
|
79
|
+
# mark a op as fuseable
|
|
80
|
+
fuseable = BoolField("fuseable", default=True)
|
|
81
|
+
# True means control dependency, False means data dependency
|
|
82
|
+
_pure_depends = ListField("pure_depends", FieldTypes.bool, default=None)
|
|
83
|
+
# useful when setting chunk index as priority,
|
|
84
|
+
# useful for those op like read_csv, the first chunk
|
|
85
|
+
# need to be executed not later than the later ones,
|
|
86
|
+
# because the range index of later chunk should be accumulated from
|
|
87
|
+
# indexes of previous ones
|
|
88
|
+
# `gpu` indicates that if the operator should be executed on the GPU.
|
|
89
|
+
gpu = BoolField("gpu", default=None)
|
|
90
|
+
priority = Int32Field("priority", default=None)
|
|
91
|
+
|
|
92
|
+
@classproperty
|
|
93
|
+
@functools.lru_cache(1)
|
|
94
|
+
def all_hint_names(cls):
|
|
95
|
+
return list(cls._FIELDS)
|
|
96
|
+
|
|
97
|
+
def can_be_fused(self) -> bool:
|
|
98
|
+
if not self.fuseable:
|
|
99
|
+
return False
|
|
100
|
+
if self.reassign_worker:
|
|
101
|
+
return False
|
|
102
|
+
if self._pure_depends and any(depend for depend in self._pure_depends):
|
|
103
|
+
# control dependency exists
|
|
104
|
+
return False
|
|
105
|
+
return True
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _install_scheduling_hint_properties(cls: Type["Operator"]):
|
|
109
|
+
def get_hint(name):
|
|
110
|
+
def _get_val(operator: "Operator"):
|
|
111
|
+
if operator.scheduling_hint:
|
|
112
|
+
return getattr(operator.scheduling_hint, name)
|
|
113
|
+
|
|
114
|
+
def _set_val(operator: "Operator", val: Any):
|
|
115
|
+
if not operator.scheduling_hint:
|
|
116
|
+
operator.scheduling_hint = SchedulingHint(**{name: val})
|
|
117
|
+
else:
|
|
118
|
+
setattr(operator.scheduling_hint, name, val)
|
|
119
|
+
|
|
120
|
+
return property(_get_val, _set_val)
|
|
121
|
+
|
|
122
|
+
for hint_name in SchedulingHint.all_hint_names:
|
|
123
|
+
setattr(cls, hint_name, get_hint(hint_name))
|
|
124
|
+
return cls
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class OperatorLogicKeyGeneratorMixin:
|
|
128
|
+
"""
|
|
129
|
+
This generator will generate an unique and deterministic key for operator compute logic. It should be same
|
|
130
|
+
for different run if the compute logic doesn't change. This id will be used in subtask speculative
|
|
131
|
+
execution and hbo scheduling and so on.
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
def get_logic_key(self):
|
|
135
|
+
"""The subclass may need to override this method to ensure unique and deterministic."""
|
|
136
|
+
fields = self._get_logic_key_token_values()
|
|
137
|
+
try:
|
|
138
|
+
return tokenize(*fields)
|
|
139
|
+
except Exception as e: # pragma: no cover
|
|
140
|
+
raise ValueError(
|
|
141
|
+
f"Cannot generate logic key for operator {self} with fields {fields}"
|
|
142
|
+
) from e
|
|
143
|
+
|
|
144
|
+
def _get_logic_key_token_values(self):
|
|
145
|
+
token_values = [type(self).__module__, type(self).__qualname__]
|
|
146
|
+
if self.stage is not None:
|
|
147
|
+
token_values.append(self.stage.name)
|
|
148
|
+
return token_values
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
class LogicKeyGenerator:
|
|
152
|
+
def __init__(self):
|
|
153
|
+
self.operator_id_to_logic_key = {}
|
|
154
|
+
|
|
155
|
+
def get_logic_key(self, op: "Operator"):
|
|
156
|
+
assert isinstance(op, Operator)
|
|
157
|
+
logic_key = self.operator_id_to_logic_key.get(op.id)
|
|
158
|
+
if logic_key is None:
|
|
159
|
+
logic_key = self.operator_id_to_logic_key[op.id] = op.get_logic_key()
|
|
160
|
+
return logic_key
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class CallPoint(Serializable):
|
|
164
|
+
"""
|
|
165
|
+
Representing the call stack information of the last frame of the user codes.
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
filename = StringField("filename", default=None)
|
|
169
|
+
lineno = StringField("lineno", default=None)
|
|
170
|
+
name = StringField("name", default=None)
|
|
171
|
+
|
|
172
|
+
@staticmethod
|
|
173
|
+
def from_current_user_call() -> Optional["CallPoint"]:
|
|
174
|
+
"""
|
|
175
|
+
Get the call information of user code stack.
|
|
176
|
+
|
|
177
|
+
Returns
|
|
178
|
+
-------
|
|
179
|
+
CallPoint: optional
|
|
180
|
+
The call stack information of the last frame in user codes (the parent of
|
|
181
|
+
the first maxframe frame). If it returns None, the whole call frames are all
|
|
182
|
+
in maxframe codes.
|
|
183
|
+
"""
|
|
184
|
+
frame = get_user_call_point()
|
|
185
|
+
if not frame:
|
|
186
|
+
return None
|
|
187
|
+
return CallPoint(
|
|
188
|
+
filename=frame.f_code.co_filename,
|
|
189
|
+
lineno=frame.f_lineno,
|
|
190
|
+
name=frame.f_code.co_name,
|
|
191
|
+
)
|
|
192
|
+
|
|
193
|
+
def format_output(self) -> List[str]:
|
|
194
|
+
return [f' File "{self.filename}", line {self.lineno}, in {self.name}']
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
@_install_scheduling_hint_properties
|
|
198
|
+
class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass):
|
|
199
|
+
"""
|
|
200
|
+
Operator misc class. All operators should have a type, which can be Add, Subtract etc.
|
|
201
|
+
`sparse` indicates that if the operator is applied on a sparse tensor/chunk.
|
|
202
|
+
`device`, 0 means the CPU, otherwise means the GPU device.
|
|
203
|
+
Operator can have inputs and outputs
|
|
204
|
+
which should be the :class:`maxframe.tensor.core.TensorData`, :class:`maxframe.tensor.core.ChunkData` etc.
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
attr_tag = "attr"
|
|
208
|
+
_init_update_key_ = False
|
|
209
|
+
_output_type_ = None
|
|
210
|
+
_no_copy_attrs_ = Base._no_copy_attrs_ | {"scheduling_hint", "call_points"}
|
|
211
|
+
_cache_primitive_serial = True
|
|
212
|
+
|
|
213
|
+
sparse = BoolField("sparse", default=False)
|
|
214
|
+
device = Int32Field("device", default=None)
|
|
215
|
+
# will this operator create a view of input data or not
|
|
216
|
+
create_view = BoolField("create_view", default=False)
|
|
217
|
+
stage = ReferenceField("stage", OperatorStage, default=None)
|
|
218
|
+
memory_scale = Float32Field("memory_scale", default=None)
|
|
219
|
+
tileable_op_key = StringField("tileable_op_key", default=None)
|
|
220
|
+
extra_params = DictField("extra_params", key_type=FieldTypes.string)
|
|
221
|
+
# scheduling hint
|
|
222
|
+
scheduling_hint = ReferenceField("scheduling_hint", SchedulingHint, default=None)
|
|
223
|
+
|
|
224
|
+
# User call points. As one operator may be a merged one from many standalone
|
|
225
|
+
# operators, we should use a list to keep the original call points.
|
|
226
|
+
call_points = ListField(
|
|
227
|
+
"call_points", FieldTypes.reference(CallPoint), default_factory=list
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
_inputs = ListField(
|
|
231
|
+
"inputs", FieldTypes.reference(EntityData), default_factory=list
|
|
232
|
+
)
|
|
233
|
+
# outputs are weak-refs which are not pickle-able
|
|
234
|
+
_outputs = ListField(
|
|
235
|
+
"outputs", default=None, on_serialize=lambda outputs: [o() for o in outputs]
|
|
236
|
+
)
|
|
237
|
+
_output_types = ListField(
|
|
238
|
+
"output_type",
|
|
239
|
+
FieldTypes.int32,
|
|
240
|
+
default=None,
|
|
241
|
+
on_serialize=OutputType.serialize_list,
|
|
242
|
+
on_deserialize=OutputType.deserialize_list,
|
|
243
|
+
)
|
|
244
|
+
|
|
245
|
+
def __init__(self: OperatorType, *args, **kwargs):
|
|
246
|
+
self._parse_kwargs(kwargs)
|
|
247
|
+
call_points = kwargs.pop("call_points", None) or [
|
|
248
|
+
CallPoint.from_current_user_call()
|
|
249
|
+
]
|
|
250
|
+
super().__init__(call_points=call_points, *args, **kwargs)
|
|
251
|
+
|
|
252
|
+
@classmethod
|
|
253
|
+
def _parse_kwargs(cls, kwargs: Dict[str, Any]):
|
|
254
|
+
extra_params = kwargs.pop("extra_params", {})
|
|
255
|
+
kwargs["extra_params"] = extras = AttributeDict(extra_params)
|
|
256
|
+
kwargs["scheduling_hint"] = scheduling_hint = kwargs.get(
|
|
257
|
+
"scheduling_hint", SchedulingHint()
|
|
258
|
+
)
|
|
259
|
+
for k in set(kwargs):
|
|
260
|
+
if k in cls._FIELDS:
|
|
261
|
+
continue
|
|
262
|
+
elif k in SchedulingHint.all_hint_names:
|
|
263
|
+
setattr(scheduling_hint, k, kwargs.pop(k))
|
|
264
|
+
else:
|
|
265
|
+
extras[k] = kwargs.pop(k)
|
|
266
|
+
|
|
267
|
+
def __repr__(self):
|
|
268
|
+
if self.stage is None:
|
|
269
|
+
return f"{type(self).__name__} <key={self.key}>"
|
|
270
|
+
else:
|
|
271
|
+
return f"{type(self).__name__} <key={self.key}, stage={self.stage.name}>"
|
|
272
|
+
|
|
273
|
+
@classmethod
|
|
274
|
+
def _get_entity_data(cls, entity):
|
|
275
|
+
if isinstance(entity, Entity):
|
|
276
|
+
return entity.data
|
|
277
|
+
return entity
|
|
278
|
+
|
|
279
|
+
@classmethod
|
|
280
|
+
def _get_inputs_data(cls, inputs):
|
|
281
|
+
return [cls._get_entity_data(inp) for inp in inputs]
|
|
282
|
+
|
|
283
|
+
def _set_inputs(self, inputs):
|
|
284
|
+
if inputs is not None:
|
|
285
|
+
inputs = self._get_inputs_data(inputs)
|
|
286
|
+
if hasattr(self, "check_inputs"):
|
|
287
|
+
self.check_inputs(inputs)
|
|
288
|
+
setattr(self, "_inputs", inputs)
|
|
289
|
+
|
|
290
|
+
def replace_input(self, index: int, replaced_input: ENTITY_TYPE):
|
|
291
|
+
"""
|
|
292
|
+
Replace the input[index] with replaced_input.
|
|
293
|
+
|
|
294
|
+
Parameters
|
|
295
|
+
----------
|
|
296
|
+
index : int
|
|
297
|
+
The input to be replaced index.
|
|
298
|
+
replaced_input : ENTITY_TYPE
|
|
299
|
+
The replaced input object.
|
|
300
|
+
"""
|
|
301
|
+
self.inputs[index] = replaced_input
|
|
302
|
+
self._set_inputs(self.inputs)
|
|
303
|
+
|
|
304
|
+
@property
|
|
305
|
+
def inputs(self) -> List[Union[ENTITY_TYPE]]:
|
|
306
|
+
inputs = self._inputs
|
|
307
|
+
if inputs is None:
|
|
308
|
+
inputs = self._inputs = []
|
|
309
|
+
return inputs
|
|
310
|
+
|
|
311
|
+
@inputs.setter
|
|
312
|
+
def inputs(self, vals):
|
|
313
|
+
self._set_inputs(vals)
|
|
314
|
+
|
|
315
|
+
@property
|
|
316
|
+
def output_limit(self) -> int:
|
|
317
|
+
return 1
|
|
318
|
+
|
|
319
|
+
@property
|
|
320
|
+
def pure_depends(self):
|
|
321
|
+
val = self._pure_depends # pylint: disable=access-member-before-definition
|
|
322
|
+
if not val:
|
|
323
|
+
val = self._pure_depends = [False] * len(self.inputs or ())
|
|
324
|
+
return val
|
|
325
|
+
|
|
326
|
+
@property
|
|
327
|
+
def output_types(self):
|
|
328
|
+
return self._output_types
|
|
329
|
+
|
|
330
|
+
@output_types.setter
|
|
331
|
+
def output_types(self, value):
|
|
332
|
+
self._output_types = value
|
|
333
|
+
|
|
334
|
+
def _attach_outputs(self, *outputs):
|
|
335
|
+
self._outputs = [
|
|
336
|
+
weakref.ref(self._get_entity_data(o)) if o is not None else o
|
|
337
|
+
for o in outputs
|
|
338
|
+
]
|
|
339
|
+
|
|
340
|
+
if len(self._outputs) > self.output_limit:
|
|
341
|
+
raise ValueError("Outputs' size exceeds limitation")
|
|
342
|
+
|
|
343
|
+
@property
|
|
344
|
+
def outputs(self) -> List[Union[Chunk, Tileable]]:
|
|
345
|
+
outputs = self._outputs
|
|
346
|
+
if outputs:
|
|
347
|
+
return [ref() for ref in outputs]
|
|
348
|
+
|
|
349
|
+
@outputs.setter
|
|
350
|
+
def outputs(self, outputs):
|
|
351
|
+
self._attach_outputs(*outputs)
|
|
352
|
+
|
|
353
|
+
def is_sparse(self) -> bool:
|
|
354
|
+
return self.sparse
|
|
355
|
+
|
|
356
|
+
issparse = is_sparse
|
|
357
|
+
|
|
358
|
+
def is_gpu(self) -> bool:
|
|
359
|
+
return self.gpu
|
|
360
|
+
|
|
361
|
+
@property
|
|
362
|
+
def retryable(self) -> bool:
|
|
363
|
+
return True
|
|
364
|
+
|
|
365
|
+
def get_dependent_data_keys(self):
|
|
366
|
+
return [dep.key for dep in self.inputs or ()]
|
|
367
|
+
|
|
368
|
+
def _get_output_type(self, output_idx):
|
|
369
|
+
if self.output_types:
|
|
370
|
+
try:
|
|
371
|
+
return self.output_types[output_idx]
|
|
372
|
+
except IndexError:
|
|
373
|
+
return self.output_types[0]
|
|
374
|
+
else:
|
|
375
|
+
return self._output_type_
|
|
376
|
+
|
|
377
|
+
def copy(self: OperatorType) -> OperatorType:
|
|
378
|
+
new_op = super().copy()
|
|
379
|
+
new_op.outputs = []
|
|
380
|
+
# copy scheduling_hint
|
|
381
|
+
new_op.scheduling_hint = self.scheduling_hint.copy()
|
|
382
|
+
# copy call_points
|
|
383
|
+
new_op.call_points = self.call_points.copy()
|
|
384
|
+
extra_params = self.extra_params
|
|
385
|
+
if extra_params:
|
|
386
|
+
new_op.extra_params = deepcopy(extra_params)
|
|
387
|
+
return new_op
|
|
388
|
+
|
|
389
|
+
def on_output_modify(self, new_output):
|
|
390
|
+
# when `create_view` is True, if the output is modified,
|
|
391
|
+
# the modification should be set back to the input.
|
|
392
|
+
# This function is for this sort of usage.
|
|
393
|
+
# Remember, if `create_view` is False, this function should take no effect.
|
|
394
|
+
raise NotImplementedError
|
|
395
|
+
|
|
396
|
+
def on_input_modify(self, new_input):
|
|
397
|
+
# when `create_view` is True, if the input is modified,
|
|
398
|
+
# this function could be used to respond the modification.
|
|
399
|
+
# Remember, if `create_view` is False, this function should take no effect.
|
|
400
|
+
raise NotImplementedError
|
|
401
|
+
|
|
402
|
+
|
|
403
|
+
class OperatorSerializer(SerializableSerializer):
|
|
404
|
+
def serial(self, obj: Serializable, context: Dict):
|
|
405
|
+
res = super().serial(obj, context)
|
|
406
|
+
return res
|
|
407
|
+
|
|
408
|
+
def deserial(self, serialized: List, context: Dict, subs: List) -> Operator:
|
|
409
|
+
# convert outputs back to weak-refs
|
|
410
|
+
operator: Operator = super().deserial(serialized, context, subs)
|
|
411
|
+
for i, out in enumerate(operator._outputs):
|
|
412
|
+
|
|
413
|
+
def cb(o, index):
|
|
414
|
+
outputs = operator._outputs
|
|
415
|
+
outputs[index] = weakref.ref(o)
|
|
416
|
+
|
|
417
|
+
if len(outputs) > 1 and all(
|
|
418
|
+
not isinstance(o, Placeholder) for o in outputs
|
|
419
|
+
):
|
|
420
|
+
# all replaced
|
|
421
|
+
# add siblings for multiple outputs
|
|
422
|
+
outputs = operator.outputs
|
|
423
|
+
for j in range(len(outputs)):
|
|
424
|
+
outputs[j]._siblings = outputs[:j] + outputs[j + 1 :]
|
|
425
|
+
|
|
426
|
+
if isinstance(out, Placeholder):
|
|
427
|
+
out.callbacks.append(partial(cb, index=i))
|
|
428
|
+
else:
|
|
429
|
+
cb(out, i)
|
|
430
|
+
return operator
|
|
431
|
+
|
|
432
|
+
|
|
433
|
+
OperatorSerializer.register(Operator)
|
|
434
|
+
|
|
435
|
+
|
|
436
|
+
class VirtualOperator(Operator):
|
|
437
|
+
def get_dependent_data_keys(self):
|
|
438
|
+
return []
|
|
439
|
+
|
|
440
|
+
|
|
441
|
+
class HasInput(Operator):
|
|
442
|
+
__slots__ = ()
|
|
443
|
+
|
|
444
|
+
@property
|
|
445
|
+
def input(self):
|
|
446
|
+
return self._input
|
|
447
|
+
|
|
448
|
+
def _set_inputs(self, inputs):
|
|
449
|
+
super()._set_inputs(inputs)
|
|
450
|
+
self._input = self._inputs[0]
|