maxframe 2.0.0b2__cp310-cp310-win_amd64.whl → 2.2.0__cp310-cp310-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of maxframe might be problematic. Click here for more details.
- maxframe/__init__.py +1 -0
- maxframe/_utils.cp310-win_amd64.pyd +0 -0
- maxframe/_utils.pyx +14 -1
- maxframe/codegen/core.py +6 -6
- 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 +34 -1
- maxframe/codegen/spe/dataframe/misc.py +9 -33
- maxframe/codegen/spe/dataframe/reduction.py +14 -9
- maxframe/codegen/spe/dataframe/reshape.py +46 -0
- maxframe/codegen/spe/dataframe/sort.py +30 -17
- 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_reshape.py +79 -0
- maxframe/codegen/spe/dataframe/tests/test_sort.py +20 -0
- 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/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 +70 -9
- maxframe/config/tests/test_validators.py +13 -1
- maxframe/config/validators.py +49 -0
- maxframe/conftest.py +44 -17
- maxframe/core/accessor.py +2 -2
- maxframe/core/entity/core.py +5 -0
- maxframe/core/entity/tileables.py +1 -1
- maxframe/core/graph/core.cp310-win_amd64.pyd +0 -0
- maxframe/core/graph/entity.py +1 -2
- 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 +10 -3
- 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 +14 -4
- maxframe/dataframe/arithmetic/between.py +106 -0
- maxframe/dataframe/arithmetic/dot.py +237 -0
- maxframe/dataframe/arithmetic/{around.py → round.py} +11 -7
- maxframe/dataframe/core.py +63 -118
- maxframe/dataframe/datasource/__init__.py +18 -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 +2 -3
- maxframe/dataframe/datasource/tests/test_datasource.py +37 -0
- maxframe/dataframe/datastore/__init__.py +5 -1
- maxframe/dataframe/datastore/to_csv.py +29 -41
- maxframe/dataframe/datastore/to_odps.py +30 -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/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 +12 -1
- maxframe/dataframe/groupby/aggregation.py +78 -45
- maxframe/dataframe/groupby/apply.py +1 -1
- maxframe/dataframe/groupby/apply_chunk.py +18 -2
- maxframe/dataframe/groupby/core.py +96 -12
- 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 +20 -1
- 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 +1 -1
- 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 +12 -1
- maxframe/dataframe/merge/append.py +97 -98
- 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 +16 -10
- maxframe/dataframe/misc/_duplicate.py +10 -4
- maxframe/dataframe/misc/apply.py +1 -1
- maxframe/dataframe/misc/check_unique.py +51 -0
- maxframe/dataframe/misc/clip.py +145 -0
- maxframe/dataframe/misc/describe.py +175 -9
- 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/isin.py +2 -2
- maxframe/dataframe/misc/map.py +94 -0
- maxframe/dataframe/misc/tests/test_misc.py +13 -2
- 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 +13 -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 +29 -15
- maxframe/dataframe/reduction/aggregation.py +38 -9
- maxframe/dataframe/reduction/all.py +2 -2
- maxframe/dataframe/reduction/any.py +2 -2
- maxframe/dataframe/reduction/argmax.py +100 -0
- maxframe/dataframe/reduction/argmin.py +100 -0
- maxframe/dataframe/reduction/core.py +65 -18
- 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/nunique.py +9 -8
- 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/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 +8 -0
- maxframe/dataframe/sort/argsort.py +62 -0
- maxframe/dataframe/sort/core.py +1 -0
- maxframe/dataframe/sort/nlargest.py +238 -0
- maxframe/dataframe/sort/nsmallest.py +228 -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/typing_.py +185 -0
- maxframe/dataframe/utils.py +95 -26
- 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 +2 -0
- maxframe/learn/contrib/xgboost/core.py +86 -1
- maxframe/learn/contrib/xgboost/train.py +5 -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/utils/__init__.py +1 -1
- maxframe/learn/utils/checks.py +1 -2
- maxframe/learn/utils/core.py +59 -0
- maxframe/learn/utils/extmath.py +37 -0
- maxframe/learn/utils/odpsio.py +193 -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 +122 -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.cp310-win_amd64.pyd +0 -0
- maxframe/lib/wrapped_pickle.py +10 -0
- maxframe/opcodes.py +33 -15
- maxframe/protocol.py +12 -0
- maxframe/serialization/__init__.py +11 -2
- maxframe/serialization/arrow.py +38 -13
- maxframe/serialization/blob.py +32 -0
- maxframe/serialization/core.cp310-win_amd64.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 +29 -2
- maxframe/tensor/__init__.py +38 -8
- maxframe/tensor/arithmetic/__init__.py +19 -10
- maxframe/tensor/arithmetic/iscomplexobj.py +53 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +6 -0
- maxframe/tensor/core.py +3 -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_utils.py +43 -1
- maxframe/tests/utils.py +0 -2
- maxframe/typing_.py +2 -0
- maxframe/udf.py +27 -2
- maxframe/utils.py +193 -19
- {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/METADATA +3 -2
- {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/RECORD +391 -236
- maxframe_client/fetcher.py +35 -4
- maxframe_client/session/odps.py +7 -2
- maxframe_client/tests/test_fetcher.py +76 -3
- maxframe_client/tests/test_session.py +4 -1
- /maxframe/dataframe/{misc → reshape}/melt.py +0 -0
- /maxframe/dataframe/{misc → reshape}/stack.py +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/WHEEL +0 -0
- {maxframe-2.0.0b2.dist-info → maxframe-2.2.0.dist-info}/top_level.txt +0 -0
|
@@ -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():
|
|
@@ -15,7 +15,11 @@
|
|
|
15
15
|
from ..... import tensor as mt
|
|
16
16
|
from ...core import SPECodeContext
|
|
17
17
|
from ..misc import (
|
|
18
|
+
TensorCopyToAdapter,
|
|
19
|
+
TensorGetShapeAdapter,
|
|
20
|
+
TensorInsertAdapter,
|
|
18
21
|
TensorIsInAdapter,
|
|
22
|
+
TensorSplitAdapter,
|
|
19
23
|
TensorSqueezeAdapter,
|
|
20
24
|
TensorTransposeAdapter,
|
|
21
25
|
TensorUniqueAdapter,
|
|
@@ -40,7 +44,7 @@ def test_transpose():
|
|
|
40
44
|
adapter = TensorTransposeAdapter()
|
|
41
45
|
context = SPECodeContext()
|
|
42
46
|
results = adapter.generate_code(result.op, context)
|
|
43
|
-
expected_results = ["
|
|
47
|
+
expected_results = ["var_0 = np.transpose(var_1, axes=[1, 0, 2])"]
|
|
44
48
|
assert results == expected_results
|
|
45
49
|
|
|
46
50
|
|
|
@@ -50,7 +54,7 @@ def test_squeeze():
|
|
|
50
54
|
adapter = TensorSqueezeAdapter()
|
|
51
55
|
context = SPECodeContext()
|
|
52
56
|
results = adapter.generate_code(result.op, context)
|
|
53
|
-
expected_results = ["
|
|
57
|
+
expected_results = ["var_0 = np.squeeze(var_1, axis=(0,))"]
|
|
54
58
|
assert results == expected_results
|
|
55
59
|
|
|
56
60
|
|
|
@@ -92,3 +96,49 @@ def test_unique():
|
|
|
92
96
|
"np.unique(var_0, return_index=True, return_inverse=True, return_counts=True, axis=0)"
|
|
93
97
|
]
|
|
94
98
|
assert results == expected_results
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def test_insert():
|
|
102
|
+
result = mt.insert(mt.array([[1, 1], [2, 2], [3, 3]]), 1, 5)
|
|
103
|
+
|
|
104
|
+
adapter = TensorInsertAdapter()
|
|
105
|
+
context = SPECodeContext()
|
|
106
|
+
results = adapter.generate_code(result.op, context)
|
|
107
|
+
expected_results = ["var_0 = np.insert(var_1, 1, values=5)"]
|
|
108
|
+
assert results == expected_results
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def test_split():
|
|
112
|
+
res_tp = mt.split(mt.array([1, 2, 3, 4, 5, 6]), 3)
|
|
113
|
+
|
|
114
|
+
adapter = TensorSplitAdapter()
|
|
115
|
+
context = SPECodeContext()
|
|
116
|
+
results = adapter.generate_code(res_tp[0].op, context)
|
|
117
|
+
expected_results = ["var_1, var_2, var_3 = np.split(var_0, 3 axis=0)"]
|
|
118
|
+
assert results == expected_results
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def test_get_shape():
|
|
122
|
+
inp = mt.array([[1, 1], [2, 2], [3, 3]])
|
|
123
|
+
res = mt.shape(inp[:, inp[0, :] == 1])
|
|
124
|
+
|
|
125
|
+
adapter = TensorGetShapeAdapter()
|
|
126
|
+
context = SPECodeContext()
|
|
127
|
+
results = adapter.generate_code(res[0].op, context)
|
|
128
|
+
expected_results = ["var_1, var_2 = np.shape(var_0)"]
|
|
129
|
+
assert results == expected_results
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def test_copyto():
|
|
133
|
+
dest = mt.array([[1, 1], [2, 2], [3, 3]])
|
|
134
|
+
src = mt.array([[1, 1], [2, 2], [3, 4]])
|
|
135
|
+
mt.copyto(dest, src)
|
|
136
|
+
|
|
137
|
+
adapter = TensorCopyToAdapter()
|
|
138
|
+
context = SPECodeContext()
|
|
139
|
+
results = adapter.generate_code(dest.op, context)
|
|
140
|
+
expected_results = [
|
|
141
|
+
"var_2 = var_0.copy()",
|
|
142
|
+
"np.copyto(var_2, var_1, casting='same_kind')",
|
|
143
|
+
]
|
|
144
|
+
assert results == expected_results
|
|
@@ -0,0 +1,33 @@
|
|
|
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 ...core import SPECodeContext
|
|
17
|
+
from ..spatial import TensorCDistAdapter
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_cdist():
|
|
21
|
+
xa = mt.random.rand(100, 10)
|
|
22
|
+
xb = mt.random.rand(89, 10)
|
|
23
|
+
VI = mt.random.rand(10, 10)
|
|
24
|
+
dist = mt.spatial.distance.cdist(xa, xb, metric="mahalanobis", VI=VI)
|
|
25
|
+
|
|
26
|
+
adapter = TensorCDistAdapter()
|
|
27
|
+
context = SPECodeContext()
|
|
28
|
+
results = adapter.generate_code(dist.op, context)
|
|
29
|
+
expected_results = [
|
|
30
|
+
"var_0 = scipy.spatial.distance.cdist("
|
|
31
|
+
"var_1, var_2, metric='mahalanobis', VI=var_3)"
|
|
32
|
+
]
|
|
33
|
+
assert results == expected_results
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
|
|
15
15
|
from ..... import tensor as mt
|
|
16
16
|
from ...core import SPECodeContext
|
|
17
|
-
from ..statistics import TensorBinCountAdapter
|
|
17
|
+
from ..statistics import TensorBinCountAdapter, TensorHistogramAdapter
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
def test_bincount():
|
|
@@ -27,3 +27,17 @@ def test_bincount():
|
|
|
27
27
|
results = adapter.generate_code(result.op, context)
|
|
28
28
|
expected_results = ["var_0 = np.bincount(var_1, weights=var_2, minlength=0)"]
|
|
29
29
|
assert results == expected_results
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_histogram():
|
|
33
|
+
arr = mt.arange(5)
|
|
34
|
+
result, _bins = mt.histogram(arr, bins=3)
|
|
35
|
+
|
|
36
|
+
adapter = TensorHistogramAdapter()
|
|
37
|
+
context = SPECodeContext()
|
|
38
|
+
results = adapter.generate_code(result.op, context)
|
|
39
|
+
expected_results = [
|
|
40
|
+
"var_1, _ = np.histogram(var_0, bins=var_2, range=None, density=None, "
|
|
41
|
+
"weights=None)"
|
|
42
|
+
]
|
|
43
|
+
assert results == expected_results
|
|
@@ -59,12 +59,8 @@ def test_codegen_with_udf(codegen):
|
|
|
59
59
|
|
|
60
60
|
udf_1_body = base64.b64encode(pickle.dumps(f1, protocol=pickle.DEFAULT_PROTOCOL))
|
|
61
61
|
udf_2_body = base64.b64encode(pickle.dumps(f2, protocol=pickle.DEFAULT_PROTOCOL))
|
|
62
|
-
udf_1_value = (
|
|
63
|
-
|
|
64
|
-
)
|
|
65
|
-
udf_2_value = (
|
|
66
|
-
f"pickled_data = cloudpickle.loads(base64.b64decode({udf_2_body}), buffers=[])"
|
|
67
|
-
)
|
|
62
|
+
udf_1_value = f"udf_main_entry = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
|
|
63
|
+
udf_2_value = f"udf_main_entry = cloudpickle.loads(base64.b64decode({udf_2_body}), buffers=[])"
|
|
68
64
|
udf_1 = f"user_udf_f1_{hashlib.md5(udf_1_value.encode('utf-8')).hexdigest()}"
|
|
69
65
|
udf_2 = f"user_udf_f2_{hashlib.md5(udf_2_value.encode('utf-8')).hexdigest()}"
|
|
70
66
|
|
|
@@ -74,9 +70,9 @@ def test_codegen_with_udf(codegen):
|
|
|
74
70
|
import base64
|
|
75
71
|
import cloudpickle
|
|
76
72
|
{udf_1_value}
|
|
77
|
-
{udf_1} =
|
|
73
|
+
{udf_1} = udf_main_entry
|
|
78
74
|
{udf_2_value}
|
|
79
|
-
{udf_2} =
|
|
75
|
+
{udf_2} = udf_main_entry
|
|
80
76
|
if not running:
|
|
81
77
|
raise RuntimeError('CANCELLED')
|
|
82
78
|
var_0 = np.random.rand(1, 3)
|
|
@@ -111,9 +107,7 @@ def test_codegen_with_udf_and_args(codegen):
|
|
|
111
107
|
protocol=pickle.DEFAULT_PROTOCOL,
|
|
112
108
|
)
|
|
113
109
|
)
|
|
114
|
-
udf_1_value = (
|
|
115
|
-
f"pickled_data = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
|
|
116
|
-
)
|
|
110
|
+
udf_1_value = f"udf_main_entry = cloudpickle.loads(base64.b64decode({udf_1_body}), buffers=[])"
|
|
117
111
|
udf_1 = f"user_udf_f1_{hashlib.md5(udf_1_value.encode('utf-8')).hexdigest()}"
|
|
118
112
|
|
|
119
113
|
expected_contents = f"""
|
|
@@ -122,7 +116,7 @@ def test_codegen_with_udf_and_args(codegen):
|
|
|
122
116
|
import base64
|
|
123
117
|
import cloudpickle
|
|
124
118
|
{udf_1_value}
|
|
125
|
-
{udf_1} =
|
|
119
|
+
{udf_1} = udf_main_entry
|
|
126
120
|
if not running:
|
|
127
121
|
raise RuntimeError('CANCELLED')
|
|
128
122
|
var_0 = np.random.rand(1, 3)
|
maxframe/codegen/spe/utils.py
CHANGED
|
@@ -37,6 +37,8 @@ def build_method_call_adapter(
|
|
|
37
37
|
def generate_code(self, op: OperatorType, context: SPECodeContext) -> List[str]:
|
|
38
38
|
if source_module in _import_aliases:
|
|
39
39
|
context.register_import(_import_aliases[source_module], source_module)
|
|
40
|
+
elif source_module:
|
|
41
|
+
context.register_import(source_module)
|
|
40
42
|
|
|
41
43
|
input_var_name = source_module or context.get_input_tileable_variable(
|
|
42
44
|
op.inputs[0]
|