Maestro 0.3.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
SimpleLinearRegression.h
Go to the documentation of this file.
1
11
12#pragma once
13
14#ifndef __SIMPLE_LINEAR_REGRESSION_H__
15#define __SIMPLE_LINEAR_REGRESSION_H__
16
17#include <vector>
18
19namespace Utils
20{
21
22// WARNING: it doesn't let it go lower than the minimum value, if the prediction is lower, the min value is returned!
23// set "TrueLinearRegression" to true if you want to use the real linear regression
24template <typename T1 = size_t, typename T2 = double> class SimpleLinearRegression
25{
26 public:
27 void SetSamples(const std::vector<T1> &x, const std::vector<T2> &y)
28 {
29 assert(x.size() == y.size());
30 assert(!x.empty());
31
32 if (x.empty() || y.empty())
33 return;
34
35 T2 sumX = 0;
36 T2 sumY = 0;
37 T2 sumXY = 0;
38 T2 sumX2 = 0;
39
40 const size_t cnt = std::min(x.size(), y.size());
41 for (size_t i = 0; i < cnt; ++i)
42 {
43 sumX += x[i];
44 sumY += y[i];
45 sumXY += x[i] * y[i];
46 sumX2 += x[i] * x[i];
47 }
48
49 W = (cnt * sumXY - sumX * sumY) / (cnt * sumX2 - sumX * sumX);
50 b = (sumY - W * sumX) / cnt;
51 }
52
53 void SetSamplesSingleRegressor(const std::vector<T1> &x, const std::vector<T2> &y)
54 {
55 assert(x.size() == y.size());
56
57 b = 0;
58
59 T2 sumXY = 0;
60 T2 sumX2 = 0;
61
62 const size_t cnt = std::min(x.size(), y.size());
63 for (size_t i = 0; i < cnt; ++i)
64 {
65 sumXY += x[i] * y[i];
66 sumX2 += x[i] * x[i];
67 }
68
69 W = sumXY / sumX2;
70 }
71
72 T2 Predict(T1 x) const
73 {
74 const auto val = W * x + b;
75
76 if (trueLinearRegression)
77 return val;
78
79 const auto m = 1E-12;
80 if (val < m)
81 return m;
82
83 return val;
84 }
85
87 {
88 trueLinearRegression = reg;
89 }
90
91 T2 GetW() const
92 {
93 return W;
94 }
95
96 T2 GetB() const
97 {
98 return b;
99 }
100
101 private:
102 T2 W = 0;
103 T2 b = 0;
104
105 bool trueLinearRegression = false;
106};
107
108} // namespace Utils
109
110#endif // __SIMPLE_LINEAR_REGRESSION_H__
void SetSamples(const std::vector< T1 > &x, const std::vector< T2 > &y)
void SetSamplesSingleRegressor(const std::vector< T1 > &x, const std::vector< T2 > &y)
Portable dense contraction kernels.