From e80dfea0c74dbae3030c27d0f80c8f7f2cc63144 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 19 Apr 2024 15:40:42 +0200 Subject: [PATCH 01/10] add methods --- src/safeds/ml/nn/_forward_layer.py | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/safeds/ml/nn/_forward_layer.py b/src/safeds/ml/nn/_forward_layer.py index e5f745e91..652f8afa6 100644 --- a/src/safeds/ml/nn/_forward_layer.py +++ b/src/safeds/ml/nn/_forward_layer.py @@ -2,9 +2,11 @@ from typing import TYPE_CHECKING + if TYPE_CHECKING: from torch import Tensor, nn +from safeds._utils import _structural_hash from safeds.exceptions import ClosedBound, OutOfBoundsError from safeds.ml.nn._layer import _Layer @@ -88,3 +90,40 @@ def _set_input_size(self, input_size: int) -> None: if input_size < 1: raise OutOfBoundsError(actual=input_size, name="input_size", lower_bound=ClosedBound(1)) self._input_size = input_size + + def __hash__(self) -> int: + """ + Return a deterministic hash value for this forward layer. + + Returns + ------- + hash: + the hash value + """ + return _structural_hash(self._input_size, self._output_size) + + def __eq__(self, other) -> bool: + """ + Compare two forward layer instances. + + Returns + ------- + 'True' if input and output size are equal, 'False' otherwise. + """ + if not isinstance(other, ForwardLayer): + return NotImplemented + if self is other: + return True + return self._input_size == other._input_size and self._output_size == other._output_size + + def __sizeof__(self) -> int: + import sys + """ + Return the complete size of this object. + + Returns + ------- + size: + Size of this object in bytes. + """ + return sys.getsizeof(self._input_size) + sys.getsizeof(self._output_size) From f3353054999ac5f40211d64cab9e1fbee528dd90 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 19 Apr 2024 15:49:17 +0200 Subject: [PATCH 02/10] linter fix --- src/safeds/ml/nn/_forward_layer.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/safeds/ml/nn/_forward_layer.py b/src/safeds/ml/nn/_forward_layer.py index 652f8afa6..15a46a387 100644 --- a/src/safeds/ml/nn/_forward_layer.py +++ b/src/safeds/ml/nn/_forward_layer.py @@ -102,7 +102,7 @@ def __hash__(self) -> int: """ return _structural_hash(self._input_size, self._output_size) - def __eq__(self, other) -> bool: + def __eq__(self, other: ForwardLayer) -> bool: """ Compare two forward layer instances. @@ -110,8 +110,6 @@ def __eq__(self, other) -> bool: ------- 'True' if input and output size are equal, 'False' otherwise. """ - if not isinstance(other, ForwardLayer): - return NotImplemented if self is other: return True return self._input_size == other._input_size and self._output_size == other._output_size From 977fab93c647d73c8e7d95e9622693e1c7a11972 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 19 Apr 2024 17:05:56 +0200 Subject: [PATCH 03/10] add tests --- src/safeds/ml/nn/_forward_layer.py | 4 +- tests/safeds/ml/nn/test_forward_layer.py | 69 ++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/src/safeds/ml/nn/_forward_layer.py b/src/safeds/ml/nn/_forward_layer.py index 15a46a387..2bb92f406 100644 --- a/src/safeds/ml/nn/_forward_layer.py +++ b/src/safeds/ml/nn/_forward_layer.py @@ -102,7 +102,7 @@ def __hash__(self) -> int: """ return _structural_hash(self._input_size, self._output_size) - def __eq__(self, other: ForwardLayer) -> bool: + def __eq__(self, other: object) -> bool: """ Compare two forward layer instances. @@ -110,6 +110,8 @@ def __eq__(self, other: ForwardLayer) -> bool: ------- 'True' if input and output size are equal, 'False' otherwise. """ + if not isinstance(other, ForwardLayer): + return NotImplemented if self is other: return True return self._input_size == other._input_size and self._output_size == other._output_size diff --git a/tests/safeds/ml/nn/test_forward_layer.py b/tests/safeds/ml/nn/test_forward_layer.py index 5d29022d4..1606953b5 100644 --- a/tests/safeds/ml/nn/test_forward_layer.py +++ b/tests/safeds/ml/nn/test_forward_layer.py @@ -1,3 +1,5 @@ +import sys + import pytest from safeds.exceptions import OutOfBoundsError from safeds.ml.nn import ForwardLayer @@ -70,3 +72,70 @@ def test_should_raise_if_output_size_out_of_bounds(output_size: int) -> None: ) def test_should_raise_if_output_size_doesnt_match(output_size: int) -> None: assert ForwardLayer(output_size=output_size, input_size=1).output_size == output_size + + +@pytest.mark.parametrize( + ("layer1", "layer2"), + [ + ( + ForwardLayer(input_size=1, output_size=2), + ForwardLayer(input_size=1, output_size=2), + ), + ], + ids=["equal"], +) +def test_should_assert_that_forward_layers_are_equal(layer1: ForwardLayer, layer2: ForwardLayer) -> None: + assert layer1.__eq__(layer2) + + +@pytest.mark.parametrize( + ("layer1", "layer2"), + [ + ( + ForwardLayer(input_size=1, output_size=2), + ForwardLayer(input_size=2, output_size=1), + ), + ], + ids=["not equal"], +) +def test_should_assert_that_forward_layers_are_not_equal(layer1: ForwardLayer, layer2: ForwardLayer) -> None: + assert not layer1.__eq__(layer2) + + +@pytest.mark.parametrize( + ("layer1", "layer2"), + [ + ( + ForwardLayer(input_size=1, output_size=2), + ForwardLayer(input_size=1, output_size=2), + ), + ], + ids=["equal"], +) +def test_should_assert_that_equal_forward_layers_have_equal_hash(layer1: ForwardLayer, layer2: ForwardLayer) -> None: + assert layer1.__hash__() == layer2.__hash__() + + +@pytest.mark.parametrize( + ("layer1", "layer2"), + [ + ( + ForwardLayer(input_size=1, output_size=2), + ForwardLayer(input_size=2, output_size=1), + ), + ], + ids=["not equal"], +) +def test_should_assert_that_different_forward_layers_have_different_hash(layer1: ForwardLayer, layer2: ForwardLayer) -> None: + assert layer1.__hash__() != layer2.__hash__() + + +@pytest.mark.parametrize( + "layer", + [ + ForwardLayer(input_size=1, output_size=1), + ], + ids=["one"], +) +def test_should_assert_that_layer_size_is_greater_than_normal_object(layer: ForwardLayer) -> None: + assert sys.getsizeof(layer) > sys.getsizeof(object()) From 1649f4b08527273b788f04bdb818666029c5d41e Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:07:37 +0000 Subject: [PATCH 04/10] style: apply automated linter fixes --- src/safeds/ml/nn/_forward_layer.py | 2 +- tests/safeds/ml/nn/test_forward_layer.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/safeds/ml/nn/_forward_layer.py b/src/safeds/ml/nn/_forward_layer.py index 2bb92f406..396a057e6 100644 --- a/src/safeds/ml/nn/_forward_layer.py +++ b/src/safeds/ml/nn/_forward_layer.py @@ -2,7 +2,6 @@ from typing import TYPE_CHECKING - if TYPE_CHECKING: from torch import Tensor, nn @@ -118,6 +117,7 @@ def __eq__(self, other: object) -> bool: def __sizeof__(self) -> int: import sys + """ Return the complete size of this object. diff --git a/tests/safeds/ml/nn/test_forward_layer.py b/tests/safeds/ml/nn/test_forward_layer.py index 1606953b5..9dd9f773a 100644 --- a/tests/safeds/ml/nn/test_forward_layer.py +++ b/tests/safeds/ml/nn/test_forward_layer.py @@ -126,7 +126,9 @@ def test_should_assert_that_equal_forward_layers_have_equal_hash(layer1: Forward ], ids=["not equal"], ) -def test_should_assert_that_different_forward_layers_have_different_hash(layer1: ForwardLayer, layer2: ForwardLayer) -> None: +def test_should_assert_that_different_forward_layers_have_different_hash( + layer1: ForwardLayer, layer2: ForwardLayer, +) -> None: assert layer1.__hash__() != layer2.__hash__() From 0917f34311e33c51f466dd225231d6174bc3f20a Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:09:08 +0000 Subject: [PATCH 05/10] style: apply automated linter fixes --- tests/safeds/ml/nn/test_forward_layer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/safeds/ml/nn/test_forward_layer.py b/tests/safeds/ml/nn/test_forward_layer.py index 9dd9f773a..4d83fe99d 100644 --- a/tests/safeds/ml/nn/test_forward_layer.py +++ b/tests/safeds/ml/nn/test_forward_layer.py @@ -127,7 +127,8 @@ def test_should_assert_that_equal_forward_layers_have_equal_hash(layer1: Forward ids=["not equal"], ) def test_should_assert_that_different_forward_layers_have_different_hash( - layer1: ForwardLayer, layer2: ForwardLayer, + layer1: ForwardLayer, + layer2: ForwardLayer, ) -> None: assert layer1.__hash__() != layer2.__hash__() From c205410e0c38886ea27998da1b71e4668db50035 Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 19 Apr 2024 17:33:09 +0200 Subject: [PATCH 06/10] add tests --- tests/safeds/ml/nn/test_forward_layer.py | 36 +++++++++++++++--------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/tests/safeds/ml/nn/test_forward_layer.py b/tests/safeds/ml/nn/test_forward_layer.py index 1606953b5..c6ecdff1c 100644 --- a/tests/safeds/ml/nn/test_forward_layer.py +++ b/tests/safeds/ml/nn/test_forward_layer.py @@ -1,4 +1,5 @@ import sys +from typing import Any import pytest from safeds.exceptions import OutOfBoundsError @@ -75,31 +76,39 @@ def test_should_raise_if_output_size_doesnt_match(output_size: int) -> None: @pytest.mark.parametrize( - ("layer1", "layer2"), + ("layer1", "layer2", "equal"), [ ( ForwardLayer(input_size=1, output_size=2), ForwardLayer(input_size=1, output_size=2), + True, + ), + ( + ForwardLayer(input_size=1, output_size=2), + ForwardLayer(input_size=2, output_size=1), + False, ), ], - ids=["equal"], + ids=["equal", "not equal"], ) -def test_should_assert_that_forward_layers_are_equal(layer1: ForwardLayer, layer2: ForwardLayer) -> None: - assert layer1.__eq__(layer2) +def test_should_compare_forward_layers(layer1: ForwardLayer, layer2: ForwardLayer, equal: bool) -> None: + assert (layer1.__eq__(layer2)) == equal + + +def test_should_assert_that_forward_layer_is_equal_to_itself() -> None: + layer = ForwardLayer(input_size=1, output_size=1) + assert layer.__eq__(layer) @pytest.mark.parametrize( - ("layer1", "layer2"), + ("layer", "other"), [ - ( - ForwardLayer(input_size=1, output_size=2), - ForwardLayer(input_size=2, output_size=1), - ), + (ForwardLayer(input_size=1, output_size=1), None), ], - ids=["not equal"], + ids=["ForwardLayer vs. None"], ) -def test_should_assert_that_forward_layers_are_not_equal(layer1: ForwardLayer, layer2: ForwardLayer) -> None: - assert not layer1.__eq__(layer2) +def test_should_return_not_implemented_if_other_is_not_table(layer: ForwardLayer, other: Any) -> None: + assert (layer.__eq__(other)) is NotImplemented @pytest.mark.parametrize( @@ -126,7 +135,8 @@ def test_should_assert_that_equal_forward_layers_have_equal_hash(layer1: Forward ], ids=["not equal"], ) -def test_should_assert_that_different_forward_layers_have_different_hash(layer1: ForwardLayer, layer2: ForwardLayer) -> None: +def test_should_assert_that_different_forward_layers_have_different_hash(layer1: ForwardLayer, + layer2: ForwardLayer) -> None: assert layer1.__hash__() != layer2.__hash__() From 828a7381f3d5cdfd0c42b1168eecf00cb185c5e8 Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:35:38 +0000 Subject: [PATCH 07/10] style: apply automated linter fixes --- tests/safeds/ml/nn/test_forward_layer.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/safeds/ml/nn/test_forward_layer.py b/tests/safeds/ml/nn/test_forward_layer.py index c6ecdff1c..2b2b12be0 100644 --- a/tests/safeds/ml/nn/test_forward_layer.py +++ b/tests/safeds/ml/nn/test_forward_layer.py @@ -135,8 +135,9 @@ def test_should_assert_that_equal_forward_layers_have_equal_hash(layer1: Forward ], ids=["not equal"], ) -def test_should_assert_that_different_forward_layers_have_different_hash(layer1: ForwardLayer, - layer2: ForwardLayer) -> None: +def test_should_assert_that_different_forward_layers_have_different_hash( + layer1: ForwardLayer, layer2: ForwardLayer, +) -> None: assert layer1.__hash__() != layer2.__hash__() From 4cb12ff09a72f8f7b30fd10a507997f01147ca4b Mon Sep 17 00:00:00 2001 From: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:37:12 +0000 Subject: [PATCH 08/10] style: apply automated linter fixes --- tests/safeds/ml/nn/test_forward_layer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/safeds/ml/nn/test_forward_layer.py b/tests/safeds/ml/nn/test_forward_layer.py index 2b2b12be0..bef4f1332 100644 --- a/tests/safeds/ml/nn/test_forward_layer.py +++ b/tests/safeds/ml/nn/test_forward_layer.py @@ -136,7 +136,8 @@ def test_should_assert_that_equal_forward_layers_have_equal_hash(layer1: Forward ids=["not equal"], ) def test_should_assert_that_different_forward_layers_have_different_hash( - layer1: ForwardLayer, layer2: ForwardLayer, + layer1: ForwardLayer, + layer2: ForwardLayer, ) -> None: assert layer1.__hash__() != layer2.__hash__() From e45aaf636ae90b0288e34487dd913775cc64b1dc Mon Sep 17 00:00:00 2001 From: Simon Date: Fri, 19 Apr 2024 17:43:56 +0200 Subject: [PATCH 09/10] update copypaste error --- tests/safeds/ml/nn/test_forward_layer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/safeds/ml/nn/test_forward_layer.py b/tests/safeds/ml/nn/test_forward_layer.py index c6ecdff1c..d02f00bf3 100644 --- a/tests/safeds/ml/nn/test_forward_layer.py +++ b/tests/safeds/ml/nn/test_forward_layer.py @@ -107,7 +107,7 @@ def test_should_assert_that_forward_layer_is_equal_to_itself() -> None: ], ids=["ForwardLayer vs. None"], ) -def test_should_return_not_implemented_if_other_is_not_table(layer: ForwardLayer, other: Any) -> None: +def test_should_return_not_implemented_if_other_is_not_forward_layer(layer: ForwardLayer, other: Any) -> None: assert (layer.__eq__(other)) is NotImplemented From cfadc7c988c42e5d3bfcb255e89b7d67e259f65f Mon Sep 17 00:00:00 2001 From: Simon Breuer <86068340+sibre28@users.noreply.github.com> Date: Mon, 22 Apr 2024 14:09:59 +0200 Subject: [PATCH 10/10] Update src/safeds/ml/nn/_forward_layer.py Co-authored-by: WinPlay02 --- src/safeds/ml/nn/_forward_layer.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/safeds/ml/nn/_forward_layer.py b/src/safeds/ml/nn/_forward_layer.py index 396a057e6..3970b3436 100644 --- a/src/safeds/ml/nn/_forward_layer.py +++ b/src/safeds/ml/nn/_forward_layer.py @@ -107,7 +107,8 @@ def __eq__(self, other: object) -> bool: Returns ------- - 'True' if input and output size are equal, 'False' otherwise. + equals: + 'True' if input and output size are equal, 'False' otherwise. """ if not isinstance(other, ForwardLayer): return NotImplemented