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