maxframe 1.3.0__cp310-cp310-macosx_10_9_universal2.whl → 2.0.0__cp310-cp310-macosx_10_9_universal2.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/_utils.cpython-310-darwin.so +0 -0
- maxframe/_utils.pyi +21 -0
- maxframe/_utils.pyx +4 -3
- maxframe/codegen/__init__.py +27 -0
- maxframe/{codegen.py → codegen/core.py} +49 -43
- maxframe/codegen/spe/__init__.py +16 -0
- maxframe/codegen/spe/core.py +307 -0
- maxframe/codegen/spe/dataframe/__init__.py +37 -0
- maxframe/codegen/spe/dataframe/accessors/__init__.py +15 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +53 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +194 -0
- maxframe/codegen/spe/dataframe/accessors/list_.py +80 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +84 -0
- maxframe/codegen/spe/dataframe/datasource.py +181 -0
- maxframe/codegen/spe/dataframe/datastore.py +204 -0
- maxframe/codegen/spe/dataframe/extensions.py +63 -0
- maxframe/codegen/spe/dataframe/fetch.py +26 -0
- maxframe/codegen/spe/dataframe/groupby.py +224 -0
- maxframe/codegen/spe/dataframe/indexing.py +238 -0
- maxframe/codegen/spe/dataframe/merge.py +73 -0
- maxframe/codegen/spe/dataframe/misc.py +286 -0
- maxframe/codegen/spe/dataframe/missing.py +64 -0
- maxframe/codegen/spe/dataframe/reduction.py +160 -0
- maxframe/codegen/spe/dataframe/sort.py +83 -0
- maxframe/codegen/spe/dataframe/statistics.py +46 -0
- maxframe/codegen/spe/dataframe/tests/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_base.py +33 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +310 -0
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +137 -0
- maxframe/codegen/spe/dataframe/tests/indexing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/indexing/conftest.py +58 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_getitem.py +124 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +76 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_indexing.py +39 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_rename.py +51 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_reset_index.py +88 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_sample.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_axis.py +45 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_set_index.py +41 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_setitem.py +46 -0
- maxframe/codegen/spe/dataframe/tests/misc/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_apply.py +133 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_drop_duplicates.py +92 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +234 -0
- maxframe/codegen/spe/dataframe/tests/missing/__init__.py +13 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_checkna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_dropna.py +50 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_fillna.py +94 -0
- maxframe/codegen/spe/dataframe/tests/missing/test_replace.py +45 -0
- maxframe/codegen/spe/dataframe/tests/test_arithmetic.py +73 -0
- maxframe/codegen/spe/dataframe/tests/test_datasource.py +184 -0
- maxframe/codegen/spe/dataframe/tests/test_datastore.py +200 -0
- maxframe/codegen/spe/dataframe/tests/test_extensions.py +88 -0
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +225 -0
- maxframe/codegen/spe/dataframe/tests/test_merge.py +400 -0
- maxframe/codegen/spe/dataframe/tests/test_reduction.py +104 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +159 -0
- maxframe/codegen/spe/dataframe/tests/test_statistics.py +70 -0
- maxframe/codegen/spe/dataframe/tests/test_tseries.py +29 -0
- maxframe/codegen/spe/dataframe/tests/test_value_counts.py +60 -0
- maxframe/codegen/spe/dataframe/tests/test_window.py +69 -0
- maxframe/codegen/spe/dataframe/tseries.py +46 -0
- maxframe/codegen/spe/dataframe/udf.py +62 -0
- maxframe/codegen/spe/dataframe/value_counts.py +31 -0
- maxframe/codegen/spe/dataframe/window.py +65 -0
- maxframe/codegen/spe/learn/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/__init__.py +15 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +160 -0
- maxframe/codegen/spe/learn/contrib/models.py +41 -0
- maxframe/codegen/spe/learn/contrib/pytorch.py +49 -0
- maxframe/codegen/spe/learn/contrib/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/contrib/tests/test_lightgbm.py +123 -0
- maxframe/codegen/spe/learn/contrib/tests/test_models.py +41 -0
- maxframe/codegen/spe/learn/contrib/tests/test_pytorch.py +53 -0
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +98 -0
- maxframe/codegen/spe/learn/contrib/xgboost.py +152 -0
- maxframe/codegen/spe/learn/metrics/__init__.py +15 -0
- maxframe/codegen/spe/learn/metrics/_classification.py +120 -0
- maxframe/codegen/spe/learn/metrics/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/metrics/tests/test_classification.py +93 -0
- maxframe/codegen/spe/learn/model_selection/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/model_selection/tests/test_split.py +41 -0
- maxframe/codegen/spe/learn/preprocessing/__init__.py +15 -0
- maxframe/codegen/spe/learn/preprocessing/_data.py +37 -0
- maxframe/codegen/spe/learn/preprocessing/_label.py +47 -0
- maxframe/codegen/spe/learn/preprocessing/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_data.py +31 -0
- maxframe/codegen/spe/learn/preprocessing/tests/test_label.py +43 -0
- maxframe/codegen/spe/learn/utils/__init__.py +15 -0
- maxframe/codegen/spe/learn/utils/checks.py +55 -0
- maxframe/codegen/spe/learn/utils/multiclass.py +60 -0
- maxframe/codegen/spe/learn/utils/shuffle.py +85 -0
- maxframe/codegen/spe/learn/utils/sparsefuncs.py +35 -0
- maxframe/codegen/spe/learn/utils/tests/__init__.py +13 -0
- maxframe/codegen/spe/learn/utils/tests/test_checks.py +48 -0
- maxframe/codegen/spe/learn/utils/tests/test_multiclass.py +52 -0
- maxframe/codegen/spe/learn/utils/tests/test_shuffle.py +50 -0
- maxframe/codegen/spe/learn/utils/tests/test_sparsefuncs.py +34 -0
- maxframe/codegen/spe/learn/utils/tests/test_validation.py +44 -0
- maxframe/codegen/spe/learn/utils/validation.py +35 -0
- maxframe/codegen/spe/objects.py +26 -0
- maxframe/codegen/spe/remote.py +29 -0
- maxframe/codegen/spe/tensor/__init__.py +28 -0
- maxframe/codegen/spe/tensor/arithmetic.py +95 -0
- maxframe/codegen/spe/tensor/core.py +41 -0
- maxframe/codegen/spe/tensor/datasource.py +165 -0
- maxframe/codegen/spe/tensor/extensions.py +35 -0
- maxframe/codegen/spe/tensor/fetch.py +26 -0
- maxframe/codegen/spe/tensor/indexing.py +63 -0
- maxframe/codegen/spe/tensor/linalg.py +63 -0
- maxframe/codegen/spe/tensor/merge.py +31 -0
- maxframe/codegen/spe/tensor/misc.py +121 -0
- maxframe/codegen/spe/tensor/random.py +29 -0
- maxframe/codegen/spe/tensor/reduction.py +39 -0
- maxframe/codegen/spe/tensor/reshape.py +26 -0
- maxframe/codegen/spe/tensor/sort.py +42 -0
- maxframe/codegen/spe/tensor/special.py +35 -0
- maxframe/codegen/spe/tensor/statistics.py +24 -0
- maxframe/codegen/spe/tensor/tests/__init__.py +13 -0
- maxframe/codegen/spe/tensor/tests/test_arithmetic.py +103 -0
- maxframe/codegen/spe/tensor/tests/test_datasource.py +99 -0
- maxframe/codegen/spe/tensor/tests/test_extensions.py +37 -0
- maxframe/codegen/spe/tensor/tests/test_indexing.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +38 -0
- maxframe/codegen/spe/tensor/tests/test_merge.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_misc.py +94 -0
- maxframe/codegen/spe/tensor/tests/test_random.py +55 -0
- maxframe/codegen/spe/tensor/tests/test_reduction.py +65 -0
- maxframe/codegen/spe/tensor/tests/test_reshape.py +39 -0
- maxframe/codegen/spe/tensor/tests/test_sort.py +49 -0
- maxframe/codegen/spe/tensor/tests/test_special.py +28 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +29 -0
- maxframe/codegen/spe/tests/__init__.py +13 -0
- maxframe/codegen/spe/tests/test_remote.py +29 -0
- maxframe/codegen/spe/tests/test_spe_codegen.py +141 -0
- maxframe/codegen/spe/utils.py +54 -0
- maxframe/codegen/tests/__init__.py +13 -0
- maxframe/{tests → codegen/tests}/test_codegen.py +3 -5
- maxframe/config/__init__.py +1 -1
- maxframe/config/config.py +50 -23
- maxframe/config/tests/test_config.py +4 -12
- maxframe/config/validators.py +5 -0
- maxframe/conftest.py +38 -10
- maxframe/core/__init__.py +1 -0
- maxframe/core/context.py +110 -0
- maxframe/core/entity/__init__.py +1 -0
- maxframe/core/entity/core.py +0 -7
- maxframe/core/entity/objects.py +19 -5
- maxframe/core/entity/output_types.py +11 -0
- maxframe/core/entity/tests/test_objects.py +11 -12
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/entity/utils.py +15 -0
- maxframe/core/graph/__init__.py +6 -1
- maxframe/core/graph/builder/base.py +5 -1
- maxframe/core/graph/core.cpython-310-darwin.so +0 -0
- maxframe/core/graph/core.pyx +17 -6
- maxframe/core/graph/entity.py +18 -6
- maxframe/core/operator/__init__.py +8 -3
- maxframe/core/operator/base.py +35 -12
- maxframe/core/operator/core.py +37 -14
- maxframe/core/operator/fetch.py +5 -18
- maxframe/core/operator/objects.py +0 -20
- maxframe/core/operator/shuffle.py +6 -72
- maxframe/dataframe/__init__.py +1 -0
- maxframe/dataframe/accessors/datetime_/core.py +7 -4
- maxframe/dataframe/accessors/string_/core.py +9 -6
- maxframe/dataframe/arithmetic/core.py +31 -20
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +6 -0
- maxframe/dataframe/core.py +98 -91
- maxframe/dataframe/datasource/core.py +8 -1
- maxframe/dataframe/datasource/date_range.py +8 -0
- maxframe/dataframe/datasource/from_index.py +9 -5
- maxframe/dataframe/datasource/from_records.py +9 -2
- maxframe/dataframe/datasource/from_tensor.py +32 -21
- maxframe/dataframe/datasource/read_csv.py +8 -2
- maxframe/dataframe/datasource/read_odps_query.py +109 -19
- maxframe/dataframe/datasource/read_odps_table.py +20 -5
- maxframe/dataframe/datasource/read_parquet.py +8 -3
- maxframe/dataframe/datasource/tests/test_datasource.py +80 -1
- maxframe/dataframe/datastore/tests/test_to_odps.py +52 -1
- maxframe/dataframe/datastore/to_csv.py +7 -3
- maxframe/dataframe/datastore/to_odps.py +42 -6
- maxframe/dataframe/extensions/__init__.py +6 -1
- maxframe/dataframe/extensions/apply_chunk.py +96 -136
- maxframe/dataframe/extensions/flatjson.py +3 -2
- maxframe/dataframe/extensions/flatmap.py +15 -7
- maxframe/dataframe/fetch/core.py +12 -1
- maxframe/dataframe/groupby/__init__.py +7 -0
- maxframe/dataframe/groupby/aggregation.py +62 -9
- maxframe/dataframe/groupby/apply.py +50 -74
- maxframe/dataframe/groupby/apply_chunk.py +393 -0
- maxframe/dataframe/groupby/core.py +80 -17
- maxframe/dataframe/groupby/extensions.py +26 -0
- maxframe/dataframe/groupby/fill.py +9 -4
- maxframe/dataframe/groupby/sample.py +7 -7
- maxframe/dataframe/groupby/tests/test_groupby.py +3 -3
- maxframe/dataframe/groupby/transform.py +57 -54
- maxframe/dataframe/indexing/align.py +7 -6
- maxframe/dataframe/indexing/getitem.py +9 -8
- maxframe/dataframe/indexing/iloc.py +28 -23
- maxframe/dataframe/indexing/insert.py +7 -3
- maxframe/dataframe/indexing/loc.py +9 -8
- maxframe/dataframe/indexing/reindex.py +36 -30
- maxframe/dataframe/indexing/rename_axis.py +18 -10
- maxframe/dataframe/indexing/reset_index.py +0 -2
- maxframe/dataframe/indexing/sample.py +13 -9
- maxframe/dataframe/indexing/set_axis.py +9 -6
- maxframe/dataframe/indexing/setitem.py +8 -5
- maxframe/dataframe/indexing/where.py +12 -9
- maxframe/dataframe/merge/__init__.py +0 -1
- maxframe/dataframe/merge/concat.py +10 -31
- maxframe/dataframe/merge/merge.py +2 -24
- maxframe/dataframe/misc/__init__.py +6 -0
- maxframe/dataframe/misc/_duplicate.py +7 -3
- maxframe/dataframe/misc/apply.py +106 -139
- maxframe/dataframe/misc/astype.py +3 -2
- maxframe/dataframe/misc/case_when.py +11 -7
- maxframe/dataframe/misc/cut.py +11 -10
- maxframe/dataframe/misc/describe.py +7 -3
- maxframe/dataframe/misc/drop.py +13 -11
- maxframe/dataframe/misc/eval.py +0 -2
- maxframe/dataframe/misc/get_dummies.py +78 -49
- maxframe/dataframe/misc/isin.py +13 -10
- maxframe/dataframe/misc/map.py +21 -6
- maxframe/dataframe/misc/melt.py +8 -1
- maxframe/dataframe/misc/pivot.py +232 -0
- maxframe/dataframe/misc/pivot_table.py +52 -40
- maxframe/dataframe/misc/rechunk.py +59 -0
- maxframe/dataframe/misc/shift.py +7 -4
- maxframe/dataframe/misc/stack.py +5 -3
- maxframe/dataframe/misc/tests/test_misc.py +167 -1
- maxframe/dataframe/misc/transform.py +63 -65
- maxframe/dataframe/misc/value_counts.py +7 -4
- maxframe/dataframe/missing/dropna.py +16 -7
- maxframe/dataframe/missing/fillna.py +18 -10
- maxframe/dataframe/missing/replace.py +10 -6
- maxframe/dataframe/missing/tests/test_missing.py +2 -2
- maxframe/dataframe/operators.py +1 -27
- maxframe/dataframe/reduction/aggregation.py +128 -3
- maxframe/dataframe/reduction/core.py +20 -6
- maxframe/dataframe/reduction/median.py +1 -1
- maxframe/dataframe/reduction/tests/test_reduction.py +33 -0
- maxframe/dataframe/reduction/unique.py +53 -7
- maxframe/dataframe/statistics/corr.py +9 -6
- maxframe/dataframe/statistics/quantile.py +9 -6
- maxframe/dataframe/tseries/to_datetime.py +6 -4
- maxframe/dataframe/utils.py +219 -31
- maxframe/dataframe/window/rolling.py +7 -4
- maxframe/env.py +1 -0
- maxframe/errors.py +9 -0
- maxframe/extension.py +13 -2
- maxframe/io/objects/core.py +67 -51
- maxframe/io/objects/tensor.py +73 -17
- maxframe/io/objects/tests/test_object_io.py +10 -55
- maxframe/io/odpsio/arrow.py +15 -2
- maxframe/io/odpsio/schema.py +43 -13
- maxframe/io/odpsio/tableio.py +63 -11
- maxframe/io/odpsio/tests/test_arrow.py +1 -2
- maxframe/io/odpsio/tests/test_schema.py +114 -1
- maxframe/io/odpsio/tests/test_tableio.py +42 -0
- maxframe/io/odpsio/tests/test_volumeio.py +21 -58
- maxframe/io/odpsio/volumeio.py +23 -8
- maxframe/learn/__init__.py +2 -2
- maxframe/learn/contrib/__init__.py +2 -2
- maxframe/learn/contrib/graph/connected_components.py +2 -1
- maxframe/learn/contrib/lightgbm/__init__.py +33 -0
- maxframe/learn/contrib/lightgbm/_predict.py +138 -0
- maxframe/learn/contrib/lightgbm/_train.py +163 -0
- maxframe/learn/contrib/lightgbm/callback.py +114 -0
- maxframe/learn/contrib/lightgbm/classifier.py +199 -0
- maxframe/learn/contrib/lightgbm/core.py +372 -0
- maxframe/learn/contrib/lightgbm/dataset.py +153 -0
- maxframe/learn/contrib/lightgbm/regressor.py +29 -0
- maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
- maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
- maxframe/learn/contrib/llm/models/dashscope.py +34 -0
- maxframe/learn/contrib/llm/models/managed.py +15 -0
- maxframe/learn/contrib/llm/multi_modal.py +92 -0
- maxframe/learn/contrib/llm/text.py +21 -5
- maxframe/learn/contrib/models.py +38 -9
- maxframe/learn/contrib/utils.py +55 -0
- maxframe/learn/contrib/xgboost/callback.py +86 -0
- maxframe/learn/contrib/xgboost/classifier.py +26 -30
- maxframe/learn/contrib/xgboost/core.py +54 -42
- maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
- maxframe/learn/contrib/xgboost/predict.py +13 -8
- maxframe/learn/contrib/xgboost/regressor.py +28 -27
- maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
- maxframe/learn/contrib/xgboost/train.py +59 -16
- maxframe/learn/core.py +252 -0
- maxframe/learn/datasets/__init__.py +20 -0
- maxframe/learn/datasets/samples_generator.py +628 -0
- maxframe/learn/linear_model/__init__.py +15 -0
- maxframe/learn/linear_model/_base.py +163 -0
- maxframe/learn/linear_model/_lin_reg.py +175 -0
- maxframe/learn/metrics/__init__.py +25 -0
- maxframe/learn/metrics/_check_targets.py +95 -0
- maxframe/learn/metrics/_classification.py +1121 -0
- maxframe/learn/metrics/_regression.py +256 -0
- maxframe/learn/model_selection/__init__.py +15 -0
- maxframe/learn/model_selection/_split.py +451 -0
- maxframe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/learn/model_selection/tests/test_split.py +156 -0
- maxframe/learn/preprocessing/__init__.py +16 -0
- maxframe/learn/preprocessing/_data/__init__.py +17 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
- maxframe/learn/preprocessing/_data/normalize.py +127 -0
- maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
- maxframe/learn/preprocessing/_data/utils.py +79 -0
- maxframe/learn/preprocessing/_label/__init__.py +16 -0
- maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
- maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
- maxframe/learn/utils/__init__.py +4 -0
- maxframe/learn/utils/_encode.py +314 -0
- maxframe/learn/utils/checks.py +161 -0
- maxframe/learn/utils/core.py +33 -0
- maxframe/learn/utils/extmath.py +176 -0
- maxframe/learn/utils/multiclass.py +292 -0
- maxframe/learn/utils/shuffle.py +114 -0
- maxframe/learn/utils/sparsefuncs.py +87 -0
- maxframe/learn/utils/validation.py +775 -0
- maxframe/lib/__init__.py +0 -2
- maxframe/lib/compat.py +145 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
- maxframe/lib/sparse/__init__.py +10 -15
- maxframe/lib/sparse/array.py +45 -33
- maxframe/lib/sparse/core.py +0 -2
- maxframe/lib/sparse/linalg.py +31 -0
- maxframe/lib/sparse/matrix.py +5 -2
- maxframe/lib/sparse/tests/__init__.py +0 -2
- maxframe/lib/sparse/tests/test_sparse.py +53 -53
- maxframe/lib/sparse/vector.py +0 -2
- maxframe/mixin.py +59 -2
- maxframe/opcodes.py +13 -5
- maxframe/protocol.py +67 -14
- maxframe/remote/core.py +16 -14
- maxframe/remote/run_script.py +6 -3
- maxframe/serialization/__init__.py +2 -0
- maxframe/serialization/core.cpython-310-darwin.so +0 -0
- maxframe/serialization/core.pxd +3 -0
- maxframe/serialization/core.pyi +3 -1
- maxframe/serialization/core.pyx +82 -4
- maxframe/serialization/pandas.py +5 -1
- maxframe/serialization/serializables/core.py +6 -5
- maxframe/serialization/serializables/field.py +2 -2
- maxframe/serialization/serializables/tests/test_field_type.py +3 -5
- maxframe/serialization/tests/test_serial.py +27 -0
- maxframe/session.py +4 -71
- maxframe/sperunner.py +165 -0
- maxframe/tensor/__init__.py +35 -2
- maxframe/tensor/arithmetic/__init__.py +2 -4
- maxframe/tensor/arithmetic/abs.py +0 -2
- maxframe/tensor/arithmetic/absolute.py +0 -2
- maxframe/tensor/arithmetic/add.py +34 -4
- maxframe/tensor/arithmetic/angle.py +0 -2
- maxframe/tensor/arithmetic/arccos.py +1 -4
- maxframe/tensor/arithmetic/arccosh.py +1 -3
- maxframe/tensor/arithmetic/arcsin.py +0 -2
- maxframe/tensor/arithmetic/arcsinh.py +0 -2
- maxframe/tensor/arithmetic/arctan.py +0 -2
- maxframe/tensor/arithmetic/arctan2.py +0 -2
- maxframe/tensor/arithmetic/arctanh.py +0 -2
- maxframe/tensor/arithmetic/around.py +0 -2
- maxframe/tensor/arithmetic/bitand.py +0 -2
- maxframe/tensor/arithmetic/bitor.py +1 -3
- maxframe/tensor/arithmetic/bitxor.py +1 -3
- maxframe/tensor/arithmetic/cbrt.py +0 -2
- maxframe/tensor/arithmetic/ceil.py +0 -2
- maxframe/tensor/arithmetic/clip.py +13 -13
- maxframe/tensor/arithmetic/conj.py +0 -2
- maxframe/tensor/arithmetic/copysign.py +0 -2
- maxframe/tensor/arithmetic/core.py +47 -39
- maxframe/tensor/arithmetic/cos.py +1 -3
- maxframe/tensor/arithmetic/cosh.py +0 -2
- maxframe/tensor/arithmetic/deg2rad.py +0 -2
- maxframe/tensor/arithmetic/degrees.py +0 -2
- maxframe/tensor/arithmetic/divide.py +0 -2
- maxframe/tensor/arithmetic/equal.py +0 -2
- maxframe/tensor/arithmetic/exp.py +1 -3
- maxframe/tensor/arithmetic/exp2.py +0 -2
- maxframe/tensor/arithmetic/expm1.py +0 -2
- maxframe/tensor/arithmetic/fabs.py +0 -2
- maxframe/tensor/arithmetic/fix.py +0 -2
- maxframe/tensor/arithmetic/float_power.py +0 -2
- maxframe/tensor/arithmetic/floor.py +0 -2
- maxframe/tensor/arithmetic/floordiv.py +0 -2
- maxframe/tensor/arithmetic/fmax.py +0 -2
- maxframe/tensor/arithmetic/fmin.py +0 -2
- maxframe/tensor/arithmetic/fmod.py +0 -2
- maxframe/tensor/arithmetic/frexp.py +6 -2
- maxframe/tensor/arithmetic/greater.py +0 -2
- maxframe/tensor/arithmetic/greater_equal.py +0 -2
- maxframe/tensor/arithmetic/hypot.py +0 -2
- maxframe/tensor/arithmetic/i0.py +1 -3
- maxframe/tensor/arithmetic/imag.py +0 -2
- maxframe/tensor/arithmetic/invert.py +1 -3
- maxframe/tensor/arithmetic/isclose.py +0 -2
- maxframe/tensor/arithmetic/iscomplex.py +0 -2
- maxframe/tensor/arithmetic/isfinite.py +1 -3
- maxframe/tensor/arithmetic/isinf.py +0 -2
- maxframe/tensor/arithmetic/isnan.py +0 -2
- maxframe/tensor/arithmetic/isreal.py +0 -2
- maxframe/tensor/arithmetic/ldexp.py +0 -2
- maxframe/tensor/arithmetic/less.py +0 -2
- maxframe/tensor/arithmetic/less_equal.py +0 -2
- maxframe/tensor/arithmetic/log.py +1 -3
- maxframe/tensor/arithmetic/log10.py +1 -3
- maxframe/tensor/arithmetic/log1p.py +1 -3
- maxframe/tensor/arithmetic/log2.py +1 -3
- maxframe/tensor/arithmetic/logaddexp.py +0 -2
- maxframe/tensor/arithmetic/logaddexp2.py +0 -2
- maxframe/tensor/arithmetic/logical_and.py +0 -2
- maxframe/tensor/arithmetic/logical_not.py +1 -3
- maxframe/tensor/arithmetic/logical_or.py +0 -2
- maxframe/tensor/arithmetic/logical_xor.py +0 -2
- maxframe/tensor/arithmetic/lshift.py +0 -2
- maxframe/tensor/arithmetic/maximum.py +0 -2
- maxframe/tensor/arithmetic/minimum.py +0 -2
- maxframe/tensor/arithmetic/mod.py +0 -2
- maxframe/tensor/arithmetic/modf.py +6 -2
- maxframe/tensor/arithmetic/multiply.py +37 -4
- maxframe/tensor/arithmetic/nan_to_num.py +0 -2
- maxframe/tensor/arithmetic/negative.py +0 -2
- maxframe/tensor/arithmetic/nextafter.py +0 -2
- maxframe/tensor/arithmetic/not_equal.py +0 -2
- maxframe/tensor/arithmetic/positive.py +0 -2
- maxframe/tensor/arithmetic/power.py +0 -2
- maxframe/tensor/arithmetic/rad2deg.py +0 -2
- maxframe/tensor/arithmetic/radians.py +0 -2
- maxframe/tensor/arithmetic/real.py +0 -2
- maxframe/tensor/arithmetic/reciprocal.py +5 -3
- maxframe/tensor/arithmetic/rint.py +1 -3
- maxframe/tensor/arithmetic/rshift.py +0 -2
- maxframe/tensor/arithmetic/setimag.py +0 -2
- maxframe/tensor/arithmetic/setreal.py +0 -2
- maxframe/tensor/arithmetic/sign.py +0 -2
- maxframe/tensor/arithmetic/signbit.py +0 -2
- maxframe/tensor/arithmetic/sin.py +0 -2
- maxframe/tensor/arithmetic/sinc.py +1 -3
- maxframe/tensor/arithmetic/sinh.py +0 -2
- maxframe/tensor/arithmetic/spacing.py +0 -2
- maxframe/tensor/arithmetic/sqrt.py +0 -2
- maxframe/tensor/arithmetic/square.py +0 -2
- maxframe/tensor/arithmetic/subtract.py +4 -2
- maxframe/tensor/arithmetic/tan.py +0 -2
- maxframe/tensor/arithmetic/tanh.py +0 -2
- maxframe/tensor/arithmetic/tests/__init__.py +0 -2
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +43 -9
- maxframe/tensor/arithmetic/truediv.py +0 -2
- maxframe/tensor/arithmetic/trunc.py +0 -2
- maxframe/tensor/arithmetic/utils.py +32 -6
- maxframe/tensor/array_utils.py +3 -25
- maxframe/tensor/core.py +6 -6
- maxframe/tensor/datasource/__init__.py +10 -2
- maxframe/tensor/datasource/arange.py +0 -2
- maxframe/tensor/datasource/array.py +3 -22
- maxframe/tensor/datasource/core.py +15 -10
- maxframe/tensor/datasource/diag.py +140 -0
- maxframe/tensor/datasource/diagflat.py +69 -0
- maxframe/tensor/datasource/empty.py +0 -2
- maxframe/tensor/datasource/eye.py +95 -0
- maxframe/tensor/datasource/from_dataframe.py +0 -2
- maxframe/tensor/datasource/from_dense.py +0 -17
- maxframe/tensor/datasource/from_sparse.py +0 -2
- maxframe/tensor/datasource/full.py +0 -2
- maxframe/tensor/datasource/identity.py +54 -0
- maxframe/tensor/datasource/indices.py +115 -0
- maxframe/tensor/datasource/linspace.py +140 -0
- maxframe/tensor/datasource/meshgrid.py +135 -0
- maxframe/tensor/datasource/ones.py +8 -3
- maxframe/tensor/datasource/tests/test_datasource.py +32 -1
- maxframe/tensor/datasource/tri_array.py +107 -0
- maxframe/tensor/datasource/zeros.py +7 -3
- maxframe/tensor/extensions/__init__.py +31 -0
- maxframe/tensor/extensions/accessor.py +25 -0
- maxframe/tensor/extensions/apply_chunk.py +137 -0
- maxframe/tensor/indexing/__init__.py +1 -1
- maxframe/tensor/indexing/choose.py +8 -6
- maxframe/tensor/indexing/compress.py +0 -2
- maxframe/tensor/indexing/extract.py +0 -2
- maxframe/tensor/indexing/fill_diagonal.py +9 -6
- maxframe/tensor/indexing/flatnonzero.py +1 -3
- maxframe/tensor/indexing/getitem.py +10 -43
- maxframe/tensor/indexing/nonzero.py +2 -4
- maxframe/tensor/indexing/setitem.py +19 -9
- maxframe/tensor/indexing/slice.py +6 -3
- maxframe/tensor/indexing/take.py +0 -2
- maxframe/tensor/indexing/tests/__init__.py +0 -2
- maxframe/tensor/indexing/tests/test_indexing.py +0 -2
- maxframe/tensor/indexing/unravel_index.py +6 -6
- maxframe/tensor/lib/__init__.py +16 -0
- maxframe/tensor/lib/index_tricks.py +404 -0
- maxframe/tensor/linalg/__init__.py +36 -0
- maxframe/tensor/linalg/dot.py +145 -0
- maxframe/tensor/linalg/inner.py +36 -0
- maxframe/tensor/linalg/inv.py +83 -0
- maxframe/tensor/linalg/lu.py +115 -0
- maxframe/tensor/linalg/matmul.py +225 -0
- maxframe/tensor/linalg/qr.py +124 -0
- maxframe/tensor/linalg/solve_triangular.py +103 -0
- maxframe/tensor/linalg/svd.py +167 -0
- maxframe/tensor/linalg/tensordot.py +213 -0
- maxframe/tensor/linalg/vdot.py +73 -0
- maxframe/tensor/merge/__init__.py +4 -0
- maxframe/tensor/merge/append.py +74 -0
- maxframe/tensor/merge/column_stack.py +63 -0
- maxframe/tensor/merge/concatenate.py +3 -2
- maxframe/tensor/merge/dstack.py +71 -0
- maxframe/tensor/merge/hstack.py +70 -0
- maxframe/tensor/merge/stack.py +0 -2
- maxframe/tensor/merge/tests/test_merge.py +0 -2
- maxframe/tensor/misc/__init__.py +18 -5
- maxframe/tensor/misc/astype.py +10 -8
- maxframe/tensor/misc/broadcast_to.py +1 -1
- maxframe/tensor/misc/copy.py +64 -0
- maxframe/tensor/misc/diff.py +115 -0
- maxframe/tensor/misc/flatten.py +63 -0
- maxframe/tensor/misc/in1d.py +94 -0
- maxframe/tensor/misc/isin.py +130 -0
- maxframe/tensor/misc/ndim.py +53 -0
- maxframe/tensor/misc/ravel.py +0 -2
- maxframe/tensor/misc/repeat.py +129 -0
- maxframe/tensor/misc/searchsorted.py +147 -0
- maxframe/tensor/misc/setdiff1d.py +58 -0
- maxframe/tensor/misc/squeeze.py +117 -0
- maxframe/tensor/misc/swapaxes.py +113 -0
- maxframe/tensor/misc/tests/test_misc.py +0 -2
- maxframe/tensor/misc/transpose.py +8 -4
- maxframe/tensor/misc/trapezoid.py +123 -0
- maxframe/tensor/misc/unique.py +0 -1
- maxframe/tensor/misc/where.py +10 -8
- maxframe/tensor/operators.py +0 -34
- maxframe/tensor/random/__init__.py +3 -5
- maxframe/tensor/random/binomial.py +0 -2
- maxframe/tensor/random/bytes.py +0 -2
- maxframe/tensor/random/chisquare.py +0 -2
- maxframe/tensor/random/choice.py +9 -8
- maxframe/tensor/random/core.py +20 -5
- maxframe/tensor/random/dirichlet.py +0 -2
- maxframe/tensor/random/exponential.py +0 -2
- maxframe/tensor/random/f.py +2 -4
- maxframe/tensor/random/gamma.py +0 -2
- maxframe/tensor/random/geometric.py +0 -2
- maxframe/tensor/random/gumbel.py +0 -2
- maxframe/tensor/random/hypergeometric.py +0 -2
- maxframe/tensor/random/laplace.py +2 -4
- maxframe/tensor/random/logistic.py +0 -2
- maxframe/tensor/random/lognormal.py +0 -2
- maxframe/tensor/random/logseries.py +0 -2
- maxframe/tensor/random/multinomial.py +0 -2
- maxframe/tensor/random/multivariate_normal.py +0 -2
- maxframe/tensor/random/negative_binomial.py +0 -2
- maxframe/tensor/random/noncentral_chisquare.py +0 -2
- maxframe/tensor/random/noncentral_f.py +1 -3
- maxframe/tensor/random/normal.py +0 -2
- maxframe/tensor/random/pareto.py +0 -2
- maxframe/tensor/random/permutation.py +6 -3
- maxframe/tensor/random/poisson.py +0 -2
- maxframe/tensor/random/power.py +0 -2
- maxframe/tensor/random/rand.py +0 -2
- maxframe/tensor/random/randint.py +0 -2
- maxframe/tensor/random/randn.py +0 -2
- maxframe/tensor/random/random_integers.py +0 -2
- maxframe/tensor/random/random_sample.py +0 -2
- maxframe/tensor/random/rayleigh.py +0 -2
- maxframe/tensor/random/standard_cauchy.py +0 -2
- maxframe/tensor/random/standard_exponential.py +0 -2
- maxframe/tensor/random/standard_gamma.py +0 -2
- maxframe/tensor/random/standard_normal.py +0 -2
- maxframe/tensor/random/standard_t.py +0 -2
- maxframe/tensor/random/tests/__init__.py +0 -2
- maxframe/tensor/random/tests/test_random.py +0 -2
- maxframe/tensor/random/triangular.py +0 -2
- maxframe/tensor/random/uniform.py +0 -2
- maxframe/tensor/random/vonmises.py +0 -2
- maxframe/tensor/random/wald.py +0 -2
- maxframe/tensor/random/weibull.py +0 -2
- maxframe/tensor/random/zipf.py +0 -2
- maxframe/tensor/reduction/__init__.py +0 -2
- maxframe/tensor/reduction/all.py +0 -2
- maxframe/tensor/reduction/allclose.py +0 -2
- maxframe/tensor/reduction/any.py +0 -2
- maxframe/tensor/reduction/argmax.py +1 -3
- maxframe/tensor/reduction/argmin.py +1 -3
- maxframe/tensor/reduction/array_equal.py +0 -2
- maxframe/tensor/reduction/core.py +0 -2
- maxframe/tensor/reduction/count_nonzero.py +0 -2
- maxframe/tensor/reduction/cumprod.py +0 -2
- maxframe/tensor/reduction/cumsum.py +0 -2
- maxframe/tensor/reduction/max.py +0 -2
- maxframe/tensor/reduction/mean.py +0 -2
- maxframe/tensor/reduction/min.py +0 -2
- maxframe/tensor/reduction/nanargmax.py +0 -2
- maxframe/tensor/reduction/nanargmin.py +0 -2
- maxframe/tensor/reduction/nancumprod.py +0 -2
- maxframe/tensor/reduction/nancumsum.py +0 -2
- maxframe/tensor/reduction/nanmax.py +0 -2
- maxframe/tensor/reduction/nanmean.py +0 -2
- maxframe/tensor/reduction/nanmin.py +0 -2
- maxframe/tensor/reduction/nanprod.py +0 -2
- maxframe/tensor/reduction/nanstd.py +0 -2
- maxframe/tensor/reduction/nansum.py +0 -2
- maxframe/tensor/reduction/nanvar.py +0 -2
- maxframe/tensor/reduction/prod.py +0 -2
- maxframe/tensor/reduction/std.py +0 -2
- maxframe/tensor/reduction/sum.py +0 -2
- maxframe/tensor/reduction/tests/test_reduction.py +1 -4
- maxframe/tensor/reduction/var.py +0 -2
- maxframe/tensor/reshape/__init__.py +0 -2
- maxframe/tensor/reshape/reshape.py +6 -5
- maxframe/tensor/reshape/tests/__init__.py +0 -2
- maxframe/tensor/reshape/tests/test_reshape.py +0 -2
- maxframe/tensor/sort/__init__.py +16 -0
- maxframe/tensor/sort/argsort.py +150 -0
- maxframe/tensor/sort/sort.py +295 -0
- maxframe/tensor/special/__init__.py +37 -0
- maxframe/tensor/special/core.py +38 -0
- maxframe/tensor/special/misc.py +142 -0
- maxframe/tensor/special/statistical.py +56 -0
- maxframe/tensor/statistics/__init__.py +5 -0
- maxframe/tensor/statistics/average.py +143 -0
- maxframe/tensor/statistics/bincount.py +133 -0
- maxframe/tensor/statistics/quantile.py +10 -8
- maxframe/tensor/ufunc/__init__.py +0 -2
- maxframe/tensor/ufunc/ufunc.py +0 -2
- maxframe/tensor/utils.py +21 -3
- maxframe/tests/test_protocol.py +3 -3
- maxframe/tests/test_utils.py +210 -1
- maxframe/tests/utils.py +59 -1
- maxframe/udf.py +76 -6
- maxframe/utils.py +418 -17
- {maxframe-1.3.0.dist-info → maxframe-2.0.0.dist-info}/METADATA +5 -1
- maxframe-2.0.0.dist-info/RECORD +939 -0
- {maxframe-1.3.0.dist-info → maxframe-2.0.0.dist-info}/WHEEL +1 -1
- maxframe_client/clients/framedriver.py +19 -3
- maxframe_client/fetcher.py +113 -6
- maxframe_client/session/odps.py +173 -38
- maxframe_client/session/task.py +3 -1
- maxframe_client/tests/test_session.py +41 -5
- maxframe-1.3.0.dist-info/RECORD +0 -705
- {maxframe-1.3.0.dist-info → maxframe-2.0.0.dist-info}/top_level.txt +0 -0
|
@@ -22,6 +22,8 @@ import numpy as np
|
|
|
22
22
|
import pandas as pd
|
|
23
23
|
import pytest
|
|
24
24
|
|
|
25
|
+
from .. import PickleHookOptions
|
|
26
|
+
|
|
25
27
|
try:
|
|
26
28
|
import pyarrow as pa
|
|
27
29
|
except ImportError:
|
|
@@ -199,6 +201,10 @@ def test_pandas():
|
|
|
199
201
|
)
|
|
200
202
|
pd.testing.assert_frame_equal(val, deserialize(*serialize(val)))
|
|
201
203
|
|
|
204
|
+
# dataframe with index only
|
|
205
|
+
val = pd.DataFrame([], index=pd.RangeIndex(1000))
|
|
206
|
+
pd.testing.assert_frame_equal(val, deserialize(*serialize(val)))
|
|
207
|
+
|
|
202
208
|
val = pd.MultiIndex.from_arrays(
|
|
203
209
|
[(1, 5, 4, 9, 6), list("BADCE")], names=["C1", "C2"]
|
|
204
210
|
)
|
|
@@ -308,6 +314,27 @@ def test_pickle_container():
|
|
|
308
314
|
assert deserial2() == func_to_pk()
|
|
309
315
|
|
|
310
316
|
|
|
317
|
+
def test_pickle_hook():
|
|
318
|
+
def forbidden_unknown_type():
|
|
319
|
+
raise RuntimeError("forbidden serial/deserial untrusted module")
|
|
320
|
+
|
|
321
|
+
def func_to_pk():
|
|
322
|
+
print("hello, world")
|
|
323
|
+
return 1234
|
|
324
|
+
|
|
325
|
+
with PickleHookOptions(serial_hook=forbidden_unknown_type):
|
|
326
|
+
with pytest.raises(RuntimeError):
|
|
327
|
+
serialize(func_to_pk)
|
|
328
|
+
|
|
329
|
+
content_bytes = serialize(func_to_pk)
|
|
330
|
+
with PickleHookOptions(deserial_hook=forbidden_unknown_type):
|
|
331
|
+
with pytest.raises(RuntimeError):
|
|
332
|
+
deserialize(*content_bytes)
|
|
333
|
+
|
|
334
|
+
deser_obj = deserialize(*content_bytes)
|
|
335
|
+
assert 1234 == deser_obj()
|
|
336
|
+
|
|
337
|
+
|
|
311
338
|
def test_exceptions():
|
|
312
339
|
try:
|
|
313
340
|
raise ValueError("val")
|
maxframe/session.py
CHANGED
|
@@ -29,12 +29,11 @@ from weakref import ref
|
|
|
29
29
|
|
|
30
30
|
from odps import ODPS
|
|
31
31
|
|
|
32
|
-
from maxframe.core import TileableType
|
|
33
|
-
from maxframe.lib.aio import Isolation, get_isolation, new_isolation, stop_isolation
|
|
34
|
-
from maxframe.typing_ import ClientType
|
|
35
|
-
from maxframe.utils import classproperty, implements, relay_future
|
|
36
|
-
|
|
37
32
|
from .config import options
|
|
33
|
+
from .core import TileableType
|
|
34
|
+
from .lib.aio import Isolation, get_isolation, new_isolation, stop_isolation
|
|
35
|
+
from .typing_ import ClientType
|
|
36
|
+
from .utils import classproperty, implements, relay_future
|
|
38
37
|
|
|
39
38
|
logger = logging.getLogger(__name__)
|
|
40
39
|
|
|
@@ -315,55 +314,6 @@ class AbstractAsyncSession(AbstractSession, metaclass=ABCMeta):
|
|
|
315
314
|
web endpoint
|
|
316
315
|
"""
|
|
317
316
|
|
|
318
|
-
@abstractmethod
|
|
319
|
-
async def create_remote_object(
|
|
320
|
-
self, session_id: str, name: str, object_cls, *args, **kwargs
|
|
321
|
-
):
|
|
322
|
-
"""
|
|
323
|
-
Create remote object
|
|
324
|
-
|
|
325
|
-
Parameters
|
|
326
|
-
----------
|
|
327
|
-
session_id : str
|
|
328
|
-
Session ID.
|
|
329
|
-
name : str
|
|
330
|
-
object_cls
|
|
331
|
-
args
|
|
332
|
-
kwargs
|
|
333
|
-
|
|
334
|
-
Returns
|
|
335
|
-
-------
|
|
336
|
-
actor_ref
|
|
337
|
-
"""
|
|
338
|
-
|
|
339
|
-
@abstractmethod
|
|
340
|
-
async def get_remote_object(self, session_id: str, name: str):
|
|
341
|
-
"""
|
|
342
|
-
Get remote object.
|
|
343
|
-
|
|
344
|
-
Parameters
|
|
345
|
-
----------
|
|
346
|
-
session_id : str
|
|
347
|
-
Session ID.
|
|
348
|
-
name : str
|
|
349
|
-
|
|
350
|
-
Returns
|
|
351
|
-
-------
|
|
352
|
-
actor_ref
|
|
353
|
-
"""
|
|
354
|
-
|
|
355
|
-
@abstractmethod
|
|
356
|
-
async def destroy_remote_object(self, session_id: str, name: str):
|
|
357
|
-
"""
|
|
358
|
-
Destroy remote object.
|
|
359
|
-
|
|
360
|
-
Parameters
|
|
361
|
-
----------
|
|
362
|
-
session_id : str
|
|
363
|
-
Session ID.
|
|
364
|
-
name : str
|
|
365
|
-
"""
|
|
366
|
-
|
|
367
317
|
async def stop_server(self):
|
|
368
318
|
"""
|
|
369
319
|
Stop server.
|
|
@@ -722,23 +672,6 @@ class AsyncSession(AbstractAsyncSession):
|
|
|
722
672
|
async def get_cluster_versions(self) -> List[str]:
|
|
723
673
|
pass # pragma: no cover
|
|
724
674
|
|
|
725
|
-
@implements(AbstractAsyncSession.create_remote_object)
|
|
726
|
-
@_delegate_to_isolated_session
|
|
727
|
-
async def create_remote_object(
|
|
728
|
-
self, session_id: str, name: str, object_cls, *args, **kwargs
|
|
729
|
-
):
|
|
730
|
-
pass # pragma: no cover
|
|
731
|
-
|
|
732
|
-
@implements(AbstractAsyncSession.get_remote_object)
|
|
733
|
-
@_delegate_to_isolated_session
|
|
734
|
-
async def get_remote_object(self, session_id: str, name: str):
|
|
735
|
-
pass # pragma: no cover
|
|
736
|
-
|
|
737
|
-
@implements(AbstractAsyncSession.destroy_remote_object)
|
|
738
|
-
@_delegate_to_isolated_session
|
|
739
|
-
async def destroy_remote_object(self, session_id: str, name: str):
|
|
740
|
-
pass # pragma: no cover
|
|
741
|
-
|
|
742
675
|
@implements(AbstractAsyncSession.get_web_endpoint)
|
|
743
676
|
@_delegate_to_isolated_session
|
|
744
677
|
async def get_web_endpoint(self) -> Optional[str]:
|
maxframe/sperunner.py
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# Copyright 1999-2025 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
|
+
import time
|
|
17
|
+
from typing import Any, Dict
|
|
18
|
+
|
|
19
|
+
import pandas as pd
|
|
20
|
+
from odps import ODPS
|
|
21
|
+
|
|
22
|
+
from .codegen import CodeGenResult
|
|
23
|
+
from .codegen.spe.core import SPECodeContext
|
|
24
|
+
from .config import option_context
|
|
25
|
+
from .core import TileableGraph
|
|
26
|
+
from .lib.compat import patch_pandas
|
|
27
|
+
from .protocol import ResultInfo
|
|
28
|
+
from .typing_ import PandasObjectTypes, TileableType
|
|
29
|
+
from .utils import build_temp_table_name
|
|
30
|
+
|
|
31
|
+
logger = logging.getLogger(__name__)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class DAGCancelledError(Exception):
|
|
35
|
+
pass
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class SPEDagRunner:
|
|
39
|
+
def __init__(
|
|
40
|
+
self,
|
|
41
|
+
session_id: str,
|
|
42
|
+
subdag_id: str,
|
|
43
|
+
subdag: TileableGraph,
|
|
44
|
+
generated: CodeGenResult,
|
|
45
|
+
settings: Dict[str, Any],
|
|
46
|
+
):
|
|
47
|
+
self._session_id = session_id
|
|
48
|
+
self._subdag_id = subdag_id
|
|
49
|
+
self._subdag = subdag
|
|
50
|
+
self._key_to_tileable = {t.key: t for t in subdag}
|
|
51
|
+
self._settings = settings
|
|
52
|
+
|
|
53
|
+
with option_context(self._settings) as session_options:
|
|
54
|
+
self._sql_hints = session_options.sql.settings
|
|
55
|
+
|
|
56
|
+
self._code = generated.code
|
|
57
|
+
self._constants = generated.constants
|
|
58
|
+
self._out_key_to_vars = generated.output_key_to_variables
|
|
59
|
+
self._out_key_to_infos = generated.output_key_to_result_infos
|
|
60
|
+
self._input_key_to_vars = generated.input_key_to_variables
|
|
61
|
+
self._mark_cancelled = False
|
|
62
|
+
self._odps = ODPS.from_environments()
|
|
63
|
+
|
|
64
|
+
def _get_sql_hints(self) -> Dict[str, str]:
|
|
65
|
+
hints = self._sql_hints.copy()
|
|
66
|
+
hints["odps.sql.type.system.odps2"] = True
|
|
67
|
+
return hints
|
|
68
|
+
|
|
69
|
+
@staticmethod
|
|
70
|
+
def _pre_process_pandas_data(data: PandasObjectTypes) -> PandasObjectTypes:
|
|
71
|
+
"""
|
|
72
|
+
Sort the pandas dataset first to make sure all the tensor can process the
|
|
73
|
+
records in the same order.
|
|
74
|
+
"""
|
|
75
|
+
if isinstance(data, (pd.DataFrame, pd.Series)):
|
|
76
|
+
data.sort_index(
|
|
77
|
+
axis=0,
|
|
78
|
+
ascending=True,
|
|
79
|
+
kind="quicksort",
|
|
80
|
+
inplace=True,
|
|
81
|
+
na_position="last",
|
|
82
|
+
)
|
|
83
|
+
elif isinstance(data, pd.Index):
|
|
84
|
+
data.sort_values(return_indexer=False, ascending=True, na_position="last")
|
|
85
|
+
return data
|
|
86
|
+
|
|
87
|
+
def fetch_data_by_tileable(self, t: TileableType) -> Any:
|
|
88
|
+
raise NotImplementedError
|
|
89
|
+
|
|
90
|
+
def store_data(self, key: str, value: Any) -> ResultInfo:
|
|
91
|
+
raise NotImplementedError
|
|
92
|
+
|
|
93
|
+
def run(self) -> Dict[str, ResultInfo]:
|
|
94
|
+
# make forward compatibility of new pandas methods
|
|
95
|
+
patch_pandas()
|
|
96
|
+
|
|
97
|
+
local_vars = self._constants
|
|
98
|
+
local_vars[SPECodeContext.logger_var] = logger
|
|
99
|
+
start_timestamp = time.time()
|
|
100
|
+
try:
|
|
101
|
+
# Fetch data
|
|
102
|
+
start_time = time.time()
|
|
103
|
+
for key, var_name in self._input_key_to_vars.items():
|
|
104
|
+
local_vars[var_name] = self.fetch_data_by_tileable(
|
|
105
|
+
self._key_to_tileable[key]
|
|
106
|
+
)
|
|
107
|
+
logger.info(
|
|
108
|
+
"[%s][%s] fetch data costs: %.3f",
|
|
109
|
+
self._session_id,
|
|
110
|
+
self._subdag_id,
|
|
111
|
+
time.time() - start_time,
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
# Execute Python codes
|
|
115
|
+
start_time = time.time()
|
|
116
|
+
logger.info("Generated codes:\n--------\n%s\n--------", self._code)
|
|
117
|
+
exec(self._code, globals(), local_vars)
|
|
118
|
+
logger.info(
|
|
119
|
+
"[%s][%s] execute costs: %.3f",
|
|
120
|
+
self._session_id,
|
|
121
|
+
self._subdag_id,
|
|
122
|
+
time.time() - start_time,
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
# Store data
|
|
126
|
+
start_time = time.time()
|
|
127
|
+
result_dict = dict()
|
|
128
|
+
for key, var_name in self._out_key_to_vars.items():
|
|
129
|
+
result_dict[key] = self.store_data(key, local_vars[var_name])
|
|
130
|
+
logger.info(
|
|
131
|
+
"[%s][%s] store data costs: %.3f",
|
|
132
|
+
self._session_id,
|
|
133
|
+
self._subdag_id,
|
|
134
|
+
time.time() - start_time,
|
|
135
|
+
)
|
|
136
|
+
return result_dict
|
|
137
|
+
except Exception as ex:
|
|
138
|
+
local_vars.clear()
|
|
139
|
+
if (
|
|
140
|
+
not isinstance(ex, RuntimeError)
|
|
141
|
+
or not ex.args
|
|
142
|
+
or ex.args[0] != "CANCELLED"
|
|
143
|
+
):
|
|
144
|
+
raise
|
|
145
|
+
|
|
146
|
+
drop_statements = [
|
|
147
|
+
f"DROP TABLE IF EXISTS {build_temp_table_name(self._session_id, key)};"
|
|
148
|
+
for key in self._out_key_to_vars.keys()
|
|
149
|
+
]
|
|
150
|
+
if drop_statements: # pragma: no branch
|
|
151
|
+
self._odps.run_sql(
|
|
152
|
+
"\n".join(drop_statements), hints=self._get_sql_hints()
|
|
153
|
+
)
|
|
154
|
+
raise DAGCancelledError from None
|
|
155
|
+
finally:
|
|
156
|
+
logger.info(
|
|
157
|
+
"[%s][%s] run costs: %.3f",
|
|
158
|
+
self._session_id,
|
|
159
|
+
self._subdag_id,
|
|
160
|
+
time.time() - start_timestamp,
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
def mark_cancel(self):
|
|
164
|
+
self._constants["running"] = False
|
|
165
|
+
self._mark_cancelled = True
|
maxframe/tensor/__init__.py
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from . import fetch, random
|
|
15
|
+
from . import extensions, fetch, linalg, random, special, statistics
|
|
16
16
|
from .arithmetic import absolute
|
|
17
17
|
from .arithmetic import absolute as abs
|
|
18
18
|
from .arithmetic import (
|
|
@@ -121,16 +121,26 @@ from .datasource import (
|
|
|
121
121
|
asarray,
|
|
122
122
|
ascontiguousarray,
|
|
123
123
|
asfortranarray,
|
|
124
|
+
diag,
|
|
125
|
+
diagflat,
|
|
124
126
|
empty,
|
|
125
127
|
empty_like,
|
|
128
|
+
eye,
|
|
126
129
|
from_dataframe,
|
|
127
130
|
full,
|
|
128
131
|
full_like,
|
|
132
|
+
identity,
|
|
133
|
+
indices,
|
|
134
|
+
linspace,
|
|
135
|
+
meshgrid,
|
|
129
136
|
ones,
|
|
130
137
|
ones_like,
|
|
131
138
|
scalar,
|
|
132
139
|
tensor,
|
|
140
|
+
tril,
|
|
141
|
+
triu,
|
|
133
142
|
zeros,
|
|
143
|
+
zeros_like,
|
|
134
144
|
)
|
|
135
145
|
from .indexing import (
|
|
136
146
|
choose,
|
|
@@ -142,13 +152,31 @@ from .indexing import (
|
|
|
142
152
|
take,
|
|
143
153
|
unravel_index,
|
|
144
154
|
)
|
|
145
|
-
from .
|
|
155
|
+
from .linalg.dot import dot
|
|
156
|
+
from .linalg.inner import inner, innerproduct
|
|
157
|
+
from .linalg.matmul import matmul
|
|
158
|
+
from .linalg.tensordot import tensordot
|
|
159
|
+
from .linalg.vdot import vdot
|
|
160
|
+
from .merge import append, column_stack, concatenate, dstack, hstack, stack, vstack
|
|
146
161
|
from .misc import (
|
|
162
|
+
astype,
|
|
147
163
|
atleast_1d,
|
|
148
164
|
atleast_2d,
|
|
149
165
|
atleast_3d,
|
|
150
166
|
broadcast_to,
|
|
167
|
+
copy,
|
|
168
|
+
diff,
|
|
169
|
+
in1d,
|
|
170
|
+
isin,
|
|
171
|
+
ndim,
|
|
172
|
+
ravel,
|
|
173
|
+
repeat,
|
|
174
|
+
searchsorted,
|
|
175
|
+
setdiff1d,
|
|
176
|
+
squeeze,
|
|
177
|
+
swapaxes,
|
|
151
178
|
transpose,
|
|
179
|
+
trapezoid,
|
|
152
180
|
unique,
|
|
153
181
|
where,
|
|
154
182
|
)
|
|
@@ -186,9 +214,14 @@ from .reduction import prod
|
|
|
186
214
|
from .reduction import prod as product
|
|
187
215
|
from .reduction import std, sum, var
|
|
188
216
|
from .reshape import reshape
|
|
217
|
+
from .sort import argsort, sort
|
|
218
|
+
from .statistics import average, bincount, percentile, quantile
|
|
189
219
|
from .ufunc import ufunc
|
|
190
220
|
|
|
191
221
|
# isort: off
|
|
222
|
+
# noinspection PyUnresolvedReferences
|
|
223
|
+
from .lib.index_tricks import mgrid, ogrid, ndindex, r_, c_
|
|
224
|
+
|
|
192
225
|
# noinspection PyUnresolvedReferences
|
|
193
226
|
from numpy import (
|
|
194
227
|
e,
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -17,7 +15,7 @@
|
|
|
17
15
|
from ...core import is_build_mode
|
|
18
16
|
from .abs import TensorAbs, abs
|
|
19
17
|
from .absolute import TensorAbsolute, absolute
|
|
20
|
-
from .add import TensorAdd, add
|
|
18
|
+
from .add import TensorAdd, TensorTreeAdd, add, tree_add
|
|
21
19
|
from .angle import TensorAngle, angle
|
|
22
20
|
from .arccos import TensorArccos, arccos
|
|
23
21
|
from .arccosh import TensorArccosh, arccosh
|
|
@@ -89,7 +87,7 @@ from .mod import TensorMod
|
|
|
89
87
|
from .mod import mod
|
|
90
88
|
from .mod import mod as remainder
|
|
91
89
|
from .modf import TensorModf, modf
|
|
92
|
-
from .multiply import TensorMultiply, multiply
|
|
90
|
+
from .multiply import TensorMultiply, TensorTreeMultiply, multiply, tree_multiply
|
|
93
91
|
from .nan_to_num import TensorNanToNum, nan_to_num
|
|
94
92
|
from .negative import TensorNegative, negative
|
|
95
93
|
from .nextafter import TensorNextafter, nextafter
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -14,12 +12,16 @@
|
|
|
14
12
|
# See the License for the specific language governing permissions and
|
|
15
13
|
# limitations under the License.
|
|
16
14
|
|
|
15
|
+
import functools
|
|
16
|
+
|
|
17
17
|
import numpy as np
|
|
18
18
|
|
|
19
19
|
from ... import opcodes
|
|
20
|
+
from ...serialization.serializables import BoolField
|
|
21
|
+
from ..datasource import scalar
|
|
20
22
|
from ..utils import infer_dtype
|
|
21
|
-
from .core import TensorBinOp
|
|
22
|
-
from .utils import arithmetic_operator
|
|
23
|
+
from .core import TensorBinOp, TensorMultiOp
|
|
24
|
+
from .utils import TreeReductionBuilder, arithmetic_operator
|
|
23
25
|
|
|
24
26
|
|
|
25
27
|
@arithmetic_operator(sparse_mode="binary_and")
|
|
@@ -27,6 +29,10 @@ class TensorAdd(TensorBinOp):
|
|
|
27
29
|
_op_type_ = opcodes.ADD
|
|
28
30
|
_func_name = "add"
|
|
29
31
|
|
|
32
|
+
@classmethod
|
|
33
|
+
def _is_sparse_with_scalar(cls, scalar_val, lhs):
|
|
34
|
+
return isinstance(scalar_val, (int, float)) and scalar_val == 0
|
|
35
|
+
|
|
30
36
|
|
|
31
37
|
@infer_dtype(np.add)
|
|
32
38
|
def add(x1, x2, out=None, where=None, **kwargs):
|
|
@@ -80,3 +86,27 @@ def add(x1, x2, out=None, where=None, **kwargs):
|
|
|
80
86
|
def radd(x1, x2, **kwargs):
|
|
81
87
|
op = TensorAdd(**kwargs)
|
|
82
88
|
return op.rcall(x1, x2)
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
class TensorTreeAdd(TensorMultiOp):
|
|
92
|
+
_op_type_ = opcodes.TREE_ADD
|
|
93
|
+
_func_name = "add"
|
|
94
|
+
|
|
95
|
+
ignore_empty_input = BoolField("ignore_empty_input", default=False)
|
|
96
|
+
|
|
97
|
+
@classmethod
|
|
98
|
+
def _is_sparse(cls, *args):
|
|
99
|
+
if args and all(hasattr(x, "issparse") and x.issparse() for x in args):
|
|
100
|
+
return True
|
|
101
|
+
return False
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
@infer_dtype(lambda *args: functools.reduce(np.add, args))
|
|
105
|
+
def tree_add(*args, combine_size=None, **kwargs):
|
|
106
|
+
class MultiplyBuilder(TreeReductionBuilder):
|
|
107
|
+
def _build_reduction(self, inputs, final=False):
|
|
108
|
+
op = TensorTreeAdd(args=inputs, **kwargs)
|
|
109
|
+
return op(*inputs)
|
|
110
|
+
|
|
111
|
+
args = [scalar(a) if np.isscalar(a) else a for a in args]
|
|
112
|
+
return MultiplyBuilder(combine_size).build(args)
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -22,10 +20,9 @@ from .core import TensorUnaryOp
|
|
|
22
20
|
from .utils import arithmetic_operator
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
@arithmetic_operator(sparse_mode="
|
|
23
|
+
@arithmetic_operator(sparse_mode="always_false")
|
|
26
24
|
class TensorArccos(TensorUnaryOp):
|
|
27
25
|
_op_type_ = opcodes.ARCCOS
|
|
28
|
-
|
|
29
26
|
_func_name = "arccos"
|
|
30
27
|
|
|
31
28
|
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -22,7 +20,7 @@ from .core import TensorUnaryOp
|
|
|
22
20
|
from .utils import arithmetic_operator
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
@arithmetic_operator(sparse_mode="
|
|
23
|
+
@arithmetic_operator(sparse_mode="always_false")
|
|
26
24
|
class TensorArccosh(TensorUnaryOp):
|
|
27
25
|
_op_type_ = opcodes.ARCCOSH
|
|
28
26
|
_func_name = "arccosh"
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -22,7 +20,7 @@ from .core import TensorBinOp
|
|
|
22
20
|
from .utils import arithmetic_operator
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
@arithmetic_operator(sparse_mode="
|
|
23
|
+
@arithmetic_operator(sparse_mode="binary_and")
|
|
26
24
|
class TensorBitor(TensorBinOp):
|
|
27
25
|
_op_type_ = opcodes.BITOR
|
|
28
26
|
_func_name = "bitwise_or"
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -22,7 +20,7 @@ from .core import TensorBinOp
|
|
|
22
20
|
from .utils import arithmetic_operator
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
@arithmetic_operator(sparse_mode="
|
|
23
|
+
@arithmetic_operator(sparse_mode="binary_and")
|
|
26
24
|
class TensorBitxor(TensorBinOp):
|
|
27
25
|
_op_type_ = opcodes.BITXOR
|
|
28
26
|
_func_name = "bitwise_xor"
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
#!/usr/bin/env python
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
4
2
|
#
|
|
5
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -15,11 +13,12 @@
|
|
|
15
13
|
# limitations under the License.
|
|
16
14
|
|
|
17
15
|
from numbers import Number
|
|
16
|
+
from typing import List
|
|
18
17
|
|
|
19
18
|
import numpy as np
|
|
20
19
|
|
|
21
20
|
from ... import opcodes
|
|
22
|
-
from ...core import ENTITY_TYPE
|
|
21
|
+
from ...core import ENTITY_TYPE, EntityData
|
|
23
22
|
from ...serialization.serializables import AnyField, KeyField
|
|
24
23
|
from ..core import Tensor
|
|
25
24
|
from ..datasource import tensor as astensor
|
|
@@ -35,16 +34,17 @@ class TensorClip(TensorOperator, TensorElementWise):
|
|
|
35
34
|
a_max = AnyField("a_max", default=None)
|
|
36
35
|
out = KeyField("out", default=None)
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
37
|
+
@classmethod
|
|
38
|
+
def _set_inputs(cls, op: "TensorClip", inputs: List[EntityData]):
|
|
39
|
+
super()._set_inputs(op, inputs)
|
|
40
|
+
inputs_iter = iter(op._inputs)
|
|
41
|
+
op.a = next(inputs_iter)
|
|
42
|
+
if isinstance(op.a_min, ENTITY_TYPE):
|
|
43
|
+
op.a_min = next(inputs_iter)
|
|
44
|
+
if isinstance(op.a_max, ENTITY_TYPE):
|
|
45
|
+
op.a_max = next(inputs_iter)
|
|
46
|
+
if getattr(op, "_out", None) is not None:
|
|
47
|
+
op.out = next(inputs_iter)
|
|
48
48
|
|
|
49
49
|
def __call__(self, a, a_min, a_max, out=None):
|
|
50
50
|
a = astensor(a)
|