maxframe 0.1.0b5__cp310-cp310-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +32 -0
- maxframe/_utils.cpython-310-darwin.so +0 -0
- maxframe/_utils.pxd +33 -0
- maxframe/_utils.pyx +547 -0
- maxframe/codegen.py +528 -0
- maxframe/config/__init__.py +15 -0
- maxframe/config/config.py +443 -0
- maxframe/config/tests/__init__.py +13 -0
- maxframe/config/tests/test_config.py +103 -0
- maxframe/config/tests/test_validators.py +34 -0
- maxframe/config/validators.py +57 -0
- maxframe/conftest.py +139 -0
- maxframe/core/__init__.py +65 -0
- maxframe/core/base.py +156 -0
- maxframe/core/entity/__init__.py +44 -0
- maxframe/core/entity/chunks.py +68 -0
- maxframe/core/entity/core.py +152 -0
- maxframe/core/entity/executable.py +337 -0
- maxframe/core/entity/fuse.py +73 -0
- maxframe/core/entity/objects.py +100 -0
- maxframe/core/entity/output_types.py +90 -0
- maxframe/core/entity/tileables.py +438 -0
- maxframe/core/entity/utils.py +24 -0
- maxframe/core/graph/__init__.py +17 -0
- maxframe/core/graph/builder/__init__.py +16 -0
- maxframe/core/graph/builder/base.py +86 -0
- maxframe/core/graph/builder/chunk.py +430 -0
- maxframe/core/graph/builder/tileable.py +34 -0
- maxframe/core/graph/builder/utils.py +41 -0
- maxframe/core/graph/core.cpython-310-darwin.so +0 -0
- maxframe/core/graph/core.pyx +467 -0
- maxframe/core/graph/entity.py +171 -0
- maxframe/core/graph/tests/__init__.py +13 -0
- maxframe/core/graph/tests/test_graph.py +205 -0
- maxframe/core/mode.py +96 -0
- maxframe/core/operator/__init__.py +34 -0
- maxframe/core/operator/base.py +450 -0
- maxframe/core/operator/core.py +276 -0
- maxframe/core/operator/fetch.py +53 -0
- maxframe/core/operator/fuse.py +29 -0
- maxframe/core/operator/objects.py +72 -0
- maxframe/core/operator/shuffle.py +111 -0
- maxframe/core/operator/tests/__init__.py +13 -0
- maxframe/core/operator/tests/test_core.py +64 -0
- maxframe/core/tests/__init__.py +13 -0
- maxframe/core/tests/test_mode.py +75 -0
- maxframe/dataframe/__init__.py +81 -0
- maxframe/dataframe/arithmetic/__init__.py +359 -0
- maxframe/dataframe/arithmetic/abs.py +33 -0
- maxframe/dataframe/arithmetic/add.py +60 -0
- maxframe/dataframe/arithmetic/arccos.py +28 -0
- maxframe/dataframe/arithmetic/arccosh.py +28 -0
- maxframe/dataframe/arithmetic/arcsin.py +28 -0
- maxframe/dataframe/arithmetic/arcsinh.py +28 -0
- maxframe/dataframe/arithmetic/arctan.py +28 -0
- maxframe/dataframe/arithmetic/arctanh.py +28 -0
- maxframe/dataframe/arithmetic/around.py +152 -0
- maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
- maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
- maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
- maxframe/dataframe/arithmetic/ceil.py +28 -0
- maxframe/dataframe/arithmetic/core.py +342 -0
- maxframe/dataframe/arithmetic/cos.py +28 -0
- maxframe/dataframe/arithmetic/cosh.py +28 -0
- maxframe/dataframe/arithmetic/degrees.py +28 -0
- maxframe/dataframe/arithmetic/docstring.py +442 -0
- maxframe/dataframe/arithmetic/equal.py +56 -0
- maxframe/dataframe/arithmetic/exp.py +28 -0
- maxframe/dataframe/arithmetic/exp2.py +28 -0
- maxframe/dataframe/arithmetic/expm1.py +28 -0
- maxframe/dataframe/arithmetic/floor.py +28 -0
- maxframe/dataframe/arithmetic/floordiv.py +64 -0
- maxframe/dataframe/arithmetic/greater.py +57 -0
- maxframe/dataframe/arithmetic/greater_equal.py +57 -0
- maxframe/dataframe/arithmetic/invert.py +33 -0
- maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
- maxframe/dataframe/arithmetic/less.py +57 -0
- maxframe/dataframe/arithmetic/less_equal.py +57 -0
- maxframe/dataframe/arithmetic/log.py +28 -0
- maxframe/dataframe/arithmetic/log10.py +28 -0
- maxframe/dataframe/arithmetic/log2.py +28 -0
- maxframe/dataframe/arithmetic/mod.py +60 -0
- maxframe/dataframe/arithmetic/multiply.py +60 -0
- maxframe/dataframe/arithmetic/negative.py +33 -0
- maxframe/dataframe/arithmetic/not_equal.py +56 -0
- maxframe/dataframe/arithmetic/power.py +68 -0
- maxframe/dataframe/arithmetic/radians.py +28 -0
- maxframe/dataframe/arithmetic/sin.py +28 -0
- maxframe/dataframe/arithmetic/sinh.py +28 -0
- maxframe/dataframe/arithmetic/sqrt.py +28 -0
- maxframe/dataframe/arithmetic/subtract.py +64 -0
- maxframe/dataframe/arithmetic/tan.py +28 -0
- maxframe/dataframe/arithmetic/tanh.py +28 -0
- maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
- maxframe/dataframe/arithmetic/truediv.py +64 -0
- maxframe/dataframe/arithmetic/trunc.py +28 -0
- maxframe/dataframe/arrays.py +864 -0
- maxframe/dataframe/core.py +2417 -0
- maxframe/dataframe/datasource/__init__.py +15 -0
- maxframe/dataframe/datasource/core.py +81 -0
- maxframe/dataframe/datasource/dataframe.py +59 -0
- maxframe/dataframe/datasource/date_range.py +504 -0
- maxframe/dataframe/datasource/from_index.py +54 -0
- maxframe/dataframe/datasource/from_records.py +107 -0
- maxframe/dataframe/datasource/from_tensor.py +419 -0
- maxframe/dataframe/datasource/index.py +117 -0
- maxframe/dataframe/datasource/read_csv.py +528 -0
- maxframe/dataframe/datasource/read_odps_query.py +299 -0
- maxframe/dataframe/datasource/read_odps_table.py +253 -0
- maxframe/dataframe/datasource/read_parquet.py +421 -0
- maxframe/dataframe/datasource/series.py +55 -0
- maxframe/dataframe/datasource/tests/__init__.py +13 -0
- maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
- maxframe/dataframe/datastore/__init__.py +26 -0
- maxframe/dataframe/datastore/core.py +19 -0
- maxframe/dataframe/datastore/to_csv.py +227 -0
- maxframe/dataframe/datastore/to_odps.py +162 -0
- maxframe/dataframe/extensions/__init__.py +41 -0
- maxframe/dataframe/extensions/accessor.py +50 -0
- maxframe/dataframe/extensions/reshuffle.py +83 -0
- maxframe/dataframe/extensions/tests/__init__.py +13 -0
- maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
- maxframe/dataframe/fetch/__init__.py +15 -0
- maxframe/dataframe/fetch/core.py +86 -0
- maxframe/dataframe/groupby/__init__.py +82 -0
- maxframe/dataframe/groupby/aggregation.py +350 -0
- maxframe/dataframe/groupby/apply.py +251 -0
- maxframe/dataframe/groupby/core.py +179 -0
- maxframe/dataframe/groupby/cum.py +124 -0
- maxframe/dataframe/groupby/fill.py +141 -0
- maxframe/dataframe/groupby/getitem.py +92 -0
- maxframe/dataframe/groupby/head.py +105 -0
- maxframe/dataframe/groupby/sample.py +214 -0
- maxframe/dataframe/groupby/tests/__init__.py +13 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
- maxframe/dataframe/groupby/transform.py +255 -0
- maxframe/dataframe/indexing/__init__.py +84 -0
- maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
- maxframe/dataframe/indexing/align.py +349 -0
- maxframe/dataframe/indexing/at.py +83 -0
- maxframe/dataframe/indexing/getitem.py +204 -0
- maxframe/dataframe/indexing/iat.py +37 -0
- maxframe/dataframe/indexing/iloc.py +566 -0
- maxframe/dataframe/indexing/insert.py +86 -0
- maxframe/dataframe/indexing/loc.py +411 -0
- maxframe/dataframe/indexing/reindex.py +526 -0
- maxframe/dataframe/indexing/rename.py +462 -0
- maxframe/dataframe/indexing/rename_axis.py +209 -0
- maxframe/dataframe/indexing/reset_index.py +402 -0
- maxframe/dataframe/indexing/sample.py +221 -0
- maxframe/dataframe/indexing/set_axis.py +194 -0
- maxframe/dataframe/indexing/set_index.py +61 -0
- maxframe/dataframe/indexing/setitem.py +130 -0
- maxframe/dataframe/indexing/tests/__init__.py +13 -0
- maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
- maxframe/dataframe/indexing/where.py +308 -0
- maxframe/dataframe/initializer.py +288 -0
- maxframe/dataframe/merge/__init__.py +32 -0
- maxframe/dataframe/merge/append.py +121 -0
- maxframe/dataframe/merge/concat.py +325 -0
- maxframe/dataframe/merge/merge.py +593 -0
- maxframe/dataframe/merge/tests/__init__.py +13 -0
- maxframe/dataframe/merge/tests/test_merge.py +215 -0
- maxframe/dataframe/misc/__init__.py +134 -0
- maxframe/dataframe/misc/_duplicate.py +46 -0
- maxframe/dataframe/misc/accessor.py +276 -0
- maxframe/dataframe/misc/apply.py +692 -0
- maxframe/dataframe/misc/astype.py +236 -0
- maxframe/dataframe/misc/case_when.py +141 -0
- maxframe/dataframe/misc/check_monotonic.py +84 -0
- maxframe/dataframe/misc/cut.py +383 -0
- maxframe/dataframe/misc/datetimes.py +79 -0
- maxframe/dataframe/misc/describe.py +108 -0
- maxframe/dataframe/misc/diff.py +210 -0
- maxframe/dataframe/misc/drop.py +440 -0
- maxframe/dataframe/misc/drop_duplicates.py +248 -0
- maxframe/dataframe/misc/duplicated.py +292 -0
- maxframe/dataframe/misc/eval.py +728 -0
- maxframe/dataframe/misc/explode.py +171 -0
- maxframe/dataframe/misc/get_dummies.py +208 -0
- maxframe/dataframe/misc/isin.py +217 -0
- maxframe/dataframe/misc/map.py +236 -0
- maxframe/dataframe/misc/melt.py +162 -0
- maxframe/dataframe/misc/memory_usage.py +248 -0
- maxframe/dataframe/misc/pct_change.py +150 -0
- maxframe/dataframe/misc/pivot_table.py +262 -0
- maxframe/dataframe/misc/qcut.py +104 -0
- maxframe/dataframe/misc/select_dtypes.py +104 -0
- maxframe/dataframe/misc/shift.py +256 -0
- maxframe/dataframe/misc/stack.py +238 -0
- maxframe/dataframe/misc/string_.py +221 -0
- maxframe/dataframe/misc/tests/__init__.py +13 -0
- maxframe/dataframe/misc/tests/test_misc.py +468 -0
- maxframe/dataframe/misc/to_numeric.py +178 -0
- maxframe/dataframe/misc/transform.py +361 -0
- maxframe/dataframe/misc/transpose.py +136 -0
- maxframe/dataframe/misc/value_counts.py +182 -0
- maxframe/dataframe/missing/__init__.py +53 -0
- maxframe/dataframe/missing/checkna.py +223 -0
- maxframe/dataframe/missing/dropna.py +280 -0
- maxframe/dataframe/missing/fillna.py +275 -0
- maxframe/dataframe/missing/replace.py +439 -0
- maxframe/dataframe/missing/tests/__init__.py +13 -0
- maxframe/dataframe/missing/tests/test_missing.py +89 -0
- maxframe/dataframe/operators.py +273 -0
- maxframe/dataframe/plotting/__init__.py +40 -0
- maxframe/dataframe/plotting/core.py +78 -0
- maxframe/dataframe/plotting/tests/__init__.py +13 -0
- maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
- maxframe/dataframe/reduction/__init__.py +107 -0
- maxframe/dataframe/reduction/aggregation.py +344 -0
- maxframe/dataframe/reduction/all.py +78 -0
- maxframe/dataframe/reduction/any.py +78 -0
- maxframe/dataframe/reduction/core.py +837 -0
- maxframe/dataframe/reduction/count.py +59 -0
- maxframe/dataframe/reduction/cummax.py +30 -0
- maxframe/dataframe/reduction/cummin.py +30 -0
- maxframe/dataframe/reduction/cumprod.py +30 -0
- maxframe/dataframe/reduction/cumsum.py +30 -0
- maxframe/dataframe/reduction/custom_reduction.py +42 -0
- maxframe/dataframe/reduction/kurtosis.py +104 -0
- maxframe/dataframe/reduction/max.py +65 -0
- maxframe/dataframe/reduction/mean.py +61 -0
- maxframe/dataframe/reduction/min.py +65 -0
- maxframe/dataframe/reduction/nunique.py +141 -0
- maxframe/dataframe/reduction/prod.py +76 -0
- maxframe/dataframe/reduction/reduction_size.py +36 -0
- maxframe/dataframe/reduction/sem.py +69 -0
- maxframe/dataframe/reduction/skew.py +89 -0
- maxframe/dataframe/reduction/std.py +53 -0
- maxframe/dataframe/reduction/str_concat.py +48 -0
- maxframe/dataframe/reduction/sum.py +77 -0
- maxframe/dataframe/reduction/tests/__init__.py +13 -0
- maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
- maxframe/dataframe/reduction/unique.py +90 -0
- maxframe/dataframe/reduction/var.py +72 -0
- maxframe/dataframe/sort/__init__.py +34 -0
- maxframe/dataframe/sort/core.py +36 -0
- maxframe/dataframe/sort/sort_index.py +153 -0
- maxframe/dataframe/sort/sort_values.py +311 -0
- maxframe/dataframe/sort/tests/__init__.py +13 -0
- maxframe/dataframe/sort/tests/test_sort.py +81 -0
- maxframe/dataframe/statistics/__init__.py +33 -0
- maxframe/dataframe/statistics/corr.py +280 -0
- maxframe/dataframe/statistics/quantile.py +341 -0
- maxframe/dataframe/statistics/tests/__init__.py +13 -0
- maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
- maxframe/dataframe/tests/__init__.py +13 -0
- maxframe/dataframe/tests/test_initializer.py +29 -0
- maxframe/dataframe/tseries/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
- maxframe/dataframe/tseries/to_datetime.py +297 -0
- maxframe/dataframe/ufunc/__init__.py +27 -0
- maxframe/dataframe/ufunc/tensor.py +54 -0
- maxframe/dataframe/ufunc/ufunc.py +52 -0
- maxframe/dataframe/utils.py +1267 -0
- maxframe/dataframe/window/__init__.py +29 -0
- maxframe/dataframe/window/aggregation.py +96 -0
- maxframe/dataframe/window/core.py +69 -0
- maxframe/dataframe/window/ewm.py +249 -0
- maxframe/dataframe/window/expanding.py +147 -0
- maxframe/dataframe/window/rolling.py +376 -0
- maxframe/dataframe/window/tests/__init__.py +13 -0
- maxframe/dataframe/window/tests/test_ewm.py +70 -0
- maxframe/dataframe/window/tests/test_expanding.py +66 -0
- maxframe/dataframe/window/tests/test_rolling.py +57 -0
- maxframe/env.py +33 -0
- maxframe/errors.py +21 -0
- maxframe/extension.py +81 -0
- maxframe/learn/__init__.py +17 -0
- maxframe/learn/contrib/__init__.py +17 -0
- maxframe/learn/contrib/pytorch/__init__.py +16 -0
- maxframe/learn/contrib/pytorch/run_function.py +110 -0
- maxframe/learn/contrib/pytorch/run_script.py +102 -0
- maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
- maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
- maxframe/learn/contrib/utils.py +52 -0
- maxframe/learn/contrib/xgboost/__init__.py +26 -0
- maxframe/learn/contrib/xgboost/classifier.py +86 -0
- maxframe/learn/contrib/xgboost/core.py +156 -0
- maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
- maxframe/learn/contrib/xgboost/predict.py +138 -0
- maxframe/learn/contrib/xgboost/regressor.py +78 -0
- maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
- maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
- maxframe/learn/contrib/xgboost/train.py +121 -0
- maxframe/learn/utils/__init__.py +15 -0
- maxframe/learn/utils/core.py +29 -0
- maxframe/lib/__init__.py +15 -0
- maxframe/lib/aio/__init__.py +27 -0
- maxframe/lib/aio/_runners.py +162 -0
- maxframe/lib/aio/_threads.py +35 -0
- maxframe/lib/aio/base.py +82 -0
- maxframe/lib/aio/file.py +85 -0
- maxframe/lib/aio/isolation.py +100 -0
- maxframe/lib/aio/lru.py +242 -0
- maxframe/lib/aio/parallelism.py +37 -0
- maxframe/lib/aio/tests/__init__.py +13 -0
- maxframe/lib/aio/tests/test_aio_file.py +55 -0
- maxframe/lib/compression.py +55 -0
- maxframe/lib/cython/__init__.py +13 -0
- maxframe/lib/cython/libcpp.pxd +30 -0
- maxframe/lib/filesystem/__init__.py +21 -0
- maxframe/lib/filesystem/_glob.py +173 -0
- maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
- maxframe/lib/filesystem/_oss_lib/common.py +198 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
- maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
- maxframe/lib/filesystem/arrow.py +236 -0
- maxframe/lib/filesystem/base.py +263 -0
- maxframe/lib/filesystem/core.py +95 -0
- maxframe/lib/filesystem/fsmap.py +164 -0
- maxframe/lib/filesystem/hdfs.py +31 -0
- maxframe/lib/filesystem/local.py +112 -0
- maxframe/lib/filesystem/oss.py +157 -0
- maxframe/lib/filesystem/tests/__init__.py +13 -0
- maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
- maxframe/lib/filesystem/tests/test_oss.py +182 -0
- maxframe/lib/functools_compat.py +81 -0
- maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
- maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
- maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
- maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
- maxframe/lib/sparse/__init__.py +861 -0
- maxframe/lib/sparse/array.py +1604 -0
- maxframe/lib/sparse/core.py +92 -0
- maxframe/lib/sparse/matrix.py +241 -0
- maxframe/lib/sparse/tests/__init__.py +15 -0
- maxframe/lib/sparse/tests/test_sparse.py +476 -0
- maxframe/lib/sparse/vector.py +150 -0
- maxframe/lib/tblib/LICENSE +20 -0
- maxframe/lib/tblib/__init__.py +327 -0
- maxframe/lib/tblib/cpython.py +83 -0
- maxframe/lib/tblib/decorators.py +44 -0
- maxframe/lib/tblib/pickling_support.py +90 -0
- maxframe/lib/tests/__init__.py +13 -0
- maxframe/lib/tests/test_wrapped_pickle.py +51 -0
- maxframe/lib/version.py +620 -0
- maxframe/lib/wrapped_pickle.py +139 -0
- maxframe/mixin.py +100 -0
- maxframe/odpsio/__init__.py +21 -0
- maxframe/odpsio/arrow.py +91 -0
- maxframe/odpsio/schema.py +364 -0
- maxframe/odpsio/tableio.py +322 -0
- maxframe/odpsio/tests/__init__.py +13 -0
- maxframe/odpsio/tests/test_arrow.py +88 -0
- maxframe/odpsio/tests/test_schema.py +297 -0
- maxframe/odpsio/tests/test_tableio.py +136 -0
- maxframe/odpsio/tests/test_volumeio.py +90 -0
- maxframe/odpsio/volumeio.py +95 -0
- maxframe/opcodes.py +590 -0
- maxframe/protocol.py +415 -0
- maxframe/remote/__init__.py +18 -0
- maxframe/remote/core.py +210 -0
- maxframe/remote/run_script.py +121 -0
- maxframe/serialization/__init__.py +26 -0
- maxframe/serialization/arrow.py +95 -0
- maxframe/serialization/core.cpython-310-darwin.so +0 -0
- maxframe/serialization/core.pxd +44 -0
- maxframe/serialization/core.pyi +61 -0
- maxframe/serialization/core.pyx +1094 -0
- maxframe/serialization/exception.py +86 -0
- maxframe/serialization/maxframe_objects.py +39 -0
- maxframe/serialization/numpy.py +91 -0
- maxframe/serialization/pandas.py +202 -0
- maxframe/serialization/scipy.py +71 -0
- maxframe/serialization/serializables/__init__.py +55 -0
- maxframe/serialization/serializables/core.py +262 -0
- maxframe/serialization/serializables/field.py +624 -0
- maxframe/serialization/serializables/field_type.py +589 -0
- maxframe/serialization/serializables/tests/__init__.py +13 -0
- maxframe/serialization/serializables/tests/test_field_type.py +121 -0
- maxframe/serialization/serializables/tests/test_serializable.py +250 -0
- maxframe/serialization/tests/__init__.py +13 -0
- maxframe/serialization/tests/test_serial.py +412 -0
- maxframe/session.py +1310 -0
- maxframe/tensor/__init__.py +183 -0
- maxframe/tensor/arithmetic/__init__.py +315 -0
- maxframe/tensor/arithmetic/abs.py +68 -0
- maxframe/tensor/arithmetic/absolute.py +68 -0
- maxframe/tensor/arithmetic/add.py +82 -0
- maxframe/tensor/arithmetic/angle.py +72 -0
- maxframe/tensor/arithmetic/arccos.py +104 -0
- maxframe/tensor/arithmetic/arccosh.py +91 -0
- maxframe/tensor/arithmetic/arcsin.py +94 -0
- maxframe/tensor/arithmetic/arcsinh.py +86 -0
- maxframe/tensor/arithmetic/arctan.py +106 -0
- maxframe/tensor/arithmetic/arctan2.py +128 -0
- maxframe/tensor/arithmetic/arctanh.py +86 -0
- maxframe/tensor/arithmetic/around.py +114 -0
- maxframe/tensor/arithmetic/bitand.py +95 -0
- maxframe/tensor/arithmetic/bitor.py +102 -0
- maxframe/tensor/arithmetic/bitxor.py +95 -0
- maxframe/tensor/arithmetic/cbrt.py +66 -0
- maxframe/tensor/arithmetic/ceil.py +71 -0
- maxframe/tensor/arithmetic/clip.py +165 -0
- maxframe/tensor/arithmetic/conj.py +74 -0
- maxframe/tensor/arithmetic/copysign.py +78 -0
- maxframe/tensor/arithmetic/core.py +544 -0
- maxframe/tensor/arithmetic/cos.py +85 -0
- maxframe/tensor/arithmetic/cosh.py +72 -0
- maxframe/tensor/arithmetic/deg2rad.py +72 -0
- maxframe/tensor/arithmetic/degrees.py +77 -0
- maxframe/tensor/arithmetic/divide.py +114 -0
- maxframe/tensor/arithmetic/equal.py +76 -0
- maxframe/tensor/arithmetic/exp.py +106 -0
- maxframe/tensor/arithmetic/exp2.py +67 -0
- maxframe/tensor/arithmetic/expm1.py +79 -0
- maxframe/tensor/arithmetic/fabs.py +74 -0
- maxframe/tensor/arithmetic/fix.py +69 -0
- maxframe/tensor/arithmetic/float_power.py +103 -0
- maxframe/tensor/arithmetic/floor.py +77 -0
- maxframe/tensor/arithmetic/floordiv.py +94 -0
- maxframe/tensor/arithmetic/fmax.py +105 -0
- maxframe/tensor/arithmetic/fmin.py +106 -0
- maxframe/tensor/arithmetic/fmod.py +99 -0
- maxframe/tensor/arithmetic/frexp.py +92 -0
- maxframe/tensor/arithmetic/greater.py +77 -0
- maxframe/tensor/arithmetic/greater_equal.py +69 -0
- maxframe/tensor/arithmetic/hypot.py +77 -0
- maxframe/tensor/arithmetic/i0.py +89 -0
- maxframe/tensor/arithmetic/imag.py +67 -0
- maxframe/tensor/arithmetic/invert.py +110 -0
- maxframe/tensor/arithmetic/isclose.py +115 -0
- maxframe/tensor/arithmetic/iscomplex.py +64 -0
- maxframe/tensor/arithmetic/isfinite.py +106 -0
- maxframe/tensor/arithmetic/isinf.py +103 -0
- maxframe/tensor/arithmetic/isnan.py +82 -0
- maxframe/tensor/arithmetic/isreal.py +63 -0
- maxframe/tensor/arithmetic/ldexp.py +99 -0
- maxframe/tensor/arithmetic/less.py +69 -0
- maxframe/tensor/arithmetic/less_equal.py +69 -0
- maxframe/tensor/arithmetic/log.py +92 -0
- maxframe/tensor/arithmetic/log10.py +85 -0
- maxframe/tensor/arithmetic/log1p.py +95 -0
- maxframe/tensor/arithmetic/log2.py +85 -0
- maxframe/tensor/arithmetic/logaddexp.py +80 -0
- maxframe/tensor/arithmetic/logaddexp2.py +78 -0
- maxframe/tensor/arithmetic/logical_and.py +81 -0
- maxframe/tensor/arithmetic/logical_not.py +74 -0
- maxframe/tensor/arithmetic/logical_or.py +82 -0
- maxframe/tensor/arithmetic/logical_xor.py +88 -0
- maxframe/tensor/arithmetic/lshift.py +82 -0
- maxframe/tensor/arithmetic/maximum.py +108 -0
- maxframe/tensor/arithmetic/minimum.py +108 -0
- maxframe/tensor/arithmetic/mod.py +104 -0
- maxframe/tensor/arithmetic/modf.py +83 -0
- maxframe/tensor/arithmetic/multiply.py +81 -0
- maxframe/tensor/arithmetic/nan_to_num.py +99 -0
- maxframe/tensor/arithmetic/negative.py +65 -0
- maxframe/tensor/arithmetic/nextafter.py +68 -0
- maxframe/tensor/arithmetic/not_equal.py +72 -0
- maxframe/tensor/arithmetic/positive.py +47 -0
- maxframe/tensor/arithmetic/power.py +106 -0
- maxframe/tensor/arithmetic/rad2deg.py +71 -0
- maxframe/tensor/arithmetic/radians.py +77 -0
- maxframe/tensor/arithmetic/real.py +70 -0
- maxframe/tensor/arithmetic/reciprocal.py +76 -0
- maxframe/tensor/arithmetic/rint.py +68 -0
- maxframe/tensor/arithmetic/rshift.py +81 -0
- maxframe/tensor/arithmetic/setimag.py +29 -0
- maxframe/tensor/arithmetic/setreal.py +29 -0
- maxframe/tensor/arithmetic/sign.py +81 -0
- maxframe/tensor/arithmetic/signbit.py +65 -0
- maxframe/tensor/arithmetic/sin.py +98 -0
- maxframe/tensor/arithmetic/sinc.py +102 -0
- maxframe/tensor/arithmetic/sinh.py +93 -0
- maxframe/tensor/arithmetic/spacing.py +72 -0
- maxframe/tensor/arithmetic/sqrt.py +81 -0
- maxframe/tensor/arithmetic/square.py +69 -0
- maxframe/tensor/arithmetic/subtract.py +81 -0
- maxframe/tensor/arithmetic/tan.py +88 -0
- maxframe/tensor/arithmetic/tanh.py +92 -0
- maxframe/tensor/arithmetic/tests/__init__.py +15 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
- maxframe/tensor/arithmetic/truediv.py +104 -0
- maxframe/tensor/arithmetic/trunc.py +72 -0
- maxframe/tensor/arithmetic/utils.py +65 -0
- maxframe/tensor/array_utils.py +186 -0
- maxframe/tensor/base/__init__.py +34 -0
- maxframe/tensor/base/astype.py +119 -0
- maxframe/tensor/base/atleast_1d.py +74 -0
- maxframe/tensor/base/broadcast_to.py +89 -0
- maxframe/tensor/base/ravel.py +92 -0
- maxframe/tensor/base/tests/__init__.py +13 -0
- maxframe/tensor/base/tests/test_base.py +114 -0
- maxframe/tensor/base/transpose.py +125 -0
- maxframe/tensor/base/unique.py +205 -0
- maxframe/tensor/base/where.py +127 -0
- maxframe/tensor/core.py +724 -0
- maxframe/tensor/datasource/__init__.py +32 -0
- maxframe/tensor/datasource/arange.py +156 -0
- maxframe/tensor/datasource/array.py +415 -0
- maxframe/tensor/datasource/core.py +109 -0
- maxframe/tensor/datasource/empty.py +169 -0
- maxframe/tensor/datasource/from_dataframe.py +70 -0
- maxframe/tensor/datasource/from_dense.py +54 -0
- maxframe/tensor/datasource/from_sparse.py +47 -0
- maxframe/tensor/datasource/full.py +186 -0
- maxframe/tensor/datasource/ones.py +173 -0
- maxframe/tensor/datasource/scalar.py +40 -0
- maxframe/tensor/datasource/tests/__init__.py +13 -0
- maxframe/tensor/datasource/tests/test_datasource.py +278 -0
- maxframe/tensor/datasource/zeros.py +188 -0
- maxframe/tensor/fetch/__init__.py +15 -0
- maxframe/tensor/fetch/core.py +54 -0
- maxframe/tensor/indexing/__init__.py +47 -0
- maxframe/tensor/indexing/choose.py +196 -0
- maxframe/tensor/indexing/compress.py +124 -0
- maxframe/tensor/indexing/core.py +190 -0
- maxframe/tensor/indexing/extract.py +71 -0
- maxframe/tensor/indexing/fill_diagonal.py +183 -0
- maxframe/tensor/indexing/flatnonzero.py +60 -0
- maxframe/tensor/indexing/getitem.py +175 -0
- maxframe/tensor/indexing/nonzero.py +120 -0
- maxframe/tensor/indexing/setitem.py +132 -0
- maxframe/tensor/indexing/slice.py +29 -0
- maxframe/tensor/indexing/take.py +130 -0
- maxframe/tensor/indexing/tests/__init__.py +15 -0
- maxframe/tensor/indexing/tests/test_indexing.py +234 -0
- maxframe/tensor/indexing/unravel_index.py +103 -0
- maxframe/tensor/merge/__init__.py +15 -0
- maxframe/tensor/merge/stack.py +132 -0
- maxframe/tensor/merge/tests/__init__.py +13 -0
- maxframe/tensor/merge/tests/test_merge.py +52 -0
- maxframe/tensor/operators.py +123 -0
- maxframe/tensor/random/__init__.py +168 -0
- maxframe/tensor/random/beta.py +87 -0
- maxframe/tensor/random/binomial.py +137 -0
- maxframe/tensor/random/bytes.py +39 -0
- maxframe/tensor/random/chisquare.py +110 -0
- maxframe/tensor/random/choice.py +186 -0
- maxframe/tensor/random/core.py +234 -0
- maxframe/tensor/random/dirichlet.py +123 -0
- maxframe/tensor/random/exponential.py +94 -0
- maxframe/tensor/random/f.py +135 -0
- maxframe/tensor/random/gamma.py +128 -0
- maxframe/tensor/random/geometric.py +93 -0
- maxframe/tensor/random/gumbel.py +167 -0
- maxframe/tensor/random/hypergeometric.py +148 -0
- maxframe/tensor/random/laplace.py +133 -0
- maxframe/tensor/random/logistic.py +129 -0
- maxframe/tensor/random/lognormal.py +159 -0
- maxframe/tensor/random/logseries.py +122 -0
- maxframe/tensor/random/multinomial.py +133 -0
- maxframe/tensor/random/multivariate_normal.py +192 -0
- maxframe/tensor/random/negative_binomial.py +125 -0
- maxframe/tensor/random/noncentral_chisquare.py +132 -0
- maxframe/tensor/random/noncentral_f.py +126 -0
- maxframe/tensor/random/normal.py +143 -0
- maxframe/tensor/random/pareto.py +140 -0
- maxframe/tensor/random/permutation.py +104 -0
- maxframe/tensor/random/poisson.py +111 -0
- maxframe/tensor/random/power.py +142 -0
- maxframe/tensor/random/rand.py +82 -0
- maxframe/tensor/random/randint.py +121 -0
- maxframe/tensor/random/randn.py +96 -0
- maxframe/tensor/random/random_integers.py +123 -0
- maxframe/tensor/random/random_sample.py +86 -0
- maxframe/tensor/random/rayleigh.py +110 -0
- maxframe/tensor/random/shuffle.py +61 -0
- maxframe/tensor/random/standard_cauchy.py +105 -0
- maxframe/tensor/random/standard_exponential.py +72 -0
- maxframe/tensor/random/standard_gamma.py +120 -0
- maxframe/tensor/random/standard_normal.py +74 -0
- maxframe/tensor/random/standard_t.py +135 -0
- maxframe/tensor/random/tests/__init__.py +15 -0
- maxframe/tensor/random/tests/test_random.py +167 -0
- maxframe/tensor/random/triangular.py +119 -0
- maxframe/tensor/random/uniform.py +131 -0
- maxframe/tensor/random/vonmises.py +131 -0
- maxframe/tensor/random/wald.py +114 -0
- maxframe/tensor/random/weibull.py +140 -0
- maxframe/tensor/random/zipf.py +122 -0
- maxframe/tensor/rechunk/__init__.py +26 -0
- maxframe/tensor/rechunk/rechunk.py +43 -0
- maxframe/tensor/reduction/__init__.py +66 -0
- maxframe/tensor/reduction/all.py +103 -0
- maxframe/tensor/reduction/allclose.py +88 -0
- maxframe/tensor/reduction/any.py +105 -0
- maxframe/tensor/reduction/argmax.py +103 -0
- maxframe/tensor/reduction/argmin.py +103 -0
- maxframe/tensor/reduction/array_equal.py +64 -0
- maxframe/tensor/reduction/core.py +168 -0
- maxframe/tensor/reduction/count_nonzero.py +81 -0
- maxframe/tensor/reduction/cumprod.py +97 -0
- maxframe/tensor/reduction/cumsum.py +101 -0
- maxframe/tensor/reduction/max.py +120 -0
- maxframe/tensor/reduction/mean.py +123 -0
- maxframe/tensor/reduction/min.py +120 -0
- maxframe/tensor/reduction/nanargmax.py +82 -0
- maxframe/tensor/reduction/nanargmin.py +76 -0
- maxframe/tensor/reduction/nancumprod.py +91 -0
- maxframe/tensor/reduction/nancumsum.py +94 -0
- maxframe/tensor/reduction/nanmax.py +111 -0
- maxframe/tensor/reduction/nanmean.py +106 -0
- maxframe/tensor/reduction/nanmin.py +111 -0
- maxframe/tensor/reduction/nanprod.py +94 -0
- maxframe/tensor/reduction/nanstd.py +126 -0
- maxframe/tensor/reduction/nansum.py +115 -0
- maxframe/tensor/reduction/nanvar.py +149 -0
- maxframe/tensor/reduction/prod.py +130 -0
- maxframe/tensor/reduction/std.py +134 -0
- maxframe/tensor/reduction/sum.py +125 -0
- maxframe/tensor/reduction/tests/__init__.py +13 -0
- maxframe/tensor/reduction/tests/test_reduction.py +181 -0
- maxframe/tensor/reduction/var.py +176 -0
- maxframe/tensor/reshape/__init__.py +17 -0
- maxframe/tensor/reshape/reshape.py +188 -0
- maxframe/tensor/reshape/tests/__init__.py +15 -0
- maxframe/tensor/reshape/tests/test_reshape.py +37 -0
- maxframe/tensor/statistics/__init__.py +13 -0
- maxframe/tensor/statistics/percentile.py +175 -0
- maxframe/tensor/statistics/quantile.py +288 -0
- maxframe/tensor/ufunc/__init__.py +26 -0
- maxframe/tensor/ufunc/ufunc.py +200 -0
- maxframe/tensor/utils.py +718 -0
- maxframe/tests/__init__.py +13 -0
- maxframe/tests/test_codegen.py +69 -0
- maxframe/tests/test_protocol.py +144 -0
- maxframe/tests/test_utils.py +376 -0
- maxframe/tests/utils.py +164 -0
- maxframe/typing_.py +37 -0
- maxframe/udf.py +134 -0
- maxframe/utils.py +1114 -0
- maxframe-0.1.0b5.dist-info/METADATA +104 -0
- maxframe-0.1.0b5.dist-info/RECORD +647 -0
- maxframe-0.1.0b5.dist-info/WHEEL +5 -0
- maxframe-0.1.0b5.dist-info/top_level.txt +3 -0
- maxframe_client/__init__.py +17 -0
- maxframe_client/clients/__init__.py +13 -0
- maxframe_client/clients/framedriver.py +118 -0
- maxframe_client/clients/spe.py +104 -0
- maxframe_client/conftest.py +15 -0
- maxframe_client/fetcher.py +264 -0
- maxframe_client/session/__init__.py +22 -0
- maxframe_client/session/consts.py +36 -0
- maxframe_client/session/graph.py +119 -0
- maxframe_client/session/odps.py +482 -0
- maxframe_client/session/task.py +280 -0
- maxframe_client/session/tests/__init__.py +13 -0
- maxframe_client/session/tests/test_task.py +85 -0
- maxframe_client/tests/__init__.py +13 -0
- maxframe_client/tests/test_fetcher.py +89 -0
- maxframe_client/tests/test_session.py +255 -0
|
@@ -0,0 +1,467 @@
|
|
|
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 logging
|
|
16
|
+
from collections import deque
|
|
17
|
+
from io import StringIO
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
cdef class DirectedGraph:
|
|
23
|
+
cdef readonly:
|
|
24
|
+
dict _nodes
|
|
25
|
+
dict _predecessors
|
|
26
|
+
dict _successors
|
|
27
|
+
|
|
28
|
+
def __init__(self):
|
|
29
|
+
self._nodes = dict()
|
|
30
|
+
self._predecessors = dict()
|
|
31
|
+
self._successors = dict()
|
|
32
|
+
|
|
33
|
+
def __iter__(self):
|
|
34
|
+
return iter(self._nodes)
|
|
35
|
+
|
|
36
|
+
def __contains__(self, n):
|
|
37
|
+
return n in self._nodes
|
|
38
|
+
|
|
39
|
+
def __len__(self):
|
|
40
|
+
return len(self._nodes)
|
|
41
|
+
|
|
42
|
+
def __getitem__(self, n):
|
|
43
|
+
return self._successors[n]
|
|
44
|
+
|
|
45
|
+
def contains(self, node):
|
|
46
|
+
return node in self._nodes
|
|
47
|
+
|
|
48
|
+
def add_node(self, node, node_attr=None, **node_attrs):
|
|
49
|
+
if node_attr is None:
|
|
50
|
+
node_attr = node_attrs
|
|
51
|
+
else:
|
|
52
|
+
try:
|
|
53
|
+
node_attr.update(node_attrs)
|
|
54
|
+
except AttributeError:
|
|
55
|
+
raise TypeError('The node_attr argument must be a dictionary')
|
|
56
|
+
self._add_node(node, node_attr)
|
|
57
|
+
|
|
58
|
+
cdef inline _add_node(self, node, dict node_attr=None):
|
|
59
|
+
if node_attr is None:
|
|
60
|
+
node_attr = dict()
|
|
61
|
+
if node not in self._nodes:
|
|
62
|
+
self._nodes[node] = node_attr
|
|
63
|
+
self._successors[node] = dict()
|
|
64
|
+
self._predecessors[node] = dict()
|
|
65
|
+
else:
|
|
66
|
+
self._nodes[node].update(node_attr)
|
|
67
|
+
|
|
68
|
+
def remove_node(self, node):
|
|
69
|
+
if node not in self._nodes:
|
|
70
|
+
raise KeyError(f'Node {node} does not exist '
|
|
71
|
+
f'in the directed graph')
|
|
72
|
+
|
|
73
|
+
del self._nodes[node]
|
|
74
|
+
|
|
75
|
+
for succ in self._successors[node]:
|
|
76
|
+
del self._predecessors[succ][node]
|
|
77
|
+
del self._successors[node]
|
|
78
|
+
|
|
79
|
+
for pred in self._predecessors[node]:
|
|
80
|
+
del self._successors[pred][node]
|
|
81
|
+
del self._predecessors[node]
|
|
82
|
+
|
|
83
|
+
def add_edge(self, u, v, edge_attr=None, **edge_attrs):
|
|
84
|
+
if edge_attr is None:
|
|
85
|
+
edge_attr = edge_attrs
|
|
86
|
+
else:
|
|
87
|
+
try:
|
|
88
|
+
edge_attr.update(edge_attrs)
|
|
89
|
+
except AttributeError:
|
|
90
|
+
raise TypeError('The edge_attr argument must be a dictionary')
|
|
91
|
+
self._add_edge(u, v, edge_attr)
|
|
92
|
+
|
|
93
|
+
cdef inline _add_edge(self, u, v, edge_attr=None):
|
|
94
|
+
cdef:
|
|
95
|
+
dict u_succ, v_pred
|
|
96
|
+
|
|
97
|
+
if u not in self._nodes:
|
|
98
|
+
raise KeyError(f'Node {u} does not exist in the directed graph')
|
|
99
|
+
if v not in self._nodes:
|
|
100
|
+
raise KeyError(f'Node {v} does not exist in the directed graph')
|
|
101
|
+
|
|
102
|
+
if edge_attr is None:
|
|
103
|
+
edge_attr = dict()
|
|
104
|
+
|
|
105
|
+
u_succ = self._successors[u]
|
|
106
|
+
if v in u_succ:
|
|
107
|
+
u_succ[v].update(edge_attr)
|
|
108
|
+
else:
|
|
109
|
+
u_succ[v] = edge_attr
|
|
110
|
+
|
|
111
|
+
v_pred = self._predecessors[v]
|
|
112
|
+
if u not in v_pred:
|
|
113
|
+
# `update` is not necessary, as they point to the same object
|
|
114
|
+
v_pred[u] = edge_attr
|
|
115
|
+
|
|
116
|
+
def remove_edge(self, u, v):
|
|
117
|
+
try:
|
|
118
|
+
del self._successors[u][v]
|
|
119
|
+
del self._predecessors[v][u]
|
|
120
|
+
except KeyError:
|
|
121
|
+
raise KeyError(f'Edge {u}->{v} does not exist in the directed graph')
|
|
122
|
+
|
|
123
|
+
def has_successor(self, u, v):
|
|
124
|
+
return (u in self._successors) and (v in self._successors[u])
|
|
125
|
+
|
|
126
|
+
def has_predecessor(self, u, v):
|
|
127
|
+
return (u in self._predecessors) and (v in self._predecessors[u])
|
|
128
|
+
|
|
129
|
+
def iter_nodes(self, data=False):
|
|
130
|
+
if data:
|
|
131
|
+
return iter(self._nodes.items())
|
|
132
|
+
return iter(self._nodes)
|
|
133
|
+
|
|
134
|
+
def iter_successors(self, n):
|
|
135
|
+
try:
|
|
136
|
+
return iter(self._successors[n])
|
|
137
|
+
except KeyError:
|
|
138
|
+
raise KeyError(f'Node {n} does not exist in the directed graph')
|
|
139
|
+
|
|
140
|
+
cpdef list successors(self, n):
|
|
141
|
+
try:
|
|
142
|
+
return list(self._successors[n])
|
|
143
|
+
except KeyError:
|
|
144
|
+
raise KeyError(f'Node {n} does not exist in the directed graph')
|
|
145
|
+
|
|
146
|
+
def iter_predecessors(self, n):
|
|
147
|
+
try:
|
|
148
|
+
return iter(self._predecessors[n])
|
|
149
|
+
except KeyError:
|
|
150
|
+
raise KeyError(f'Node {n} does not exist in the directed graph')
|
|
151
|
+
|
|
152
|
+
cpdef list predecessors(self, n):
|
|
153
|
+
try:
|
|
154
|
+
return list(self._predecessors[n])
|
|
155
|
+
except KeyError:
|
|
156
|
+
raise KeyError(f'Node {n} does not exist in the directed graph')
|
|
157
|
+
|
|
158
|
+
cpdef int count_successors(self, n):
|
|
159
|
+
return len(self._successors[n])
|
|
160
|
+
|
|
161
|
+
cpdef int count_predecessors(self, n):
|
|
162
|
+
return len(self._predecessors[n])
|
|
163
|
+
|
|
164
|
+
def iter_indep(self, bint reverse=False):
|
|
165
|
+
cdef dict preds
|
|
166
|
+
preds = self._predecessors if not reverse else self._successors
|
|
167
|
+
for n, p in preds.items():
|
|
168
|
+
if len(p) == 0:
|
|
169
|
+
yield n
|
|
170
|
+
|
|
171
|
+
cpdef int count_indep(self, reverse=False):
|
|
172
|
+
cdef:
|
|
173
|
+
dict preds
|
|
174
|
+
int result = 0
|
|
175
|
+
preds = self._predecessors if not reverse else self._successors
|
|
176
|
+
for n, p in preds.items():
|
|
177
|
+
if len(p) == 0:
|
|
178
|
+
result += 1
|
|
179
|
+
return result
|
|
180
|
+
|
|
181
|
+
def dfs(self, start=None, visit_predicate=None, successors=None, reverse=False):
|
|
182
|
+
cdef:
|
|
183
|
+
set visited = set()
|
|
184
|
+
list stack
|
|
185
|
+
bint visit_all = False
|
|
186
|
+
|
|
187
|
+
if reverse:
|
|
188
|
+
pred_fun, succ_fun = self.successors, self.predecessors
|
|
189
|
+
else:
|
|
190
|
+
pred_fun, succ_fun = self.predecessors, self.successors
|
|
191
|
+
|
|
192
|
+
if start:
|
|
193
|
+
if not isinstance(start, (list, tuple)):
|
|
194
|
+
start = [start]
|
|
195
|
+
stack = list(start)
|
|
196
|
+
else:
|
|
197
|
+
stack = list(self.iter_indep(reverse=reverse))
|
|
198
|
+
|
|
199
|
+
def _default_visit_predicate(n, visited):
|
|
200
|
+
cdef list preds
|
|
201
|
+
preds = pred_fun(n)
|
|
202
|
+
return not preds or all(pred in visited for pred in preds)
|
|
203
|
+
|
|
204
|
+
successors = successors or succ_fun
|
|
205
|
+
visit_all = (visit_predicate == 'all')
|
|
206
|
+
visit_predicate = visit_predicate or _default_visit_predicate
|
|
207
|
+
|
|
208
|
+
while stack:
|
|
209
|
+
node = stack.pop()
|
|
210
|
+
if node in visited:
|
|
211
|
+
continue
|
|
212
|
+
preds = self.predecessors(node)
|
|
213
|
+
if visit_all or visit_predicate(node, visited):
|
|
214
|
+
yield node
|
|
215
|
+
visited.add(node)
|
|
216
|
+
stack.extend(n for n in successors(node) if n not in visited)
|
|
217
|
+
else:
|
|
218
|
+
stack.append(node)
|
|
219
|
+
stack.extend(n for n in preds if n not in visited)
|
|
220
|
+
|
|
221
|
+
def bfs(self, start=None, visit_predicate=None, successors=None, reverse=False):
|
|
222
|
+
cdef:
|
|
223
|
+
object queue
|
|
224
|
+
object node
|
|
225
|
+
set visited = set()
|
|
226
|
+
bint visit_all = False
|
|
227
|
+
|
|
228
|
+
if reverse:
|
|
229
|
+
pred_fun, succ_fun = self.successors, self.predecessors
|
|
230
|
+
else:
|
|
231
|
+
pred_fun, succ_fun = self.predecessors, self.successors
|
|
232
|
+
|
|
233
|
+
if start is not None:
|
|
234
|
+
if not isinstance(start, (list, tuple)):
|
|
235
|
+
start = [start]
|
|
236
|
+
queue = deque(start)
|
|
237
|
+
else:
|
|
238
|
+
queue = deque(self.iter_indep(reverse=reverse))
|
|
239
|
+
|
|
240
|
+
def _default_visit_predicate(n, visited):
|
|
241
|
+
preds = pred_fun(n)
|
|
242
|
+
return not preds or all(pred in visited for pred in preds)
|
|
243
|
+
|
|
244
|
+
successors = successors or succ_fun
|
|
245
|
+
visit_all = (visit_predicate == 'all')
|
|
246
|
+
visit_predicate = visit_predicate or _default_visit_predicate
|
|
247
|
+
|
|
248
|
+
while queue:
|
|
249
|
+
node = queue.popleft()
|
|
250
|
+
if node in visited:
|
|
251
|
+
continue
|
|
252
|
+
preds = pred_fun(node)
|
|
253
|
+
if visit_all or visit_predicate(node, visited):
|
|
254
|
+
yield node
|
|
255
|
+
visited.add(node)
|
|
256
|
+
queue.extend(n for n in successors(node) if n not in visited)
|
|
257
|
+
else:
|
|
258
|
+
queue.append(node)
|
|
259
|
+
queue.extend(n for n in preds if n not in visited)
|
|
260
|
+
|
|
261
|
+
def copy(self):
|
|
262
|
+
cdef DirectedGraph graph = type(self)()
|
|
263
|
+
for n in self:
|
|
264
|
+
if n not in graph._nodes:
|
|
265
|
+
graph._add_node(n)
|
|
266
|
+
for succ in self.iter_successors(n):
|
|
267
|
+
if succ not in graph._nodes:
|
|
268
|
+
graph._add_node(succ)
|
|
269
|
+
graph._add_edge(n, succ)
|
|
270
|
+
return graph
|
|
271
|
+
|
|
272
|
+
def copyto(self, DirectedGraph other_graph):
|
|
273
|
+
if other_graph is self:
|
|
274
|
+
return
|
|
275
|
+
|
|
276
|
+
other_graph._nodes = self._nodes.copy()
|
|
277
|
+
other_graph._predecessors = self._predecessors.copy()
|
|
278
|
+
other_graph._successors = self._successors.copy()
|
|
279
|
+
|
|
280
|
+
def build_undirected(self):
|
|
281
|
+
cdef DirectedGraph graph = DirectedGraph()
|
|
282
|
+
for n in self:
|
|
283
|
+
if n not in graph._nodes:
|
|
284
|
+
graph._add_node(n)
|
|
285
|
+
for succ in self._successors[n]:
|
|
286
|
+
if succ not in graph._nodes:
|
|
287
|
+
graph._add_node(succ)
|
|
288
|
+
graph._add_edge(n, succ)
|
|
289
|
+
graph._add_edge(succ, n)
|
|
290
|
+
return graph
|
|
291
|
+
|
|
292
|
+
def build_reversed(self):
|
|
293
|
+
cdef DirectedGraph graph = type(self)()
|
|
294
|
+
for n in self:
|
|
295
|
+
if n not in graph._nodes:
|
|
296
|
+
graph._add_node(n)
|
|
297
|
+
for succ in self._successors[n]:
|
|
298
|
+
if succ not in graph._nodes:
|
|
299
|
+
graph._add_node(succ)
|
|
300
|
+
graph._add_edge(succ, n)
|
|
301
|
+
return graph
|
|
302
|
+
|
|
303
|
+
@classmethod
|
|
304
|
+
def _repr_in_dot(cls, val):
|
|
305
|
+
if isinstance(val, bool):
|
|
306
|
+
return 'true' if val else 'false'
|
|
307
|
+
if isinstance(val, str):
|
|
308
|
+
return f'"{val}"'
|
|
309
|
+
return val
|
|
310
|
+
|
|
311
|
+
def _extract_operators(self, node):
|
|
312
|
+
return [node.op]
|
|
313
|
+
|
|
314
|
+
def to_dot(
|
|
315
|
+
self,
|
|
316
|
+
graph_attrs=None,
|
|
317
|
+
node_attrs=None,
|
|
318
|
+
trunc_key=5, result_chunk_keys=None, show_columns=False):
|
|
319
|
+
|
|
320
|
+
sio = StringIO()
|
|
321
|
+
sio.write('digraph {\n')
|
|
322
|
+
sio.write('splines=curved\n')
|
|
323
|
+
sio.write('rankdir=BT\n')
|
|
324
|
+
|
|
325
|
+
if graph_attrs:
|
|
326
|
+
sio.write('graph [{0}];\n'.format(
|
|
327
|
+
' '.join(f'{k}={self._repr_in_dot(v)}' for k, v in graph_attrs.items())))
|
|
328
|
+
if node_attrs:
|
|
329
|
+
sio.write('node [{0}];\n'.format(
|
|
330
|
+
' '.join(f'{k}={self._repr_in_dot(v)}' for k, v in node_attrs.items())))
|
|
331
|
+
|
|
332
|
+
chunk_style = '[shape=box]'
|
|
333
|
+
operator_style = '[shape=circle]'
|
|
334
|
+
|
|
335
|
+
visited = set()
|
|
336
|
+
|
|
337
|
+
def get_col_names(obj):
|
|
338
|
+
if hasattr(obj, "dtypes"):
|
|
339
|
+
return f"\"{','.join(list(obj.dtypes.index))}\""
|
|
340
|
+
elif hasattr(obj, "name"):
|
|
341
|
+
return f"\"{obj.name}\""
|
|
342
|
+
else:
|
|
343
|
+
return "\"N/A\""
|
|
344
|
+
|
|
345
|
+
for node in self.iter_nodes():
|
|
346
|
+
for op in self._extract_operators(node):
|
|
347
|
+
op_name = type(op).__name__
|
|
348
|
+
if op.stage is not None:
|
|
349
|
+
op_name = f'{op_name}:{op.stage.name}'
|
|
350
|
+
if op.key in visited:
|
|
351
|
+
continue
|
|
352
|
+
for input_chunk in (op.inputs or []):
|
|
353
|
+
if input_chunk.key not in visited:
|
|
354
|
+
sio.write(f'"Chunk:{self._gen_chunk_key(input_chunk, trunc_key)}" {chunk_style}\n')
|
|
355
|
+
visited.add(input_chunk.key)
|
|
356
|
+
if op.key not in visited:
|
|
357
|
+
sio.write(f'"{op_name}:{op.key[:trunc_key]}" {operator_style}\n')
|
|
358
|
+
visited.add(op.key)
|
|
359
|
+
sio.write(f'"Chunk:{self._gen_chunk_key(input_chunk, trunc_key)}" -> '
|
|
360
|
+
f'"{op_name}:{op.key[:trunc_key]}"\n')
|
|
361
|
+
|
|
362
|
+
for output_chunk in (op.outputs or []):
|
|
363
|
+
if output_chunk.key not in visited:
|
|
364
|
+
tmp_chunk_style = chunk_style
|
|
365
|
+
if result_chunk_keys and output_chunk.key in result_chunk_keys:
|
|
366
|
+
tmp_chunk_style = '[shape=box,style=filled,fillcolor=cadetblue1]'
|
|
367
|
+
sio.write(f'"Chunk:{self._gen_chunk_key(output_chunk, trunc_key)}" {tmp_chunk_style}\n')
|
|
368
|
+
visited.add(output_chunk.key)
|
|
369
|
+
if op.key not in visited:
|
|
370
|
+
sio.write(f'"{op_name}:{op.key[:trunc_key]}" {operator_style}\n')
|
|
371
|
+
visited.add(op.key)
|
|
372
|
+
sio.write(f'"{op_name}:{op.key[:trunc_key]}" -> '
|
|
373
|
+
f'"Chunk:{self._gen_chunk_key(output_chunk, trunc_key)}"')
|
|
374
|
+
if show_columns:
|
|
375
|
+
sio.write(f' [ label={get_col_names(output_chunk)} ]')
|
|
376
|
+
sio.write("\n")
|
|
377
|
+
|
|
378
|
+
sio.write('}')
|
|
379
|
+
return sio.getvalue()
|
|
380
|
+
|
|
381
|
+
@classmethod
|
|
382
|
+
def _gen_chunk_key(cls, chunk, trunc_key):
|
|
383
|
+
if "_" in chunk.key:
|
|
384
|
+
key, index = chunk.key.split("_", 1)
|
|
385
|
+
return "_".join([key[:trunc_key], index])
|
|
386
|
+
else: # pragma: no cover
|
|
387
|
+
return chunk.key[:trunc_key]
|
|
388
|
+
|
|
389
|
+
def _repr_svg_(self): # pragma: no cover
|
|
390
|
+
from graphviz import Source
|
|
391
|
+
return Source(self.to_dot())._repr_svg_()
|
|
392
|
+
|
|
393
|
+
def _repr_mimebundle_(self, *args, **kw): # pragma: no cover
|
|
394
|
+
from graphviz import Source
|
|
395
|
+
return Source(self.to_dot())._repr_mimebundle_(*args, **kw)
|
|
396
|
+
|
|
397
|
+
def compose(self, list keys=None):
|
|
398
|
+
from ...optimizes.chunk_graph.fuse import Fusion
|
|
399
|
+
|
|
400
|
+
return Fusion(self).compose(keys=keys)
|
|
401
|
+
|
|
402
|
+
def decompose(self, nodes=None):
|
|
403
|
+
from ...optimizes.chunk_graph.fuse import Fusion
|
|
404
|
+
|
|
405
|
+
Fusion(self).decompose(nodes=nodes)
|
|
406
|
+
|
|
407
|
+
def view(self, filename='default', graph_attrs=None, trunc_key=5, node_attrs=None, result_chunk_keys=None, show_columns=False): # pragma: no cover
|
|
408
|
+
from graphviz import Source
|
|
409
|
+
|
|
410
|
+
g = Source(self.to_dot(graph_attrs, node_attrs, trunc_key=trunc_key, result_chunk_keys=result_chunk_keys, show_columns=show_columns))
|
|
411
|
+
g.view(filename=filename, cleanup=True)
|
|
412
|
+
|
|
413
|
+
def to_dag(self):
|
|
414
|
+
dag = DAG()
|
|
415
|
+
dag._nodes = self._nodes.copy()
|
|
416
|
+
dag._predecessors = self._predecessors.copy()
|
|
417
|
+
dag._successors = self._successors.copy()
|
|
418
|
+
return dag
|
|
419
|
+
|
|
420
|
+
|
|
421
|
+
class GraphContainsCycleError(Exception):
|
|
422
|
+
pass
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
cdef class DAG(DirectedGraph):
|
|
426
|
+
def to_dag(self):
|
|
427
|
+
return self
|
|
428
|
+
|
|
429
|
+
def topological_iter(self, succ_checker=None, reverse=False):
|
|
430
|
+
cdef:
|
|
431
|
+
dict preds, succs
|
|
432
|
+
set visited = set()
|
|
433
|
+
list stack
|
|
434
|
+
|
|
435
|
+
if len(self) == 0:
|
|
436
|
+
return
|
|
437
|
+
|
|
438
|
+
if reverse:
|
|
439
|
+
preds, succs = self._successors, self._predecessors
|
|
440
|
+
else:
|
|
441
|
+
preds, succs = self._predecessors, self._successors
|
|
442
|
+
|
|
443
|
+
# copy predecessors and successors
|
|
444
|
+
succs = dict((k, set(v)) for k, v in succs.items())
|
|
445
|
+
preds = dict((k, set(v)) for k, v in preds.items())
|
|
446
|
+
|
|
447
|
+
def _default_succ_checker(_, predecessors):
|
|
448
|
+
return len(predecessors) == 0
|
|
449
|
+
|
|
450
|
+
succ_checker = succ_checker or _default_succ_checker
|
|
451
|
+
|
|
452
|
+
stack = list((p for p, l in preds.items() if len(l) == 0))
|
|
453
|
+
if not stack:
|
|
454
|
+
raise GraphContainsCycleError
|
|
455
|
+
while stack:
|
|
456
|
+
node = stack.pop()
|
|
457
|
+
yield node
|
|
458
|
+
visited.add(node)
|
|
459
|
+
for succ in succs.get(node, {}):
|
|
460
|
+
if succ in visited:
|
|
461
|
+
raise GraphContainsCycleError
|
|
462
|
+
succ_preds = preds[succ]
|
|
463
|
+
succ_preds.remove(node)
|
|
464
|
+
if succ_checker(succ, succ_preds):
|
|
465
|
+
stack.append(succ)
|
|
466
|
+
if len(visited) != len(self):
|
|
467
|
+
raise GraphContainsCycleError
|
|
@@ -0,0 +1,171 @@
|
|
|
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 abc import ABCMeta, abstractmethod
|
|
16
|
+
from typing import Dict, Iterable, List, Union
|
|
17
|
+
|
|
18
|
+
from ...core import Chunk, Tileable
|
|
19
|
+
from ...serialization.core import buffered
|
|
20
|
+
from ...serialization.serializables import BoolField, DictField, ListField, Serializable
|
|
21
|
+
from ...serialization.serializables.core import SerializableSerializer
|
|
22
|
+
from ...utils import tokenize
|
|
23
|
+
from .core import DAG
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class EntityGraph(DAG, metaclass=ABCMeta):
|
|
27
|
+
@property
|
|
28
|
+
@abstractmethod
|
|
29
|
+
def results(self):
|
|
30
|
+
"""
|
|
31
|
+
Return result tileables or chunks.
|
|
32
|
+
|
|
33
|
+
Returns
|
|
34
|
+
-------
|
|
35
|
+
results
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
@results.setter
|
|
39
|
+
@abstractmethod
|
|
40
|
+
def results(self, new_results):
|
|
41
|
+
"""
|
|
42
|
+
Set result tileables or chunks.
|
|
43
|
+
|
|
44
|
+
Parameters
|
|
45
|
+
----------
|
|
46
|
+
new_results
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
|
|
51
|
+
"""
|
|
52
|
+
|
|
53
|
+
def copy(self) -> "EntityGraph":
|
|
54
|
+
graph = super().copy()
|
|
55
|
+
graph.results = self.results.copy()
|
|
56
|
+
return graph
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class TileableGraph(EntityGraph, Iterable[Tileable]):
|
|
60
|
+
_result_tileables: List[Tileable]
|
|
61
|
+
# logic key is a unique and deterministic key for `TileableGraph`. For
|
|
62
|
+
# multiple runs the logic key will remain same if the computational logic
|
|
63
|
+
# doesn't change. And it can be used to some optimization when running a
|
|
64
|
+
# same `execute`, like HBO.
|
|
65
|
+
_logic_key: str
|
|
66
|
+
|
|
67
|
+
def __init__(self, result_tileables: List[Tileable] = None):
|
|
68
|
+
super().__init__()
|
|
69
|
+
self._result_tileables = result_tileables
|
|
70
|
+
|
|
71
|
+
@property
|
|
72
|
+
def result_tileables(self):
|
|
73
|
+
return self._result_tileables
|
|
74
|
+
|
|
75
|
+
@property
|
|
76
|
+
def results(self):
|
|
77
|
+
return self._result_tileables
|
|
78
|
+
|
|
79
|
+
@results.setter
|
|
80
|
+
def results(self, new_results):
|
|
81
|
+
self._result_tileables = new_results
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def logic_key(self):
|
|
85
|
+
if not hasattr(self, "_logic_key") or self._logic_key is None:
|
|
86
|
+
token_keys = []
|
|
87
|
+
for node in self.bfs():
|
|
88
|
+
logic_key = node.op.get_logic_key()
|
|
89
|
+
if hasattr(node.op, "logic_key") and node.op.logic_key is None:
|
|
90
|
+
node.op.logic_key = logic_key
|
|
91
|
+
token_keys.append(
|
|
92
|
+
tokenize(logic_key, **node.extra_params)
|
|
93
|
+
if node.extra_params
|
|
94
|
+
else logic_key
|
|
95
|
+
)
|
|
96
|
+
self._logic_key = tokenize(*token_keys)
|
|
97
|
+
return self._logic_key
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class ChunkGraph(EntityGraph, Iterable[Chunk]):
|
|
101
|
+
_result_chunks: List[Chunk]
|
|
102
|
+
|
|
103
|
+
def __init__(self, result_chunks: List[Chunk] = None):
|
|
104
|
+
super().__init__()
|
|
105
|
+
self._result_chunks = result_chunks
|
|
106
|
+
|
|
107
|
+
@property
|
|
108
|
+
def result_chunks(self):
|
|
109
|
+
return self._result_chunks
|
|
110
|
+
|
|
111
|
+
@property
|
|
112
|
+
def results(self):
|
|
113
|
+
return self._result_chunks
|
|
114
|
+
|
|
115
|
+
@results.setter
|
|
116
|
+
def results(self, new_results):
|
|
117
|
+
self._result_chunks = new_results
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class SerializableGraph(Serializable):
|
|
121
|
+
_is_chunk = BoolField("is_chunk")
|
|
122
|
+
# TODO(qinxuye): remove this logic when we handle fetch elegantly,
|
|
123
|
+
# now, the node in the graph and inputs for operator may be inconsistent,
|
|
124
|
+
# for example, an operator's inputs may be chunks,
|
|
125
|
+
# but in the graph, the predecessors are all fetch chunks,
|
|
126
|
+
# we serialize the fetch chunks first to make sure when operator's inputs
|
|
127
|
+
# are serialized, they will just be marked as serialized and skip serialization.
|
|
128
|
+
_fetch_nodes = ListField("fetch_nodes")
|
|
129
|
+
_nodes = DictField("nodes")
|
|
130
|
+
_predecessors = DictField("predecessors")
|
|
131
|
+
_successors = DictField("successors")
|
|
132
|
+
_results = ListField("results")
|
|
133
|
+
|
|
134
|
+
@classmethod
|
|
135
|
+
def from_graph(cls, graph: Union[TileableGraph, ChunkGraph]) -> "SerializableGraph":
|
|
136
|
+
from ..operator import Fetch
|
|
137
|
+
|
|
138
|
+
is_chunk = isinstance(graph, ChunkGraph)
|
|
139
|
+
return SerializableGraph(
|
|
140
|
+
_is_chunk=is_chunk,
|
|
141
|
+
_fetch_nodes=[chunk for chunk in graph if isinstance(chunk.op, Fetch)],
|
|
142
|
+
_nodes=graph._nodes,
|
|
143
|
+
_predecessors=graph._predecessors,
|
|
144
|
+
_successors=graph._successors,
|
|
145
|
+
_results=graph.results,
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
def to_graph(self) -> Union[TileableGraph, ChunkGraph]:
|
|
149
|
+
graph_cls = ChunkGraph if self._is_chunk else TileableGraph
|
|
150
|
+
graph = graph_cls(self._results)
|
|
151
|
+
graph._nodes.update(self._nodes)
|
|
152
|
+
graph._predecessors.update(self._predecessors)
|
|
153
|
+
graph._successors.update(self._successors)
|
|
154
|
+
return graph
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
class GraphSerializer(SerializableSerializer):
|
|
158
|
+
@buffered
|
|
159
|
+
def serial(self, obj: Union[TileableGraph, ChunkGraph], context: Dict):
|
|
160
|
+
serializable_graph = SerializableGraph.from_graph(obj)
|
|
161
|
+
return [], [serializable_graph], False
|
|
162
|
+
|
|
163
|
+
def deserial(
|
|
164
|
+
self, serialized: List, context: Dict, subs: List
|
|
165
|
+
) -> Union[TileableGraph, ChunkGraph]:
|
|
166
|
+
serializable_graph: SerializableGraph = subs[0]
|
|
167
|
+
return serializable_graph.to_graph()
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
GraphSerializer.register(EntityGraph)
|
|
171
|
+
SerializableSerializer.register(SerializableGraph)
|
|
@@ -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.
|