← Documentation
ADS-IDAC Engine 5.0.0
Timer.cpp
Go to the documentation of this file.
1// Timer.cpp: implementation of the Timer class.
2//
4
5#include "Timer.h"
6#include <boost/serialization/export.hpp>
7#include <boost/archive/binary_oarchive.hpp>
8#include <boost/archive/binary_iarchive.hpp>
9BOOST_CLASS_EXPORT_IMPLEMENT(Timer)
10using namespace std;
11
13// Construction/Destruction
15
17 remaining_time = 0.0;
19 t_minimum = 1.0;
20 alpha_weibull = 5.0;
21 beta_weibull = 2.0;
24 time_at_demand = 0.0;
25}
26
28
29}
36void Timer::setBeta_Weibull(double x) { beta_weibull = x; }
38void Timer::setT_Minimum(double x) { t_minimum = x; }
39double Timer::getT_Minimum() { return t_minimum; }
41 remaining_time -= x;
42 return remaining_time;
43}
44void Timer::copyTimer(Timer &_timer) {
49 t_minimum = _timer.getT_Minimum();
53}
54void Timer::saveTimerToFile(ofstream &fout) {
55 fout << remaining_time << ' ' << total_time_required << ' '
56 << alpha_weibull << ' ' << beta_weibull << ' '
57 << t_minimum << '\n';
58}
59void Timer::retrieveTimerFromFile(ifstream &fin) {
62 >> t_minimum;
63}
65 bool matched = true;
66 if (fabs(remaining_time - _timer.getRemainingTime()) > 0.1) {
67 matched = false;
68 }
69 return false;
70}
74}
75
77 double cdf, t;
78 // pick a random number for cdf
79 cdf = static_cast<double>(rand()) / static_cast<double>(RAND_MAX);
80 // calculate time based on weibull distribution
81 t = alpha_weibull * pow(-log(1.0 - cdf), 1.0 / beta_weibull) + t_minimum;
82 return t;
83}
84
85double Timer::calculateRequiredTime(double _cdf) {
86 double t;
87 t = alpha_weibull * pow(-log(1.0 - _cdf), 1.0 / beta_weibull) + t_minimum;
88 return t;
89}
90
91double Timer::calculateWeibull_pdf(double _t) {
92 double pdf;
93 if (_t > t_minimum) {
94 pdf = (beta_weibull / alpha_weibull) * pow((_t - t_minimum) / alpha_weibull, beta_weibull - 1.0)
95 * exp(-pow((_t - t_minimum) / alpha_weibull, beta_weibull));
96 } else {
97 pdf = 0.0;
98 }
99 return pdf;
100}
101
102double Timer::calculateMeanRequiredTime(double _lower, double _upper) {
103 // calcalate mean time within cdf interval defined by _lower and _upper
104 double t_lower, t_upper, h, tmean, sum;
105 double t1, t2, s0, s1, s2;
106 s1 = 0.0;
107 s2 = 0.0;
108 sum = 0.0;
109 int m, j;
110 m = 500; // number of intervals
111 // cap upper bound if cdf value is close to 1.0
112 if (_upper > 0.999999) { _upper = 0.999999; }
113 //
114 t_lower = this->calculateRequiredTime(_lower);
115 t_upper = this->calculateRequiredTime(_upper);
116 h = (t_upper - t_lower) / (2 * (double) m);
117 s0 = this->calculateWeibull_pdf(t_lower) + this->calculateWeibull_pdf(t_upper);
118 for (j = 0; j != m - 1; j++) {
119 t1 = t_lower + (2.0 * j + 1.0) * h;
120 t2 = t_lower + 2 * h * (j + 1.0);
121 s1 += t1 * this->calculateWeibull_pdf(t1);
122 s2 += t2 * this->calculateWeibull_pdf(t2);
123 }
124 s1 += (t_lower + h * (2.0 * (m - 1.0) + 1)) * this->calculateWeibull_pdf(t_lower + h * (2.0 * (m - 1.0) + 1));
125 sum = h * (s0 + 4.0 * s1 + 2.0 * s2) / 3.0;
126 tmean = sum / (_upper - _lower);
127 //
128 return tmean;
129}
130
132 // calcalate mean time within cdf interval defined by _lower and _upper
133 double t_lower, t_upper, h, tmean, sum;
134 double t1, t2, s0, s1, s2;
135 s1 = 0.0;
136 s2 = 0.0;
137 sum = 0.0;
138 int m, j;
139 m = 500; // number of intervals
140 //
141 t_lower = this->calculateRequiredTime(0.0);
142 t_upper = this->calculateRequiredTime(0.999999);
143 h = (t_upper - t_lower) / (2 * (double) m);
144 s0 = this->calculateWeibull_pdf(t_lower) + this->calculateWeibull_pdf(t_upper);
145 for (j = 0; j != m - 1; j++) {
146 t1 = t_lower + (2.0 * j + 1.0) * h;
147 t2 = t_lower + 2 * h * (j + 1.0);
148 s1 += t1 * this->calculateWeibull_pdf(t1);
149 s2 += t2 * this->calculateWeibull_pdf(t2);
150 }
151 s1 += (t_lower + h * (2.0 * (m - 1.0) + 1)) * this->calculateWeibull_pdf(t_lower + h * (2.0 * (m - 1.0) + 1));
152 sum = h * (s0 + 4.0 * s1 + 2.0 * s2) / 3.0;
153 tmean = sum;
154 return tmean;
155}
157 return number_of_intervals;
158}
159void Timer::setNumberOfIntervals(int number_of_intervals) {
161}
164}
165void Timer::setNumberOfIntervalsPassed(int number_of_intervals_passed) {
167}
169 return time_at_demand;
170}
171void Timer::setTimeAtDemand(double time_at_demand) {
173}
Definition: Timer.h:17
virtual ~Timer()
Definition: Timer.cpp:27
void saveTimerToFile(std::ofstream &)
Definition: Timer.cpp:54
void setBothTotalTimeRequiredAndRemainingTime(double)
Definition: Timer.cpp:71
void retrieveTimerFromFile(std::ifstream &)
Definition: Timer.cpp:59
void setTimeAtDemand(double)
Definition: Timer.cpp:171
void setRemainingTime(double)
Definition: Timer.cpp:30
double time_at_demand
Definition: Timer.h:81
double getBeta_Weibull()
Definition: Timer.cpp:37
double remaining_time
Definition: Timer.h:77
Timer()
Definition: Timer.cpp:16
int getNumberOfIntervalsPassed() const
Definition: Timer.cpp:162
void copyTimer(Timer &)
Definition: Timer.cpp:44
double total_time_required
Definition: Timer.h:78
double calculateWeibull_pdf(double)
Definition: Timer.cpp:91
double alpha_weibull
Definition: Timer.h:75
double calculateRequiredTime()
Definition: Timer.cpp:76
double getTotalTimeRequired()
Definition: Timer.cpp:33
double getRemainingTime()
Definition: Timer.cpp:31
double getTimeAtDemand() const
Definition: Timer.cpp:168
void setT_Minimum(double)
Definition: Timer.cpp:38
void setNumberOfIntervalsPassed(int)
Definition: Timer.cpp:165
double calculateMeanRequiredTime()
Definition: Timer.cpp:131
void setBeta_Weibull(double)
Definition: Timer.cpp:36
double t_minimum
Definition: Timer.h:76
int number_of_intervals
Definition: Timer.h:79
double beta_weibull
Definition: Timer.h:74
void setAlpha_Weibull(double)
Definition: Timer.cpp:34
void setTotalTimeRequired(double)
Definition: Timer.cpp:32
int number_of_intervals_passed
Definition: Timer.h:80
double getT_Minimum()
Definition: Timer.cpp:39
double reduceRemainingTime(double)
Definition: Timer.cpp:40
int getNumberOfIntervals() const
Definition: Timer.cpp:156
bool checkIfIsIdenticalTimer(Timer &)
Definition: Timer.cpp:64
double getAlpha_Weibull()
Definition: Timer.cpp:35
void setNumberOfIntervals(int)
Definition: Timer.cpp:159
bool log
Enable/disable rank-specific logging.