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

test.unit.test_layer.test_norm_block()   A

Complexity

Conditions 1

Size

Total Lines 35
Code Lines 26

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 26
dl 0
loc 35
rs 9.256
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_residual3d_block():
92
    """
93
    Test the layer.Residual3dBlock class and its default attributes.
94
    """
95
    res3d_block = layer.Residual3dBlock(8)
96
97
    assert isinstance(res3d_block._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...
98
    assert res3d_block._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...
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...
99
    assert res3d_block._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...
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...
100
101
    assert res3d_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...
102
    assert res3d_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...
103
    assert res3d_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...
104
105
106
def test_downsample_resnet_block():
107
    """
108
    Test the layer.DownSampleResnetBlock class and its default attributes.
109
    """
110
    model = layer.DownSampleResnetBlock(8)
111
112
    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...
113
114
    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...
115
    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...
116
117
    model = layer.DownSampleResnetBlock(8, pooling=False)
118
    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...
119
    assert isinstance(model._conv3d_block3, layer.Conv3dBlock)
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...
120
121
122
def test_upsample_resnet_block():
123
    """
124
    Test the layer.UpSampleResnetBlock class and its default attributes.
125
    """
126
    batch_size = 5
127
    channels = 4
128
    input_size = (32, 32, 16)
129
    output_size = (64, 64, 32)
130
131
    input_tensor_size = (batch_size,) + input_size + (channels,)
132
    skip_tensor_size = (batch_size,) + output_size + (channels // 2,)
133
134
    model = layer.UpSampleResnetBlock(8)
135
    model.build([input_tensor_size, skip_tensor_size])
136
137
    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...
138
    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...
139
    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...
140
    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...
141
    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...
142
143
144
def test_init_conv3d_with_resize():
145
    """
146
    Test the layer.Conv3dWithResize class's default attributes and call function.
147
    """
148
    batch_size = 5
149
    channels = 4
150
    input_size = (32, 32, 16)
151
    output_size = (62, 62, 24)
152
    filters = 8
153
154
    input_tensor_size = (batch_size,) + input_size + (channels,)
155
    output_tensor_size = (batch_size,) + output_size + (filters,)
156
157
    model = layer.Conv3dWithResize(output_size, filters)
158
159
    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...
160
161
    # Pass an input of all zeros
162
    inputs = np.zeros(input_tensor_size)
163
    # Get outputs by calling
164
    output = model.call(inputs)
165
    # Expected shape is (5, 1, 2, 3, 3)
166
    assert all(x == y for x, y in zip(output_tensor_size, output.shape))
167
168
169
def test_warping():
170
    """
171
    Test the layer.Warping class, its default attributes and its call() method.
172
    """
173
    batch_size = 5
174
    fixed_image_size = (32, 32, 16)
175
    moving_image_size = (24, 24, 16)
176
    ndims = len(moving_image_size)
177
178
    grid_size = (1,) + fixed_image_size + (3,)
179
    model = layer.Warping(fixed_image_size)
180
181
    assert all(x == y for x, y in zip(grid_size, model.grid_ref.shape))
182
183
    # Pass an input of all zeros
184
    inputs = [
185
        np.ones((batch_size, *fixed_image_size, ndims), dtype="float32"),
186
        np.ones((batch_size, *moving_image_size), dtype="float32"),
187
    ]
188
    # Get outputs by calling
189
    output = model.call(inputs)
190
    # Expected shape is (5, 1, 2, 3, 3)
191
    assert all(x == y for x, y in zip((batch_size,) + fixed_image_size, output.shape))
192
193
194
def test_init_dvf():
195
    """
196
    Test the layer.IntDVF class, its default attributes and its call() method.
197
    """
198
199
    batch_size = 5
200
    fixed_image_size = (32, 32, 16)
201
    ndims = len(fixed_image_size)
202
203
    model = layer.IntDVF(fixed_image_size)
204
205
    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...
206
    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...
207
208
    inputs = np.ones((batch_size, *fixed_image_size, ndims))
209
    output = model.call(inputs)
210
    assert all(
211
        x == y
212
        for x, y in zip((batch_size,) + fixed_image_size + (ndims,), output.shape)
213
    )
214
215
216
def test_additive_upsampling():
217
    """
218
    Test the layer.AdditiveUpSampling class and its default attributes.
219
    """
220
    channels = 8
221
    batch_size = 5
222
    output_size = (32, 32, 16)
223
    input_size = (24, 24, 16)
224
225
    # Test __init__()
226
    model = layer.AdditiveUpSampling(output_size)
227
    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...
228
    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...
229
230
    # Test call()
231
    inputs = np.ones(
232
        (batch_size, input_size[0], input_size[1], input_size[2], channels)
233
    )
234
    output = model(inputs)
235
    assert all(
236
        x == y
237
        for x, y in zip((batch_size,) + output_size + (channels / 2,), output.shape)
238
    )
239
240
    # Test the exceptions
241
    model = layer.AdditiveUpSampling(output_size, stride=3)
242
    with pytest.raises(ValueError):
243
        model(inputs)
244
245
246
def test_local_net_residual3d_block():
247
    """
248
    Test the layer.LocalNetResidual3dBlock class's,
249
    default attributes and call() function.
250
    """
251
252
    # Test __init__()
253
    conv3d_block = layer.LocalNetResidual3dBlock(8)
254
255
    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...
256
    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...
257
    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...
258
    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...
259
260
261
def test_local_net_upsample_resnet_block():
262
    """
263
    Test the layer.LocalNetUpSampleResnetBlock class,
264
    its default attributes and its call() function.
265
    """
266
    batch_size = 5
267
    channels = 4
268
    input_size = (32, 32, 16)
269
    output_size = (64, 64, 32)
270
271
    nonskip_tensor_size = (batch_size,) + input_size + (channels,)
272
    skip_tensor_size = (batch_size,) + output_size + (channels,)
273
274
    # Test __init__() and build()
275
    model = layer.LocalNetUpSampleResnetBlock(8)
276
    model.build([nonskip_tensor_size, skip_tensor_size])
277
278
    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...
279
    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...
280
281
    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...
282
    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...
283
    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...
284
    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...
285
286
287
class TestResizeCPTransform:
0 ignored issues
show
introduced by
Missing class docstring
Loading history...
288
    @pytest.mark.parametrize(
289
        "parameter,cp_spacing", [((8, 8, 8), 8), ((8, 24, 16), (8, 24, 16))]
290
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
291
    def test_attributes(self, parameter, cp_spacing):
292
        model = layer.ResizeCPTransform(cp_spacing)
293
294
        if isinstance(cp_spacing, int):
295
            cp_spacing = [cp_spacing] * 3
296
        assert list(model.cp_spacing) == list(parameter)
297
        assert model.kernel_sigma == [0.44 * cp for cp in cp_spacing]
298
299
    @pytest.mark.parametrize(
300
        "input_size,output_size,cp_spacing",
301
        [
302
            ((1, 8, 8, 8, 3), (12, 8, 12), (8, 16, 8)),
303
            ((1, 8, 8, 8, 3), (12, 12, 12), 8),
304
        ],
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
305
    )
306
    def test_build(self, input_size, output_size, cp_spacing):
307
        model = layer.ResizeCPTransform(cp_spacing)
308
        model.build(input_size)
309
310
        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...
311
312
    @pytest.mark.parametrize(
313
        "input_size,output_size,cp_spacing",
314
        [
315
            ((1, 68, 68, 68, 3), (1, 12, 8, 12, 3), (8, 16, 8)),
316
            ((1, 68, 68, 68, 3), (1, 12, 12, 12, 3), 8),
317
        ],
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
318
    )
319
    def test_call(self, input_size, output_size, cp_spacing):
320
        model = layer.ResizeCPTransform(cp_spacing)
321
        model.build(input_size)
322
323
        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...
324
        output = model(input)
325
326
        assert output.shape == output_size
327
328
329
class TestBSplines3DTransform:
330
    """
331
    Test the layer.BSplines3DTransform class,
332
    its default attributes and its call() function.
333
    """
334
335
    @pytest.mark.parametrize(
336
        "input_size,cp",
337
        [((1, 8, 8, 8, 3), 8), ((1, 8, 8, 8, 3), (8, 16, 12))],
338
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
339
    def test_init(self, input_size, cp):
340
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
341
342
        if isinstance(cp, int):
343
            cp = (cp, cp, cp)
344
345
        assert model.cp_spacing == cp
346
347
    @pytest.mark.parametrize(
348
        "input_size,cp",
349
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
350
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
351
    def generate_filter_coefficients(self, cp_spacing):
352
353
        b = {
354
            0: lambda u: np.float64((1 - u) ** 3 / 6),
355
            1: lambda u: np.float64((3 * (u ** 3) - 6 * (u ** 2) + 4) / 6),
356
            2: lambda u: np.float64((-3 * (u ** 3) + 3 * (u ** 2) + 3 * u + 1) / 6),
357
            3: lambda u: np.float64(u ** 3 / 6),
358
        }
359
360
        filters = np.zeros(
361
            (
362
                4 * cp_spacing[0],
363
                4 * cp_spacing[1],
364
                4 * cp_spacing[2],
365
                3,
366
                3,
367
            ),
368
            dtype=np.float32,
369
        )
370
371
        for u in range(cp_spacing[0]):
0 ignored issues
show
unused-code introduced by
Too many nested blocks (7/5)
Loading history...
372
            for v in range(cp_spacing[1]):
373
                for w in range(cp_spacing[2]):
374
                    for x in range(4):
375
                        for y in range(4):
376
                            for z in range(4):
377
                                for it_dim in range(3):
378
                                    u_norm = 1 - (u + 0.5) / cp_spacing[0]
379
                                    v_norm = 1 - (v + 0.5) / cp_spacing[1]
380
                                    w_norm = 1 - (w + 0.5) / cp_spacing[2]
381
                                    filters[
382
                                        x * cp_spacing[0] + u,
383
                                        y * cp_spacing[1] + v,
384
                                        z * cp_spacing[2] + w,
385
                                        it_dim,
386
                                        it_dim,
387
                                    ] = (
388
                                        b[x](u_norm) * b[y](v_norm) * b[z](w_norm)
389
                                    )
390
        return filters
391
392
    @pytest.mark.parametrize(
393
        "input_size,cp",
394
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
395
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
396
    def test_build(self, input_size, cp):
397
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
398
399
        model.build(input_size)
400
        assert model.filter.shape == (
401
            4 * cp[0],
402
            4 * cp[1],
403
            4 * cp[2],
404
            3,
405
            3,
406
        )
407
408
    @pytest.mark.parametrize(
409
        "input_size,cp",
410
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
411
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
412
    def test_coefficients(self, input_size, cp):
413
414
        filters = self.generate_filter_coefficients(cp_spacing=cp)
415
416
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
417
        model.build(input_size)
418
419
        assert np.allclose(filters, model.filter.numpy(), atol=1e-8)
420
421
    @pytest.mark.parametrize(
422
        "input_size,cp",
423
        [((1, 8, 8, 8, 3), (8, 8, 8)), ((1, 8, 8, 8, 3), (8, 16, 12))],
424
    )
0 ignored issues
show
introduced by
Missing function or method docstring
Loading history...
425
    def test_interpolation(self, input_size, cp):
426
        model = layer.BSplines3DTransform(cp, input_size[1:-1])
427
        model.build(input_size)
428
429
        vol_shape = input_size[1:-1]
430
        num_cp = (
431
            [input_size[0]]
432
            + [int(np.ceil(isize / cpsize) + 3) for isize, cpsize in zip(vol_shape, cp)]
433
            + [input_size[-1]]
434
        )
435
436
        field = tf.random.normal(shape=num_cp, dtype=tf.float32)
437
438
        ddf = model.call(field)
439
        assert ddf.shape == input_size
440