GCC Code Coverage Report


Directory: src/lib/
File: src/lib/mod_metrics.f90
Date: 2024-06-28 12:51:18
Exec Total Coverage
Lines: 33 36 91.7%
Functions: 0 0 -%
Branches: 105 233 45.1%

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 a type for storing and handling metrics
6 !!! module includes the following derived types:
7 !!! - metric_dict_type - a type for storing and handling metric data
8 !!!##################
9 !!! the metric derived type contains the following procedures:
10 !!! - check - checks if the metric has converged
11 !!! - add_t_t - adds two metric_dict_type together
12 !!!##################
13 !!! module contains the following procedures:
14 !!! - metric_dict_alloc - allocates memory for a metric_dict_type
15 !!!#############################################################################
16 module metrics
17 use constants, only: real12
18 implicit none
19
20 type metric_dict_type
21 character(10) :: key
22 real(real12) :: val
23 logical :: active
24 real(real12) :: threshold
25 real(real12), allocatable, dimension(:) :: history
26 contains
27 procedure :: check => metric_dict_check
28 procedure :: add_t_t => metric_dict_add !t = type, r = real, i = int
29 generic :: operator(+) => add_t_t
30 end type metric_dict_type
31
32
33 private
34
35 public :: metric_dict_type
36 public :: metric_dict_alloc
37
38
39 contains
40
41 !!!#############################################################################
42 !!! custom operation for summing metric_dict_type
43 !!!#############################################################################
44 1 elemental function metric_dict_add(a, b) result(output)
45 implicit none
46 class(metric_dict_type), intent(in) :: a,b
47 type(metric_dict_type) :: output
48
49 1 output%key = a%key
50 1 output%val = a%val + b%val
51 1 output%threshold = a%threshold
52 1 output%active = a%active
53
10/20
✗ 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 14 not taken.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 1 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 5 times.
✓ Branch 23 taken 1 times.
6 if(allocated(a%history)) output%history = a%history
54
55
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
2 end function metric_dict_add
56 !!!#############################################################################
57
58
59 !!!#############################################################################
60 !!! custom operation for allocating metric_dict_type
61 !!!#############################################################################
62
16/24
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 4 times.
✓ Branch 9 taken 2 times.
✓ Branch 10 taken 2 times.
✓ Branch 11 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 taken 4 times.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 4 times.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 26 taken 4 times.
10 subroutine metric_dict_alloc(input, source, length)
63 implicit none
64 type(metric_dict_type), dimension(:), intent(out) :: input
65 type(metric_dict_type), dimension(:), optional, intent(in) :: source
66 integer, optional, intent(in) :: length
67 integer :: i
68
69
2/2
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
2 if(present(length))then
70
5/8
✗ 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 taken 2 times.
✓ Branch 10 taken 1 times.
3 do i=1,size(input,dim=1)
71
9/18
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 2 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
3 allocate(input(i)%history(length))
72 end do
73 else
74
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if(present(source))then
75
5/8
✗ 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 taken 2 times.
✓ Branch 10 taken 1 times.
3 do i=1,size(input,dim=1)
76
4/8
✗ 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.
2 input(i)%key = source(i)%key
77
11/22
✗ 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 taken 2 times.
✗ Branch 13 not taken.
✗ Branch 14 not taken.
✓ Branch 15 taken 2 times.
✗ Branch 16 not taken.
✓ Branch 17 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 19 taken 2 times.
✗ Branch 20 not taken.
✓ Branch 21 taken 2 times.
✗ Branch 23 not taken.
✓ Branch 24 taken 2 times.
✗ Branch 26 not taken.
✓ Branch 27 taken 2 times.
2 allocate(input(i)%history(size(source(i)%history,dim=1)))
78
4/8
✗ 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.
3 input(i)%threshold = source(i)%threshold
79 end do
80 else
81 write(0,*) &
82 "ERROR: metric_dict_alloc requires either a source or length"
83 stop 1
84 end if
85 end if
86
87 2 end subroutine metric_dict_alloc
88 !!!#############################################################################
89
90
91 !!!#############################################################################
92 !!! custom operation for checking metric convergence
93 !!!#############################################################################
94 1001 subroutine metric_dict_check(this,plateau_threshold,converged)
95 implicit none
96 class(metric_dict_type), intent(inout) :: this
97 real(real12), intent(in) :: plateau_threshold
98 integer, intent(out) :: converged
99
100 1001 converged = 0
101
2/2
✓ Branch 0 taken 502 times.
✓ Branch 1 taken 499 times.
1001 if(this%active)then
102
7/12
✗ Branch 1 not taken.
✓ Branch 2 taken 502 times.
✓ Branch 3 taken 250010 times.
✓ Branch 4 taken 502 times.
✓ Branch 5 taken 502 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 502 times.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✓ Branch 11 taken 250010 times.
✓ Branch 12 taken 502 times.
500522 this%history = eoshift(this%history, shift=-1, dim=1, boundary=this%val)
103 if(&
104 (trim(this%key).eq."loss".and.&
105 2008 abs(sum(this%history))/size(this%history,dim=1).lt.&
106
12/18
✗ Branch 1 not taken.
✓ Branch 2 taken 502 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 502 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 502 times.
✗ Branch 10 not taken.
✓ Branch 11 taken 502 times.
✓ Branch 13 taken 250010 times.
✓ Branch 14 taken 502 times.
✓ Branch 16 taken 250010 times.
✓ Branch 17 taken 502 times.
✓ Branch 18 taken 502 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 502 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 2 times.
✓ Branch 23 taken 500 times.
501024 this%threshold).or.&
107 (trim(this%key).eq."accuracy".and.&
108
4/8
✗ Branch 0 not taken.
✓ Branch 1 taken 502 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 502 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 502 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 502 times.
502 abs(sum(1._real12-this%history))/size(this%history,dim=1).lt.&
109 this%threshold) )then
110 write(6,*) &
111
1/2
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
2 "Convergence achieved, "//trim(this%key)//" threshold reached"
112 2 write(6,*) "Exiting training loop"
113 2 converged = 1
114
10/14
✗ Branch 0 not taken.
✓ Branch 1 taken 500 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 500 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 500 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 500 times.
✓ Branch 12 taken 90639 times.
✓ Branch 13 taken 1 times.
✓ Branch 14 taken 499 times.
✓ Branch 15 taken 90140 times.
✓ Branch 16 taken 1 times.
✓ Branch 17 taken 499 times.
90640 elseif(all(abs(this%history-this%val).lt.plateau_threshold))then
115 write(0,'("ERROR: ",A," has remained constant for ",I0," runs")') &
116
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 trim(this%key), size(this%history,dim=1)
117 1 write(0,*) this%history
118 1 write(0,*) "Exiting..."
119 1 converged = -1
120 end if
121 end if
122
123 1001 end subroutine metric_dict_check
124 !!!#############################################################################
125
126 end module metrics
127