| 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 |