maxframe 1.3.1__cp37-cp37m-win_amd64.whl → 2.0.0__cp37-cp37m-win_amd64.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.cp37-win_amd64.pyd +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.cp37-win_amd64.pyd +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 +9 -8
- 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 +65 -3
- maxframe/dataframe/reduction/core.py +3 -1
- 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/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 +16 -9
- 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.cp37-win_amd64.pyd +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.cp37-win_amd64.pyd +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.1.dist-info → maxframe-2.0.0.dist-info}/METADATA +4 -1
- maxframe-2.0.0.dist-info/RECORD +939 -0
- 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.1.dist-info/RECORD +0 -705
- {maxframe-1.3.1.dist-info → maxframe-2.0.0.dist-info}/WHEEL +0 -0
- {maxframe-1.3.1.dist-info → maxframe-2.0.0.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,141 @@
|
|
|
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 base64
|
|
16
|
+
import hashlib
|
|
17
|
+
import textwrap
|
|
18
|
+
|
|
19
|
+
import pytest
|
|
20
|
+
|
|
21
|
+
from .... import dataframe as md
|
|
22
|
+
from .... import tensor as mt
|
|
23
|
+
from ....dataframe.utils import bind_func_args_from_pos
|
|
24
|
+
from ....lib import wrapped_pickle as pickle
|
|
25
|
+
from ..core import SPECodeGenerator
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@pytest.fixture
|
|
29
|
+
def codegen():
|
|
30
|
+
return SPECodeGenerator("session_1")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_simple_codegen(codegen):
|
|
34
|
+
df = md.DataFrame(mt.random.rand(1000, 5), columns=list("ABCDE"))
|
|
35
|
+
df["F"] = df["A"] + df["B"]
|
|
36
|
+
df["G"] = df["C"] * 2 + df["D"]
|
|
37
|
+
result = df.cumsum()
|
|
38
|
+
dag = result.build_graph()
|
|
39
|
+
generated = codegen.generate(dag)
|
|
40
|
+
|
|
41
|
+
local_vars = generated.constants.copy()
|
|
42
|
+
exec(generated.code, {}, local_vars)
|
|
43
|
+
df_result = local_vars[generated.output_key_to_variables[result.key]]
|
|
44
|
+
assert len(df_result.columns) == 7
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_codegen_with_udf(codegen):
|
|
48
|
+
df = md.DataFrame(mt.random.rand(1, 3), columns=list("ABC"))
|
|
49
|
+
|
|
50
|
+
def f1(x) -> int:
|
|
51
|
+
return x + 1
|
|
52
|
+
|
|
53
|
+
def f2(x) -> int:
|
|
54
|
+
return x - 1
|
|
55
|
+
|
|
56
|
+
result = df.transform({"A": f1, "B": [f1, f2]})
|
|
57
|
+
dag = result.build_graph()
|
|
58
|
+
generated = codegen.generate(dag)
|
|
59
|
+
|
|
60
|
+
udf_1_body = base64.b64encode(pickle.dumps(f1, protocol=pickle.DEFAULT_PROTOCOL))
|
|
61
|
+
udf_2_body = base64.b64encode(pickle.dumps(f2, protocol=pickle.DEFAULT_PROTOCOL))
|
|
62
|
+
udf_1_value = (
|
|
63
|
+
f"pickled_data = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
|
|
64
|
+
)
|
|
65
|
+
udf_2_value = (
|
|
66
|
+
f"pickled_data = cloudpickle.loads(base64.b64decode({udf_2_body}), buffers=[])"
|
|
67
|
+
)
|
|
68
|
+
udf_1 = f"user_udf_f1_{hashlib.md5(udf_1_value.encode('utf-8')).hexdigest()}"
|
|
69
|
+
udf_2 = f"user_udf_f2_{hashlib.md5(udf_2_value.encode('utf-8')).hexdigest()}"
|
|
70
|
+
|
|
71
|
+
expected_contents = f"""
|
|
72
|
+
import numpy as np
|
|
73
|
+
import pandas as pd
|
|
74
|
+
import base64
|
|
75
|
+
import cloudpickle
|
|
76
|
+
{udf_1_value}
|
|
77
|
+
{udf_1} = pickled_data
|
|
78
|
+
{udf_2_value}
|
|
79
|
+
{udf_2} = pickled_data
|
|
80
|
+
if not running:
|
|
81
|
+
raise RuntimeError('CANCELLED')
|
|
82
|
+
var_0 = np.random.rand(1, 3)
|
|
83
|
+
|
|
84
|
+
if not running:
|
|
85
|
+
raise RuntimeError('CANCELLED')
|
|
86
|
+
var_1 = pd.DataFrame(var_0, index=const_0, columns=['A', 'B', 'C'])
|
|
87
|
+
|
|
88
|
+
del var_0
|
|
89
|
+
if not running:
|
|
90
|
+
raise RuntimeError('CANCELLED')
|
|
91
|
+
var_2 = var_1.transform({{'A': {udf_1}, 'B': [{udf_1}, {udf_2}]}}, axis=0)
|
|
92
|
+
|
|
93
|
+
del var_1
|
|
94
|
+
"""
|
|
95
|
+
assert generated.code == textwrap.dedent(expected_contents).strip()
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_codegen_with_udf_and_args(codegen):
|
|
99
|
+
df = md.DataFrame(mt.random.rand(1, 3), columns=list("ABC"))
|
|
100
|
+
|
|
101
|
+
def f1(x, y, a, b) -> int:
|
|
102
|
+
return x + y + a + b
|
|
103
|
+
|
|
104
|
+
result = df.transform({"A": f1}, 0, 2, a=3, b=4)
|
|
105
|
+
dag = result.build_graph()
|
|
106
|
+
generated = codegen.generate(dag)
|
|
107
|
+
|
|
108
|
+
udf_1_body = base64.b64encode(
|
|
109
|
+
pickle.dumps(
|
|
110
|
+
bind_func_args_from_pos(f1, 1, 2, a=3, b=4),
|
|
111
|
+
protocol=pickle.DEFAULT_PROTOCOL,
|
|
112
|
+
)
|
|
113
|
+
)
|
|
114
|
+
udf_1_value = (
|
|
115
|
+
f"pickled_data = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
|
|
116
|
+
)
|
|
117
|
+
udf_1 = f"user_udf_f1_{hashlib.md5(udf_1_value.encode('utf-8')).hexdigest()}"
|
|
118
|
+
|
|
119
|
+
expected_contents = f"""
|
|
120
|
+
import numpy as np
|
|
121
|
+
import pandas as pd
|
|
122
|
+
import base64
|
|
123
|
+
import cloudpickle
|
|
124
|
+
{udf_1_value}
|
|
125
|
+
{udf_1} = pickled_data
|
|
126
|
+
if not running:
|
|
127
|
+
raise RuntimeError('CANCELLED')
|
|
128
|
+
var_0 = np.random.rand(1, 3)
|
|
129
|
+
|
|
130
|
+
if not running:
|
|
131
|
+
raise RuntimeError('CANCELLED')
|
|
132
|
+
var_1 = pd.DataFrame(var_0, index=const_0, columns=['A', 'B', 'C'])
|
|
133
|
+
|
|
134
|
+
del var_0
|
|
135
|
+
if not running:
|
|
136
|
+
raise RuntimeError('CANCELLED')
|
|
137
|
+
var_2 = var_1.transform({{'A': {udf_1}}}, axis=0)
|
|
138
|
+
|
|
139
|
+
del var_1
|
|
140
|
+
"""
|
|
141
|
+
assert generated.code == textwrap.dedent(expected_contents).strip()
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
from typing import List, Type
|
|
16
|
+
|
|
17
|
+
from ...typing_ import OperatorType
|
|
18
|
+
from .core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
|
|
19
|
+
|
|
20
|
+
_import_aliases = {
|
|
21
|
+
"np": "numpy",
|
|
22
|
+
"npl": "numpy.linalg",
|
|
23
|
+
"pd": "pandas",
|
|
24
|
+
"spl": "scipy.linalg",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def build_method_call_adapter(
|
|
29
|
+
op_cls: Type[OperatorType],
|
|
30
|
+
method_name: str,
|
|
31
|
+
*call_args,
|
|
32
|
+
skip_none: bool = True,
|
|
33
|
+
source_module: str = None,
|
|
34
|
+
**call_kwargs,
|
|
35
|
+
) -> Type[SPEOperatorAdapter]:
|
|
36
|
+
class MethodCallAdapter(SPEOperatorAdapter):
|
|
37
|
+
def generate_code(self, op: OperatorType, context: SPECodeContext) -> List[str]:
|
|
38
|
+
if source_module in _import_aliases:
|
|
39
|
+
context.register_import(_import_aliases[source_module], source_module)
|
|
40
|
+
|
|
41
|
+
input_var_name = source_module or context.get_input_tileable_variable(
|
|
42
|
+
op.inputs[0]
|
|
43
|
+
)
|
|
44
|
+
res_var_names = [
|
|
45
|
+
context.get_output_tileable_variable(out) for out in op.outputs
|
|
46
|
+
]
|
|
47
|
+
args_str = self.generate_call_args_with_attributes(
|
|
48
|
+
op, context, *call_args, skip_none=skip_none, **call_kwargs
|
|
49
|
+
)
|
|
50
|
+
res_var_names_str = ", ".join(res_var_names)
|
|
51
|
+
return [f"{res_var_names_str} = {input_var_name}.{method_name}({args_str})"]
|
|
52
|
+
|
|
53
|
+
MethodCallAdapter.__name__ = op_cls.__name__ + "Adapter"
|
|
54
|
+
return register_op_adapter(op_cls)(MethodCallAdapter)
|
|
@@ -0,0 +1,13 @@
|
|
|
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.
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
1
|
# Copyright 1999-2025 Alibaba Group Holding Ltd.
|
|
3
2
|
#
|
|
4
3
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
@@ -16,12 +15,11 @@
|
|
|
16
15
|
import base64
|
|
17
16
|
from typing import List, Tuple
|
|
18
17
|
|
|
19
|
-
# 使用pytest生成单元测试
|
|
20
18
|
import pytest
|
|
21
19
|
|
|
22
|
-
from
|
|
23
|
-
from
|
|
24
|
-
from
|
|
20
|
+
from ...lib import wrapped_pickle
|
|
21
|
+
from ...serialization.core import PickleContainer
|
|
22
|
+
from ..core import UserCodeMixin
|
|
25
23
|
|
|
26
24
|
|
|
27
25
|
@pytest.mark.parametrize(
|
maxframe/config/__init__.py
CHANGED
maxframe/config/config.py
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
import contextlib
|
|
16
16
|
import contextvars
|
|
17
|
+
import os
|
|
17
18
|
import traceback
|
|
18
19
|
import warnings
|
|
19
20
|
from copy import deepcopy
|
|
@@ -28,14 +29,14 @@ except ImportError:
|
|
|
28
29
|
|
|
29
30
|
available_timezones = lambda: all_timezones
|
|
30
31
|
|
|
31
|
-
import logging
|
|
32
|
-
|
|
33
32
|
from ..utils import get_python_tag
|
|
34
33
|
from .validators import (
|
|
35
34
|
ValidatorType,
|
|
36
35
|
all_validator,
|
|
36
|
+
is_all_dict_keys_in,
|
|
37
37
|
is_bool,
|
|
38
38
|
is_dict,
|
|
39
|
+
is_float,
|
|
39
40
|
is_in,
|
|
40
41
|
is_integer,
|
|
41
42
|
is_non_negative_integer,
|
|
@@ -45,11 +46,11 @@ from .validators import (
|
|
|
45
46
|
is_valid_cache_path,
|
|
46
47
|
)
|
|
47
48
|
|
|
48
|
-
logger = logging.getLogger(__name__)
|
|
49
|
-
|
|
50
49
|
_DEFAULT_REDIRECT_WARN = "Option {source} has been replaced by {target} and might be removed in a future release."
|
|
51
50
|
_DEFAULT_MAX_ALIVE_SECONDS = 3 * 24 * 3600
|
|
52
51
|
_DEFAULT_MAX_IDLE_SECONDS = 3600
|
|
52
|
+
_DEFAULT_RETRY_DELAY = 0.1
|
|
53
|
+
_DEFAULT_RETRY_TIMES = 4
|
|
53
54
|
_DEFAULT_SPE_OPERATION_TIMEOUT_SECONDS = 120
|
|
54
55
|
_DEFAULT_SPE_FAILURE_RETRY_TIMES = 5
|
|
55
56
|
_DEFAULT_UPLOAD_BATCH_SIZE = 4096
|
|
@@ -57,6 +58,7 @@ _DEFAULT_TEMP_LIFECYCLE = 1
|
|
|
57
58
|
_DEFAULT_TASK_START_TIMEOUT = 60
|
|
58
59
|
_DEFAULT_TASK_RESTART_TIMEOUT = 300
|
|
59
60
|
_DEFAULT_LOGVIEW_HOURS = 24 * 30
|
|
61
|
+
_DEFAULT_FUNCTION_RUNNING_OPTIONS = {"cpu": 1, "memory": "4GiB", "gpu": 0}
|
|
60
62
|
|
|
61
63
|
|
|
62
64
|
class OptionError(Exception):
|
|
@@ -321,6 +323,12 @@ def _get_legal_local_tz_name() -> Optional[str]:
|
|
|
321
323
|
|
|
322
324
|
|
|
323
325
|
default_options = Config()
|
|
326
|
+
default_options.register_option(
|
|
327
|
+
"retry_times", _DEFAULT_RETRY_TIMES, validator=is_integer
|
|
328
|
+
)
|
|
329
|
+
default_options.register_option(
|
|
330
|
+
"retry_delay", _DEFAULT_RETRY_DELAY, validator=is_integer | is_float
|
|
331
|
+
)
|
|
324
332
|
default_options.register_option(
|
|
325
333
|
"execution_mode", "trigger", validator=is_in(["trigger", "eager"])
|
|
326
334
|
)
|
|
@@ -368,6 +376,14 @@ default_options.register_option(
|
|
|
368
376
|
default_options.register_option(
|
|
369
377
|
"chunk_size", None, validator=is_null | is_integer, remote=True
|
|
370
378
|
)
|
|
379
|
+
default_options.register_option(
|
|
380
|
+
"chunk_store_limit", 128 * 1024**2, validator=is_numeric
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
default_options.register_option("local_execution.enabled", False, validator=is_bool)
|
|
384
|
+
default_options.register_option(
|
|
385
|
+
"local_execution.size_limit", 5 * 1024**2, validator=is_integer
|
|
386
|
+
)
|
|
371
387
|
|
|
372
388
|
default_options.register_option(
|
|
373
389
|
"session.max_alive_seconds",
|
|
@@ -425,6 +441,9 @@ default_options.register_option(
|
|
|
425
441
|
validator=is_null | is_integer,
|
|
426
442
|
remote=True,
|
|
427
443
|
)
|
|
444
|
+
default_options.register_option(
|
|
445
|
+
"session.client_version", None, validator=is_null | is_string, remote=True
|
|
446
|
+
)
|
|
428
447
|
|
|
429
448
|
default_options.register_option("warn_duplicated_execution", False, validator=is_bool)
|
|
430
449
|
default_options.register_option("dataframe.use_arrow_dtype", True, validator=is_bool)
|
|
@@ -439,6 +458,23 @@ default_options.register_option(
|
|
|
439
458
|
"dag.settings", value=dict(), validator=is_dict, remote=True
|
|
440
459
|
)
|
|
441
460
|
|
|
461
|
+
default_options.register_option(
|
|
462
|
+
"function.default_running_options",
|
|
463
|
+
_DEFAULT_FUNCTION_RUNNING_OPTIONS,
|
|
464
|
+
validator=is_dict | is_all_dict_keys_in("cpu", "memory", "gpu"),
|
|
465
|
+
)
|
|
466
|
+
|
|
467
|
+
################
|
|
468
|
+
# DPE Settings #
|
|
469
|
+
################
|
|
470
|
+
default_options.register_option("dpe.settings", dict(), validator=is_dict, remote=True)
|
|
471
|
+
default_options.register_option(
|
|
472
|
+
"dpe.task.settings", dict(), validator=is_dict, remote=True
|
|
473
|
+
)
|
|
474
|
+
default_options.register_option(
|
|
475
|
+
"dpe.reduction.combine_size", 4, validator=is_integer, remote=True
|
|
476
|
+
)
|
|
477
|
+
|
|
442
478
|
################
|
|
443
479
|
# SPE Settings #
|
|
444
480
|
################
|
|
@@ -463,6 +499,16 @@ default_options.register_option(
|
|
|
463
499
|
"pythonpack.task.settings", {}, validator=is_dict, remote=True
|
|
464
500
|
)
|
|
465
501
|
|
|
502
|
+
##################
|
|
503
|
+
# Learn settings #
|
|
504
|
+
##################
|
|
505
|
+
assume_finite = os.environ.get("SKLEARN_ASSUME_FINITE")
|
|
506
|
+
if assume_finite is not None:
|
|
507
|
+
assume_finite = bool(assume_finite)
|
|
508
|
+
default_options.register_option(
|
|
509
|
+
"learn.assume_finite", assume_finite, validator=is_null | is_bool
|
|
510
|
+
)
|
|
511
|
+
|
|
466
512
|
_options_ctx_var = contextvars.ContextVar("_options_ctx_var")
|
|
467
513
|
|
|
468
514
|
|
|
@@ -518,22 +564,3 @@ class OptionsProxy:
|
|
|
518
564
|
|
|
519
565
|
|
|
520
566
|
options = OptionsProxy()
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
def update_wlm_quota_settings(session_id: str, engine_settings: Dict[str, Any]):
|
|
524
|
-
engine_quota = engine_settings.get("odps.task.wlm.quota", None)
|
|
525
|
-
session_quota = options.session.quota_name or None
|
|
526
|
-
if engine_quota != session_quota and engine_quota:
|
|
527
|
-
logger.warning(
|
|
528
|
-
"[Session=%s] Session quota (%s) is different to SubDag engine quota (%s)",
|
|
529
|
-
session_id,
|
|
530
|
-
session_quota,
|
|
531
|
-
engine_quota,
|
|
532
|
-
)
|
|
533
|
-
# TODO(renxiang): overwrite or not overwrite
|
|
534
|
-
return
|
|
535
|
-
|
|
536
|
-
if session_quota:
|
|
537
|
-
engine_settings["odps.task.wlm.quota"] = session_quota
|
|
538
|
-
elif "odps.task.wlm.quota" in engine_settings:
|
|
539
|
-
engine_settings.pop("odps.task.wlm.quota")
|
|
@@ -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");
|
|
@@ -18,14 +16,8 @@ import threading
|
|
|
18
16
|
|
|
19
17
|
import pytest
|
|
20
18
|
|
|
21
|
-
from
|
|
22
|
-
|
|
23
|
-
is_integer,
|
|
24
|
-
is_string,
|
|
25
|
-
option_context,
|
|
26
|
-
options,
|
|
27
|
-
update_wlm_quota_settings,
|
|
28
|
-
)
|
|
19
|
+
from ...utils import update_wlm_quota_settings
|
|
20
|
+
from ..config import Config, is_integer, is_string, option_context, options
|
|
29
21
|
|
|
30
22
|
|
|
31
23
|
def test_config_context():
|
|
@@ -117,6 +109,6 @@ def test_update_wlm_quota_settings():
|
|
|
117
109
|
update_wlm_quota_settings("session_id", engine_settings)
|
|
118
110
|
assert engine_settings["odps.task.wlm.quota"] == "quota1"
|
|
119
111
|
options.session.quota_name = None
|
|
120
|
-
|
|
121
|
-
|
|
112
|
+
with pytest.raises(ValueError):
|
|
113
|
+
update_wlm_quota_settings("session_id", engine_settings)
|
|
122
114
|
assert "odps.task.wlm.quota" in engine_settings
|
maxframe/config/validators.py
CHANGED
|
@@ -64,6 +64,11 @@ def is_in(vals):
|
|
|
64
64
|
return Validator(vals.__contains__)
|
|
65
65
|
|
|
66
66
|
|
|
67
|
+
def is_all_dict_keys_in(*keys):
|
|
68
|
+
keys_set = set(keys)
|
|
69
|
+
return Validator(lambda x: x in keys_set)
|
|
70
|
+
|
|
71
|
+
|
|
67
72
|
def _is_valid_cache_path(path: str) -> bool:
|
|
68
73
|
"""
|
|
69
74
|
path should look like oss://oss_endpoint/oss_bucket/path
|
maxframe/conftest.py
CHANGED
|
@@ -35,7 +35,7 @@ def test_config():
|
|
|
35
35
|
return config
|
|
36
36
|
|
|
37
37
|
|
|
38
|
-
def
|
|
38
|
+
def _get_account_env(test_config: ConfigParser, section_name: str) -> ODPS:
|
|
39
39
|
try:
|
|
40
40
|
access_id = test_config.get(section_name, "access_id")
|
|
41
41
|
except NoOptionError:
|
|
@@ -60,10 +60,18 @@ def _get_odps_env(test_config: ConfigParser, section_name: str) -> ODPS:
|
|
|
60
60
|
tunnel_endpoint = test_config.get("odps", "tunnel_endpoint")
|
|
61
61
|
except NoOptionError:
|
|
62
62
|
tunnel_endpoint = None
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
return ODPS(
|
|
64
|
+
access_id,
|
|
65
|
+
secret_access_key,
|
|
66
|
+
project,
|
|
67
|
+
endpoint,
|
|
68
|
+
tunnel_endpoint=tunnel_endpoint,
|
|
69
|
+
overwrite_global=False,
|
|
66
70
|
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def _get_bearer_token_env(test_config: ConfigParser, section_name: str) -> ODPS:
|
|
74
|
+
entry = _get_account_env(test_config, section_name)
|
|
67
75
|
policy = {
|
|
68
76
|
"Version": "1",
|
|
69
77
|
"Statement": [
|
|
@@ -73,27 +81,28 @@ def _get_odps_env(test_config: ConfigParser, section_name: str) -> ODPS:
|
|
|
73
81
|
token = entry.get_project().generate_auth_token(policy, "bearer", 5)
|
|
74
82
|
return ODPS(
|
|
75
83
|
account=BearerTokenAccount(token, 5),
|
|
76
|
-
project=project,
|
|
77
|
-
endpoint=endpoint,
|
|
78
|
-
tunnel_endpoint=tunnel_endpoint,
|
|
84
|
+
project=entry.project,
|
|
85
|
+
endpoint=entry.endpoint,
|
|
86
|
+
tunnel_endpoint=entry.tunnel_endpoint,
|
|
79
87
|
)
|
|
80
88
|
|
|
81
89
|
|
|
82
90
|
@pytest.fixture(scope="session")
|
|
83
91
|
def odps_with_schema(test_config):
|
|
84
92
|
try:
|
|
85
|
-
return
|
|
93
|
+
return _get_bearer_token_env(test_config, "odps_with_schema")
|
|
86
94
|
except NoSectionError:
|
|
87
95
|
pytest.skip("Need to specify odps_with_schema section in test.conf")
|
|
88
96
|
|
|
89
97
|
|
|
90
98
|
@pytest.fixture(scope="session", autouse=True)
|
|
91
99
|
def odps_envs(test_config):
|
|
92
|
-
entry =
|
|
100
|
+
entry = _get_bearer_token_env(test_config, "odps")
|
|
93
101
|
|
|
94
102
|
os.environ["ODPS_BEARER_TOKEN"] = entry.account.token
|
|
95
103
|
os.environ["ODPS_PROJECT_NAME"] = entry.project
|
|
96
104
|
os.environ["ODPS_ENDPOINT"] = entry.endpoint
|
|
105
|
+
os.environ["RAY_ISOLATION_UT_ENV"] = "UT"
|
|
97
106
|
if entry.tunnel_endpoint:
|
|
98
107
|
os.environ["ODPS_TUNNEL_ENDPOINT"] = entry.tunnel_endpoint
|
|
99
108
|
|
|
@@ -104,6 +113,7 @@ def odps_envs(test_config):
|
|
|
104
113
|
os.environ.pop("ODPS_PROJECT_NAME", None)
|
|
105
114
|
os.environ.pop("ODPS_ENDPOINT", None)
|
|
106
115
|
os.environ.pop("ODPS_TUNNEL_ENDPOINT", None)
|
|
116
|
+
os.environ.pop("RAY_ISOLATION_UT_ENV", None)
|
|
107
117
|
|
|
108
118
|
from .tests.utils import _test_tables_to_drop
|
|
109
119
|
|
|
@@ -114,6 +124,11 @@ def odps_envs(test_config):
|
|
|
114
124
|
pass
|
|
115
125
|
|
|
116
126
|
|
|
127
|
+
@pytest.fixture(scope="session")
|
|
128
|
+
def odps_account(test_config):
|
|
129
|
+
return _get_account_env(test_config, "odps")
|
|
130
|
+
|
|
131
|
+
|
|
117
132
|
@pytest.fixture(scope="session")
|
|
118
133
|
def oss_config():
|
|
119
134
|
config = ConfigParser()
|
|
@@ -155,7 +170,7 @@ def oss_config():
|
|
|
155
170
|
config.oss_rolearn = oss_rolearn
|
|
156
171
|
yield config
|
|
157
172
|
except (NoSectionError, NoOptionError, ImportError):
|
|
158
|
-
|
|
173
|
+
yield None
|
|
159
174
|
finally:
|
|
160
175
|
options.service_role_arn = old_role_arn
|
|
161
176
|
options.object_cache_url = old_cache_url
|
|
@@ -194,3 +209,16 @@ def local_test_envs():
|
|
|
194
209
|
os.environ[spe_launcher_env] = old_value
|
|
195
210
|
else:
|
|
196
211
|
del os.environ[spe_launcher_env]
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
@pytest.fixture
|
|
215
|
+
def enable_local_execution(request):
|
|
216
|
+
old_enabled = options.local_execution.enabled
|
|
217
|
+
old_limit = options.local_execution.size_limit
|
|
218
|
+
try:
|
|
219
|
+
options.local_execution.enabled = True
|
|
220
|
+
options.local_execution.size_limit = getattr(request, "param", 0)
|
|
221
|
+
yield
|
|
222
|
+
finally:
|
|
223
|
+
options.local_execution.enabled = old_enabled
|
|
224
|
+
options.local_execution.size_limit = old_limit
|
maxframe/core/__init__.py
CHANGED
maxframe/core/context.py
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
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
|
+
from abc import ABC, abstractmethod
|
|
16
|
+
from typing import Any, List
|
|
17
|
+
|
|
18
|
+
from ..utils import classproperty
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class Context(ABC):
|
|
22
|
+
"""
|
|
23
|
+
Context that providing API that can be
|
|
24
|
+
used inside `tile` and `execute`.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
all_contexts = []
|
|
28
|
+
|
|
29
|
+
@abstractmethod
|
|
30
|
+
def get_session_id(self) -> str:
|
|
31
|
+
raise NotImplementedError
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
def get_subdag_id(self) -> str:
|
|
35
|
+
raise NotImplementedError
|
|
36
|
+
|
|
37
|
+
@abstractmethod
|
|
38
|
+
def get_local_host_ip(self) -> str:
|
|
39
|
+
raise NotImplementedError
|
|
40
|
+
|
|
41
|
+
@abstractmethod
|
|
42
|
+
def get_worker_cores(self) -> int:
|
|
43
|
+
raise NotImplementedError
|
|
44
|
+
|
|
45
|
+
@abstractmethod
|
|
46
|
+
def get_chunks_result(self, data_keys: List[str], copy: bool = True) -> List[Any]:
|
|
47
|
+
raise NotImplementedError
|
|
48
|
+
|
|
49
|
+
@abstractmethod
|
|
50
|
+
def create_operator_controller(self, name: str, object_cls, *args, **kwargs):
|
|
51
|
+
"""
|
|
52
|
+
Create operator controller.
|
|
53
|
+
|
|
54
|
+
Parameters
|
|
55
|
+
----------
|
|
56
|
+
name : str
|
|
57
|
+
Object name.
|
|
58
|
+
object_cls
|
|
59
|
+
Object class.
|
|
60
|
+
args
|
|
61
|
+
kwargs
|
|
62
|
+
|
|
63
|
+
Returns
|
|
64
|
+
-------
|
|
65
|
+
ref
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
@abstractmethod
|
|
69
|
+
def get_operator_controller(self, name: str):
|
|
70
|
+
"""
|
|
71
|
+
Get remote object
|
|
72
|
+
|
|
73
|
+
Parameters
|
|
74
|
+
----------
|
|
75
|
+
name : str
|
|
76
|
+
Object name.
|
|
77
|
+
|
|
78
|
+
Returns
|
|
79
|
+
-------
|
|
80
|
+
ref
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
@abstractmethod
|
|
84
|
+
def destroy_operator_controller(self, name: str):
|
|
85
|
+
"""
|
|
86
|
+
Destroy remote object.
|
|
87
|
+
|
|
88
|
+
Parameters
|
|
89
|
+
----------
|
|
90
|
+
name : str
|
|
91
|
+
Object name.
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def __enter__(self):
|
|
95
|
+
Context.all_contexts.append(self)
|
|
96
|
+
|
|
97
|
+
def __exit__(self, *_):
|
|
98
|
+
Context.all_contexts.pop()
|
|
99
|
+
|
|
100
|
+
@classproperty
|
|
101
|
+
def current(cls):
|
|
102
|
+
return cls.all_contexts[-1] if cls.all_contexts else None
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def set_context(context: Context):
|
|
106
|
+
Context.all_contexts.append(context)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def get_context() -> Context:
|
|
110
|
+
return Context.current
|
maxframe/core/entity/__init__.py
CHANGED
maxframe/core/entity/core.py
CHANGED
|
@@ -129,13 +129,6 @@ class Entity(Serializable):
|
|
|
129
129
|
def copy_from(self, obj):
|
|
130
130
|
self.data = obj.data
|
|
131
131
|
|
|
132
|
-
def tiles(self):
|
|
133
|
-
from .tileables import handler
|
|
134
|
-
|
|
135
|
-
new_entity = self.copy()
|
|
136
|
-
new_entity.data = handler.tiles(self.data)
|
|
137
|
-
return new_entity
|
|
138
|
-
|
|
139
132
|
def __getattr__(self, attr):
|
|
140
133
|
return getattr(self._data, attr)
|
|
141
134
|
|