GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_initialiser_ident.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 35 54 64.8%
Functions: 0 0 -%
Branches: 217 532 40.8%

Line Branch Exec Source
1 module athena__initialiser_ident
2 !! Module containing the implementation of the identity initialiser
3 !!
4 !! This module contains the implementation of the identity initialiser
5 !! for the weights and biases of a layer
6 use coreutils, only: real32, stop_program
7 use athena__misc_types, only: base_init_type
8 implicit none
9
10
11 private
12
13 public :: ident_init_type
14
15
16 type, extends(base_init_type) :: ident_init_type
17 !! Type for the identity initialiser
18 contains
19 procedure, pass(this) :: initialise => ident_initialise
20 !! Initialise the weights and biases using the identity matrix
21 end type ident_init_type
22
23
24 interface ident_init_type
25 module function initialiser_ident_setup() result(initialiser)
26 !! Interface for the Identity initialiser
27 type(ident_init_type) :: initialiser
28 !! Identity initialiser object
29 end function initialiser_ident_setup
30 end interface ident_init_type
31
32
33
34 contains
35
36 !###############################################################################
37 4 module function initialiser_ident_setup() result(initialiser)
38 !! Interface for the Identity initialiser
39 implicit none
40
41 type(ident_init_type) :: initialiser
42 !! Identity initialiser object
43
44 4 initialiser%name = "ident"
45
46 4 end function initialiser_ident_setup
47 !###############################################################################
48
49
50 !###############################################################################
51
4/6
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 3 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✗ Branch 5 not taken.
6 subroutine ident_initialise(this, input, fan_in, fan_out, spacing)
52 !! Initialise the weights and biases using the identity matrix
53 implicit none
54
55 ! Arguments
56 class(ident_init_type), intent(inout) :: this
57 !! Instance of the identity initialiser
58 real(real32), dimension(..), intent(out) :: input
59 !! Weights and biases to initialise
60 integer, optional, intent(in) :: fan_in, fan_out
61 !! Number of input and output parameters
62 integer, dimension(:), optional, intent(in) :: spacing
63 !! Spacing of the input and output units
64
65 ! Local variables
66 integer :: i, j
67 !! Loop index
68 integer :: ndim
69 !! Number of dimensions
70 6 integer, dimension(:), allocatable :: iprime, iprime2
71 !! Index variables
72
73
74
7/14
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✓ Branch 9 taken 6 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 6 times.
✗ Branch 12 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 6 times.
6 if(all(shape(input).ne.size(input,1)))then
75 call stop_program( &
76 'A non-square tensor cannot be initialised as an identity matrix' &
77 )
78 return
79 end if
80
81 select rank(input)
82 rank(0)
83 input = 1._real32
84 rank(1)
85
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 times.
4 if(size(input).ne.1)then
86
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 3 times.
3 if(.not.present(spacing))then
87 call stop_program( &
88 'A vector of length greater than 1 cannot be &
89 &initialised as an identity matrix' &
90 )
91 return
92 else
93
4/8
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 3 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 3 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 3 times.
3 ndim = size(spacing)
94
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 2 times.
3 if(ndim.eq.1)then
95
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
2 do i = 1, size(input)/spacing(1)
96
3/6
✗ 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.
2 input(1 + ( i - 1 ) * ( spacing(1) + 1) ) = 1._real32
97 end do
98
1/2
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
2 elseif(ndim.gt.1)then
99
7/14
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ 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 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
2 allocate(iprime(ndim))
100
7/14
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ 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 11 not taken.
✓ Branch 12 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
2 allocate(iprime2(ndim))
101 2 iprime2 = 0
102
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 iprime2(1) = 1
103
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✓ Branch 3 taken 1152 times.
✓ Branch 4 taken 2 times.
1154 do i = 1, size(input)/spacing(1)
104 iprime(ndim) = &
105 mod( &
106 (i - 1) / product( spacing(:ndim-1) ), &
107 product(spacing(:ndim)) &
108
14/24
✓ Branch 0 taken 1152 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1152 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 1152 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1152 times.
✓ Branch 8 taken 4320 times.
✓ Branch 9 taken 1152 times.
✓ Branch 10 taken 1152 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 1152 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1152 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1152 times.
✓ Branch 18 taken 5472 times.
✓ Branch 19 taken 1152 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 1152 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1152 times.
10944 )
109
10/18
✗ Branch 0 not taken.
✓ Branch 1 taken 1152 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1152 times.
✓ Branch 6 taken 1152 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1152 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 1152 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1152 times.
✓ Branch 17 taken 4320 times.
✓ Branch 18 taken 1152 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1152 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1152 times.
5472 iprime(ndim) = iprime(ndim) * product(spacing(:ndim-1))
110
2/2
✓ Branch 0 taken 4320 times.
✓ Branch 1 taken 1152 times.
5472 do j = ndim - 1, 1, -1
111
8/12
✗ Branch 0 not taken.
✓ Branch 1 taken 4320 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4320 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 4320 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 4320 times.
✓ Branch 12 taken 10368 times.
✓ Branch 13 taken 4320 times.
✓ Branch 14 taken 405 times.
✓ Branch 15 taken 3915 times.
14688 if(sum(iprime(j+1:)).eq.0)then
112
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 405 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 405 times.
405 iprime(j) = 0
113 else
114 iprime(j) = &
115 mod( &
116 (i - 1), &
117 sum(iprime(j+1:)) &
118
14/24
✗ Branch 0 not taken.
✓ Branch 1 taken 3915 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 3915 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 3915 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 3915 times.
✓ Branch 8 taken 9396 times.
✓ Branch 9 taken 3915 times.
✓ Branch 10 taken 3915 times.
✗ Branch 11 not taken.
✗ Branch 12 not taken.
✓ Branch 13 taken 3915 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 3915 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 3915 times.
✓ Branch 21 taken 5481 times.
✓ Branch 22 taken 3915 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 3915 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 3915 times.
18792 ) / product(spacing(:j-1))
119 end if
120
10/18
✗ Branch 0 not taken.
✓ Branch 1 taken 4320 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4320 times.
✓ Branch 6 taken 4320 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 4320 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 4320 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 4320 times.
✓ Branch 17 taken 6048 times.
✓ Branch 18 taken 4320 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 4320 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 4320 times.
11520 iprime(j) = iprime(j) * product(spacing(:j-1))
121 end do
122
14/26
✗ Branch 0 not taken.
✓ Branch 1 taken 1152 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1152 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1152 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1152 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1152 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1152 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1152 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1152 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1152 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1152 times.
✓ Branch 30 taken 5472 times.
✓ Branch 31 taken 1152 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1152 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1152 times.
6626 input(1 + sum(iprime * ( spacing(1) + iprime2 ))) = 1._real32
123 end do
124 end if
125 end if
126 else
127
6/10
✗ 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 taken 1 times.
✓ Branch 13 taken 1 times.
2 input = 1._real32
128 end if
129 rank(2)
130 input = 0._real32
131 do i = 1, size(input,1)
132 input(i,i) = 1._real32
133 end do
134 rank(3)
135
17/28
✗ 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 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✓ Branch 34 taken 1 times.
✓ Branch 35 taken 1 times.
✓ Branch 36 taken 1 times.
✓ Branch 37 taken 1 times.
✓ Branch 38 taken 1 times.
✓ Branch 39 taken 1 times.
4 input = 0._real32
136
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
3 do i = 1, size(input,1)
137
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.
2 input(i,i,i) = 1._real32
138 end do
139 rank(4)
140 input = 0._real32
141 do i = 1, size(input,1)
142 input(i,i,i,i) = 1._real32
143 end do
144 rank(5)
145 input = 0._real32
146 do i = 1, size(input,1)
147 input(i,i,i,i,i) = 1._real32
148 end do
149 rank(6)
150
35/58
✗ 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 not taken.
✓ Branch 11 taken 1 times.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 22 not taken.
✓ Branch 23 taken 1 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 1 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 1 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 1 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 1 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 1 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 52 not taken.
✓ Branch 53 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 64 not taken.
✓ Branch 65 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 times.
✓ Branch 70 taken 1 times.
✓ Branch 71 taken 1 times.
✓ Branch 72 taken 1 times.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 1 times.
✓ Branch 75 taken 1 times.
✓ Branch 76 taken 1 times.
✓ Branch 77 taken 1 times.
✓ Branch 78 taken 1 times.
✓ Branch 79 taken 1 times.
✓ Branch 80 taken 1 times.
✓ Branch 81 taken 1 times.
7 input = 0._real32
151
3/4
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
3 do i = 1, size(input,1)
152
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 21 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 1 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 1 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 times.
2 input(i,i,i,i,i,i) = 1._real32
153 end do
154 end select
155
156
4/4
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 4 times.
6 end subroutine ident_initialise
157 !###############################################################################
158
159
11/18
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
✓ Branch 6 taken 4 times.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 1 times.
✓ Branch 11 taken 1 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 1 times.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
6 end module athena__initialiser_ident
160