herald  2.0.0
risk.h
1 // Copyright 2021 Herald Project Contributors
2 // SPDX-License-Identifier: Apache-2.0
3 //
4 
5 #ifndef HERALD_RISK_H
6 #define HERALD_RISK_H
7 
8 #include <cmath>
9 
10 #include "aggregates.h"
11 #include "ranges.h"
12 #include "sampling.h"
13 
14 namespace herald {
15 namespace analysis {
16 namespace algorithms {
17 namespace risk {
18 
19 using namespace herald::analysis::aggregates;
20 
25  static constexpr int runs = 1;
26 
27  RiskAggregationBasic(double timeScale,double distanceScale,double minimumDistanceClamp,double minimumRiskScoreAtClamp,double logScale = 3.3598856662 )
28  : run(1), timeScale(timeScale), distanceScale(distanceScale), minimumDistanceClamp(minimumDistanceClamp),
29  minimumRiskScoreAtClamp(minimumRiskScoreAtClamp), logScale(logScale), nMinusOne(-1.0), n(-1.0), timeMinusOne(0), time(0), riskScore(0)
30  {
31  ; // no other set up
32  }
33  ~RiskAggregationBasic() = default;
34 
35  void beginRun(int thisRun) { // 1 indexed
36  run = thisRun;
37  if (1 == run) {
38  // clear run temporaries
39  nMinusOne = -1.0;
40  n = -1.0;
41  timeMinusOne = 0;
42  time = 0;
43  }
44  }
45 
46  template <typename SampleT>
47  void map(const herald::analysis::sampling::Sample<SampleT>& value) {
48  nMinusOne = n;
49  timeMinusOne = time;
50  n = value.value;
51  time = value.taken.secondsSinceUnixEpoch();
52  }
53 
54  double reduce() {
55  if (-1.0 != nMinusOne) {
56  // we have two values with which to calculate
57  // using nMinusOne and n, and calculate interim risk score addition
58  double dist = distanceScale * n;
59  double t = timeScale * (time - timeMinusOne); // seconds
60 
61  double riskSlice = minimumRiskScoreAtClamp; // assume < clamp distance
62  if (dist > minimumDistanceClamp) {
63  // otherwise, do the inverse log of distance to get the risk score
64 
65  // don't forget to clamp at risk score
66  riskSlice = minimumRiskScoreAtClamp - (logScale * std::log10(dist));
67  if (riskSlice > minimumRiskScoreAtClamp) {
68  // possible as the passed in logScale could be a negative
69  riskSlice = minimumRiskScoreAtClamp;
70  }
71  if (riskSlice < 0.0) {
72  riskSlice = 0.0; // cannot have a negative slice
73  }
74  }
75  riskSlice *= t;
76 
77  // add it to the risk score
78  riskScore += riskSlice;
79  }
80 
81  // return current full risk score
82  return riskScore;
83  }
84 
85  void reset() {
86  run = 1;
87  riskScore = 0.0;
88  nMinusOne = -1.0;
89  n = -1.0;
90  }
91 
92 private:
93  int run;
94 
95  double timeScale;
96  double distanceScale;
97  double minimumDistanceClamp;
98  double minimumRiskScoreAtClamp;
99  double logScale;
100 
101  double nMinusOne; // distance of n-1
102  double n; // distance of n
103  long timeMinusOne; // time of n-1
104  long time; // time of n
105 
106  double riskScore;
107 };
108 
109 }
110 }
111 }
112 }
113 
114 #endif
Acts as a non-global memory arena for arbitrary classes.
Definition: aggregates.h:15
The Sample taken from an object with ID of type SampledID.
Definition: sampling.h:28