maxframe 1.3.0__cp311-cp311-win32.whl → 2.0.0b1__cp311-cp311-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.cp311-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.cp311-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 +33 -3
- maxframe/dataframe/datasource/read_odps_table.py +20 -5
- maxframe/dataframe/datasource/read_parquet.py +8 -3
- maxframe/dataframe/datasource/tests/test_datasource.py +33 -0
- maxframe/dataframe/datastore/tests/test_to_odps.py +52 -1
- maxframe/dataframe/datastore/to_csv.py +7 -3
- maxframe/dataframe/datastore/to_odps.py +42 -6
- maxframe/dataframe/extensions/__init__.py +6 -1
- maxframe/dataframe/extensions/apply_chunk.py +96 -136
- maxframe/dataframe/extensions/flatjson.py +3 -2
- maxframe/dataframe/extensions/flatmap.py +15 -7
- maxframe/dataframe/fetch/core.py +12 -1
- maxframe/dataframe/groupby/__init__.py +7 -0
- maxframe/dataframe/groupby/aggregation.py +62 -9
- maxframe/dataframe/groupby/apply.py +50 -74
- maxframe/dataframe/groupby/apply_chunk.py +393 -0
- maxframe/dataframe/groupby/core.py +80 -17
- maxframe/dataframe/groupby/extensions.py +26 -0
- maxframe/dataframe/groupby/fill.py +9 -4
- maxframe/dataframe/groupby/sample.py +7 -7
- maxframe/dataframe/groupby/tests/test_groupby.py +3 -3
- maxframe/dataframe/groupby/transform.py +57 -54
- maxframe/dataframe/indexing/align.py +7 -6
- maxframe/dataframe/indexing/getitem.py +9 -8
- maxframe/dataframe/indexing/iloc.py +28 -23
- maxframe/dataframe/indexing/insert.py +7 -3
- maxframe/dataframe/indexing/loc.py +9 -8
- maxframe/dataframe/indexing/reindex.py +36 -30
- maxframe/dataframe/indexing/rename_axis.py +18 -10
- maxframe/dataframe/indexing/reset_index.py +0 -2
- maxframe/dataframe/indexing/sample.py +13 -9
- maxframe/dataframe/indexing/set_axis.py +9 -6
- maxframe/dataframe/indexing/setitem.py +8 -5
- maxframe/dataframe/indexing/where.py +12 -9
- maxframe/dataframe/merge/__init__.py +0 -1
- maxframe/dataframe/merge/concat.py +10 -31
- maxframe/dataframe/merge/merge.py +2 -24
- maxframe/dataframe/misc/__init__.py +6 -0
- maxframe/dataframe/misc/_duplicate.py +7 -3
- maxframe/dataframe/misc/apply.py +106 -139
- maxframe/dataframe/misc/astype.py +3 -2
- maxframe/dataframe/misc/case_when.py +11 -7
- maxframe/dataframe/misc/cut.py +11 -10
- maxframe/dataframe/misc/describe.py +7 -3
- maxframe/dataframe/misc/drop.py +13 -11
- maxframe/dataframe/misc/eval.py +0 -2
- maxframe/dataframe/misc/get_dummies.py +78 -49
- maxframe/dataframe/misc/isin.py +13 -10
- maxframe/dataframe/misc/map.py +21 -6
- maxframe/dataframe/misc/melt.py +8 -1
- maxframe/dataframe/misc/pivot.py +232 -0
- maxframe/dataframe/misc/pivot_table.py +52 -40
- maxframe/dataframe/misc/rechunk.py +59 -0
- maxframe/dataframe/misc/shift.py +7 -4
- maxframe/dataframe/misc/stack.py +5 -3
- maxframe/dataframe/misc/tests/test_misc.py +167 -1
- maxframe/dataframe/misc/transform.py +63 -65
- maxframe/dataframe/misc/value_counts.py +7 -4
- maxframe/dataframe/missing/dropna.py +16 -7
- maxframe/dataframe/missing/fillna.py +18 -10
- maxframe/dataframe/missing/replace.py +10 -6
- maxframe/dataframe/missing/tests/test_missing.py +2 -2
- maxframe/dataframe/operators.py +1 -27
- maxframe/dataframe/reduction/aggregation.py +128 -3
- maxframe/dataframe/reduction/core.py +20 -6
- maxframe/dataframe/reduction/median.py +1 -1
- maxframe/dataframe/reduction/tests/test_reduction.py +33 -0
- maxframe/dataframe/reduction/unique.py +53 -7
- maxframe/dataframe/statistics/corr.py +9 -6
- maxframe/dataframe/statistics/quantile.py +9 -6
- maxframe/dataframe/tseries/to_datetime.py +6 -4
- maxframe/dataframe/utils.py +219 -31
- maxframe/dataframe/window/rolling.py +7 -4
- maxframe/env.py +1 -0
- maxframe/errors.py +9 -0
- maxframe/extension.py +13 -2
- maxframe/io/objects/core.py +67 -51
- maxframe/io/objects/tensor.py +73 -17
- maxframe/io/objects/tests/test_object_io.py +8 -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 +22 -48
- maxframe/learn/__init__.py +2 -2
- maxframe/learn/contrib/__init__.py +2 -2
- maxframe/learn/contrib/graph/connected_components.py +2 -1
- maxframe/learn/contrib/lightgbm/__init__.py +33 -0
- maxframe/learn/contrib/lightgbm/_predict.py +138 -0
- maxframe/learn/contrib/lightgbm/_train.py +163 -0
- maxframe/learn/contrib/lightgbm/callback.py +114 -0
- maxframe/learn/contrib/lightgbm/classifier.py +199 -0
- maxframe/learn/contrib/lightgbm/core.py +372 -0
- maxframe/learn/contrib/lightgbm/dataset.py +153 -0
- maxframe/learn/contrib/lightgbm/regressor.py +29 -0
- maxframe/learn/contrib/lightgbm/tests/__init__.py +13 -0
- maxframe/learn/contrib/lightgbm/tests/test_callback.py +58 -0
- maxframe/learn/contrib/llm/models/dashscope.py +34 -0
- maxframe/learn/contrib/llm/models/managed.py +15 -0
- maxframe/learn/contrib/llm/multi_modal.py +92 -0
- maxframe/learn/contrib/llm/text.py +21 -5
- maxframe/learn/contrib/models.py +38 -9
- maxframe/learn/contrib/utils.py +55 -0
- maxframe/learn/contrib/xgboost/callback.py +86 -0
- maxframe/learn/contrib/xgboost/classifier.py +26 -30
- maxframe/learn/contrib/xgboost/core.py +53 -42
- maxframe/learn/contrib/xgboost/dmatrix.py +19 -12
- maxframe/learn/contrib/xgboost/predict.py +13 -8
- maxframe/learn/contrib/xgboost/regressor.py +28 -27
- maxframe/learn/contrib/xgboost/tests/test_callback.py +41 -0
- maxframe/learn/contrib/xgboost/train.py +59 -16
- maxframe/learn/core.py +252 -0
- maxframe/learn/datasets/__init__.py +20 -0
- maxframe/learn/datasets/samples_generator.py +628 -0
- maxframe/learn/linear_model/__init__.py +15 -0
- maxframe/learn/linear_model/_base.py +163 -0
- maxframe/learn/linear_model/_lin_reg.py +175 -0
- maxframe/learn/metrics/__init__.py +25 -0
- maxframe/learn/metrics/_check_targets.py +95 -0
- maxframe/learn/metrics/_classification.py +1121 -0
- maxframe/learn/metrics/_regression.py +256 -0
- maxframe/learn/model_selection/__init__.py +15 -0
- maxframe/learn/model_selection/_split.py +451 -0
- maxframe/learn/model_selection/tests/__init__.py +13 -0
- maxframe/learn/model_selection/tests/test_split.py +156 -0
- maxframe/learn/preprocessing/__init__.py +16 -0
- maxframe/learn/preprocessing/_data/__init__.py +17 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +390 -0
- maxframe/learn/preprocessing/_data/normalize.py +127 -0
- maxframe/learn/preprocessing/_data/standard_scaler.py +503 -0
- maxframe/learn/preprocessing/_data/utils.py +79 -0
- maxframe/learn/preprocessing/_label/__init__.py +16 -0
- maxframe/learn/preprocessing/_label/_label_binarizer.py +599 -0
- maxframe/learn/preprocessing/_label/_label_encoder.py +174 -0
- maxframe/learn/utils/__init__.py +4 -0
- maxframe/learn/utils/_encode.py +314 -0
- maxframe/learn/utils/checks.py +161 -0
- maxframe/learn/utils/core.py +33 -0
- maxframe/learn/utils/extmath.py +176 -0
- maxframe/learn/utils/multiclass.py +292 -0
- maxframe/learn/utils/shuffle.py +114 -0
- maxframe/learn/utils/sparsefuncs.py +87 -0
- maxframe/learn/utils/validation.py +775 -0
- maxframe/lib/__init__.py +0 -2
- maxframe/lib/compat.py +145 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/mmh3.cp311-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.cp311-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 +67 -1
- maxframe/udf.py +76 -6
- maxframe/utils.py +418 -17
- {maxframe-1.3.0.dist-info → maxframe-2.0.0b1.dist-info}/METADATA +5 -1
- maxframe-2.0.0b1.dist-info/RECORD +939 -0
- {maxframe-1.3.0.dist-info → maxframe-2.0.0b1.dist-info}/WHEEL +1 -1
- maxframe_client/clients/framedriver.py +19 -3
- maxframe_client/fetcher.py +113 -6
- maxframe_client/session/odps.py +173 -38
- maxframe_client/session/task.py +3 -1
- maxframe_client/tests/test_session.py +41 -5
- maxframe-1.3.0.dist-info/RECORD +0 -705
- {maxframe-1.3.0.dist-info → maxframe-2.0.0b1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,404 @@
|
|
|
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 math
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
from numpy import ndindex
|
|
19
|
+
|
|
20
|
+
try:
|
|
21
|
+
from numpy import ScalarType
|
|
22
|
+
except ImportError:
|
|
23
|
+
from numpy.core.numeric import ScalarType
|
|
24
|
+
|
|
25
|
+
from .. import datasource as _nx
|
|
26
|
+
from ..core import Tensor
|
|
27
|
+
from ..merge import concatenate
|
|
28
|
+
from ..misc import ndim
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class nd_grid(object):
|
|
32
|
+
"""
|
|
33
|
+
Construct a multi-dimensional "meshgrid".
|
|
34
|
+
|
|
35
|
+
``grid = nd_grid()`` creates an instance which will return a mesh-grid
|
|
36
|
+
when indexed. The dimension and number of the output arrays are equal
|
|
37
|
+
to the number of indexing dimensions. If the step length is not a
|
|
38
|
+
complex number, then the stop is not inclusive.
|
|
39
|
+
|
|
40
|
+
However, if the step length is a **complex number** (e.g. 5j), then the
|
|
41
|
+
integer part of its magnitude is interpreted as specifying the
|
|
42
|
+
number of points to create between the start and stop values, where
|
|
43
|
+
the stop value **is inclusive**.
|
|
44
|
+
|
|
45
|
+
If instantiated with an argument of ``sparse=True``, the mesh-grid is
|
|
46
|
+
open (or not fleshed out) so that only one-dimension of each returned
|
|
47
|
+
argument is greater than 1.
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
sparse : bool, optional
|
|
52
|
+
Whether the grid is sparse or not. Default is False.
|
|
53
|
+
|
|
54
|
+
Notes
|
|
55
|
+
-----
|
|
56
|
+
Two instances of `nd_grid` are made available in the maxframe.tensor namespace,
|
|
57
|
+
`mgrid` and `ogrid`::
|
|
58
|
+
|
|
59
|
+
mgrid = nd_grid(sparse=False)
|
|
60
|
+
ogrid = nd_grid(sparse=True)
|
|
61
|
+
|
|
62
|
+
Users should use these pre-defined instances instead of using `nd_grid`
|
|
63
|
+
directly.
|
|
64
|
+
|
|
65
|
+
Examples
|
|
66
|
+
--------
|
|
67
|
+
>>> import maxframe.tensor as mt
|
|
68
|
+
|
|
69
|
+
>>> mgrid = mt.lib.index_tricks.nd_grid()
|
|
70
|
+
>>> mgrid[0:5,0:5]
|
|
71
|
+
array([[[0, 0, 0, 0, 0],
|
|
72
|
+
[1, 1, 1, 1, 1],
|
|
73
|
+
[2, 2, 2, 2, 2],
|
|
74
|
+
[3, 3, 3, 3, 3],
|
|
75
|
+
[4, 4, 4, 4, 4]],
|
|
76
|
+
[[0, 1, 2, 3, 4],
|
|
77
|
+
[0, 1, 2, 3, 4],
|
|
78
|
+
[0, 1, 2, 3, 4],
|
|
79
|
+
[0, 1, 2, 3, 4],
|
|
80
|
+
[0, 1, 2, 3, 4]]])
|
|
81
|
+
>>> mgrid[-1:1:5j]
|
|
82
|
+
array([-1. , -0.5, 0. , 0.5, 1. ])
|
|
83
|
+
|
|
84
|
+
>>> ogrid = mt.lib.index_tricks.nd_grid(sparse=True)
|
|
85
|
+
>>> ogrid[0:5,0:5]
|
|
86
|
+
[array([[0],
|
|
87
|
+
[1],
|
|
88
|
+
[2],
|
|
89
|
+
[3],
|
|
90
|
+
[4]]), array([[0, 1, 2, 3, 4]])]
|
|
91
|
+
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def __init__(self, sparse=False):
|
|
95
|
+
self.sparse = sparse
|
|
96
|
+
|
|
97
|
+
def __getitem__(self, key):
|
|
98
|
+
try:
|
|
99
|
+
size = []
|
|
100
|
+
typ = int
|
|
101
|
+
for k in key:
|
|
102
|
+
step = k.step
|
|
103
|
+
start = k.start
|
|
104
|
+
if start is None:
|
|
105
|
+
start = 0
|
|
106
|
+
if step is None:
|
|
107
|
+
step = 1
|
|
108
|
+
if isinstance(step, complex):
|
|
109
|
+
size.append(int(abs(step)))
|
|
110
|
+
typ = float
|
|
111
|
+
else:
|
|
112
|
+
size.append(int(math.ceil((k.stop - start) / (step * 1.0))))
|
|
113
|
+
if (
|
|
114
|
+
isinstance(step, float)
|
|
115
|
+
or isinstance(start, float)
|
|
116
|
+
or isinstance(k.stop, float)
|
|
117
|
+
):
|
|
118
|
+
typ = float
|
|
119
|
+
if self.sparse:
|
|
120
|
+
nn = [
|
|
121
|
+
_nx.arange(_x, dtype=_t) for _x, _t in zip(size, (typ,) * len(size))
|
|
122
|
+
]
|
|
123
|
+
else:
|
|
124
|
+
nn = _nx.indices(size, typ)
|
|
125
|
+
for k in range(len(size)):
|
|
126
|
+
step = key[k].step
|
|
127
|
+
start = key[k].start
|
|
128
|
+
if start is None:
|
|
129
|
+
start = 0
|
|
130
|
+
if step is None:
|
|
131
|
+
step = 1
|
|
132
|
+
if isinstance(step, complex):
|
|
133
|
+
step = int(abs(step))
|
|
134
|
+
if step != 1:
|
|
135
|
+
step = (key[k].stop - start) / float(step - 1)
|
|
136
|
+
nn[k] = nn[k] * step + start
|
|
137
|
+
if self.sparse:
|
|
138
|
+
slobj = [np.newaxis] * len(size)
|
|
139
|
+
for k in range(len(size)):
|
|
140
|
+
slobj[k] = slice(None, None)
|
|
141
|
+
nn[k] = nn[k][slobj]
|
|
142
|
+
slobj[k] = np.newaxis
|
|
143
|
+
return nn
|
|
144
|
+
except (IndexError, TypeError): # pragma: no cover
|
|
145
|
+
step = key.step
|
|
146
|
+
stop = key.stop
|
|
147
|
+
start = key.start
|
|
148
|
+
if start is None:
|
|
149
|
+
start = 0
|
|
150
|
+
if isinstance(step, complex):
|
|
151
|
+
step = abs(step)
|
|
152
|
+
length = int(step)
|
|
153
|
+
if step != 1:
|
|
154
|
+
step = (key.stop - start) / float(step - 1)
|
|
155
|
+
stop = key.stop + step
|
|
156
|
+
return _nx.arange(0, length, 1, float) * step + start
|
|
157
|
+
else:
|
|
158
|
+
return _nx.arange(start, stop, step)
|
|
159
|
+
|
|
160
|
+
def __len__(self):
|
|
161
|
+
return 0
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
mgrid = nd_grid(sparse=False)
|
|
165
|
+
ogrid = nd_grid(sparse=True)
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class AxisConcatenator:
|
|
169
|
+
def __init__(self, axis=0, matrix=False, ndmin=1, trans1d=-1):
|
|
170
|
+
self.axis = axis
|
|
171
|
+
self.matrix = matrix
|
|
172
|
+
self.trans1d = trans1d
|
|
173
|
+
self.ndmin = ndmin
|
|
174
|
+
|
|
175
|
+
def __getitem__(self, key):
|
|
176
|
+
# handle matrix builder syntax
|
|
177
|
+
if isinstance(key, str): # pragma: no cover
|
|
178
|
+
raise NotImplementedError("Does not support operation on matrix")
|
|
179
|
+
|
|
180
|
+
if not isinstance(key, tuple):
|
|
181
|
+
key = (key,)
|
|
182
|
+
|
|
183
|
+
# copy attributes, since they can be overridden in the first argument
|
|
184
|
+
trans1d = self.trans1d
|
|
185
|
+
ndmin = self.ndmin
|
|
186
|
+
matrix = self.matrix
|
|
187
|
+
axis = self.axis
|
|
188
|
+
|
|
189
|
+
objs = []
|
|
190
|
+
scalars = []
|
|
191
|
+
arraytypes = []
|
|
192
|
+
scalartypes = []
|
|
193
|
+
|
|
194
|
+
for k, item in enumerate(key):
|
|
195
|
+
scalar = False
|
|
196
|
+
if isinstance(item, slice):
|
|
197
|
+
step = item.step
|
|
198
|
+
start = item.start
|
|
199
|
+
stop = item.stop
|
|
200
|
+
if start is None:
|
|
201
|
+
start = 0
|
|
202
|
+
if step is None:
|
|
203
|
+
step = 1
|
|
204
|
+
if isinstance(step, complex):
|
|
205
|
+
size = int(abs(step))
|
|
206
|
+
newobj = _nx.linspace(start, stop, num=size)
|
|
207
|
+
else:
|
|
208
|
+
newobj = _nx.arange(start, stop, step)
|
|
209
|
+
if ndmin > 1:
|
|
210
|
+
newobj = _nx.array(newobj, copy=False, ndmin=ndmin)
|
|
211
|
+
if trans1d != -1:
|
|
212
|
+
newobj = newobj.swapaxes(-1, trans1d)
|
|
213
|
+
elif isinstance(item, str):
|
|
214
|
+
if k != 0:
|
|
215
|
+
raise ValueError("special directives must be the first entry.")
|
|
216
|
+
if item in ("r", "c"): # pragma: no cover
|
|
217
|
+
raise NotImplementedError("Does not support operation on matrix")
|
|
218
|
+
if "," in item:
|
|
219
|
+
vec = item.split(",")
|
|
220
|
+
try:
|
|
221
|
+
axis, ndmin = [int(x) for x in vec[:2]]
|
|
222
|
+
if len(vec) == 3:
|
|
223
|
+
trans1d = int(vec[2])
|
|
224
|
+
continue
|
|
225
|
+
except Exception: # pragma: no cover
|
|
226
|
+
raise ValueError("unknown special directive")
|
|
227
|
+
try:
|
|
228
|
+
axis = int(item)
|
|
229
|
+
continue
|
|
230
|
+
except (ValueError, TypeError): # pragma: no cover# pragma: no cover
|
|
231
|
+
raise ValueError("unknown special directive")
|
|
232
|
+
elif type(item) in ScalarType:
|
|
233
|
+
newobj = np.array(item, ndmin=ndmin)
|
|
234
|
+
scalars.append(len(objs))
|
|
235
|
+
scalar = True
|
|
236
|
+
scalartypes.append(newobj.dtype)
|
|
237
|
+
else:
|
|
238
|
+
item_ndim = ndim(item)
|
|
239
|
+
newobj = _nx.array(item, copy=False, ndmin=ndmin)
|
|
240
|
+
if trans1d != -1 and item_ndim < ndmin:
|
|
241
|
+
k2 = ndmin - item_ndim
|
|
242
|
+
k1 = trans1d
|
|
243
|
+
if k1 < 0:
|
|
244
|
+
k1 += k2 + 1
|
|
245
|
+
defaxes = list(range(ndmin))
|
|
246
|
+
axes = defaxes[:k1] + defaxes[k2:] + defaxes[k1:k2]
|
|
247
|
+
newobj = newobj.transpose(axes)
|
|
248
|
+
objs.append(newobj)
|
|
249
|
+
if not scalar and isinstance(newobj, Tensor):
|
|
250
|
+
arraytypes.append(newobj.dtype)
|
|
251
|
+
|
|
252
|
+
# Ensure that scalars won't up-cast unless warranted
|
|
253
|
+
final_dtype = np.result_type(*arraytypes, *scalartypes)
|
|
254
|
+
if final_dtype is not None:
|
|
255
|
+
for k in scalars:
|
|
256
|
+
objs[k] = objs[k].astype(final_dtype)
|
|
257
|
+
|
|
258
|
+
res = concatenate(tuple(objs), axis=axis)
|
|
259
|
+
|
|
260
|
+
if matrix: # pragma: no cover
|
|
261
|
+
raise NotImplementedError("Does not support operation on matrix")
|
|
262
|
+
return res
|
|
263
|
+
|
|
264
|
+
def __len__(self):
|
|
265
|
+
return 0
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
# separate classes are used here instead of just making r_ = concatentor(0),
|
|
269
|
+
# etc. because otherwise we couldn't get the doc string to come out right
|
|
270
|
+
# in help(r_)
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
class RClass(AxisConcatenator):
|
|
274
|
+
"""
|
|
275
|
+
Translates slice objects to concatenation along the first axis.
|
|
276
|
+
|
|
277
|
+
This is a simple way to build up tensor quickly. There are two use cases.
|
|
278
|
+
|
|
279
|
+
1. If the index expression contains comma separated tensors, then stack
|
|
280
|
+
them along their first axis.
|
|
281
|
+
2. If the index expression contains slice notation or scalars then create
|
|
282
|
+
a 1-D tensor with a range indicated by the slice notation.
|
|
283
|
+
|
|
284
|
+
If slice notation is used, the syntax ``start:stop:step`` is equivalent
|
|
285
|
+
to ``mt.arange(start, stop, step)`` inside of the brackets. However, if
|
|
286
|
+
``step`` is an imaginary number (i.e. 100j) then its integer portion is
|
|
287
|
+
interpreted as a number-of-points desired and the start and stop are
|
|
288
|
+
inclusive. In other words ``start:stop:stepj`` is interpreted as
|
|
289
|
+
``mt.linspace(start, stop, step, endpoint=1)`` inside of the brackets.
|
|
290
|
+
After expansion of slice notation, all comma separated sequences are
|
|
291
|
+
concatenated together.
|
|
292
|
+
|
|
293
|
+
Optional character strings placed as the first element of the index
|
|
294
|
+
expression can be used to change the output. The strings 'r' or 'c' result
|
|
295
|
+
in matrix output. If the result is 1-D and 'r' is specified a 1 x N (row)
|
|
296
|
+
matrix is produced. If the result is 1-D and 'c' is specified, then a N x 1
|
|
297
|
+
(column) matrix is produced. If the result is 2-D then both provide the
|
|
298
|
+
same matrix result.
|
|
299
|
+
|
|
300
|
+
A string integer specifies which axis to stack multiple comma separated
|
|
301
|
+
tensors along. A string of two comma-separated integers allows indication
|
|
302
|
+
of the minimum number of dimensions to force each entry into as the
|
|
303
|
+
second integer (the axis to concatenate along is still the first integer).
|
|
304
|
+
|
|
305
|
+
A string with three comma-separated integers allows specification of the
|
|
306
|
+
axis to concatenate along, the minimum number of dimensions to force the
|
|
307
|
+
entries to, and which axis should contain the start of the tensors which
|
|
308
|
+
are less than the specified number of dimensions. In other words the third
|
|
309
|
+
integer allows you to specify where the 1's should be placed in the shape
|
|
310
|
+
of the tensors that have their shapes upgraded. By default, they are placed
|
|
311
|
+
in the front of the shape tuple. The third argument allows you to specify
|
|
312
|
+
where the start of the tensor should be instead. Thus, a third argument of
|
|
313
|
+
'0' would place the 1's at the end of the tensor shape. Negative integers
|
|
314
|
+
specify where in the new shape tuple the last dimension of upgraded tensors
|
|
315
|
+
should be placed, so the default is '-1'.
|
|
316
|
+
|
|
317
|
+
Parameters
|
|
318
|
+
----------
|
|
319
|
+
Not a function, so takes no parameters
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
Returns
|
|
323
|
+
-------
|
|
324
|
+
A concatenated tensor or matrix.
|
|
325
|
+
|
|
326
|
+
See Also
|
|
327
|
+
--------
|
|
328
|
+
concatenate : Join a sequence of tensors along an existing axis.
|
|
329
|
+
c_ : Translates slice objects to concatenation along the second axis.
|
|
330
|
+
|
|
331
|
+
Examples
|
|
332
|
+
--------
|
|
333
|
+
>>> import maxframe.tensor as mt
|
|
334
|
+
>>> mt.r_[mt.array([1,2,3]), 0, 0, mt.array([4,5,6])].execute()
|
|
335
|
+
array([1, 2, 3, ..., 4, 5, 6])
|
|
336
|
+
>>> mt.r_[-1:1:6j, [0]*3, 5, 6].execute()
|
|
337
|
+
array([-1. , -0.6, -0.2, 0.2, 0.6, 1. , 0. , 0. , 0. , 5. , 6. ])
|
|
338
|
+
|
|
339
|
+
String integers specify the axis to concatenate along or the minimum
|
|
340
|
+
number of dimensions to force entries into.
|
|
341
|
+
|
|
342
|
+
>>> a = mt.array([[0, 1, 2], [3, 4, 5]])
|
|
343
|
+
>>> mt.r_['-1', a, a].execute() # concatenate along last axis
|
|
344
|
+
array([[0, 1, 2, 0, 1, 2],
|
|
345
|
+
[3, 4, 5, 3, 4, 5]])
|
|
346
|
+
>>> mt.r_['0,2', [1,2,3], [4,5,6]].execute() # concatenate along first axis, dim>=2
|
|
347
|
+
array([[1, 2, 3],
|
|
348
|
+
[4, 5, 6]])
|
|
349
|
+
|
|
350
|
+
>>> mt.r_['0,2,0', [1,2,3], [4,5,6]].execute()
|
|
351
|
+
array([[1],
|
|
352
|
+
[2],
|
|
353
|
+
[3],
|
|
354
|
+
[4],
|
|
355
|
+
[5],
|
|
356
|
+
[6]])
|
|
357
|
+
>>> mt.r_['1,2,0', [1,2,3], [4,5,6]].execute()
|
|
358
|
+
array([[1, 4],
|
|
359
|
+
[2, 5],
|
|
360
|
+
[3, 6]])
|
|
361
|
+
"""
|
|
362
|
+
|
|
363
|
+
def __init__(self):
|
|
364
|
+
AxisConcatenator.__init__(self, 0)
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
r_ = RClass()
|
|
368
|
+
|
|
369
|
+
|
|
370
|
+
class CClass(AxisConcatenator):
|
|
371
|
+
"""
|
|
372
|
+
Translates slice objects to concatenation along the second axis.
|
|
373
|
+
|
|
374
|
+
This is short-hand for ``mt.r_['-1,2,0', index expression]``, which is
|
|
375
|
+
useful because of its common occurrence. In particular, tensors will be
|
|
376
|
+
stacked along their last axis after being upgraded to at least 2-D with
|
|
377
|
+
1's post-pended to the shape (column vectors made out of 1-D tensors).
|
|
378
|
+
|
|
379
|
+
See Also
|
|
380
|
+
--------
|
|
381
|
+
column_stack : Stack 1-D tensors as columns into a 2-D tensor.
|
|
382
|
+
r_ : For more detailed documentation.
|
|
383
|
+
|
|
384
|
+
Examples
|
|
385
|
+
--------
|
|
386
|
+
>>> import maxframe.tensor as mt
|
|
387
|
+
|
|
388
|
+
>>> mt.c_[mt.array([1,2,3]), mt.array([4,5,6])].execute()
|
|
389
|
+
array([[1, 4],
|
|
390
|
+
[2, 5],
|
|
391
|
+
[3, 6]])
|
|
392
|
+
>>> mt.c_[mt.array([[1,2,3]]), 0, 0, mt.array([[4,5,6]])].execute()
|
|
393
|
+
array([[1, 2, 3, ..., 4, 5, 6]])
|
|
394
|
+
|
|
395
|
+
"""
|
|
396
|
+
|
|
397
|
+
def __init__(self):
|
|
398
|
+
AxisConcatenator.__init__(self, -1, ndmin=2, trans1d=0)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
c_ = CClass()
|
|
402
|
+
|
|
403
|
+
|
|
404
|
+
__all__ = ["ndindex", "mgrid", "ogrid", "r_", "c_"]
|
|
@@ -0,0 +1,36 @@
|
|
|
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 .dot import TensorDot, dot
|
|
16
|
+
from .inner import inner, innerproduct
|
|
17
|
+
from .inv import TensorInv, inv
|
|
18
|
+
from .lu import TensorLU, lu
|
|
19
|
+
from .matmul import TensorMatmul, matmul
|
|
20
|
+
from .qr import TensorQR, qr
|
|
21
|
+
from .solve_triangular import TensorSolveTriangular, solve_triangular
|
|
22
|
+
from .svd import TensorSVD, svd
|
|
23
|
+
from .tensordot import TensorTensorDot, tensordot
|
|
24
|
+
from .vdot import vdot
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _install():
|
|
28
|
+
from ..core import Tensor, TensorData
|
|
29
|
+
|
|
30
|
+
for cls in (Tensor, TensorData):
|
|
31
|
+
setattr(cls, "__matmul__", matmul)
|
|
32
|
+
setattr(cls, "dot", dot)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
_install()
|
|
36
|
+
del _install
|
|
@@ -0,0 +1,145 @@
|
|
|
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
|
+
from ... import opcodes
|
|
18
|
+
from ...core import EntityData
|
|
19
|
+
from ...serialization.serializables import KeyField
|
|
20
|
+
from ..core import Tensor, TensorOrder
|
|
21
|
+
from ..datasource import tensor as astensor
|
|
22
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
23
|
+
from .tensordot import tensordot
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class TensorDot(TensorOperator, TensorOperatorMixin):
|
|
27
|
+
_op_type_ = opcodes.DOT
|
|
28
|
+
|
|
29
|
+
a = KeyField("a")
|
|
30
|
+
b = KeyField("b")
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def _set_inputs(cls, op: "TensorDot", inputs: List[EntityData]):
|
|
34
|
+
super()._set_inputs(op, inputs)
|
|
35
|
+
op.a, op.b = op._inputs
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def dot(a, b, out=None, sparse=None):
|
|
39
|
+
"""
|
|
40
|
+
Dot product of two arrays. Specifically,
|
|
41
|
+
|
|
42
|
+
- If both `a` and `b` are 1-D arrays, it is inner product of vectors
|
|
43
|
+
(without complex conjugation).
|
|
44
|
+
|
|
45
|
+
- If both `a` and `b` are 2-D arrays, it is matrix multiplication,
|
|
46
|
+
but using :func:`matmul` or ``a @ b`` is preferred.
|
|
47
|
+
|
|
48
|
+
- If either `a` or `b` is 0-D (scalar), it is equivalent to :func:`multiply`
|
|
49
|
+
and using ``numpy.multiply(a, b)`` or ``a * b`` is preferred.
|
|
50
|
+
|
|
51
|
+
- If `a` is an N-D array and `b` is a 1-D array, it is a sum product over
|
|
52
|
+
the last axis of `a` and `b`.
|
|
53
|
+
|
|
54
|
+
- If `a` is an N-D array and `b` is an M-D array (where ``M>=2``), it is a
|
|
55
|
+
sum product over the last axis of `a` and the second-to-last axis of `b`::
|
|
56
|
+
|
|
57
|
+
dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])
|
|
58
|
+
|
|
59
|
+
Parameters
|
|
60
|
+
----------
|
|
61
|
+
a : array_like
|
|
62
|
+
First argument.
|
|
63
|
+
b : array_like
|
|
64
|
+
Second argument.
|
|
65
|
+
out : Tensor, optional
|
|
66
|
+
Output argument. This must have the exact kind that would be returned
|
|
67
|
+
if it was not used. In particular, it must have the right type, must be
|
|
68
|
+
C-contiguous, and its dtype must be the dtype that would be returned
|
|
69
|
+
for `dot(a,b)`. This is a performance feature. Therefore, if these
|
|
70
|
+
conditions are not met, an exception is raised, instead of attempting
|
|
71
|
+
to be flexible.
|
|
72
|
+
|
|
73
|
+
Returns
|
|
74
|
+
-------
|
|
75
|
+
output : Tensor
|
|
76
|
+
Returns the dot product of `a` and `b`. If `a` and `b` are both
|
|
77
|
+
scalars or both 1-D arrays then a scalar is returned; otherwise
|
|
78
|
+
a tensor is returned.
|
|
79
|
+
If `out` is given, then it is returned.
|
|
80
|
+
|
|
81
|
+
Raises
|
|
82
|
+
------
|
|
83
|
+
ValueError
|
|
84
|
+
If the last dimension of `a` is not the same size as
|
|
85
|
+
the second-to-last dimension of `b`.
|
|
86
|
+
|
|
87
|
+
See Also
|
|
88
|
+
--------
|
|
89
|
+
vdot : Complex-conjugating dot product.
|
|
90
|
+
tensordot : Sum products over arbitrary axes.
|
|
91
|
+
einsum : Einstein summation convention.
|
|
92
|
+
matmul : '@' operator as method with out parameter.
|
|
93
|
+
|
|
94
|
+
Examples
|
|
95
|
+
--------
|
|
96
|
+
>>> import maxframe.tensor as mt
|
|
97
|
+
|
|
98
|
+
>>> mt.dot(3, 4).execute()
|
|
99
|
+
12
|
|
100
|
+
|
|
101
|
+
Neither argument is complex-conjugated:
|
|
102
|
+
|
|
103
|
+
>>> mt.dot([2j, 3j], [2j, 3j]).execute()
|
|
104
|
+
(-13+0j)
|
|
105
|
+
|
|
106
|
+
For 2-D arrays it is the matrix product:
|
|
107
|
+
|
|
108
|
+
>>> a = [[1, 0], [0, 1]]
|
|
109
|
+
>>> b = [[4, 1], [2, 2]]
|
|
110
|
+
>>> mt.dot(a, b).execute()
|
|
111
|
+
array([[4, 1],
|
|
112
|
+
[2, 2]])
|
|
113
|
+
|
|
114
|
+
>>> a = mt.arange(3*4*5*6).reshape((3,4,5,6))
|
|
115
|
+
>>> b = mt.arange(3*4*5*6)[::-1].reshape((5,4,6,3))
|
|
116
|
+
>>> mt.dot(a, b)[2,3,2,1,2,2].execute()
|
|
117
|
+
499128
|
|
118
|
+
>>> mt.sum(a[2,3,2,:] * b[1,2,:,2]).execute()
|
|
119
|
+
499128
|
|
120
|
+
"""
|
|
121
|
+
a, b = astensor(a), astensor(b)
|
|
122
|
+
if a.isscalar() and b.isscalar():
|
|
123
|
+
ret = a * b
|
|
124
|
+
else:
|
|
125
|
+
ret = tensordot(a, b, axes=((a.ndim - 1,), (b.ndim - 2,)), sparse=sparse)
|
|
126
|
+
|
|
127
|
+
if out is None:
|
|
128
|
+
return ret
|
|
129
|
+
|
|
130
|
+
# set to out
|
|
131
|
+
if not isinstance(out, Tensor):
|
|
132
|
+
raise TypeError(f"`out` must be a Tensor, got {type(out)} instead")
|
|
133
|
+
if out.shape != ret.shape:
|
|
134
|
+
raise ValueError("output tensor has wrong dimensions")
|
|
135
|
+
if not (
|
|
136
|
+
out.dtype == ret.dtype
|
|
137
|
+
and out.ndim == ret.ndim
|
|
138
|
+
and out.order == TensorOrder.C_ORDER
|
|
139
|
+
):
|
|
140
|
+
raise ValueError(
|
|
141
|
+
"output tensor is not acceptable "
|
|
142
|
+
"(must have the right datatype, number of dimensions and be a C-Tensor"
|
|
143
|
+
)
|
|
144
|
+
out.data = ret.astype(out.dtype, order=out.order.value, copy=False).data
|
|
145
|
+
return out
|
|
@@ -0,0 +1,36 @@
|
|
|
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 ..datasource import tensor as astensor
|
|
16
|
+
from .tensordot import tensordot
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def inner(a, b, sparse=None):
|
|
20
|
+
"""
|
|
21
|
+
Returns the inner product of a and b for arrays of floating point types.
|
|
22
|
+
|
|
23
|
+
Like the generic NumPy equivalent the product sum is over the last dimension
|
|
24
|
+
of a and b. The first argument is not conjugated.
|
|
25
|
+
|
|
26
|
+
"""
|
|
27
|
+
a, b = astensor(a), astensor(b)
|
|
28
|
+
if a.isscalar() and b.isscalar():
|
|
29
|
+
ret = a * b
|
|
30
|
+
else:
|
|
31
|
+
ret = tensordot(a, b, axes=(-1, -1), sparse=sparse)
|
|
32
|
+
|
|
33
|
+
return ret
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
innerproduct = inner
|
|
@@ -0,0 +1,83 @@
|
|
|
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 TensorOrder
|
|
20
|
+
from ..datasource import tensor as astensor
|
|
21
|
+
from ..operators import TensorHasInput, TensorOperatorMixin
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class TensorInv(TensorHasInput, TensorOperatorMixin):
|
|
25
|
+
_op_type_ = opcodes.INV
|
|
26
|
+
|
|
27
|
+
def __call__(self, a):
|
|
28
|
+
a = astensor(a)
|
|
29
|
+
return self.new_tensor([a], a.shape, order=TensorOrder.C_ORDER)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def inv(a, sparse=None):
|
|
33
|
+
"""
|
|
34
|
+
Compute the (multiplicative) inverse of a matrix.
|
|
35
|
+
Given a square matrix `a`, return the matrix `ainv` satisfying
|
|
36
|
+
``dot(a, ainv) = dot(ainv, a) = eye(a.shape[0])``.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
a : (..., M, M) array_like
|
|
41
|
+
Matrix to be inverted.
|
|
42
|
+
sparse: bool, optional
|
|
43
|
+
Return sparse value or not.
|
|
44
|
+
|
|
45
|
+
Returns
|
|
46
|
+
-------
|
|
47
|
+
ainv : (..., M, M) ndarray or matrix
|
|
48
|
+
(Multiplicative) inverse of the matrix `a`.
|
|
49
|
+
|
|
50
|
+
Raises
|
|
51
|
+
------
|
|
52
|
+
LinAlgError
|
|
53
|
+
If `a` is not square or inversion fails.
|
|
54
|
+
|
|
55
|
+
Examples
|
|
56
|
+
--------
|
|
57
|
+
>>> import maxframe.tensor as mt
|
|
58
|
+
>>> a = np.array([[1., 2.], [3., 4.]])
|
|
59
|
+
>>> ainv = mt.linalg.inv(a)
|
|
60
|
+
>>> mt.allclose(mt.dot(a, ainv), mt.eye(2)).execute()
|
|
61
|
+
True
|
|
62
|
+
|
|
63
|
+
>>> mt.allclose(mt.dot(ainv, a), mt.eye(2)).execute()
|
|
64
|
+
True
|
|
65
|
+
|
|
66
|
+
>>> ainv.execute()
|
|
67
|
+
array([[ -2. , 1. ],
|
|
68
|
+
[ 1.5, -0.5]])
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
# TODO: using some parallel algorithm for matrix inversion.
|
|
72
|
+
a = astensor(a)
|
|
73
|
+
if a.ndim != 2:
|
|
74
|
+
raise LinAlgError(
|
|
75
|
+
f"{a.ndim}-dimensional array given. Tensor must be two-dimensional"
|
|
76
|
+
)
|
|
77
|
+
if a.shape[0] != a.shape[1]:
|
|
78
|
+
raise LinAlgError("Input must be square")
|
|
79
|
+
|
|
80
|
+
tiny_inv = np.linalg.inv(np.array([[1, 2], [2, 5]], dtype=a.dtype))
|
|
81
|
+
sparse = sparse if sparse is not None else a.issparse()
|
|
82
|
+
op = TensorInv(dtype=tiny_inv.dtype, sparse=sparse)
|
|
83
|
+
return op(a)
|