maxframe 2.0.0b2__cp37-cp37m-win32.whl → 2.3.0rc1__cp37-cp37m-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/__init__.py +1 -0
- maxframe/_utils.cp37-win32.pyd +0 -0
- maxframe/_utils.pyx +14 -1
- maxframe/codegen/core.py +9 -8
- maxframe/codegen/spe/core.py +1 -1
- maxframe/codegen/spe/dataframe/__init__.py +1 -0
- maxframe/codegen/spe/dataframe/accessors/base.py +18 -0
- maxframe/codegen/spe/dataframe/accessors/dict_.py +25 -130
- maxframe/codegen/spe/dataframe/accessors/list_.py +12 -48
- maxframe/codegen/spe/dataframe/accessors/struct_.py +28 -0
- maxframe/codegen/spe/dataframe/arithmetic.py +7 -2
- maxframe/codegen/spe/dataframe/groupby.py +88 -0
- maxframe/codegen/spe/dataframe/indexing.py +99 -4
- maxframe/codegen/spe/dataframe/merge.py +38 -1
- maxframe/codegen/spe/dataframe/misc.py +11 -33
- maxframe/codegen/spe/dataframe/reduction.py +32 -9
- maxframe/codegen/spe/dataframe/reshape.py +46 -0
- maxframe/codegen/spe/dataframe/sort.py +39 -18
- maxframe/codegen/spe/dataframe/tests/accessors/test_dict.py +9 -15
- maxframe/codegen/spe/dataframe/tests/accessors/test_list.py +4 -7
- maxframe/codegen/spe/dataframe/tests/accessors/test_struct.py +75 -0
- maxframe/codegen/spe/dataframe/tests/indexing/test_iloc.py +20 -1
- maxframe/codegen/spe/dataframe/tests/indexing/test_loc.py +35 -0
- maxframe/codegen/spe/dataframe/tests/misc/test_misc.py +0 -32
- maxframe/codegen/spe/dataframe/tests/test_groupby.py +81 -18
- maxframe/codegen/spe/dataframe/tests/test_merge.py +27 -1
- maxframe/codegen/spe/dataframe/tests/test_reduction.py +13 -0
- maxframe/codegen/spe/dataframe/tests/test_reshape.py +79 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
- maxframe/codegen/spe/dataframe/tseries.py +9 -0
- maxframe/codegen/spe/learn/contrib/lightgbm.py +4 -3
- maxframe/codegen/spe/learn/contrib/tests/test_xgboost.py +2 -1
- maxframe/codegen/spe/learn/metrics/__init__.py +1 -1
- maxframe/codegen/spe/learn/metrics/_ranking.py +76 -0
- maxframe/codegen/spe/learn/metrics/pairwise.py +51 -0
- maxframe/codegen/spe/learn/metrics/tests/test_pairwise.py +36 -0
- maxframe/codegen/spe/learn/metrics/tests/test_ranking.py +59 -0
- maxframe/codegen/spe/tensor/__init__.py +3 -0
- maxframe/codegen/spe/tensor/datasource.py +1 -0
- maxframe/codegen/spe/tensor/fft.py +74 -0
- maxframe/codegen/spe/tensor/linalg.py +29 -2
- maxframe/codegen/spe/tensor/misc.py +79 -25
- maxframe/codegen/spe/tensor/spatial.py +45 -0
- maxframe/codegen/spe/tensor/statistics.py +44 -0
- maxframe/codegen/spe/tensor/tests/test_fft.py +64 -0
- maxframe/codegen/spe/tensor/tests/test_linalg.py +15 -1
- maxframe/codegen/spe/tensor/tests/test_misc.py +52 -2
- maxframe/codegen/spe/tensor/tests/test_spatial.py +33 -0
- maxframe/codegen/spe/tensor/tests/test_statistics.py +15 -1
- maxframe/codegen/spe/tests/test_spe_codegen.py +6 -12
- maxframe/codegen/spe/utils.py +2 -0
- maxframe/config/config.py +73 -9
- maxframe/config/tests/test_validators.py +13 -1
- maxframe/config/validators.py +49 -0
- maxframe/conftest.py +54 -17
- maxframe/core/accessor.py +2 -2
- maxframe/core/base.py +2 -1
- maxframe/core/entity/core.py +5 -0
- maxframe/core/entity/tileables.py +3 -1
- maxframe/core/graph/core.cp37-win32.pyd +0 -0
- maxframe/core/graph/entity.py +8 -3
- maxframe/core/mode.py +6 -1
- maxframe/core/operator/base.py +9 -2
- maxframe/core/operator/core.py +10 -2
- maxframe/core/operator/utils.py +13 -0
- maxframe/dataframe/__init__.py +12 -5
- maxframe/dataframe/accessors/__init__.py +1 -1
- maxframe/dataframe/accessors/compat.py +45 -0
- maxframe/dataframe/accessors/datetime_/__init__.py +4 -1
- maxframe/dataframe/accessors/dict_/contains.py +7 -16
- maxframe/dataframe/accessors/dict_/core.py +48 -0
- maxframe/dataframe/accessors/dict_/getitem.py +17 -21
- maxframe/dataframe/accessors/dict_/length.py +7 -16
- maxframe/dataframe/accessors/dict_/remove.py +6 -18
- maxframe/dataframe/accessors/dict_/setitem.py +8 -18
- maxframe/dataframe/accessors/dict_/tests/test_dict_accessor.py +62 -22
- maxframe/dataframe/accessors/list_/__init__.py +2 -2
- maxframe/dataframe/accessors/list_/core.py +48 -0
- maxframe/dataframe/accessors/list_/getitem.py +12 -19
- maxframe/dataframe/accessors/list_/length.py +7 -16
- maxframe/dataframe/accessors/list_/tests/test_list_accessor.py +11 -9
- maxframe/dataframe/accessors/string_/__init__.py +4 -1
- maxframe/dataframe/accessors/struct_/__init__.py +37 -0
- maxframe/dataframe/accessors/struct_/accessor.py +39 -0
- maxframe/dataframe/accessors/struct_/core.py +43 -0
- maxframe/dataframe/accessors/struct_/dtypes.py +53 -0
- maxframe/dataframe/accessors/struct_/field.py +123 -0
- maxframe/dataframe/accessors/struct_/tests/__init__.py +13 -0
- maxframe/dataframe/accessors/struct_/tests/test_struct_accessor.py +91 -0
- maxframe/dataframe/arithmetic/__init__.py +18 -4
- maxframe/dataframe/arithmetic/between.py +106 -0
- maxframe/dataframe/arithmetic/dot.py +237 -0
- maxframe/dataframe/arithmetic/maximum.py +33 -0
- maxframe/dataframe/arithmetic/minimum.py +33 -0
- maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
- maxframe/dataframe/core.py +161 -224
- maxframe/dataframe/datasource/__init__.py +18 -0
- maxframe/dataframe/datasource/core.py +6 -0
- maxframe/dataframe/datasource/direct.py +57 -0
- maxframe/dataframe/datasource/from_dict.py +124 -0
- maxframe/dataframe/datasource/from_index.py +1 -1
- maxframe/dataframe/datasource/from_records.py +77 -0
- maxframe/dataframe/datasource/from_tensor.py +109 -41
- maxframe/dataframe/datasource/read_csv.py +21 -14
- maxframe/dataframe/datasource/read_odps_query.py +29 -6
- maxframe/dataframe/datasource/read_odps_table.py +32 -10
- maxframe/dataframe/datasource/read_parquet.py +38 -39
- maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
- maxframe/dataframe/datastore/__init__.py +11 -1
- maxframe/dataframe/datastore/direct.py +268 -0
- maxframe/dataframe/datastore/to_csv.py +29 -41
- maxframe/dataframe/datastore/to_odps.py +36 -4
- maxframe/dataframe/extensions/__init__.py +20 -4
- maxframe/dataframe/extensions/apply_chunk.py +32 -6
- maxframe/dataframe/extensions/cartesian_chunk.py +153 -0
- maxframe/dataframe/extensions/collect_kv.py +126 -0
- maxframe/dataframe/extensions/extract_kv.py +177 -0
- maxframe/dataframe/extensions/flatjson.py +2 -1
- maxframe/dataframe/extensions/map_reduce.py +263 -0
- maxframe/dataframe/extensions/rebalance.py +62 -0
- maxframe/dataframe/extensions/tests/test_apply_chunk.py +9 -2
- maxframe/dataframe/extensions/tests/test_extensions.py +54 -0
- maxframe/dataframe/extensions/tests/test_map_reduce.py +135 -0
- maxframe/dataframe/groupby/__init__.py +17 -2
- maxframe/dataframe/groupby/aggregation.py +86 -49
- maxframe/dataframe/groupby/apply.py +1 -1
- maxframe/dataframe/groupby/apply_chunk.py +19 -5
- maxframe/dataframe/groupby/core.py +116 -16
- maxframe/dataframe/groupby/cum.py +4 -25
- maxframe/dataframe/groupby/expanding.py +264 -0
- maxframe/dataframe/groupby/fill.py +1 -1
- maxframe/dataframe/groupby/getitem.py +12 -5
- maxframe/dataframe/groupby/head.py +11 -1
- maxframe/dataframe/groupby/rank.py +136 -0
- maxframe/dataframe/groupby/rolling.py +206 -0
- maxframe/dataframe/groupby/shift.py +114 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +0 -5
- maxframe/dataframe/indexing/__init__.py +22 -2
- maxframe/dataframe/indexing/droplevel.py +195 -0
- maxframe/dataframe/indexing/filter.py +169 -0
- maxframe/dataframe/indexing/get_level_values.py +76 -0
- maxframe/dataframe/indexing/iat.py +45 -0
- maxframe/dataframe/indexing/iloc.py +152 -12
- maxframe/dataframe/indexing/insert.py +46 -18
- maxframe/dataframe/indexing/loc.py +287 -7
- maxframe/dataframe/indexing/reindex.py +14 -5
- maxframe/dataframe/indexing/rename.py +6 -0
- maxframe/dataframe/indexing/rename_axis.py +2 -2
- maxframe/dataframe/indexing/reorder_levels.py +143 -0
- maxframe/dataframe/indexing/reset_index.py +33 -6
- maxframe/dataframe/indexing/sample.py +8 -0
- maxframe/dataframe/indexing/setitem.py +3 -3
- maxframe/dataframe/indexing/swaplevel.py +185 -0
- maxframe/dataframe/indexing/take.py +99 -0
- maxframe/dataframe/indexing/truncate.py +140 -0
- maxframe/dataframe/indexing/where.py +0 -11
- maxframe/dataframe/indexing/xs.py +148 -0
- maxframe/dataframe/merge/__init__.py +15 -1
- maxframe/dataframe/merge/append.py +97 -98
- maxframe/dataframe/merge/combine.py +244 -0
- maxframe/dataframe/merge/combine_first.py +120 -0
- maxframe/dataframe/merge/compare.py +387 -0
- maxframe/dataframe/merge/concat.py +183 -0
- maxframe/dataframe/merge/update.py +271 -0
- maxframe/dataframe/misc/__init__.py +28 -11
- maxframe/dataframe/misc/_duplicate.py +10 -4
- maxframe/dataframe/misc/apply.py +1 -1
- maxframe/dataframe/misc/check_unique.py +82 -0
- maxframe/dataframe/misc/clip.py +145 -0
- maxframe/dataframe/misc/describe.py +175 -9
- maxframe/dataframe/misc/drop.py +31 -0
- maxframe/dataframe/misc/drop_duplicates.py +2 -2
- maxframe/dataframe/misc/duplicated.py +2 -2
- maxframe/dataframe/misc/get_dummies.py +5 -1
- maxframe/dataframe/misc/infer_dtypes.py +251 -0
- maxframe/dataframe/misc/isin.py +2 -2
- maxframe/dataframe/misc/map.py +125 -18
- maxframe/dataframe/misc/repeat.py +159 -0
- maxframe/dataframe/misc/tests/test_misc.py +48 -3
- maxframe/dataframe/misc/to_numeric.py +3 -0
- maxframe/dataframe/misc/transform.py +12 -5
- maxframe/dataframe/misc/transpose.py +13 -1
- maxframe/dataframe/misc/valid_index.py +115 -0
- maxframe/dataframe/misc/value_counts.py +38 -4
- maxframe/dataframe/missing/checkna.py +14 -6
- maxframe/dataframe/missing/dropna.py +5 -0
- maxframe/dataframe/missing/fillna.py +1 -1
- maxframe/dataframe/missing/replace.py +7 -4
- maxframe/dataframe/reduction/__init__.py +35 -16
- maxframe/dataframe/reduction/aggregation.py +43 -14
- maxframe/dataframe/reduction/all.py +2 -2
- maxframe/dataframe/reduction/any.py +2 -2
- maxframe/dataframe/reduction/argmax.py +103 -0
- maxframe/dataframe/reduction/argmin.py +103 -0
- maxframe/dataframe/reduction/core.py +80 -24
- maxframe/dataframe/reduction/count.py +13 -9
- maxframe/dataframe/reduction/cov.py +166 -0
- maxframe/dataframe/reduction/cummax.py +2 -2
- maxframe/dataframe/reduction/cummin.py +2 -2
- maxframe/dataframe/reduction/cumprod.py +2 -2
- maxframe/dataframe/reduction/cumsum.py +2 -2
- maxframe/dataframe/reduction/custom_reduction.py +2 -2
- maxframe/dataframe/reduction/idxmax.py +185 -0
- maxframe/dataframe/reduction/idxmin.py +185 -0
- maxframe/dataframe/reduction/kurtosis.py +37 -30
- maxframe/dataframe/reduction/max.py +2 -2
- maxframe/dataframe/reduction/mean.py +9 -7
- maxframe/dataframe/reduction/median.py +2 -2
- maxframe/dataframe/reduction/min.py +2 -2
- maxframe/dataframe/reduction/mode.py +144 -0
- maxframe/dataframe/reduction/nunique.py +19 -11
- maxframe/dataframe/reduction/prod.py +18 -13
- maxframe/dataframe/reduction/reduction_size.py +2 -2
- maxframe/dataframe/reduction/sem.py +13 -9
- maxframe/dataframe/reduction/skew.py +31 -27
- maxframe/dataframe/reduction/str_concat.py +10 -7
- maxframe/dataframe/reduction/sum.py +18 -14
- maxframe/dataframe/reduction/tests/test_reduction.py +12 -0
- maxframe/dataframe/reduction/unique.py +20 -3
- maxframe/dataframe/reduction/var.py +16 -12
- maxframe/dataframe/reshape/__init__.py +38 -0
- maxframe/dataframe/{misc → reshape}/pivot.py +1 -0
- maxframe/dataframe/{misc → reshape}/pivot_table.py +1 -0
- maxframe/dataframe/reshape/unstack.py +114 -0
- maxframe/dataframe/sort/__init__.py +16 -1
- maxframe/dataframe/sort/argsort.py +68 -0
- maxframe/dataframe/sort/core.py +2 -1
- maxframe/dataframe/sort/nlargest.py +238 -0
- maxframe/dataframe/sort/nsmallest.py +228 -0
- maxframe/dataframe/sort/rank.py +147 -0
- maxframe/dataframe/statistics/__init__.py +3 -3
- maxframe/dataframe/statistics/corr.py +1 -0
- maxframe/dataframe/statistics/quantile.py +2 -2
- maxframe/dataframe/tests/test_typing.py +104 -0
- maxframe/dataframe/tests/test_utils.py +66 -2
- maxframe/dataframe/tseries/__init__.py +19 -0
- maxframe/dataframe/tseries/at_time.py +61 -0
- maxframe/dataframe/tseries/between_time.py +122 -0
- maxframe/dataframe/typing_.py +185 -0
- maxframe/dataframe/utils.py +125 -52
- maxframe/dataframe/window/aggregation.py +8 -4
- maxframe/dataframe/window/core.py +14 -1
- maxframe/dataframe/window/ewm.py +1 -3
- maxframe/dataframe/window/expanding.py +37 -35
- maxframe/dataframe/window/rolling.py +49 -39
- maxframe/dataframe/window/tests/test_expanding.py +1 -7
- maxframe/dataframe/window/tests/test_rolling.py +1 -1
- maxframe/env.py +7 -4
- maxframe/errors.py +2 -2
- maxframe/io/odpsio/schema.py +9 -3
- maxframe/io/odpsio/tableio.py +7 -2
- maxframe/io/odpsio/tests/test_schema.py +198 -83
- maxframe/learn/__init__.py +10 -2
- maxframe/learn/cluster/__init__.py +15 -0
- maxframe/learn/cluster/_kmeans.py +782 -0
- maxframe/learn/contrib/llm/core.py +18 -7
- maxframe/learn/contrib/llm/deploy/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/config.py +221 -0
- maxframe/learn/contrib/llm/deploy/core.py +247 -0
- maxframe/learn/contrib/llm/deploy/framework.py +35 -0
- maxframe/learn/contrib/llm/deploy/loader.py +360 -0
- maxframe/learn/contrib/llm/deploy/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/deploy/tests/test_register_models.py +359 -0
- maxframe/learn/contrib/llm/models/__init__.py +1 -0
- maxframe/learn/contrib/llm/models/dashscope.py +12 -6
- maxframe/learn/contrib/llm/models/managed.py +76 -11
- maxframe/learn/contrib/llm/models/openai.py +72 -0
- maxframe/learn/contrib/llm/tests/__init__.py +13 -0
- maxframe/learn/contrib/llm/tests/test_core.py +34 -0
- maxframe/learn/contrib/llm/tests/test_openai.py +187 -0
- maxframe/learn/contrib/llm/tests/test_text_gen.py +155 -0
- maxframe/learn/contrib/llm/text.py +348 -42
- maxframe/learn/contrib/models.py +4 -1
- maxframe/learn/contrib/xgboost/classifier.py +2 -0
- maxframe/learn/contrib/xgboost/core.py +113 -4
- maxframe/learn/contrib/xgboost/predict.py +4 -2
- maxframe/learn/contrib/xgboost/regressor.py +5 -0
- maxframe/learn/contrib/xgboost/train.py +7 -2
- maxframe/learn/core.py +66 -0
- maxframe/learn/linear_model/_base.py +58 -1
- maxframe/learn/linear_model/_lin_reg.py +1 -1
- maxframe/learn/metrics/__init__.py +6 -0
- maxframe/learn/metrics/_classification.py +145 -0
- maxframe/learn/metrics/_ranking.py +477 -0
- maxframe/learn/metrics/_scorer.py +60 -0
- maxframe/learn/metrics/pairwise/__init__.py +21 -0
- maxframe/learn/metrics/pairwise/core.py +77 -0
- maxframe/learn/metrics/pairwise/cosine.py +115 -0
- maxframe/learn/metrics/pairwise/euclidean.py +176 -0
- maxframe/learn/metrics/pairwise/haversine.py +96 -0
- maxframe/learn/metrics/pairwise/manhattan.py +80 -0
- maxframe/learn/metrics/pairwise/pairwise.py +127 -0
- maxframe/learn/metrics/pairwise/pairwise_distances_topk.py +121 -0
- maxframe/learn/metrics/pairwise/rbf_kernel.py +51 -0
- maxframe/learn/metrics/tests/__init__.py +13 -0
- maxframe/learn/metrics/tests/test_scorer.py +26 -0
- maxframe/learn/preprocessing/_data/min_max_scaler.py +34 -23
- maxframe/learn/preprocessing/_data/standard_scaler.py +34 -25
- maxframe/learn/utils/__init__.py +2 -1
- maxframe/learn/utils/checks.py +1 -2
- maxframe/learn/utils/core.py +59 -0
- maxframe/learn/utils/extmath.py +79 -9
- maxframe/learn/utils/odpsio.py +262 -0
- maxframe/learn/utils/validation.py +2 -2
- maxframe/lib/compat.py +40 -0
- maxframe/lib/dtypes_extension/__init__.py +16 -1
- maxframe/lib/dtypes_extension/_fake_arrow_dtype.py +604 -0
- maxframe/lib/dtypes_extension/blob.py +304 -0
- maxframe/lib/dtypes_extension/dtypes.py +40 -0
- maxframe/lib/dtypes_extension/tests/test_blob.py +88 -0
- maxframe/lib/dtypes_extension/tests/test_dtypes.py +16 -1
- maxframe/lib/dtypes_extension/tests/test_fake_arrow_dtype.py +75 -0
- maxframe/lib/filesystem/_oss_lib/common.py +124 -50
- maxframe/lib/filesystem/_oss_lib/glob.py +1 -1
- maxframe/lib/filesystem/_oss_lib/handle.py +21 -25
- maxframe/lib/filesystem/base.py +1 -1
- maxframe/lib/filesystem/core.py +1 -1
- maxframe/lib/filesystem/oss.py +115 -46
- maxframe/lib/filesystem/tests/test_oss.py +74 -36
- maxframe/lib/mmh3.cp37-win32.pyd +0 -0
- maxframe/lib/wrapped_pickle.py +10 -0
- maxframe/opcodes.py +41 -15
- maxframe/protocol.py +12 -0
- maxframe/remote/core.py +4 -0
- maxframe/serialization/__init__.py +11 -2
- maxframe/serialization/arrow.py +38 -13
- maxframe/serialization/blob.py +32 -0
- maxframe/serialization/core.cp37-win32.pyd +0 -0
- maxframe/serialization/core.pyx +39 -1
- maxframe/serialization/exception.py +2 -4
- maxframe/serialization/numpy.py +11 -0
- maxframe/serialization/pandas.py +46 -9
- maxframe/serialization/serializables/core.py +2 -2
- maxframe/serialization/tests/test_serial.py +31 -4
- maxframe/tensor/__init__.py +38 -8
- maxframe/tensor/arithmetic/__init__.py +19 -10
- maxframe/tensor/arithmetic/core.py +2 -2
- maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -9
- maxframe/tensor/core.py +6 -2
- maxframe/tensor/datasource/tests/test_datasource.py +2 -1
- maxframe/tensor/extensions/__init__.py +2 -0
- maxframe/tensor/extensions/apply_chunk.py +3 -3
- maxframe/tensor/extensions/rebalance.py +65 -0
- maxframe/tensor/fft/__init__.py +32 -0
- maxframe/tensor/fft/core.py +168 -0
- maxframe/tensor/fft/fft.py +112 -0
- maxframe/tensor/fft/fft2.py +118 -0
- maxframe/tensor/fft/fftfreq.py +80 -0
- maxframe/tensor/fft/fftn.py +123 -0
- maxframe/tensor/fft/fftshift.py +79 -0
- maxframe/tensor/fft/hfft.py +112 -0
- maxframe/tensor/fft/ifft.py +114 -0
- maxframe/tensor/fft/ifft2.py +115 -0
- maxframe/tensor/fft/ifftn.py +123 -0
- maxframe/tensor/fft/ifftshift.py +73 -0
- maxframe/tensor/fft/ihfft.py +93 -0
- maxframe/tensor/fft/irfft.py +118 -0
- maxframe/tensor/fft/irfft2.py +62 -0
- maxframe/tensor/fft/irfftn.py +114 -0
- maxframe/tensor/fft/rfft.py +116 -0
- maxframe/tensor/fft/rfft2.py +63 -0
- maxframe/tensor/fft/rfftfreq.py +87 -0
- maxframe/tensor/fft/rfftn.py +113 -0
- maxframe/tensor/indexing/fill_diagonal.py +1 -7
- maxframe/tensor/linalg/__init__.py +7 -0
- maxframe/tensor/linalg/_einsumfunc.py +1025 -0
- maxframe/tensor/linalg/cholesky.py +117 -0
- maxframe/tensor/linalg/einsum.py +339 -0
- maxframe/tensor/linalg/lstsq.py +100 -0
- maxframe/tensor/linalg/matrix_norm.py +75 -0
- maxframe/tensor/linalg/norm.py +249 -0
- maxframe/tensor/linalg/solve.py +72 -0
- maxframe/tensor/linalg/solve_triangular.py +2 -2
- maxframe/tensor/linalg/vector_norm.py +113 -0
- maxframe/tensor/misc/__init__.py +24 -1
- maxframe/tensor/misc/argwhere.py +72 -0
- maxframe/tensor/misc/array_split.py +46 -0
- maxframe/tensor/misc/broadcast_arrays.py +57 -0
- maxframe/tensor/misc/copyto.py +130 -0
- maxframe/tensor/misc/delete.py +104 -0
- maxframe/tensor/misc/dsplit.py +68 -0
- maxframe/tensor/misc/ediff1d.py +74 -0
- maxframe/tensor/misc/expand_dims.py +85 -0
- maxframe/tensor/misc/flip.py +90 -0
- maxframe/tensor/misc/fliplr.py +64 -0
- maxframe/tensor/misc/flipud.py +68 -0
- maxframe/tensor/misc/hsplit.py +85 -0
- maxframe/tensor/misc/insert.py +139 -0
- maxframe/tensor/misc/moveaxis.py +83 -0
- maxframe/tensor/misc/result_type.py +88 -0
- maxframe/tensor/misc/roll.py +124 -0
- maxframe/tensor/misc/rollaxis.py +77 -0
- maxframe/tensor/misc/shape.py +89 -0
- maxframe/tensor/misc/split.py +190 -0
- maxframe/tensor/misc/tile.py +109 -0
- maxframe/tensor/misc/vsplit.py +74 -0
- maxframe/tensor/reduction/array_equal.py +2 -1
- maxframe/tensor/sort/__init__.py +2 -0
- maxframe/tensor/sort/argpartition.py +98 -0
- maxframe/tensor/sort/partition.py +228 -0
- maxframe/tensor/spatial/__init__.py +15 -0
- maxframe/tensor/spatial/distance/__init__.py +17 -0
- maxframe/tensor/spatial/distance/cdist.py +421 -0
- maxframe/tensor/spatial/distance/pdist.py +398 -0
- maxframe/tensor/spatial/distance/squareform.py +153 -0
- maxframe/tensor/special/__init__.py +159 -21
- maxframe/tensor/special/airy.py +55 -0
- maxframe/tensor/special/bessel.py +199 -0
- maxframe/tensor/special/core.py +65 -4
- maxframe/tensor/special/ellip_func_integrals.py +155 -0
- maxframe/tensor/special/ellip_harm.py +55 -0
- maxframe/tensor/special/err_fresnel.py +223 -0
- maxframe/tensor/special/gamma_funcs.py +303 -0
- maxframe/tensor/special/hypergeometric_funcs.py +69 -0
- maxframe/tensor/special/info_theory.py +189 -0
- maxframe/tensor/special/misc.py +21 -0
- maxframe/tensor/statistics/__init__.py +6 -0
- maxframe/tensor/statistics/corrcoef.py +77 -0
- maxframe/tensor/statistics/cov.py +222 -0
- maxframe/tensor/statistics/digitize.py +126 -0
- maxframe/tensor/statistics/histogram.py +520 -0
- maxframe/tensor/statistics/median.py +85 -0
- maxframe/tensor/statistics/ptp.py +89 -0
- maxframe/tensor/utils.py +3 -3
- maxframe/tests/test_udf.py +61 -0
- maxframe/tests/test_utils.py +51 -6
- maxframe/tests/utils.py +0 -2
- maxframe/typing_.py +2 -0
- maxframe/udf.py +130 -9
- maxframe/utils.py +254 -27
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/METADATA +3 -3
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/RECORD +442 -264
- maxframe_client/fetcher.py +35 -4
- maxframe_client/session/odps.py +7 -2
- maxframe_client/session/task.py +8 -1
- maxframe_client/tests/test_fetcher.py +76 -3
- maxframe_client/tests/test_session.py +28 -1
- maxframe/dataframe/arrays.py +0 -864
- /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
- /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/WHEEL +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.3.0rc1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,51 @@
|
|
|
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 .....learn.metrics.pairwise.cosine import CosineDistances
|
|
16
|
+
from .....learn.metrics.pairwise.euclidean import EuclideanDistances
|
|
17
|
+
from .....learn.metrics.pairwise.haversine import HaversineDistances
|
|
18
|
+
from .....learn.metrics.pairwise.manhattan import ManhattanDistances
|
|
19
|
+
from ...utils import build_method_call_adapter
|
|
20
|
+
|
|
21
|
+
CosineDistancesAdapter = build_method_call_adapter(
|
|
22
|
+
CosineDistances,
|
|
23
|
+
"cosine_distances",
|
|
24
|
+
"x",
|
|
25
|
+
"y",
|
|
26
|
+
source_module="sklearn.metrics.pairwise",
|
|
27
|
+
)
|
|
28
|
+
EuclideanDistancesAdapter = build_method_call_adapter(
|
|
29
|
+
EuclideanDistances,
|
|
30
|
+
"euclidean_distances",
|
|
31
|
+
"x",
|
|
32
|
+
"y",
|
|
33
|
+
y_norm_squared="Y_norm_squared",
|
|
34
|
+
squared="squared",
|
|
35
|
+
x_norm_squared="X_norm_squared",
|
|
36
|
+
source_module="sklearn.metrics.pairwise",
|
|
37
|
+
)
|
|
38
|
+
HaversineDistancesAdapter = build_method_call_adapter(
|
|
39
|
+
HaversineDistances,
|
|
40
|
+
"haversine_distances",
|
|
41
|
+
"x",
|
|
42
|
+
"y",
|
|
43
|
+
source_module="sklearn.metrics.pairwise",
|
|
44
|
+
)
|
|
45
|
+
ManhattanDistancesAdapter = build_method_call_adapter(
|
|
46
|
+
ManhattanDistances,
|
|
47
|
+
"manhattan_distances",
|
|
48
|
+
"x",
|
|
49
|
+
"y",
|
|
50
|
+
source_module="sklearn.metrics.pairwise",
|
|
51
|
+
)
|
|
@@ -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 ...... import tensor as mt
|
|
16
|
+
from ......learn.metrics.pairwise import euclidean_distances
|
|
17
|
+
from ....core import SPECodeContext
|
|
18
|
+
from ..pairwise import EuclideanDistancesAdapter
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_euclidean_distances():
|
|
22
|
+
x = mt.random.rand(10, 3)
|
|
23
|
+
|
|
24
|
+
d = euclidean_distances(
|
|
25
|
+
x,
|
|
26
|
+
X_norm_squared=mt.random.rand(10, 1),
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
adapter = EuclideanDistancesAdapter()
|
|
30
|
+
context = SPECodeContext()
|
|
31
|
+
results = adapter.generate_code(d.op, context)
|
|
32
|
+
expected_results = [
|
|
33
|
+
"var_0 = sklearn.metrics.pairwise.euclidean_distances("
|
|
34
|
+
"var_1, var_1, squared=False, X_norm_squared=var_2)"
|
|
35
|
+
]
|
|
36
|
+
assert results == expected_results
|
|
@@ -0,0 +1,59 @@
|
|
|
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 ...... import tensor as mt
|
|
16
|
+
from ......learn.metrics import auc, roc_auc_score, roc_curve
|
|
17
|
+
from ....core import SPECodeContext
|
|
18
|
+
from .._ranking import AucOpAdapter, RocAucScoreAdapter, RocCurveAdapter
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def test_auc():
|
|
22
|
+
t1 = mt.array([1, 1, 2, 2])
|
|
23
|
+
t2 = mt.array([0.1, 0.4, 0.35, 0.8])
|
|
24
|
+
result = auc(t1, t2)
|
|
25
|
+
|
|
26
|
+
adapter = AucOpAdapter()
|
|
27
|
+
context = SPECodeContext()
|
|
28
|
+
results = adapter.generate_code(result.op, context)
|
|
29
|
+
expected_results = ["var_2 = sk_auc(var_0, var_1)"]
|
|
30
|
+
assert results == expected_results
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def test_roc_auc_score():
|
|
34
|
+
t1 = mt.array([0, 0, 1, 1])
|
|
35
|
+
t2 = mt.array([0.1, 0.4, 0.35, 0.8])
|
|
36
|
+
result = roc_auc_score(t1, t2)
|
|
37
|
+
|
|
38
|
+
adapter = RocAucScoreAdapter()
|
|
39
|
+
context = SPECodeContext()
|
|
40
|
+
results = adapter.generate_code(result.op, context)
|
|
41
|
+
expected_results = [
|
|
42
|
+
"var_2 = sk_roc_auc_score("
|
|
43
|
+
"var_0, var_1, average='macro', multi_class='raise')"
|
|
44
|
+
]
|
|
45
|
+
assert results == expected_results
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_roc_curve():
|
|
49
|
+
t1 = mt.array([0, 0, 1, 1])
|
|
50
|
+
t2 = mt.array([0.1, 0.4, 0.35, 0.8])
|
|
51
|
+
result = roc_curve(t1, t2)
|
|
52
|
+
|
|
53
|
+
adapter = RocCurveAdapter()
|
|
54
|
+
context = SPECodeContext()
|
|
55
|
+
results = adapter.generate_code(result[0].op, context)
|
|
56
|
+
expected_results = [
|
|
57
|
+
"var_2, var_3, var_4 = sk_roc_curve(" "var_0, var_1, drop_intermediate=True)"
|
|
58
|
+
]
|
|
59
|
+
assert results == expected_results
|
|
@@ -0,0 +1,74 @@
|
|
|
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, Union
|
|
16
|
+
|
|
17
|
+
from ....tensor.fft import TensorFFTFreq, TensorRFFTFreq
|
|
18
|
+
from ....tensor.fft.core import TensorFFTMixin, TensorFFTNMixin, TensorFFTShiftMixin
|
|
19
|
+
from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@register_op_adapter(TensorFFTMixin)
|
|
23
|
+
class TensorFFTAdapter(SPEOperatorAdapter):
|
|
24
|
+
def generate_code(self, op: TensorFFTMixin, context: SPECodeContext) -> List[str]:
|
|
25
|
+
context.register_import("numpy", "np")
|
|
26
|
+
func_name = type(op).__name__.lower()[6:]
|
|
27
|
+
input_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
28
|
+
res_var_name = context.get_output_tileable_variable(op.outputs[0])
|
|
29
|
+
kw_str = self.generate_call_args_with_attributes(
|
|
30
|
+
op, context, kw_keys=["n", "axis", "norm"], skip_none=True
|
|
31
|
+
)
|
|
32
|
+
return [f"{res_var_name} = np.fft.{func_name}({input_var_name}, {kw_str})"]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@register_op_adapter(TensorFFTNMixin)
|
|
36
|
+
class TensorFFTNAdapter(SPEOperatorAdapter):
|
|
37
|
+
def generate_code(self, op: TensorFFTNMixin, context: SPECodeContext) -> List[str]:
|
|
38
|
+
context.register_import("numpy", "np")
|
|
39
|
+
func_name = type(op).__name__.lower()[6:]
|
|
40
|
+
input_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
41
|
+
res_var_name = context.get_output_tileable_variable(op.outputs[0])
|
|
42
|
+
kw_str = self.generate_call_args_with_attributes(
|
|
43
|
+
op, context, "shape", kw_keys=["axes", "norm"], skip_none=True
|
|
44
|
+
)
|
|
45
|
+
return [f"{res_var_name} = np.fft.{func_name}({input_var_name}, {kw_str})"]
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@register_op_adapter(TensorFFTShiftMixin)
|
|
49
|
+
class TensorFFTShiftAdapter(SPEOperatorAdapter):
|
|
50
|
+
def generate_code(
|
|
51
|
+
self, op: TensorFFTShiftMixin, context: SPECodeContext
|
|
52
|
+
) -> List[str]:
|
|
53
|
+
context.register_import("numpy", "np")
|
|
54
|
+
func_name = type(op).__name__.lower()[6:]
|
|
55
|
+
input_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
56
|
+
res_var_name = context.get_output_tileable_variable(op.outputs[0])
|
|
57
|
+
kw_str = self.generate_call_args_with_attributes(
|
|
58
|
+
op, context, kw_keys=["axes"], skip_none=True
|
|
59
|
+
)
|
|
60
|
+
return [f"{res_var_name} = np.fft.{func_name}({input_var_name}, {kw_str})"]
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@register_op_adapter([TensorFFTFreq, TensorRFFTFreq])
|
|
64
|
+
class TensorFFTFreqAdapter(SPEOperatorAdapter):
|
|
65
|
+
def generate_code(
|
|
66
|
+
self, op: Union[TensorFFTFreq, TensorRFFTFreq], context: SPECodeContext
|
|
67
|
+
) -> List[str]:
|
|
68
|
+
context.register_import("numpy", "np")
|
|
69
|
+
func_name = type(op).__name__.lower()[6:]
|
|
70
|
+
res_var_name = context.get_output_tileable_variable(op.outputs[0])
|
|
71
|
+
kw_str = self.generate_call_args_with_attributes(
|
|
72
|
+
op, context, "n", kw_keys=["d"]
|
|
73
|
+
)
|
|
74
|
+
return [f"{res_var_name} = np.fft.{func_name}({kw_str})"]
|
|
@@ -15,9 +15,12 @@
|
|
|
15
15
|
from typing import List
|
|
16
16
|
|
|
17
17
|
from ....tensor.linalg import (
|
|
18
|
+
TensorCholesky,
|
|
19
|
+
TensorEinsum,
|
|
18
20
|
TensorInv,
|
|
19
21
|
TensorLU,
|
|
20
22
|
TensorMatmul,
|
|
23
|
+
TensorNorm,
|
|
21
24
|
TensorQR,
|
|
22
25
|
TensorSolveTriangular,
|
|
23
26
|
TensorSVD,
|
|
@@ -26,17 +29,22 @@ from ....tensor.linalg import (
|
|
|
26
29
|
from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
|
|
27
30
|
from ..utils import build_method_call_adapter
|
|
28
31
|
|
|
32
|
+
TensorCholeskyAdapter = build_method_call_adapter(
|
|
33
|
+
TensorCholesky, "cholesky", 0, kw_keys=["lower"], source_module="npl"
|
|
34
|
+
)
|
|
29
35
|
TensorInvAdapter = build_method_call_adapter(
|
|
30
36
|
TensorInv, "inv", "input", source_module="npl"
|
|
31
37
|
)
|
|
32
38
|
TensorLUAdapter = build_method_call_adapter(
|
|
33
39
|
TensorLU, "lu", "input", source_module="spl"
|
|
34
40
|
)
|
|
35
|
-
TensorQRAdapter = build_method_call_adapter(TensorQR, "qr", 0, source_module="spl")
|
|
36
|
-
TensorSVDAdapter = build_method_call_adapter(TensorSVD, "svd", 0, source_module="spl")
|
|
37
41
|
TensorMatmulAdapter = build_method_call_adapter(
|
|
38
42
|
TensorMatmul, "matmul", "a", "b", source_module="np", kw_keys=["casting", "order"]
|
|
39
43
|
)
|
|
44
|
+
TensorNormAdapter = build_method_call_adapter(
|
|
45
|
+
TensorNorm, "norm", 0, kw_keys=["ord", "axis", "keepdims"], source_module="npl"
|
|
46
|
+
)
|
|
47
|
+
TensorQRAdapter = build_method_call_adapter(TensorQR, "qr", 0, source_module="spl")
|
|
40
48
|
TensorSolveTriangularAdapter = build_method_call_adapter(
|
|
41
49
|
TensorSolveTriangular,
|
|
42
50
|
"solve_triangular",
|
|
@@ -45,6 +53,25 @@ TensorSolveTriangularAdapter = build_method_call_adapter(
|
|
|
45
53
|
source_module="spl",
|
|
46
54
|
kw_keys=["lower", "strict"],
|
|
47
55
|
)
|
|
56
|
+
TensorSVDAdapter = build_method_call_adapter(TensorSVD, "svd", 0, source_module="spl")
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
@register_op_adapter(TensorEinsum)
|
|
60
|
+
class TensorEinsumAdapter(SPEOperatorAdapter):
|
|
61
|
+
def generate_code(self, op: TensorEinsum, context: SPECodeContext) -> List[str]:
|
|
62
|
+
context.register_import("numpy", "np")
|
|
63
|
+
|
|
64
|
+
inp_var_names_str = ", ".join(
|
|
65
|
+
[context.get_input_tileable_variable(inp) for inp in op.inputs]
|
|
66
|
+
)
|
|
67
|
+
res_var_name = context.get_output_tileable_variable(op.outputs[0])
|
|
68
|
+
subscripts_str = self.translate_var(context, op.subscripts)
|
|
69
|
+
kw_str = self.generate_call_args_with_attributes(
|
|
70
|
+
op, context, kw_keys=["dtype", "order", "casting"]
|
|
71
|
+
)
|
|
72
|
+
return [
|
|
73
|
+
f"{res_var_name} = np.einsum({subscripts_str}, {inp_var_names_str}, {kw_str})"
|
|
74
|
+
]
|
|
48
75
|
|
|
49
76
|
|
|
50
77
|
@register_op_adapter(TensorTensorDot)
|
|
@@ -16,11 +16,17 @@ from typing import List
|
|
|
16
16
|
|
|
17
17
|
import numpy as np
|
|
18
18
|
|
|
19
|
+
from ....tensor.indexing import TensorFillDiagonal
|
|
19
20
|
from ....tensor.misc import (
|
|
21
|
+
TensorArgwhere,
|
|
22
|
+
TensorCopyTo,
|
|
23
|
+
TensorDelete,
|
|
20
24
|
TensorDiff,
|
|
25
|
+
TensorGetShape,
|
|
21
26
|
TensorIsIn,
|
|
22
27
|
TensorRepeat,
|
|
23
28
|
TensorSearchsorted,
|
|
29
|
+
TensorSplit,
|
|
24
30
|
TensorSqueeze,
|
|
25
31
|
TensorSwapAxes,
|
|
26
32
|
TensorTranspose,
|
|
@@ -28,15 +34,39 @@ from ....tensor.misc import (
|
|
|
28
34
|
TensorUnique,
|
|
29
35
|
TensorWhere,
|
|
30
36
|
)
|
|
37
|
+
from ....tensor.misc.insert import TensorInsert
|
|
31
38
|
from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
|
|
32
39
|
from ..utils import build_method_call_adapter
|
|
33
40
|
|
|
34
41
|
_trapz_func = "trapezoid" if hasattr(np, "trapezoid") else "trapz"
|
|
35
42
|
|
|
36
43
|
|
|
44
|
+
TensorArgwhereAdapter = build_method_call_adapter(
|
|
45
|
+
TensorArgwhere, "argwhere", 0, source_module="np"
|
|
46
|
+
)
|
|
47
|
+
TensorDeleteAdapter = build_method_call_adapter(
|
|
48
|
+
TensorDelete, "delete", 0, "index_obj", kw_keys=["axis"], source_module="np"
|
|
49
|
+
)
|
|
37
50
|
TensorDiffAdapter = build_method_call_adapter(
|
|
38
51
|
TensorDiff, "diff", 0, skip_none=True, kw_keys=["n", "axis"], source_module="np"
|
|
39
52
|
)
|
|
53
|
+
TensorFillDiagonalAdapter = build_method_call_adapter(
|
|
54
|
+
TensorFillDiagonal,
|
|
55
|
+
"fill_diagonal",
|
|
56
|
+
0,
|
|
57
|
+
"val",
|
|
58
|
+
skip_none=True,
|
|
59
|
+
kw_keys=["wrap"],
|
|
60
|
+
source_module="np",
|
|
61
|
+
)
|
|
62
|
+
TensorInsertAdapter = build_method_call_adapter(
|
|
63
|
+
TensorInsert,
|
|
64
|
+
"insert",
|
|
65
|
+
0,
|
|
66
|
+
"index_obj",
|
|
67
|
+
kw_keys=["values", "axis"],
|
|
68
|
+
source_module="np",
|
|
69
|
+
)
|
|
40
70
|
TensorIsInAdapter = build_method_call_adapter(
|
|
41
71
|
TensorIsIn,
|
|
42
72
|
"isin",
|
|
@@ -62,18 +92,6 @@ TensorSearchsortedAdapter = build_method_call_adapter(
|
|
|
62
92
|
kw_keys=["side", "sorter"],
|
|
63
93
|
source_module="np",
|
|
64
94
|
)
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
@register_op_adapter(TensorTranspose)
|
|
68
|
-
class TensorTransposeAdapter(SPEOperatorAdapter):
|
|
69
|
-
def generate_code(self, op: TensorTranspose, context: SPECodeContext) -> List[str]:
|
|
70
|
-
context.register_import("numpy", "np")
|
|
71
|
-
input_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
72
|
-
res_var_name = context.get_output_tileable_variable(op.outputs[0])
|
|
73
|
-
axes_var = self.translate_var(context, op.axes)
|
|
74
|
-
return [f"{res_var_name} = np.transpose({input_var_name}, axes={axes_var})"]
|
|
75
|
-
|
|
76
|
-
|
|
77
95
|
TensorTrapezoidAdapter = build_method_call_adapter(
|
|
78
96
|
TensorTrapezoid,
|
|
79
97
|
_trapz_func,
|
|
@@ -81,16 +99,60 @@ TensorTrapezoidAdapter = build_method_call_adapter(
|
|
|
81
99
|
kw_keys=["y", "x", "dx", "axis"],
|
|
82
100
|
source_module="np",
|
|
83
101
|
)
|
|
102
|
+
TensorSqueezeAdapter = build_method_call_adapter(
|
|
103
|
+
TensorSqueeze, "squeeze", 0, kw_keys=["axis"], source_module="np"
|
|
104
|
+
)
|
|
105
|
+
TensorSwapAxesAdapter = build_method_call_adapter(
|
|
106
|
+
TensorSwapAxes, "swapaxes", "axis1", "axis2", source_module="np"
|
|
107
|
+
)
|
|
108
|
+
TensorTransposeAdapter = build_method_call_adapter(
|
|
109
|
+
TensorTranspose, "transpose", 0, kw_keys=["axes"], source_module="np"
|
|
110
|
+
)
|
|
111
|
+
TensorWhereAdapter = build_method_call_adapter(
|
|
112
|
+
TensorWhere, "where", "condition", "x", "y", source_module="np"
|
|
113
|
+
)
|
|
84
114
|
|
|
85
115
|
|
|
86
|
-
@register_op_adapter(
|
|
87
|
-
class
|
|
88
|
-
def generate_code(self, op:
|
|
116
|
+
@register_op_adapter(TensorCopyTo)
|
|
117
|
+
class TensorCopyToAdapter(SPEOperatorAdapter):
|
|
118
|
+
def generate_code(self, op: TensorCopyTo, context: SPECodeContext) -> List[str]:
|
|
89
119
|
context.register_import("numpy", "np")
|
|
90
|
-
|
|
120
|
+
dst_var_name = context.get_input_tileable_variable(op.inputs[1])
|
|
121
|
+
src_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
91
122
|
res_var_name = context.get_output_tileable_variable(op.outputs[0])
|
|
123
|
+
args_str = self.generate_call_args_with_attributes(
|
|
124
|
+
op, context, kw_keys=["casting", "where"], skip_none=True
|
|
125
|
+
)
|
|
126
|
+
return [
|
|
127
|
+
f"{res_var_name} = {dst_var_name}.copy()",
|
|
128
|
+
f"np.copyto({res_var_name}, {src_var_name}, {args_str})",
|
|
129
|
+
]
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
@register_op_adapter(TensorGetShape)
|
|
133
|
+
class TensorGetShapeAdapter(SPEOperatorAdapter):
|
|
134
|
+
def generate_code(self, op: TensorGetShape, context: SPECodeContext) -> List[str]:
|
|
135
|
+
context.register_import("numpy", "np")
|
|
136
|
+
input_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
137
|
+
res_var_names = ", ".join(
|
|
138
|
+
context.get_output_tileable_variable(out) for out in op.outputs
|
|
139
|
+
)
|
|
140
|
+
return [f"{res_var_names} = np.shape({input_var_name})"]
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@register_op_adapter(TensorSplit)
|
|
144
|
+
class TensorSplitAdapter(SPEOperatorAdapter):
|
|
145
|
+
def generate_code(self, op: TensorSplit, context: SPECodeContext) -> List[str]:
|
|
146
|
+
context.register_import("numpy", "np")
|
|
147
|
+
input_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
148
|
+
res_var_names = ", ".join(
|
|
149
|
+
context.get_output_tileable_variable(out) for out in op.outputs
|
|
150
|
+
)
|
|
151
|
+
idx_var = self.translate_var(context, op.indices_or_sections)
|
|
92
152
|
axis_var = self.translate_var(context, op.axis)
|
|
93
|
-
return [
|
|
153
|
+
return [
|
|
154
|
+
f"{res_var_names} = np.split({input_var_name}, {idx_var} axis={axis_var})"
|
|
155
|
+
]
|
|
94
156
|
|
|
95
157
|
|
|
96
158
|
@register_op_adapter(TensorUnique)
|
|
@@ -111,11 +173,3 @@ class TensorUniqueAdapter(SPEOperatorAdapter):
|
|
|
111
173
|
f"return_inverse={return_inverse_var}, return_counts={return_counts_var}, "
|
|
112
174
|
f"axis={axis_var})"
|
|
113
175
|
]
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
TensorSwapAxesAdapter = build_method_call_adapter(
|
|
117
|
-
TensorSwapAxes, "swapaxes", "axis1", "axis2", source_module="np"
|
|
118
|
-
)
|
|
119
|
-
TensorWhereAdapter = build_method_call_adapter(
|
|
120
|
-
TensorWhere, "where", "condition", "x", "y", source_module="np"
|
|
121
|
-
)
|
|
@@ -0,0 +1,45 @@
|
|
|
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 ....tensor.spatial.distance.cdist import TensorCDist
|
|
16
|
+
from ....tensor.spatial.distance.pdist import TensorPDist
|
|
17
|
+
from ....tensor.spatial.distance.squareform import TensorSquareForm
|
|
18
|
+
from ..utils import build_method_call_adapter
|
|
19
|
+
|
|
20
|
+
TensorCDistAdapter = build_method_call_adapter(
|
|
21
|
+
TensorCDist,
|
|
22
|
+
"cdist",
|
|
23
|
+
"xa",
|
|
24
|
+
"xb",
|
|
25
|
+
kw_keys=["metric", "p", "w"],
|
|
26
|
+
v="V",
|
|
27
|
+
vi="VI",
|
|
28
|
+
source_module="scipy.spatial.distance",
|
|
29
|
+
)
|
|
30
|
+
TensorPDistAdapter = build_method_call_adapter(
|
|
31
|
+
TensorPDist,
|
|
32
|
+
"pdist",
|
|
33
|
+
0,
|
|
34
|
+
kw_keys=["metric", "p", "w"],
|
|
35
|
+
v="V",
|
|
36
|
+
vi="VI",
|
|
37
|
+
source_module="scipy.spatial.distance",
|
|
38
|
+
)
|
|
39
|
+
TensorSquareFormAdapter = build_method_call_adapter(
|
|
40
|
+
TensorSquareForm,
|
|
41
|
+
"squareform",
|
|
42
|
+
0,
|
|
43
|
+
kw_keys=["checks"],
|
|
44
|
+
source_module="scipy.spatial.distance",
|
|
45
|
+
)
|
|
@@ -12,7 +12,13 @@
|
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
14
|
|
|
15
|
+
from typing import List
|
|
16
|
+
|
|
15
17
|
from ....tensor.statistics.bincount import TensorBinCount
|
|
18
|
+
from ....tensor.statistics.digitize import TensorDigitize
|
|
19
|
+
from ....tensor.statistics.histogram import TensorHistogram, TensorHistogramBinEdges
|
|
20
|
+
from ....tensor.statistics.quantile import TensorQuantile
|
|
21
|
+
from ..core import SPECodeContext, SPEOperatorAdapter, register_op_adapter
|
|
16
22
|
from ..utils import build_method_call_adapter
|
|
17
23
|
|
|
18
24
|
TensorBinCountAdapter = build_method_call_adapter(
|
|
@@ -22,3 +28,41 @@ TensorBinCountAdapter = build_method_call_adapter(
|
|
|
22
28
|
kw_keys=["weights", "minlength"],
|
|
23
29
|
source_module="np",
|
|
24
30
|
)
|
|
31
|
+
TensorDigitizeAdapter = build_method_call_adapter(
|
|
32
|
+
TensorDigitize,
|
|
33
|
+
"digitize",
|
|
34
|
+
0,
|
|
35
|
+
kw_keys=["bins", "right"],
|
|
36
|
+
source_module="np",
|
|
37
|
+
)
|
|
38
|
+
TensorHistogramBinEdgesAdapter = build_method_call_adapter(
|
|
39
|
+
TensorHistogramBinEdges,
|
|
40
|
+
"histogram_bin_edges",
|
|
41
|
+
0,
|
|
42
|
+
kw_keys=["bins", "range", "weights"],
|
|
43
|
+
source_module="np",
|
|
44
|
+
)
|
|
45
|
+
TensorQuantileAdapter = build_method_call_adapter(
|
|
46
|
+
TensorQuantile,
|
|
47
|
+
"quantile",
|
|
48
|
+
0,
|
|
49
|
+
kw_keys=["q", "axis", "overwrite_input", "interpolation", "keepdims"],
|
|
50
|
+
source_module="np",
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@register_op_adapter(TensorHistogram)
|
|
55
|
+
class TensorHistogramAdapter(SPEOperatorAdapter):
|
|
56
|
+
def generate_code(self, op: TensorHistogram, context: SPECodeContext) -> List[str]:
|
|
57
|
+
context.register_import("numpy", "np")
|
|
58
|
+
|
|
59
|
+
inp_var_name = context.get_input_tileable_variable(op.inputs[0])
|
|
60
|
+
res_var_names = ", ".join(
|
|
61
|
+
context.get_output_tileable_variable(out) for out in op.outputs
|
|
62
|
+
)
|
|
63
|
+
if not op.ret_bins:
|
|
64
|
+
res_var_names += ", _"
|
|
65
|
+
kw_str = self.generate_call_args_with_attributes(
|
|
66
|
+
op, context, kw_keys=["bins", "range", "density", "weights"]
|
|
67
|
+
)
|
|
68
|
+
return [f"{res_var_names} = np.histogram({inp_var_name}, {kw_str})"]
|
|
@@ -0,0 +1,64 @@
|
|
|
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 maxframe.tensor as mt
|
|
16
|
+
|
|
17
|
+
from ...core import SPECodeContext
|
|
18
|
+
from ..fft import (
|
|
19
|
+
TensorFFTAdapter,
|
|
20
|
+
TensorFFTFreqAdapter,
|
|
21
|
+
TensorFFTNAdapter,
|
|
22
|
+
TensorFFTShiftAdapter,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def test_fft():
|
|
27
|
+
result = mt.fft.fft(mt.exp(2j * mt.pi * mt.arange(8) / 8))
|
|
28
|
+
|
|
29
|
+
adapter = TensorFFTAdapter()
|
|
30
|
+
context = SPECodeContext()
|
|
31
|
+
results = adapter.generate_code(result.op, context)
|
|
32
|
+
expected_results = ["var_1 = np.fft.fft(var_0, axis=-1)"]
|
|
33
|
+
assert results == expected_results
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def test_fft2():
|
|
37
|
+
a = mt.mgrid[:5, :5][0]
|
|
38
|
+
result = mt.fft.fft2(a)
|
|
39
|
+
|
|
40
|
+
adapter = TensorFFTNAdapter()
|
|
41
|
+
context = SPECodeContext()
|
|
42
|
+
results = adapter.generate_code(result.op, context)
|
|
43
|
+
expected_results = ["var_1 = np.fft.fft2(var_0, None, axes=(-2, -1))"]
|
|
44
|
+
assert results == expected_results
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def test_fftshift():
|
|
48
|
+
result = mt.fft.fftshift(mt.tensor(10), 0.1)
|
|
49
|
+
|
|
50
|
+
adapter = TensorFFTShiftAdapter()
|
|
51
|
+
context = SPECodeContext()
|
|
52
|
+
results = adapter.generate_code(result.op, context)
|
|
53
|
+
expected_results = ["var_1 = np.fft.fftshift(var_0, axes=(0.1,))"]
|
|
54
|
+
assert results == expected_results
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def test_fftfreq():
|
|
58
|
+
result = mt.fft.fftfreq(10, 0.1)
|
|
59
|
+
|
|
60
|
+
adapter = TensorFFTFreqAdapter()
|
|
61
|
+
context = SPECodeContext()
|
|
62
|
+
results = adapter.generate_code(result.op, context)
|
|
63
|
+
expected_results = ["var_0 = np.fft.fftfreq(10, d=0.1)"]
|
|
64
|
+
assert results == expected_results
|
|
@@ -14,7 +14,21 @@
|
|
|
14
14
|
|
|
15
15
|
from ..... import tensor as mt
|
|
16
16
|
from ...core import SPECodeContext
|
|
17
|
-
from ..linalg import TensorQRAdapter, TensorTensorDotAdapter
|
|
17
|
+
from ..linalg import TensorEinsumAdapter, TensorQRAdapter, TensorTensorDotAdapter
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_einsum():
|
|
21
|
+
a = mt.arange(25).reshape(5, 5)
|
|
22
|
+
b = mt.arange(5)
|
|
23
|
+
adapter = TensorEinsumAdapter()
|
|
24
|
+
r = mt.einsum("ij,j", a, b)
|
|
25
|
+
context = SPECodeContext()
|
|
26
|
+
results = adapter.generate_code(r.op, context)
|
|
27
|
+
expected_results = [
|
|
28
|
+
"var_2 = np.einsum('ij,j->i', var_0, var_1, dtype=np.dtype('int64'),"
|
|
29
|
+
" order='K', casting='safe')"
|
|
30
|
+
]
|
|
31
|
+
assert results == expected_results
|
|
18
32
|
|
|
19
33
|
|
|
20
34
|
def test_qr():
|