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 |