GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_initialiser_gaussian.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 22 25 88.0%
Functions: 0 0 -%
Branches: 100 196 51.0%

Line Branch Exec Source
1 module athena__initialiser_gaussian
2 !! Module containing the Gaussian initialisation
3 !!
4 !! This module contains the implementation of the Gaussian initialisation
5 !! for the weights and biases of a layer
6 use coreutils, only: real32, pi
7 use athena__misc_types, only: base_init_type
8 implicit none
9
10
11 private
12
13 public :: gaussian_init_type
14
15
16 type, extends(base_init_type) :: gaussian_init_type
17 !! Type for the Gaussian initialiser
18 contains
19 procedure, pass(this) :: initialise => gaussian_initialise
20 !! Initialise the weights and biases using the Gaussian distribution
21 end type gaussian_init_type
22
23
24 interface gaussian_init_type
25 module function initialiser_gaussian_type(name) result(initialiser)
26 !! Interface for the Gaussian initialiser
27 type(gaussian_init_type) :: initialiser
28 !! Gaussian initialiser object
29 character(*), optional, intent(in) :: name
30 !! Name of the initialiser
31 end function initialiser_gaussian_type
32 end interface gaussian_init_type
33
34
35
36 contains
37
38 !###############################################################################
39 14 module function initialiser_gaussian_type(name) result(initialiser)
40 !! Interface for the Gaussian initialiser
41 implicit none
42 ! Arguments
43 character(*), optional, intent(in) :: name
44 !! Name of the initialiser
45
46
47 type(gaussian_init_type) :: initialiser
48 !! Gaussian initialiser object
49
50 14 if(present(name))then
51
2/4
✓ Branch 2 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
✗ Branch 5 not taken.
4 initialiser%name = trim(adjustl(name))
52 else
53 10 initialiser%name = "gaussian"
54 end if
55
56
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 10 times.
28 end function initialiser_gaussian_type
57 !###############################################################################
58
59
60 !###############################################################################
61 20 subroutine gaussian_initialise(this, input, fan_in, fan_out, spacing)
62 !! Initialise the weights and biases using the Gaussian distribution
63 implicit none
64
65 ! Arguments
66 class(gaussian_init_type), intent(inout) :: this
67 !! Instance of the Gaussian initialiser
68 real(real32), dimension(..), intent(out) :: input
69 !! Weights and biases to initialise
70 integer, optional, intent(in) :: fan_in, fan_out
71 !! Number of input and output parameters
72 integer, dimension(:), optional, intent(in) :: spacing
73 !! Spacing of the input and output units
74
75 ! Local variables
76 integer :: n
77 !! Number of elements in the input array
78 20 real(real32), dimension(:), allocatable :: u1, u2, z
79 !! Temporary arrays for the random numbers
80
81
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 32 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 32 times.
✓ Branch 4 taken 32 times.
✓ Branch 5 taken 20 times.
52 n = size(input)
82
21/42
✓ Branch 0 taken 20 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 20 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 20 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 20 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 20 times.
✓ Branch 17 taken 20 times.
✗ Branch 18 not taken.
✗ Branch 19 not taken.
✓ Branch 20 taken 20 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 20 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 20 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 20 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 20 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 20 times.
✓ Branch 34 taken 20 times.
✗ Branch 35 not taken.
✗ Branch 36 not taken.
✓ Branch 37 taken 20 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 20 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 20 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 20 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 20 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 20 times.
20 allocate(u1(n), u2(n), z(n))
83
84 20 call random_number(u1)
85 20 call random_number(u2)
86
8/14
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 20 times.
✓ Branch 15 taken 6968 times.
✓ Branch 16 taken 20 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 6968 times.
6988 where (u1 .lt. 1.E-7_real32)
87
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 20 times.
20 u1 = 1.E-7_real32
88 end where
89
90 ! Box-Muller transform for normal distribution
91
13/26
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 20 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 20 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 20 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 20 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 20 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 20 times.
✓ Branch 27 taken 20 times.
✗ Branch 28 not taken.
✓ Branch 29 taken 20 times.
✗ Branch 30 not taken.
✗ Branch 31 not taken.
✗ Branch 32 not taken.
✓ Branch 33 taken 6968 times.
✓ Branch 34 taken 20 times.
6988 z = sqrt(-2._real32 * log(u1)) * cos(2._real32 * pi * u2)
92
6/10
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 20 times.
✓ Branch 12 taken 6968 times.
✓ Branch 13 taken 20 times.
6988 z = this%mean + this%std * z
93
94 ! Assign according to rank
95 select rank(input)
96 rank(0)
97
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 input = z(1)
98 rank(1)
99
11/20
✗ Branch 0 not taken.
✓ Branch 1 taken 14 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 14 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 14 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 14 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 14 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 14 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 14 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 14 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 14 times.
✓ Branch 27 taken 6962 times.
✓ Branch 28 taken 14 times.
6976 input = z
100 rank(2)
101 input = reshape(z, shape(input))
102 rank(3)
103
4/6
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 6 times.
8 input = reshape(z, shape(input))
104 rank(4)
105 input = reshape(z, shape(input))
106 rank(5)
107 input = reshape(z, shape(input))
108 rank(6)
109
4/6
✓ Branch 0 taken 12 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 12 times.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✓ Branch 5 taken 12 times.
14 input = reshape(z, shape(input))
110 end select
111
112
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 20 times.
20 deallocate(u1, u2, z)
113
114
3/6
✗ Branch 0 not taken.
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 20 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 20 times.
20 end subroutine gaussian_initialise
115 !###############################################################################
116
117
13/18
✓ Branch 0 taken 18 times.
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 18 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 5 taken 18 times.
✓ Branch 6 taken 14 times.
✓ Branch 7 taken 4 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 4 times.
✓ Branch 10 taken 2 times.
✓ 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 taken 2 times.
✗ Branch 17 not taken.
20 end module athena__initialiser_gaussian
118