GCC Code Coverage Report


Directory: src/athena/
File: src/athena/athena_accuracy.f90
Date: 2026-04-15 16:08:59
Exec Total Coverage
Lines: 27 34 79.4%
Functions: 0 0 -%
Branches: 222 494 44.9%

Line Branch Exec Source
1 module athena__accuracy
2 !! Module containing functions to compute the accuracy of a model
3 use coreutils, only: real32
4 implicit none
5
6
7 private
8
9 public :: compute_accuracy_function
10 public :: categorical_score
11 public :: mae_score, mse_score, rmse_score
12 public :: r2_score
13
14
15 abstract interface
16 !! Interface for the accuracy function
17 pure function compute_accuracy_function(predicted, expected) result(output)
18 !! Compute the accuracy of a model
19 import real32
20 real(real32), dimension(:,:), intent(in) :: predicted, expected
21 !! Predicted and expected values
22 real(real32), dimension(size(expected,2)) :: output
23 !! Accuracy of the model
24 end function compute_accuracy_function
25 end interface
26
27 contains
28
29 !###############################################################################
30
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 categorical_score(predicted, expected) result(output)
31 !! Compute the categorical accuracy of a model
32 !!
33 !! This function is only valid for categorical/classification datasets
34 implicit none
35
36 !! Arguments
37 real(real32), dimension(:,:), intent(in) :: predicted, expected
38 !! Predicted and expected values
39
6/12
✗ 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.
2 real(real32), dimension(size(expected,2)) :: output
40 !! Categorical accuracy
41
42 ! Local variables
43 integer :: s
44 !! Loop index
45
46 !! Compute the accuracy
47
6/12
✗ 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.
2 do concurrent(s=1:size(expected,2))
48
30/52
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 6 times.
✗ Branch 8 not taken.
✓ Branch 9 taken 6 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 6 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 6 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 6 times.
✓ Branch 19 taken 6 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 6 times.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 24 not taken.
✓ Branch 25 taken 6 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 18 times.
✓ Branch 28 taken 6 times.
✓ Branch 29 taken 8 times.
✓ Branch 30 taken 10 times.
✗ Branch 31 not taken.
✓ Branch 32 taken 6 times.
✗ Branch 34 not taken.
✓ Branch 35 taken 6 times.
✗ Branch 37 not taken.
✓ Branch 38 taken 6 times.
✗ Branch 40 not taken.
✓ Branch 41 taken 6 times.
✗ Branch 43 not taken.
✓ Branch 44 taken 6 times.
✗ Branch 46 not taken.
✓ Branch 47 taken 6 times.
✓ Branch 48 taken 6 times.
✗ Branch 49 not taken.
✓ Branch 50 taken 6 times.
✗ Branch 51 not taken.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✓ Branch 54 taken 6 times.
✗ Branch 55 not taken.
✓ Branch 56 taken 18 times.
✓ Branch 57 taken 6 times.
✓ Branch 58 taken 12 times.
✓ Branch 59 taken 6 times.
✓ Branch 60 taken 4 times.
✓ Branch 61 taken 2 times.
44 if(maxloc(expected(:,s),dim=1).eq.maxloc(predicted(:,s),dim=1))then
49
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 4 times.
4 output(s) = 1._real32
50 else
51
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
2 output(s) = 0._real32
52 end if
53 end do
54
55
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 end function categorical_score
56 !###############################################################################
57
58
59 !###############################################################################
60
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 mae_score(predicted, expected) result(output)
61 !! Compute the mean absolute error of a model
62 !!
63 !! This function is only valid for continuous datasets
64 implicit none
65
66 ! Arguments
67 real(real32), dimension(:,:), intent(in) :: predicted, expected
68 !! Predicted and expected values
69
6/12
✗ 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.
2 real(real32), dimension(size(expected,2)) :: output
70 !! Mean absolute error
71
72 ! Compute the accuracy
73
28/52
✗ 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 taken 6 times.
✓ Branch 73 taken 2 times.
✓ Branch 74 taken 18 times.
✓ Branch 75 taken 6 times.
26 output = 1._real32 - sum(abs(expected - predicted),dim=1)/size(expected,1)
74
75
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 end function mae_score
76 !###############################################################################
77
78
79 !###############################################################################
80
3/6
✓ Branch 0 taken 1718 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1718 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1718 times.
✗ Branch 5 not taken.
1718 pure function mse_score(predicted, expected) result(output)
81 !! Compute the mean squared error of a model
82 !!
83 !! This function is only valid for continuous datasets
84 implicit none
85
86 ! Arguments
87 real(real32), dimension(:,:), intent(in) :: predicted, expected
88 !! Predicted and expected values
89
6/12
✗ Branch 0 not taken.
✓ Branch 1 taken 1718 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1718 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1718 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1718 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1718 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1718 times.
1718 real(real32), dimension(size(expected,2)) :: output
90 !! Mean squared error
91
92 ! Compute the accuracy
93 output = 1._real32 - &
94
28/52
✗ Branch 0 not taken.
✓ Branch 1 taken 1718 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 1718 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1718 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 1718 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 1718 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 1718 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 1718 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1718 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 1718 times.
✗ Branch 25 not taken.
✓ Branch 26 taken 1718 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 1718 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1718 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 1718 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 1718 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 1718 times.
✗ Branch 41 not taken.
✓ Branch 42 taken 1718 times.
✗ Branch 44 not taken.
✓ Branch 45 taken 1718 times.
✗ Branch 47 not taken.
✓ Branch 48 taken 1718 times.
✗ Branch 50 not taken.
✓ Branch 51 taken 1718 times.
✗ Branch 53 not taken.
✓ Branch 54 taken 1718 times.
✗ Branch 56 not taken.
✓ Branch 57 taken 1718 times.
✗ Branch 59 not taken.
✓ Branch 60 taken 1718 times.
✗ Branch 62 not taken.
✓ Branch 63 taken 1718 times.
✗ Branch 65 not taken.
✓ Branch 66 taken 1718 times.
✓ Branch 68 taken 1747 times.
✓ Branch 69 taken 1718 times.
✓ Branch 70 taken 3686 times.
✓ Branch 71 taken 1747 times.
7151 sum((expected - predicted)**2._real32,dim=1)/size(expected,1)
95
96
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1718 times.
1718 end function mse_score
97 !###############################################################################
98
99
100 !###############################################################################
101 pure function rmse_score(predicted, expected) result(output)
102 !! Compute the root mean squared error of a model
103 !!
104 !! This function is only valid for continuous datasets
105 implicit none
106
107 ! Arguments
108 real(real32), dimension(:,:), intent(in) :: predicted, expected
109 !! Predicted and expected values
110 real(real32), dimension(size(expected,2)) :: output
111 !! Root mean squared error
112
113 ! Compute the accuracy
114 output = 1._real32 - &
115 sqrt(sum((expected - predicted)**2._real32,dim=1)/size(expected,1))
116
117 end function rmse_score
118 !###############################################################################
119
120
121 !###############################################################################
122
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 r2_score(predicted, expected) result(output)
123 !! Compute the R^2 score of a model
124 !!
125 !! This function is only valid for continuous datasets
126 implicit none
127
128 ! Arguments
129 real(real32), dimension(:,:), intent(in) :: predicted, expected
130
18/36
✗ 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.
2 real(real32), dimension(size(expected,2)) :: y_mean, rss, tss
131
6/12
✗ 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.
2 real(real32), dimension(size(expected,2)) :: output
132
133 ! Local variables
134 real(real32), parameter :: epsilon = 1.E-8_real32
135 !! Small value to avoid division by zero
136 integer :: s
137 !! Loop index
138
139
8/14
✗ 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 taken 6 times.
✓ Branch 19 taken 2 times.
8 do s = 1, size(expected,2)
140 ! compute mean of true/expected
141
15/28
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✓ Branch 15 taken 18 times.
✓ Branch 16 taken 6 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 6 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 6 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 6 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 6 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 6 times.
✗ Branch 32 not taken.
✓ Branch 33 taken 6 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 6 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 6 times.
24 y_mean(s) = sum(expected(:,s),dim=1) / size(expected,dim=1)
142
143 ! compute total sum of squares
144
11/20
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✓ Branch 21 taken 18 times.
✓ Branch 22 taken 6 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 6 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 6 times.
24 tss(s) = sum( ( expected(:,s) - y_mean(s) ) ** 2._real32, dim=1 )
145
146 ! compute residual sum of squares
147
15/28
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 6 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 6 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 6 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 6 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 6 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 6 times.
✗ Branch 24 not taken.
✓ Branch 25 taken 6 times.
✗ Branch 27 not taken.
✓ Branch 28 taken 6 times.
✗ Branch 30 not taken.
✓ Branch 31 taken 6 times.
✓ Branch 33 taken 18 times.
✓ Branch 34 taken 6 times.
✗ Branch 35 not taken.
✓ Branch 36 taken 6 times.
✗ Branch 38 not taken.
✓ Branch 39 taken 6 times.
24 rss(s) = sum( ( expected(:,s) - predicted(:,s) ) ** 2._real32, dim=1 )
148
149 ! compute accuracy (R^2 score)
150
4/6
✗ Branch 0 not taken.
✓ Branch 1 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 6 times.
✓ Branch 6 taken 5 times.
✓ Branch 7 taken 1 times.
8 if(abs(rss(s)).lt.epsilon)then
151
2/4
✗ Branch 0 not taken.
✓ Branch 1 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 5 times.
5 output(s) = 1._real32
152
7/14
✗ 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.
1 elseif(abs(tss(s)).lt.epsilon.or.rss(s)/tss(s).gt.1._real32)then
153 output(s) = 0._real32
154 else
155
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 output(s) = 1._real32 - rss(s)/tss(s)
156 end if
157 end do
158
159
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 end function r2_score
160 !###############################################################################
161
162 end module athena__accuracy
163