maxframe 0.1.0b5__cp310-cp310-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +32 -0
- maxframe/_utils.cpython-310-darwin.so +0 -0
- maxframe/_utils.pxd +33 -0
- maxframe/_utils.pyx +547 -0
- maxframe/codegen.py +528 -0
- maxframe/config/__init__.py +15 -0
- maxframe/config/config.py +443 -0
- maxframe/config/tests/__init__.py +13 -0
- maxframe/config/tests/test_config.py +103 -0
- maxframe/config/tests/test_validators.py +34 -0
- maxframe/config/validators.py +57 -0
- maxframe/conftest.py +139 -0
- maxframe/core/__init__.py +65 -0
- maxframe/core/base.py +156 -0
- maxframe/core/entity/__init__.py +44 -0
- maxframe/core/entity/chunks.py +68 -0
- maxframe/core/entity/core.py +152 -0
- maxframe/core/entity/executable.py +337 -0
- maxframe/core/entity/fuse.py +73 -0
- maxframe/core/entity/objects.py +100 -0
- maxframe/core/entity/output_types.py +90 -0
- maxframe/core/entity/tileables.py +438 -0
- maxframe/core/entity/utils.py +24 -0
- maxframe/core/graph/__init__.py +17 -0
- maxframe/core/graph/builder/__init__.py +16 -0
- maxframe/core/graph/builder/base.py +86 -0
- maxframe/core/graph/builder/chunk.py +430 -0
- maxframe/core/graph/builder/tileable.py +34 -0
- maxframe/core/graph/builder/utils.py +41 -0
- maxframe/core/graph/core.cpython-310-darwin.so +0 -0
- maxframe/core/graph/core.pyx +467 -0
- maxframe/core/graph/entity.py +171 -0
- maxframe/core/graph/tests/__init__.py +13 -0
- maxframe/core/graph/tests/test_graph.py +205 -0
- maxframe/core/mode.py +96 -0
- maxframe/core/operator/__init__.py +34 -0
- maxframe/core/operator/base.py +450 -0
- maxframe/core/operator/core.py +276 -0
- maxframe/core/operator/fetch.py +53 -0
- maxframe/core/operator/fuse.py +29 -0
- maxframe/core/operator/objects.py +72 -0
- maxframe/core/operator/shuffle.py +111 -0
- maxframe/core/operator/tests/__init__.py +13 -0
- maxframe/core/operator/tests/test_core.py +64 -0
- maxframe/core/tests/__init__.py +13 -0
- maxframe/core/tests/test_mode.py +75 -0
- maxframe/dataframe/__init__.py +81 -0
- maxframe/dataframe/arithmetic/__init__.py +359 -0
- maxframe/dataframe/arithmetic/abs.py +33 -0
- maxframe/dataframe/arithmetic/add.py +60 -0
- maxframe/dataframe/arithmetic/arccos.py +28 -0
- maxframe/dataframe/arithmetic/arccosh.py +28 -0
- maxframe/dataframe/arithmetic/arcsin.py +28 -0
- maxframe/dataframe/arithmetic/arcsinh.py +28 -0
- maxframe/dataframe/arithmetic/arctan.py +28 -0
- maxframe/dataframe/arithmetic/arctanh.py +28 -0
- maxframe/dataframe/arithmetic/around.py +152 -0
- maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
- maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
- maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
- maxframe/dataframe/arithmetic/ceil.py +28 -0
- maxframe/dataframe/arithmetic/core.py +342 -0
- maxframe/dataframe/arithmetic/cos.py +28 -0
- maxframe/dataframe/arithmetic/cosh.py +28 -0
- maxframe/dataframe/arithmetic/degrees.py +28 -0
- maxframe/dataframe/arithmetic/docstring.py +442 -0
- maxframe/dataframe/arithmetic/equal.py +56 -0
- maxframe/dataframe/arithmetic/exp.py +28 -0
- maxframe/dataframe/arithmetic/exp2.py +28 -0
- maxframe/dataframe/arithmetic/expm1.py +28 -0
- maxframe/dataframe/arithmetic/floor.py +28 -0
- maxframe/dataframe/arithmetic/floordiv.py +64 -0
- maxframe/dataframe/arithmetic/greater.py +57 -0
- maxframe/dataframe/arithmetic/greater_equal.py +57 -0
- maxframe/dataframe/arithmetic/invert.py +33 -0
- maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
- maxframe/dataframe/arithmetic/less.py +57 -0
- maxframe/dataframe/arithmetic/less_equal.py +57 -0
- maxframe/dataframe/arithmetic/log.py +28 -0
- maxframe/dataframe/arithmetic/log10.py +28 -0
- maxframe/dataframe/arithmetic/log2.py +28 -0
- maxframe/dataframe/arithmetic/mod.py +60 -0
- maxframe/dataframe/arithmetic/multiply.py +60 -0
- maxframe/dataframe/arithmetic/negative.py +33 -0
- maxframe/dataframe/arithmetic/not_equal.py +56 -0
- maxframe/dataframe/arithmetic/power.py +68 -0
- maxframe/dataframe/arithmetic/radians.py +28 -0
- maxframe/dataframe/arithmetic/sin.py +28 -0
- maxframe/dataframe/arithmetic/sinh.py +28 -0
- maxframe/dataframe/arithmetic/sqrt.py +28 -0
- maxframe/dataframe/arithmetic/subtract.py +64 -0
- maxframe/dataframe/arithmetic/tan.py +28 -0
- maxframe/dataframe/arithmetic/tanh.py +28 -0
- maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
- maxframe/dataframe/arithmetic/truediv.py +64 -0
- maxframe/dataframe/arithmetic/trunc.py +28 -0
- maxframe/dataframe/arrays.py +864 -0
- maxframe/dataframe/core.py +2417 -0
- maxframe/dataframe/datasource/__init__.py +15 -0
- maxframe/dataframe/datasource/core.py +81 -0
- maxframe/dataframe/datasource/dataframe.py +59 -0
- maxframe/dataframe/datasource/date_range.py +504 -0
- maxframe/dataframe/datasource/from_index.py +54 -0
- maxframe/dataframe/datasource/from_records.py +107 -0
- maxframe/dataframe/datasource/from_tensor.py +419 -0
- maxframe/dataframe/datasource/index.py +117 -0
- maxframe/dataframe/datasource/read_csv.py +528 -0
- maxframe/dataframe/datasource/read_odps_query.py +299 -0
- maxframe/dataframe/datasource/read_odps_table.py +253 -0
- maxframe/dataframe/datasource/read_parquet.py +421 -0
- maxframe/dataframe/datasource/series.py +55 -0
- maxframe/dataframe/datasource/tests/__init__.py +13 -0
- maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
- maxframe/dataframe/datastore/__init__.py +26 -0
- maxframe/dataframe/datastore/core.py +19 -0
- maxframe/dataframe/datastore/to_csv.py +227 -0
- maxframe/dataframe/datastore/to_odps.py +162 -0
- maxframe/dataframe/extensions/__init__.py +41 -0
- maxframe/dataframe/extensions/accessor.py +50 -0
- maxframe/dataframe/extensions/reshuffle.py +83 -0
- maxframe/dataframe/extensions/tests/__init__.py +13 -0
- maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
- maxframe/dataframe/fetch/__init__.py +15 -0
- maxframe/dataframe/fetch/core.py +86 -0
- maxframe/dataframe/groupby/__init__.py +82 -0
- maxframe/dataframe/groupby/aggregation.py +350 -0
- maxframe/dataframe/groupby/apply.py +251 -0
- maxframe/dataframe/groupby/core.py +179 -0
- maxframe/dataframe/groupby/cum.py +124 -0
- maxframe/dataframe/groupby/fill.py +141 -0
- maxframe/dataframe/groupby/getitem.py +92 -0
- maxframe/dataframe/groupby/head.py +105 -0
- maxframe/dataframe/groupby/sample.py +214 -0
- maxframe/dataframe/groupby/tests/__init__.py +13 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
- maxframe/dataframe/groupby/transform.py +255 -0
- maxframe/dataframe/indexing/__init__.py +84 -0
- maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
- maxframe/dataframe/indexing/align.py +349 -0
- maxframe/dataframe/indexing/at.py +83 -0
- maxframe/dataframe/indexing/getitem.py +204 -0
- maxframe/dataframe/indexing/iat.py +37 -0
- maxframe/dataframe/indexing/iloc.py +566 -0
- maxframe/dataframe/indexing/insert.py +86 -0
- maxframe/dataframe/indexing/loc.py +411 -0
- maxframe/dataframe/indexing/reindex.py +526 -0
- maxframe/dataframe/indexing/rename.py +462 -0
- maxframe/dataframe/indexing/rename_axis.py +209 -0
- maxframe/dataframe/indexing/reset_index.py +402 -0
- maxframe/dataframe/indexing/sample.py +221 -0
- maxframe/dataframe/indexing/set_axis.py +194 -0
- maxframe/dataframe/indexing/set_index.py +61 -0
- maxframe/dataframe/indexing/setitem.py +130 -0
- maxframe/dataframe/indexing/tests/__init__.py +13 -0
- maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
- maxframe/dataframe/indexing/where.py +308 -0
- maxframe/dataframe/initializer.py +288 -0
- maxframe/dataframe/merge/__init__.py +32 -0
- maxframe/dataframe/merge/append.py +121 -0
- maxframe/dataframe/merge/concat.py +325 -0
- maxframe/dataframe/merge/merge.py +593 -0
- maxframe/dataframe/merge/tests/__init__.py +13 -0
- maxframe/dataframe/merge/tests/test_merge.py +215 -0
- maxframe/dataframe/misc/__init__.py +134 -0
- maxframe/dataframe/misc/_duplicate.py +46 -0
- maxframe/dataframe/misc/accessor.py +276 -0
- maxframe/dataframe/misc/apply.py +692 -0
- maxframe/dataframe/misc/astype.py +236 -0
- maxframe/dataframe/misc/case_when.py +141 -0
- maxframe/dataframe/misc/check_monotonic.py +84 -0
- maxframe/dataframe/misc/cut.py +383 -0
- maxframe/dataframe/misc/datetimes.py +79 -0
- maxframe/dataframe/misc/describe.py +108 -0
- maxframe/dataframe/misc/diff.py +210 -0
- maxframe/dataframe/misc/drop.py +440 -0
- maxframe/dataframe/misc/drop_duplicates.py +248 -0
- maxframe/dataframe/misc/duplicated.py +292 -0
- maxframe/dataframe/misc/eval.py +728 -0
- maxframe/dataframe/misc/explode.py +171 -0
- maxframe/dataframe/misc/get_dummies.py +208 -0
- maxframe/dataframe/misc/isin.py +217 -0
- maxframe/dataframe/misc/map.py +236 -0
- maxframe/dataframe/misc/melt.py +162 -0
- maxframe/dataframe/misc/memory_usage.py +248 -0
- maxframe/dataframe/misc/pct_change.py +150 -0
- maxframe/dataframe/misc/pivot_table.py +262 -0
- maxframe/dataframe/misc/qcut.py +104 -0
- maxframe/dataframe/misc/select_dtypes.py +104 -0
- maxframe/dataframe/misc/shift.py +256 -0
- maxframe/dataframe/misc/stack.py +238 -0
- maxframe/dataframe/misc/string_.py +221 -0
- maxframe/dataframe/misc/tests/__init__.py +13 -0
- maxframe/dataframe/misc/tests/test_misc.py +468 -0
- maxframe/dataframe/misc/to_numeric.py +178 -0
- maxframe/dataframe/misc/transform.py +361 -0
- maxframe/dataframe/misc/transpose.py +136 -0
- maxframe/dataframe/misc/value_counts.py +182 -0
- maxframe/dataframe/missing/__init__.py +53 -0
- maxframe/dataframe/missing/checkna.py +223 -0
- maxframe/dataframe/missing/dropna.py +280 -0
- maxframe/dataframe/missing/fillna.py +275 -0
- maxframe/dataframe/missing/replace.py +439 -0
- maxframe/dataframe/missing/tests/__init__.py +13 -0
- maxframe/dataframe/missing/tests/test_missing.py +89 -0
- maxframe/dataframe/operators.py +273 -0
- maxframe/dataframe/plotting/__init__.py +40 -0
- maxframe/dataframe/plotting/core.py +78 -0
- maxframe/dataframe/plotting/tests/__init__.py +13 -0
- maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
- maxframe/dataframe/reduction/__init__.py +107 -0
- maxframe/dataframe/reduction/aggregation.py +344 -0
- maxframe/dataframe/reduction/all.py +78 -0
- maxframe/dataframe/reduction/any.py +78 -0
- maxframe/dataframe/reduction/core.py +837 -0
- maxframe/dataframe/reduction/count.py +59 -0
- maxframe/dataframe/reduction/cummax.py +30 -0
- maxframe/dataframe/reduction/cummin.py +30 -0
- maxframe/dataframe/reduction/cumprod.py +30 -0
- maxframe/dataframe/reduction/cumsum.py +30 -0
- maxframe/dataframe/reduction/custom_reduction.py +42 -0
- maxframe/dataframe/reduction/kurtosis.py +104 -0
- maxframe/dataframe/reduction/max.py +65 -0
- maxframe/dataframe/reduction/mean.py +61 -0
- maxframe/dataframe/reduction/min.py +65 -0
- maxframe/dataframe/reduction/nunique.py +141 -0
- maxframe/dataframe/reduction/prod.py +76 -0
- maxframe/dataframe/reduction/reduction_size.py +36 -0
- maxframe/dataframe/reduction/sem.py +69 -0
- maxframe/dataframe/reduction/skew.py +89 -0
- maxframe/dataframe/reduction/std.py +53 -0
- maxframe/dataframe/reduction/str_concat.py +48 -0
- maxframe/dataframe/reduction/sum.py +77 -0
- maxframe/dataframe/reduction/tests/__init__.py +13 -0
- maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
- maxframe/dataframe/reduction/unique.py +90 -0
- maxframe/dataframe/reduction/var.py +72 -0
- maxframe/dataframe/sort/__init__.py +34 -0
- maxframe/dataframe/sort/core.py +36 -0
- maxframe/dataframe/sort/sort_index.py +153 -0
- maxframe/dataframe/sort/sort_values.py +311 -0
- maxframe/dataframe/sort/tests/__init__.py +13 -0
- maxframe/dataframe/sort/tests/test_sort.py +81 -0
- maxframe/dataframe/statistics/__init__.py +33 -0
- maxframe/dataframe/statistics/corr.py +280 -0
- maxframe/dataframe/statistics/quantile.py +341 -0
- maxframe/dataframe/statistics/tests/__init__.py +13 -0
- maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
- maxframe/dataframe/tests/__init__.py +13 -0
- maxframe/dataframe/tests/test_initializer.py +29 -0
- maxframe/dataframe/tseries/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
- maxframe/dataframe/tseries/to_datetime.py +297 -0
- maxframe/dataframe/ufunc/__init__.py +27 -0
- maxframe/dataframe/ufunc/tensor.py +54 -0
- maxframe/dataframe/ufunc/ufunc.py +52 -0
- maxframe/dataframe/utils.py +1267 -0
- maxframe/dataframe/window/__init__.py +29 -0
- maxframe/dataframe/window/aggregation.py +96 -0
- maxframe/dataframe/window/core.py +69 -0
- maxframe/dataframe/window/ewm.py +249 -0
- maxframe/dataframe/window/expanding.py +147 -0
- maxframe/dataframe/window/rolling.py +376 -0
- maxframe/dataframe/window/tests/__init__.py +13 -0
- maxframe/dataframe/window/tests/test_ewm.py +70 -0
- maxframe/dataframe/window/tests/test_expanding.py +66 -0
- maxframe/dataframe/window/tests/test_rolling.py +57 -0
- maxframe/env.py +33 -0
- maxframe/errors.py +21 -0
- maxframe/extension.py +81 -0
- maxframe/learn/__init__.py +17 -0
- maxframe/learn/contrib/__init__.py +17 -0
- maxframe/learn/contrib/pytorch/__init__.py +16 -0
- maxframe/learn/contrib/pytorch/run_function.py +110 -0
- maxframe/learn/contrib/pytorch/run_script.py +102 -0
- maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
- maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
- maxframe/learn/contrib/utils.py +52 -0
- maxframe/learn/contrib/xgboost/__init__.py +26 -0
- maxframe/learn/contrib/xgboost/classifier.py +86 -0
- maxframe/learn/contrib/xgboost/core.py +156 -0
- maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
- maxframe/learn/contrib/xgboost/predict.py +138 -0
- maxframe/learn/contrib/xgboost/regressor.py +78 -0
- maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
- maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
- maxframe/learn/contrib/xgboost/train.py +121 -0
- maxframe/learn/utils/__init__.py +15 -0
- maxframe/learn/utils/core.py +29 -0
- maxframe/lib/__init__.py +15 -0
- maxframe/lib/aio/__init__.py +27 -0
- maxframe/lib/aio/_runners.py +162 -0
- maxframe/lib/aio/_threads.py +35 -0
- maxframe/lib/aio/base.py +82 -0
- maxframe/lib/aio/file.py +85 -0
- maxframe/lib/aio/isolation.py +100 -0
- maxframe/lib/aio/lru.py +242 -0
- maxframe/lib/aio/parallelism.py +37 -0
- maxframe/lib/aio/tests/__init__.py +13 -0
- maxframe/lib/aio/tests/test_aio_file.py +55 -0
- maxframe/lib/compression.py +55 -0
- maxframe/lib/cython/__init__.py +13 -0
- maxframe/lib/cython/libcpp.pxd +30 -0
- maxframe/lib/filesystem/__init__.py +21 -0
- maxframe/lib/filesystem/_glob.py +173 -0
- maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
- maxframe/lib/filesystem/_oss_lib/common.py +198 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
- maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
- maxframe/lib/filesystem/arrow.py +236 -0
- maxframe/lib/filesystem/base.py +263 -0
- maxframe/lib/filesystem/core.py +95 -0
- maxframe/lib/filesystem/fsmap.py +164 -0
- maxframe/lib/filesystem/hdfs.py +31 -0
- maxframe/lib/filesystem/local.py +112 -0
- maxframe/lib/filesystem/oss.py +157 -0
- maxframe/lib/filesystem/tests/__init__.py +13 -0
- maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
- maxframe/lib/filesystem/tests/test_oss.py +182 -0
- maxframe/lib/functools_compat.py +81 -0
- maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
- maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
- maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
- maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
- maxframe/lib/sparse/__init__.py +861 -0
- maxframe/lib/sparse/array.py +1604 -0
- maxframe/lib/sparse/core.py +92 -0
- maxframe/lib/sparse/matrix.py +241 -0
- maxframe/lib/sparse/tests/__init__.py +15 -0
- maxframe/lib/sparse/tests/test_sparse.py +476 -0
- maxframe/lib/sparse/vector.py +150 -0
- maxframe/lib/tblib/LICENSE +20 -0
- maxframe/lib/tblib/__init__.py +327 -0
- maxframe/lib/tblib/cpython.py +83 -0
- maxframe/lib/tblib/decorators.py +44 -0
- maxframe/lib/tblib/pickling_support.py +90 -0
- maxframe/lib/tests/__init__.py +13 -0
- maxframe/lib/tests/test_wrapped_pickle.py +51 -0
- maxframe/lib/version.py +620 -0
- maxframe/lib/wrapped_pickle.py +139 -0
- maxframe/mixin.py +100 -0
- maxframe/odpsio/__init__.py +21 -0
- maxframe/odpsio/arrow.py +91 -0
- maxframe/odpsio/schema.py +364 -0
- maxframe/odpsio/tableio.py +322 -0
- maxframe/odpsio/tests/__init__.py +13 -0
- maxframe/odpsio/tests/test_arrow.py +88 -0
- maxframe/odpsio/tests/test_schema.py +297 -0
- maxframe/odpsio/tests/test_tableio.py +136 -0
- maxframe/odpsio/tests/test_volumeio.py +90 -0
- maxframe/odpsio/volumeio.py +95 -0
- maxframe/opcodes.py +590 -0
- maxframe/protocol.py +415 -0
- maxframe/remote/__init__.py +18 -0
- maxframe/remote/core.py +210 -0
- maxframe/remote/run_script.py +121 -0
- maxframe/serialization/__init__.py +26 -0
- maxframe/serialization/arrow.py +95 -0
- maxframe/serialization/core.cpython-310-darwin.so +0 -0
- maxframe/serialization/core.pxd +44 -0
- maxframe/serialization/core.pyi +61 -0
- maxframe/serialization/core.pyx +1094 -0
- maxframe/serialization/exception.py +86 -0
- maxframe/serialization/maxframe_objects.py +39 -0
- maxframe/serialization/numpy.py +91 -0
- maxframe/serialization/pandas.py +202 -0
- maxframe/serialization/scipy.py +71 -0
- maxframe/serialization/serializables/__init__.py +55 -0
- maxframe/serialization/serializables/core.py +262 -0
- maxframe/serialization/serializables/field.py +624 -0
- maxframe/serialization/serializables/field_type.py +589 -0
- maxframe/serialization/serializables/tests/__init__.py +13 -0
- maxframe/serialization/serializables/tests/test_field_type.py +121 -0
- maxframe/serialization/serializables/tests/test_serializable.py +250 -0
- maxframe/serialization/tests/__init__.py +13 -0
- maxframe/serialization/tests/test_serial.py +412 -0
- maxframe/session.py +1310 -0
- maxframe/tensor/__init__.py +183 -0
- maxframe/tensor/arithmetic/__init__.py +315 -0
- maxframe/tensor/arithmetic/abs.py +68 -0
- maxframe/tensor/arithmetic/absolute.py +68 -0
- maxframe/tensor/arithmetic/add.py +82 -0
- maxframe/tensor/arithmetic/angle.py +72 -0
- maxframe/tensor/arithmetic/arccos.py +104 -0
- maxframe/tensor/arithmetic/arccosh.py +91 -0
- maxframe/tensor/arithmetic/arcsin.py +94 -0
- maxframe/tensor/arithmetic/arcsinh.py +86 -0
- maxframe/tensor/arithmetic/arctan.py +106 -0
- maxframe/tensor/arithmetic/arctan2.py +128 -0
- maxframe/tensor/arithmetic/arctanh.py +86 -0
- maxframe/tensor/arithmetic/around.py +114 -0
- maxframe/tensor/arithmetic/bitand.py +95 -0
- maxframe/tensor/arithmetic/bitor.py +102 -0
- maxframe/tensor/arithmetic/bitxor.py +95 -0
- maxframe/tensor/arithmetic/cbrt.py +66 -0
- maxframe/tensor/arithmetic/ceil.py +71 -0
- maxframe/tensor/arithmetic/clip.py +165 -0
- maxframe/tensor/arithmetic/conj.py +74 -0
- maxframe/tensor/arithmetic/copysign.py +78 -0
- maxframe/tensor/arithmetic/core.py +544 -0
- maxframe/tensor/arithmetic/cos.py +85 -0
- maxframe/tensor/arithmetic/cosh.py +72 -0
- maxframe/tensor/arithmetic/deg2rad.py +72 -0
- maxframe/tensor/arithmetic/degrees.py +77 -0
- maxframe/tensor/arithmetic/divide.py +114 -0
- maxframe/tensor/arithmetic/equal.py +76 -0
- maxframe/tensor/arithmetic/exp.py +106 -0
- maxframe/tensor/arithmetic/exp2.py +67 -0
- maxframe/tensor/arithmetic/expm1.py +79 -0
- maxframe/tensor/arithmetic/fabs.py +74 -0
- maxframe/tensor/arithmetic/fix.py +69 -0
- maxframe/tensor/arithmetic/float_power.py +103 -0
- maxframe/tensor/arithmetic/floor.py +77 -0
- maxframe/tensor/arithmetic/floordiv.py +94 -0
- maxframe/tensor/arithmetic/fmax.py +105 -0
- maxframe/tensor/arithmetic/fmin.py +106 -0
- maxframe/tensor/arithmetic/fmod.py +99 -0
- maxframe/tensor/arithmetic/frexp.py +92 -0
- maxframe/tensor/arithmetic/greater.py +77 -0
- maxframe/tensor/arithmetic/greater_equal.py +69 -0
- maxframe/tensor/arithmetic/hypot.py +77 -0
- maxframe/tensor/arithmetic/i0.py +89 -0
- maxframe/tensor/arithmetic/imag.py +67 -0
- maxframe/tensor/arithmetic/invert.py +110 -0
- maxframe/tensor/arithmetic/isclose.py +115 -0
- maxframe/tensor/arithmetic/iscomplex.py +64 -0
- maxframe/tensor/arithmetic/isfinite.py +106 -0
- maxframe/tensor/arithmetic/isinf.py +103 -0
- maxframe/tensor/arithmetic/isnan.py +82 -0
- maxframe/tensor/arithmetic/isreal.py +63 -0
- maxframe/tensor/arithmetic/ldexp.py +99 -0
- maxframe/tensor/arithmetic/less.py +69 -0
- maxframe/tensor/arithmetic/less_equal.py +69 -0
- maxframe/tensor/arithmetic/log.py +92 -0
- maxframe/tensor/arithmetic/log10.py +85 -0
- maxframe/tensor/arithmetic/log1p.py +95 -0
- maxframe/tensor/arithmetic/log2.py +85 -0
- maxframe/tensor/arithmetic/logaddexp.py +80 -0
- maxframe/tensor/arithmetic/logaddexp2.py +78 -0
- maxframe/tensor/arithmetic/logical_and.py +81 -0
- maxframe/tensor/arithmetic/logical_not.py +74 -0
- maxframe/tensor/arithmetic/logical_or.py +82 -0
- maxframe/tensor/arithmetic/logical_xor.py +88 -0
- maxframe/tensor/arithmetic/lshift.py +82 -0
- maxframe/tensor/arithmetic/maximum.py +108 -0
- maxframe/tensor/arithmetic/minimum.py +108 -0
- maxframe/tensor/arithmetic/mod.py +104 -0
- maxframe/tensor/arithmetic/modf.py +83 -0
- maxframe/tensor/arithmetic/multiply.py +81 -0
- maxframe/tensor/arithmetic/nan_to_num.py +99 -0
- maxframe/tensor/arithmetic/negative.py +65 -0
- maxframe/tensor/arithmetic/nextafter.py +68 -0
- maxframe/tensor/arithmetic/not_equal.py +72 -0
- maxframe/tensor/arithmetic/positive.py +47 -0
- maxframe/tensor/arithmetic/power.py +106 -0
- maxframe/tensor/arithmetic/rad2deg.py +71 -0
- maxframe/tensor/arithmetic/radians.py +77 -0
- maxframe/tensor/arithmetic/real.py +70 -0
- maxframe/tensor/arithmetic/reciprocal.py +76 -0
- maxframe/tensor/arithmetic/rint.py +68 -0
- maxframe/tensor/arithmetic/rshift.py +81 -0
- maxframe/tensor/arithmetic/setimag.py +29 -0
- maxframe/tensor/arithmetic/setreal.py +29 -0
- maxframe/tensor/arithmetic/sign.py +81 -0
- maxframe/tensor/arithmetic/signbit.py +65 -0
- maxframe/tensor/arithmetic/sin.py +98 -0
- maxframe/tensor/arithmetic/sinc.py +102 -0
- maxframe/tensor/arithmetic/sinh.py +93 -0
- maxframe/tensor/arithmetic/spacing.py +72 -0
- maxframe/tensor/arithmetic/sqrt.py +81 -0
- maxframe/tensor/arithmetic/square.py +69 -0
- maxframe/tensor/arithmetic/subtract.py +81 -0
- maxframe/tensor/arithmetic/tan.py +88 -0
- maxframe/tensor/arithmetic/tanh.py +92 -0
- maxframe/tensor/arithmetic/tests/__init__.py +15 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
- maxframe/tensor/arithmetic/truediv.py +104 -0
- maxframe/tensor/arithmetic/trunc.py +72 -0
- maxframe/tensor/arithmetic/utils.py +65 -0
- maxframe/tensor/array_utils.py +186 -0
- maxframe/tensor/base/__init__.py +34 -0
- maxframe/tensor/base/astype.py +119 -0
- maxframe/tensor/base/atleast_1d.py +74 -0
- maxframe/tensor/base/broadcast_to.py +89 -0
- maxframe/tensor/base/ravel.py +92 -0
- maxframe/tensor/base/tests/__init__.py +13 -0
- maxframe/tensor/base/tests/test_base.py +114 -0
- maxframe/tensor/base/transpose.py +125 -0
- maxframe/tensor/base/unique.py +205 -0
- maxframe/tensor/base/where.py +127 -0
- maxframe/tensor/core.py +724 -0
- maxframe/tensor/datasource/__init__.py +32 -0
- maxframe/tensor/datasource/arange.py +156 -0
- maxframe/tensor/datasource/array.py +415 -0
- maxframe/tensor/datasource/core.py +109 -0
- maxframe/tensor/datasource/empty.py +169 -0
- maxframe/tensor/datasource/from_dataframe.py +70 -0
- maxframe/tensor/datasource/from_dense.py +54 -0
- maxframe/tensor/datasource/from_sparse.py +47 -0
- maxframe/tensor/datasource/full.py +186 -0
- maxframe/tensor/datasource/ones.py +173 -0
- maxframe/tensor/datasource/scalar.py +40 -0
- maxframe/tensor/datasource/tests/__init__.py +13 -0
- maxframe/tensor/datasource/tests/test_datasource.py +278 -0
- maxframe/tensor/datasource/zeros.py +188 -0
- maxframe/tensor/fetch/__init__.py +15 -0
- maxframe/tensor/fetch/core.py +54 -0
- maxframe/tensor/indexing/__init__.py +47 -0
- maxframe/tensor/indexing/choose.py +196 -0
- maxframe/tensor/indexing/compress.py +124 -0
- maxframe/tensor/indexing/core.py +190 -0
- maxframe/tensor/indexing/extract.py +71 -0
- maxframe/tensor/indexing/fill_diagonal.py +183 -0
- maxframe/tensor/indexing/flatnonzero.py +60 -0
- maxframe/tensor/indexing/getitem.py +175 -0
- maxframe/tensor/indexing/nonzero.py +120 -0
- maxframe/tensor/indexing/setitem.py +132 -0
- maxframe/tensor/indexing/slice.py +29 -0
- maxframe/tensor/indexing/take.py +130 -0
- maxframe/tensor/indexing/tests/__init__.py +15 -0
- maxframe/tensor/indexing/tests/test_indexing.py +234 -0
- maxframe/tensor/indexing/unravel_index.py +103 -0
- maxframe/tensor/merge/__init__.py +15 -0
- maxframe/tensor/merge/stack.py +132 -0
- maxframe/tensor/merge/tests/__init__.py +13 -0
- maxframe/tensor/merge/tests/test_merge.py +52 -0
- maxframe/tensor/operators.py +123 -0
- maxframe/tensor/random/__init__.py +168 -0
- maxframe/tensor/random/beta.py +87 -0
- maxframe/tensor/random/binomial.py +137 -0
- maxframe/tensor/random/bytes.py +39 -0
- maxframe/tensor/random/chisquare.py +110 -0
- maxframe/tensor/random/choice.py +186 -0
- maxframe/tensor/random/core.py +234 -0
- maxframe/tensor/random/dirichlet.py +123 -0
- maxframe/tensor/random/exponential.py +94 -0
- maxframe/tensor/random/f.py +135 -0
- maxframe/tensor/random/gamma.py +128 -0
- maxframe/tensor/random/geometric.py +93 -0
- maxframe/tensor/random/gumbel.py +167 -0
- maxframe/tensor/random/hypergeometric.py +148 -0
- maxframe/tensor/random/laplace.py +133 -0
- maxframe/tensor/random/logistic.py +129 -0
- maxframe/tensor/random/lognormal.py +159 -0
- maxframe/tensor/random/logseries.py +122 -0
- maxframe/tensor/random/multinomial.py +133 -0
- maxframe/tensor/random/multivariate_normal.py +192 -0
- maxframe/tensor/random/negative_binomial.py +125 -0
- maxframe/tensor/random/noncentral_chisquare.py +132 -0
- maxframe/tensor/random/noncentral_f.py +126 -0
- maxframe/tensor/random/normal.py +143 -0
- maxframe/tensor/random/pareto.py +140 -0
- maxframe/tensor/random/permutation.py +104 -0
- maxframe/tensor/random/poisson.py +111 -0
- maxframe/tensor/random/power.py +142 -0
- maxframe/tensor/random/rand.py +82 -0
- maxframe/tensor/random/randint.py +121 -0
- maxframe/tensor/random/randn.py +96 -0
- maxframe/tensor/random/random_integers.py +123 -0
- maxframe/tensor/random/random_sample.py +86 -0
- maxframe/tensor/random/rayleigh.py +110 -0
- maxframe/tensor/random/shuffle.py +61 -0
- maxframe/tensor/random/standard_cauchy.py +105 -0
- maxframe/tensor/random/standard_exponential.py +72 -0
- maxframe/tensor/random/standard_gamma.py +120 -0
- maxframe/tensor/random/standard_normal.py +74 -0
- maxframe/tensor/random/standard_t.py +135 -0
- maxframe/tensor/random/tests/__init__.py +15 -0
- maxframe/tensor/random/tests/test_random.py +167 -0
- maxframe/tensor/random/triangular.py +119 -0
- maxframe/tensor/random/uniform.py +131 -0
- maxframe/tensor/random/vonmises.py +131 -0
- maxframe/tensor/random/wald.py +114 -0
- maxframe/tensor/random/weibull.py +140 -0
- maxframe/tensor/random/zipf.py +122 -0
- maxframe/tensor/rechunk/__init__.py +26 -0
- maxframe/tensor/rechunk/rechunk.py +43 -0
- maxframe/tensor/reduction/__init__.py +66 -0
- maxframe/tensor/reduction/all.py +103 -0
- maxframe/tensor/reduction/allclose.py +88 -0
- maxframe/tensor/reduction/any.py +105 -0
- maxframe/tensor/reduction/argmax.py +103 -0
- maxframe/tensor/reduction/argmin.py +103 -0
- maxframe/tensor/reduction/array_equal.py +64 -0
- maxframe/tensor/reduction/core.py +168 -0
- maxframe/tensor/reduction/count_nonzero.py +81 -0
- maxframe/tensor/reduction/cumprod.py +97 -0
- maxframe/tensor/reduction/cumsum.py +101 -0
- maxframe/tensor/reduction/max.py +120 -0
- maxframe/tensor/reduction/mean.py +123 -0
- maxframe/tensor/reduction/min.py +120 -0
- maxframe/tensor/reduction/nanargmax.py +82 -0
- maxframe/tensor/reduction/nanargmin.py +76 -0
- maxframe/tensor/reduction/nancumprod.py +91 -0
- maxframe/tensor/reduction/nancumsum.py +94 -0
- maxframe/tensor/reduction/nanmax.py +111 -0
- maxframe/tensor/reduction/nanmean.py +106 -0
- maxframe/tensor/reduction/nanmin.py +111 -0
- maxframe/tensor/reduction/nanprod.py +94 -0
- maxframe/tensor/reduction/nanstd.py +126 -0
- maxframe/tensor/reduction/nansum.py +115 -0
- maxframe/tensor/reduction/nanvar.py +149 -0
- maxframe/tensor/reduction/prod.py +130 -0
- maxframe/tensor/reduction/std.py +134 -0
- maxframe/tensor/reduction/sum.py +125 -0
- maxframe/tensor/reduction/tests/__init__.py +13 -0
- maxframe/tensor/reduction/tests/test_reduction.py +181 -0
- maxframe/tensor/reduction/var.py +176 -0
- maxframe/tensor/reshape/__init__.py +17 -0
- maxframe/tensor/reshape/reshape.py +188 -0
- maxframe/tensor/reshape/tests/__init__.py +15 -0
- maxframe/tensor/reshape/tests/test_reshape.py +37 -0
- maxframe/tensor/statistics/__init__.py +13 -0
- maxframe/tensor/statistics/percentile.py +175 -0
- maxframe/tensor/statistics/quantile.py +288 -0
- maxframe/tensor/ufunc/__init__.py +26 -0
- maxframe/tensor/ufunc/ufunc.py +200 -0
- maxframe/tensor/utils.py +718 -0
- maxframe/tests/__init__.py +13 -0
- maxframe/tests/test_codegen.py +69 -0
- maxframe/tests/test_protocol.py +144 -0
- maxframe/tests/test_utils.py +376 -0
- maxframe/tests/utils.py +164 -0
- maxframe/typing_.py +37 -0
- maxframe/udf.py +134 -0
- maxframe/utils.py +1114 -0
- maxframe-0.1.0b5.dist-info/METADATA +104 -0
- maxframe-0.1.0b5.dist-info/RECORD +647 -0
- maxframe-0.1.0b5.dist-info/WHEEL +5 -0
- maxframe-0.1.0b5.dist-info/top_level.txt +3 -0
- maxframe_client/__init__.py +17 -0
- maxframe_client/clients/__init__.py +13 -0
- maxframe_client/clients/framedriver.py +118 -0
- maxframe_client/clients/spe.py +104 -0
- maxframe_client/conftest.py +15 -0
- maxframe_client/fetcher.py +264 -0
- maxframe_client/session/__init__.py +22 -0
- maxframe_client/session/consts.py +36 -0
- maxframe_client/session/graph.py +119 -0
- maxframe_client/session/odps.py +482 -0
- maxframe_client/session/task.py +280 -0
- maxframe_client/session/tests/__init__.py +13 -0
- maxframe_client/session/tests/test_task.py +85 -0
- maxframe_client/tests/__init__.py +13 -0
- maxframe_client/tests/test_fetcher.py +89 -0
- maxframe_client/tests/test_session.py +255 -0
|
@@ -0,0 +1,337 @@
|
|
|
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 asyncio
|
|
16
|
+
import atexit
|
|
17
|
+
import concurrent.futures
|
|
18
|
+
import queue
|
|
19
|
+
import threading
|
|
20
|
+
from typing import List
|
|
21
|
+
from weakref import WeakKeyDictionary, ref
|
|
22
|
+
|
|
23
|
+
from ...lib.aio import get_isolation
|
|
24
|
+
from ...typing_ import SessionType, TileableType
|
|
25
|
+
from ..mode import enter_mode
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class DecrefRunner:
|
|
29
|
+
def __init__(self):
|
|
30
|
+
self._decref_thread = None
|
|
31
|
+
self._queue = queue.Queue()
|
|
32
|
+
|
|
33
|
+
def start(self):
|
|
34
|
+
self._decref_thread = threading.Thread(
|
|
35
|
+
target=self._thread_body, name="DecrefThread"
|
|
36
|
+
)
|
|
37
|
+
self._decref_thread.daemon = True
|
|
38
|
+
self._decref_thread.start()
|
|
39
|
+
|
|
40
|
+
def _thread_body(self):
|
|
41
|
+
from ...session import SyncSession
|
|
42
|
+
|
|
43
|
+
while True:
|
|
44
|
+
key, session_ref, fut = self._queue.get()
|
|
45
|
+
if key is None:
|
|
46
|
+
break
|
|
47
|
+
|
|
48
|
+
session = session_ref()
|
|
49
|
+
if session is None:
|
|
50
|
+
fut.set_result(None)
|
|
51
|
+
continue
|
|
52
|
+
try:
|
|
53
|
+
s = SyncSession.from_isolated_session(session)
|
|
54
|
+
s.decref(key)
|
|
55
|
+
fut.set_result(None)
|
|
56
|
+
except (RuntimeError, ConnectionError, KeyError):
|
|
57
|
+
fut.set_result(None)
|
|
58
|
+
except (
|
|
59
|
+
Exception
|
|
60
|
+
) as ex: # pragma: no cover # noqa: E722 # nosec # pylint: disable=bare-except
|
|
61
|
+
fut.set_exception(ex)
|
|
62
|
+
finally:
|
|
63
|
+
del session
|
|
64
|
+
|
|
65
|
+
def stop(self):
|
|
66
|
+
if self._decref_thread: # pragma: no branch
|
|
67
|
+
self._queue.put_nowait((None, None, None))
|
|
68
|
+
self._decref_thread.join(1)
|
|
69
|
+
self._decref_thread = None
|
|
70
|
+
|
|
71
|
+
def put(self, key: str, session_ref: ref):
|
|
72
|
+
if self._decref_thread is None:
|
|
73
|
+
self.start()
|
|
74
|
+
|
|
75
|
+
fut = concurrent.futures.Future()
|
|
76
|
+
self._queue.put_nowait((key, session_ref, fut))
|
|
77
|
+
return fut
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
_decref_runner = DecrefRunner()
|
|
81
|
+
atexit.register(_decref_runner.stop)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class _TileableSession:
|
|
85
|
+
def __init__(self, tileable: TileableType, session: SessionType):
|
|
86
|
+
self._sess_id = id(session)
|
|
87
|
+
key = tileable.key
|
|
88
|
+
|
|
89
|
+
def cb(_, sess=ref(session)):
|
|
90
|
+
try:
|
|
91
|
+
cur_thread_ident = threading.current_thread().ident
|
|
92
|
+
decref_in_isolation = get_isolation().thread_ident == cur_thread_ident
|
|
93
|
+
except KeyError:
|
|
94
|
+
# isolation destroyed, no need to decref
|
|
95
|
+
return
|
|
96
|
+
|
|
97
|
+
fut = _decref_runner.put(key, sess)
|
|
98
|
+
if not decref_in_isolation:
|
|
99
|
+
# if decref in isolation, means that this tileable
|
|
100
|
+
# is not required for main thread, thus we do not need
|
|
101
|
+
# to wait for decref, otherwise, wait a bit
|
|
102
|
+
try:
|
|
103
|
+
fut.result(0.5)
|
|
104
|
+
except concurrent.futures.TimeoutError:
|
|
105
|
+
# ignore timeout
|
|
106
|
+
pass
|
|
107
|
+
|
|
108
|
+
self.tileable = ref(tileable, cb)
|
|
109
|
+
|
|
110
|
+
def __eq__(self, other: "_TileableSession"):
|
|
111
|
+
return self._sess_id == other._sess_id
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
class _TileableDataCleaner:
|
|
115
|
+
def __init__(self):
|
|
116
|
+
self._tileable_to_sessions = WeakKeyDictionary()
|
|
117
|
+
|
|
118
|
+
@enter_mode(build=True)
|
|
119
|
+
def register(self, tileable: TileableType, session: SessionType):
|
|
120
|
+
if tileable in self._tileable_to_sessions:
|
|
121
|
+
self._tileable_to_sessions[tileable].append(
|
|
122
|
+
_TileableSession(tileable, session)
|
|
123
|
+
)
|
|
124
|
+
else:
|
|
125
|
+
self._tileable_to_sessions[tileable] = [_TileableSession(tileable, session)]
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
# we don't use __del__ to avoid potential Circular reference
|
|
129
|
+
_cleaner = _TileableDataCleaner()
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def _get_session(executable: "_ExecutableMixin", session: SessionType = None):
|
|
133
|
+
from ...session import get_default_session
|
|
134
|
+
|
|
135
|
+
# if session is not specified, use default session
|
|
136
|
+
if session is None:
|
|
137
|
+
session = get_default_session()
|
|
138
|
+
|
|
139
|
+
return session
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class _ExecutableMixin:
|
|
143
|
+
__slots__ = ()
|
|
144
|
+
_executed_sessions: List[SessionType]
|
|
145
|
+
|
|
146
|
+
def execute(self, session: SessionType = None, **kw):
|
|
147
|
+
from ...session import execute
|
|
148
|
+
|
|
149
|
+
session = _get_session(self, session)
|
|
150
|
+
return execute(self, session=session, **kw)
|
|
151
|
+
|
|
152
|
+
def _check_session(self, session: SessionType, action: str):
|
|
153
|
+
if session is None:
|
|
154
|
+
if isinstance(self, tuple):
|
|
155
|
+
key = self[0].key
|
|
156
|
+
else:
|
|
157
|
+
key = self.key
|
|
158
|
+
raise ValueError(
|
|
159
|
+
f"Tileable object {key} must be executed first before {action}"
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
def _fetch(self, session: SessionType = None, **kw):
|
|
163
|
+
from ...session import fetch
|
|
164
|
+
|
|
165
|
+
session = _get_session(self, session)
|
|
166
|
+
self._check_session(session, "fetch")
|
|
167
|
+
return fetch(self, session=session, **kw)
|
|
168
|
+
|
|
169
|
+
def fetch(self, session: SessionType = None, **kw):
|
|
170
|
+
return self._fetch(session=session, **kw)
|
|
171
|
+
|
|
172
|
+
def fetch_log(
|
|
173
|
+
self,
|
|
174
|
+
session: SessionType = None,
|
|
175
|
+
offsets: List[int] = None,
|
|
176
|
+
sizes: List[int] = None,
|
|
177
|
+
):
|
|
178
|
+
from ...session import fetch_log
|
|
179
|
+
|
|
180
|
+
session = _get_session(self, session)
|
|
181
|
+
self._check_session(session, "fetch_log")
|
|
182
|
+
return fetch_log(self, session=session, offsets=offsets, sizes=sizes)[0]
|
|
183
|
+
|
|
184
|
+
def _fetch_infos(self, fields=None, session=None, **kw):
|
|
185
|
+
from ...session import fetch_infos
|
|
186
|
+
|
|
187
|
+
session = _get_session(self, session)
|
|
188
|
+
self._check_session(session, "fetch_infos")
|
|
189
|
+
return fetch_infos(self, fields=fields, session=session, **kw)
|
|
190
|
+
|
|
191
|
+
def _attach_session(self, session: SessionType):
|
|
192
|
+
if session not in self._executed_sessions:
|
|
193
|
+
_cleaner.register(self, session)
|
|
194
|
+
self._executed_sessions.append(session)
|
|
195
|
+
|
|
196
|
+
def _detach_session(self, session: SessionType):
|
|
197
|
+
if session in self._executed_sessions:
|
|
198
|
+
sessions = _cleaner._tileable_to_sessions.get(self, [])
|
|
199
|
+
if sessions:
|
|
200
|
+
sessions.remove(_TileableSession(self, session))
|
|
201
|
+
if len(sessions) == 0:
|
|
202
|
+
del _cleaner._tileable_to_sessions[self]
|
|
203
|
+
self._executed_sessions.remove(session)
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
class _ExecuteAndFetchMixin:
|
|
207
|
+
__slots__ = ()
|
|
208
|
+
|
|
209
|
+
def _execute_and_fetch(self, session: SessionType = None, **kw):
|
|
210
|
+
from ...session import ExecutionInfo, SyncSession, fetch
|
|
211
|
+
|
|
212
|
+
session = _get_session(self, session)
|
|
213
|
+
fetch_kwargs = kw.pop("fetch_kwargs", dict())
|
|
214
|
+
if session in self._executed_sessions:
|
|
215
|
+
# if has been executed, fetch directly.
|
|
216
|
+
return self.fetch(session=session, **fetch_kwargs)
|
|
217
|
+
ret = self.execute(session=session, **kw)
|
|
218
|
+
if isinstance(ret, ExecutionInfo):
|
|
219
|
+
# wait=False
|
|
220
|
+
aio_task = ret.aio_task
|
|
221
|
+
|
|
222
|
+
async def _wait():
|
|
223
|
+
await aio_task
|
|
224
|
+
|
|
225
|
+
def run():
|
|
226
|
+
asyncio.run_coroutine_threadsafe(_wait(), loop=ret.loop).result()
|
|
227
|
+
return fetch(self, session=session, **fetch_kwargs)
|
|
228
|
+
|
|
229
|
+
return SyncSession._execution_pool.submit(run)
|
|
230
|
+
else:
|
|
231
|
+
# wait=True
|
|
232
|
+
return self.fetch(session=session, **fetch_kwargs)
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class _ToObjectMixin(_ExecuteAndFetchMixin):
|
|
236
|
+
__slots__ = ()
|
|
237
|
+
|
|
238
|
+
def to_object(self, session: SessionType = None, **kw):
|
|
239
|
+
return self._execute_and_fetch(session=session, **kw)
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
class ExecutableTuple(tuple, _ExecutableMixin, _ToObjectMixin):
|
|
243
|
+
def __init__(self, *args):
|
|
244
|
+
tuple.__init__(*args)
|
|
245
|
+
|
|
246
|
+
self._fields_to_idx = None
|
|
247
|
+
self._fields = None
|
|
248
|
+
self._raw_type = None
|
|
249
|
+
|
|
250
|
+
if len(args) == 1 and isinstance(args[0], tuple):
|
|
251
|
+
self._fields = getattr(args[0], "_fields", None)
|
|
252
|
+
if self._fields is not None:
|
|
253
|
+
self._raw_type = type(args[0])
|
|
254
|
+
self._fields_to_idx = {f: idx for idx, f in enumerate(self._fields)}
|
|
255
|
+
|
|
256
|
+
self._executed_sessions = []
|
|
257
|
+
|
|
258
|
+
def __getattr__(self, item):
|
|
259
|
+
if self._fields_to_idx is None or item not in self._fields_to_idx:
|
|
260
|
+
raise AttributeError(item)
|
|
261
|
+
return self[self._fields_to_idx[item]]
|
|
262
|
+
|
|
263
|
+
def __dir__(self):
|
|
264
|
+
result = list(super().__dir__()) + list(self._fields or [])
|
|
265
|
+
return sorted(result)
|
|
266
|
+
|
|
267
|
+
def __repr__(self):
|
|
268
|
+
if not self._fields:
|
|
269
|
+
return super().__repr__()
|
|
270
|
+
items = []
|
|
271
|
+
for k, v in zip(self._fields, self):
|
|
272
|
+
items.append(f"{k}={v!r}")
|
|
273
|
+
return "%s(%s)" % (self._raw_type.__name__, ", ".join(items))
|
|
274
|
+
|
|
275
|
+
def execute(self, session: SessionType = None, **kw):
|
|
276
|
+
from ...session import execute
|
|
277
|
+
|
|
278
|
+
if len(self) == 0:
|
|
279
|
+
return self
|
|
280
|
+
|
|
281
|
+
session = _get_session(self, session)
|
|
282
|
+
ret = execute(*self, session=session, **kw)
|
|
283
|
+
|
|
284
|
+
if session not in self._executed_sessions:
|
|
285
|
+
self._executed_sessions.append(session)
|
|
286
|
+
|
|
287
|
+
if kw.get("wait", True):
|
|
288
|
+
return self
|
|
289
|
+
else:
|
|
290
|
+
return ret
|
|
291
|
+
|
|
292
|
+
def _fetch(self, session: SessionType = None, **kw):
|
|
293
|
+
from ...session import fetch
|
|
294
|
+
|
|
295
|
+
session = _get_session(self, session)
|
|
296
|
+
self._check_session(session, "fetch")
|
|
297
|
+
return fetch(*self, session=session, **kw)
|
|
298
|
+
|
|
299
|
+
def _fetch_infos(self, fields=None, session=None, **kw):
|
|
300
|
+
from ...session import fetch_infos
|
|
301
|
+
|
|
302
|
+
session = _get_session(self, session)
|
|
303
|
+
self._check_session(session, "fetch_infos")
|
|
304
|
+
return fetch_infos(*self, fields=fields, session=session, **kw)
|
|
305
|
+
|
|
306
|
+
def fetch(self, session: SessionType = None, **kw):
|
|
307
|
+
if len(self) == 0:
|
|
308
|
+
return tuple()
|
|
309
|
+
|
|
310
|
+
session = _get_session(self, session)
|
|
311
|
+
ret = super().fetch(session=session, **kw)
|
|
312
|
+
if self._raw_type is not None:
|
|
313
|
+
ret = self._raw_type(*ret)
|
|
314
|
+
if len(self) == 1:
|
|
315
|
+
return (ret,)
|
|
316
|
+
return ret
|
|
317
|
+
|
|
318
|
+
def fetch_log(
|
|
319
|
+
self,
|
|
320
|
+
session: SessionType = None,
|
|
321
|
+
offsets: List[int] = None,
|
|
322
|
+
sizes: List[int] = None,
|
|
323
|
+
):
|
|
324
|
+
from ...session import fetch_log
|
|
325
|
+
|
|
326
|
+
if len(self) == 0:
|
|
327
|
+
return []
|
|
328
|
+
session = self._get_session(session=session)
|
|
329
|
+
return fetch_log(*self, session=session, offsets=offsets, sizes=sizes)
|
|
330
|
+
|
|
331
|
+
def _get_session(self, session: SessionType = None):
|
|
332
|
+
if session is None:
|
|
333
|
+
for item in self:
|
|
334
|
+
session = _get_session(item, session)
|
|
335
|
+
if session is not None:
|
|
336
|
+
return session
|
|
337
|
+
return session
|
|
@@ -0,0 +1,73 @@
|
|
|
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 numpy as np
|
|
16
|
+
|
|
17
|
+
from ...serialization.serializables import ReferenceField
|
|
18
|
+
from .chunks import CHUNK_TYPE, Chunk, ChunkData
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class FuseChunkData(ChunkData):
|
|
22
|
+
__slots__ = ("_inited",)
|
|
23
|
+
|
|
24
|
+
_chunk = ReferenceField(
|
|
25
|
+
"chunk", CHUNK_TYPE, on_serialize=lambda x: x.data if hasattr(x, "data") else x
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def __init__(self, *args, **kwargs):
|
|
29
|
+
self._inited = False
|
|
30
|
+
super().__init__(*args, **kwargs)
|
|
31
|
+
self._extra_params = {}
|
|
32
|
+
self._inited = True
|
|
33
|
+
|
|
34
|
+
@property
|
|
35
|
+
def chunk(self):
|
|
36
|
+
return self._chunk
|
|
37
|
+
|
|
38
|
+
@property
|
|
39
|
+
def composed(self):
|
|
40
|
+
# for compatibility, just return the topological ordering,
|
|
41
|
+
# once we apply optimization on the subgraph,
|
|
42
|
+
# `composed` is not needed any more and should be removed then.
|
|
43
|
+
assert getattr(self._op, "fuse_graph", None) is not None
|
|
44
|
+
fuse_graph = self._op.fuse_graph
|
|
45
|
+
return list(fuse_graph.topological_iter())
|
|
46
|
+
|
|
47
|
+
def __getattr__(self, attr):
|
|
48
|
+
if not self._inited:
|
|
49
|
+
return object.__getattribute__(self, attr)
|
|
50
|
+
if attr in self._extra_params:
|
|
51
|
+
return self._extra_params[attr]
|
|
52
|
+
try:
|
|
53
|
+
return getattr(self._chunk, attr)
|
|
54
|
+
except AttributeError:
|
|
55
|
+
return object.__getattribute__(self, attr)
|
|
56
|
+
|
|
57
|
+
def __setattr__(self, attr, value):
|
|
58
|
+
if attr == "params":
|
|
59
|
+
self._chunk.params = value
|
|
60
|
+
else:
|
|
61
|
+
super().__setattr__(attr, value)
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def nbytes(self):
|
|
65
|
+
return np.prod(self.shape) * self.dtype.itemsize
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class FuseChunk(Chunk):
|
|
69
|
+
__slots__ = ()
|
|
70
|
+
_allow_data_type_ = (FuseChunkData,)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
FUSE_CHUNK_TYPE = (FuseChunkData, FuseChunk)
|
|
@@ -0,0 +1,100 @@
|
|
|
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 typing import Any, Dict
|
|
16
|
+
|
|
17
|
+
from ...serialization.serializables import FieldTypes, ListField
|
|
18
|
+
from ...utils import skip_na_call
|
|
19
|
+
from .chunks import Chunk, ChunkData
|
|
20
|
+
from .core import Entity
|
|
21
|
+
from .executable import _ToObjectMixin
|
|
22
|
+
from .tileables import TileableData
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class ObjectChunkData(ChunkData):
|
|
26
|
+
# chunk whose data could be any serializable
|
|
27
|
+
__slots__ = ()
|
|
28
|
+
type_name = "Object"
|
|
29
|
+
|
|
30
|
+
def __init__(self, op=None, index=None, **kw):
|
|
31
|
+
super().__init__(_op=op, _index=index, **kw)
|
|
32
|
+
|
|
33
|
+
@property
|
|
34
|
+
def params(self) -> Dict[str, Any]:
|
|
35
|
+
# params return the properties which useful to rebuild a new chunk
|
|
36
|
+
return {
|
|
37
|
+
"index": self.index,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@params.setter
|
|
41
|
+
def params(self, new_params: Dict[str, Any]):
|
|
42
|
+
params = new_params.copy()
|
|
43
|
+
params.pop("index", None) # index not needed to update
|
|
44
|
+
if params: # pragma: no cover
|
|
45
|
+
raise TypeError(f"Unknown params: {list(params)}")
|
|
46
|
+
|
|
47
|
+
@classmethod
|
|
48
|
+
def get_params_from_data(cls, data: Any) -> Dict[str, Any]:
|
|
49
|
+
return dict()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class ObjectChunk(Chunk):
|
|
53
|
+
__slots__ = ()
|
|
54
|
+
_allow_data_type_ = (ObjectChunkData,)
|
|
55
|
+
type_name = "Object"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class ObjectData(TileableData, _ToObjectMixin):
|
|
59
|
+
__slots__ = ()
|
|
60
|
+
type_name = "Object"
|
|
61
|
+
|
|
62
|
+
# optional fields
|
|
63
|
+
_chunks = ListField(
|
|
64
|
+
"chunks",
|
|
65
|
+
FieldTypes.reference(ObjectChunkData),
|
|
66
|
+
on_serialize=skip_na_call(lambda x: [it.data for it in x]),
|
|
67
|
+
on_deserialize=skip_na_call(lambda x: [ObjectChunk(it) for it in x]),
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
def __init__(self, op=None, nsplits=None, **kw):
|
|
71
|
+
super().__init__(_op=op, _nsplits=nsplits, **kw)
|
|
72
|
+
|
|
73
|
+
def __repr__(self):
|
|
74
|
+
return f"Object <op={type(self.op).__name__}, key={self.key}>"
|
|
75
|
+
|
|
76
|
+
@property
|
|
77
|
+
def params(self):
|
|
78
|
+
# params return the properties which useful to rebuild a new tileable object
|
|
79
|
+
return dict()
|
|
80
|
+
|
|
81
|
+
@params.setter
|
|
82
|
+
def params(self, new_params: Dict[str, Any]):
|
|
83
|
+
params = new_params.copy()
|
|
84
|
+
if params: # pragma: no cover
|
|
85
|
+
raise TypeError(f"Unknown params: {list(params)}")
|
|
86
|
+
|
|
87
|
+
def refresh_params(self):
|
|
88
|
+
# refresh params when chunks updated
|
|
89
|
+
# nothing needs to do for Object
|
|
90
|
+
pass
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
class Object(Entity, _ToObjectMixin):
|
|
94
|
+
__slots__ = ()
|
|
95
|
+
_allow_data_type_ = (ObjectData,)
|
|
96
|
+
type_name = "Object"
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
OBJECT_TYPE = (Object, ObjectData)
|
|
100
|
+
OBJECT_CHUNK_TYPE = (ObjectChunk, ObjectChunkData)
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
from enum import Enum
|
|
17
|
+
|
|
18
|
+
from .fuse import FUSE_CHUNK_TYPE
|
|
19
|
+
from .objects import OBJECT_TYPE
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class OutputType(Enum):
|
|
23
|
+
object = 1
|
|
24
|
+
tensor = 2
|
|
25
|
+
dataframe = 3
|
|
26
|
+
series = 4
|
|
27
|
+
index = 5
|
|
28
|
+
scalar = 6
|
|
29
|
+
categorical = 7
|
|
30
|
+
dataframe_groupby = 8
|
|
31
|
+
series_groupby = 9
|
|
32
|
+
df_or_series = 10
|
|
33
|
+
|
|
34
|
+
@classmethod
|
|
35
|
+
def serialize_list(cls, output_types):
|
|
36
|
+
return [ot.value for ot in output_types] if output_types is not None else None
|
|
37
|
+
|
|
38
|
+
@classmethod
|
|
39
|
+
def deserialize_list(cls, output_types):
|
|
40
|
+
return [cls(ot) for ot in output_types] if output_types is not None else None
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
_OUTPUT_TYPE_TO_TILEABLE_TYPES = {OutputType.object: OBJECT_TYPE}
|
|
44
|
+
_OUTPUT_TYPE_TO_FETCH_CLS = {}
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def register_output_types(output_type, tileable_types):
|
|
48
|
+
_OUTPUT_TYPE_TO_TILEABLE_TYPES[output_type] = tileable_types
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def register_fetch_class(output_type, fetch_cls, fetch_shuffle_cls):
|
|
52
|
+
_OUTPUT_TYPE_TO_FETCH_CLS[output_type] = (fetch_cls, fetch_shuffle_cls)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def get_tileable_types(output_type):
|
|
56
|
+
return _OUTPUT_TYPE_TO_TILEABLE_TYPES[output_type]
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def get_fetch_class(output_type):
|
|
60
|
+
return _OUTPUT_TYPE_TO_FETCH_CLS[output_type]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@functools.lru_cache(100)
|
|
64
|
+
def _get_output_type_by_cls(cls):
|
|
65
|
+
for tp in OutputType.__members__.values():
|
|
66
|
+
try:
|
|
67
|
+
tileable_types = _OUTPUT_TYPE_TO_TILEABLE_TYPES[tp]
|
|
68
|
+
if issubclass(cls, tileable_types):
|
|
69
|
+
return tp
|
|
70
|
+
except KeyError: # pragma: no cover
|
|
71
|
+
continue
|
|
72
|
+
raise TypeError("Output can only be tensor, dataframe or series")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def get_output_types(*objs, unknown_as=None):
|
|
76
|
+
output_types = []
|
|
77
|
+
for obj in objs:
|
|
78
|
+
if obj is None:
|
|
79
|
+
continue
|
|
80
|
+
elif isinstance(obj, FUSE_CHUNK_TYPE):
|
|
81
|
+
obj = obj.chunk
|
|
82
|
+
|
|
83
|
+
try:
|
|
84
|
+
output_types.append(_get_output_type_by_cls(type(obj)))
|
|
85
|
+
except TypeError:
|
|
86
|
+
if unknown_as is not None:
|
|
87
|
+
output_types.append(unknown_as)
|
|
88
|
+
else: # pragma: no cover
|
|
89
|
+
raise
|
|
90
|
+
return output_types
|