diff --git a/tests/test_projection.py b/tests/test_projection.py index 65e939b47d97e666a63a6b0c73cb37d867aa5c42..2c98fdcc3c67b7295b44b70a3d9aced0b9634604 100644 --- a/tests/test_projection.py +++ b/tests/test_projection.py @@ -2,7 +2,6 @@ # Copyright © 2020 Stephan Seitz <stephan.seitz@fau.de> # # Distributed under terms of the GPLv3 license. - """ """ @@ -21,24 +20,19 @@ def test_init(): @pytest.mark.parametrize('with_backward', ('with_backward', False)) def test_projection(with_texture, with_backward): projector = pyronn_torch.ConeBeamProjector( - (128, 128, 128), - (2.0, 2.0, 2.0), - (-127.5, -127.5, -127.5), - (2, 480, 620), - [1.0, 1.0], - (0, 0), - np.array([[[-3.10e+2, -1.20e+03, 0.00e+00, 1.86e+5], - [-2.40e+2, 0.00e+00, 1.20e+03, 1.44e+5], - [-1.00e+00, 0.00e+00, 0.00e+00, 6.00e+2]], - [[-2.89009888e+2, -1.20522754e+3, -1.02473585e-13, - 1.86000000e+5], - [-2.39963440e+2, -4.18857765e+0, 1.20000000e+3, - 1.44000000e+5], - [-9.99847710e-01, -1.74524058e-2, 0.00000000e+0, - 6.00000000e+2]]]) - ) - - volume = projector.new_volume_tensor(requires_grad=True if with_backward else False) + (128, 128, 128), (2.0, 2.0, 2.0), (-127.5, -127.5, -127.5), + (2, 480, 620), [1.0, 1.0], (0, 0), + np.array( + [[[-3.10e+2, -1.20e+03, 0.00e+00, 1.86e+5], + [-2.40e+2, 0.00e+00, 1.20e+03, 1.44e+5], + [-1.00e+00, 0.00e+00, 0.00e+00, 6.00e+2]], + [[-2.89009888e+2, -1.20522754e+3, -1.02473585e-13, 1.86000000e+5], + [-2.39963440e+2, -4.18857765e+0, 1.20000000e+3, 1.44000000e+5], + [-9.99847710e-01, -1.74524058e-2, 0.00000000e+0, + 6.00000000e+2]]])) + + volume = projector.new_volume_tensor( + requires_grad=True if with_backward else False) volume += 1. result = projector.project_forward(volume, use_texture=with_texture) @@ -56,23 +50,18 @@ def test_projection(with_texture, with_backward): @pytest.mark.parametrize('with_backward', ('with_backward', False)) def test_projection_backward(with_texture, with_backward): projector = pyronn_torch.ConeBeamProjector( - (128, 128, 128), - (2.0, 2.0, 2.0), - (-127.5, -127.5, -127.5), - (2, 480, 620), - [1.0, 1.0], - (0, 0), - np.array([[[-3.10e+2, -1.20e+03, 0.00e+00, 1.86e+5], - [-2.40e+2, 0.00e+00, 1.20e+03, 1.44e+5], - [-1.00e+00, 0.00e+00, 0.00e+00, 6.00e+2]], - [[-2.89009888e+2, -1.20522754e+3, -1.02473585e-13, - 1.86000000e+5], - [-2.39963440e+2, -4.18857765e+0, 1.20000000e+3, - 1.44000000e+5], - [-9.99847710e-01, -1.74524058e-2, 0.00000000e+0, - 6.00000000e+2]]]) - ) - projection = projector.new_projection_tensor(requires_grad=True if with_backward else False) + (128, 128, 128), (2.0, 2.0, 2.0), (-127.5, -127.5, -127.5), + (2, 480, 620), [1.0, 1.0], (0, 0), + np.array( + [[[-3.10e+2, -1.20e+03, 0.00e+00, 1.86e+5], + [-2.40e+2, 0.00e+00, 1.20e+03, 1.44e+5], + [-1.00e+00, 0.00e+00, 0.00e+00, 6.00e+2]], + [[-2.89009888e+2, -1.20522754e+3, -1.02473585e-13, 1.86000000e+5], + [-2.39963440e+2, -4.18857765e+0, 1.20000000e+3, 1.44000000e+5], + [-9.99847710e-01, -1.74524058e-2, 0.00000000e+0, + 6.00000000e+2]]])) + projection = projector.new_projection_tensor( + requires_grad=True if with_backward else False) projection += 1. @@ -95,7 +84,8 @@ def test_conrad_config(with_backward, with_texture=True): projector = pyronn_torch.ConeBeamProjector.from_conrad_config() - volume = projector.new_volume_tensor(requires_grad=True if with_backward else False) + volume = projector.new_volume_tensor( + requires_grad=True if with_backward else False) volume += 1. result = projector.project_forward(volume, use_texture=with_texture) @@ -117,7 +107,8 @@ def test_projection_backward_conrad(with_texture=True, with_backward=True): projector = pyronn_torch.ConeBeamProjector.from_conrad_config() - projection = projector.new_projection_tensor(requires_grad=True if with_backward else False) + projection = projector.new_projection_tensor( + requires_grad=True if with_backward else False) projection += 1000. @@ -155,3 +146,37 @@ def test_conrad_forward_backward(): while True: pass + + +def test_register_hook(): + + was_executed = False + + def require_nonleaf_grad(v): + def hook(g): + nonlocal was_executed + was_executed = True + v.grad_nonleaf = g + + v.register_hook(hook) + + projector = pyronn_torch.ConeBeamProjector( + (128, 128, 128), (2.0, 2.0, 2.0), (-127.5, -127.5, -127.5), + (2, 480, 620), [1.0, 1.0], (0, 0), + np.array( + [[[-3.10e+2, -1.20e+03, 0.00e+00, 1.86e+5], + [-2.40e+2, 0.00e+00, 1.20e+03, 1.44e+5], + [-1.00e+00, 0.00e+00, 0.00e+00, 6.00e+2]], + [[-2.89009888e+2, -1.20522754e+3, -1.02473585e-13, 1.86000000e+5], + [-2.39963440e+2, -4.18857765e+0, 1.20000000e+3, 1.44000000e+5], + [-9.99847710e-01, -1.74524058e-2, 0.00000000e+0, + 6.00000000e+2]]])) + + x = projector.new_volume_tensor(requires_grad=True) + require_nonleaf_grad(x) + + loss = projector.project_forward(x) + loss.mean().backward() + + x.grad_nonleaf + assert was_executed