From b0fa1b8555cddd5b0b3bd40304b45fc6868b9155 Mon Sep 17 00:00:00 2001 From: rusty1s Date: Fri, 30 Oct 2026 08:12:44 +0000 Subject: [PATCH 1/4] Add invertible Asinh processor --- sdm/processing/__init__.py | 2 ++ sdm/processing/numerical/__init__.py | 2 ++ sdm/processing/numerical/asinh.py | 21 +++++++++++++++++++++ 3 files changed, 25 insertions(+) create mode 100644 sdm/processing/numerical/asinh.py diff --git a/sdm/processing/__init__.py b/sdm/processing/__init__.py index 91230c732e..3d86788b57 100644 --- a/sdm/processing/__init__.py +++ b/sdm/processing/__init__.py @@ -35,6 +35,7 @@ QuantileTransform, RankGaussian, Standardize, + Asinh, RobustScale, MinMaxScale, FlipSign, @@ -90,6 +91,7 @@ "QuantileTransform", "RankGaussian", "Standardize", + "Asinh", "RobustScale", "MinMaxScale", "FlipSign", diff --git a/sdm/processing/numerical/__init__.py b/sdm/processing/numerical/__init__.py index 673cfff32a..2970a0da58 100644 --- a/sdm/processing/numerical/__init__.py +++ b/sdm/processing/numerical/__init__.py @@ -12,6 +12,7 @@ from sdm.processing.numerical.quantile import QuantileTransform from sdm.processing.numerical.rank_gaussian import RankGaussian from sdm.processing.numerical.standardize import Standardize +from sdm.processing.numerical.asinh import Asinh 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 @@ -32,6 +33,7 @@ "QuantileTransform", "RankGaussian", "Standardize", + "Asinh", "RobustScale", "MinMaxScale", "FlipSign", diff --git a/sdm/processing/numerical/asinh.py b/sdm/processing/numerical/asinh.py new file mode 100644 index 0000000000..3a6545c0b2 --- /dev/null +++ b/sdm/processing/numerical/asinh.py @@ -0,0 +1,21 @@ +# 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): + """Apply the inverse hyperbolic sine to numerical values. + + Inverse transformation applies the hyperbolic sine. + """ + + 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()) From 8d17f1eaaa10dc5017101976cbe8939e5a3f3d61 Mon Sep 17 00:00:00 2001 From: rusty1s Date: Fri, 30 Oct 2026 08:26:33 +0000 Subject: [PATCH 2/4] update --- sdm/processing/numerical/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdm/processing/numerical/__init__.py b/sdm/processing/numerical/__init__.py index 2970a0da58..67f1cd90be 100644 --- a/sdm/processing/numerical/__init__.py +++ b/sdm/processing/numerical/__init__.py @@ -12,10 +12,10 @@ from sdm.processing.numerical.quantile import QuantileTransform from sdm.processing.numerical.rank_gaussian import RankGaussian from sdm.processing.numerical.standardize import Standardize -from sdm.processing.numerical.asinh import Asinh 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 @@ -33,10 +33,10 @@ "QuantileTransform", "RankGaussian", "Standardize", - "Asinh", "RobustScale", "MinMaxScale", "FlipSign", + "Asinh", "DropConstantColumns", "PCA", "RandomProjection", From 2dfde08ac20ac17058aa0250d050f3221438f6f3 Mon Sep 17 00:00:00 2001 From: rusty1s Date: Fri, 30 Oct 2026 08:27:13 +0000 Subject: [PATCH 3/4] update --- sdm/processing/__init__.py | 4 ++-- sdm/processing/numerical/asinh.py | 5 +---- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/sdm/processing/__init__.py b/sdm/processing/__init__.py index 3d86788b57..4abd3d1c7f 100644 --- a/sdm/processing/__init__.py +++ b/sdm/processing/__init__.py @@ -35,10 +35,10 @@ QuantileTransform, RankGaussian, Standardize, - Asinh, RobustScale, MinMaxScale, FlipSign, + Asinh, DropConstantColumns, PCA, RandomProjection, @@ -91,10 +91,10 @@ "QuantileTransform", "RankGaussian", "Standardize", - "Asinh", "RobustScale", "MinMaxScale", "FlipSign", + "Asinh", "DropConstantColumns", "PCA", "RandomProjection", diff --git a/sdm/processing/numerical/asinh.py b/sdm/processing/numerical/asinh.py index 3a6545c0b2..c089ac99d9 100644 --- a/sdm/processing/numerical/asinh.py +++ b/sdm/processing/numerical/asinh.py @@ -6,10 +6,7 @@ class Asinh(Processor, InvertibleMixin): - """Apply the inverse hyperbolic sine to numerical values. - - Inverse transformation applies the hyperbolic sine. - """ + r"""Apply the inverse hyperbolic sine to numerical values.""" handles_stypes = (Stype.numerical,) requires_fit = False From b1f016230f3328d0588dae084c28d80c76963fc2 Mon Sep 17 00:00:00 2001 From: rusty1s Date: Fri, 30 Oct 2026 08:30:09 +0000 Subject: [PATCH 4/4] update --- test/processing/numerical/test_asinh.py | 17 +++++++++++++++++ test/processing/test_contract.py | 1 + 2 files changed, 18 insertions(+) create mode 100644 test/processing/numerical/test_asinh.py 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)),