maxframe 0.1.0b5__cp310-cp310-macosx_11_0_arm64.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 +32 -0
- maxframe/_utils.cpython-310-darwin.so +0 -0
- maxframe/_utils.pxd +33 -0
- maxframe/_utils.pyx +547 -0
- maxframe/codegen.py +528 -0
- maxframe/config/__init__.py +15 -0
- maxframe/config/config.py +443 -0
- maxframe/config/tests/__init__.py +13 -0
- maxframe/config/tests/test_config.py +103 -0
- maxframe/config/tests/test_validators.py +34 -0
- maxframe/config/validators.py +57 -0
- maxframe/conftest.py +139 -0
- maxframe/core/__init__.py +65 -0
- maxframe/core/base.py +156 -0
- maxframe/core/entity/__init__.py +44 -0
- maxframe/core/entity/chunks.py +68 -0
- maxframe/core/entity/core.py +152 -0
- maxframe/core/entity/executable.py +337 -0
- maxframe/core/entity/fuse.py +73 -0
- maxframe/core/entity/objects.py +100 -0
- maxframe/core/entity/output_types.py +90 -0
- maxframe/core/entity/tileables.py +438 -0
- maxframe/core/entity/utils.py +24 -0
- maxframe/core/graph/__init__.py +17 -0
- maxframe/core/graph/builder/__init__.py +16 -0
- maxframe/core/graph/builder/base.py +86 -0
- maxframe/core/graph/builder/chunk.py +430 -0
- maxframe/core/graph/builder/tileable.py +34 -0
- maxframe/core/graph/builder/utils.py +41 -0
- maxframe/core/graph/core.cpython-310-darwin.so +0 -0
- maxframe/core/graph/core.pyx +467 -0
- maxframe/core/graph/entity.py +171 -0
- maxframe/core/graph/tests/__init__.py +13 -0
- maxframe/core/graph/tests/test_graph.py +205 -0
- maxframe/core/mode.py +96 -0
- maxframe/core/operator/__init__.py +34 -0
- maxframe/core/operator/base.py +450 -0
- maxframe/core/operator/core.py +276 -0
- maxframe/core/operator/fetch.py +53 -0
- maxframe/core/operator/fuse.py +29 -0
- maxframe/core/operator/objects.py +72 -0
- maxframe/core/operator/shuffle.py +111 -0
- maxframe/core/operator/tests/__init__.py +13 -0
- maxframe/core/operator/tests/test_core.py +64 -0
- maxframe/core/tests/__init__.py +13 -0
- maxframe/core/tests/test_mode.py +75 -0
- maxframe/dataframe/__init__.py +81 -0
- maxframe/dataframe/arithmetic/__init__.py +359 -0
- maxframe/dataframe/arithmetic/abs.py +33 -0
- maxframe/dataframe/arithmetic/add.py +60 -0
- maxframe/dataframe/arithmetic/arccos.py +28 -0
- maxframe/dataframe/arithmetic/arccosh.py +28 -0
- maxframe/dataframe/arithmetic/arcsin.py +28 -0
- maxframe/dataframe/arithmetic/arcsinh.py +28 -0
- maxframe/dataframe/arithmetic/arctan.py +28 -0
- maxframe/dataframe/arithmetic/arctanh.py +28 -0
- maxframe/dataframe/arithmetic/around.py +152 -0
- maxframe/dataframe/arithmetic/bitwise_and.py +46 -0
- maxframe/dataframe/arithmetic/bitwise_or.py +50 -0
- maxframe/dataframe/arithmetic/bitwise_xor.py +46 -0
- maxframe/dataframe/arithmetic/ceil.py +28 -0
- maxframe/dataframe/arithmetic/core.py +342 -0
- maxframe/dataframe/arithmetic/cos.py +28 -0
- maxframe/dataframe/arithmetic/cosh.py +28 -0
- maxframe/dataframe/arithmetic/degrees.py +28 -0
- maxframe/dataframe/arithmetic/docstring.py +442 -0
- maxframe/dataframe/arithmetic/equal.py +56 -0
- maxframe/dataframe/arithmetic/exp.py +28 -0
- maxframe/dataframe/arithmetic/exp2.py +28 -0
- maxframe/dataframe/arithmetic/expm1.py +28 -0
- maxframe/dataframe/arithmetic/floor.py +28 -0
- maxframe/dataframe/arithmetic/floordiv.py +64 -0
- maxframe/dataframe/arithmetic/greater.py +57 -0
- maxframe/dataframe/arithmetic/greater_equal.py +57 -0
- maxframe/dataframe/arithmetic/invert.py +33 -0
- maxframe/dataframe/arithmetic/is_ufuncs.py +62 -0
- maxframe/dataframe/arithmetic/less.py +57 -0
- maxframe/dataframe/arithmetic/less_equal.py +57 -0
- maxframe/dataframe/arithmetic/log.py +28 -0
- maxframe/dataframe/arithmetic/log10.py +28 -0
- maxframe/dataframe/arithmetic/log2.py +28 -0
- maxframe/dataframe/arithmetic/mod.py +60 -0
- maxframe/dataframe/arithmetic/multiply.py +60 -0
- maxframe/dataframe/arithmetic/negative.py +33 -0
- maxframe/dataframe/arithmetic/not_equal.py +56 -0
- maxframe/dataframe/arithmetic/power.py +68 -0
- maxframe/dataframe/arithmetic/radians.py +28 -0
- maxframe/dataframe/arithmetic/sin.py +28 -0
- maxframe/dataframe/arithmetic/sinh.py +28 -0
- maxframe/dataframe/arithmetic/sqrt.py +28 -0
- maxframe/dataframe/arithmetic/subtract.py +64 -0
- maxframe/dataframe/arithmetic/tan.py +28 -0
- maxframe/dataframe/arithmetic/tanh.py +28 -0
- maxframe/dataframe/arithmetic/tests/__init__.py +13 -0
- maxframe/dataframe/arithmetic/tests/test_arithmetic.py +695 -0
- maxframe/dataframe/arithmetic/truediv.py +64 -0
- maxframe/dataframe/arithmetic/trunc.py +28 -0
- maxframe/dataframe/arrays.py +864 -0
- maxframe/dataframe/core.py +2417 -0
- maxframe/dataframe/datasource/__init__.py +15 -0
- maxframe/dataframe/datasource/core.py +81 -0
- maxframe/dataframe/datasource/dataframe.py +59 -0
- maxframe/dataframe/datasource/date_range.py +504 -0
- maxframe/dataframe/datasource/from_index.py +54 -0
- maxframe/dataframe/datasource/from_records.py +107 -0
- maxframe/dataframe/datasource/from_tensor.py +419 -0
- maxframe/dataframe/datasource/index.py +117 -0
- maxframe/dataframe/datasource/read_csv.py +528 -0
- maxframe/dataframe/datasource/read_odps_query.py +299 -0
- maxframe/dataframe/datasource/read_odps_table.py +253 -0
- maxframe/dataframe/datasource/read_parquet.py +421 -0
- maxframe/dataframe/datasource/series.py +55 -0
- maxframe/dataframe/datasource/tests/__init__.py +13 -0
- maxframe/dataframe/datasource/tests/test_datasource.py +401 -0
- maxframe/dataframe/datastore/__init__.py +26 -0
- maxframe/dataframe/datastore/core.py +19 -0
- maxframe/dataframe/datastore/to_csv.py +227 -0
- maxframe/dataframe/datastore/to_odps.py +162 -0
- maxframe/dataframe/extensions/__init__.py +41 -0
- maxframe/dataframe/extensions/accessor.py +50 -0
- maxframe/dataframe/extensions/reshuffle.py +83 -0
- maxframe/dataframe/extensions/tests/__init__.py +13 -0
- maxframe/dataframe/extensions/tests/test_extensions.py +38 -0
- maxframe/dataframe/fetch/__init__.py +15 -0
- maxframe/dataframe/fetch/core.py +86 -0
- maxframe/dataframe/groupby/__init__.py +82 -0
- maxframe/dataframe/groupby/aggregation.py +350 -0
- maxframe/dataframe/groupby/apply.py +251 -0
- maxframe/dataframe/groupby/core.py +179 -0
- maxframe/dataframe/groupby/cum.py +124 -0
- maxframe/dataframe/groupby/fill.py +141 -0
- maxframe/dataframe/groupby/getitem.py +92 -0
- maxframe/dataframe/groupby/head.py +105 -0
- maxframe/dataframe/groupby/sample.py +214 -0
- maxframe/dataframe/groupby/tests/__init__.py +13 -0
- maxframe/dataframe/groupby/tests/test_groupby.py +374 -0
- maxframe/dataframe/groupby/transform.py +255 -0
- maxframe/dataframe/indexing/__init__.py +84 -0
- maxframe/dataframe/indexing/add_prefix_suffix.py +110 -0
- maxframe/dataframe/indexing/align.py +349 -0
- maxframe/dataframe/indexing/at.py +83 -0
- maxframe/dataframe/indexing/getitem.py +204 -0
- maxframe/dataframe/indexing/iat.py +37 -0
- maxframe/dataframe/indexing/iloc.py +566 -0
- maxframe/dataframe/indexing/insert.py +86 -0
- maxframe/dataframe/indexing/loc.py +411 -0
- maxframe/dataframe/indexing/reindex.py +526 -0
- maxframe/dataframe/indexing/rename.py +462 -0
- maxframe/dataframe/indexing/rename_axis.py +209 -0
- maxframe/dataframe/indexing/reset_index.py +402 -0
- maxframe/dataframe/indexing/sample.py +221 -0
- maxframe/dataframe/indexing/set_axis.py +194 -0
- maxframe/dataframe/indexing/set_index.py +61 -0
- maxframe/dataframe/indexing/setitem.py +130 -0
- maxframe/dataframe/indexing/tests/__init__.py +13 -0
- maxframe/dataframe/indexing/tests/test_indexing.py +488 -0
- maxframe/dataframe/indexing/where.py +308 -0
- maxframe/dataframe/initializer.py +288 -0
- maxframe/dataframe/merge/__init__.py +32 -0
- maxframe/dataframe/merge/append.py +121 -0
- maxframe/dataframe/merge/concat.py +325 -0
- maxframe/dataframe/merge/merge.py +593 -0
- maxframe/dataframe/merge/tests/__init__.py +13 -0
- maxframe/dataframe/merge/tests/test_merge.py +215 -0
- maxframe/dataframe/misc/__init__.py +134 -0
- maxframe/dataframe/misc/_duplicate.py +46 -0
- maxframe/dataframe/misc/accessor.py +276 -0
- maxframe/dataframe/misc/apply.py +692 -0
- maxframe/dataframe/misc/astype.py +236 -0
- maxframe/dataframe/misc/case_when.py +141 -0
- maxframe/dataframe/misc/check_monotonic.py +84 -0
- maxframe/dataframe/misc/cut.py +383 -0
- maxframe/dataframe/misc/datetimes.py +79 -0
- maxframe/dataframe/misc/describe.py +108 -0
- maxframe/dataframe/misc/diff.py +210 -0
- maxframe/dataframe/misc/drop.py +440 -0
- maxframe/dataframe/misc/drop_duplicates.py +248 -0
- maxframe/dataframe/misc/duplicated.py +292 -0
- maxframe/dataframe/misc/eval.py +728 -0
- maxframe/dataframe/misc/explode.py +171 -0
- maxframe/dataframe/misc/get_dummies.py +208 -0
- maxframe/dataframe/misc/isin.py +217 -0
- maxframe/dataframe/misc/map.py +236 -0
- maxframe/dataframe/misc/melt.py +162 -0
- maxframe/dataframe/misc/memory_usage.py +248 -0
- maxframe/dataframe/misc/pct_change.py +150 -0
- maxframe/dataframe/misc/pivot_table.py +262 -0
- maxframe/dataframe/misc/qcut.py +104 -0
- maxframe/dataframe/misc/select_dtypes.py +104 -0
- maxframe/dataframe/misc/shift.py +256 -0
- maxframe/dataframe/misc/stack.py +238 -0
- maxframe/dataframe/misc/string_.py +221 -0
- maxframe/dataframe/misc/tests/__init__.py +13 -0
- maxframe/dataframe/misc/tests/test_misc.py +468 -0
- maxframe/dataframe/misc/to_numeric.py +178 -0
- maxframe/dataframe/misc/transform.py +361 -0
- maxframe/dataframe/misc/transpose.py +136 -0
- maxframe/dataframe/misc/value_counts.py +182 -0
- maxframe/dataframe/missing/__init__.py +53 -0
- maxframe/dataframe/missing/checkna.py +223 -0
- maxframe/dataframe/missing/dropna.py +280 -0
- maxframe/dataframe/missing/fillna.py +275 -0
- maxframe/dataframe/missing/replace.py +439 -0
- maxframe/dataframe/missing/tests/__init__.py +13 -0
- maxframe/dataframe/missing/tests/test_missing.py +89 -0
- maxframe/dataframe/operators.py +273 -0
- maxframe/dataframe/plotting/__init__.py +40 -0
- maxframe/dataframe/plotting/core.py +78 -0
- maxframe/dataframe/plotting/tests/__init__.py +13 -0
- maxframe/dataframe/plotting/tests/test_plotting.py +136 -0
- maxframe/dataframe/reduction/__init__.py +107 -0
- maxframe/dataframe/reduction/aggregation.py +344 -0
- maxframe/dataframe/reduction/all.py +78 -0
- maxframe/dataframe/reduction/any.py +78 -0
- maxframe/dataframe/reduction/core.py +837 -0
- maxframe/dataframe/reduction/count.py +59 -0
- maxframe/dataframe/reduction/cummax.py +30 -0
- maxframe/dataframe/reduction/cummin.py +30 -0
- maxframe/dataframe/reduction/cumprod.py +30 -0
- maxframe/dataframe/reduction/cumsum.py +30 -0
- maxframe/dataframe/reduction/custom_reduction.py +42 -0
- maxframe/dataframe/reduction/kurtosis.py +104 -0
- maxframe/dataframe/reduction/max.py +65 -0
- maxframe/dataframe/reduction/mean.py +61 -0
- maxframe/dataframe/reduction/min.py +65 -0
- maxframe/dataframe/reduction/nunique.py +141 -0
- maxframe/dataframe/reduction/prod.py +76 -0
- maxframe/dataframe/reduction/reduction_size.py +36 -0
- maxframe/dataframe/reduction/sem.py +69 -0
- maxframe/dataframe/reduction/skew.py +89 -0
- maxframe/dataframe/reduction/std.py +53 -0
- maxframe/dataframe/reduction/str_concat.py +48 -0
- maxframe/dataframe/reduction/sum.py +77 -0
- maxframe/dataframe/reduction/tests/__init__.py +13 -0
- maxframe/dataframe/reduction/tests/test_reduction.py +486 -0
- maxframe/dataframe/reduction/unique.py +90 -0
- maxframe/dataframe/reduction/var.py +72 -0
- maxframe/dataframe/sort/__init__.py +34 -0
- maxframe/dataframe/sort/core.py +36 -0
- maxframe/dataframe/sort/sort_index.py +153 -0
- maxframe/dataframe/sort/sort_values.py +311 -0
- maxframe/dataframe/sort/tests/__init__.py +13 -0
- maxframe/dataframe/sort/tests/test_sort.py +81 -0
- maxframe/dataframe/statistics/__init__.py +33 -0
- maxframe/dataframe/statistics/corr.py +280 -0
- maxframe/dataframe/statistics/quantile.py +341 -0
- maxframe/dataframe/statistics/tests/__init__.py +13 -0
- maxframe/dataframe/statistics/tests/test_statistics.py +82 -0
- maxframe/dataframe/tests/__init__.py +13 -0
- maxframe/dataframe/tests/test_initializer.py +29 -0
- maxframe/dataframe/tseries/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/__init__.py +13 -0
- maxframe/dataframe/tseries/tests/test_tseries.py +30 -0
- maxframe/dataframe/tseries/to_datetime.py +297 -0
- maxframe/dataframe/ufunc/__init__.py +27 -0
- maxframe/dataframe/ufunc/tensor.py +54 -0
- maxframe/dataframe/ufunc/ufunc.py +52 -0
- maxframe/dataframe/utils.py +1267 -0
- maxframe/dataframe/window/__init__.py +29 -0
- maxframe/dataframe/window/aggregation.py +96 -0
- maxframe/dataframe/window/core.py +69 -0
- maxframe/dataframe/window/ewm.py +249 -0
- maxframe/dataframe/window/expanding.py +147 -0
- maxframe/dataframe/window/rolling.py +376 -0
- maxframe/dataframe/window/tests/__init__.py +13 -0
- maxframe/dataframe/window/tests/test_ewm.py +70 -0
- maxframe/dataframe/window/tests/test_expanding.py +66 -0
- maxframe/dataframe/window/tests/test_rolling.py +57 -0
- maxframe/env.py +33 -0
- maxframe/errors.py +21 -0
- maxframe/extension.py +81 -0
- maxframe/learn/__init__.py +17 -0
- maxframe/learn/contrib/__init__.py +17 -0
- maxframe/learn/contrib/pytorch/__init__.py +16 -0
- maxframe/learn/contrib/pytorch/run_function.py +110 -0
- maxframe/learn/contrib/pytorch/run_script.py +102 -0
- maxframe/learn/contrib/pytorch/tests/__init__.py +13 -0
- maxframe/learn/contrib/pytorch/tests/test_pytorch.py +42 -0
- maxframe/learn/contrib/utils.py +52 -0
- maxframe/learn/contrib/xgboost/__init__.py +26 -0
- maxframe/learn/contrib/xgboost/classifier.py +86 -0
- maxframe/learn/contrib/xgboost/core.py +156 -0
- maxframe/learn/contrib/xgboost/dmatrix.py +150 -0
- maxframe/learn/contrib/xgboost/predict.py +138 -0
- maxframe/learn/contrib/xgboost/regressor.py +78 -0
- maxframe/learn/contrib/xgboost/tests/__init__.py +13 -0
- maxframe/learn/contrib/xgboost/tests/test_core.py +43 -0
- maxframe/learn/contrib/xgboost/train.py +121 -0
- maxframe/learn/utils/__init__.py +15 -0
- maxframe/learn/utils/core.py +29 -0
- maxframe/lib/__init__.py +15 -0
- maxframe/lib/aio/__init__.py +27 -0
- maxframe/lib/aio/_runners.py +162 -0
- maxframe/lib/aio/_threads.py +35 -0
- maxframe/lib/aio/base.py +82 -0
- maxframe/lib/aio/file.py +85 -0
- maxframe/lib/aio/isolation.py +100 -0
- maxframe/lib/aio/lru.py +242 -0
- maxframe/lib/aio/parallelism.py +37 -0
- maxframe/lib/aio/tests/__init__.py +13 -0
- maxframe/lib/aio/tests/test_aio_file.py +55 -0
- maxframe/lib/compression.py +55 -0
- maxframe/lib/cython/__init__.py +13 -0
- maxframe/lib/cython/libcpp.pxd +30 -0
- maxframe/lib/filesystem/__init__.py +21 -0
- maxframe/lib/filesystem/_glob.py +173 -0
- maxframe/lib/filesystem/_oss_lib/__init__.py +13 -0
- maxframe/lib/filesystem/_oss_lib/common.py +198 -0
- maxframe/lib/filesystem/_oss_lib/glob.py +147 -0
- maxframe/lib/filesystem/_oss_lib/handle.py +156 -0
- maxframe/lib/filesystem/arrow.py +236 -0
- maxframe/lib/filesystem/base.py +263 -0
- maxframe/lib/filesystem/core.py +95 -0
- maxframe/lib/filesystem/fsmap.py +164 -0
- maxframe/lib/filesystem/hdfs.py +31 -0
- maxframe/lib/filesystem/local.py +112 -0
- maxframe/lib/filesystem/oss.py +157 -0
- maxframe/lib/filesystem/tests/__init__.py +13 -0
- maxframe/lib/filesystem/tests/test_filesystem.py +223 -0
- maxframe/lib/filesystem/tests/test_oss.py +182 -0
- maxframe/lib/functools_compat.py +81 -0
- maxframe/lib/mmh3.cpython-310-darwin.so +0 -0
- maxframe/lib/mmh3_src/MurmurHash3.cpp +339 -0
- maxframe/lib/mmh3_src/MurmurHash3.h +43 -0
- maxframe/lib/mmh3_src/mmh3module.cpp +387 -0
- maxframe/lib/sparse/__init__.py +861 -0
- maxframe/lib/sparse/array.py +1604 -0
- maxframe/lib/sparse/core.py +92 -0
- maxframe/lib/sparse/matrix.py +241 -0
- maxframe/lib/sparse/tests/__init__.py +15 -0
- maxframe/lib/sparse/tests/test_sparse.py +476 -0
- maxframe/lib/sparse/vector.py +150 -0
- maxframe/lib/tblib/LICENSE +20 -0
- maxframe/lib/tblib/__init__.py +327 -0
- maxframe/lib/tblib/cpython.py +83 -0
- maxframe/lib/tblib/decorators.py +44 -0
- maxframe/lib/tblib/pickling_support.py +90 -0
- maxframe/lib/tests/__init__.py +13 -0
- maxframe/lib/tests/test_wrapped_pickle.py +51 -0
- maxframe/lib/version.py +620 -0
- maxframe/lib/wrapped_pickle.py +139 -0
- maxframe/mixin.py +100 -0
- maxframe/odpsio/__init__.py +21 -0
- maxframe/odpsio/arrow.py +91 -0
- maxframe/odpsio/schema.py +364 -0
- maxframe/odpsio/tableio.py +322 -0
- maxframe/odpsio/tests/__init__.py +13 -0
- maxframe/odpsio/tests/test_arrow.py +88 -0
- maxframe/odpsio/tests/test_schema.py +297 -0
- maxframe/odpsio/tests/test_tableio.py +136 -0
- maxframe/odpsio/tests/test_volumeio.py +90 -0
- maxframe/odpsio/volumeio.py +95 -0
- maxframe/opcodes.py +590 -0
- maxframe/protocol.py +415 -0
- maxframe/remote/__init__.py +18 -0
- maxframe/remote/core.py +210 -0
- maxframe/remote/run_script.py +121 -0
- maxframe/serialization/__init__.py +26 -0
- maxframe/serialization/arrow.py +95 -0
- maxframe/serialization/core.cpython-310-darwin.so +0 -0
- maxframe/serialization/core.pxd +44 -0
- maxframe/serialization/core.pyi +61 -0
- maxframe/serialization/core.pyx +1094 -0
- maxframe/serialization/exception.py +86 -0
- maxframe/serialization/maxframe_objects.py +39 -0
- maxframe/serialization/numpy.py +91 -0
- maxframe/serialization/pandas.py +202 -0
- maxframe/serialization/scipy.py +71 -0
- maxframe/serialization/serializables/__init__.py +55 -0
- maxframe/serialization/serializables/core.py +262 -0
- maxframe/serialization/serializables/field.py +624 -0
- maxframe/serialization/serializables/field_type.py +589 -0
- maxframe/serialization/serializables/tests/__init__.py +13 -0
- maxframe/serialization/serializables/tests/test_field_type.py +121 -0
- maxframe/serialization/serializables/tests/test_serializable.py +250 -0
- maxframe/serialization/tests/__init__.py +13 -0
- maxframe/serialization/tests/test_serial.py +412 -0
- maxframe/session.py +1310 -0
- maxframe/tensor/__init__.py +183 -0
- maxframe/tensor/arithmetic/__init__.py +315 -0
- maxframe/tensor/arithmetic/abs.py +68 -0
- maxframe/tensor/arithmetic/absolute.py +68 -0
- maxframe/tensor/arithmetic/add.py +82 -0
- maxframe/tensor/arithmetic/angle.py +72 -0
- maxframe/tensor/arithmetic/arccos.py +104 -0
- maxframe/tensor/arithmetic/arccosh.py +91 -0
- maxframe/tensor/arithmetic/arcsin.py +94 -0
- maxframe/tensor/arithmetic/arcsinh.py +86 -0
- maxframe/tensor/arithmetic/arctan.py +106 -0
- maxframe/tensor/arithmetic/arctan2.py +128 -0
- maxframe/tensor/arithmetic/arctanh.py +86 -0
- maxframe/tensor/arithmetic/around.py +114 -0
- maxframe/tensor/arithmetic/bitand.py +95 -0
- maxframe/tensor/arithmetic/bitor.py +102 -0
- maxframe/tensor/arithmetic/bitxor.py +95 -0
- maxframe/tensor/arithmetic/cbrt.py +66 -0
- maxframe/tensor/arithmetic/ceil.py +71 -0
- maxframe/tensor/arithmetic/clip.py +165 -0
- maxframe/tensor/arithmetic/conj.py +74 -0
- maxframe/tensor/arithmetic/copysign.py +78 -0
- maxframe/tensor/arithmetic/core.py +544 -0
- maxframe/tensor/arithmetic/cos.py +85 -0
- maxframe/tensor/arithmetic/cosh.py +72 -0
- maxframe/tensor/arithmetic/deg2rad.py +72 -0
- maxframe/tensor/arithmetic/degrees.py +77 -0
- maxframe/tensor/arithmetic/divide.py +114 -0
- maxframe/tensor/arithmetic/equal.py +76 -0
- maxframe/tensor/arithmetic/exp.py +106 -0
- maxframe/tensor/arithmetic/exp2.py +67 -0
- maxframe/tensor/arithmetic/expm1.py +79 -0
- maxframe/tensor/arithmetic/fabs.py +74 -0
- maxframe/tensor/arithmetic/fix.py +69 -0
- maxframe/tensor/arithmetic/float_power.py +103 -0
- maxframe/tensor/arithmetic/floor.py +77 -0
- maxframe/tensor/arithmetic/floordiv.py +94 -0
- maxframe/tensor/arithmetic/fmax.py +105 -0
- maxframe/tensor/arithmetic/fmin.py +106 -0
- maxframe/tensor/arithmetic/fmod.py +99 -0
- maxframe/tensor/arithmetic/frexp.py +92 -0
- maxframe/tensor/arithmetic/greater.py +77 -0
- maxframe/tensor/arithmetic/greater_equal.py +69 -0
- maxframe/tensor/arithmetic/hypot.py +77 -0
- maxframe/tensor/arithmetic/i0.py +89 -0
- maxframe/tensor/arithmetic/imag.py +67 -0
- maxframe/tensor/arithmetic/invert.py +110 -0
- maxframe/tensor/arithmetic/isclose.py +115 -0
- maxframe/tensor/arithmetic/iscomplex.py +64 -0
- maxframe/tensor/arithmetic/isfinite.py +106 -0
- maxframe/tensor/arithmetic/isinf.py +103 -0
- maxframe/tensor/arithmetic/isnan.py +82 -0
- maxframe/tensor/arithmetic/isreal.py +63 -0
- maxframe/tensor/arithmetic/ldexp.py +99 -0
- maxframe/tensor/arithmetic/less.py +69 -0
- maxframe/tensor/arithmetic/less_equal.py +69 -0
- maxframe/tensor/arithmetic/log.py +92 -0
- maxframe/tensor/arithmetic/log10.py +85 -0
- maxframe/tensor/arithmetic/log1p.py +95 -0
- maxframe/tensor/arithmetic/log2.py +85 -0
- maxframe/tensor/arithmetic/logaddexp.py +80 -0
- maxframe/tensor/arithmetic/logaddexp2.py +78 -0
- maxframe/tensor/arithmetic/logical_and.py +81 -0
- maxframe/tensor/arithmetic/logical_not.py +74 -0
- maxframe/tensor/arithmetic/logical_or.py +82 -0
- maxframe/tensor/arithmetic/logical_xor.py +88 -0
- maxframe/tensor/arithmetic/lshift.py +82 -0
- maxframe/tensor/arithmetic/maximum.py +108 -0
- maxframe/tensor/arithmetic/minimum.py +108 -0
- maxframe/tensor/arithmetic/mod.py +104 -0
- maxframe/tensor/arithmetic/modf.py +83 -0
- maxframe/tensor/arithmetic/multiply.py +81 -0
- maxframe/tensor/arithmetic/nan_to_num.py +99 -0
- maxframe/tensor/arithmetic/negative.py +65 -0
- maxframe/tensor/arithmetic/nextafter.py +68 -0
- maxframe/tensor/arithmetic/not_equal.py +72 -0
- maxframe/tensor/arithmetic/positive.py +47 -0
- maxframe/tensor/arithmetic/power.py +106 -0
- maxframe/tensor/arithmetic/rad2deg.py +71 -0
- maxframe/tensor/arithmetic/radians.py +77 -0
- maxframe/tensor/arithmetic/real.py +70 -0
- maxframe/tensor/arithmetic/reciprocal.py +76 -0
- maxframe/tensor/arithmetic/rint.py +68 -0
- maxframe/tensor/arithmetic/rshift.py +81 -0
- maxframe/tensor/arithmetic/setimag.py +29 -0
- maxframe/tensor/arithmetic/setreal.py +29 -0
- maxframe/tensor/arithmetic/sign.py +81 -0
- maxframe/tensor/arithmetic/signbit.py +65 -0
- maxframe/tensor/arithmetic/sin.py +98 -0
- maxframe/tensor/arithmetic/sinc.py +102 -0
- maxframe/tensor/arithmetic/sinh.py +93 -0
- maxframe/tensor/arithmetic/spacing.py +72 -0
- maxframe/tensor/arithmetic/sqrt.py +81 -0
- maxframe/tensor/arithmetic/square.py +69 -0
- maxframe/tensor/arithmetic/subtract.py +81 -0
- maxframe/tensor/arithmetic/tan.py +88 -0
- maxframe/tensor/arithmetic/tanh.py +92 -0
- maxframe/tensor/arithmetic/tests/__init__.py +15 -0
- maxframe/tensor/arithmetic/tests/test_arithmetic.py +414 -0
- maxframe/tensor/arithmetic/truediv.py +104 -0
- maxframe/tensor/arithmetic/trunc.py +72 -0
- maxframe/tensor/arithmetic/utils.py +65 -0
- maxframe/tensor/array_utils.py +186 -0
- maxframe/tensor/base/__init__.py +34 -0
- maxframe/tensor/base/astype.py +119 -0
- maxframe/tensor/base/atleast_1d.py +74 -0
- maxframe/tensor/base/broadcast_to.py +89 -0
- maxframe/tensor/base/ravel.py +92 -0
- maxframe/tensor/base/tests/__init__.py +13 -0
- maxframe/tensor/base/tests/test_base.py +114 -0
- maxframe/tensor/base/transpose.py +125 -0
- maxframe/tensor/base/unique.py +205 -0
- maxframe/tensor/base/where.py +127 -0
- maxframe/tensor/core.py +724 -0
- maxframe/tensor/datasource/__init__.py +32 -0
- maxframe/tensor/datasource/arange.py +156 -0
- maxframe/tensor/datasource/array.py +415 -0
- maxframe/tensor/datasource/core.py +109 -0
- maxframe/tensor/datasource/empty.py +169 -0
- maxframe/tensor/datasource/from_dataframe.py +70 -0
- maxframe/tensor/datasource/from_dense.py +54 -0
- maxframe/tensor/datasource/from_sparse.py +47 -0
- maxframe/tensor/datasource/full.py +186 -0
- maxframe/tensor/datasource/ones.py +173 -0
- maxframe/tensor/datasource/scalar.py +40 -0
- maxframe/tensor/datasource/tests/__init__.py +13 -0
- maxframe/tensor/datasource/tests/test_datasource.py +278 -0
- maxframe/tensor/datasource/zeros.py +188 -0
- maxframe/tensor/fetch/__init__.py +15 -0
- maxframe/tensor/fetch/core.py +54 -0
- maxframe/tensor/indexing/__init__.py +47 -0
- maxframe/tensor/indexing/choose.py +196 -0
- maxframe/tensor/indexing/compress.py +124 -0
- maxframe/tensor/indexing/core.py +190 -0
- maxframe/tensor/indexing/extract.py +71 -0
- maxframe/tensor/indexing/fill_diagonal.py +183 -0
- maxframe/tensor/indexing/flatnonzero.py +60 -0
- maxframe/tensor/indexing/getitem.py +175 -0
- maxframe/tensor/indexing/nonzero.py +120 -0
- maxframe/tensor/indexing/setitem.py +132 -0
- maxframe/tensor/indexing/slice.py +29 -0
- maxframe/tensor/indexing/take.py +130 -0
- maxframe/tensor/indexing/tests/__init__.py +15 -0
- maxframe/tensor/indexing/tests/test_indexing.py +234 -0
- maxframe/tensor/indexing/unravel_index.py +103 -0
- maxframe/tensor/merge/__init__.py +15 -0
- maxframe/tensor/merge/stack.py +132 -0
- maxframe/tensor/merge/tests/__init__.py +13 -0
- maxframe/tensor/merge/tests/test_merge.py +52 -0
- maxframe/tensor/operators.py +123 -0
- maxframe/tensor/random/__init__.py +168 -0
- maxframe/tensor/random/beta.py +87 -0
- maxframe/tensor/random/binomial.py +137 -0
- maxframe/tensor/random/bytes.py +39 -0
- maxframe/tensor/random/chisquare.py +110 -0
- maxframe/tensor/random/choice.py +186 -0
- maxframe/tensor/random/core.py +234 -0
- maxframe/tensor/random/dirichlet.py +123 -0
- maxframe/tensor/random/exponential.py +94 -0
- maxframe/tensor/random/f.py +135 -0
- maxframe/tensor/random/gamma.py +128 -0
- maxframe/tensor/random/geometric.py +93 -0
- maxframe/tensor/random/gumbel.py +167 -0
- maxframe/tensor/random/hypergeometric.py +148 -0
- maxframe/tensor/random/laplace.py +133 -0
- maxframe/tensor/random/logistic.py +129 -0
- maxframe/tensor/random/lognormal.py +159 -0
- maxframe/tensor/random/logseries.py +122 -0
- maxframe/tensor/random/multinomial.py +133 -0
- maxframe/tensor/random/multivariate_normal.py +192 -0
- maxframe/tensor/random/negative_binomial.py +125 -0
- maxframe/tensor/random/noncentral_chisquare.py +132 -0
- maxframe/tensor/random/noncentral_f.py +126 -0
- maxframe/tensor/random/normal.py +143 -0
- maxframe/tensor/random/pareto.py +140 -0
- maxframe/tensor/random/permutation.py +104 -0
- maxframe/tensor/random/poisson.py +111 -0
- maxframe/tensor/random/power.py +142 -0
- maxframe/tensor/random/rand.py +82 -0
- maxframe/tensor/random/randint.py +121 -0
- maxframe/tensor/random/randn.py +96 -0
- maxframe/tensor/random/random_integers.py +123 -0
- maxframe/tensor/random/random_sample.py +86 -0
- maxframe/tensor/random/rayleigh.py +110 -0
- maxframe/tensor/random/shuffle.py +61 -0
- maxframe/tensor/random/standard_cauchy.py +105 -0
- maxframe/tensor/random/standard_exponential.py +72 -0
- maxframe/tensor/random/standard_gamma.py +120 -0
- maxframe/tensor/random/standard_normal.py +74 -0
- maxframe/tensor/random/standard_t.py +135 -0
- maxframe/tensor/random/tests/__init__.py +15 -0
- maxframe/tensor/random/tests/test_random.py +167 -0
- maxframe/tensor/random/triangular.py +119 -0
- maxframe/tensor/random/uniform.py +131 -0
- maxframe/tensor/random/vonmises.py +131 -0
- maxframe/tensor/random/wald.py +114 -0
- maxframe/tensor/random/weibull.py +140 -0
- maxframe/tensor/random/zipf.py +122 -0
- maxframe/tensor/rechunk/__init__.py +26 -0
- maxframe/tensor/rechunk/rechunk.py +43 -0
- maxframe/tensor/reduction/__init__.py +66 -0
- maxframe/tensor/reduction/all.py +103 -0
- maxframe/tensor/reduction/allclose.py +88 -0
- maxframe/tensor/reduction/any.py +105 -0
- maxframe/tensor/reduction/argmax.py +103 -0
- maxframe/tensor/reduction/argmin.py +103 -0
- maxframe/tensor/reduction/array_equal.py +64 -0
- maxframe/tensor/reduction/core.py +168 -0
- maxframe/tensor/reduction/count_nonzero.py +81 -0
- maxframe/tensor/reduction/cumprod.py +97 -0
- maxframe/tensor/reduction/cumsum.py +101 -0
- maxframe/tensor/reduction/max.py +120 -0
- maxframe/tensor/reduction/mean.py +123 -0
- maxframe/tensor/reduction/min.py +120 -0
- maxframe/tensor/reduction/nanargmax.py +82 -0
- maxframe/tensor/reduction/nanargmin.py +76 -0
- maxframe/tensor/reduction/nancumprod.py +91 -0
- maxframe/tensor/reduction/nancumsum.py +94 -0
- maxframe/tensor/reduction/nanmax.py +111 -0
- maxframe/tensor/reduction/nanmean.py +106 -0
- maxframe/tensor/reduction/nanmin.py +111 -0
- maxframe/tensor/reduction/nanprod.py +94 -0
- maxframe/tensor/reduction/nanstd.py +126 -0
- maxframe/tensor/reduction/nansum.py +115 -0
- maxframe/tensor/reduction/nanvar.py +149 -0
- maxframe/tensor/reduction/prod.py +130 -0
- maxframe/tensor/reduction/std.py +134 -0
- maxframe/tensor/reduction/sum.py +125 -0
- maxframe/tensor/reduction/tests/__init__.py +13 -0
- maxframe/tensor/reduction/tests/test_reduction.py +181 -0
- maxframe/tensor/reduction/var.py +176 -0
- maxframe/tensor/reshape/__init__.py +17 -0
- maxframe/tensor/reshape/reshape.py +188 -0
- maxframe/tensor/reshape/tests/__init__.py +15 -0
- maxframe/tensor/reshape/tests/test_reshape.py +37 -0
- maxframe/tensor/statistics/__init__.py +13 -0
- maxframe/tensor/statistics/percentile.py +175 -0
- maxframe/tensor/statistics/quantile.py +288 -0
- maxframe/tensor/ufunc/__init__.py +26 -0
- maxframe/tensor/ufunc/ufunc.py +200 -0
- maxframe/tensor/utils.py +718 -0
- maxframe/tests/__init__.py +13 -0
- maxframe/tests/test_codegen.py +69 -0
- maxframe/tests/test_protocol.py +144 -0
- maxframe/tests/test_utils.py +376 -0
- maxframe/tests/utils.py +164 -0
- maxframe/typing_.py +37 -0
- maxframe/udf.py +134 -0
- maxframe/utils.py +1114 -0
- maxframe-0.1.0b5.dist-info/METADATA +104 -0
- maxframe-0.1.0b5.dist-info/RECORD +647 -0
- maxframe-0.1.0b5.dist-info/WHEEL +5 -0
- maxframe-0.1.0b5.dist-info/top_level.txt +3 -0
- maxframe_client/__init__.py +17 -0
- maxframe_client/clients/__init__.py +13 -0
- maxframe_client/clients/framedriver.py +118 -0
- maxframe_client/clients/spe.py +104 -0
- maxframe_client/conftest.py +15 -0
- maxframe_client/fetcher.py +264 -0
- maxframe_client/session/__init__.py +22 -0
- maxframe_client/session/consts.py +36 -0
- maxframe_client/session/graph.py +119 -0
- maxframe_client/session/odps.py +482 -0
- maxframe_client/session/task.py +280 -0
- maxframe_client/session/tests/__init__.py +13 -0
- maxframe_client/session/tests/test_task.py +85 -0
- maxframe_client/tests/__init__.py +13 -0
- maxframe_client/tests/test_fetcher.py +89 -0
- maxframe_client/tests/test_session.py +255 -0
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from ...core import ExecutableTuple
|
|
20
|
+
from ...serialization.serializables import (
|
|
21
|
+
AnyField,
|
|
22
|
+
DictField,
|
|
23
|
+
FieldTypes,
|
|
24
|
+
KeyField,
|
|
25
|
+
ListField,
|
|
26
|
+
StringField,
|
|
27
|
+
)
|
|
28
|
+
from ..core import Tensor, TensorOrder
|
|
29
|
+
from ..datasource import tensor as astensor
|
|
30
|
+
from ..operators import TensorOperator, TensorOperatorMixin
|
|
31
|
+
from ..utils import broadcast_shape, check_order, check_out_param, filter_inputs
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class TensorElementWise(TensorOperatorMixin):
|
|
35
|
+
__slots__ = ()
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class TensorElementWiseWithInputs(TensorElementWise):
|
|
39
|
+
def _set_sparse(self, inputs):
|
|
40
|
+
raise NotImplementedError
|
|
41
|
+
|
|
42
|
+
def _new_tileables(self, inputs, kws=None, **kw):
|
|
43
|
+
self._set_sparse(inputs)
|
|
44
|
+
return super()._new_tileables(inputs, kws=kws, **kw)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def _handle_out_dtype(val, dtype):
|
|
48
|
+
if val.dtype != dtype:
|
|
49
|
+
return val.astype(dtype)
|
|
50
|
+
return val
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class TensorBinOpMixin(TensorElementWiseWithInputs):
|
|
54
|
+
__slots__ = ()
|
|
55
|
+
|
|
56
|
+
def check_inputs(self, inputs):
|
|
57
|
+
if len(inputs) > 4:
|
|
58
|
+
raise ValueError(
|
|
59
|
+
f"Binary operator's inputs should less than or equal 4, got {len(inputs)}"
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
@classmethod
|
|
63
|
+
def _get_func(cls, xp):
|
|
64
|
+
func_name = getattr(cls, "_func_name")
|
|
65
|
+
return getattr(xp, func_name)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
class TensorBinOp(TensorOperator, TensorBinOpMixin):
|
|
69
|
+
lhs = AnyField("lhs", default=None)
|
|
70
|
+
rhs = AnyField("rhs", default=None)
|
|
71
|
+
out = KeyField("out", default=None)
|
|
72
|
+
where = KeyField("where", default=None)
|
|
73
|
+
casting = StringField("casting", default=None)
|
|
74
|
+
order = StringField("order", default=None)
|
|
75
|
+
err = DictField("err", FieldTypes.string, FieldTypes.string, default_factory=dict)
|
|
76
|
+
|
|
77
|
+
def __init__(self, **kwargs):
|
|
78
|
+
super().__init__(**kwargs)
|
|
79
|
+
if self.order is None:
|
|
80
|
+
self.order = "K"
|
|
81
|
+
check_order(self.order)
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
def _is_sparse(cls, x1, x2):
|
|
85
|
+
return False
|
|
86
|
+
|
|
87
|
+
def _set_sparse(self, inputs):
|
|
88
|
+
inputs_iter = iter(inputs)
|
|
89
|
+
x1 = self.lhs if np.isscalar(self.lhs) else next(inputs_iter)
|
|
90
|
+
x2 = self.rhs if np.isscalar(self.rhs) else next(inputs_iter)
|
|
91
|
+
setattr(self, "sparse", self._is_sparse(x1, x2))
|
|
92
|
+
|
|
93
|
+
def _set_inputs(self, inputs):
|
|
94
|
+
super()._set_inputs(inputs)
|
|
95
|
+
inputs_iter = iter(self._inputs)
|
|
96
|
+
|
|
97
|
+
self.lhs = self.lhs if np.isscalar(self.lhs) else next(inputs_iter)
|
|
98
|
+
self.rhs = self.rhs if np.isscalar(self.rhs) else next(inputs_iter)
|
|
99
|
+
if getattr(self, "out", None) is not None:
|
|
100
|
+
self.out = next(inputs_iter)
|
|
101
|
+
if getattr(self, "where", None) is not None:
|
|
102
|
+
self.where = next(inputs_iter)
|
|
103
|
+
|
|
104
|
+
def _process_inputs(self, x1, x2, out, where):
|
|
105
|
+
x1 = x1 if np.isscalar(x1) else astensor(x1)
|
|
106
|
+
x2 = x2 if np.isscalar(x2) else astensor(x2)
|
|
107
|
+
self.lhs = x1
|
|
108
|
+
self.rhs = x2
|
|
109
|
+
|
|
110
|
+
if out is not None:
|
|
111
|
+
if isinstance(out, Tensor):
|
|
112
|
+
self.out = out
|
|
113
|
+
else:
|
|
114
|
+
raise TypeError(f"out should be Tensor object, got {type(out)} instead")
|
|
115
|
+
if where is True:
|
|
116
|
+
where = None
|
|
117
|
+
if where is not None:
|
|
118
|
+
where = astensor(where)
|
|
119
|
+
self.where = where
|
|
120
|
+
|
|
121
|
+
return x1, x2, out, where
|
|
122
|
+
|
|
123
|
+
def _calc_order(self, x1, x2, out):
|
|
124
|
+
if out is not None:
|
|
125
|
+
return out.order
|
|
126
|
+
|
|
127
|
+
if self.order in "KA":
|
|
128
|
+
orders = []
|
|
129
|
+
if not np.isscalar(x1):
|
|
130
|
+
orders.append(x1.order)
|
|
131
|
+
if not np.isscalar(x2):
|
|
132
|
+
orders.append(x2.order)
|
|
133
|
+
|
|
134
|
+
if len(orders) == 0:
|
|
135
|
+
return TensorOrder.C_ORDER
|
|
136
|
+
elif any(order == TensorOrder.C_ORDER for order in orders):
|
|
137
|
+
return TensorOrder.C_ORDER
|
|
138
|
+
else:
|
|
139
|
+
return TensorOrder.F_ORDER
|
|
140
|
+
elif self.order == "C":
|
|
141
|
+
return TensorOrder.C_ORDER
|
|
142
|
+
else:
|
|
143
|
+
return TensorOrder.F_ORDER
|
|
144
|
+
|
|
145
|
+
@property
|
|
146
|
+
def ufunc_extra_params(self):
|
|
147
|
+
return dict()
|
|
148
|
+
|
|
149
|
+
def _call_tensor_ufunc(self, x1, x2, out=None, where=None):
|
|
150
|
+
if hasattr(x1, "__tensor_ufunc__") or hasattr(x2, "__tensor_ufunc__"):
|
|
151
|
+
ufunc = (
|
|
152
|
+
x1.__tensor_ufunc__
|
|
153
|
+
if hasattr(x1, "__tensor_ufunc__")
|
|
154
|
+
else x2.__tensor_ufunc__
|
|
155
|
+
)
|
|
156
|
+
ret = ufunc(type(self), [x1, x2], out, where, **self.ufunc_extra_params)
|
|
157
|
+
if ret is NotImplemented:
|
|
158
|
+
return
|
|
159
|
+
return ret
|
|
160
|
+
|
|
161
|
+
def _call(self, x1, x2, out=None, where=None):
|
|
162
|
+
# check tensor ufunc, if x1 or x2 is not a tensor, e.g. MaxFrame DataFrame
|
|
163
|
+
# which implements tensor ufunc, will delegate the computation
|
|
164
|
+
# to it if possible
|
|
165
|
+
ret = self._call_tensor_ufunc(x1, x2, out=out, where=where)
|
|
166
|
+
if ret is not None:
|
|
167
|
+
return ret
|
|
168
|
+
|
|
169
|
+
x1, x2, out, where = self._process_inputs(x1, x2, out, where)
|
|
170
|
+
# check broadcast
|
|
171
|
+
x1_shape = () if np.isscalar(x1) else x1.shape
|
|
172
|
+
x2_shape = () if np.isscalar(x2) else x2.shape
|
|
173
|
+
shape = broadcast_shape(x1_shape, x2_shape)
|
|
174
|
+
order = self._calc_order(x1, x2, out)
|
|
175
|
+
|
|
176
|
+
inputs = filter_inputs([x1, x2, out, where])
|
|
177
|
+
t = self.new_tensor(inputs, shape, order=order)
|
|
178
|
+
|
|
179
|
+
if out is None:
|
|
180
|
+
return t
|
|
181
|
+
|
|
182
|
+
check_out_param(out, t, self.casting)
|
|
183
|
+
out_shape, out_dtype = out.shape, out.dtype
|
|
184
|
+
|
|
185
|
+
# if `out` is specified, use out's dtype and shape
|
|
186
|
+
if t.shape != out_shape:
|
|
187
|
+
t = self.new_tensor(inputs, out_shape, order=order)
|
|
188
|
+
setattr(self, "dtype", out_dtype)
|
|
189
|
+
|
|
190
|
+
out.data = t.data
|
|
191
|
+
return out
|
|
192
|
+
|
|
193
|
+
def __call__(self, x1, x2, out=None, where=None):
|
|
194
|
+
return self._call(x1, x2, out=out, where=where)
|
|
195
|
+
|
|
196
|
+
def rcall(self, x1, x2, out=None, where=None):
|
|
197
|
+
return self._call(x2, x1, out=out, where=where)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
class TensorUnaryOpMixin(TensorElementWiseWithInputs):
|
|
201
|
+
__slots__ = ()
|
|
202
|
+
|
|
203
|
+
def check_inputs(self, inputs):
|
|
204
|
+
if len(inputs) > 3:
|
|
205
|
+
raise ValueError(
|
|
206
|
+
f"Binary operator's inputs should less than or equal 3, got {len(inputs)}"
|
|
207
|
+
)
|
|
208
|
+
|
|
209
|
+
@classmethod
|
|
210
|
+
def _get_func(cls, xp):
|
|
211
|
+
func_name = getattr(cls, "_func_name")
|
|
212
|
+
return getattr(xp, func_name)
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
class TensorUnaryOp(TensorOperator, TensorUnaryOpMixin):
|
|
216
|
+
_input = KeyField("input")
|
|
217
|
+
out = KeyField("out", default=None)
|
|
218
|
+
where = KeyField("where", default=None)
|
|
219
|
+
casting = StringField("casting", default=None)
|
|
220
|
+
order = StringField("order", default=None)
|
|
221
|
+
err = DictField("err", FieldTypes.string, FieldTypes.string, default_factory=dict)
|
|
222
|
+
|
|
223
|
+
def __init__(self, **kwargs):
|
|
224
|
+
super().__init__(**kwargs)
|
|
225
|
+
if self.order is None:
|
|
226
|
+
self.order = "K"
|
|
227
|
+
check_order(self.order)
|
|
228
|
+
|
|
229
|
+
@property
|
|
230
|
+
def input(self):
|
|
231
|
+
return self._input
|
|
232
|
+
|
|
233
|
+
@classmethod
|
|
234
|
+
def _is_sparse(cls, x):
|
|
235
|
+
if hasattr(x, "issparse") and x.issparse():
|
|
236
|
+
return True
|
|
237
|
+
else:
|
|
238
|
+
return False
|
|
239
|
+
|
|
240
|
+
def _set_inputs(self, inputs):
|
|
241
|
+
super()._set_inputs(inputs)
|
|
242
|
+
inputs_iter = iter(self._inputs)
|
|
243
|
+
|
|
244
|
+
self._input = next(inputs_iter)
|
|
245
|
+
if getattr(self, "out", None) is not None:
|
|
246
|
+
self.out = next(inputs_iter)
|
|
247
|
+
if getattr(self, "where", None) is not None:
|
|
248
|
+
self.where = next(inputs_iter)
|
|
249
|
+
|
|
250
|
+
def _process_inputs(self, x, out, where):
|
|
251
|
+
x = astensor(x)
|
|
252
|
+
|
|
253
|
+
if out is not None:
|
|
254
|
+
if isinstance(out, Tensor):
|
|
255
|
+
self.out = out
|
|
256
|
+
else:
|
|
257
|
+
raise TypeError(f"out should be Tensor object, got {type(out)} instead")
|
|
258
|
+
if where is True:
|
|
259
|
+
where = None
|
|
260
|
+
if where is not None:
|
|
261
|
+
where = astensor(where)
|
|
262
|
+
self.where = where
|
|
263
|
+
|
|
264
|
+
return x, out, where
|
|
265
|
+
|
|
266
|
+
def _set_sparse(self, inputs):
|
|
267
|
+
setattr(self, "sparse", self._is_sparse(inputs[0]))
|
|
268
|
+
|
|
269
|
+
def _calc_order(self, x, out):
|
|
270
|
+
if out is not None:
|
|
271
|
+
return out.order
|
|
272
|
+
|
|
273
|
+
if self.order in "KA":
|
|
274
|
+
return x.order
|
|
275
|
+
elif self.order == "C":
|
|
276
|
+
return TensorOrder.C_ORDER
|
|
277
|
+
else:
|
|
278
|
+
return TensorOrder.F_ORDER
|
|
279
|
+
|
|
280
|
+
@property
|
|
281
|
+
def ufunc_extra_params(self):
|
|
282
|
+
return dict()
|
|
283
|
+
|
|
284
|
+
def _call_tensor_ufunc(self, x, out=None, where=None):
|
|
285
|
+
if hasattr(x, "__tensor_ufunc__"):
|
|
286
|
+
ret = x.__tensor_ufunc__(
|
|
287
|
+
type(self), [x], out, where, **self.ufunc_extra_params
|
|
288
|
+
)
|
|
289
|
+
if ret is NotImplemented:
|
|
290
|
+
return
|
|
291
|
+
return ret
|
|
292
|
+
|
|
293
|
+
def _call(self, x, out=None, where=None):
|
|
294
|
+
# check tensor ufunc, if x is not a tensor, e.g. MaxFrame DataFrame
|
|
295
|
+
# which implements tensor ufunc, will delegate the computation
|
|
296
|
+
# to it if possible
|
|
297
|
+
ret = self._call_tensor_ufunc(x, out=out, where=where)
|
|
298
|
+
if ret is not None:
|
|
299
|
+
return ret
|
|
300
|
+
|
|
301
|
+
x, out, where = self._process_inputs(x, out, where)
|
|
302
|
+
shape = x.shape
|
|
303
|
+
order = self._calc_order(x, out)
|
|
304
|
+
|
|
305
|
+
inputs = filter_inputs([x, out, where])
|
|
306
|
+
t = self.new_tensor(inputs, shape, order=order)
|
|
307
|
+
|
|
308
|
+
if out is None:
|
|
309
|
+
return t
|
|
310
|
+
|
|
311
|
+
check_out_param(out, t, getattr(self, "casting"))
|
|
312
|
+
out_shape, out_dtype = out.shape, out.dtype
|
|
313
|
+
|
|
314
|
+
# if `out` is specified, use out's dtype and shape
|
|
315
|
+
if t.shape != out_shape:
|
|
316
|
+
t = self.new_tensor(inputs, out_shape, order=order)
|
|
317
|
+
setattr(self, "dtype", out_dtype)
|
|
318
|
+
|
|
319
|
+
out.data = t.data
|
|
320
|
+
return out
|
|
321
|
+
|
|
322
|
+
def __call__(self, x, out=None, where=None):
|
|
323
|
+
return self._call(x, out=out, where=where)
|
|
324
|
+
|
|
325
|
+
|
|
326
|
+
class TensorOutBinOp(TensorOperator, TensorElementWiseWithInputs):
|
|
327
|
+
_input = KeyField("input")
|
|
328
|
+
out1 = KeyField("out1", default=None)
|
|
329
|
+
out2 = KeyField("out2", default=None)
|
|
330
|
+
where = KeyField("where", default=None)
|
|
331
|
+
order = StringField("order", default=None)
|
|
332
|
+
casting = StringField("casting", default=None)
|
|
333
|
+
|
|
334
|
+
def __init__(self, **kwargs):
|
|
335
|
+
super().__init__(**kwargs)
|
|
336
|
+
if self.order is None:
|
|
337
|
+
self.order = "K"
|
|
338
|
+
check_order(self.order)
|
|
339
|
+
|
|
340
|
+
@property
|
|
341
|
+
def output_limit(self):
|
|
342
|
+
return 2
|
|
343
|
+
|
|
344
|
+
@property
|
|
345
|
+
def input(self):
|
|
346
|
+
return self._input
|
|
347
|
+
|
|
348
|
+
def _set_inputs(self, inputs):
|
|
349
|
+
super()._set_inputs(inputs)
|
|
350
|
+
inputs_iter = iter(self._inputs)
|
|
351
|
+
|
|
352
|
+
self._input = next(inputs_iter)
|
|
353
|
+
if getattr(self, "out1", None) is not None:
|
|
354
|
+
self.out1 = next(inputs_iter)
|
|
355
|
+
if getattr(self, "out2", None) is not None:
|
|
356
|
+
self.out2 = next(inputs_iter)
|
|
357
|
+
if getattr(self, "where", None) is not None:
|
|
358
|
+
self.where = next(inputs_iter)
|
|
359
|
+
|
|
360
|
+
def _process_inputs(self, x, out1, out2, where):
|
|
361
|
+
x = astensor(x)
|
|
362
|
+
|
|
363
|
+
if out1 is not None:
|
|
364
|
+
if isinstance(out1, Tensor):
|
|
365
|
+
self.out1 = out1
|
|
366
|
+
else:
|
|
367
|
+
raise TypeError(
|
|
368
|
+
f"out1 should be Tensor object, got {type(out1)} instead"
|
|
369
|
+
)
|
|
370
|
+
if out2 is not None:
|
|
371
|
+
if isinstance(out2, Tensor):
|
|
372
|
+
self.out2 = out2
|
|
373
|
+
else:
|
|
374
|
+
raise TypeError(
|
|
375
|
+
f"out2 should be Tensor object, got {type(out2)} instead"
|
|
376
|
+
)
|
|
377
|
+
if where is True:
|
|
378
|
+
where = None
|
|
379
|
+
if where is not None:
|
|
380
|
+
where = astensor(where)
|
|
381
|
+
self.where = where
|
|
382
|
+
|
|
383
|
+
return x, out1, out2, where
|
|
384
|
+
|
|
385
|
+
@classmethod
|
|
386
|
+
def _is_sparse(cls, x):
|
|
387
|
+
return False
|
|
388
|
+
|
|
389
|
+
def _set_sparse(self, inputs):
|
|
390
|
+
setattr(self, "sparse", self._is_sparse(inputs[0]))
|
|
391
|
+
|
|
392
|
+
@property
|
|
393
|
+
def _fun(self):
|
|
394
|
+
raise NotImplementedError
|
|
395
|
+
|
|
396
|
+
def _calc_order(self, x, out):
|
|
397
|
+
if out is not None:
|
|
398
|
+
return out.order
|
|
399
|
+
|
|
400
|
+
if self.order in "KA":
|
|
401
|
+
return x.order
|
|
402
|
+
elif self.order == "C":
|
|
403
|
+
return TensorOrder.C_ORDER
|
|
404
|
+
else:
|
|
405
|
+
return TensorOrder.F_ORDER
|
|
406
|
+
|
|
407
|
+
def _call(self, x, out1=None, out2=None, out=None, where=None):
|
|
408
|
+
dtype = [r.dtype for r in self._fun(np.empty(1, dtype=x.dtype))]
|
|
409
|
+
|
|
410
|
+
out = out or (None, None)
|
|
411
|
+
out1 = out1 or out[0]
|
|
412
|
+
out2 = out2 or out[1]
|
|
413
|
+
x, out1, out2, where = self._process_inputs(x, out1, out2, where)
|
|
414
|
+
shape = x.shape
|
|
415
|
+
order1 = self._calc_order(x, out1)
|
|
416
|
+
order2 = self._calc_order(x, out2)
|
|
417
|
+
|
|
418
|
+
inputs = filter_inputs([x, out1, out2, where])
|
|
419
|
+
t1, t2 = self.new_tensors(
|
|
420
|
+
inputs,
|
|
421
|
+
shape,
|
|
422
|
+
kws=[
|
|
423
|
+
{"order": order1, "dtype": dtype[0], "side": "left"},
|
|
424
|
+
{"order": order2, "dtype": dtype[1], "side": "right"},
|
|
425
|
+
],
|
|
426
|
+
)
|
|
427
|
+
|
|
428
|
+
if out1 is None and out2 is None:
|
|
429
|
+
return ExecutableTuple([t1, t2])
|
|
430
|
+
|
|
431
|
+
if out1 is not None:
|
|
432
|
+
check_out_param(out1, t1, self.casting)
|
|
433
|
+
out1_shape, out1_dtype = out1.shape, out1.dtype
|
|
434
|
+
else:
|
|
435
|
+
out1_shape, out1_dtype = t1.shape, t1.dtype
|
|
436
|
+
if out2 is not None:
|
|
437
|
+
check_out_param(out2, t2, self.casting)
|
|
438
|
+
out2_shape, out2_dtype = out2.shape, out2.dtype
|
|
439
|
+
else:
|
|
440
|
+
out2_shape, out2_dtype = t2.shape, t2.dtype
|
|
441
|
+
# if `out` is specified, use out's dtype and shape
|
|
442
|
+
if t1.shape != out1_shape or t2.shape != out2_shape:
|
|
443
|
+
t1, t2 = self.new_tensor(
|
|
444
|
+
inputs,
|
|
445
|
+
[out1_shape, out2_shape],
|
|
446
|
+
kws=[
|
|
447
|
+
{"order": order1, "dtype": out1_dtype},
|
|
448
|
+
{"order": order2, "dtype": out2_dtype},
|
|
449
|
+
],
|
|
450
|
+
)
|
|
451
|
+
|
|
452
|
+
if out1 is not None:
|
|
453
|
+
out1.data = t1.data
|
|
454
|
+
else:
|
|
455
|
+
out1 = t1
|
|
456
|
+
if out2 is not None:
|
|
457
|
+
out2.data = t2.data
|
|
458
|
+
else:
|
|
459
|
+
out2 = t2
|
|
460
|
+
return ExecutableTuple([out1, out2])
|
|
461
|
+
|
|
462
|
+
def __call__(self, x, out1=None, out2=None, out=None, where=None):
|
|
463
|
+
return self._call(x, out1=out1, out2=out2, out=out, where=where)
|
|
464
|
+
|
|
465
|
+
|
|
466
|
+
class TensorMultiOp(TensorElementWiseWithInputs, TensorOperator):
|
|
467
|
+
args = ListField("args", default=None)
|
|
468
|
+
out = KeyField("out", default=None)
|
|
469
|
+
where = KeyField("where", default=None)
|
|
470
|
+
casting = StringField("casting", default=None)
|
|
471
|
+
order = StringField("order", default=None)
|
|
472
|
+
err = DictField("err", FieldTypes.string, FieldTypes.string, default_factory=dict)
|
|
473
|
+
|
|
474
|
+
def __init__(self, **kwargs):
|
|
475
|
+
super().__init__(**kwargs)
|
|
476
|
+
if self.casting is None:
|
|
477
|
+
self.casting = "same_kind"
|
|
478
|
+
if self.order is None:
|
|
479
|
+
self.order = "K"
|
|
480
|
+
check_order(self.order)
|
|
481
|
+
|
|
482
|
+
@classmethod
|
|
483
|
+
def _is_sparse(cls, *args):
|
|
484
|
+
return False
|
|
485
|
+
|
|
486
|
+
def _set_sparse(self, inputs):
|
|
487
|
+
inputs_iter = iter(inputs or ())
|
|
488
|
+
args = list(self.args)
|
|
489
|
+
for idx in range(len(self.args)):
|
|
490
|
+
if not np.isscalar(self.args[idx]):
|
|
491
|
+
args[idx] = next(inputs_iter)
|
|
492
|
+
setattr(self, "sparse", self._is_sparse(*args))
|
|
493
|
+
|
|
494
|
+
def _set_inputs(self, inputs):
|
|
495
|
+
super()._set_inputs(inputs)
|
|
496
|
+
inputs_iter = iter(inputs or ())
|
|
497
|
+
|
|
498
|
+
args = list(self.args)
|
|
499
|
+
for idx in range(len(args)):
|
|
500
|
+
if not np.isscalar(args[idx]):
|
|
501
|
+
args[idx] = next(inputs_iter)
|
|
502
|
+
self.args = args
|
|
503
|
+
|
|
504
|
+
if getattr(self, "out", None) is not None:
|
|
505
|
+
self.out = next(inputs_iter)
|
|
506
|
+
if getattr(self, "where", None) is not None:
|
|
507
|
+
self.where = next(inputs_iter)
|
|
508
|
+
|
|
509
|
+
def _process_inputs(self, *args, out=None):
|
|
510
|
+
self.args = [a if np.isscalar(a) else astensor(a) for a in args]
|
|
511
|
+
|
|
512
|
+
if out is not None:
|
|
513
|
+
if isinstance(out, Tensor):
|
|
514
|
+
self.out = out
|
|
515
|
+
else:
|
|
516
|
+
raise TypeError(f"out should be Tensor object, got {type(out)} instead")
|
|
517
|
+
|
|
518
|
+
return args + (out,)
|
|
519
|
+
|
|
520
|
+
def __call__(self, *args, out=None):
|
|
521
|
+
proc_inputs_results = self._process_inputs(*args, out=out)
|
|
522
|
+
args = proc_inputs_results[:-1]
|
|
523
|
+
(out,) = proc_inputs_results[-1:]
|
|
524
|
+
# check broadcast
|
|
525
|
+
shapes = [() if np.isscalar(a) else a.shape for a in self.args]
|
|
526
|
+
shape = broadcast_shape(*shapes)
|
|
527
|
+
order = out.order if out is not None else None
|
|
528
|
+
|
|
529
|
+
inputs = filter_inputs(list(args) + [out])
|
|
530
|
+
t = self.new_tensor(inputs, shape, order=order)
|
|
531
|
+
|
|
532
|
+
if out is None:
|
|
533
|
+
return t
|
|
534
|
+
|
|
535
|
+
check_out_param(out, t, self.casting)
|
|
536
|
+
out_shape, out_dtype = out.shape, out.dtype
|
|
537
|
+
|
|
538
|
+
# if `out` is specified, use out's dtype and shape
|
|
539
|
+
if t.shape != out_shape:
|
|
540
|
+
t = self.new_tensor(inputs, out_shape, order=order)
|
|
541
|
+
setattr(self, "dtype", out_dtype)
|
|
542
|
+
|
|
543
|
+
out.data = t.data
|
|
544
|
+
return out
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from ... import opcodes
|
|
20
|
+
from ..utils import infer_dtype
|
|
21
|
+
from .core import TensorUnaryOp
|
|
22
|
+
from .utils import arithmetic_operator
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@arithmetic_operator(sparse_mode="unary")
|
|
26
|
+
class TensorCos(TensorUnaryOp):
|
|
27
|
+
_op_type_ = opcodes.COS
|
|
28
|
+
_func_name = "cos"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@infer_dtype(np.cos)
|
|
32
|
+
def cos(x, out=None, where=None, **kwargs):
|
|
33
|
+
"""
|
|
34
|
+
Cosine element-wise.
|
|
35
|
+
|
|
36
|
+
Parameters
|
|
37
|
+
----------
|
|
38
|
+
x : array_like
|
|
39
|
+
Input tensor in radians.
|
|
40
|
+
out : Tensor, None, or tuple of Tensor and None, optional
|
|
41
|
+
A location into which the result is stored. If provided, it must have
|
|
42
|
+
a shape that the inputs broadcast to. If not provided or `None`,
|
|
43
|
+
a freshly-allocated array is returned. A tuple (possible only as a
|
|
44
|
+
keyword argument) must have length equal to the number of outputs.
|
|
45
|
+
where : array_like, optional
|
|
46
|
+
Values of True indicate to calculate the ufunc at that position, values
|
|
47
|
+
of False indicate to leave the value in the output alone.
|
|
48
|
+
**kwargs
|
|
49
|
+
|
|
50
|
+
Returns
|
|
51
|
+
-------
|
|
52
|
+
y : Tensor
|
|
53
|
+
The corresponding cosine values.
|
|
54
|
+
|
|
55
|
+
Notes
|
|
56
|
+
-----
|
|
57
|
+
If `out` is provided, the function writes the result into it,
|
|
58
|
+
and returns a reference to `out`. (See Examples)
|
|
59
|
+
|
|
60
|
+
References
|
|
61
|
+
----------
|
|
62
|
+
M. Abramowitz and I. A. Stegun, Handbook of Mathematical Functions.
|
|
63
|
+
New York, NY: Dover, 1972.
|
|
64
|
+
|
|
65
|
+
Examples
|
|
66
|
+
--------
|
|
67
|
+
>>> import maxframe.tensor as mt
|
|
68
|
+
|
|
69
|
+
>>> mt.cos(mt.array([0, mt.pi/2, mt.pi])).execute()
|
|
70
|
+
array([ 1.00000000e+00, 6.12303177e-17, -1.00000000e+00])
|
|
71
|
+
>>>
|
|
72
|
+
>>> # Example of providing the optional output parameter
|
|
73
|
+
>>> out1 = mt.empty(1)
|
|
74
|
+
>>> out2 = mt.cos([0.1], out1)
|
|
75
|
+
>>> out2 is out1
|
|
76
|
+
True
|
|
77
|
+
>>>
|
|
78
|
+
>>> # Example of ValueError due to provision of shape mis-matched `out`
|
|
79
|
+
>>> mt.cos(mt.zeros((3,3)),mt.zeros((2,2)))
|
|
80
|
+
Traceback (most recent call last):
|
|
81
|
+
File "<stdin>", line 1, in <module>
|
|
82
|
+
ValueError: operators could not be broadcast together with shapes (3,3) (2,2)
|
|
83
|
+
"""
|
|
84
|
+
op = TensorCos(**kwargs)
|
|
85
|
+
return op(x, out=out, where=where)
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Copyright 1999-2024 Alibaba Group Holding Ltd.
|
|
4
|
+
#
|
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
# you may not use this file except in compliance with the License.
|
|
7
|
+
# You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
# See the License for the specific language governing permissions and
|
|
15
|
+
# limitations under the License.
|
|
16
|
+
|
|
17
|
+
import numpy as np
|
|
18
|
+
|
|
19
|
+
from ... import opcodes
|
|
20
|
+
from ..utils import infer_dtype
|
|
21
|
+
from .core import TensorUnaryOp
|
|
22
|
+
from .utils import arithmetic_operator
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
@arithmetic_operator(sparse_mode="unary")
|
|
26
|
+
class TensorCosh(TensorUnaryOp):
|
|
27
|
+
_op_type_ = opcodes.COSH
|
|
28
|
+
_func_name = "cosh"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@infer_dtype(np.cosh)
|
|
32
|
+
def cosh(x, out=None, where=None, **kwargs):
|
|
33
|
+
"""
|
|
34
|
+
Hyperbolic cosine, element-wise.
|
|
35
|
+
|
|
36
|
+
Equivalent to ``1/2 * (mt.exp(x) + mt.exp(-x))`` and ``mt.cos(1j*x)``.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
x : array_like
|
|
41
|
+
Input tensor.
|
|
42
|
+
out : Tensor, None, or tuple of Tensor and None, optional
|
|
43
|
+
A location into which the result is stored. If provided, it must have
|
|
44
|
+
a shape that the inputs broadcast to. If not provided or `None`,
|
|
45
|
+
a freshly-allocated tensor is returned. A tuple (possible only as a
|
|
46
|
+
keyword argument) must have length equal to the number of outputs.
|
|
47
|
+
where : array_like, optional
|
|
48
|
+
Values of True indicate to calculate the ufunc at that position, values
|
|
49
|
+
of False indicate to leave the value in the output alone.
|
|
50
|
+
**kwargs
|
|
51
|
+
|
|
52
|
+
Returns
|
|
53
|
+
-------
|
|
54
|
+
out : Tensor
|
|
55
|
+
Output array of same shape as `x`.
|
|
56
|
+
|
|
57
|
+
Examples
|
|
58
|
+
--------
|
|
59
|
+
>>> import maxframe.tensor as mt
|
|
60
|
+
|
|
61
|
+
>>> mt.cosh(0).execute()
|
|
62
|
+
1.0
|
|
63
|
+
|
|
64
|
+
The hyperbolic cosine describes the shape of a hanging cable:
|
|
65
|
+
|
|
66
|
+
>>> import matplotlib.pyplot as plt
|
|
67
|
+
>>> x = mt.linspace(-4, 4, 1000)
|
|
68
|
+
>>> plt.plot(x.execute(), mt.cosh(x).execute())
|
|
69
|
+
>>> plt.show()
|
|
70
|
+
"""
|
|
71
|
+
op = TensorCosh(**kwargs)
|
|
72
|
+
return op(x, out=out, where=where)
|