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

test.unit.test_layer.TestWarping.test_get_config()   A

Complexity

Conditions 1

Size

Total Lines 8
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 8
dl 0
loc 8
rs 10
c 0
b 0
f 0
cc 1
nop 1
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
    norm_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 = norm_block(inputs)
75
    assert outputs.shape == input_size[:-1] + (3,)
76
77
    config = norm_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.ResidualConv3dBlock)
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.ResidualConv3dBlock)
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
@pytest.mark.parametrize("layer_name", ["conv3d", "deconv3d"])
155
@pytest.mark.parametrize("norm_name", ["batch", "layer"])
156
@pytest.mark.parametrize("activation", ["relu", "elu"])
157
@pytest.mark.parametrize("num_layers", [2, 3])
158
def test_res_block(layer_name: str, norm_name: str, activation: str, num_layers: int):
159
    """
160
    Test output shapes and configs.
161
162
    :param layer_name: layer_name for layer definition
163
    :param norm_name: norm_name for layer definition
164
    :param activation: activation for layer definition
165
    :param num_layers: number of blocks in res block
166
    """
167
    ch = 3
168
    input_size = (2, 3, 4, 5, ch)  # (batch, *shape, ch)
169
    res_block = layer.ResidualBlock(
170
        layer_name=layer_name,
171
        num_layers=num_layers,
172
        norm_name=norm_name,
173
        activation=activation,
174
        filters=ch,
175
        kernel_size=3,
176
        padding="same",
177
    )
178
    inputs = tf.ones(shape=input_size)
179
    outputs = res_block(inputs)
180
    assert outputs.shape == input_size[:-1] + (3,)
181
182
    config = res_block.get_config()
183
    assert config == dict(
184
        layer_name=layer_name,
185
        num_layers=num_layers,
186
        norm_name=norm_name,
187
        activation=activation,
188
        filters=ch,
189
        kernel_size=3,
190
        padding="same",
191
        name="res_block",
192
        trainable=True,
193
        dtype="float32",
194
    )
195
196
197
def test_init_dvf():
198
    """
199
    Test the layer.IntDVF class, its default attributes and its call() method.
200
    """
201
202
    batch_size = 5
203
    fixed_image_size = (32, 32, 16)
204
    ndims = len(fixed_image_size)
205
206
    model = layer.IntDVF(fixed_image_size)
207
208
    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...
209
    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...
210
211
    inputs = np.ones((batch_size, *fixed_image_size, ndims))
212
    output = model.call(inputs)
213
    assert all(
214
        x == y
215
        for x, y in zip((batch_size,) + fixed_image_size + (ndims,), output.shape)
216
    )
217
218
219
def test_additive_upsampling():
220
    """
221
    Test the layer.AdditiveUpSampling class and its default attributes.
222
    """
223
    channels = 8
224
    batch_size = 5
225
    output_size = (32, 32, 16)
226
    input_size = (24, 24, 16)
227
228
    # Test __init__()
229
    model = layer.AdditiveUpSampling(output_size)
230
    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...
231
    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...
232
233
    # Test call()
234
    inputs = np.ones(
235
        (batch_size, input_size[0], input_size[1], input_size[2], channels)
236
    )
237
    output = model(inputs)
238
    assert all(
239
        x == y
240
        for x, y in zip((batch_size,) + output_size + (channels / 2,), output.shape)
241
    )
242
243
    # Test the exceptions
244
    model = layer.AdditiveUpSampling(output_size, stride=3)
245
    with pytest.raises(ValueError):
246
        model(inputs)
247
248
249
def test_local_net_residual3d_block():
250
    """
251
    Test the layer.LocalNetResidual3dBlock class's,
252
    default attributes and call() function.
253
    """
254
255
    # Test __init__()
256
    conv3d_block = layer.LocalNetResidual3dBlock(8)
257
258
    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...
259
    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...
260
    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...
261
    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...
262
263
264
def test_local_net_upsample_resnet_block():
265
    """
266
    Test the layer.LocalNetUpSampleResnetBlock class,
267
    its default attributes and its call() function.
268
    """
269
    batch_size = 5
270
    channels = 4
271
    input_size = (32, 32, 16)
272
    output_size = (64, 64, 32)
273
274
    nonskip_tensor_size = (batch_size,) + input_size + (channels,)
275
    skip_tensor_size = (batch_size,) + output_size + (channels,)
276
277
    # Test __init__() and build()
278
    model = layer.LocalNetUpSampleResnetBlock(8)
279
    model.build([nonskip_tensor_size, skip_tensor_size])
280
281
    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...
282
    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...
283
284
    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...
285
    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...
286
    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...
287
    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...
288
289
290
class TestResizeCPTransform:
0 ignored issues
show
introduced by
Missing class docstring
Loading history...
291
    @pytest.mark.parametrize(
292
        "parameter,cp_spacing", [((8, 8, 8), 8), ((8, 24, 16), (8, 24, 16))]
293
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
294
    def test_attributes(self, parameter, cp_spacing):
295
        model = layer.ResizeCPTransform(cp_spacing)
296
297
        if isinstance(cp_spacing, int):
298
            cp_spacing = [cp_spacing] * 3
299
        assert list(model.cp_spacing) == list(parameter)
300
        assert model.kernel_sigma == [0.44 * cp for cp in cp_spacing]
301
302
    @pytest.mark.parametrize(
303
        "input_size,output_size,cp_spacing",
304
        [
305
            ((1, 8, 8, 8, 3), (12, 8, 12), (8, 16, 8)),
306
            ((1, 8, 8, 8, 3), (12, 12, 12), 8),
307
        ],
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
308
    )
309
    def test_build(self, input_size, output_size, cp_spacing):
310
        model = layer.ResizeCPTransform(cp_spacing)
311
        model.build(input_size)
312
313
        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...
314
315
    @pytest.mark.parametrize(
316
        "input_size,output_size,cp_spacing",
317
        [
318
            ((1, 68, 68, 68, 3), (1, 12, 8, 12, 3), (8, 16, 8)),
319
            ((1, 68, 68, 68, 3), (1, 12, 12, 12, 3), 8),
320
        ],
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
321
    )
322
    def test_call(self, input_size, output_size, cp_spacing):
323
        model = layer.ResizeCPTransform(cp_spacing)
324
        model.build(input_size)
325
326
        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...
327
        output = model(input)
328
329
        assert output.shape == output_size
330
331
332
class TestBSplines3DTransform:
333
    """
334
    Test the layer.BSplines3DTransform class,
335
    its default attributes and its call() function.
336
    """
337
338
    @pytest.mark.parametrize(
339
        "input_size,cp",
340
        [((1, 8, 8, 8, 3), 8), ((1, 8, 8, 8, 3), (8, 16, 12))],
341
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
342
    def test_init(self, input_size, cp):
343
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
344
345
        if isinstance(cp, int):
346
            cp = (cp, cp, cp)
347
348
        assert model.cp_spacing == cp
349
350
    @pytest.mark.parametrize(
351
        "input_size,cp",
352
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
353
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
354
    def generate_filter_coefficients(self, cp_spacing):
355
356
        b = {
357
            0: lambda u: np.float64((1 - u) ** 3 / 6),
358
            1: lambda u: np.float64((3 * (u ** 3) - 6 * (u ** 2) + 4) / 6),
359
            2: lambda u: np.float64((-3 * (u ** 3) + 3 * (u ** 2) + 3 * u + 1) / 6),
360
            3: lambda u: np.float64(u ** 3 / 6),
361
        }
362
363
        filters = np.zeros(
364
            (
365
                4 * cp_spacing[0],
366
                4 * cp_spacing[1],
367
                4 * cp_spacing[2],
368
                3,
369
                3,
370
            ),
371
            dtype=np.float32,
372
        )
373
374
        for u in range(cp_spacing[0]):
0 ignored issues
show
unused-code introduced by
Too many nested blocks (7/5)
Loading history...
375
            for v in range(cp_spacing[1]):
376
                for w in range(cp_spacing[2]):
377
                    for x in range(4):
378
                        for y in range(4):
379
                            for z in range(4):
380
                                for it_dim in range(3):
381
                                    u_norm = 1 - (u + 0.5) / cp_spacing[0]
382
                                    v_norm = 1 - (v + 0.5) / cp_spacing[1]
383
                                    w_norm = 1 - (w + 0.5) / cp_spacing[2]
384
                                    filters[
385
                                        x * cp_spacing[0] + u,
386
                                        y * cp_spacing[1] + v,
387
                                        z * cp_spacing[2] + w,
388
                                        it_dim,
389
                                        it_dim,
390
                                    ] = (
391
                                        b[x](u_norm) * b[y](v_norm) * b[z](w_norm)
392
                                    )
393
        return filters
394
395
    @pytest.mark.parametrize(
396
        "input_size,cp",
397
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
398
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
399
    def test_build(self, input_size, cp):
400
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
401
402
        model.build(input_size)
403
        assert model.filter.shape == (
404
            4 * cp[0],
405
            4 * cp[1],
406
            4 * cp[2],
407
            3,
408
            3,
409
        )
410
411
    @pytest.mark.parametrize(
412
        "input_size,cp",
413
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
414
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
415
    def test_coefficients(self, input_size, cp):
416
417
        filters = self.generate_filter_coefficients(cp_spacing=cp)
418
419
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
420
        model.build(input_size)
421
422
        assert np.allclose(filters, model.filter.numpy(), atol=1e-8)
423
424
    @pytest.mark.parametrize(
425
        "input_size,cp",
426
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
427
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
428
    def test_interpolation(self, input_size, cp):
429
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
430
        model.build(input_size)
431
432
        vol_shape = input_size[1:-1]
433
        num_cp = (
434
            [input_size[0]]
435
            + [int(np.ceil(isize / cpsize) + 3) for isize, cpsize in zip(vol_shape, cp)]
436
            + [input_size[-1]]
437
        )
438
439
        field = tf.random.normal(shape=num_cp, dtype=tf.float32)
440
441
        ddf = model.call(field)
442
        assert ddf.shape == input_size
443
444
445
class TestResize3d:
0 ignored issues
show
introduced by
Missing class docstring
Loading history...
446
    @pytest.mark.parametrize(
447
        ("input_shape", "resize_shape", "output_shape"),
448
        [
449
            ((1, 2, 3), (3, 4, 5), (3, 4, 5)),
450
            ((2, 1, 2, 3), (3, 4, 5), (2, 3, 4, 5)),
451
            ((2, 1, 2, 3, 1), (3, 4, 5), (2, 3, 4, 5, 1)),
452
            ((2, 1, 2, 3, 6), (3, 4, 5), (2, 3, 4, 5, 6)),
453
            ((1, 2, 3), (1, 2, 3), (1, 2, 3)),
454
            ((2, 1, 2, 3), (1, 2, 3), (2, 1, 2, 3)),
455
            ((2, 1, 2, 3, 1), (1, 2, 3), (2, 1, 2, 3, 1)),
456
            ((2, 1, 2, 3, 6), (1, 2, 3), (2, 1, 2, 3, 6)),
457
        ],
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
458
    )
459
    def test_forward(self, input_shape, resize_shape, output_shape):
460
        inputs = tf.ones(shape=input_shape)
461
        outputs = layer.Resize3d(shape=resize_shape)(inputs)
462
        assert outputs.shape == output_shape
463
464
    def test_get_config(self):
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
465
        resize = layer.Resize3d(shape=(2, 3, 4))
466
        config = resize.get_config()
467
        assert config == dict(
468
            shape=(2, 3, 4),
469
            method=tf.image.ResizeMethod.BILINEAR,
470
            name="resize3d",
471
            trainable=True,
472
            dtype="float32",
473
        )
474
475
    def test_shape_err(self):
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
476
        with pytest.raises(AssertionError):
477
            layer.Resize3d(shape=(2, 3))
478
479
    def test_image_shape_err(self):
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
480
        with pytest.raises(ValueError) as err_info:
481
            resize = layer.Resize3d(shape=(2, 3, 4))
482
            resize(tf.ones(1, 1))
483
        assert "Resize3d takes input image of dimension 3 or 4 or 5" in str(
484
            err_info.value
485
        )
486