GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_loss.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 47 47 100.0%
Functions: 0 0 -%
Branches: 480 916 52.4%

Line Branch Exec Source
1 !!#############################################################################
2 !!! Code written by Ned Thaddeus Taylor
3 !!! Code part of the ATHENA library - a feedforward neural network library
4 !!!#############################################################################
5 !!! module contains the loss functions and their derivatives
6 !!! module includes the following procedures:
7 !!! - compute_loss_function - abstract interface for all loss functions
8 !!! - total_loss_function - abstract interface for all total loss functions
9 !!! - compute_loss_derivative - computes the derivative of the loss function
10 !!!#############################################################################
11 module loss
12 use constants, only: real12
13 implicit none
14
15 abstract interface
16 !! compute the loss function
17 !! predicted = (R, in) predicted values
18 !! expected = (R, in) expected values
19 !! output = (R, in) loss function
20 pure function compute_loss_function(predicted, expected) result(output)
21 import real12
22 real(real12), dimension(:,:), intent(in) :: predicted, expected
23 real(real12), dimension(size(predicted,1),size(predicted,2)) :: output
24 end function compute_loss_function
25 end interface
26
27 abstract interface
28 !! compute the total loss function
29 !! predicted = (R, in) predicted values
30 !! expected = (R, in) expected values
31 !! output = (R, in) loss function
32 pure function total_loss_function(predicted, expected) result(output)
33 import real12
34 real(real12), dimension(:,:), intent(in) :: predicted, expected
35 real(real12), dimension(size(predicted,2)) :: output
36 end function total_loss_function
37 end interface
38
39 private
40
41 public :: compute_loss_derivative
42
43 public :: compute_loss_function
44 public :: compute_loss_bce
45 public :: compute_loss_cce
46 public :: compute_loss_mae
47 public :: compute_loss_mse
48 public :: compute_loss_nll
49
50 public :: total_loss_function
51 public :: total_loss_bce
52 public :: total_loss_cce
53 public :: total_loss_mae
54 public :: total_loss_mse
55 public :: total_loss_nll
56
57
58 contains
59
60 !!!#############################################################################
61 !!! compute loss derivative
62 !!! for all cross entropy (and MSE and NLL) loss functions, the derivative ...
63 !!! ... of the loss function is
64 !!!#############################################################################
65
3/6
✓ Branch 0 taken 510 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 510 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 510 times.
✗ Branch 5 not taken.
510 pure function compute_loss_derivative(predicted, expected) result(output)
66 implicit none
67 real(real12), dimension(:,:), intent(in) :: predicted, expected
68
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 510 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 510 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 510 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 510 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 510 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 510 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 510 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 510 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 510 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 510 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 510 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 510 times.
1020 real(real12), dimension(size(predicted,1),size(predicted,2)) :: output
69
70
26/48
✗ Branch 0 not taken.
✓ Branch 1 taken 510 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 510 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 510 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 510 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 510 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 510 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 510 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 510 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 510 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 510 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 510 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 510 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 510 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 510 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 510 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 510 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 510 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 510 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 510 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 510 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 510 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 510 times.
✓ Branch 66 taken 510 times.
✓ Branch 67 taken 510 times.
✓ Branch 68 taken 1296 times.
✓ Branch 69 taken 510 times.
2316 output = predicted - expected
71
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 510 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 510 times.
1020 end function compute_loss_derivative
72 !!!#############################################################################
73
74 !!!#############################################################################
75 !!! compute losses
76 !!! method: Binary cross entropy
77 !!!#############################################################################
78
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 pure function compute_loss_bce(predicted, expected) result(output)
79 implicit none
80 real(real12), dimension(:,:), intent(in) :: predicted, expected
81
12/24
✗ 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.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
4 real(real12), dimension(size(predicted,1),size(predicted,2)) :: output
82 real(real12) :: epsilon
83
84 2 epsilon = 1.E-10_real12
85
26/48
✗ 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.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 2 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 2 times.
✓ Branch 66 taken 6 times.
✓ Branch 67 taken 2 times.
✓ Branch 68 taken 18 times.
✓ Branch 69 taken 6 times.
26 output = -expected*log(predicted+epsilon)
86
87
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
4 end function compute_loss_bce
88 !!!-----------------------------------------------------------------------------
89 !!!-----------------------------------------------------------------------------
90
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 pure function total_loss_bce(predicted, expected) result(output)
91 implicit none
92 real(real12), dimension(:,:), intent(in) :: predicted, expected
93
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 real(real12), dimension(size(predicted,2)) :: output
94
95
32/60
✗ 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.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 times.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✓ Branch 72 taken 3 times.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 9 times.
✓ Branch 75 taken 3 times.
13 output = sum(compute_loss_bce(predicted,expected),dim=1)
96
97
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 end function total_loss_bce
98 !!!#############################################################################
99
100
101 !!!#############################################################################
102 !!! compute
103 !!! method: categorical cross entropy
104 !!!#############################################################################
105
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 pure function compute_loss_cce(predicted, expected) result(output)
106 implicit none
107 real(real12), dimension(:,:), intent(in) :: predicted, expected
108
12/24
✗ 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.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
4 real(real12), dimension(size(predicted,1),size(predicted,2)) :: output
109 real(real12) :: epsilon
110
111 2 epsilon = 1.E-10_real12
112
26/48
✗ 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.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 2 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 2 times.
✓ Branch 66 taken 6 times.
✓ Branch 67 taken 2 times.
✓ Branch 68 taken 18 times.
✓ Branch 69 taken 6 times.
26 output = -expected * log(predicted + epsilon)
113
114
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
4 end function compute_loss_cce
115 !!!-----------------------------------------------------------------------------
116 !!!-----------------------------------------------------------------------------
117
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 pure function total_loss_cce(predicted, expected) result(output)
118 implicit none
119 real(real12), dimension(:,:), intent(in) :: predicted, expected
120
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 real(real12), dimension(size(predicted,2)) :: output
121
122
32/60
✗ 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.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 times.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✓ Branch 72 taken 3 times.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 9 times.
✓ Branch 75 taken 3 times.
13 output = sum(compute_loss_cce(predicted,expected),dim=1)
123
124
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 end function total_loss_cce
125 !!!#############################################################################
126
127
128 !!!#############################################################################
129 !!! compute losses
130 !!! method: mean absolute error
131 !!!#############################################################################
132
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 pure function compute_loss_mae(predicted, expected) result(output)
133 implicit none
134 real(real12), dimension(:,:), intent(in) :: predicted, expected
135
12/24
✗ 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.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
4 real(real12), dimension(size(predicted,1),size(predicted,2)) :: output
136
137
32/60
✗ 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.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 2 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 2 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 2 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 2 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 2 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 2 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 2 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 2 times.
✓ Branch 84 taken 6 times.
✓ Branch 85 taken 2 times.
✓ Branch 86 taken 18 times.
✓ Branch 87 taken 6 times.
26 output = abs(predicted - expected) /(size(predicted,1))
138
139
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
4 end function compute_loss_mae
140 !!!-----------------------------------------------------------------------------
141 !!!-----------------------------------------------------------------------------
142
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 pure function total_loss_mae(predicted, expected) result(output)
143 implicit none
144 real(real12), dimension(:,:), intent(in) :: predicted, expected
145
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 real(real12), dimension(size(predicted,2)) :: output
146
147
32/60
✗ 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.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 times.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✓ Branch 72 taken 3 times.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 9 times.
✓ Branch 75 taken 3 times.
13 output = sum(compute_loss_mae(predicted,expected),dim=1)
148
149
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 end function total_loss_mae
150 !!!#############################################################################
151
152
153 !!!#############################################################################
154 !!! compute losses
155 !!! method: mean squared error
156 !!!#############################################################################
157
3/6
✓ Branch 0 taken 503 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 503 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 503 times.
✗ Branch 5 not taken.
503 pure function compute_loss_mse(predicted, expected) result(output)
158 implicit none
159 real(real12), dimension(:,:), intent(in) :: predicted, expected
160
12/24
✗ Branch 0 not taken.
✓ Branch 1 taken 503 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 503 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 503 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 503 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 503 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 503 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 503 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 503 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 503 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 503 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 503 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 503 times.
1006 real(real12), dimension(size(predicted,1),size(predicted,2)) :: output
161
162
32/60
✗ Branch 0 not taken.
✓ Branch 1 taken 503 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 503 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 503 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 503 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 503 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 503 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 503 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 503 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 503 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 503 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 503 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 503 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 503 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 503 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 503 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 503 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 503 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 503 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 503 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 503 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 503 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 503 times.
✗ Branch 66 not taken.
✓ Branch 67 taken 503 times.
✗ Branch 69 not taken.
✓ Branch 70 taken 503 times.
✗ Branch 72 not taken.
✓ Branch 73 taken 503 times.
✗ Branch 75 not taken.
✓ Branch 76 taken 503 times.
✗ Branch 78 not taken.
✓ Branch 79 taken 503 times.
✗ Branch 81 not taken.
✓ Branch 82 taken 503 times.
✓ Branch 84 taken 507 times.
✓ Branch 85 taken 503 times.
✓ Branch 86 taken 1020 times.
✓ Branch 87 taken 507 times.
2030 output = ((predicted - expected)**2._real12) /(2._real12*size(predicted,1))
163
164
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 503 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 503 times.
1006 end function compute_loss_mse
165 !!!-----------------------------------------------------------------------------
166 !!!-----------------------------------------------------------------------------
167
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 pure function total_loss_mse(predicted, expected) result(output)
168 implicit none
169 real(real12), dimension(:,:), intent(in) :: predicted, expected
170
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 real(real12), dimension(size(predicted,2)) :: output
171
172
32/60
✗ 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.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 times.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✓ Branch 72 taken 3 times.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 9 times.
✓ Branch 75 taken 3 times.
13 output = sum(compute_loss_mse(predicted,expected),dim=1)
173
174
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 end function total_loss_mse
175 !!!#############################################################################
176
177
178 !!!#############################################################################
179 !!! compute losses
180 !!! method: negative log likelihood
181 !!!#############################################################################
182
3/6
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
2 pure function compute_loss_nll(predicted, expected) result(output)
183 implicit none
184 real(real12), dimension(:,:), intent(in) :: predicted, expected
185
12/24
✗ 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.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
4 real(real12), dimension(size(predicted,1),size(predicted,2)) :: output
186 real(real12) :: epsilon
187
188 2 epsilon = 1.E-10_real12
189
26/48
✗ 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.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 2 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 2 times.
✗ Branch 33 not taken.
✓ Branch 34 taken 2 times.
✗ Branch 36 not taken.
✓ Branch 37 taken 2 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 2 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 2 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 2 times.
✗ Branch 48 not taken.
✓ Branch 49 taken 2 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 2 times.
✗ Branch 54 not taken.
✓ Branch 55 taken 2 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 2 times.
✗ Branch 60 not taken.
✓ Branch 61 taken 2 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 2 times.
✓ Branch 66 taken 6 times.
✓ Branch 67 taken 2 times.
✓ Branch 68 taken 18 times.
✓ Branch 69 taken 6 times.
26 output = - log(expected - predicted + epsilon)
190
191
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
4 end function compute_loss_nll
192 !!!-----------------------------------------------------------------------------
193 !!!-----------------------------------------------------------------------------
194
3/6
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 pure function total_loss_nll(predicted, expected) result(output)
195 implicit none
196 real(real12), dimension(:,:), intent(in) :: predicted, expected
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 real(real12), dimension(size(predicted,2)) :: output
198
199
32/60
✗ 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.
✗ Branch 36 not taken.
✓ Branch 37 taken 1 times.
✗ Branch 39 not taken.
✓ Branch 40 taken 1 times.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 times.
✗ Branch 45 not taken.
✓ Branch 46 taken 1 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 1 times.
✗ Branch 51 not taken.
✓ Branch 52 taken 1 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 1 times.
✗ Branch 57 not taken.
✓ Branch 58 taken 1 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1 times.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 times.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1 times.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 times.
✓ Branch 69 taken 1 times.
✗ Branch 70 not taken.
✓ Branch 72 taken 3 times.
✓ Branch 73 taken 1 times.
✓ Branch 74 taken 9 times.
✓ Branch 75 taken 3 times.
13 output = sum(compute_loss_nll(predicted,expected),dim=1)
200
201
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 end function total_loss_nll
202 !!!#############################################################################
203
204 end module loss
205