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,443 @@
|
|
|
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 contextlib
|
|
16
|
+
import contextvars
|
|
17
|
+
import traceback
|
|
18
|
+
import warnings
|
|
19
|
+
from copy import deepcopy
|
|
20
|
+
from typing import Any, Dict, Optional, Union
|
|
21
|
+
|
|
22
|
+
from ..utils import get_python_tag
|
|
23
|
+
from .validators import (
|
|
24
|
+
ValidatorType,
|
|
25
|
+
all_validator,
|
|
26
|
+
any_validator,
|
|
27
|
+
is_bool,
|
|
28
|
+
is_dict,
|
|
29
|
+
is_in,
|
|
30
|
+
is_integer,
|
|
31
|
+
is_null,
|
|
32
|
+
is_numeric,
|
|
33
|
+
is_string,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
_DEFAULT_REDIRECT_WARN = "Option {source} has been replaced by {target} and might be removed in a future release."
|
|
37
|
+
_DEFAULT_MAX_ALIVE_SECONDS = 3 * 24 * 3600
|
|
38
|
+
_DEFAULT_MAX_IDLE_SECONDS = 3600
|
|
39
|
+
_DEFAULT_SPE_OPERATION_TIMEOUT_SECONDS = 120
|
|
40
|
+
_DEFAULT_UPLOAD_BATCH_SIZE = 4096
|
|
41
|
+
_DEFAULT_TEMP_LIFECYCLE = 1
|
|
42
|
+
_DEFAULT_TASK_START_TIMEOUT = 60
|
|
43
|
+
_DEFAULT_LOGVIEW_HOURS = 24 * 60
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class OptionError(Exception):
|
|
47
|
+
pass
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
class Redirection:
|
|
51
|
+
def __init__(self, item: str, warn: Optional[str] = None):
|
|
52
|
+
self._items = item.split(".")
|
|
53
|
+
self._warn = warn
|
|
54
|
+
self._warned = True
|
|
55
|
+
self._parent = None
|
|
56
|
+
|
|
57
|
+
def bind(self, attr_dict):
|
|
58
|
+
self._parent = attr_dict
|
|
59
|
+
self.getvalue()
|
|
60
|
+
self._warned = False
|
|
61
|
+
|
|
62
|
+
def getvalue(self, silent: bool = False) -> Any:
|
|
63
|
+
if not silent and self._warn and not self._warned:
|
|
64
|
+
in_completer = any(
|
|
65
|
+
1 for st in traceback.extract_stack() if "completer" in st[0].lower()
|
|
66
|
+
)
|
|
67
|
+
if not in_completer:
|
|
68
|
+
self._warned = True
|
|
69
|
+
warnings.warn(self._warn)
|
|
70
|
+
conf = self._parent.root
|
|
71
|
+
for it in self._items:
|
|
72
|
+
conf = getattr(conf, it)
|
|
73
|
+
return conf
|
|
74
|
+
|
|
75
|
+
def setvalue(self, value: str, silent: bool = False) -> None:
|
|
76
|
+
if not silent and self._warn and not self._warned:
|
|
77
|
+
self._warned = True
|
|
78
|
+
warnings.warn(self._warn)
|
|
79
|
+
conf = self._parent.root
|
|
80
|
+
for it in self._items[:-1]:
|
|
81
|
+
conf = getattr(conf, it)
|
|
82
|
+
setattr(conf, self._items[-1], value)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class AttributeDict(dict):
|
|
86
|
+
def __init__(self, *args, **kwargs):
|
|
87
|
+
self._inited = False
|
|
88
|
+
self._parent = kwargs.pop("_parent", None)
|
|
89
|
+
self._root = None
|
|
90
|
+
super().__init__(*args, **kwargs)
|
|
91
|
+
self._inited = True
|
|
92
|
+
|
|
93
|
+
@property
|
|
94
|
+
def root(self):
|
|
95
|
+
if self._root is not None:
|
|
96
|
+
return self._root
|
|
97
|
+
if self._parent is None:
|
|
98
|
+
self._root = self
|
|
99
|
+
else:
|
|
100
|
+
self._root = self._parent.root
|
|
101
|
+
return self._root
|
|
102
|
+
|
|
103
|
+
def __getattr__(self, item: str):
|
|
104
|
+
if item in self:
|
|
105
|
+
val = self[item]
|
|
106
|
+
if isinstance(val, AttributeDict):
|
|
107
|
+
return val
|
|
108
|
+
elif isinstance(val[0], Redirection):
|
|
109
|
+
return val[0].getvalue()
|
|
110
|
+
else:
|
|
111
|
+
return val[0]
|
|
112
|
+
return object.__getattribute__(self, item)
|
|
113
|
+
|
|
114
|
+
def __dir__(self):
|
|
115
|
+
return list(self.keys())
|
|
116
|
+
|
|
117
|
+
def register(
|
|
118
|
+
self, key: str, value: Any, validator: Optional[ValidatorType] = None
|
|
119
|
+
) -> None:
|
|
120
|
+
self[key] = value, validator
|
|
121
|
+
if isinstance(value, Redirection):
|
|
122
|
+
value.bind(self)
|
|
123
|
+
|
|
124
|
+
def unregister(self, key: str) -> None:
|
|
125
|
+
del self[key]
|
|
126
|
+
|
|
127
|
+
def add_validator(self, key: str, validator: ValidatorType) -> None:
|
|
128
|
+
value, old_validator = self[key]
|
|
129
|
+
validators = getattr(
|
|
130
|
+
old_validator,
|
|
131
|
+
"validators",
|
|
132
|
+
[old_validator] if callable(old_validator) else [],
|
|
133
|
+
)
|
|
134
|
+
validators.append(validator)
|
|
135
|
+
self[key] = (value, all_validator(*validators))
|
|
136
|
+
|
|
137
|
+
def _setattr(self, key: str, value: Any, silent: bool = False) -> None:
|
|
138
|
+
if not silent and key not in self:
|
|
139
|
+
raise OptionError(f"Cannot identify configuration name '{key}'.")
|
|
140
|
+
|
|
141
|
+
if not isinstance(value, AttributeDict):
|
|
142
|
+
validate = None
|
|
143
|
+
if key in self:
|
|
144
|
+
val = self[key]
|
|
145
|
+
validate = self[key][1]
|
|
146
|
+
if validate is not None:
|
|
147
|
+
if not validate(value):
|
|
148
|
+
raise ValueError(f"Cannot set value {value}")
|
|
149
|
+
if isinstance(val[0], Redirection):
|
|
150
|
+
val[0].setvalue(value)
|
|
151
|
+
else:
|
|
152
|
+
self[key] = value, validate
|
|
153
|
+
else:
|
|
154
|
+
self[key] = value, validate
|
|
155
|
+
else:
|
|
156
|
+
self[key] = value
|
|
157
|
+
|
|
158
|
+
def __setattr__(self, key: str, value: Any):
|
|
159
|
+
if key == "_inited":
|
|
160
|
+
super().__setattr__(key, value)
|
|
161
|
+
return
|
|
162
|
+
try:
|
|
163
|
+
object.__getattribute__(self, key)
|
|
164
|
+
super().__setattr__(key, value)
|
|
165
|
+
return
|
|
166
|
+
except AttributeError:
|
|
167
|
+
pass
|
|
168
|
+
|
|
169
|
+
if not self._inited:
|
|
170
|
+
super().__setattr__(key, value)
|
|
171
|
+
else:
|
|
172
|
+
self._setattr(key, value)
|
|
173
|
+
|
|
174
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
175
|
+
result_dict = dict()
|
|
176
|
+
for k, v in self.items():
|
|
177
|
+
if isinstance(v, AttributeDict):
|
|
178
|
+
result_dict.update((f"{k}.{sk}", sv) for sk, sv in v.to_dict().items())
|
|
179
|
+
elif isinstance(v[0], Redirection):
|
|
180
|
+
continue
|
|
181
|
+
else:
|
|
182
|
+
result_dict[k] = v[0]
|
|
183
|
+
return result_dict
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
class Config:
|
|
187
|
+
def __init__(self, config=None):
|
|
188
|
+
self._config = config or AttributeDict()
|
|
189
|
+
self._remote_options = set()
|
|
190
|
+
|
|
191
|
+
def __dir__(self):
|
|
192
|
+
return list(self._config.keys())
|
|
193
|
+
|
|
194
|
+
def __getattr__(self, item: str):
|
|
195
|
+
return getattr(self._config, item)
|
|
196
|
+
|
|
197
|
+
def __setattr__(self, key: str, value: Any):
|
|
198
|
+
if key.startswith("_"):
|
|
199
|
+
object.__setattr__(self, key, value)
|
|
200
|
+
return
|
|
201
|
+
setattr(self._config, key, value)
|
|
202
|
+
|
|
203
|
+
def register_option(
|
|
204
|
+
self,
|
|
205
|
+
option: str,
|
|
206
|
+
value: Any,
|
|
207
|
+
validator: Optional[ValidatorType] = None,
|
|
208
|
+
remote: bool = False,
|
|
209
|
+
) -> None:
|
|
210
|
+
assert validator is None or callable(validator)
|
|
211
|
+
splits = option.split(".")
|
|
212
|
+
conf = self._config
|
|
213
|
+
|
|
214
|
+
for name in splits[:-1]:
|
|
215
|
+
config = conf.get(name)
|
|
216
|
+
if config is None:
|
|
217
|
+
val = AttributeDict(_parent=conf)
|
|
218
|
+
conf[name] = val
|
|
219
|
+
conf = val
|
|
220
|
+
elif not isinstance(config, dict):
|
|
221
|
+
raise AttributeError(
|
|
222
|
+
f"Fail to set option: {option}, conflict has encountered"
|
|
223
|
+
)
|
|
224
|
+
else:
|
|
225
|
+
conf = config
|
|
226
|
+
|
|
227
|
+
key = splits[-1]
|
|
228
|
+
if conf.get(key) is not None:
|
|
229
|
+
raise AttributeError(f"Fail to set option: {option}, option has been set")
|
|
230
|
+
|
|
231
|
+
conf.register(key, value, validator)
|
|
232
|
+
if remote:
|
|
233
|
+
self._remote_options.add(option)
|
|
234
|
+
|
|
235
|
+
def redirect_option(
|
|
236
|
+
self, option: str, target: str, warn: str = _DEFAULT_REDIRECT_WARN
|
|
237
|
+
) -> None:
|
|
238
|
+
redir = Redirection(target, warn=warn.format(source=option, target=target))
|
|
239
|
+
self.register_option(option, redir)
|
|
240
|
+
|
|
241
|
+
def unregister_option(self, option: str) -> None:
|
|
242
|
+
splits = option.split(".")
|
|
243
|
+
conf = self._config
|
|
244
|
+
for name in splits[:-1]:
|
|
245
|
+
config = conf.get(name)
|
|
246
|
+
if not isinstance(config, dict):
|
|
247
|
+
raise AttributeError(
|
|
248
|
+
f"Fail to unregister option: {option}, conflict has encountered"
|
|
249
|
+
)
|
|
250
|
+
else:
|
|
251
|
+
conf = config
|
|
252
|
+
|
|
253
|
+
key = splits[-1]
|
|
254
|
+
if key not in conf:
|
|
255
|
+
raise AttributeError(
|
|
256
|
+
f"Option {option} not configured, thus failed to unregister."
|
|
257
|
+
)
|
|
258
|
+
conf.unregister(key)
|
|
259
|
+
|
|
260
|
+
def update(self, new_config: Union["Config", Dict[str, Any]]) -> None:
|
|
261
|
+
if not isinstance(new_config, dict):
|
|
262
|
+
new_config = new_config._config
|
|
263
|
+
for option, value in new_config.items():
|
|
264
|
+
try:
|
|
265
|
+
self.register_option(option, value)
|
|
266
|
+
except AttributeError:
|
|
267
|
+
attrs = option.split(".")
|
|
268
|
+
cur_cfg = self
|
|
269
|
+
for sub_cfg_name in attrs[:-1]:
|
|
270
|
+
cur_cfg = getattr(cur_cfg, sub_cfg_name)
|
|
271
|
+
setattr(cur_cfg, attrs[-1], value)
|
|
272
|
+
|
|
273
|
+
def add_validator(self, option: str, validator: ValidatorType) -> None:
|
|
274
|
+
splits = option.split(".")
|
|
275
|
+
conf = self._config
|
|
276
|
+
for name in splits[:-1]:
|
|
277
|
+
config = conf.get(name)
|
|
278
|
+
if not isinstance(config, dict):
|
|
279
|
+
raise AttributeError(
|
|
280
|
+
f"Fail to add validator: {option}, conflict has encountered"
|
|
281
|
+
)
|
|
282
|
+
else:
|
|
283
|
+
conf = config
|
|
284
|
+
|
|
285
|
+
key = splits[-1]
|
|
286
|
+
if key not in conf:
|
|
287
|
+
raise AttributeError(
|
|
288
|
+
f"Option {option} not configured, thus failed to set validator."
|
|
289
|
+
)
|
|
290
|
+
conf.add_validator(key, validator)
|
|
291
|
+
|
|
292
|
+
def to_dict(self, remote_only: bool = False) -> Dict[str, Any]:
|
|
293
|
+
res = self._config.to_dict()
|
|
294
|
+
if not remote_only:
|
|
295
|
+
return res
|
|
296
|
+
return {k: v for k, v in res.items() if k in self._remote_options}
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
default_options = Config()
|
|
300
|
+
default_options.register_option(
|
|
301
|
+
"execution_mode", "trigger", validator=is_in(["trigger", "eager"])
|
|
302
|
+
)
|
|
303
|
+
default_options.register_option(
|
|
304
|
+
"python_tag", get_python_tag(), validator=is_string, remote=True
|
|
305
|
+
)
|
|
306
|
+
default_options.register_option(
|
|
307
|
+
"session.logview_hours", _DEFAULT_LOGVIEW_HOURS, validator=is_integer, remote=True
|
|
308
|
+
)
|
|
309
|
+
default_options.register_option(
|
|
310
|
+
"client.task_start_timeout", _DEFAULT_TASK_START_TIMEOUT, validator=is_integer
|
|
311
|
+
)
|
|
312
|
+
default_options.register_option("sql.enable_mcqa", True, validator=is_bool, remote=True)
|
|
313
|
+
default_options.register_option(
|
|
314
|
+
"sql.generate_comments", True, validator=is_bool, remote=True
|
|
315
|
+
)
|
|
316
|
+
default_options.register_option("sql.settings", {}, validator=is_dict, remote=True)
|
|
317
|
+
|
|
318
|
+
default_options.register_option("is_production", False, validator=is_bool, remote=True)
|
|
319
|
+
default_options.register_option("schedule_id", "", validator=is_string, remote=True)
|
|
320
|
+
|
|
321
|
+
default_options.register_option(
|
|
322
|
+
"session.max_alive_seconds",
|
|
323
|
+
_DEFAULT_MAX_ALIVE_SECONDS,
|
|
324
|
+
validator=is_numeric,
|
|
325
|
+
remote=True,
|
|
326
|
+
)
|
|
327
|
+
default_options.register_option(
|
|
328
|
+
"session.max_idle_seconds",
|
|
329
|
+
_DEFAULT_MAX_IDLE_SECONDS,
|
|
330
|
+
validator=is_numeric,
|
|
331
|
+
remote=True,
|
|
332
|
+
)
|
|
333
|
+
default_options.register_option(
|
|
334
|
+
"session.upload_batch_size",
|
|
335
|
+
_DEFAULT_UPLOAD_BATCH_SIZE,
|
|
336
|
+
validator=is_integer,
|
|
337
|
+
)
|
|
338
|
+
default_options.register_option(
|
|
339
|
+
"session.table_lifecycle",
|
|
340
|
+
None,
|
|
341
|
+
validator=any_validator(is_null, is_integer),
|
|
342
|
+
)
|
|
343
|
+
default_options.register_option(
|
|
344
|
+
"session.temp_table_lifecycle",
|
|
345
|
+
_DEFAULT_TEMP_LIFECYCLE,
|
|
346
|
+
validator=is_integer,
|
|
347
|
+
remote=True,
|
|
348
|
+
)
|
|
349
|
+
default_options.register_option(
|
|
350
|
+
"session.subinstance_priority",
|
|
351
|
+
None,
|
|
352
|
+
validator=any_validator(is_null, is_integer),
|
|
353
|
+
remote=True,
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
default_options.register_option("warn_duplicated_execution", False, validator=is_bool)
|
|
357
|
+
default_options.register_option("dataframe.use_arrow_dtype", True, validator=is_bool)
|
|
358
|
+
default_options.register_option(
|
|
359
|
+
"dataframe.arrow_array.pandas_only", True, validator=is_bool
|
|
360
|
+
)
|
|
361
|
+
default_options.register_option(
|
|
362
|
+
"optimize.head_optimize_threshold", 1000, validator=is_integer
|
|
363
|
+
)
|
|
364
|
+
default_options.register_option(
|
|
365
|
+
"show_progress", "auto", validator=any_validator(is_bool, is_string)
|
|
366
|
+
)
|
|
367
|
+
default_options.register_option(
|
|
368
|
+
"dag.settings", value=dict(), validator=is_dict, remote=True
|
|
369
|
+
)
|
|
370
|
+
|
|
371
|
+
################
|
|
372
|
+
# SPE Settings #
|
|
373
|
+
################
|
|
374
|
+
default_options.register_option(
|
|
375
|
+
"spe.operation_timeout_seconds",
|
|
376
|
+
_DEFAULT_SPE_OPERATION_TIMEOUT_SECONDS,
|
|
377
|
+
validator=is_integer,
|
|
378
|
+
remote=True,
|
|
379
|
+
)
|
|
380
|
+
|
|
381
|
+
default_options.register_option(
|
|
382
|
+
"spe.task.settings", dict(), validator=is_dict, remote=True
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
default_options.register_option(
|
|
386
|
+
"pythonpack.task.settings", {}, validator=is_dict, remote=True
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
_options_ctx_var = contextvars.ContextVar("_options_ctx_var")
|
|
390
|
+
|
|
391
|
+
|
|
392
|
+
def reset_global_options():
|
|
393
|
+
global _options_ctx_var
|
|
394
|
+
|
|
395
|
+
_options_ctx_var = contextvars.ContextVar("_options_ctx_var")
|
|
396
|
+
_options_ctx_var.set(default_options)
|
|
397
|
+
|
|
398
|
+
|
|
399
|
+
reset_global_options()
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
def get_global_options(copy: bool = False) -> Config:
|
|
403
|
+
ret = _options_ctx_var.get(None)
|
|
404
|
+
|
|
405
|
+
if ret is None:
|
|
406
|
+
if not copy:
|
|
407
|
+
ret = default_options
|
|
408
|
+
else:
|
|
409
|
+
ret = Config(deepcopy(default_options._config))
|
|
410
|
+
_options_ctx_var.set(ret)
|
|
411
|
+
return ret
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
def set_global_options(opts: Config) -> None:
|
|
415
|
+
_options_ctx_var.set(opts)
|
|
416
|
+
|
|
417
|
+
|
|
418
|
+
@contextlib.contextmanager
|
|
419
|
+
def option_context(config: Dict[str, Any] = None):
|
|
420
|
+
global_options = get_global_options(copy=True)
|
|
421
|
+
|
|
422
|
+
try:
|
|
423
|
+
config = config or dict()
|
|
424
|
+
local_options = Config(deepcopy(global_options._config))
|
|
425
|
+
local_options.update(config)
|
|
426
|
+
set_global_options(local_options)
|
|
427
|
+
yield local_options
|
|
428
|
+
finally:
|
|
429
|
+
set_global_options(global_options)
|
|
430
|
+
|
|
431
|
+
|
|
432
|
+
class OptionsProxy:
|
|
433
|
+
def __dir__(self):
|
|
434
|
+
return dir(get_global_options())
|
|
435
|
+
|
|
436
|
+
def __getattribute__(self, attr):
|
|
437
|
+
return getattr(get_global_options(), attr)
|
|
438
|
+
|
|
439
|
+
def __setattr__(self, key, value):
|
|
440
|
+
setattr(get_global_options(), key, value)
|
|
441
|
+
|
|
442
|
+
|
|
443
|
+
options = OptionsProxy()
|
|
@@ -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,103 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
import threading
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
|
|
21
|
+
from ..config import Config, is_integer, is_string, option_context, options
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_config_context():
|
|
25
|
+
with pytest.raises(AttributeError):
|
|
26
|
+
_ = options.a.b.c
|
|
27
|
+
|
|
28
|
+
options.register_option("c.d.e", "a", is_string)
|
|
29
|
+
assert "c" in dir(options)
|
|
30
|
+
assert "d" in dir(options.c)
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
with option_context() as ctx:
|
|
34
|
+
ctx.register_option("a.b.c", 1, validator=is_integer)
|
|
35
|
+
assert ctx.a.b.c == 1
|
|
36
|
+
|
|
37
|
+
ctx.a.b.c = 2
|
|
38
|
+
assert ctx.a.b.c == 2
|
|
39
|
+
|
|
40
|
+
with pytest.raises(ValueError):
|
|
41
|
+
ctx.a.b.c = "a"
|
|
42
|
+
|
|
43
|
+
assert ctx.c.d.e == "a"
|
|
44
|
+
|
|
45
|
+
ctx.c.d.e = "b"
|
|
46
|
+
|
|
47
|
+
assert options.c.d.e == "a"
|
|
48
|
+
|
|
49
|
+
options.c.d.e = "c"
|
|
50
|
+
|
|
51
|
+
assert options.c.d.e == "c"
|
|
52
|
+
|
|
53
|
+
with pytest.raises(AttributeError):
|
|
54
|
+
_ = options.a.b.c # noqa: F841
|
|
55
|
+
finally:
|
|
56
|
+
options.unregister_option("c.d.e")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def test_multi_thread_config():
|
|
60
|
+
options.register_option("a.b.c", 1)
|
|
61
|
+
|
|
62
|
+
class T(threading.Thread):
|
|
63
|
+
def __init__(self, is_first, condition):
|
|
64
|
+
super().__init__()
|
|
65
|
+
self.is_first = is_first
|
|
66
|
+
self.condition = condition
|
|
67
|
+
|
|
68
|
+
def run(self):
|
|
69
|
+
self.condition.acquire()
|
|
70
|
+
if self.is_first:
|
|
71
|
+
options.a.b.c = 2
|
|
72
|
+
self.condition.notify()
|
|
73
|
+
else:
|
|
74
|
+
self.condition.wait()
|
|
75
|
+
assert options.a.b.c == 1
|
|
76
|
+
self.condition.release()
|
|
77
|
+
|
|
78
|
+
try:
|
|
79
|
+
cond = threading.Condition()
|
|
80
|
+
a = T(True, cond)
|
|
81
|
+
b = T(False, cond)
|
|
82
|
+
b.start()
|
|
83
|
+
a.start()
|
|
84
|
+
a.join()
|
|
85
|
+
b.join()
|
|
86
|
+
finally:
|
|
87
|
+
options.unregister_option("a.b.c")
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def test_config_copy():
|
|
91
|
+
cfg = Config()
|
|
92
|
+
cfg.register_option("a.b.c", 1)
|
|
93
|
+
cfg.redirect_option("a.c", "a.b.c")
|
|
94
|
+
|
|
95
|
+
target_cfg = Config()
|
|
96
|
+
target_cfg.register_option("a.b.c", -1)
|
|
97
|
+
target_cfg.redirect_option("a.c", "a.b.c")
|
|
98
|
+
|
|
99
|
+
src_cfg_dict = cfg.to_dict()
|
|
100
|
+
assert src_cfg_dict == {"a.b.c": 1}
|
|
101
|
+
|
|
102
|
+
target_cfg.update(src_cfg_dict)
|
|
103
|
+
assert target_cfg.a.b.c == 1
|
|
@@ -0,0 +1,34 @@
|
|
|
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 pytest
|
|
16
|
+
|
|
17
|
+
from ..validators import is_positive_integer, simple_yaml_str_validator
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
@pytest.mark.parametrize("value", ["a", "http://127.0.0.1:1234", "a-b#", "ab_", "123"])
|
|
21
|
+
def test_simple_yaml_str_validator_valid(value):
|
|
22
|
+
assert simple_yaml_str_validator(value)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@pytest.mark.parametrize("value", ['a"', "'hacked'", "ab\n", "abc\\"])
|
|
26
|
+
def test_simple_yaml_str_validator_invalid(value):
|
|
27
|
+
assert not simple_yaml_str_validator(value)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
@pytest.mark.parametrize(
|
|
31
|
+
"value,valid", [("a", False), (1, True), (0, False), (-1, False)]
|
|
32
|
+
)
|
|
33
|
+
def test_is_positive_integer_validator(value, valid):
|
|
34
|
+
assert is_positive_integer(value) is valid
|
|
@@ -0,0 +1,57 @@
|
|
|
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 Callable
|
|
16
|
+
|
|
17
|
+
ValidatorType = Callable[..., bool]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def any_validator(*validators: ValidatorType):
|
|
21
|
+
def validate(x):
|
|
22
|
+
return any(validator(x) for validator in validators)
|
|
23
|
+
|
|
24
|
+
return validate
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def all_validator(*validators: ValidatorType):
|
|
28
|
+
def validate(x):
|
|
29
|
+
return all(validator(x) for validator in validators)
|
|
30
|
+
|
|
31
|
+
validate.validators = validators
|
|
32
|
+
return validate
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
is_null = lambda x: x is None
|
|
36
|
+
is_bool = lambda x: isinstance(x, bool)
|
|
37
|
+
is_float = lambda x: isinstance(x, float)
|
|
38
|
+
is_integer = lambda x: isinstance(x, int)
|
|
39
|
+
is_numeric = lambda x: isinstance(x, (int, float))
|
|
40
|
+
is_string = lambda x: isinstance(x, str)
|
|
41
|
+
is_dict = lambda x: isinstance(x, dict)
|
|
42
|
+
is_positive_integer = lambda x: is_integer(x) and x > 0
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def is_in(vals):
|
|
46
|
+
def validate(x):
|
|
47
|
+
return x in vals
|
|
48
|
+
|
|
49
|
+
return validate
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
_invalid_char_in_yaml_str = {'"', "'", "\n", "\\"}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def simple_yaml_str_validator(name: str) -> bool:
|
|
56
|
+
chars = set(name)
|
|
57
|
+
return len(_invalid_char_in_yaml_str & chars) == 0
|