maxframe 1.3.1__cp38-cp38-win32.whl → 2.0.0b2__cp38-cp38-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.cp38-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.cp38-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.cp38-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.cp38-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_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}/WHEEL +0 -0
- {maxframe-1.3.1.dist-info → maxframe-2.0.0b2.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,115 @@
|
|
|
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 numpy as np
|
|
16
|
+
from numpy.linalg import LinAlgError
|
|
17
|
+
|
|
18
|
+
from ... import opcodes
|
|
19
|
+
from ...core import ExecutableTuple
|
|
20
|
+
from ..datasource import tensor as astensor
|
|
21
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TensorLU(TensorHasInput, TensorOperatorMixin):
|
|
25
|
+
_op_type_ = opcodes.LU
|
|
26
|
+
|
|
27
|
+
@property
|
|
28
|
+
def output_limit(self):
|
|
29
|
+
return 3
|
|
30
|
+
|
|
31
|
+
def __call__(self, a):
|
|
32
|
+
import scipy.linalg
|
|
33
|
+
|
|
34
|
+
a = astensor(a)
|
|
35
|
+
if a.ndim != 2:
|
|
36
|
+
raise LinAlgError(
|
|
37
|
+
f"{a.ndim}-dimensional array given. Tensor must be two-dimensional"
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
if a.shape[0] > a.shape[1]:
|
|
41
|
+
p_shape = (a.shape[0],) * 2
|
|
42
|
+
l_shape = a.shape
|
|
43
|
+
u_shape = (a.shape[1],) * 2
|
|
44
|
+
elif a.shape[0] < a.shape[1]:
|
|
45
|
+
p_shape = (a.shape[0],) * 2
|
|
46
|
+
l_shape = (a.shape[0],) * 2
|
|
47
|
+
u_shape = a.shape
|
|
48
|
+
else:
|
|
49
|
+
p_shape, l_shape, u_shape = (a.shape,) * 3
|
|
50
|
+
|
|
51
|
+
tiny_p, tiny_l, tiny_u = scipy.linalg.lu(
|
|
52
|
+
np.array([[1, 2], [2, 5]], dtype=a.dtype)
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
order = a.order
|
|
56
|
+
p, l, u = self.new_tensors(
|
|
57
|
+
[a],
|
|
58
|
+
kws=[
|
|
59
|
+
{"side": "p", "dtype": tiny_p.dtype, "shape": p_shape, "order": order},
|
|
60
|
+
{"side": "l", "dtype": tiny_l.dtype, "shape": l_shape, "order": order},
|
|
61
|
+
{"side": "u", "dtype": tiny_u.dtype, "shape": u_shape, "order": order},
|
|
62
|
+
],
|
|
63
|
+
)
|
|
64
|
+
return ExecutableTuple([p, l, u])
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def lu(a):
|
|
68
|
+
"""
|
|
69
|
+
LU decomposition
|
|
70
|
+
|
|
71
|
+
The decomposition is::
|
|
72
|
+
A = P L U
|
|
73
|
+
where P is a permutation matrix, L lower triangular with unit diagonal elements,
|
|
74
|
+
and U upper triangular.
|
|
75
|
+
|
|
76
|
+
Parameters
|
|
77
|
+
----------
|
|
78
|
+
a : (M, N) array_like
|
|
79
|
+
Array to decompose
|
|
80
|
+
|
|
81
|
+
Returns
|
|
82
|
+
-------
|
|
83
|
+
p : (M, M) ndarray
|
|
84
|
+
Permutation matrix
|
|
85
|
+
l : (M, K) ndarray
|
|
86
|
+
Lower triangular or trapezoidal matrix with unit diagonal.
|
|
87
|
+
K = min(M, N)
|
|
88
|
+
u : (K, N) ndarray
|
|
89
|
+
Upper triangular or trapezoidal matrix
|
|
90
|
+
|
|
91
|
+
Examples
|
|
92
|
+
--------
|
|
93
|
+
>>> import maxframe.tensor as mt
|
|
94
|
+
|
|
95
|
+
>>> A = mt.array([[1,2],[2,3]])
|
|
96
|
+
>>> A.execute()
|
|
97
|
+
array([[ 1, 2],
|
|
98
|
+
[ 2, 3]])
|
|
99
|
+
>>> P, L, U = mt.linalg.lu(A)
|
|
100
|
+
>>> P.execute()
|
|
101
|
+
array([[ 0, 1],
|
|
102
|
+
[ 1, 0]])
|
|
103
|
+
>>> L.execute()
|
|
104
|
+
array([[ 1, 0],
|
|
105
|
+
[ 0.5, 1]])
|
|
106
|
+
>>> U.execute()
|
|
107
|
+
array([[ 2, 3],
|
|
108
|
+
[ 0, 0.5]])
|
|
109
|
+
>>> mt.dot(P.dot(L), U).execute() # verify that PL * U = A
|
|
110
|
+
array([[ 1, 2],
|
|
111
|
+
[ 2, 3]])
|
|
112
|
+
|
|
113
|
+
"""
|
|
114
|
+
op = TensorLU(sparse=a.issparse())
|
|
115
|
+
return op(a)
|
|
@@ -0,0 +1,225 @@
|
|
|
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
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from ... import opcodes
|
|
20
|
+
from ...core import EntityData
|
|
21
|
+
from ...serialization.serializables import KeyField, StringField
|
|
22
|
+
from ..core import Tensor, TensorOrder
|
|
23
|
+
from ..datasource import tensor as astensor
|
|
24
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
25
|
+
from ..utils import broadcast_shape, check_order, check_out_param
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TensorMatmul(TensorOperator, TensorOperatorMixin):
|
|
29
|
+
_op_type_ = opcodes.MATMUL
|
|
30
|
+
|
|
31
|
+
a = KeyField("a")
|
|
32
|
+
b = KeyField("b")
|
|
33
|
+
casting = StringField("casting", default="same_kind")
|
|
34
|
+
order = StringField("order", default="K")
|
|
35
|
+
|
|
36
|
+
def __init__(self, **kw):
|
|
37
|
+
super().__init__(**kw)
|
|
38
|
+
check_order(self.order)
|
|
39
|
+
|
|
40
|
+
@classmethod
|
|
41
|
+
def _set_inputs(cls, op: "TensorMatmul", inputs: List[EntityData]):
|
|
42
|
+
super()._set_inputs(op, inputs)
|
|
43
|
+
op.a = op._inputs[0]
|
|
44
|
+
op.b = op._inputs[1]
|
|
45
|
+
|
|
46
|
+
def _calc_order(self, a, b, out):
|
|
47
|
+
if out is not None:
|
|
48
|
+
return out.order
|
|
49
|
+
|
|
50
|
+
if self.order in "A":
|
|
51
|
+
if a.order == TensorOrder.C_ORDER or b.order == TensorOrder.C_ORDER:
|
|
52
|
+
return TensorOrder.C_ORDER
|
|
53
|
+
else:
|
|
54
|
+
return TensorOrder.F_ORDER
|
|
55
|
+
elif self.order in "CK":
|
|
56
|
+
return TensorOrder.C_ORDER
|
|
57
|
+
else:
|
|
58
|
+
return TensorOrder.F_ORDER
|
|
59
|
+
|
|
60
|
+
def __call__(self, a, b, out=None):
|
|
61
|
+
from ..misc import broadcast_to
|
|
62
|
+
|
|
63
|
+
if a.ndim == 0 or b.ndim == 0:
|
|
64
|
+
raise ValueError("Scalar operands are not allowed, use '*' instead")
|
|
65
|
+
if out is not None and not isinstance(out, Tensor):
|
|
66
|
+
raise TypeError(f"out must be a Tensor, got {type(out)} instead")
|
|
67
|
+
|
|
68
|
+
a_is_1d = False
|
|
69
|
+
if a.ndim == 1:
|
|
70
|
+
a_is_1d = True
|
|
71
|
+
a = a[np.newaxis, :]
|
|
72
|
+
|
|
73
|
+
b_is_1d = False
|
|
74
|
+
if b.ndim == 1:
|
|
75
|
+
b_is_1d = True
|
|
76
|
+
b = b[:, np.newaxis]
|
|
77
|
+
|
|
78
|
+
if a.ndim < b.ndim:
|
|
79
|
+
a = a[(b.ndim - a.ndim) * (np.newaxis,)]
|
|
80
|
+
elif a.ndim > b.ndim:
|
|
81
|
+
b = b[(a.ndim - b.ndim) * (np.newaxis,)]
|
|
82
|
+
|
|
83
|
+
if a.shape[-1] != b.shape[-2]:
|
|
84
|
+
raise ValueError(
|
|
85
|
+
f"shape {a.shape} and {b.shape} not aligned: "
|
|
86
|
+
f"{a.shape[-1]} (dim {a.ndim - 1}) != {b.shape[-2]} (dim {b.ndim - 2})"
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
shape = broadcast_shape(a.shape[:-2], b.shape[:-2]) + (a.shape[-2], b.shape[-1])
|
|
90
|
+
order = self._calc_order(a, b, out)
|
|
91
|
+
t = self.new_tensor([a, b], shape, order=order)
|
|
92
|
+
|
|
93
|
+
if a_is_1d:
|
|
94
|
+
t = t[..., 0, :]
|
|
95
|
+
if b_is_1d:
|
|
96
|
+
t = t[..., 0]
|
|
97
|
+
|
|
98
|
+
if out is not None:
|
|
99
|
+
check_out_param(out, t, self.casting)
|
|
100
|
+
t = broadcast_to(t, out.shape)
|
|
101
|
+
out.data = t.data
|
|
102
|
+
return out
|
|
103
|
+
|
|
104
|
+
return t
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def matmul(a, b, sparse=None, out=None, **kw):
|
|
108
|
+
"""
|
|
109
|
+
Matrix product of two tensors.
|
|
110
|
+
|
|
111
|
+
The behavior depends on the arguments in the following way.
|
|
112
|
+
|
|
113
|
+
- If both arguments are 2-D they are multiplied like conventional
|
|
114
|
+
matrices.
|
|
115
|
+
- If either argument is N-D, N > 2, it is treated as a stack of
|
|
116
|
+
matrices residing in the last two indexes and broadcast accordingly.
|
|
117
|
+
- If the first argument is 1-D, it is promoted to a matrix by
|
|
118
|
+
prepending a 1 to its dimensions. After matrix multiplication
|
|
119
|
+
the prepended 1 is removed.
|
|
120
|
+
- If the second argument is 1-D, it is promoted to a matrix by
|
|
121
|
+
appending a 1 to its dimensions. After matrix multiplication
|
|
122
|
+
the appended 1 is removed.
|
|
123
|
+
|
|
124
|
+
Multiplication by a scalar is not allowed, use ``*`` instead. Note that
|
|
125
|
+
multiplying a stack of matrices with a vector will result in a stack of
|
|
126
|
+
vectors, but matmul will not recognize it as such.
|
|
127
|
+
|
|
128
|
+
``matmul`` differs from ``dot`` in two important ways.
|
|
129
|
+
|
|
130
|
+
- Multiplication by scalars is not allowed.
|
|
131
|
+
- Stacks of matrices are broadcast together as if the matrices
|
|
132
|
+
were elements.
|
|
133
|
+
|
|
134
|
+
Parameters
|
|
135
|
+
----------
|
|
136
|
+
a : array_like
|
|
137
|
+
First argument.
|
|
138
|
+
b : array_like
|
|
139
|
+
Second argument.
|
|
140
|
+
out : Tensor, optional
|
|
141
|
+
Output argument. This must have the exact kind that would be returned
|
|
142
|
+
if it was not used. In particular, it must have the right type,
|
|
143
|
+
and its dtype must be the dtype that would be returned
|
|
144
|
+
for `dot(a,b)`. This is a performance feature. Therefore, if these
|
|
145
|
+
conditions are not met, an exception is raised, instead of attempting
|
|
146
|
+
to be flexible.
|
|
147
|
+
|
|
148
|
+
Returns
|
|
149
|
+
-------
|
|
150
|
+
output : Tensor
|
|
151
|
+
Returns the dot product of `a` and `b`. If `a` and `b` are both
|
|
152
|
+
1-D arrays then a scalar is returned; otherwise an array is
|
|
153
|
+
returned. If `out` is given, then it is returned.
|
|
154
|
+
|
|
155
|
+
Raises
|
|
156
|
+
------
|
|
157
|
+
ValueError
|
|
158
|
+
If the last dimension of `a` is not the same size as
|
|
159
|
+
the second-to-last dimension of `b`.
|
|
160
|
+
|
|
161
|
+
If scalar value is passed.
|
|
162
|
+
|
|
163
|
+
See Also
|
|
164
|
+
--------
|
|
165
|
+
vdot : Complex-conjugating dot product.
|
|
166
|
+
tensordot : Sum products over arbitrary axes.
|
|
167
|
+
dot : alternative matrix product with different broadcasting rules.
|
|
168
|
+
|
|
169
|
+
Notes
|
|
170
|
+
-----
|
|
171
|
+
The matmul function implements the semantics of the `@` operator introduced
|
|
172
|
+
in Python 3.5 following PEP465.
|
|
173
|
+
|
|
174
|
+
Examples
|
|
175
|
+
--------
|
|
176
|
+
For 2-D arrays it is the matrix product:
|
|
177
|
+
|
|
178
|
+
>>> import maxframe.tensor as mt
|
|
179
|
+
|
|
180
|
+
>>> a = [[1, 0], [0, 1]]
|
|
181
|
+
>>> b = [[4, 1], [2, 2]]
|
|
182
|
+
>>> mt.matmul(a, b).execute()
|
|
183
|
+
array([[4, 1],
|
|
184
|
+
[2, 2]])
|
|
185
|
+
|
|
186
|
+
For 2-D mixed with 1-D, the result is the usual.
|
|
187
|
+
|
|
188
|
+
>>> a = [[1, 0], [0, 1]]
|
|
189
|
+
>>> b = [1, 2]
|
|
190
|
+
>>> mt.matmul(a, b).execute()
|
|
191
|
+
array([1, 2])
|
|
192
|
+
>>> mt.matmul(b, a).execute()
|
|
193
|
+
array([1, 2])
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
Broadcasting is conventional for stacks of arrays
|
|
197
|
+
|
|
198
|
+
>>> a = mt.arange(2*2*4).reshape((2,2,4))
|
|
199
|
+
>>> b = mt.arange(2*2*4).reshape((2,4,2))
|
|
200
|
+
>>> mt.matmul(a,b).shape
|
|
201
|
+
(2, 2, 2)
|
|
202
|
+
>>> mt.matmul(a,b)[0,1,1].execute()
|
|
203
|
+
98
|
|
204
|
+
>>> mt.sum(a[0,1,:] * b[0,:,1]).execute()
|
|
205
|
+
98
|
|
206
|
+
|
|
207
|
+
Vector, vector returns the scalar inner product, but neither argument
|
|
208
|
+
is complex-conjugated:
|
|
209
|
+
|
|
210
|
+
>>> mt.matmul([2j, 3j], [2j, 3j]).execute()
|
|
211
|
+
(-13+0j)
|
|
212
|
+
|
|
213
|
+
Scalar multiplication raises an error.
|
|
214
|
+
|
|
215
|
+
>>> mt.matmul([1,2], 3)
|
|
216
|
+
Traceback (most recent call last):
|
|
217
|
+
...
|
|
218
|
+
ValueError: Scalar operands are not allowed, use '*' instead
|
|
219
|
+
"""
|
|
220
|
+
a = astensor(a)
|
|
221
|
+
b = astensor(b)
|
|
222
|
+
|
|
223
|
+
sparse = sparse if sparse is not None else a.issparse() and b.issparse()
|
|
224
|
+
op = TensorMatmul(dtype=np.promote_types(a.dtype, b.dtype), sparse=sparse, **kw)
|
|
225
|
+
return op(a, b, out=out)
|
|
@@ -0,0 +1,124 @@
|
|
|
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 numpy as np
|
|
16
|
+
from numpy.linalg import LinAlgError
|
|
17
|
+
|
|
18
|
+
from ... import opcodes
|
|
19
|
+
from ...core import ExecutableTuple
|
|
20
|
+
from ...serialization.serializables import StringField
|
|
21
|
+
from ..core import TensorOrder
|
|
22
|
+
from ..datasource import tensor as astensor
|
|
23
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class TensorQR(TensorHasInput, TensorOperatorMixin):
|
|
27
|
+
_op_type_ = opcodes.QR
|
|
28
|
+
|
|
29
|
+
method = StringField("method")
|
|
30
|
+
|
|
31
|
+
@property
|
|
32
|
+
def output_limit(self):
|
|
33
|
+
return 2
|
|
34
|
+
|
|
35
|
+
def __call__(self, a):
|
|
36
|
+
a = astensor(a)
|
|
37
|
+
|
|
38
|
+
if a.ndim != 2:
|
|
39
|
+
raise LinAlgError(
|
|
40
|
+
f"{a.ndim}-dimensional tensor given. Tensor must be two-dimensional"
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
tiny_q, tiny_r = np.linalg.qr(np.ones((1, 1), dtype=a.dtype))
|
|
44
|
+
|
|
45
|
+
x, y = a.shape
|
|
46
|
+
q_shape, r_shape = (a.shape, (y, y)) if x > y else ((x, x), a.shape)
|
|
47
|
+
q, r = self.new_tensors(
|
|
48
|
+
[a],
|
|
49
|
+
kws=[
|
|
50
|
+
{
|
|
51
|
+
"side": "q",
|
|
52
|
+
"dtype": tiny_q.dtype,
|
|
53
|
+
"shape": q_shape,
|
|
54
|
+
"order": TensorOrder.C_ORDER,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"side": "r",
|
|
58
|
+
"dtype": tiny_r.dtype,
|
|
59
|
+
"shape": r_shape,
|
|
60
|
+
"order": TensorOrder.C_ORDER,
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
)
|
|
64
|
+
return ExecutableTuple([q, r])
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def qr(a, method="tsqr"):
|
|
68
|
+
"""
|
|
69
|
+
Compute the qr factorization of a matrix.
|
|
70
|
+
|
|
71
|
+
Factor the matrix `a` as *qr*, where `q` is orthonormal and `r` is
|
|
72
|
+
upper-triangular.
|
|
73
|
+
|
|
74
|
+
Parameters
|
|
75
|
+
----------
|
|
76
|
+
a : array_like, shape (M, N)
|
|
77
|
+
Matrix to be factored.
|
|
78
|
+
method: {'tsqr', 'sfqr'}, optional
|
|
79
|
+
method to calculate qr factorization, tsqr as default
|
|
80
|
+
|
|
81
|
+
TSQR is presented in:
|
|
82
|
+
|
|
83
|
+
A. Benson, D. Gleich, and J. Demmel.
|
|
84
|
+
Direct QR factorizations for tall-and-skinny matrices in
|
|
85
|
+
MapReduce architectures.
|
|
86
|
+
IEEE International Conference on Big Data, 2013.
|
|
87
|
+
http://arxiv.org/abs/1301.1071
|
|
88
|
+
|
|
89
|
+
FSQR is a QR decomposition for fat and short matrix:
|
|
90
|
+
A = [A1, A2, A3, ...], A1 may be decomposed as A1 = Q1 * R1,
|
|
91
|
+
for A = Q * R, Q = Q1, R = [R1, R2, R3, ...] where A2 = Q1 * R2, A3 = Q1 * R3, ...
|
|
92
|
+
|
|
93
|
+
Returns
|
|
94
|
+
-------
|
|
95
|
+
q : Tensor of float or complex, optional
|
|
96
|
+
A matrix with orthonormal columns. When mode = 'complete' the
|
|
97
|
+
result is an orthogonal/unitary matrix depending on whether or not
|
|
98
|
+
a is real/complex. The determinant may be either +/- 1 in that
|
|
99
|
+
case.
|
|
100
|
+
r : Tensor of float or complex, optional
|
|
101
|
+
The upper-triangular matrix.
|
|
102
|
+
|
|
103
|
+
Raises
|
|
104
|
+
------
|
|
105
|
+
LinAlgError
|
|
106
|
+
If factoring fails.
|
|
107
|
+
|
|
108
|
+
Notes
|
|
109
|
+
-----
|
|
110
|
+
For more information on the qr factorization, see for example:
|
|
111
|
+
http://en.wikipedia.org/wiki/QR_factorization
|
|
112
|
+
|
|
113
|
+
Examples
|
|
114
|
+
--------
|
|
115
|
+
>>> import maxframe.tensor as mt
|
|
116
|
+
|
|
117
|
+
>>> a = mt.random.randn(9, 6)
|
|
118
|
+
>>> q, r = mt.linalg.qr(a)
|
|
119
|
+
>>> mt.allclose(a, mt.dot(q, r)).execute() # a does equal qr
|
|
120
|
+
True
|
|
121
|
+
|
|
122
|
+
"""
|
|
123
|
+
op = TensorQR(method=method)
|
|
124
|
+
return op(a)
|
|
@@ -0,0 +1,103 @@
|
|
|
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
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
from numpy.linalg import LinAlgError
|
|
19
|
+
|
|
20
|
+
from ... import opcodes
|
|
21
|
+
from ...core import EntityData
|
|
22
|
+
from ...serialization.serializables import BoolField, KeyField
|
|
23
|
+
from ..core import TensorOrder
|
|
24
|
+
from ..datasource import tensor as astensor
|
|
25
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TensorSolveTriangular(TensorOperator, TensorOperatorMixin):
|
|
29
|
+
_op_type_ = opcodes.SOLVE_TRIANGULAR
|
|
30
|
+
|
|
31
|
+
a = KeyField("a")
|
|
32
|
+
b = KeyField("b")
|
|
33
|
+
lower = BoolField("lower")
|
|
34
|
+
strict = BoolField("strict")
|
|
35
|
+
|
|
36
|
+
@classmethod
|
|
37
|
+
def _set_inputs(cls, op: "TensorSolveTriangular", inputs: List[EntityData]):
|
|
38
|
+
super()._set_inputs(op, inputs)
|
|
39
|
+
op.a, op.b = op._inputs
|
|
40
|
+
|
|
41
|
+
def __call__(self, a, b):
|
|
42
|
+
shape = (a.shape[1],) if len(b.shape) == 1 else (a.shape[1], b.shape[1])
|
|
43
|
+
return self.new_tensor([a, b], shape, order=TensorOrder.F_ORDER)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def solve_triangular(a, b, lower=False, sparse=None):
|
|
47
|
+
"""
|
|
48
|
+
Solve the equation `a x = b` for `x`, assuming a is a triangular matrix.
|
|
49
|
+
|
|
50
|
+
Parameters
|
|
51
|
+
----------
|
|
52
|
+
a : (M, M) array_like
|
|
53
|
+
A triangular matrix
|
|
54
|
+
b : (M,) or (M, N) array_like
|
|
55
|
+
Right-hand side matrix in `a x = b`
|
|
56
|
+
lower : bool, optional
|
|
57
|
+
Use only data contained in the lower triangle of `a`.
|
|
58
|
+
Default is to use upper triangle.
|
|
59
|
+
sparse: bool, optional
|
|
60
|
+
Return sparse value or not.
|
|
61
|
+
|
|
62
|
+
Returns
|
|
63
|
+
-------
|
|
64
|
+
x : (M,) or (M, N) ndarray
|
|
65
|
+
Solution to the system `a x = b`. Shape of return matches `b`.
|
|
66
|
+
|
|
67
|
+
Examples
|
|
68
|
+
--------
|
|
69
|
+
Solve the lower triangular system a x = b, where::
|
|
70
|
+
[3 0 0 0] [4]
|
|
71
|
+
a = [2 1 0 0] b = [2]
|
|
72
|
+
[1 0 1 0] [4]
|
|
73
|
+
[1 1 1 1] [2]
|
|
74
|
+
|
|
75
|
+
>>> import maxframe.tensor as mt
|
|
76
|
+
>>> a = mt.array([[3, 0, 0, 0], [2, 1, 0, 0], [1, 0, 1, 0], [1, 1, 1, 1]])
|
|
77
|
+
>>> b = mt.array([4, 2, 4, 2])
|
|
78
|
+
>>> x = mt.linalg.solve_triangular(a, b, lower=True)
|
|
79
|
+
>>> x.execute()
|
|
80
|
+
array([ 1.33333333, -0.66666667, 2.66666667, -1.33333333])
|
|
81
|
+
|
|
82
|
+
>>> a.dot(x).execute() # Check the result
|
|
83
|
+
array([ 4., 2., 4., 2.])
|
|
84
|
+
"""
|
|
85
|
+
import scipy.linalg
|
|
86
|
+
|
|
87
|
+
a = astensor(a)
|
|
88
|
+
b = astensor(b)
|
|
89
|
+
|
|
90
|
+
if a.ndim != 2:
|
|
91
|
+
raise LinAlgError("a must be 2 dimensional")
|
|
92
|
+
if b.ndim <= 2:
|
|
93
|
+
if a.shape[1] != b.shape[0]:
|
|
94
|
+
raise LinAlgError("a.shape[1] and b.shape[0] must be equal")
|
|
95
|
+
else:
|
|
96
|
+
raise LinAlgError("b must be 1 or 2 dimensional")
|
|
97
|
+
|
|
98
|
+
tiny_x = scipy.linalg.solve_triangular(
|
|
99
|
+
np.array([[2, 0], [2, 1]], dtype=a.dtype), np.array([[2], [3]], dtype=b.dtype)
|
|
100
|
+
)
|
|
101
|
+
sparse = sparse if sparse is not None else a.issparse()
|
|
102
|
+
op = TensorSolveTriangular(lower=lower, dtype=tiny_x.dtype, sparse=sparse)
|
|
103
|
+
return op(a, b)
|