Passed
Pull Request — main (#656)
by Yunguan
03:01
created

TestBSplines3DTransform.test_coefficients()   A

Complexity

Conditions 1

Size

Total Lines 12
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
dl 0
loc 12
rs 10
c 0
b 0
f 0
cc 1
nop 3
1
# coding=utf-8
2
3
"""
4
Tests for deepreg/model/layer
5
"""
6
from typing import Optional
7
8
import numpy as np
9
import pytest
10
import tensorflow as tf
11
12
import deepreg.model.layer as layer
13
14
15
@pytest.mark.parametrize(
16
    ("input_shape", "output_shape", "expected_shape"),
17
    [
18
        ((6, 7, 8), (12, 14, 16), (12, 14, 16)),
19
        ((6, 7, 8), (11, 13, 15), (11, 13, 15)),
20
        ((6, 7, 8), None, (12, 14, 16)),
21
    ],
0 ignored issues
show
introduced by
"input_shape" missing in parameter type documentation
Loading history...
22
)
23
def test_deconv3d(input_shape, output_shape: Optional[tuple], expected_shape: tuple):
24
    """
25
    Test output shapes and configs.
26
27
    :param input_shape: input shape for layer definition
28
    :param output_shape: output shape for layer definition
29
    :param expected_shape: expected output shape
30
    """
31
    batch_size = 5
32
33
    deconv3d = layer.Deconv3d(filters=3, strides=2, output_shape=output_shape)
34
35
    inputs = tf.ones(shape=(batch_size,) + input_shape + (1,))
36
    output = deconv3d(inputs)
37
38
    assert output.shape == (batch_size,) + expected_shape + (3,)
39
40
    config = deconv3d.get_config()
41
    assert config == dict(
42
        filters=3,
43
        output_shape=output_shape,
44
        kernel_size=3,
45
        strides=2,
46
        padding="same",
47
        name="deconv3d",
48
        trainable=True,
49
        dtype="float32",
50
    )
51
52
53
@pytest.mark.parametrize("layer_name", ["conv3d", "deconv3d"])
54
@pytest.mark.parametrize("norm_name", ["batch", "layer"])
55
@pytest.mark.parametrize("activation", ["relu", "elu"])
56
def test_norm_block(layer_name: str, norm_name: str, activation: str):
57
    """
58
    Test output shapes and configs.
59
60
    :param layer_name: layer_name for layer definition
61
    :param norm_name: norm_name for layer definition
62
    :param activation: activation for layer definition
63
    """
64
    input_size = (2, 3, 4, 5, 6)  # (batch, *shape, ch)
65
    conv_block = layer.NormBlock(
66
        layer_name=layer_name,
67
        norm_name=norm_name,
68
        activation=activation,
69
        filters=3,
70
        kernel_size=1,
71
        padding="same",
72
    )
73
    inputs = tf.ones(shape=input_size)
74
    outputs = conv_block(inputs)
75
    assert outputs.shape == input_size[:-1] + (3,)
76
77
    config = conv_block.get_config()
78
    assert config == dict(
79
        layer_name=layer_name,
80
        norm_name=norm_name,
81
        activation=activation,
82
        filters=3,
83
        kernel_size=1,
84
        padding="same",
85
        name="norm_block",
86
        trainable=True,
87
        dtype="float32",
88
    )
89
90
91
def test_downsample_resnet_block():
92
    """
93
    Test the layer.DownSampleResnetBlock class and its default attributes.
94
    """
95
    model = layer.DownSampleResnetBlock(8)
96
97
    assert model._pooling is True
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _pooling was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
98
99
    assert isinstance(model._residual_block, layer.Residual3dBlock)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _residual_block was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
100
    assert model._conv3d_block3 is None
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _conv3d_block3 was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
101
102
    model = layer.DownSampleResnetBlock(8, pooling=False)
103
    assert model._max_pool3d is None
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _max_pool3d was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
104
105
106
def test_upsample_resnet_block():
107
    """
108
    Test the layer.UpSampleResnetBlock class and its default attributes.
109
    """
110
    batch_size = 5
111
    channels = 4
112
    input_size = (32, 32, 16)
113
    output_size = (64, 64, 32)
114
115
    input_tensor_size = (batch_size,) + input_size + (channels,)
116
    skip_tensor_size = (batch_size,) + output_size + (channels // 2,)
117
118
    model = layer.UpSampleResnetBlock(8)
119
    model.build([input_tensor_size, skip_tensor_size])
120
121
    assert model._filters == 8
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _filters was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
122
    assert model._concat is False
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _concat was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
123
    assert isinstance(model._conv3d_block, layer.Conv3dBlock)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _conv3d_block was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
124
    assert isinstance(model._residual_block, layer.Residual3dBlock)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _residual_block was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
125
    assert isinstance(model._deconv3d_block, layer.Deconv3dBlock)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _deconv3d_block was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
126
127
128
class TestWarping:
0 ignored issues
show
introduced by
Missing class docstring
Loading history...
129
    @pytest.mark.parametrize(
130
        ("moving_image_size", "fixed_image_size"),
131
        [
132
            ((1, 2, 3), (3, 4, 5)),
133
            ((1, 2, 3), (1, 2, 3)),
134
        ],
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
135
    )
136
    def test_forward(self, moving_image_size, fixed_image_size):
137
        batch_size = 2
138
        image = tf.ones(shape=(batch_size,) + moving_image_size)
139
        ddf = tf.ones(shape=(batch_size,) + fixed_image_size + (3,))
140
        outputs = layer.Warping(fixed_image_size=fixed_image_size)([ddf, image])
141
        assert outputs.shape == (batch_size, *fixed_image_size)
142
143
    def test_get_config(self):
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
144
        warping = layer.Warping(fixed_image_size=(2, 3, 4))
145
        config = warping.get_config()
146
        assert config == dict(
147
            fixed_image_size=(2, 3, 4),
148
            name="warping",
149
            trainable=True,
150
            dtype="float32",
151
        )
152
153
154
def test_init_dvf():
155
    """
156
    Test the layer.IntDVF class, its default attributes and its call() method.
157
    """
158
159
    batch_size = 5
160
    fixed_image_size = (32, 32, 16)
161
    ndims = len(fixed_image_size)
162
163
    model = layer.IntDVF(fixed_image_size)
164
165
    assert isinstance(model._warping, layer.Warping)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _warping was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
166
    assert model._num_steps == 7
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _num_steps was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
167
168
    inputs = np.ones((batch_size, *fixed_image_size, ndims))
169
    output = model.call(inputs)
170
    assert all(
171
        x == y
172
        for x, y in zip((batch_size,) + fixed_image_size + (ndims,), output.shape)
173
    )
174
175
176
def test_additive_upsampling():
177
    """
178
    Test the layer.AdditiveUpSampling class and its default attributes.
179
    """
180
    channels = 8
181
    batch_size = 5
182
    output_size = (32, 32, 16)
183
    input_size = (24, 24, 16)
184
185
    # Test __init__()
186
    model = layer.AdditiveUpSampling(output_size)
187
    assert model._stride == 2
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _stride was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
188
    assert model._output_shape == output_size
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _output_shape was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
189
190
    # Test call()
191
    inputs = np.ones(
192
        (batch_size, input_size[0], input_size[1], input_size[2], channels)
193
    )
194
    output = model(inputs)
195
    assert all(
196
        x == y
197
        for x, y in zip((batch_size,) + output_size + (channels / 2,), output.shape)
198
    )
199
200
    # Test the exceptions
201
    model = layer.AdditiveUpSampling(output_size, stride=3)
202
    with pytest.raises(ValueError):
203
        model(inputs)
204
205
206
def test_local_net_residual3d_block():
207
    """
208
    Test the layer.LocalNetResidual3dBlock class's,
209
    default attributes and call() function.
210
    """
211
212
    # Test __init__()
213
    conv3d_block = layer.LocalNetResidual3dBlock(8)
214
215
    assert conv3d_block._conv3d.kernel_size == (3, 3, 3)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _conv3d was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
216
    assert conv3d_block._conv3d.strides == (1, 1, 1)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _conv3d was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
217
    assert conv3d_block._conv3d.padding == "same"
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _conv3d was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
218
    assert conv3d_block._conv3d.use_bias is False
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _conv3d was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
219
220
221
def test_local_net_upsample_resnet_block():
222
    """
223
    Test the layer.LocalNetUpSampleResnetBlock class,
224
    its default attributes and its call() function.
225
    """
226
    batch_size = 5
227
    channels = 4
228
    input_size = (32, 32, 16)
229
    output_size = (64, 64, 32)
230
231
    nonskip_tensor_size = (batch_size,) + input_size + (channels,)
232
    skip_tensor_size = (batch_size,) + output_size + (channels,)
233
234
    # Test __init__() and build()
235
    model = layer.LocalNetUpSampleResnetBlock(8)
236
    model.build([nonskip_tensor_size, skip_tensor_size])
237
238
    assert model._filters == 8
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _filters was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
239
    assert model._use_additive_upsampling is True
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _use_additive_upsampling was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
240
241
    assert isinstance(model._deconv3d_block, layer.Deconv3dBlock)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _deconv3d_block was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
242
    assert isinstance(model._additive_upsampling, layer.AdditiveUpSampling)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _additive_upsampling was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
243
    assert isinstance(model._conv3d_block, layer.Conv3dBlock)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _conv3d_block was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
244
    assert isinstance(model._residual_block, layer.LocalNetResidual3dBlock)
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _residual_block was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
245
246
247
class TestResizeCPTransform:
0 ignored issues
show
introduced by
Missing class docstring
Loading history...
248
    @pytest.mark.parametrize(
249
        "parameter,cp_spacing", [((8, 8, 8), 8), ((8, 24, 16), (8, 24, 16))]
250
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
251
    def test_attributes(self, parameter, cp_spacing):
252
        model = layer.ResizeCPTransform(cp_spacing)
253
254
        if isinstance(cp_spacing, int):
255
            cp_spacing = [cp_spacing] * 3
256
        assert list(model.cp_spacing) == list(parameter)
257
        assert model.kernel_sigma == [0.44 * cp for cp in cp_spacing]
258
259
    @pytest.mark.parametrize(
260
        "input_size,output_size,cp_spacing",
261
        [
262
            ((1, 8, 8, 8, 3), (12, 8, 12), (8, 16, 8)),
263
            ((1, 8, 8, 8, 3), (12, 12, 12), 8),
264
        ],
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
265
    )
266
    def test_build(self, input_size, output_size, cp_spacing):
267
        model = layer.ResizeCPTransform(cp_spacing)
268
        model.build(input_size)
269
270
        assert [a == b for a, b, in zip(model._output_shape, output_size)]
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like _output_shape was declared protected and should not be accessed from this context.

Prefixing a member variable _ is usually regarded as the equivalent of declaring it with protected visibility that exists in other languages. Consequentially, such a member should only be accessed from the same class or a child class:

class MyParent:
    def __init__(self):
        self._x = 1;
        self.y = 2;

class MyChild(MyParent):
    def some_method(self):
        return self._x    # Ok, since accessed from a child class

class AnotherClass:
    def some_method(self, instance_of_my_child):
        return instance_of_my_child._x   # Would be flagged as AnotherClass is not
                                         # a child class of MyParent
Loading history...
271
272
    @pytest.mark.parametrize(
273
        "input_size,output_size,cp_spacing",
274
        [
275
            ((1, 68, 68, 68, 3), (1, 12, 8, 12, 3), (8, 16, 8)),
276
            ((1, 68, 68, 68, 3), (1, 12, 12, 12, 3), 8),
277
        ],
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
278
    )
279
    def test_call(self, input_size, output_size, cp_spacing):
280
        model = layer.ResizeCPTransform(cp_spacing)
281
        model.build(input_size)
282
283
        input = tf.random.normal(shape=input_size, dtype=tf.float32)
0 ignored issues
show
Bug Best Practice introduced by
This seems to re-define the built-in input.

It is generally discouraged to redefine built-ins as this makes code very hard to read.

Loading history...
284
        output = model(input)
285
286
        assert output.shape == output_size
287
288
289
class TestBSplines3DTransform:
290
    """
291
    Test the layer.BSplines3DTransform class,
292
    its default attributes and its call() function.
293
    """
294
295
    @pytest.mark.parametrize(
296
        "input_size,cp",
297
        [((1, 8, 8, 8, 3), 8), ((1, 8, 8, 8, 3), (8, 16, 12))],
298
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
299
    def test_init(self, input_size, cp):
300
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
301
302
        if isinstance(cp, int):
303
            cp = (cp, cp, cp)
304
305
        assert model.cp_spacing == cp
306
307
    @pytest.mark.parametrize(
308
        "input_size,cp",
309
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
310
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
311
    def generate_filter_coefficients(self, cp_spacing):
312
313
        b = {
314
            0: lambda u: np.float64((1 - u) ** 3 / 6),
315
            1: lambda u: np.float64((3 * (u ** 3) - 6 * (u ** 2) + 4) / 6),
316
            2: lambda u: np.float64((-3 * (u ** 3) + 3 * (u ** 2) + 3 * u + 1) / 6),
317
            3: lambda u: np.float64(u ** 3 / 6),
318
        }
319
320
        filters = np.zeros(
321
            (
322
                4 * cp_spacing[0],
323
                4 * cp_spacing[1],
324
                4 * cp_spacing[2],
325
                3,
326
                3,
327
            ),
328
            dtype=np.float32,
329
        )
330
331
        for u in range(cp_spacing[0]):
0 ignored issues
show
unused-code introduced by
Too many nested blocks (7/5)
Loading history...
332
            for v in range(cp_spacing[1]):
333
                for w in range(cp_spacing[2]):
334
                    for x in range(4):
335
                        for y in range(4):
336
                            for z in range(4):
337
                                for it_dim in range(3):
338
                                    u_norm = 1 - (u + 0.5) / cp_spacing[0]
339
                                    v_norm = 1 - (v + 0.5) / cp_spacing[1]
340
                                    w_norm = 1 - (w + 0.5) / cp_spacing[2]
341
                                    filters[
342
                                        x * cp_spacing[0] + u,
343
                                        y * cp_spacing[1] + v,
344
                                        z * cp_spacing[2] + w,
345
                                        it_dim,
346
                                        it_dim,
347
                                    ] = (
348
                                        b[x](u_norm) * b[y](v_norm) * b[z](w_norm)
349
                                    )
350
        return filters
351
352
    @pytest.mark.parametrize(
353
        "input_size,cp",
354
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
355
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
356
    def test_build(self, input_size, cp):
357
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
358
359
        model.build(input_size)
360
        assert model.filter.shape == (
361
            4 * cp[0],
362
            4 * cp[1],
363
            4 * cp[2],
364
            3,
365
            3,
366
        )
367
368
    @pytest.mark.parametrize(
369
        "input_size,cp",
370
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
371
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
372
    def test_coefficients(self, input_size, cp):
373
374
        filters = self.generate_filter_coefficients(cp_spacing=cp)
375
376
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
377
        model.build(input_size)
378
379
        assert np.allclose(filters, model.filter.numpy(), atol=1e-8)
380
381
    @pytest.mark.parametrize(
382
        "input_size,cp",
383
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
384
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
385
    def test_interpolation(self, input_size, cp):
386
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
387
        model.build(input_size)
388
389
        vol_shape = input_size[1:-1]
390
        num_cp = (
391
            [input_size[0]]
392
            + [int(np.ceil(isize / cpsize) + 3) for isize, cpsize in zip(vol_shape, cp)]
393
            + [input_size[-1]]
394
        )
395
396
        field = tf.random.normal(shape=num_cp, dtype=tf.float32)
397
398
        ddf = model.call(field)
399
        assert ddf.shape == input_size
400
401
402
class TestResize3d:
0 ignored issues
show
introduced by
Missing class docstring
Loading history...
403
    @pytest.mark.parametrize(
404
        ("input_shape", "resize_shape", "output_shape"),
405
        [
406
            ((1, 2, 3), (3, 4, 5), (3, 4, 5)),
407
            ((2, 1, 2, 3), (3, 4, 5), (2, 3, 4, 5)),
408
            ((2, 1, 2, 3, 1), (3, 4, 5), (2, 3, 4, 5, 1)),
409
            ((2, 1, 2, 3, 6), (3, 4, 5), (2, 3, 4, 5, 6)),
410
            ((1, 2, 3), (1, 2, 3), (1, 2, 3)),
411
            ((2, 1, 2, 3), (1, 2, 3), (2, 1, 2, 3)),
412
            ((2, 1, 2, 3, 1), (1, 2, 3), (2, 1, 2, 3, 1)),
413
            ((2, 1, 2, 3, 6), (1, 2, 3), (2, 1, 2, 3, 6)),
414
        ],
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
415
    )
416
    def test_forward(self, input_shape, resize_shape, output_shape):
417
        inputs = tf.ones(shape=input_shape)
418
        outputs = layer.Resize3d(shape=resize_shape)(inputs)
419
        assert outputs.shape == output_shape
420
421
    def test_get_config(self):
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
422
        resize = layer.Resize3d(shape=(2, 3, 4))
423
        config = resize.get_config()
424
        assert config == dict(
425
            shape=(2, 3, 4),
426
            method=tf.image.ResizeMethod.BILINEAR,
427
            name="resize3d",
428
            trainable=True,
429
            dtype="float32",
430
        )
431
432
    def test_shape_err(self):
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
433
        with pytest.raises(AssertionError):
434
            layer.Resize3d(shape=(2, 3))
435
436
    def test_image_shape_err(self):
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
437
        with pytest.raises(ValueError) as err_info:
438
            resize = layer.Resize3d(shape=(2, 3, 4))
439
            resize(tf.ones(1, 1))
440
        assert "Resize3d takes input image of dimension 3 or 4 or 5" in str(
441
            err_info.value
442
        )
443