maxframe 0.1.0b5__cp311-cp311-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-311-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-311-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-311-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-311-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,119 @@
|
|
|
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 itertools
|
|
16
|
+
import logging
|
|
17
|
+
import warnings
|
|
18
|
+
from dataclasses import dataclass
|
|
19
|
+
from typing import Any, Dict, List, Tuple, Union
|
|
20
|
+
from weakref import WeakSet
|
|
21
|
+
|
|
22
|
+
from maxframe.core import ChunkType, TileableGraph, TileableType, enter_mode
|
|
23
|
+
from maxframe.core.operator import Fetch
|
|
24
|
+
from maxframe.session import AbstractSession
|
|
25
|
+
from maxframe.utils import build_fetch, copy_tileables
|
|
26
|
+
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@dataclass
|
|
31
|
+
class ChunkFetchInfo:
|
|
32
|
+
tileable: TileableType
|
|
33
|
+
chunk: ChunkType
|
|
34
|
+
indexes: List[Union[int, slice]]
|
|
35
|
+
data: Any = None
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
_submitted_tileables = WeakSet()
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@enter_mode(build=True, kernel=True)
|
|
42
|
+
def gen_submit_tileable_graph(
|
|
43
|
+
session: AbstractSession,
|
|
44
|
+
result_tileables: List[TileableType],
|
|
45
|
+
tileable_to_copied: Dict[TileableType, TileableType] = None,
|
|
46
|
+
warn_duplicated_execution: bool = False,
|
|
47
|
+
) -> Tuple[TileableGraph, List[TileableType]]:
|
|
48
|
+
tileable_to_copied = (
|
|
49
|
+
tileable_to_copied if tileable_to_copied is not None else dict()
|
|
50
|
+
)
|
|
51
|
+
indexer = itertools.count()
|
|
52
|
+
result_to_index = {t: i for t, i in zip(result_tileables, indexer)}
|
|
53
|
+
result = list()
|
|
54
|
+
to_execute_tileables = list()
|
|
55
|
+
graph = TileableGraph(result)
|
|
56
|
+
|
|
57
|
+
q = list(result_tileables)
|
|
58
|
+
while q:
|
|
59
|
+
tileable = q.pop()
|
|
60
|
+
if tileable in tileable_to_copied:
|
|
61
|
+
continue
|
|
62
|
+
if tileable.cache and tileable not in result_to_index:
|
|
63
|
+
result_to_index[tileable] = next(indexer)
|
|
64
|
+
outputs = tileable.op.outputs
|
|
65
|
+
inputs = tileable.inputs if session not in tileable._executed_sessions else []
|
|
66
|
+
new_inputs = []
|
|
67
|
+
all_inputs_processed = True
|
|
68
|
+
for inp in inputs:
|
|
69
|
+
if inp in tileable_to_copied:
|
|
70
|
+
new_inputs.append(tileable_to_copied[inp])
|
|
71
|
+
elif session in inp._executed_sessions:
|
|
72
|
+
# executed, gen fetch
|
|
73
|
+
fetch_input = build_fetch(inp).data
|
|
74
|
+
tileable_to_copied[inp] = fetch_input
|
|
75
|
+
graph.add_node(fetch_input)
|
|
76
|
+
new_inputs.append(fetch_input)
|
|
77
|
+
else:
|
|
78
|
+
# some input not processed before
|
|
79
|
+
all_inputs_processed = False
|
|
80
|
+
# put back tileable
|
|
81
|
+
q.append(tileable)
|
|
82
|
+
q.append(inp)
|
|
83
|
+
break
|
|
84
|
+
if all_inputs_processed:
|
|
85
|
+
if isinstance(tileable.op, Fetch):
|
|
86
|
+
new_outputs = [tileable]
|
|
87
|
+
elif session in tileable._executed_sessions:
|
|
88
|
+
new_outputs = []
|
|
89
|
+
for out in outputs:
|
|
90
|
+
fetch_out = tileable_to_copied.get(out, build_fetch(out).data)
|
|
91
|
+
new_outputs.append(fetch_out)
|
|
92
|
+
else:
|
|
93
|
+
new_outputs = [
|
|
94
|
+
t.data for t in copy_tileables(outputs, inputs=new_inputs)
|
|
95
|
+
]
|
|
96
|
+
for out, new_out in zip(outputs, new_outputs):
|
|
97
|
+
tileable_to_copied[out] = new_out
|
|
98
|
+
graph.add_node(new_out)
|
|
99
|
+
for new_inp in new_inputs:
|
|
100
|
+
graph.add_edge(new_inp, new_out)
|
|
101
|
+
|
|
102
|
+
# process results
|
|
103
|
+
result.extend([None] * len(result_to_index))
|
|
104
|
+
for t, i in result_to_index.items():
|
|
105
|
+
result[i] = tileable_to_copied[t]
|
|
106
|
+
to_execute_tileables.append(t)
|
|
107
|
+
|
|
108
|
+
if warn_duplicated_execution:
|
|
109
|
+
for n, c in tileable_to_copied.items():
|
|
110
|
+
if not isinstance(c.op, Fetch) and n in _submitted_tileables:
|
|
111
|
+
warnings.warn(
|
|
112
|
+
f"Tileable {repr(n)} has been submitted before", RuntimeWarning
|
|
113
|
+
)
|
|
114
|
+
# add all nodes into submitted tileables
|
|
115
|
+
_submitted_tileables.update(
|
|
116
|
+
n for n, c in tileable_to_copied.items() if not isinstance(c.op, Fetch)
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
return graph, to_execute_tileables
|
|
@@ -0,0 +1,482 @@
|
|
|
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 abc
|
|
16
|
+
import asyncio
|
|
17
|
+
import logging
|
|
18
|
+
import time
|
|
19
|
+
import weakref
|
|
20
|
+
from numbers import Integral
|
|
21
|
+
from typing import Dict, List, Mapping, Optional, Tuple, Union
|
|
22
|
+
from urllib.parse import urlparse
|
|
23
|
+
|
|
24
|
+
import numpy as np
|
|
25
|
+
import pandas as pd
|
|
26
|
+
from odps import ODPS
|
|
27
|
+
|
|
28
|
+
from maxframe.config import options
|
|
29
|
+
from maxframe.core import Entity, TileableGraph, enter_mode
|
|
30
|
+
from maxframe.dataframe import read_odps_table
|
|
31
|
+
from maxframe.dataframe.core import DATAFRAME_TYPE, SERIES_TYPE
|
|
32
|
+
from maxframe.dataframe.datasource import PandasDataSourceOperator
|
|
33
|
+
from maxframe.dataframe.datasource.read_odps_table import DataFrameReadODPSTable
|
|
34
|
+
from maxframe.odpsio import HaloTableIO, pandas_to_arrow, pandas_to_odps_schema
|
|
35
|
+
from maxframe.protocol import (
|
|
36
|
+
DagInfo,
|
|
37
|
+
DagStatus,
|
|
38
|
+
ODPSTableResultInfo,
|
|
39
|
+
ResultInfo,
|
|
40
|
+
SessionInfo,
|
|
41
|
+
)
|
|
42
|
+
from maxframe.session import (
|
|
43
|
+
AbstractSession,
|
|
44
|
+
ExecutionInfo,
|
|
45
|
+
IsolatedAsyncSession,
|
|
46
|
+
Profiling,
|
|
47
|
+
Progress,
|
|
48
|
+
)
|
|
49
|
+
from maxframe.typing_ import TileableType
|
|
50
|
+
from maxframe.utils import ToThreadMixin, build_temp_table_name
|
|
51
|
+
|
|
52
|
+
from ..clients.framedriver import FrameDriverClient
|
|
53
|
+
from ..fetcher import get_fetcher_cls
|
|
54
|
+
from .consts import RESTFUL_SESSION_INSECURE_SCHEME, RESTFUL_SESSION_SECURE_SCHEME
|
|
55
|
+
from .graph import gen_submit_tileable_graph
|
|
56
|
+
|
|
57
|
+
logger = logging.getLogger(__name__)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class MaxFrameServiceCaller(metaclass=abc.ABCMeta):
|
|
61
|
+
@abc.abstractmethod
|
|
62
|
+
def create_session(self) -> SessionInfo:
|
|
63
|
+
raise NotImplementedError
|
|
64
|
+
|
|
65
|
+
@abc.abstractmethod
|
|
66
|
+
def delete_session(self) -> None:
|
|
67
|
+
raise NotImplementedError
|
|
68
|
+
|
|
69
|
+
@abc.abstractmethod
|
|
70
|
+
def submit_dag(
|
|
71
|
+
self, dag: TileableGraph, managed_input_infos: Dict[str, ResultInfo]
|
|
72
|
+
) -> DagInfo:
|
|
73
|
+
raise NotImplementedError
|
|
74
|
+
|
|
75
|
+
@abc.abstractmethod
|
|
76
|
+
def get_dag_info(self, dag_id: str) -> DagInfo:
|
|
77
|
+
raise NotImplementedError
|
|
78
|
+
|
|
79
|
+
@abc.abstractmethod
|
|
80
|
+
def cancel_dag(self, dag_id: str) -> DagInfo:
|
|
81
|
+
raise NotImplementedError
|
|
82
|
+
|
|
83
|
+
@abc.abstractmethod
|
|
84
|
+
def decref(self, tileable_keys: List[str]) -> None:
|
|
85
|
+
raise NotImplementedError
|
|
86
|
+
|
|
87
|
+
def get_logview_address(self, dag_id=None, hours=None) -> Optional[str]:
|
|
88
|
+
return None
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class MaxFrameSession(ToThreadMixin, IsolatedAsyncSession):
|
|
92
|
+
_odps_entry: Optional[ODPS]
|
|
93
|
+
_tileable_to_infos: Mapping[TileableType, ResultInfo]
|
|
94
|
+
|
|
95
|
+
@classmethod
|
|
96
|
+
async def init(
|
|
97
|
+
cls,
|
|
98
|
+
address: str,
|
|
99
|
+
session_id: Optional[str] = None,
|
|
100
|
+
backend: str = None,
|
|
101
|
+
odps_entry: Optional[ODPS] = None,
|
|
102
|
+
timeout: Optional[float] = None,
|
|
103
|
+
**kwargs,
|
|
104
|
+
) -> "AbstractSession":
|
|
105
|
+
session_obj = cls(
|
|
106
|
+
address, session_id, odps_entry=odps_entry, timeout=timeout, **kwargs
|
|
107
|
+
)
|
|
108
|
+
await session_obj._init(address)
|
|
109
|
+
return session_obj
|
|
110
|
+
|
|
111
|
+
def __init__(
|
|
112
|
+
self,
|
|
113
|
+
address: str,
|
|
114
|
+
session_id: str,
|
|
115
|
+
odps_entry: Optional[ODPS] = None,
|
|
116
|
+
timeout: Optional[float] = None,
|
|
117
|
+
**kwargs,
|
|
118
|
+
):
|
|
119
|
+
super().__init__(address, session_id)
|
|
120
|
+
self.timeout = timeout
|
|
121
|
+
self._odps_entry = odps_entry or ODPS.from_global() or ODPS.from_environments()
|
|
122
|
+
self._tileable_to_infos = weakref.WeakKeyDictionary()
|
|
123
|
+
|
|
124
|
+
self._caller = self._create_caller(odps_entry, address, **kwargs)
|
|
125
|
+
|
|
126
|
+
@classmethod
|
|
127
|
+
def _create_caller(
|
|
128
|
+
cls, odps_entry: ODPS, address: str, **kwargs
|
|
129
|
+
) -> MaxFrameServiceCaller:
|
|
130
|
+
raise NotImplementedError
|
|
131
|
+
|
|
132
|
+
async def _init(self, _address: str):
|
|
133
|
+
session_info = await self.ensure_async_call(self._caller.create_session)
|
|
134
|
+
self._session_id = session_info.session_id
|
|
135
|
+
await self._show_logview_address()
|
|
136
|
+
|
|
137
|
+
def _upload_and_get_read_tileable(self, t: TileableType) -> Optional[TileableType]:
|
|
138
|
+
if (
|
|
139
|
+
not isinstance(t.op, PandasDataSourceOperator)
|
|
140
|
+
or t.op.get_data() is None
|
|
141
|
+
or t.inputs
|
|
142
|
+
):
|
|
143
|
+
return None
|
|
144
|
+
|
|
145
|
+
schema, table_meta = pandas_to_odps_schema(t, unknown_as_string=True)
|
|
146
|
+
if self._odps_entry.exist_table(table_meta.table_name):
|
|
147
|
+
self._odps_entry.delete_table(table_meta.table_name)
|
|
148
|
+
table_name = build_temp_table_name(self.session_id, t.key)
|
|
149
|
+
table_obj = self._odps_entry.create_table(
|
|
150
|
+
table_name, schema, lifecycle=options.session.temp_table_lifecycle
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
data = t.op.get_data()
|
|
154
|
+
batch_size = options.session.upload_batch_size
|
|
155
|
+
|
|
156
|
+
if len(data):
|
|
157
|
+
halo_client = HaloTableIO(self._odps_entry)
|
|
158
|
+
with halo_client.open_writer(table_obj.full_table_name) as writer:
|
|
159
|
+
for batch_start in range(0, len(data), batch_size):
|
|
160
|
+
if isinstance(data, pd.Index):
|
|
161
|
+
batch = data[batch_start : batch_start + batch_size]
|
|
162
|
+
else:
|
|
163
|
+
batch = data.iloc[batch_start : batch_start + batch_size]
|
|
164
|
+
arrow_batch, _ = pandas_to_arrow(batch)
|
|
165
|
+
writer.write(arrow_batch)
|
|
166
|
+
|
|
167
|
+
read_tileable = read_odps_table(
|
|
168
|
+
table_obj.full_table_name,
|
|
169
|
+
columns=table_meta.table_column_names,
|
|
170
|
+
index_col=table_meta.table_index_column_names,
|
|
171
|
+
output_type=table_meta.type,
|
|
172
|
+
)
|
|
173
|
+
if isinstance(read_tileable, DATAFRAME_TYPE):
|
|
174
|
+
if list(read_tileable.dtypes.index) != list(t.dtypes.index):
|
|
175
|
+
read_tileable.columns = list(t.dtypes.index)
|
|
176
|
+
elif isinstance(read_tileable, SERIES_TYPE):
|
|
177
|
+
if read_tileable.name != t.name:
|
|
178
|
+
read_tileable.name = t.name
|
|
179
|
+
else: # INDEX_TYPE
|
|
180
|
+
if list(read_tileable.names) != list(t.names):
|
|
181
|
+
read_tileable.names = t.names
|
|
182
|
+
read_tileable._key = t.key
|
|
183
|
+
read_tileable.params = t.params
|
|
184
|
+
return read_tileable.data
|
|
185
|
+
|
|
186
|
+
@enter_mode(kernel=True, build=True)
|
|
187
|
+
def _scan_and_replace_pandas_sources(
|
|
188
|
+
self, graph: TileableGraph
|
|
189
|
+
) -> Dict[TileableType, TileableType]:
|
|
190
|
+
"""Replaces Pandas data sources with temp table sources in the graph"""
|
|
191
|
+
replacements = dict()
|
|
192
|
+
for t in graph:
|
|
193
|
+
replaced = self._upload_and_get_read_tileable(t)
|
|
194
|
+
if replaced is None:
|
|
195
|
+
continue
|
|
196
|
+
replacements[t] = replaced
|
|
197
|
+
|
|
198
|
+
for src, replaced in replacements.items():
|
|
199
|
+
successors = list(graph.successors(src))
|
|
200
|
+
graph.remove_node(src)
|
|
201
|
+
graph.add_node(replaced)
|
|
202
|
+
for pred in replaced.inputs or ():
|
|
203
|
+
graph.add_node(pred)
|
|
204
|
+
graph.add_edge(pred, replaced)
|
|
205
|
+
|
|
206
|
+
for succ in successors:
|
|
207
|
+
graph.add_edge(replaced, succ)
|
|
208
|
+
succ.inputs = [replacements.get(t, t) for t in succ.inputs]
|
|
209
|
+
|
|
210
|
+
graph.results = [replacements.get(t, t) for t in graph.results]
|
|
211
|
+
return replacements
|
|
212
|
+
|
|
213
|
+
@enter_mode(kernel=True, build=True)
|
|
214
|
+
def _get_input_infos(self, tileables: List[TileableType]) -> Dict[str, ResultInfo]:
|
|
215
|
+
"""Generate ResultInfo structs from generated temp tables"""
|
|
216
|
+
infos = dict()
|
|
217
|
+
for t in tileables:
|
|
218
|
+
key = t.key
|
|
219
|
+
if not isinstance(t.op, DataFrameReadODPSTable):
|
|
220
|
+
if not isinstance(t.inputs[0].op, DataFrameReadODPSTable):
|
|
221
|
+
continue
|
|
222
|
+
t = t.inputs[0]
|
|
223
|
+
infos[key] = ODPSTableResultInfo(full_table_name=t.op.table_name)
|
|
224
|
+
return infos
|
|
225
|
+
|
|
226
|
+
async def execute(self, *tileables, **kwargs) -> ExecutionInfo:
|
|
227
|
+
tileables = [
|
|
228
|
+
tileable.data if isinstance(tileable, Entity) else tileable
|
|
229
|
+
for tileable in tileables
|
|
230
|
+
]
|
|
231
|
+
tileable_to_copied = dict()
|
|
232
|
+
tileable_graph, to_execute_tileables = gen_submit_tileable_graph(
|
|
233
|
+
self, tileables, tileable_to_copied
|
|
234
|
+
)
|
|
235
|
+
source_replacements = self._scan_and_replace_pandas_sources(tileable_graph)
|
|
236
|
+
|
|
237
|
+
# we need to manage uploaded data sources with refcounting mechanism
|
|
238
|
+
# as nodes in tileable_graph are copied, we need to use original nodes
|
|
239
|
+
copied_to_tileable = {v: k for k, v in tileable_to_copied.items()}
|
|
240
|
+
for replaced_src in source_replacements.keys():
|
|
241
|
+
copied_to_tileable[replaced_src]._attach_session(self)
|
|
242
|
+
|
|
243
|
+
replaced_infos = self._get_input_infos(list(source_replacements.values()))
|
|
244
|
+
dag_info = await self.ensure_async_call(
|
|
245
|
+
self._caller.submit_dag, tileable_graph, replaced_infos
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
await self._show_logview_address(dag_info.dag_id)
|
|
249
|
+
|
|
250
|
+
progress = Progress()
|
|
251
|
+
profiling = Profiling()
|
|
252
|
+
aio_task = asyncio.create_task(
|
|
253
|
+
self._run_in_background(dag_info, to_execute_tileables, progress)
|
|
254
|
+
)
|
|
255
|
+
return ExecutionInfo(
|
|
256
|
+
aio_task,
|
|
257
|
+
progress,
|
|
258
|
+
profiling,
|
|
259
|
+
asyncio.get_running_loop(),
|
|
260
|
+
to_execute_tileables,
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
async def _run_in_background(
|
|
264
|
+
self, dag_info: DagInfo, tileables: List, progress: Progress
|
|
265
|
+
):
|
|
266
|
+
start_time = time.time()
|
|
267
|
+
dag_id = dag_info.dag_id
|
|
268
|
+
wait_timeout = 10
|
|
269
|
+
with enter_mode(build=True, kernel=True):
|
|
270
|
+
key_to_tileables = {t.key: t for t in tileables}
|
|
271
|
+
|
|
272
|
+
try:
|
|
273
|
+
while True:
|
|
274
|
+
elapsed_time = time.time() - start_time
|
|
275
|
+
timeout_val = (
|
|
276
|
+
min(self.timeout - elapsed_time, wait_timeout)
|
|
277
|
+
if self.timeout
|
|
278
|
+
else wait_timeout
|
|
279
|
+
)
|
|
280
|
+
if timeout_val <= 0:
|
|
281
|
+
raise TimeoutError("Running DAG timed out")
|
|
282
|
+
|
|
283
|
+
dag_info: DagInfo = await self.ensure_async_call(
|
|
284
|
+
self._caller.get_dag_info, dag_id
|
|
285
|
+
)
|
|
286
|
+
progress.value = dag_info.progress
|
|
287
|
+
if dag_info.status != DagStatus.RUNNING:
|
|
288
|
+
break
|
|
289
|
+
await asyncio.sleep(timeout_val)
|
|
290
|
+
except asyncio.CancelledError:
|
|
291
|
+
dag_info = await self.ensure_async_call(self._caller.cancel_dag, dag_id)
|
|
292
|
+
if dag_info.status != DagStatus.CANCELLED: # pragma: no cover
|
|
293
|
+
raise
|
|
294
|
+
finally:
|
|
295
|
+
if dag_info.status == DagStatus.SUCCEEDED:
|
|
296
|
+
progress.value = 1.0
|
|
297
|
+
elif dag_info.status == DagStatus.FAILED:
|
|
298
|
+
dag_info.error_info.reraise()
|
|
299
|
+
|
|
300
|
+
if dag_info.status in (DagStatus.RUNNING, DagStatus.CANCELLED):
|
|
301
|
+
return
|
|
302
|
+
|
|
303
|
+
for key, result_info in dag_info.tileable_to_result_infos.items():
|
|
304
|
+
t = key_to_tileables[key]
|
|
305
|
+
fetcher = get_fetcher_cls(result_info.result_type)(self._odps_entry)
|
|
306
|
+
await fetcher.update_tileable_meta(t, result_info)
|
|
307
|
+
self._tileable_to_infos[t] = result_info
|
|
308
|
+
|
|
309
|
+
def _get_data_tileable_and_indexes(
|
|
310
|
+
self, tileable: TileableType
|
|
311
|
+
) -> Tuple[TileableType, List[Union[slice, Integral]]]:
|
|
312
|
+
from maxframe.dataframe.indexing.iloc import (
|
|
313
|
+
DataFrameIlocGetItem,
|
|
314
|
+
SeriesIlocGetItem,
|
|
315
|
+
)
|
|
316
|
+
from maxframe.tensor.indexing import TensorIndex
|
|
317
|
+
|
|
318
|
+
slice_op_types = TensorIndex, DataFrameIlocGetItem, SeriesIlocGetItem
|
|
319
|
+
|
|
320
|
+
if isinstance(tileable, Entity):
|
|
321
|
+
tileable = tileable.data
|
|
322
|
+
|
|
323
|
+
indexes = None
|
|
324
|
+
while tileable not in self._tileable_to_infos:
|
|
325
|
+
# if tileable's op is slice, try to check input
|
|
326
|
+
if isinstance(tileable.op, slice_op_types):
|
|
327
|
+
indexes = tileable.op.indexes
|
|
328
|
+
tileable = tileable.inputs[0]
|
|
329
|
+
if not all(isinstance(index, (slice, Integral)) for index in indexes):
|
|
330
|
+
raise ValueError("Only support fetch data slices")
|
|
331
|
+
else:
|
|
332
|
+
raise ValueError(f"Cannot fetch unexecuted tileable: {tileable!r}")
|
|
333
|
+
|
|
334
|
+
return tileable, indexes
|
|
335
|
+
|
|
336
|
+
async def fetch(self, *tileables, **kwargs) -> list:
|
|
337
|
+
results = []
|
|
338
|
+
tileables = [
|
|
339
|
+
tileable.data if isinstance(tileable, Entity) else tileable
|
|
340
|
+
for tileable in tileables
|
|
341
|
+
]
|
|
342
|
+
with enter_mode(build=True):
|
|
343
|
+
for tileable in tileables:
|
|
344
|
+
data_tileable, indexes = self._get_data_tileable_and_indexes(tileable)
|
|
345
|
+
info = self._tileable_to_infos[data_tileable]
|
|
346
|
+
fetcher = get_fetcher_cls(info.result_type)(self._odps_entry)
|
|
347
|
+
results.append(await fetcher.fetch(tileable, info, indexes))
|
|
348
|
+
return results
|
|
349
|
+
|
|
350
|
+
async def decref(self, *tileable_keys):
|
|
351
|
+
return await self.ensure_async_call(self._caller.decref, list(tileable_keys))
|
|
352
|
+
|
|
353
|
+
async def destroy(self):
|
|
354
|
+
await self.ensure_async_call(self._caller.delete_session)
|
|
355
|
+
await super().destroy()
|
|
356
|
+
|
|
357
|
+
async def _get_ref_counts(self) -> Dict[str, int]:
|
|
358
|
+
pass
|
|
359
|
+
|
|
360
|
+
async def fetch_tileable_op_logs(
|
|
361
|
+
self,
|
|
362
|
+
tileable_op_key: str,
|
|
363
|
+
offsets: Union[Dict[str, List[int]], str, int],
|
|
364
|
+
sizes: Union[Dict[str, List[int]], str, int],
|
|
365
|
+
) -> Dict:
|
|
366
|
+
pass
|
|
367
|
+
|
|
368
|
+
async def get_total_n_cpu(self):
|
|
369
|
+
pass
|
|
370
|
+
|
|
371
|
+
async def get_cluster_versions(self) -> List[str]:
|
|
372
|
+
raise NotImplementedError
|
|
373
|
+
|
|
374
|
+
async def get_web_endpoint(self) -> Optional[str]:
|
|
375
|
+
raise NotImplementedError
|
|
376
|
+
|
|
377
|
+
async def create_remote_object(
|
|
378
|
+
self, session_id: str, name: str, object_cls, *args, **kwargs
|
|
379
|
+
):
|
|
380
|
+
raise NotImplementedError
|
|
381
|
+
|
|
382
|
+
async def get_remote_object(self, session_id: str, name: str):
|
|
383
|
+
raise NotImplementedError
|
|
384
|
+
|
|
385
|
+
async def destroy_remote_object(self, session_id: str, name: str):
|
|
386
|
+
raise NotImplementedError
|
|
387
|
+
|
|
388
|
+
async def create_mutable_tensor(
|
|
389
|
+
self,
|
|
390
|
+
shape: tuple,
|
|
391
|
+
dtype: Union[np.dtype, str],
|
|
392
|
+
name: str = None,
|
|
393
|
+
default_value: Union[int, float] = 0,
|
|
394
|
+
chunk_size: Union[int, Tuple] = None,
|
|
395
|
+
):
|
|
396
|
+
raise NotImplementedError
|
|
397
|
+
|
|
398
|
+
async def get_mutable_tensor(self, name: str):
|
|
399
|
+
raise NotImplementedError
|
|
400
|
+
|
|
401
|
+
async def get_logview_address(self, hours=None) -> Optional[str]:
|
|
402
|
+
return await self.get_dag_logview_address(None, hours)
|
|
403
|
+
|
|
404
|
+
async def get_dag_logview_address(self, dag_id=None, hours=None) -> Optional[str]:
|
|
405
|
+
return await self.ensure_async_call(
|
|
406
|
+
self._caller.get_logview_address, dag_id, hours
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
async def _show_logview_address(self, dag_id=None, hours=None):
|
|
410
|
+
identity = f"Session ID: {self._session_id}"
|
|
411
|
+
if dag_id:
|
|
412
|
+
identity += f", DAG ID: {dag_id}"
|
|
413
|
+
|
|
414
|
+
logview_addr = await self.get_dag_logview_address(dag_id, hours)
|
|
415
|
+
if logview_addr:
|
|
416
|
+
logger.info("%s, Logview: %s", identity, logview_addr)
|
|
417
|
+
else:
|
|
418
|
+
logger.info("%s, Logview address does not exist", identity)
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
class MaxFrameRestCaller(MaxFrameServiceCaller):
|
|
422
|
+
_client: FrameDriverClient
|
|
423
|
+
_session_id: Optional[str]
|
|
424
|
+
|
|
425
|
+
def __init__(self, client: FrameDriverClient):
|
|
426
|
+
self._client = client
|
|
427
|
+
self._session_id = None
|
|
428
|
+
|
|
429
|
+
async def create_session(self) -> SessionInfo:
|
|
430
|
+
info = await self._client.create_session(options.to_dict(remote_only=True))
|
|
431
|
+
self._session_id = info.session_id
|
|
432
|
+
return info
|
|
433
|
+
|
|
434
|
+
async def delete_session(self) -> None:
|
|
435
|
+
await self._client.delete_session(self._session_id)
|
|
436
|
+
|
|
437
|
+
async def submit_dag(
|
|
438
|
+
self, dag: TileableGraph, managed_input_infos: Dict[str, ResultInfo]
|
|
439
|
+
) -> DagInfo:
|
|
440
|
+
return await self._client.submit_dag(self._session_id, dag, managed_input_infos)
|
|
441
|
+
|
|
442
|
+
async def get_dag_info(self, dag_id: str) -> DagInfo:
|
|
443
|
+
return await self._client.get_dag_info(self._session_id, dag_id)
|
|
444
|
+
|
|
445
|
+
async def cancel_dag(self, dag_id: str) -> DagInfo:
|
|
446
|
+
return await self._client.cancel_dag(self._session_id, dag_id)
|
|
447
|
+
|
|
448
|
+
async def decref(self, tileable_keys: List[str]) -> None:
|
|
449
|
+
return await self._client.decref(self._session_id, tileable_keys)
|
|
450
|
+
|
|
451
|
+
|
|
452
|
+
class MaxFrameRestSession(MaxFrameSession):
|
|
453
|
+
schemes = [RESTFUL_SESSION_INSECURE_SCHEME, RESTFUL_SESSION_SECURE_SCHEME]
|
|
454
|
+
|
|
455
|
+
def __init__(
|
|
456
|
+
self,
|
|
457
|
+
address: str,
|
|
458
|
+
session_id: str,
|
|
459
|
+
odps_entry: Optional[ODPS] = None,
|
|
460
|
+
timeout: Optional[float] = None,
|
|
461
|
+
new: bool = True,
|
|
462
|
+
**kwargs,
|
|
463
|
+
):
|
|
464
|
+
parsed_endpoint = urlparse(address)
|
|
465
|
+
scheme = (
|
|
466
|
+
"http"
|
|
467
|
+
if parsed_endpoint.scheme == RESTFUL_SESSION_INSECURE_SCHEME
|
|
468
|
+
else "https"
|
|
469
|
+
)
|
|
470
|
+
real_endpoint = address.replace(f"{parsed_endpoint.scheme}://", f"{scheme}://")
|
|
471
|
+
|
|
472
|
+
super().__init__(
|
|
473
|
+
real_endpoint, session_id, odps_entry=odps_entry, timeout=timeout
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
@classmethod
|
|
477
|
+
def _create_caller(cls, odps_entry: ODPS, address: str, **kwargs):
|
|
478
|
+
return MaxFrameRestCaller(FrameDriverClient(address))
|
|
479
|
+
|
|
480
|
+
|
|
481
|
+
def register_session_schemes(overwrite: bool = False):
|
|
482
|
+
MaxFrameRestSession.register_schemes(overwrite=overwrite)
|