diff --git a/sdm/processing/__init__.py b/sdm/processing/__init__.py index 91230c732e..4abd3d1c7f 100644 --- a/sdm/processing/__init__.py +++ b/sdm/processing/__init__.py @@ -38,6 +38,7 @@ RobustScale, MinMaxScale, FlipSign, + Asinh, DropConstantColumns, PCA, RandomProjection, @@ -93,6 +94,7 @@ "RobustScale", "MinMaxScale", "FlipSign", + "Asinh", "DropConstantColumns", "PCA", "RandomProjection", diff --git a/sdm/processing/numerical/__init__.py b/sdm/processing/numerical/__init__.py index 673cfff32a..67f1cd90be 100644 --- a/sdm/processing/numerical/__init__.py +++ b/sdm/processing/numerical/__init__.py @@ -15,6 +15,7 @@ from sdm.processing.numerical.robust_scale import RobustScale from sdm.processing.numerical.min_max_scale import MinMaxScale from sdm.processing.numerical.flip_sign import FlipSign +from sdm.processing.numerical.asinh import Asinh from sdm.processing.numerical.constant import DropConstantColumns from sdm.processing.numerical.pca import PCA from sdm.processing.numerical.random_projection import RandomProjection @@ -35,6 +36,7 @@ "RobustScale", "MinMaxScale", "FlipSign", + "Asinh", "DropConstantColumns", "PCA", "RandomProjection", diff --git a/sdm/processing/numerical/asinh.py b/sdm/processing/numerical/asinh.py new file mode 100644 index 0000000000..c089ac99d9 --- /dev/null +++ b/sdm/processing/numerical/asinh.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +from sdm import Stype, TableTensor +from sdm.processing import InvertibleMixin, Processor + + +class Asinh(Processor, InvertibleMixin): + r"""Apply the inverse hyperbolic sine to numerical values.""" + + handles_stypes = (Stype.numerical,) + requires_fit = False + + def _transform(self, table: TableTensor) -> TableTensor: + return table.replace_blocks(numerical=table.numerical.asinh()) + + def _inverse_transform(self, table: TableTensor) -> TableTensor: + return table.replace_blocks(numerical=table.numerical.sinh()) diff --git a/test/processing/numerical/test_asinh.py b/test/processing/numerical/test_asinh.py new file mode 100644 index 0000000000..93b7f2b3eb --- /dev/null +++ b/test/processing/numerical/test_asinh.py @@ -0,0 +1,17 @@ +# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +import torch + +from sdm import TableTensor +from sdm.processing import Asinh + + +def test_asinh_transform_and_inverse() -> None: + table = TableTensor.from_tensor(torch.randn(3, 2)) + processor = Asinh() + + out = processor.transform(table) + torch.testing.assert_close(out.numerical, table.numerical.asinh()) + out = processor.inverse_transform(out) + torch.testing.assert_close(out.numerical, table.numerical) diff --git a/test/processing/test_contract.py b/test/processing/test_contract.py index bd3ebe6e20..39a20659db 100644 --- a/test/processing/test_contract.py +++ b/test/processing/test_contract.py @@ -131,6 +131,7 @@ def _make_processor_pair( ProcessorCase(sp.RobustScale()), ProcessorCase(sp.MinMaxScale()), ProcessorCase(sp.FlipSign()), + ProcessorCase(sp.Asinh()), ProcessorCase(sp.DropConstantColumns()), ProcessorCase(sp.PCA(2)), ProcessorCase(sp.RandomProjection(2)),