maxframe 1.3.1__cp39-cp39-win32.whl → 2.0.0b2__cp39-cp39-win32.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.cp39-win32.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.cp39-win32.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.cp39-win32.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.cp39-win32.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.0b2.dist-info}/METADATA +4 -1
- maxframe-2.0.0b2.dist-info/RECORD +939 -0
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.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.1.dist-info/RECORD +0 -705
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.dist-info}/top_level.txt +0 -0
maxframe/core/entity/objects.py
CHANGED
|
@@ -16,6 +16,7 @@ from typing import Any, Dict, Type
|
|
|
16
16
|
|
|
17
17
|
from ...serialization import load_type
|
|
18
18
|
from ...serialization.serializables import StringField
|
|
19
|
+
from ...utils import extract_class_name
|
|
19
20
|
from .core import Entity
|
|
20
21
|
from .executable import _ToObjectMixin
|
|
21
22
|
from .tileables import TileableData
|
|
@@ -36,7 +37,7 @@ class ObjectData(TileableData, _ToObjectMixin):
|
|
|
36
37
|
if getattr(cls, "_entity_class", None) is not None:
|
|
37
38
|
return cls._entity_class
|
|
38
39
|
assert cls.__qualname__[-4:] == "Data"
|
|
39
|
-
target_class_name = cls
|
|
40
|
+
target_class_name = extract_class_name(cls)[:-4]
|
|
40
41
|
cls._entity_class = load_type(target_class_name, Object)
|
|
41
42
|
return cls._entity_class
|
|
42
43
|
|
|
@@ -57,15 +58,18 @@ class ObjectData(TileableData, _ToObjectMixin):
|
|
|
57
58
|
if isinstance(obj_cls, type):
|
|
58
59
|
if isinstance(obj_cls, type) and issubclass(obj_cls, Object):
|
|
59
60
|
obj_cls = obj_cls.get_data_class()
|
|
60
|
-
kw["object_class"] = obj_cls
|
|
61
|
+
kw["object_class"] = extract_class_name(obj_cls)
|
|
61
62
|
|
|
62
63
|
super().__init__(_op=op, _nsplits=nsplits, **kw)
|
|
63
64
|
if self.object_class is None and type(self) is not ObjectData:
|
|
64
65
|
cls = type(self)
|
|
65
|
-
self.object_class = cls
|
|
66
|
+
self.object_class = extract_class_name(cls)
|
|
66
67
|
|
|
67
68
|
def __repr__(self):
|
|
68
|
-
return
|
|
69
|
+
return (
|
|
70
|
+
f"{type(self).__name__[:-4]} "
|
|
71
|
+
f"<op={type(self.op).__name__}, key={self.key}>"
|
|
72
|
+
)
|
|
69
73
|
|
|
70
74
|
@property
|
|
71
75
|
def params(self):
|
|
@@ -75,6 +79,7 @@ class ObjectData(TileableData, _ToObjectMixin):
|
|
|
75
79
|
@params.setter
|
|
76
80
|
def params(self, new_params: Dict[str, Any]):
|
|
77
81
|
params = new_params.copy()
|
|
82
|
+
params.pop("object_class", None)
|
|
78
83
|
if params: # pragma: no cover
|
|
79
84
|
raise TypeError(f"Unknown params: {list(params)}")
|
|
80
85
|
|
|
@@ -89,11 +94,20 @@ class Object(Entity, _ToObjectMixin):
|
|
|
89
94
|
_allow_data_type_ = (ObjectData,)
|
|
90
95
|
type_name = "Object"
|
|
91
96
|
|
|
97
|
+
def __new__(cls, data=None, **kw):
|
|
98
|
+
if (
|
|
99
|
+
cls is Object
|
|
100
|
+
and isinstance(data, ObjectData)
|
|
101
|
+
and type(data) is not ObjectData
|
|
102
|
+
):
|
|
103
|
+
return data.get_entity_class()(data, **kw)
|
|
104
|
+
return super().__new__(cls)
|
|
105
|
+
|
|
92
106
|
@classmethod
|
|
93
107
|
def get_data_class(cls) -> Type[ObjectData]:
|
|
94
108
|
if getattr(cls, "_data_class", None) is not None:
|
|
95
109
|
return cls._data_class
|
|
96
|
-
target_class_name = cls
|
|
110
|
+
target_class_name = extract_class_name(cls) + "Data"
|
|
97
111
|
cls._data_class = load_type(target_class_name, ObjectData)
|
|
98
112
|
return cls._data_class
|
|
99
113
|
|
|
@@ -39,6 +39,17 @@ class OutputType(Enum):
|
|
|
39
39
|
return [cls(ot) for ot in output_types] if output_types is not None else None
|
|
40
40
|
|
|
41
41
|
|
|
42
|
+
df_output_types = {
|
|
43
|
+
OutputType.dataframe,
|
|
44
|
+
OutputType.dataframe_groupby,
|
|
45
|
+
OutputType.series,
|
|
46
|
+
OutputType.series_groupby,
|
|
47
|
+
OutputType.df_or_series,
|
|
48
|
+
OutputType.index,
|
|
49
|
+
OutputType.categorical,
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
42
53
|
_OUTPUT_TYPE_TO_TILEABLE_TYPES = {OutputType.object: OBJECT_TYPE}
|
|
43
54
|
_OUTPUT_TYPE_TO_FETCH_CLS = {}
|
|
44
55
|
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from ....utils import extract_class_name
|
|
15
16
|
from ..objects import Object, ObjectData
|
|
16
17
|
|
|
17
18
|
|
|
@@ -26,18 +27,16 @@ class TestSubObject(Object):
|
|
|
26
27
|
def test_object_init():
|
|
27
28
|
assert TestSubObjectData.get_entity_class() is TestSubObject
|
|
28
29
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
)
|
|
32
|
-
assert isinstance(obj,
|
|
30
|
+
obj_data = ObjectData(object_class=extract_class_name(TestSubObjectData))
|
|
31
|
+
assert isinstance(obj_data, TestSubObjectData)
|
|
32
|
+
obj = Object(obj_data)
|
|
33
|
+
assert isinstance(obj, TestSubObject)
|
|
33
34
|
|
|
34
|
-
|
|
35
|
-
assert isinstance(
|
|
35
|
+
obj_data = ObjectData(object_class=TestSubObjectData)
|
|
36
|
+
assert isinstance(obj_data, TestSubObjectData)
|
|
36
37
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
)
|
|
40
|
-
assert isinstance(obj, TestSubObjectData)
|
|
38
|
+
obj_data = ObjectData(object_class=extract_class_name(TestSubObject))
|
|
39
|
+
assert isinstance(obj_data, TestSubObjectData)
|
|
41
40
|
|
|
42
|
-
|
|
43
|
-
assert isinstance(
|
|
41
|
+
obj_data = ObjectData(object_class=TestSubObject)
|
|
42
|
+
assert isinstance(obj_data, TestSubObjectData)
|
|
@@ -172,6 +172,8 @@ class TileableData(EntityData, _ExecutableMixin):
|
|
|
172
172
|
def __init__(self: TileableType, *args, **kwargs):
|
|
173
173
|
if kwargs.get("chunks") is not None:
|
|
174
174
|
self._chunks = kwargs.pop("chunks")
|
|
175
|
+
if "nsplits" in kwargs:
|
|
176
|
+
kwargs["_nsplits"] = kwargs.pop("nsplits")
|
|
175
177
|
if kwargs.get("_nsplits", None) is not None:
|
|
176
178
|
kwargs["_nsplits"] = tuple(tuple(s) for s in kwargs["_nsplits"])
|
|
177
179
|
|
|
@@ -198,7 +200,7 @@ class TileableData(EntityData, _ExecutableMixin):
|
|
|
198
200
|
|
|
199
201
|
@property
|
|
200
202
|
def chunks(self) -> list:
|
|
201
|
-
return getattr(self, "_chunks", None)
|
|
203
|
+
return getattr(self, "_chunks", None) or self._extra_params.get("_chunks")
|
|
202
204
|
|
|
203
205
|
@property
|
|
204
206
|
def nsplits(self):
|
maxframe/core/entity/utils.py
CHANGED
|
@@ -12,6 +12,9 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
import numpy as np
|
|
16
|
+
|
|
17
|
+
from ...typing_ import TileableType
|
|
15
18
|
from ...utils import calc_nsplits, has_unknown_shape
|
|
16
19
|
|
|
17
20
|
|
|
@@ -22,3 +25,15 @@ def refresh_tileable_shape(tileable):
|
|
|
22
25
|
shape = tuple(sum(ns) for ns in nsplits)
|
|
23
26
|
tileable._nsplits = nsplits
|
|
24
27
|
tileable._shape = shape
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def fill_chunk_slices(tileable: TileableType) -> None:
|
|
31
|
+
if tileable is None or not tileable.nsplits or not tileable.chunks:
|
|
32
|
+
# errors may occurred
|
|
33
|
+
return
|
|
34
|
+
acc_splits = tuple((0,) + tuple(np.cumsum(sp)) for sp in tileable.nsplits)
|
|
35
|
+
for chunk in tileable.chunks:
|
|
36
|
+
chunk.slices = list(
|
|
37
|
+
(acc_splits[i][chunk.index[i]], acc_splits[i][chunk.index[i] + 1])
|
|
38
|
+
for i in range(tileable.ndim)
|
|
39
|
+
)
|
maxframe/core/graph/__init__.py
CHANGED
|
@@ -14,4 +14,9 @@
|
|
|
14
14
|
|
|
15
15
|
from .builder import TileableGraphBuilder
|
|
16
16
|
from .core import DAG, DirectedGraph, GraphContainsCycleError
|
|
17
|
-
from .entity import EntityGraph, GraphSerializer, TileableGraph
|
|
17
|
+
from .entity import EntityGraph, GraphSerializer, SerializableGraph, TileableGraph
|
|
18
|
+
|
|
19
|
+
try:
|
|
20
|
+
from ._internal import SubDAG
|
|
21
|
+
except ImportError: # pragma: no cover
|
|
22
|
+
pass
|
|
@@ -41,6 +41,10 @@ class AbstractGraphBuilder(ABC):
|
|
|
41
41
|
): # pylint: disable=no-self-use
|
|
42
42
|
return node not in visited
|
|
43
43
|
|
|
44
|
+
@classmethod
|
|
45
|
+
def _get_node_outputs(cls, node: EntityType):
|
|
46
|
+
return node.op.outputs
|
|
47
|
+
|
|
44
48
|
def _add_nodes(
|
|
45
49
|
self,
|
|
46
50
|
graph: EntityGraph,
|
|
@@ -70,7 +74,7 @@ class AbstractGraphBuilder(ABC):
|
|
|
70
74
|
graph.add_node(c)
|
|
71
75
|
if not graph.has_successor(c, node):
|
|
72
76
|
graph.add_edge(c, node)
|
|
73
|
-
for out in c
|
|
77
|
+
for out in self._get_node_outputs(c):
|
|
74
78
|
if self._if_add_node(out, visited):
|
|
75
79
|
nodes.append(out)
|
|
76
80
|
|
|
Binary file
|
maxframe/core/graph/core.pyx
CHANGED
|
@@ -309,13 +309,19 @@ cdef class DirectedGraph:
|
|
|
309
309
|
return val
|
|
310
310
|
|
|
311
311
|
def _extract_operators(self, node):
|
|
312
|
+
if getattr(node, "opfunc", None) is not None:
|
|
313
|
+
return [node.opfunc]
|
|
312
314
|
return [node.op]
|
|
313
315
|
|
|
314
316
|
def to_dot(
|
|
315
317
|
self,
|
|
316
318
|
graph_attrs=None,
|
|
317
319
|
node_attrs=None,
|
|
318
|
-
trunc_key=5,
|
|
320
|
+
trunc_key=5,
|
|
321
|
+
result_chunk_keys=None,
|
|
322
|
+
show_columns=False,
|
|
323
|
+
with_op_id=True,
|
|
324
|
+
):
|
|
319
325
|
|
|
320
326
|
sio = StringIO()
|
|
321
327
|
sio.write('digraph {\n')
|
|
@@ -344,20 +350,25 @@ cdef class DirectedGraph:
|
|
|
344
350
|
|
|
345
351
|
for node in self.iter_nodes():
|
|
346
352
|
for op in self._extract_operators(node):
|
|
347
|
-
op_name =
|
|
353
|
+
op_name = op.op_name
|
|
348
354
|
if op.stage is not None:
|
|
349
355
|
op_name = f'{op_name}:{op.stage.name}'
|
|
350
356
|
if op.key in visited:
|
|
351
357
|
continue
|
|
358
|
+
|
|
359
|
+
op_key_id = op.key[:trunc_key]
|
|
360
|
+
if with_op_id:
|
|
361
|
+
op_key_id += f"_{id(op)}"
|
|
362
|
+
|
|
352
363
|
for input_chunk in (op.inputs or []):
|
|
353
364
|
if input_chunk.key not in visited:
|
|
354
365
|
sio.write(f'"Chunk:{self._gen_chunk_key(input_chunk, trunc_key)}" {chunk_style}\n')
|
|
355
366
|
visited.add(input_chunk.key)
|
|
356
367
|
if op.key not in visited:
|
|
357
|
-
sio.write(f'"{op_name}:{
|
|
368
|
+
sio.write(f'"{op_name}:{op_key_id}" {operator_style}\n')
|
|
358
369
|
visited.add(op.key)
|
|
359
370
|
sio.write(f'"Chunk:{self._gen_chunk_key(input_chunk, trunc_key)}" -> '
|
|
360
|
-
f'"{op_name}:{
|
|
371
|
+
f'"{op_name}:{op_key_id}"\n')
|
|
361
372
|
|
|
362
373
|
for output_chunk in (op.outputs or []):
|
|
363
374
|
if output_chunk.key not in visited:
|
|
@@ -367,9 +378,9 @@ cdef class DirectedGraph:
|
|
|
367
378
|
sio.write(f'"Chunk:{self._gen_chunk_key(output_chunk, trunc_key)}" {tmp_chunk_style}\n')
|
|
368
379
|
visited.add(output_chunk.key)
|
|
369
380
|
if op.key not in visited:
|
|
370
|
-
sio.write(f'"{op_name}:{
|
|
381
|
+
sio.write(f'"{op_name}:{op_key_id}" {operator_style}\n')
|
|
371
382
|
visited.add(op.key)
|
|
372
|
-
sio.write(f'"{op_name}:{
|
|
383
|
+
sio.write(f'"{op_name}:{op_key_id}" -> '
|
|
373
384
|
f'"Chunk:{self._gen_chunk_key(output_chunk, trunc_key)}"')
|
|
374
385
|
if show_columns:
|
|
375
386
|
sio.write(f' [ label={get_col_names(output_chunk)} ]')
|
maxframe/core/graph/entity.py
CHANGED
|
@@ -16,10 +16,17 @@ from abc import ABCMeta, abstractmethod
|
|
|
16
16
|
from typing import Dict, Iterable, List
|
|
17
17
|
|
|
18
18
|
from ...core import Tileable
|
|
19
|
-
from ...serialization.core import buffered
|
|
20
|
-
from ...serialization.serializables import
|
|
19
|
+
from ...serialization.core import buffered, load_type
|
|
20
|
+
from ...serialization.serializables import (
|
|
21
|
+
BoolField,
|
|
22
|
+
DictField,
|
|
23
|
+
ListField,
|
|
24
|
+
Serializable,
|
|
25
|
+
StringField,
|
|
26
|
+
)
|
|
21
27
|
from ...serialization.serializables.core import SerializableSerializer
|
|
22
|
-
from ...utils import tokenize
|
|
28
|
+
from ...utils import extract_class_name, tokenize
|
|
29
|
+
from ..operator import Fetch
|
|
23
30
|
from .core import DAG
|
|
24
31
|
|
|
25
32
|
|
|
@@ -110,11 +117,10 @@ class SerializableGraph(Serializable):
|
|
|
110
117
|
_predecessors = DictField("predecessors")
|
|
111
118
|
_successors = DictField("successors")
|
|
112
119
|
_results = ListField("results")
|
|
120
|
+
_graph_cls = StringField("graph_cls")
|
|
113
121
|
|
|
114
122
|
@classmethod
|
|
115
123
|
def from_graph(cls, graph: EntityGraph) -> "SerializableGraph":
|
|
116
|
-
from ..operator import Fetch
|
|
117
|
-
|
|
118
124
|
return SerializableGraph(
|
|
119
125
|
_is_chunk=False,
|
|
120
126
|
_fetch_nodes=[chunk for chunk in graph if isinstance(chunk.op, Fetch)],
|
|
@@ -122,10 +128,16 @@ class SerializableGraph(Serializable):
|
|
|
122
128
|
_predecessors=graph._predecessors,
|
|
123
129
|
_successors=graph._successors,
|
|
124
130
|
_results=graph.results,
|
|
131
|
+
_graph_cls=extract_class_name(type(graph)),
|
|
125
132
|
)
|
|
126
133
|
|
|
127
134
|
def to_graph(self) -> EntityGraph:
|
|
128
|
-
|
|
135
|
+
graph_cls = (
|
|
136
|
+
load_type(self._graph_cls, EntityGraph)
|
|
137
|
+
if hasattr(self, "_graph_cls") and self._graph_cls
|
|
138
|
+
else TileableGraph
|
|
139
|
+
)
|
|
140
|
+
graph = graph_cls(self._results)
|
|
129
141
|
graph._nodes.update(self._nodes)
|
|
130
142
|
graph._predecessors.update(self._predecessors)
|
|
131
143
|
graph._successors.update(self._successors)
|
|
@@ -20,8 +20,13 @@ from .base import (
|
|
|
20
20
|
OperatorStage,
|
|
21
21
|
VirtualOperator,
|
|
22
22
|
)
|
|
23
|
-
from .core import
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
from .core import (
|
|
24
|
+
TileableOperatorMixin,
|
|
25
|
+
estimate_size,
|
|
26
|
+
estimate_tileable_execution_size,
|
|
27
|
+
execute,
|
|
28
|
+
)
|
|
29
|
+
from .fetch import Fetch, FetchMixin, FetchShuffle
|
|
30
|
+
from .objects import ObjectFetch, ObjectOperator, ObjectOperatorMixin
|
|
26
31
|
from .shuffle import MapReduceOperator, ShuffleProxy
|
|
27
32
|
from .utils import add_fetch_builder, build_fetch
|
maxframe/core/operator/base.py
CHANGED
|
@@ -16,7 +16,7 @@ import weakref
|
|
|
16
16
|
from copy import deepcopy
|
|
17
17
|
from enum import Enum
|
|
18
18
|
from functools import lru_cache, partial
|
|
19
|
-
from typing import Any, Dict, List, Optional, Tuple, Type, Union
|
|
19
|
+
from typing import Any, Dict, List, MutableMapping, Optional, Tuple, Type, Union
|
|
20
20
|
|
|
21
21
|
from ...serialization.core import Placeholder
|
|
22
22
|
from ...serialization.serializables import (
|
|
@@ -88,6 +88,8 @@ class SchedulingHint(Serializable):
|
|
|
88
88
|
priority = Int32Field("priority", default=None)
|
|
89
89
|
expect_engine = StringField("expect_engine", default=None)
|
|
90
90
|
expect_resources = DictField("expect_resources", FieldTypes.string, default=None)
|
|
91
|
+
# id of gang scheduling for machine learning trainings
|
|
92
|
+
gang_scheduling_id = StringField("gang_scheduling_id", default=None)
|
|
91
93
|
|
|
92
94
|
@classproperty
|
|
93
95
|
@lru_cache(1)
|
|
@@ -127,7 +129,7 @@ def _install_scheduling_hint_properties(cls: Type["Operator"]):
|
|
|
127
129
|
class OperatorLogicKeyGeneratorMixin:
|
|
128
130
|
"""
|
|
129
131
|
This generator will generate an unique and deterministic key for operator compute logic. It should be same
|
|
130
|
-
for different run if the compute logic doesn't change. This id will be used in
|
|
132
|
+
for different run if the compute logic doesn't change. This id will be used in substep speculative
|
|
131
133
|
execution and hbo scheduling and so on.
|
|
132
134
|
"""
|
|
133
135
|
|
|
@@ -264,6 +266,10 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
|
|
|
264
266
|
else:
|
|
265
267
|
extras[k] = kwargs.pop(k)
|
|
266
268
|
|
|
269
|
+
@property
|
|
270
|
+
def op_name(self) -> str:
|
|
271
|
+
return type(self).__name__
|
|
272
|
+
|
|
267
273
|
def __repr__(self):
|
|
268
274
|
if self.stage is None:
|
|
269
275
|
return f"{type(self).__name__} <key={self.key}>"
|
|
@@ -280,12 +286,13 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
|
|
|
280
286
|
def _get_inputs_data(cls, inputs):
|
|
281
287
|
return [cls._get_entity_data(inp) for inp in inputs]
|
|
282
288
|
|
|
283
|
-
|
|
289
|
+
@classmethod
|
|
290
|
+
def _set_inputs(cls, op: "Operator", inputs: List[EntityData]):
|
|
284
291
|
if inputs is not None:
|
|
285
|
-
inputs =
|
|
286
|
-
if hasattr(
|
|
287
|
-
|
|
288
|
-
setattr(
|
|
292
|
+
inputs = cls._get_inputs_data(inputs)
|
|
293
|
+
if hasattr(op, "check_inputs"):
|
|
294
|
+
op.check_inputs(inputs)
|
|
295
|
+
setattr(op, "_inputs", inputs)
|
|
289
296
|
|
|
290
297
|
def replace_input(self, index: int, replaced_input: ENTITY_TYPE):
|
|
291
298
|
"""
|
|
@@ -299,7 +306,7 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
|
|
|
299
306
|
The replaced input object.
|
|
300
307
|
"""
|
|
301
308
|
self.inputs[index] = replaced_input
|
|
302
|
-
self._set_inputs(self.inputs)
|
|
309
|
+
self._set_inputs(self, self.inputs)
|
|
303
310
|
|
|
304
311
|
@property
|
|
305
312
|
def inputs(self) -> List[Union[ENTITY_TYPE]]:
|
|
@@ -310,7 +317,7 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
|
|
|
310
317
|
|
|
311
318
|
@inputs.setter
|
|
312
319
|
def inputs(self, vals):
|
|
313
|
-
self._set_inputs(vals)
|
|
320
|
+
self._set_inputs(self, vals)
|
|
314
321
|
|
|
315
322
|
@property
|
|
316
323
|
def output_limit(self) -> int:
|
|
@@ -358,6 +365,9 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
|
|
|
358
365
|
def is_gpu(self) -> bool:
|
|
359
366
|
return self.gpu
|
|
360
367
|
|
|
368
|
+
def has_custom_code(self) -> bool:
|
|
369
|
+
return False
|
|
370
|
+
|
|
361
371
|
@property
|
|
362
372
|
def retryable(self) -> bool:
|
|
363
373
|
return True
|
|
@@ -386,6 +396,18 @@ class Operator(Base, OperatorLogicKeyGeneratorMixin, metaclass=OperatorMetaclass
|
|
|
386
396
|
new_op.extra_params = deepcopy(extra_params)
|
|
387
397
|
return new_op
|
|
388
398
|
|
|
399
|
+
@classmethod
|
|
400
|
+
def estimate_size(
|
|
401
|
+
cls, ctx: MutableMapping[str, Union[int, float]], op: "Operator"
|
|
402
|
+
) -> None:
|
|
403
|
+
try:
|
|
404
|
+
total_input_size = sum(ctx[inp.key] for inp in (op.inputs or ()))
|
|
405
|
+
for out in op.outputs:
|
|
406
|
+
ctx[out.key] = total_input_size // len(op.outputs)
|
|
407
|
+
except KeyError:
|
|
408
|
+
for out in op.outputs:
|
|
409
|
+
ctx[out.key] = float("inf")
|
|
410
|
+
|
|
389
411
|
def on_output_modify(self, new_output):
|
|
390
412
|
# when `create_view` is True, if the output is modified,
|
|
391
413
|
# the modification should be set back to the input.
|
|
@@ -445,6 +467,7 @@ class HasInput(Operator):
|
|
|
445
467
|
def input(self):
|
|
446
468
|
return self._input
|
|
447
469
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
470
|
+
@classmethod
|
|
471
|
+
def _set_inputs(cls, op: "Operator", inputs: List[EntityData]):
|
|
472
|
+
super()._set_inputs(op, inputs)
|
|
473
|
+
op._input = op._inputs[0]
|
maxframe/core/operator/core.py
CHANGED
|
@@ -12,11 +12,16 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
import math
|
|
15
16
|
import sys
|
|
16
|
-
from
|
|
17
|
+
from collections import defaultdict
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Type, Union
|
|
17
19
|
|
|
18
20
|
import numpy as np
|
|
19
21
|
|
|
22
|
+
if TYPE_CHECKING:
|
|
23
|
+
from .. import TileableGraph
|
|
24
|
+
|
|
20
25
|
try:
|
|
21
26
|
from numpy.core._exceptions import UFuncTypeError
|
|
22
27
|
except ImportError: # pragma: no cover
|
|
@@ -117,7 +122,7 @@ class TileableOperatorMixin:
|
|
|
117
122
|
if output_limit is None:
|
|
118
123
|
output_limit = getattr(self, "output_limit")
|
|
119
124
|
|
|
120
|
-
self._set_inputs(inputs)
|
|
125
|
+
self._set_inputs(self, inputs)
|
|
121
126
|
if self.gpu is None:
|
|
122
127
|
self.gpu = self._check_if_gpu(self._inputs)
|
|
123
128
|
if getattr(self, "_key", None) is None:
|
|
@@ -182,20 +187,13 @@ class TileableOperatorMixin:
|
|
|
182
187
|
|
|
183
188
|
return self.new_tileables(inputs, kws=kws, **kw)[0]
|
|
184
189
|
|
|
185
|
-
|
|
186
|
-
def concat_tileable_chunks(cls, tileable: TileableType):
|
|
187
|
-
raise NotImplementedError
|
|
188
|
-
|
|
189
|
-
@classmethod
|
|
190
|
-
def create_tileable_from_chunks(
|
|
191
|
-
cls, chunks: List[ChunkType], inputs: List[TileableType] = None, **kw
|
|
192
|
-
) -> TileableType:
|
|
193
|
-
raise NotImplementedError
|
|
194
|
-
|
|
195
|
-
def get_fetch_op_cls(self, obj: ChunkType):
|
|
190
|
+
def get_fetch_op_cls(self, obj: Union[ChunkType, OutputType]):
|
|
196
191
|
from .shuffle import ShuffleProxy
|
|
197
192
|
|
|
198
|
-
|
|
193
|
+
if isinstance(obj, OutputType):
|
|
194
|
+
output_types = [obj or OutputType.object]
|
|
195
|
+
else:
|
|
196
|
+
output_types = get_output_types(obj, unknown_as=OutputType.object)
|
|
199
197
|
fetch_cls, fetch_shuffle_cls = get_fetch_class(output_types[0])
|
|
200
198
|
if isinstance(self, ShuffleProxy):
|
|
201
199
|
cls = fetch_shuffle_cls
|
|
@@ -274,3 +272,28 @@ def estimate_size(results: Dict[str, Any], op: OperatorType):
|
|
|
274
272
|
_op_type_to_size_estimator[type(op)] = size_estimator
|
|
275
273
|
return size_estimator(results, op)
|
|
276
274
|
raise KeyError(f"No handler found for op: {op} to estimate size")
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def estimate_tileable_execution_size(
|
|
278
|
+
tileable_graph: "TileableGraph",
|
|
279
|
+
fetch_sizes: Optional[Dict[str, int]] = None,
|
|
280
|
+
) -> Union[int, float]:
|
|
281
|
+
ctx = dict()
|
|
282
|
+
ctx.update(fetch_sizes)
|
|
283
|
+
ref_counts = defaultdict(lambda: 0)
|
|
284
|
+
max_size = 0
|
|
285
|
+
|
|
286
|
+
for tileable in tileable_graph:
|
|
287
|
+
for key in set(inp.key for inp in tileable.inputs or ()):
|
|
288
|
+
ref_counts[key] += 1
|
|
289
|
+
|
|
290
|
+
for tileable in tileable_graph.topological_iter():
|
|
291
|
+
estimate_size(ctx, tileable.op)
|
|
292
|
+
max_size = max(max_size, sum(ctx.values()))
|
|
293
|
+
if math.isinf(max_size):
|
|
294
|
+
return float("inf")
|
|
295
|
+
for inp in set(inp.key for inp in tileable.inputs or ()):
|
|
296
|
+
ref_counts[inp] -= 1
|
|
297
|
+
if ref_counts[inp] <= 0:
|
|
298
|
+
ctx.pop(inp, None)
|
|
299
|
+
return max_size
|
maxframe/core/operator/fetch.py
CHANGED
|
@@ -12,16 +12,8 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
import enum
|
|
16
|
-
|
|
17
15
|
from ... import opcodes
|
|
18
|
-
from ...serialization.serializables import
|
|
19
|
-
FieldTypes,
|
|
20
|
-
Int32Field,
|
|
21
|
-
ListField,
|
|
22
|
-
ReferenceField,
|
|
23
|
-
StringField,
|
|
24
|
-
)
|
|
16
|
+
from ...serialization.serializables import Int32Field, StringField
|
|
25
17
|
from .base import Operator
|
|
26
18
|
from .core import TileableOperatorMixin
|
|
27
19
|
|
|
@@ -42,12 +34,7 @@ class FetchMixin(TileableOperatorMixin):
|
|
|
42
34
|
class FetchShuffle(Operator):
|
|
43
35
|
_op_type_ = opcodes.FETCH_SHUFFLE
|
|
44
36
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
class ShuffleFetchType(enum.Enum):
|
|
52
|
-
FETCH_BY_KEY = 0
|
|
53
|
-
FETCH_BY_INDEX = 1
|
|
37
|
+
shuffle_key = StringField("shuffle_key", default=None)
|
|
38
|
+
reducer_id = Int32Field("reducer_id", default=None)
|
|
39
|
+
n_mappers = Int32Field("n_mappers", default=None)
|
|
40
|
+
n_reducers = Int32Field("n_reducers", default=None)
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
-
from ...serialization.serializables import BoolField
|
|
16
15
|
from ..entity import OutputType, register_fetch_class
|
|
17
16
|
from .base import Operator
|
|
18
17
|
from .core import TileableOperatorMixin
|
|
@@ -42,22 +41,3 @@ class ObjectFetch(FetchMixin, ObjectOperatorMixin, Fetch):
|
|
|
42
41
|
|
|
43
42
|
|
|
44
43
|
register_fetch_class(OutputType.object, ObjectFetch, None)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
class MergeDictOperator(ObjectOperator, ObjectOperatorMixin):
|
|
48
|
-
_merge = BoolField("merge")
|
|
49
|
-
|
|
50
|
-
def __init__(self, merge=None, **kw):
|
|
51
|
-
super().__init__(_merge=merge, **kw)
|
|
52
|
-
|
|
53
|
-
@property
|
|
54
|
-
def merge(self):
|
|
55
|
-
return self._merge
|
|
56
|
-
|
|
57
|
-
@classmethod
|
|
58
|
-
def concat_tileable_chunks(cls, tileable):
|
|
59
|
-
assert not tileable.is_coarse()
|
|
60
|
-
|
|
61
|
-
op = cls(merge=True)
|
|
62
|
-
chunk = cls(merge=True).new_chunk(tileable.chunks)
|
|
63
|
-
return op.new_tileable([tileable], chunks=[chunk], nsplits=((1,),))
|