maxframe 0.1.0b5__cp38-cp38-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +32 -0
- maxframe/_utils.cpython-38-darwin.so +0 -0
- maxframe/_utils.pxd +33 -0
- maxframe/_utils.pyx +547 -0
- maxframe/codegen.py +528 -0
- maxframe/config/__init__.py +15 -0
- maxframe/config/config.py +443 -0
- maxframe/config/tests/__init__.py +13 -0
- maxframe/config/tests/test_config.py +103 -0
- maxframe/config/tests/test_validators.py +34 -0
- maxframe/config/validators.py +57 -0
- maxframe/conftest.py +139 -0
- maxframe/core/__init__.py +65 -0
- maxframe/core/base.py +156 -0
- maxframe/core/entity/__init__.py +44 -0
- maxframe/core/entity/chunks.py +68 -0
- maxframe/core/entity/core.py +152 -0
- maxframe/core/entity/executable.py +337 -0
- maxframe/core/entity/fuse.py +73 -0
- maxframe/core/entity/objects.py +100 -0
- maxframe/core/entity/output_types.py +90 -0
- maxframe/core/entity/tileables.py +438 -0
- maxframe/core/entity/utils.py +24 -0
- maxframe/core/graph/__init__.py +17 -0
- maxframe/core/graph/builder/__init__.py +16 -0
- maxframe/core/graph/builder/base.py +86 -0
- maxframe/core/graph/builder/chunk.py +430 -0
- maxframe/core/graph/builder/tileable.py +34 -0
- maxframe/core/graph/builder/utils.py +41 -0
- maxframe/core/graph/core.cpython-38-darwin.so +0 -0
- maxframe/core/graph/core.pyx +467 -0
- maxframe/core/graph/entity.py +171 -0
- maxframe/core/graph/tests/__init__.py +13 -0
- maxframe/core/graph/tests/test_graph.py +205 -0
- maxframe/core/mode.py +96 -0
- maxframe/core/operator/__init__.py +34 -0
- maxframe/core/operator/base.py +450 -0
- maxframe/core/operator/core.py +276 -0
- maxframe/core/operator/fetch.py +53 -0
- maxframe/core/operator/fuse.py +29 -0
- maxframe/core/operator/objects.py +72 -0
- maxframe/core/operator/shuffle.py +111 -0
- maxframe/core/operator/tests/__init__.py +13 -0
- maxframe/core/operator/tests/test_core.py +64 -0
- maxframe/core/tests/__init__.py +13 -0
- maxframe/core/tests/test_mode.py +75 -0
- maxframe/dataframe/__init__.py +81 -0
- maxframe/dataframe/arithmetic/__init__.py +359 -0
- maxframe/dataframe/arithmetic/abs.py +33 -0
- maxframe/dataframe/arithmetic/add.py +60 -0
- maxframe/dataframe/arithmetic/arccos.py +28 -0
- maxframe/dataframe/arithmetic/arccosh.py +28 -0
- maxframe/dataframe/arithmetic/arcsin.py +28 -0
- maxframe/dataframe/arithmetic/arcsinh.py +28 -0
- maxframe/dataframe/arithmetic/arctan.py +28 -0
- maxframe/dataframe/arithmetic/arctanh.py +28 -0
- maxframe/dataframe/arithmetic/around.py +152 -0
- maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
- maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
- maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
- maxframe/dataframe/arithmetic/ceil.py +28 -0
- maxframe/dataframe/arithmetic/core.py +342 -0
- maxframe/dataframe/arithmetic/cos.py +28 -0
- maxframe/dataframe/arithmetic/cosh.py +28 -0
- maxframe/dataframe/arithmetic/degrees.py +28 -0
- maxframe/dataframe/arithmetic/docstring.py +442 -0
- maxframe/dataframe/arithmetic/equal.py +56 -0
- maxframe/dataframe/arithmetic/exp.py +28 -0
- maxframe/dataframe/arithmetic/exp2.py +28 -0
- maxframe/dataframe/arithmetic/expm1.py +28 -0
- maxframe/dataframe/arithmetic/floor.py +28 -0
- maxframe/dataframe/arithmetic/floordiv.py +64 -0
- maxframe/dataframe/arithmetic/greater.py +57 -0
- maxframe/dataframe/arithmetic/greater_equal.py +57 -0
- maxframe/dataframe/arithmetic/invert.py +33 -0
- maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
- maxframe/dataframe/arithmetic/less.py +57 -0
- maxframe/dataframe/arithmetic/less_equal.py +57 -0
- maxframe/dataframe/arithmetic/log.py +28 -0
- maxframe/dataframe/arithmetic/log10.py +28 -0
- maxframe/dataframe/arithmetic/log2.py +28 -0
- maxframe/dataframe/arithmetic/mod.py +60 -0
- maxframe/dataframe/arithmetic/multiply.py +60 -0
- maxframe/dataframe/arithmetic/negative.py +33 -0
- maxframe/dataframe/arithmetic/not_equal.py +56 -0
- maxframe/dataframe/arithmetic/power.py +68 -0
- maxframe/dataframe/arithmetic/radians.py +28 -0
- maxframe/dataframe/arithmetic/sin.py +28 -0
- maxframe/dataframe/arithmetic/sinh.py +28 -0
- maxframe/dataframe/arithmetic/sqrt.py +28 -0
- maxframe/dataframe/arithmetic/subtract.py +64 -0
- maxframe/dataframe/arithmetic/tan.py +28 -0
- maxframe/dataframe/arithmetic/tanh.py +28 -0
- maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
- maxframe/dataframe/arithmetic/truediv.py +64 -0
- maxframe/dataframe/arithmetic/trunc.py +28 -0
- maxframe/dataframe/arrays.py +864 -0
- maxframe/dataframe/core.py +2417 -0
- maxframe/dataframe/datasource/__init__.py +15 -0
- maxframe/dataframe/datasource/core.py +81 -0
- maxframe/dataframe/datasource/dataframe.py +59 -0
- maxframe/dataframe/datasource/date_range.py +504 -0
- maxframe/dataframe/datasource/from_index.py +54 -0
- maxframe/dataframe/datasource/from_records.py +107 -0
- maxframe/dataframe/datasource/from_tensor.py +419 -0
- maxframe/dataframe/datasource/index.py +117 -0
- maxframe/dataframe/datasource/read_csv.py +528 -0
- maxframe/dataframe/datasource/read_odps_query.py +299 -0
- maxframe/dataframe/datasource/read_odps_table.py +253 -0
- maxframe/dataframe/datasource/read_parquet.py +421 -0
- maxframe/dataframe/datasource/series.py +55 -0
- maxframe/dataframe/datasource/tests/__init__.py +13 -0
- maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
- maxframe/dataframe/datastore/__init__.py +26 -0
- maxframe/dataframe/datastore/core.py +19 -0
- maxframe/dataframe/datastore/to_csv.py +227 -0
- maxframe/dataframe/datastore/to_odps.py +162 -0
- maxframe/dataframe/extensions/__init__.py +41 -0
- maxframe/dataframe/extensions/accessor.py +50 -0
- maxframe/dataframe/extensions/reshuffle.py +83 -0
- maxframe/dataframe/extensions/tests/__init__.py +13 -0
- maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
- maxframe/dataframe/fetch/__init__.py +15 -0
- maxframe/dataframe/fetch/core.py +86 -0
- maxframe/dataframe/groupby/__init__.py +82 -0
- maxframe/dataframe/groupby/aggregation.py +350 -0
- maxframe/dataframe/groupby/apply.py +251 -0
- maxframe/dataframe/groupby/core.py +179 -0
- maxframe/dataframe/groupby/cum.py +124 -0
- maxframe/dataframe/groupby/fill.py +141 -0
- maxframe/dataframe/groupby/getitem.py +92 -0
- maxframe/dataframe/groupby/head.py +105 -0
- maxframe/dataframe/groupby/sample.py +214 -0
- maxframe/dataframe/groupby/tests/__init__.py +13 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
- maxframe/dataframe/groupby/transform.py +255 -0
- maxframe/dataframe/indexing/__init__.py +84 -0
- maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
- maxframe/dataframe/indexing/align.py +349 -0
- maxframe/dataframe/indexing/at.py +83 -0
- maxframe/dataframe/indexing/getitem.py +204 -0
- maxframe/dataframe/indexing/iat.py +37 -0
- maxframe/dataframe/indexing/iloc.py +566 -0
- maxframe/dataframe/indexing/insert.py +86 -0
- maxframe/dataframe/indexing/loc.py +411 -0
- maxframe/dataframe/indexing/reindex.py +526 -0
- maxframe/dataframe/indexing/rename.py +462 -0
- maxframe/dataframe/indexing/rename_axis.py +209 -0
- maxframe/dataframe/indexing/reset_index.py +402 -0
- maxframe/dataframe/indexing/sample.py +221 -0
- maxframe/dataframe/indexing/set_axis.py +194 -0
- maxframe/dataframe/indexing/set_index.py +61 -0
- maxframe/dataframe/indexing/setitem.py +130 -0
- maxframe/dataframe/indexing/tests/__init__.py +13 -0
- maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
- maxframe/dataframe/indexing/where.py +308 -0
- maxframe/dataframe/initializer.py +288 -0
- maxframe/dataframe/merge/__init__.py +32 -0
- maxframe/dataframe/merge/append.py +121 -0
- maxframe/dataframe/merge/concat.py +325 -0
- maxframe/dataframe/merge/merge.py +593 -0
- maxframe/dataframe/merge/tests/__init__.py +13 -0
- maxframe/dataframe/merge/tests/test_merge.py +215 -0
- maxframe/dataframe/misc/__init__.py +134 -0
- maxframe/dataframe/misc/_duplicate.py +46 -0
- maxframe/dataframe/misc/accessor.py +276 -0
- maxframe/dataframe/misc/apply.py +692 -0
- maxframe/dataframe/misc/astype.py +236 -0
- maxframe/dataframe/misc/case_when.py +141 -0
- maxframe/dataframe/misc/check_monotonic.py +84 -0
- maxframe/dataframe/misc/cut.py +383 -0
- maxframe/dataframe/misc/datetimes.py +79 -0
- maxframe/dataframe/misc/describe.py +108 -0
- maxframe/dataframe/misc/diff.py +210 -0
- maxframe/dataframe/misc/drop.py +440 -0
- maxframe/dataframe/misc/drop_duplicates.py +248 -0
- maxframe/dataframe/misc/duplicated.py +292 -0
- maxframe/dataframe/misc/eval.py +728 -0
- maxframe/dataframe/misc/explode.py +171 -0
- maxframe/dataframe/misc/get_dummies.py +208 -0
- maxframe/dataframe/misc/isin.py +217 -0
- maxframe/dataframe/misc/map.py +236 -0
- maxframe/dataframe/misc/melt.py +162 -0
- maxframe/dataframe/misc/memory_usage.py +248 -0
- maxframe/dataframe/misc/pct_change.py +150 -0
- maxframe/dataframe/misc/pivot_table.py +262 -0
- maxframe/dataframe/misc/qcut.py +104 -0
- maxframe/dataframe/misc/select_dtypes.py +104 -0
- maxframe/dataframe/misc/shift.py +256 -0
- maxframe/dataframe/misc/stack.py +238 -0
- maxframe/dataframe/misc/string_.py +221 -0
- maxframe/dataframe/misc/tests/__init__.py +13 -0
- maxframe/dataframe/misc/tests/test_misc.py +468 -0
- maxframe/dataframe/misc/to_numeric.py +178 -0
- maxframe/dataframe/misc/transform.py +361 -0
- maxframe/dataframe/misc/transpose.py +136 -0
- maxframe/dataframe/misc/value_counts.py +182 -0
- maxframe/dataframe/missing/__init__.py +53 -0
- maxframe/dataframe/missing/checkna.py +223 -0
- maxframe/dataframe/missing/dropna.py +280 -0
- maxframe/dataframe/missing/fillna.py +275 -0
- maxframe/dataframe/missing/replace.py +439 -0
- maxframe/dataframe/missing/tests/__init__.py +13 -0
- maxframe/dataframe/missing/tests/test_missing.py +89 -0
- maxframe/dataframe/operators.py +273 -0
- maxframe/dataframe/plotting/__init__.py +40 -0
- maxframe/dataframe/plotting/core.py +78 -0
- maxframe/dataframe/plotting/tests/__init__.py +13 -0
- maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
- maxframe/dataframe/reduction/__init__.py +107 -0
- maxframe/dataframe/reduction/aggregation.py +344 -0
- maxframe/dataframe/reduction/all.py +78 -0
- maxframe/dataframe/reduction/any.py +78 -0
- maxframe/dataframe/reduction/core.py +837 -0
- maxframe/dataframe/reduction/count.py +59 -0
- maxframe/dataframe/reduction/cummax.py +30 -0
- maxframe/dataframe/reduction/cummin.py +30 -0
- maxframe/dataframe/reduction/cumprod.py +30 -0
- maxframe/dataframe/reduction/cumsum.py +30 -0
- maxframe/dataframe/reduction/custom_reduction.py +42 -0
- maxframe/dataframe/reduction/kurtosis.py +104 -0
- maxframe/dataframe/reduction/max.py +65 -0
- maxframe/dataframe/reduction/mean.py +61 -0
- maxframe/dataframe/reduction/min.py +65 -0
- maxframe/dataframe/reduction/nunique.py +141 -0
- maxframe/dataframe/reduction/prod.py +76 -0
- maxframe/dataframe/reduction/reduction_size.py +36 -0
- maxframe/dataframe/reduction/sem.py +69 -0
- maxframe/dataframe/reduction/skew.py +89 -0
- maxframe/dataframe/reduction/std.py +53 -0
- maxframe/dataframe/reduction/str_concat.py +48 -0
- maxframe/dataframe/reduction/sum.py +77 -0
- maxframe/dataframe/reduction/tests/__init__.py +13 -0
- maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
- maxframe/dataframe/reduction/unique.py +90 -0
- maxframe/dataframe/reduction/var.py +72 -0
- maxframe/dataframe/sort/__init__.py +34 -0
- maxframe/dataframe/sort/core.py +36 -0
- maxframe/dataframe/sort/sort_index.py +153 -0
- maxframe/dataframe/sort/sort_values.py +311 -0
- maxframe/dataframe/sort/tests/__init__.py +13 -0
- maxframe/dataframe/sort/tests/test_sort.py +81 -0
- maxframe/dataframe/statistics/__init__.py +33 -0
- maxframe/dataframe/statistics/corr.py +280 -0
- maxframe/dataframe/statistics/quantile.py +341 -0
- maxframe/dataframe/statistics/tests/__init__.py +13 -0
- maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
- maxframe/dataframe/tests/__init__.py +13 -0
- maxframe/dataframe/tests/test_initializer.py +29 -0
- maxframe/dataframe/tseries/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
- maxframe/dataframe/tseries/to_datetime.py +297 -0
- maxframe/dataframe/ufunc/__init__.py +27 -0
- maxframe/dataframe/ufunc/tensor.py +54 -0
- maxframe/dataframe/ufunc/ufunc.py +52 -0
- maxframe/dataframe/utils.py +1267 -0
- maxframe/dataframe/window/__init__.py +29 -0
- maxframe/dataframe/window/aggregation.py +96 -0
- maxframe/dataframe/window/core.py +69 -0
- maxframe/dataframe/window/ewm.py +249 -0
- maxframe/dataframe/window/expanding.py +147 -0
- maxframe/dataframe/window/rolling.py +376 -0
- maxframe/dataframe/window/tests/__init__.py +13 -0
- maxframe/dataframe/window/tests/test_ewm.py +70 -0
- maxframe/dataframe/window/tests/test_expanding.py +66 -0
- maxframe/dataframe/window/tests/test_rolling.py +57 -0
- maxframe/env.py +33 -0
- maxframe/errors.py +21 -0
- maxframe/extension.py +81 -0
- maxframe/learn/__init__.py +17 -0
- maxframe/learn/contrib/__init__.py +17 -0
- maxframe/learn/contrib/pytorch/__init__.py +16 -0
- maxframe/learn/contrib/pytorch/run_function.py +110 -0
- maxframe/learn/contrib/pytorch/run_script.py +102 -0
- maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
- maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
- maxframe/learn/contrib/utils.py +52 -0
- maxframe/learn/contrib/xgboost/__init__.py +26 -0
- maxframe/learn/contrib/xgboost/classifier.py +86 -0
- maxframe/learn/contrib/xgboost/core.py +156 -0
- maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
- maxframe/learn/contrib/xgboost/predict.py +138 -0
- maxframe/learn/contrib/xgboost/regressor.py +78 -0
- maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
- maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
- maxframe/learn/contrib/xgboost/train.py +121 -0
- maxframe/learn/utils/__init__.py +15 -0
- maxframe/learn/utils/core.py +29 -0
- maxframe/lib/__init__.py +15 -0
- maxframe/lib/aio/__init__.py +27 -0
- maxframe/lib/aio/_runners.py +162 -0
- maxframe/lib/aio/_threads.py +35 -0
- maxframe/lib/aio/base.py +82 -0
- maxframe/lib/aio/file.py +85 -0
- maxframe/lib/aio/isolation.py +100 -0
- maxframe/lib/aio/lru.py +242 -0
- maxframe/lib/aio/parallelism.py +37 -0
- maxframe/lib/aio/tests/__init__.py +13 -0
- maxframe/lib/aio/tests/test_aio_file.py +55 -0
- maxframe/lib/compression.py +55 -0
- maxframe/lib/cython/__init__.py +13 -0
- maxframe/lib/cython/libcpp.pxd +30 -0
- maxframe/lib/filesystem/__init__.py +21 -0
- maxframe/lib/filesystem/_glob.py +173 -0
- maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
- maxframe/lib/filesystem/_oss_lib/common.py +198 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
- maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
- maxframe/lib/filesystem/arrow.py +236 -0
- maxframe/lib/filesystem/base.py +263 -0
- maxframe/lib/filesystem/core.py +95 -0
- maxframe/lib/filesystem/fsmap.py +164 -0
- maxframe/lib/filesystem/hdfs.py +31 -0
- maxframe/lib/filesystem/local.py +112 -0
- maxframe/lib/filesystem/oss.py +157 -0
- maxframe/lib/filesystem/tests/__init__.py +13 -0
- maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
- maxframe/lib/filesystem/tests/test_oss.py +182 -0
- maxframe/lib/functools_compat.py +81 -0
- maxframe/lib/mmh3.cpython-38-darwin.so +0 -0
- maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
- maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
- maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
- maxframe/lib/sparse/__init__.py +861 -0
- maxframe/lib/sparse/array.py +1604 -0
- maxframe/lib/sparse/core.py +92 -0
- maxframe/lib/sparse/matrix.py +241 -0
- maxframe/lib/sparse/tests/__init__.py +15 -0
- maxframe/lib/sparse/tests/test_sparse.py +476 -0
- maxframe/lib/sparse/vector.py +150 -0
- maxframe/lib/tblib/LICENSE +20 -0
- maxframe/lib/tblib/__init__.py +327 -0
- maxframe/lib/tblib/cpython.py +83 -0
- maxframe/lib/tblib/decorators.py +44 -0
- maxframe/lib/tblib/pickling_support.py +90 -0
- maxframe/lib/tests/__init__.py +13 -0
- maxframe/lib/tests/test_wrapped_pickle.py +51 -0
- maxframe/lib/version.py +620 -0
- maxframe/lib/wrapped_pickle.py +139 -0
- maxframe/mixin.py +100 -0
- maxframe/odpsio/__init__.py +21 -0
- maxframe/odpsio/arrow.py +91 -0
- maxframe/odpsio/schema.py +364 -0
- maxframe/odpsio/tableio.py +322 -0
- maxframe/odpsio/tests/__init__.py +13 -0
- maxframe/odpsio/tests/test_arrow.py +88 -0
- maxframe/odpsio/tests/test_schema.py +297 -0
- maxframe/odpsio/tests/test_tableio.py +136 -0
- maxframe/odpsio/tests/test_volumeio.py +90 -0
- maxframe/odpsio/volumeio.py +95 -0
- maxframe/opcodes.py +590 -0
- maxframe/protocol.py +415 -0
- maxframe/remote/__init__.py +18 -0
- maxframe/remote/core.py +210 -0
- maxframe/remote/run_script.py +121 -0
- maxframe/serialization/__init__.py +26 -0
- maxframe/serialization/arrow.py +95 -0
- maxframe/serialization/core.cpython-38-darwin.so +0 -0
- maxframe/serialization/core.pxd +44 -0
- maxframe/serialization/core.pyi +61 -0
- maxframe/serialization/core.pyx +1094 -0
- maxframe/serialization/exception.py +86 -0
- maxframe/serialization/maxframe_objects.py +39 -0
- maxframe/serialization/numpy.py +91 -0
- maxframe/serialization/pandas.py +202 -0
- maxframe/serialization/scipy.py +71 -0
- maxframe/serialization/serializables/__init__.py +55 -0
- maxframe/serialization/serializables/core.py +262 -0
- maxframe/serialization/serializables/field.py +624 -0
- maxframe/serialization/serializables/field_type.py +589 -0
- maxframe/serialization/serializables/tests/__init__.py +13 -0
- maxframe/serialization/serializables/tests/test_field_type.py +121 -0
- maxframe/serialization/serializables/tests/test_serializable.py +250 -0
- maxframe/serialization/tests/__init__.py +13 -0
- maxframe/serialization/tests/test_serial.py +412 -0
- maxframe/session.py +1310 -0
- maxframe/tensor/__init__.py +183 -0
- maxframe/tensor/arithmetic/__init__.py +315 -0
- maxframe/tensor/arithmetic/abs.py +68 -0
- maxframe/tensor/arithmetic/absolute.py +68 -0
- maxframe/tensor/arithmetic/add.py +82 -0
- maxframe/tensor/arithmetic/angle.py +72 -0
- maxframe/tensor/arithmetic/arccos.py +104 -0
- maxframe/tensor/arithmetic/arccosh.py +91 -0
- maxframe/tensor/arithmetic/arcsin.py +94 -0
- maxframe/tensor/arithmetic/arcsinh.py +86 -0
- maxframe/tensor/arithmetic/arctan.py +106 -0
- maxframe/tensor/arithmetic/arctan2.py +128 -0
- maxframe/tensor/arithmetic/arctanh.py +86 -0
- maxframe/tensor/arithmetic/around.py +114 -0
- maxframe/tensor/arithmetic/bitand.py +95 -0
- maxframe/tensor/arithmetic/bitor.py +102 -0
- maxframe/tensor/arithmetic/bitxor.py +95 -0
- maxframe/tensor/arithmetic/cbrt.py +66 -0
- maxframe/tensor/arithmetic/ceil.py +71 -0
- maxframe/tensor/arithmetic/clip.py +165 -0
- maxframe/tensor/arithmetic/conj.py +74 -0
- maxframe/tensor/arithmetic/copysign.py +78 -0
- maxframe/tensor/arithmetic/core.py +544 -0
- maxframe/tensor/arithmetic/cos.py +85 -0
- maxframe/tensor/arithmetic/cosh.py +72 -0
- maxframe/tensor/arithmetic/deg2rad.py +72 -0
- maxframe/tensor/arithmetic/degrees.py +77 -0
- maxframe/tensor/arithmetic/divide.py +114 -0
- maxframe/tensor/arithmetic/equal.py +76 -0
- maxframe/tensor/arithmetic/exp.py +106 -0
- maxframe/tensor/arithmetic/exp2.py +67 -0
- maxframe/tensor/arithmetic/expm1.py +79 -0
- maxframe/tensor/arithmetic/fabs.py +74 -0
- maxframe/tensor/arithmetic/fix.py +69 -0
- maxframe/tensor/arithmetic/float_power.py +103 -0
- maxframe/tensor/arithmetic/floor.py +77 -0
- maxframe/tensor/arithmetic/floordiv.py +94 -0
- maxframe/tensor/arithmetic/fmax.py +105 -0
- maxframe/tensor/arithmetic/fmin.py +106 -0
- maxframe/tensor/arithmetic/fmod.py +99 -0
- maxframe/tensor/arithmetic/frexp.py +92 -0
- maxframe/tensor/arithmetic/greater.py +77 -0
- maxframe/tensor/arithmetic/greater_equal.py +69 -0
- maxframe/tensor/arithmetic/hypot.py +77 -0
- maxframe/tensor/arithmetic/i0.py +89 -0
- maxframe/tensor/arithmetic/imag.py +67 -0
- maxframe/tensor/arithmetic/invert.py +110 -0
- maxframe/tensor/arithmetic/isclose.py +115 -0
- maxframe/tensor/arithmetic/iscomplex.py +64 -0
- maxframe/tensor/arithmetic/isfinite.py +106 -0
- maxframe/tensor/arithmetic/isinf.py +103 -0
- maxframe/tensor/arithmetic/isnan.py +82 -0
- maxframe/tensor/arithmetic/isreal.py +63 -0
- maxframe/tensor/arithmetic/ldexp.py +99 -0
- maxframe/tensor/arithmetic/less.py +69 -0
- maxframe/tensor/arithmetic/less_equal.py +69 -0
- maxframe/tensor/arithmetic/log.py +92 -0
- maxframe/tensor/arithmetic/log10.py +85 -0
- maxframe/tensor/arithmetic/log1p.py +95 -0
- maxframe/tensor/arithmetic/log2.py +85 -0
- maxframe/tensor/arithmetic/logaddexp.py +80 -0
- maxframe/tensor/arithmetic/logaddexp2.py +78 -0
- maxframe/tensor/arithmetic/logical_and.py +81 -0
- maxframe/tensor/arithmetic/logical_not.py +74 -0
- maxframe/tensor/arithmetic/logical_or.py +82 -0
- maxframe/tensor/arithmetic/logical_xor.py +88 -0
- maxframe/tensor/arithmetic/lshift.py +82 -0
- maxframe/tensor/arithmetic/maximum.py +108 -0
- maxframe/tensor/arithmetic/minimum.py +108 -0
- maxframe/tensor/arithmetic/mod.py +104 -0
- maxframe/tensor/arithmetic/modf.py +83 -0
- maxframe/tensor/arithmetic/multiply.py +81 -0
- maxframe/tensor/arithmetic/nan_to_num.py +99 -0
- maxframe/tensor/arithmetic/negative.py +65 -0
- maxframe/tensor/arithmetic/nextafter.py +68 -0
- maxframe/tensor/arithmetic/not_equal.py +72 -0
- maxframe/tensor/arithmetic/positive.py +47 -0
- maxframe/tensor/arithmetic/power.py +106 -0
- maxframe/tensor/arithmetic/rad2deg.py +71 -0
- maxframe/tensor/arithmetic/radians.py +77 -0
- maxframe/tensor/arithmetic/real.py +70 -0
- maxframe/tensor/arithmetic/reciprocal.py +76 -0
- maxframe/tensor/arithmetic/rint.py +68 -0
- maxframe/tensor/arithmetic/rshift.py +81 -0
- maxframe/tensor/arithmetic/setimag.py +29 -0
- maxframe/tensor/arithmetic/setreal.py +29 -0
- maxframe/tensor/arithmetic/sign.py +81 -0
- maxframe/tensor/arithmetic/signbit.py +65 -0
- maxframe/tensor/arithmetic/sin.py +98 -0
- maxframe/tensor/arithmetic/sinc.py +102 -0
- maxframe/tensor/arithmetic/sinh.py +93 -0
- maxframe/tensor/arithmetic/spacing.py +72 -0
- maxframe/tensor/arithmetic/sqrt.py +81 -0
- maxframe/tensor/arithmetic/square.py +69 -0
- maxframe/tensor/arithmetic/subtract.py +81 -0
- maxframe/tensor/arithmetic/tan.py +88 -0
- maxframe/tensor/arithmetic/tanh.py +92 -0
- maxframe/tensor/arithmetic/tests/__init__.py +15 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
- maxframe/tensor/arithmetic/truediv.py +104 -0
- maxframe/tensor/arithmetic/trunc.py +72 -0
- maxframe/tensor/arithmetic/utils.py +65 -0
- maxframe/tensor/array_utils.py +186 -0
- maxframe/tensor/base/__init__.py +34 -0
- maxframe/tensor/base/astype.py +119 -0
- maxframe/tensor/base/atleast_1d.py +74 -0
- maxframe/tensor/base/broadcast_to.py +89 -0
- maxframe/tensor/base/ravel.py +92 -0
- maxframe/tensor/base/tests/__init__.py +13 -0
- maxframe/tensor/base/tests/test_base.py +114 -0
- maxframe/tensor/base/transpose.py +125 -0
- maxframe/tensor/base/unique.py +205 -0
- maxframe/tensor/base/where.py +127 -0
- maxframe/tensor/core.py +724 -0
- maxframe/tensor/datasource/__init__.py +32 -0
- maxframe/tensor/datasource/arange.py +156 -0
- maxframe/tensor/datasource/array.py +415 -0
- maxframe/tensor/datasource/core.py +109 -0
- maxframe/tensor/datasource/empty.py +169 -0
- maxframe/tensor/datasource/from_dataframe.py +70 -0
- maxframe/tensor/datasource/from_dense.py +54 -0
- maxframe/tensor/datasource/from_sparse.py +47 -0
- maxframe/tensor/datasource/full.py +186 -0
- maxframe/tensor/datasource/ones.py +173 -0
- maxframe/tensor/datasource/scalar.py +40 -0
- maxframe/tensor/datasource/tests/__init__.py +13 -0
- maxframe/tensor/datasource/tests/test_datasource.py +278 -0
- maxframe/tensor/datasource/zeros.py +188 -0
- maxframe/tensor/fetch/__init__.py +15 -0
- maxframe/tensor/fetch/core.py +54 -0
- maxframe/tensor/indexing/__init__.py +47 -0
- maxframe/tensor/indexing/choose.py +196 -0
- maxframe/tensor/indexing/compress.py +124 -0
- maxframe/tensor/indexing/core.py +190 -0
- maxframe/tensor/indexing/extract.py +71 -0
- maxframe/tensor/indexing/fill_diagonal.py +183 -0
- maxframe/tensor/indexing/flatnonzero.py +60 -0
- maxframe/tensor/indexing/getitem.py +175 -0
- maxframe/tensor/indexing/nonzero.py +120 -0
- maxframe/tensor/indexing/setitem.py +132 -0
- maxframe/tensor/indexing/slice.py +29 -0
- maxframe/tensor/indexing/take.py +130 -0
- maxframe/tensor/indexing/tests/__init__.py +15 -0
- maxframe/tensor/indexing/tests/test_indexing.py +234 -0
- maxframe/tensor/indexing/unravel_index.py +103 -0
- maxframe/tensor/merge/__init__.py +15 -0
- maxframe/tensor/merge/stack.py +132 -0
- maxframe/tensor/merge/tests/__init__.py +13 -0
- maxframe/tensor/merge/tests/test_merge.py +52 -0
- maxframe/tensor/operators.py +123 -0
- maxframe/tensor/random/__init__.py +168 -0
- maxframe/tensor/random/beta.py +87 -0
- maxframe/tensor/random/binomial.py +137 -0
- maxframe/tensor/random/bytes.py +39 -0
- maxframe/tensor/random/chisquare.py +110 -0
- maxframe/tensor/random/choice.py +186 -0
- maxframe/tensor/random/core.py +234 -0
- maxframe/tensor/random/dirichlet.py +123 -0
- maxframe/tensor/random/exponential.py +94 -0
- maxframe/tensor/random/f.py +135 -0
- maxframe/tensor/random/gamma.py +128 -0
- maxframe/tensor/random/geometric.py +93 -0
- maxframe/tensor/random/gumbel.py +167 -0
- maxframe/tensor/random/hypergeometric.py +148 -0
- maxframe/tensor/random/laplace.py +133 -0
- maxframe/tensor/random/logistic.py +129 -0
- maxframe/tensor/random/lognormal.py +159 -0
- maxframe/tensor/random/logseries.py +122 -0
- maxframe/tensor/random/multinomial.py +133 -0
- maxframe/tensor/random/multivariate_normal.py +192 -0
- maxframe/tensor/random/negative_binomial.py +125 -0
- maxframe/tensor/random/noncentral_chisquare.py +132 -0
- maxframe/tensor/random/noncentral_f.py +126 -0
- maxframe/tensor/random/normal.py +143 -0
- maxframe/tensor/random/pareto.py +140 -0
- maxframe/tensor/random/permutation.py +104 -0
- maxframe/tensor/random/poisson.py +111 -0
- maxframe/tensor/random/power.py +142 -0
- maxframe/tensor/random/rand.py +82 -0
- maxframe/tensor/random/randint.py +121 -0
- maxframe/tensor/random/randn.py +96 -0
- maxframe/tensor/random/random_integers.py +123 -0
- maxframe/tensor/random/random_sample.py +86 -0
- maxframe/tensor/random/rayleigh.py +110 -0
- maxframe/tensor/random/shuffle.py +61 -0
- maxframe/tensor/random/standard_cauchy.py +105 -0
- maxframe/tensor/random/standard_exponential.py +72 -0
- maxframe/tensor/random/standard_gamma.py +120 -0
- maxframe/tensor/random/standard_normal.py +74 -0
- maxframe/tensor/random/standard_t.py +135 -0
- maxframe/tensor/random/tests/__init__.py +15 -0
- maxframe/tensor/random/tests/test_random.py +167 -0
- maxframe/tensor/random/triangular.py +119 -0
- maxframe/tensor/random/uniform.py +131 -0
- maxframe/tensor/random/vonmises.py +131 -0
- maxframe/tensor/random/wald.py +114 -0
- maxframe/tensor/random/weibull.py +140 -0
- maxframe/tensor/random/zipf.py +122 -0
- maxframe/tensor/rechunk/__init__.py +26 -0
- maxframe/tensor/rechunk/rechunk.py +43 -0
- maxframe/tensor/reduction/__init__.py +66 -0
- maxframe/tensor/reduction/all.py +103 -0
- maxframe/tensor/reduction/allclose.py +88 -0
- maxframe/tensor/reduction/any.py +105 -0
- maxframe/tensor/reduction/argmax.py +103 -0
- maxframe/tensor/reduction/argmin.py +103 -0
- maxframe/tensor/reduction/array_equal.py +64 -0
- maxframe/tensor/reduction/core.py +168 -0
- maxframe/tensor/reduction/count_nonzero.py +81 -0
- maxframe/tensor/reduction/cumprod.py +97 -0
- maxframe/tensor/reduction/cumsum.py +101 -0
- maxframe/tensor/reduction/max.py +120 -0
- maxframe/tensor/reduction/mean.py +123 -0
- maxframe/tensor/reduction/min.py +120 -0
- maxframe/tensor/reduction/nanargmax.py +82 -0
- maxframe/tensor/reduction/nanargmin.py +76 -0
- maxframe/tensor/reduction/nancumprod.py +91 -0
- maxframe/tensor/reduction/nancumsum.py +94 -0
- maxframe/tensor/reduction/nanmax.py +111 -0
- maxframe/tensor/reduction/nanmean.py +106 -0
- maxframe/tensor/reduction/nanmin.py +111 -0
- maxframe/tensor/reduction/nanprod.py +94 -0
- maxframe/tensor/reduction/nanstd.py +126 -0
- maxframe/tensor/reduction/nansum.py +115 -0
- maxframe/tensor/reduction/nanvar.py +149 -0
- maxframe/tensor/reduction/prod.py +130 -0
- maxframe/tensor/reduction/std.py +134 -0
- maxframe/tensor/reduction/sum.py +125 -0
- maxframe/tensor/reduction/tests/__init__.py +13 -0
- maxframe/tensor/reduction/tests/test_reduction.py +181 -0
- maxframe/tensor/reduction/var.py +176 -0
- maxframe/tensor/reshape/__init__.py +17 -0
- maxframe/tensor/reshape/reshape.py +188 -0
- maxframe/tensor/reshape/tests/__init__.py +15 -0
- maxframe/tensor/reshape/tests/test_reshape.py +37 -0
- maxframe/tensor/statistics/__init__.py +13 -0
- maxframe/tensor/statistics/percentile.py +175 -0
- maxframe/tensor/statistics/quantile.py +288 -0
- maxframe/tensor/ufunc/__init__.py +26 -0
- maxframe/tensor/ufunc/ufunc.py +200 -0
- maxframe/tensor/utils.py +718 -0
- maxframe/tests/__init__.py +13 -0
- maxframe/tests/test_codegen.py +69 -0
- maxframe/tests/test_protocol.py +144 -0
- maxframe/tests/test_utils.py +376 -0
- maxframe/tests/utils.py +164 -0
- maxframe/typing_.py +37 -0
- maxframe/udf.py +134 -0
- maxframe/utils.py +1114 -0
- maxframe-0.1.0b5.dist-info/METADATA +104 -0
- maxframe-0.1.0b5.dist-info/RECORD +647 -0
- maxframe-0.1.0b5.dist-info/WHEEL +5 -0
- maxframe-0.1.0b5.dist-info/top_level.txt +2 -0
- maxframe_client/__init__.py +17 -0
- maxframe_client/clients/__init__.py +13 -0
- maxframe_client/clients/framedriver.py +118 -0
- maxframe_client/clients/spe.py +104 -0
- maxframe_client/conftest.py +15 -0
- maxframe_client/fetcher.py +264 -0
- maxframe_client/session/__init__.py +22 -0
- maxframe_client/session/consts.py +36 -0
- maxframe_client/session/graph.py +119 -0
- maxframe_client/session/odps.py +482 -0
- maxframe_client/session/task.py +280 -0
- maxframe_client/session/tests/__init__.py +13 -0
- maxframe_client/session/tests/test_task.py +85 -0
- maxframe_client/tests/__init__.py +13 -0
- maxframe_client/tests/test_fetcher.py +89 -0
- maxframe_client/tests/test_session.py +255 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from .clients.framedriver import FrameDriverClient
|
|
16
|
+
from .clients.spe import SPEClient
|
|
17
|
+
from .session import MaxFrameRestSession
|
|
@@ -0,0 +1,13 @@
|
|
|
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.
|
|
@@ -0,0 +1,118 @@
|
|
|
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, List
|
|
16
|
+
|
|
17
|
+
import msgpack
|
|
18
|
+
from tornado import httpclient
|
|
19
|
+
|
|
20
|
+
from maxframe.core import TileableGraph
|
|
21
|
+
from maxframe.protocol import (
|
|
22
|
+
CreateSessionRequest,
|
|
23
|
+
DagInfo,
|
|
24
|
+
DecrefRequest,
|
|
25
|
+
ExecuteDagRequest,
|
|
26
|
+
ProtocolBody,
|
|
27
|
+
ResultInfo,
|
|
28
|
+
SessionInfo,
|
|
29
|
+
)
|
|
30
|
+
from maxframe.typing_ import TimeoutType
|
|
31
|
+
from maxframe.utils import (
|
|
32
|
+
format_timeout_params,
|
|
33
|
+
serialize_serializable,
|
|
34
|
+
wait_http_response,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class FrameDriverClient:
|
|
39
|
+
def __init__(self, endpoint: str):
|
|
40
|
+
self._endpoint = endpoint.rstrip("/")
|
|
41
|
+
|
|
42
|
+
async def create_session(self, settings: Dict[str, Any] = None) -> SessionInfo:
|
|
43
|
+
req_body: ProtocolBody[CreateSessionRequest] = ProtocolBody(
|
|
44
|
+
body=CreateSessionRequest(settings=settings)
|
|
45
|
+
)
|
|
46
|
+
req_url = f"{self._endpoint}/api/sessions"
|
|
47
|
+
resp = await httpclient.AsyncHTTPClient().fetch(
|
|
48
|
+
req_url, method="POST", body=serialize_serializable(req_body)
|
|
49
|
+
)
|
|
50
|
+
return SessionInfo.from_json(msgpack.loads(resp.body))
|
|
51
|
+
|
|
52
|
+
async def get_session(self, session_id: str) -> SessionInfo:
|
|
53
|
+
req_url = f"{self._endpoint}/api/sessions/{session_id}"
|
|
54
|
+
resp = await httpclient.AsyncHTTPClient().fetch(req_url, method="GET")
|
|
55
|
+
return SessionInfo.from_json(msgpack.loads(resp.body))
|
|
56
|
+
|
|
57
|
+
async def delete_session(self, session_id: str):
|
|
58
|
+
req_url = f"{self._endpoint}/api/sessions/{session_id}"
|
|
59
|
+
await httpclient.AsyncHTTPClient().fetch(req_url, method="DELETE")
|
|
60
|
+
|
|
61
|
+
async def submit_dag(
|
|
62
|
+
self,
|
|
63
|
+
session_id: str,
|
|
64
|
+
dag: TileableGraph,
|
|
65
|
+
managed_input_infos: Dict[str, ResultInfo] = None,
|
|
66
|
+
) -> DagInfo:
|
|
67
|
+
req_url = f"{self._endpoint}/api/sessions/{session_id}/dags"
|
|
68
|
+
req_body = ExecuteDagRequest(session_id, dag, managed_input_infos)
|
|
69
|
+
resp = await httpclient.AsyncHTTPClient().fetch(
|
|
70
|
+
req_url,
|
|
71
|
+
method="POST",
|
|
72
|
+
body=serialize_serializable(ProtocolBody(body=req_body)),
|
|
73
|
+
)
|
|
74
|
+
return DagInfo.from_json(msgpack.loads(resp.body))
|
|
75
|
+
|
|
76
|
+
async def get_dag_info(self, session_id: str, dag_id: str) -> DagInfo:
|
|
77
|
+
req_url = f"{self._endpoint}/api/sessions/{session_id}/dags/{dag_id}"
|
|
78
|
+
resp = await httpclient.AsyncHTTPClient().fetch(req_url, method="GET")
|
|
79
|
+
return DagInfo.from_json(msgpack.loads(resp.body))
|
|
80
|
+
|
|
81
|
+
async def wait_dag(self, session_id: str, dag_id: str, timeout: TimeoutType = None):
|
|
82
|
+
query_part = format_timeout_params(timeout)
|
|
83
|
+
req_url = (
|
|
84
|
+
f"{self._endpoint}/api/sessions/{session_id}/dags/{dag_id}{query_part}"
|
|
85
|
+
)
|
|
86
|
+
try:
|
|
87
|
+
resp = await wait_http_response(
|
|
88
|
+
req_url, method="GET", request_timeout=timeout
|
|
89
|
+
)
|
|
90
|
+
info = DagInfo.from_json(msgpack.loads(resp.body))
|
|
91
|
+
except TimeoutError:
|
|
92
|
+
info = await self.get_dag_info(session_id, dag_id)
|
|
93
|
+
return info
|
|
94
|
+
|
|
95
|
+
async def cancel_dag(
|
|
96
|
+
self, session_id: str, dag_id: str, timeout: TimeoutType = None
|
|
97
|
+
):
|
|
98
|
+
query_part = format_timeout_params(timeout)
|
|
99
|
+
req_url = (
|
|
100
|
+
f"{self._endpoint}/api/sessions/{session_id}/dags/{dag_id}{query_part}"
|
|
101
|
+
)
|
|
102
|
+
try:
|
|
103
|
+
resp = await wait_http_response(
|
|
104
|
+
req_url, method="DELETE", request_timeout=timeout
|
|
105
|
+
)
|
|
106
|
+
info = DagInfo.from_json(msgpack.loads(resp.body))
|
|
107
|
+
except TimeoutError:
|
|
108
|
+
info = await self.get_dag_info(session_id, dag_id)
|
|
109
|
+
return info
|
|
110
|
+
|
|
111
|
+
async def decref(self, session_id: str, tileable_keys: List[str]) -> None:
|
|
112
|
+
req_url = f"{self._endpoint}/api/sessions/{session_id}/lifecycle?decref"
|
|
113
|
+
req_body = DecrefRequest(tileable_keys)
|
|
114
|
+
await wait_http_response(
|
|
115
|
+
req_url,
|
|
116
|
+
method="POST",
|
|
117
|
+
body=serialize_serializable(ProtocolBody(body=req_body)),
|
|
118
|
+
)
|
|
@@ -0,0 +1,104 @@
|
|
|
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, Optional
|
|
16
|
+
|
|
17
|
+
from tornado import httpclient
|
|
18
|
+
|
|
19
|
+
from maxframe.core import TileableGraph
|
|
20
|
+
from maxframe.protocol import ExecuteSubDagRequest, ProtocolBody, SubDagInfo
|
|
21
|
+
from maxframe.typing_ import TimeoutType
|
|
22
|
+
from maxframe.utils import (
|
|
23
|
+
deserialize_serializable,
|
|
24
|
+
format_timeout_params,
|
|
25
|
+
serialize_serializable,
|
|
26
|
+
wait_http_response,
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
class SPEClient:
|
|
31
|
+
def __init__(
|
|
32
|
+
self,
|
|
33
|
+
endpoint: str,
|
|
34
|
+
session_id: Optional[str] = None,
|
|
35
|
+
host: str = None,
|
|
36
|
+
):
|
|
37
|
+
self._endpoint = endpoint.rstrip("/")
|
|
38
|
+
self._session_id = session_id
|
|
39
|
+
self._headers = {"Host": host}
|
|
40
|
+
|
|
41
|
+
@staticmethod
|
|
42
|
+
def _load_subdag_info(resp: httpclient.HTTPResponse) -> SubDagInfo:
|
|
43
|
+
res: ProtocolBody[SubDagInfo] = deserialize_serializable(resp.body)
|
|
44
|
+
return res.body
|
|
45
|
+
|
|
46
|
+
async def submit_subdag(
|
|
47
|
+
self, subdag: TileableGraph, settings: Dict[str, Any] = None
|
|
48
|
+
) -> SubDagInfo:
|
|
49
|
+
req_url = f"{self._endpoint}/api/subdags"
|
|
50
|
+
req_body: ProtocolBody[ExecuteSubDagRequest] = ProtocolBody(
|
|
51
|
+
body=ExecuteSubDagRequest(dag=subdag, settings=settings),
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
if self._session_id is not None:
|
|
55
|
+
req_url += f"?session_id={self._session_id}"
|
|
56
|
+
|
|
57
|
+
resp = await httpclient.AsyncHTTPClient().fetch(
|
|
58
|
+
req_url,
|
|
59
|
+
method="POST",
|
|
60
|
+
headers=self._headers,
|
|
61
|
+
body=serialize_serializable(req_body),
|
|
62
|
+
)
|
|
63
|
+
return self._load_subdag_info(resp)
|
|
64
|
+
|
|
65
|
+
async def get_subdag_info(self, subdag_id: str) -> SubDagInfo:
|
|
66
|
+
req_url = f"{self._endpoint}/api/subdags/{subdag_id}?wait=0"
|
|
67
|
+
resp = await httpclient.AsyncHTTPClient().fetch(
|
|
68
|
+
req_url,
|
|
69
|
+
method="GET",
|
|
70
|
+
headers=self._headers,
|
|
71
|
+
)
|
|
72
|
+
return self._load_subdag_info(resp)
|
|
73
|
+
|
|
74
|
+
async def wait_subdag(
|
|
75
|
+
self, subdag_id: str, wait_timeout: TimeoutType = None
|
|
76
|
+
) -> SubDagInfo:
|
|
77
|
+
req_url = f"{self._endpoint}/api/subdags/{subdag_id}"
|
|
78
|
+
params = format_timeout_params(wait_timeout)
|
|
79
|
+
try:
|
|
80
|
+
resp = await wait_http_response(
|
|
81
|
+
req_url + params,
|
|
82
|
+
method="GET",
|
|
83
|
+
headers=self._headers,
|
|
84
|
+
request_timeout=wait_timeout,
|
|
85
|
+
)
|
|
86
|
+
return self._load_subdag_info(resp)
|
|
87
|
+
except TimeoutError:
|
|
88
|
+
return await self.get_subdag_info(subdag_id)
|
|
89
|
+
|
|
90
|
+
async def cancel_subdag(
|
|
91
|
+
self, subdag_id: str, wait_timeout: TimeoutType = None
|
|
92
|
+
) -> SubDagInfo:
|
|
93
|
+
req_url = f"{self._endpoint}/api/subdags/{subdag_id}"
|
|
94
|
+
params = format_timeout_params(wait_timeout)
|
|
95
|
+
try:
|
|
96
|
+
resp = await wait_http_response(
|
|
97
|
+
req_url + params,
|
|
98
|
+
method="DELETE",
|
|
99
|
+
headers=self._headers,
|
|
100
|
+
request_timeout=wait_timeout,
|
|
101
|
+
)
|
|
102
|
+
return self._load_subdag_info(resp)
|
|
103
|
+
except TimeoutError:
|
|
104
|
+
return await self.get_subdag_info(subdag_id)
|
|
@@ -0,0 +1,15 @@
|
|
|
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 maxframe.conftest import * # noqa: F401
|
|
@@ -0,0 +1,264 @@
|
|
|
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 base64
|
|
16
|
+
import json
|
|
17
|
+
from abc import ABC, abstractmethod
|
|
18
|
+
from numbers import Integral
|
|
19
|
+
from typing import Any, Dict, List, Optional, Type, Union
|
|
20
|
+
|
|
21
|
+
import pandas as pd
|
|
22
|
+
import pyarrow as pa
|
|
23
|
+
from odps import ODPS
|
|
24
|
+
from odps.models import ExternalVolume, PartedVolume
|
|
25
|
+
from odps.tunnel import TableTunnel
|
|
26
|
+
from tornado import httpclient
|
|
27
|
+
|
|
28
|
+
from maxframe.core import OBJECT_TYPE
|
|
29
|
+
from maxframe.dataframe.core import DATAFRAME_TYPE
|
|
30
|
+
from maxframe.lib import wrapped_pickle as pickle
|
|
31
|
+
from maxframe.odpsio import HaloTableIO, arrow_to_pandas, build_dataframe_table_meta
|
|
32
|
+
from maxframe.protocol import (
|
|
33
|
+
DataFrameTableMeta,
|
|
34
|
+
ODPSTableResultInfo,
|
|
35
|
+
ODPSVolumeResultInfo,
|
|
36
|
+
ResultInfo,
|
|
37
|
+
ResultType,
|
|
38
|
+
)
|
|
39
|
+
from maxframe.tensor.core import TENSOR_TYPE
|
|
40
|
+
from maxframe.typing_ import PandasObjectTypes, TileableType
|
|
41
|
+
from maxframe.utils import ToThreadMixin, deserialize_serializable
|
|
42
|
+
|
|
43
|
+
_result_fetchers: Dict[ResultType, Type["ResultFetcher"]] = dict()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def register_fetcher(fetcher_cls: Type["ResultFetcher"]):
|
|
47
|
+
_result_fetchers[fetcher_cls.result_type] = fetcher_cls
|
|
48
|
+
return fetcher_cls
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def get_fetcher_cls(result_type: ResultType) -> Type["ResultFetcher"]:
|
|
52
|
+
return _result_fetchers[result_type]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class ResultFetcher(ABC):
|
|
56
|
+
result_type = None
|
|
57
|
+
|
|
58
|
+
def __init__(self, odps_entry: ODPS):
|
|
59
|
+
self._odps_entry = odps_entry
|
|
60
|
+
|
|
61
|
+
@abstractmethod
|
|
62
|
+
async def update_tileable_meta(
|
|
63
|
+
self,
|
|
64
|
+
tileable: TileableType,
|
|
65
|
+
info: ResultInfo,
|
|
66
|
+
) -> None:
|
|
67
|
+
raise NotImplementedError
|
|
68
|
+
|
|
69
|
+
@abstractmethod
|
|
70
|
+
async def fetch(
|
|
71
|
+
self,
|
|
72
|
+
tileable: TileableType,
|
|
73
|
+
info: ResultInfo,
|
|
74
|
+
indexes: List[Union[None, Integral, slice]],
|
|
75
|
+
) -> Any:
|
|
76
|
+
raise NotImplementedError
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
@register_fetcher
|
|
80
|
+
class NullFetcher(ResultFetcher):
|
|
81
|
+
result_type = ResultType.NULL
|
|
82
|
+
|
|
83
|
+
async def update_tileable_meta(
|
|
84
|
+
self,
|
|
85
|
+
tileable: TileableType,
|
|
86
|
+
info: ResultInfo,
|
|
87
|
+
) -> None:
|
|
88
|
+
return
|
|
89
|
+
|
|
90
|
+
async def fetch(
|
|
91
|
+
self,
|
|
92
|
+
tileable: TileableType,
|
|
93
|
+
info: ODPSTableResultInfo,
|
|
94
|
+
indexes: List[Union[None, Integral, slice]],
|
|
95
|
+
) -> None:
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
@register_fetcher
|
|
100
|
+
class ODPSTableFetcher(ToThreadMixin, ResultFetcher):
|
|
101
|
+
result_type = ResultType.ODPS_TABLE
|
|
102
|
+
|
|
103
|
+
def _get_table_comment(self, table_name: str) -> Optional[str]:
|
|
104
|
+
table = self._odps_entry.get_table(table_name)
|
|
105
|
+
return getattr(table, "comment", None)
|
|
106
|
+
|
|
107
|
+
async def update_tileable_meta(
|
|
108
|
+
self,
|
|
109
|
+
tileable: TileableType,
|
|
110
|
+
info: ODPSTableResultInfo,
|
|
111
|
+
) -> None:
|
|
112
|
+
if isinstance(tileable, DATAFRAME_TYPE) and tileable.dtypes is None:
|
|
113
|
+
tb_comment = await self.to_thread(
|
|
114
|
+
self._get_table_comment, info.full_table_name
|
|
115
|
+
)
|
|
116
|
+
if tb_comment: # pragma: no branch
|
|
117
|
+
comment_data = json.loads(tb_comment)
|
|
118
|
+
|
|
119
|
+
table_meta: DataFrameTableMeta = deserialize_serializable(
|
|
120
|
+
base64.b64decode(comment_data["table_meta"])
|
|
121
|
+
)
|
|
122
|
+
tileable.refresh_from_table_meta(table_meta)
|
|
123
|
+
|
|
124
|
+
if tileable.shape and any(pd.isna(x) for x in tileable.shape):
|
|
125
|
+
part_specs = [None] if not info.partition_specs else info.partition_specs
|
|
126
|
+
tunnel = TableTunnel(self._odps_entry)
|
|
127
|
+
total_records = 0
|
|
128
|
+
for part_spec in part_specs:
|
|
129
|
+
session = tunnel.create_download_session(
|
|
130
|
+
info.full_table_name, part_spec
|
|
131
|
+
)
|
|
132
|
+
total_records += session.count
|
|
133
|
+
new_shape_list = list(tileable.shape)
|
|
134
|
+
new_shape_list[-1] = total_records
|
|
135
|
+
tileable.params = {"shape": tuple(new_shape_list)}
|
|
136
|
+
|
|
137
|
+
def _read_single_source(
|
|
138
|
+
self,
|
|
139
|
+
table_meta: DataFrameTableMeta,
|
|
140
|
+
info: ODPSTableResultInfo,
|
|
141
|
+
indexes: List[Union[None, Integral, slice]],
|
|
142
|
+
):
|
|
143
|
+
table_io = HaloTableIO(self._odps_entry)
|
|
144
|
+
read_kw = {}
|
|
145
|
+
row_step = None
|
|
146
|
+
if indexes:
|
|
147
|
+
if len(indexes) < 2:
|
|
148
|
+
indexes += [None]
|
|
149
|
+
row_sel, col_sel = indexes
|
|
150
|
+
if isinstance(row_sel, slice):
|
|
151
|
+
if row_sel.start or row_sel.stop:
|
|
152
|
+
read_kw["start"] = row_sel.start
|
|
153
|
+
read_kw["stop"] = row_sel.stop
|
|
154
|
+
read_kw["reverse_range"] = (
|
|
155
|
+
row_sel.step is not None and row_sel.step < 0
|
|
156
|
+
)
|
|
157
|
+
row_step = row_sel.step
|
|
158
|
+
elif isinstance(row_sel, int):
|
|
159
|
+
read_kw["start"] = row_sel
|
|
160
|
+
read_kw["stop"] = row_sel + 1
|
|
161
|
+
row_step = None
|
|
162
|
+
elif row_sel is not None: # pragma: no cover
|
|
163
|
+
raise NotImplementedError(f"Does not support row index {row_sel!r}")
|
|
164
|
+
|
|
165
|
+
if isinstance(col_sel, (int, slice)):
|
|
166
|
+
data_cols = table_meta.table_column_names[col_sel]
|
|
167
|
+
if isinstance(col_sel, int):
|
|
168
|
+
data_cols = [data_cols]
|
|
169
|
+
read_kw["columns"] = table_meta.table_index_column_names + data_cols
|
|
170
|
+
elif col_sel is not None: # pragma: no cover
|
|
171
|
+
raise NotImplementedError(f"Does not support column index {row_sel!r}")
|
|
172
|
+
|
|
173
|
+
with table_io.open_reader(
|
|
174
|
+
info.full_table_name, info.partition_specs, **read_kw
|
|
175
|
+
) as reader:
|
|
176
|
+
reader_count = reader.count
|
|
177
|
+
result = reader.read_all()
|
|
178
|
+
|
|
179
|
+
if not row_step:
|
|
180
|
+
return result
|
|
181
|
+
|
|
182
|
+
if row_step >= 0:
|
|
183
|
+
slice_start = 0
|
|
184
|
+
slice_stop = reader_count
|
|
185
|
+
else:
|
|
186
|
+
slice_start = reader_count - 1
|
|
187
|
+
slice_stop = None
|
|
188
|
+
return result[slice_start:slice_stop:row_step]
|
|
189
|
+
|
|
190
|
+
async def fetch(
|
|
191
|
+
self,
|
|
192
|
+
tileable: TileableType,
|
|
193
|
+
info: ODPSTableResultInfo,
|
|
194
|
+
indexes: List[Union[None, Integral, slice]],
|
|
195
|
+
) -> PandasObjectTypes:
|
|
196
|
+
table_meta = build_dataframe_table_meta(tileable)
|
|
197
|
+
arrow_table: pa.Table = await self.to_thread(
|
|
198
|
+
self._read_single_source, table_meta, info, indexes
|
|
199
|
+
)
|
|
200
|
+
return arrow_to_pandas(arrow_table, table_meta)
|
|
201
|
+
|
|
202
|
+
|
|
203
|
+
@register_fetcher
|
|
204
|
+
class ODPSVolumeFetcher(ToThreadMixin, ResultFetcher):
|
|
205
|
+
result_type = ResultType.ODPS_VOLUME
|
|
206
|
+
|
|
207
|
+
async def update_tileable_meta(
|
|
208
|
+
self,
|
|
209
|
+
tileable: TileableType,
|
|
210
|
+
info: ODPSVolumeResultInfo,
|
|
211
|
+
) -> None:
|
|
212
|
+
return
|
|
213
|
+
|
|
214
|
+
async def _read_parted_volume_data(
|
|
215
|
+
self, volume: PartedVolume, partition: str, file_name: str
|
|
216
|
+
) -> bytes:
|
|
217
|
+
def sync_read():
|
|
218
|
+
with volume.open_reader(partition, file_name) as reader:
|
|
219
|
+
return reader.read()
|
|
220
|
+
|
|
221
|
+
return await self.to_thread(sync_read)
|
|
222
|
+
|
|
223
|
+
async def _read_external_volume_data(
|
|
224
|
+
self, volume: ExternalVolume, path: str, file_name: str
|
|
225
|
+
) -> bytes:
|
|
226
|
+
signed_url = await self.to_thread(
|
|
227
|
+
volume.get_sign_url, path + "/" + file_name, "GET"
|
|
228
|
+
)
|
|
229
|
+
http_client = httpclient.AsyncHTTPClient()
|
|
230
|
+
|
|
231
|
+
resp = await http_client.fetch(signed_url)
|
|
232
|
+
if hasattr(resp, "status_code") and resp.code >= 400:
|
|
233
|
+
try:
|
|
234
|
+
import oss2.exceptions
|
|
235
|
+
|
|
236
|
+
oss_exc = oss2.exceptions.make_exception(resp.body)
|
|
237
|
+
raise oss_exc
|
|
238
|
+
except ImportError:
|
|
239
|
+
raise SystemError(resp.body)
|
|
240
|
+
return resp.body
|
|
241
|
+
|
|
242
|
+
async def _fetch_object(self, info: ODPSVolumeResultInfo) -> Any:
|
|
243
|
+
volume = await self.to_thread(self._odps_entry.get_volume, info.volume_name)
|
|
244
|
+
if isinstance(volume, PartedVolume):
|
|
245
|
+
byte_data = await self._read_parted_volume_data(
|
|
246
|
+
volume, info.volume_path, "data"
|
|
247
|
+
)
|
|
248
|
+
elif isinstance(volume, ExternalVolume):
|
|
249
|
+
byte_data = await self._read_external_volume_data(
|
|
250
|
+
volume, info.volume_path, "data"
|
|
251
|
+
)
|
|
252
|
+
else:
|
|
253
|
+
raise NotImplementedError(f"Volume type {type(volume)} not supported")
|
|
254
|
+
return pickle.loads(byte_data)
|
|
255
|
+
|
|
256
|
+
async def fetch(
|
|
257
|
+
self,
|
|
258
|
+
tileable: TileableType,
|
|
259
|
+
info: ODPSVolumeResultInfo,
|
|
260
|
+
indexes: List[Union[Integral, slice]],
|
|
261
|
+
) -> Any:
|
|
262
|
+
if isinstance(tileable, (OBJECT_TYPE, TENSOR_TYPE)):
|
|
263
|
+
return await self._fetch_object(info)
|
|
264
|
+
raise NotImplementedError(f"Fetching {type(tileable)} not implemented")
|
|
@@ -0,0 +1,22 @@
|
|
|
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 .odps import MaxFrameRestSession
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def register_session_schemes(overwrite: bool = False):
|
|
19
|
+
from . import odps, task
|
|
20
|
+
|
|
21
|
+
odps.register_session_schemes(overwrite=overwrite)
|
|
22
|
+
task.register_session_schemes(overwrite=overwrite)
|
|
@@ -0,0 +1,36 @@
|
|
|
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
|
+
# Restful Service
|
|
16
|
+
RESTFUL_SESSION_INSECURE_SCHEME = "mf"
|
|
17
|
+
RESTFUL_SESSION_SECURE_SCHEME = "mfs"
|
|
18
|
+
|
|
19
|
+
# ODPS
|
|
20
|
+
ODPS_SESSION_INSECURE_SCHEME = "mfo"
|
|
21
|
+
ODPS_SESSION_SECURE_SCHEME = "mfos"
|
|
22
|
+
|
|
23
|
+
# ODPS MaxFrameTask consts
|
|
24
|
+
MAXFRAME_DEFAULT_PROTOCOL = "v1"
|
|
25
|
+
# method names
|
|
26
|
+
MAXFRAME_TASK_CREATE_SESSION_METHOD = "CREATE_SESSION"
|
|
27
|
+
MAXFRAME_TASK_GET_SESSION_METHOD = "GET_SESSION"
|
|
28
|
+
MAXFRAME_TASK_DELETE_SESSION_METHOD = "DELETE_SESSION"
|
|
29
|
+
MAXFRAME_TASK_SUBMIT_DAG_METHOD = "SUBMIT_DAG"
|
|
30
|
+
MAXFRAME_TASK_GET_DAG_INFO_METHOD = "GET_DAG_INFO"
|
|
31
|
+
MAXFRAME_TASK_CANCEL_DAG_METHOD = "CANCEL_DAG"
|
|
32
|
+
MAXFRAME_TASK_DECREF_METHOD = "DECREF"
|
|
33
|
+
# serialization methods
|
|
34
|
+
MAXFRAME_OUTPUT_MAXFRAME_FORMAT = "maxframe_v1"
|
|
35
|
+
MAXFRAME_OUTPUT_JSON_FORMAT = "json"
|
|
36
|
+
MAXFRAME_OUTPUT_MSGPACK_FORMAT = "msgpack"
|