GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_diffstruc_extd_sub_merge.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 29 32 90.6%
Functions: 0 0 -%
Branches: 85 150 56.7%

Line Branch Exec Source
1 submodule (athena__diffstruc_extd) athena__diffstruc_extd_submodule_merge
2 !! Submodule containing implementations for extended diffstruc array operations
3
4 contains
5
6 !###############################################################################
7
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 module function merge_scalar_over_channels(tsource, fsource, mask) result(output)
8 !! 1D average pooling operation
9 implicit none
10
11 ! Arguments
12 class(array_type), intent(in), target :: tsource
13 real(real32), intent(in) :: fsource
14 logical, dimension(:,:), intent(in) :: mask
15 type(array_type), pointer :: output
16
17 ! Local variables
18 integer :: i, m, s
19 integer :: num_elements, num_dims
20
21
22 3 output => tsource%create_result()
23 3 num_dims = size(tsource%shape)
24
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 3 times.
9 num_elements = product(tsource%shape(1:num_dims - 1))
25
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 do concurrent(s = 1:size(tsource%val,2), m = 1: tsource%shape(num_dims))
26
4/4
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 7 times.
17 do concurrent(i=1:num_elements)
27
7/10
✓ Branch 0 taken 762 times.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 762 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 762 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 762 times.
✓ Branch 11 taken 684 times.
✓ Branch 12 taken 78 times.
769 if(mask(i,1))then
28
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 684 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 684 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 684 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 684 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 684 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 684 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 684 times.
684 output%val(i + (m-1) * num_elements,s) = tsource%val(i,s)
29 else
30
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
78 output%val(i + (m-1) * num_elements,s) = fsource
31 end if
32 end do
33 end do
34
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 3 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 3 times.
✓ Branch 27 taken 3 times.
✓ Branch 28 taken 258 times.
✓ Branch 29 taken 3 times.
264 output%mask = mask
35
36 3 output%get_partial_left => get_partial_merge_scalar_over_channels
37 3 output%get_partial_left_val => get_partial_merge_scalar_over_channels_val
38
1/2
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
3 if(tsource%requires_grad)then
39 3 output%requires_grad = .true.
40 3 output%is_forward = tsource%is_forward
41 3 output%operation = 'merge_over_channels'
42 3 output%left_operand => tsource
43 end if
44
45 3 end function merge_scalar_over_channels
46 !-------------------------------------------------------------------------------
47 function get_partial_merge_scalar_over_channels(this, upstream_grad) result(output)
48 implicit none
49 class(array_type), intent(inout) :: this
50 type(array_type), intent(in) :: upstream_grad
51 type(array_type) :: output
52
53 output = merge_scalar_over_channels(upstream_grad, 0._real32, this%mask)
54
55 end function get_partial_merge_scalar_over_channels
56 !-------------------------------------------------------------------------------
57 3 pure subroutine get_partial_merge_scalar_over_channels_val( &
58
2/4
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
3 this, upstream_grad, output &
59 )
60 implicit none
61 class(array_type), intent(in) :: this
62 real(real32), dimension(:,:), intent(in) :: upstream_grad
63 real(real32), dimension(:,:), intent(out) :: output
64
65 integer :: i, m, s
66 integer :: num_elements, num_dims, num_channels
67
68 3 num_dims = size(this%left_operand%shape)
69
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✓ Branch 12 taken 6 times.
✓ Branch 13 taken 3 times.
9 num_elements = product(this%left_operand%shape(1:num_dims - 1))
70
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
3 num_channels = this%left_operand%shape(num_dims)
71
72
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 3 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 3 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3 times.
3 do concurrent(s = 1:size(upstream_grad,2), m = 1: num_channels)
73
4/4
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 7 times.
✓ Branch 3 taken 7 times.
17 do concurrent(i=1:num_elements)
74
8/12
✓ Branch 0 taken 762 times.
✓ Branch 1 taken 7 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 762 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 762 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 762 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 762 times.
✓ Branch 14 taken 684 times.
✓ Branch 15 taken 78 times.
769 if(this%mask(i,1))then
75
8/16
✗ Branch 0 not taken.
✓ Branch 1 taken 684 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 684 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 684 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 684 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 684 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 684 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 684 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 684 times.
684 output(i + (m-1) * num_elements,s) = upstream_grad(i,s)
76 else
77
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 78 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 78 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 78 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 78 times.
78 output(i + (m-1) * num_elements,s) = 0._real32
78 end if
79 end do
80 end do
81
82 3 end subroutine get_partial_merge_scalar_over_channels_val
83 !###############################################################################
84
85 end submodule athena__diffstruc_extd_submodule_merge
86