| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | submodule (athena__diffstruc_extd) athena__diffstruc_extd_submodule_msgpass_kipf | ||
| 2 | !! Submodule containing implementations for extended diffstruc array operations | ||
| 3 | |||
| 4 | contains | ||
| 5 | |||
| 6 | !############################################################################### | ||
| 7 |
2/4✓ Branch 0 taken 19 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 19 times.
✗ Branch 3 not taken.
|
19 | module function kipf_propagate(vertex_features, adj_ia, adj_ja) result(c) |
| 8 | !! Propagate values from one autodiff array to another | ||
| 9 | implicit none | ||
| 10 | |||
| 11 | ! Arguments | ||
| 12 | class(array_type), intent(in), target :: vertex_features | ||
| 13 | !! Vertex feature tensor | ||
| 14 | integer, dimension(:), intent(in) :: adj_ia | ||
| 15 | !! CSR row pointers | ||
| 16 | integer, dimension(:,:), intent(in) :: adj_ja | ||
| 17 | !! CSR neighbour and edge lookup indices | ||
| 18 | type(array_type), pointer :: c | ||
| 19 | !! Propagated node feature tensor | ||
| 20 | |||
| 21 | ! Local variables | ||
| 22 | integer :: v, w | ||
| 23 | !! Vertex and adjacency traversal indices | ||
| 24 | real(real32) :: coeff | ||
| 25 | !! Symmetric normalisation coefficient per edge | ||
| 26 | |||
| 27 | 19 | c => vertex_features%create_result() | |
| 28 | ! propagate 1D array by using shape to swap dimensions | ||
| 29 | 19 | do concurrent(v = 1:size(vertex_features%val,2)) | |
| 30 |
8/14✗ 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.
✗ Branch 12 not taken.
✓ Branch 13 taken 78 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 78 times.
✓ Branch 18 taken 420 times.
✓ Branch 19 taken 78 times.
|
498 | c%val(:,v) = 0._real32 |
| 31 |
8/12✓ Branch 0 taken 78 times.
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 78 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 78 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 78 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 78 times.
✓ Branch 14 taken 184 times.
✓ Branch 15 taken 78 times.
|
359 | do w = adj_ia(v), adj_ia(v+1)-1 |
| 32 | |||
| 33 | ! if( adj_ja(2,w) .eq. 0 )then | ||
| 34 | ! coeff = 1._real32 | ||
| 35 | ! !else | ||
| 36 | ! ! coeff = edge_weights(adj_ja(2,w)) | ||
| 37 | ! end if | ||
| 38 | !coeff = coeff * ( & | ||
| 39 | coeff = ( & | ||
| 40 |
2/4✗ Branch 1 not taken.
✓ Branch 2 taken 184 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 184 times.
|
368 | ( adj_ia(v+1) - adj_ia(v) ) * & |
| 41 |
6/12✗ Branch 1 not taken.
✓ Branch 2 taken 184 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 184 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 184 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 184 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 184 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 184 times.
|
736 | ( adj_ia( adj_ja(1,w) + 1 ) - adj_ia( adj_ja(1,w) ) ) & |
| 42 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 184 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 184 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 184 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 184 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 184 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 184 times.
|
1104 | ) ** ( -0.5_real32 ) |
| 43 | |||
| 44 |
27/50✗ Branch 0 not taken.
✓ Branch 1 taken 184 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 184 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 184 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 184 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 184 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 184 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 184 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 184 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 184 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 184 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 184 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 184 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 184 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 184 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 184 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 184 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 184 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 184 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 184 times.
✓ Branch 56 taken 1018 times.
✓ Branch 57 taken 184 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 184 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 184 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 184 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 184 times.
✓ Branch 70 taken 1018 times.
✓ Branch 71 taken 184 times.
|
2298 | c%val(:,v) = c%val(:,v) + coeff * [ vertex_features%val(:, adj_ja(1, w)) ] |
| 45 | end do | ||
| 46 | end do | ||
| 47 | |||
| 48 |
7/14✗ Branch 0 not taken.
✓ Branch 1 taken 19 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 19 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 19 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 97 times.
✓ Branch 16 taken 19 times.
|
116 | c%indices = adj_ia |
| 49 |
12/24✗ Branch 0 not taken.
✓ Branch 1 taken 19 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 19 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 19 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 19 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 19 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 19 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 184 times.
✓ Branch 27 taken 19 times.
✓ Branch 28 taken 368 times.
✓ Branch 29 taken 184 times.
|
571 | c%adj_ja = adj_ja |
| 50 | 19 | c%get_partial_left => get_partial_kipf_propagate_left | |
| 51 | 19 | c%get_partial_left_val => get_partial_kipf_propagate_left_val | |
| 52 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 11 times.
|
19 | if(vertex_features%requires_grad)then |
| 53 | 8 | c%requires_grad = .true. | |
| 54 | 8 | c%is_forward = vertex_features%is_forward | |
| 55 | 8 | c%operation = 'kipf_propagate' | |
| 56 | 8 | c%left_operand => vertex_features | |
| 57 | 8 | c%owns_left_operand = vertex_features%is_temporary | |
| 58 | end if | ||
| 59 | 19 | end function kipf_propagate | |
| 60 | !------------------------------------------------------------------------------- | ||
| 61 | 1 | function get_partial_kipf_propagate_left(this, upstream_grad) result(output) | |
| 62 | !! Gradient of kipf_propagate with respect to vertex features. | ||
| 63 | implicit none | ||
| 64 | |||
| 65 | ! Arguments | ||
| 66 | class(array_type), intent(inout) :: this | ||
| 67 | !! Forward result node containing saved operands | ||
| 68 | type(array_type), intent(in) :: upstream_grad | ||
| 69 | !! Upstream gradient tensor | ||
| 70 | type(array_type) :: output | ||
| 71 | !! Gradient tensor for left operand | ||
| 72 | |||
| 73 | output = reverse_kipf_propagate( upstream_grad, & | ||
| 74 | this%indices, this%adj_ja, & | ||
| 75 | 2 | num_features = [ & | |
| 76 | 2 | this%left_operand%shape(1), this%right_operand%shape(1) & | |
| 77 | ], & | ||
| 78 | num_elements = [ & | ||
| 79 | size(this%left_operand%val,2), size(this%right_operand%val,2) & | ||
| 80 | ] & | ||
| 81 |
7/10✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 taken 1 times.
✓ Branch 12 taken 2 times.
✓ Branch 13 taken 1 times.
|
5 | ) |
| 82 | |||
| 83 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
2 | end function get_partial_kipf_propagate_left |
| 84 | !------------------------------------------------------------------------------- | ||
| 85 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | pure subroutine get_partial_kipf_propagate_left_val(this, upstream_grad, output) |
| 86 | !! In-place value gradient for kipf_propagate left operand. | ||
| 87 | implicit none | ||
| 88 | |||
| 89 | ! Arguments | ||
| 90 | class(array_type), intent(in) :: this | ||
| 91 | !! Forward result node containing saved operands | ||
| 92 | real(real32), dimension(:,:), intent(in) :: upstream_grad | ||
| 93 | !! Upstream gradient values | ||
| 94 | real(real32), dimension(:,:), intent(out) :: output | ||
| 95 | !! Output gradient values for left operand | ||
| 96 | |||
| 97 | ! Local variables | ||
| 98 | integer :: v, w, i | ||
| 99 | !! Loop indices | ||
| 100 | |||
| 101 |
10/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 4 times.
✓ Branch 21 taken 2 times.
|
7 | output = 0._real32 |
| 102 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
|
1 | do concurrent(v=1:size(upstream_grad,2)) |
| 103 |
8/12✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
|
5 | do w = this%indices(v), this%indices(v+1)-1 |
| 104 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
|
4 | do concurrent(i = 1:size(upstream_grad,1)) |
| 105 |
4/8✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4 times.
|
16 | output(i,this%adj_ja(1,w)) = output(i,this%adj_ja(1,w)) + & |
| 106 |
18/34✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 4 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 4 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 4 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 4 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 4 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 4 times.
|
18 | upstream_grad(i, v) |
| 107 | end do | ||
| 108 | end do | ||
| 109 | end do | ||
| 110 | |||
| 111 | 1 | end subroutine get_partial_kipf_propagate_left_val | |
| 112 | !############################################################################### | ||
| 113 | |||
| 114 | |||
| 115 | !############################################################################### | ||
| 116 | 1 | function reverse_kipf_propagate( & | |
| 117 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | a, adj_ia, adj_ja, num_features, num_elements & |
| 118 | ) result(c) | ||
| 119 | !! Reverse propagate values from one autodiff array to another | ||
| 120 | implicit none | ||
| 121 | |||
| 122 | ! Arguments | ||
| 123 | class(array_type), intent(in), target :: a | ||
| 124 | !! Upstream tensor to reverse-propagate | ||
| 125 | integer, dimension(:), intent(in) :: adj_ia | ||
| 126 | !! CSR row pointers | ||
| 127 | integer, dimension(:,:), intent(in) :: adj_ja | ||
| 128 | !! CSR neighbour and edge lookup indices | ||
| 129 | integer, dimension(2), intent(in) :: num_features, num_elements | ||
| 130 | !! Output feature and element counts | ||
| 131 | type(array_type), pointer :: c | ||
| 132 | !! Reverse-propagated tensor | ||
| 133 | |||
| 134 | ! Local variables | ||
| 135 | integer :: v, w | ||
| 136 | !! Loop indices | ||
| 137 | |||
| 138 | c => a%create_result(array_shape=[ & | ||
| 139 | num_features(1), num_elements(1) & | ||
| 140 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | ]) |
| 141 |
4/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 4 times.
✓ Branch 3 taken 2 times.
|
7 | c%val = 0.0_real32 |
| 142 | 1 | do concurrent(v=1:num_elements(1)) | |
| 143 |
8/12✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
|
5 | do w = adj_ia(v), adj_ia(v+1)-1 |
| 144 |
4/8✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
|
4 | c%val(:,adj_ja(1,w)) = c%val(:,adj_ja(1,w)) + & |
| 145 |
26/48✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 2 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 2 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 2 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 2 times.
✓ Branch 41 taken 4 times.
✓ Branch 42 taken 2 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 2 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✓ Branch 53 taken 4 times.
✓ Branch 54 taken 2 times.
|
16 | [ a%val(:, v) ] |
| 146 | end do | ||
| 147 | end do | ||
| 148 | |||
| 149 |
7/14✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 3 times.
✓ Branch 16 taken 1 times.
|
4 | c%indices = adj_ia |
| 150 |
12/24✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 2 times.
✓ Branch 27 taken 1 times.
✓ Branch 28 taken 4 times.
✓ Branch 29 taken 2 times.
|
7 | c%adj_ja = adj_ja |
| 151 | 1 | c%get_partial_left => get_partial_left_reverse_kipf_propagate | |
| 152 | 1 | c%get_partial_left_val => get_partial_left_reverse_kipf_propagate_val | |
| 153 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
|
1 | if(a%requires_grad)then |
| 154 | ✗ | c%requires_grad = .true. | |
| 155 | ✗ | c%is_forward = a%is_forward | |
| 156 | ✗ | c%operation = 'reverse_kipf_propagate' | |
| 157 | ✗ | c%left_operand => a | |
| 158 | ✗ | c%owns_left_operand = a%is_temporary | |
| 159 | end if | ||
| 160 | 1 | end function reverse_kipf_propagate | |
| 161 | !------------------------------------------------------------------------------- | ||
| 162 | 1 | function get_partial_left_reverse_kipf_propagate( & | |
| 163 | this, upstream_grad & | ||
| 164 | 1 | ) result(output) | |
| 165 | implicit none | ||
| 166 | ! Arguments | ||
| 167 | class(array_type), intent(inout) :: this | ||
| 168 | !! Forward result node containing saved operands | ||
| 169 | type(array_type), intent(in) :: upstream_grad | ||
| 170 | !! Upstream gradient tensor | ||
| 171 | type(array_type) :: output | ||
| 172 | !! Gradient tensor for left operand | ||
| 173 | |||
| 174 | output = kipf_propagate( upstream_grad, & | ||
| 175 | this%indices, this%adj_ja & | ||
| 176 | 1 | ) | |
| 177 | |||
| 178 | 2 | end function get_partial_left_reverse_kipf_propagate | |
| 179 | !------------------------------------------------------------------------------- | ||
| 180 | 1 | pure subroutine get_partial_left_reverse_kipf_propagate_val( & | |
| 181 |
2/4✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
|
1 | this, upstream_grad, output & |
| 182 | ) | ||
| 183 | implicit none | ||
| 184 | |||
| 185 | ! Arguments | ||
| 186 | class(array_type), intent(in) :: this | ||
| 187 | !! Forward result node containing saved operands | ||
| 188 | real(real32), dimension(:,:), intent(in) :: upstream_grad | ||
| 189 | !! Upstream gradient values | ||
| 190 | real(real32), dimension(:,:), intent(out) :: output | ||
| 191 | !! Output gradient values for left operand | ||
| 192 | |||
| 193 | ! Local variables | ||
| 194 | integer :: v, w, i | ||
| 195 | !! Loop indices | ||
| 196 |
10/16✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✓ Branch 18 taken 2 times.
✓ Branch 19 taken 1 times.
✓ Branch 20 taken 4 times.
✓ Branch 21 taken 2 times.
|
7 | output = 0._real32 |
| 197 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
|
1 | do concurrent(v=1:size(upstream_grad,2)) |
| 198 |
8/12✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 2 times.
✓ Branch 14 taken 2 times.
✓ Branch 15 taken 2 times.
|
5 | do w = this%indices(v), this%indices(v+1)-1 |
| 199 |
6/12✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 2 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 2 times.
|
4 | do concurrent(i = 1:size(upstream_grad,1)) |
| 200 |
4/8✗ Branch 1 not taken.
✓ Branch 2 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 4 times.
|
16 | output(i,this%adj_ja(1,w)) = output(i,this%adj_ja(1,w)) + & |
| 201 |
18/34✓ Branch 0 taken 4 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 4 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 4 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 4 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 4 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 4 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 4 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 4 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 4 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 4 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 4 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 4 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 4 times.
|
18 | upstream_grad(i, v) |
| 202 | end do | ||
| 203 | end do | ||
| 204 | end do | ||
| 205 | |||
| 206 | 1 | end subroutine get_partial_left_reverse_kipf_propagate_val | |
| 207 | !############################################################################### | ||
| 208 | |||
| 209 | end submodule athena__diffstruc_extd_submodule_msgpass_kipf | ||
| 210 |