| 276 | } |
| 277 | |
| 278 | void PropertyStatBlock::update(double value, const Builder::TimeStamp& time) |
| 279 | { |
| 280 | const double prev_mean = mean_->value.double_prop(); |
| 281 | const double prev_var_x_sample_count = var_x_sample_count_->value.double_prop(); |
| 282 | |
| 283 | size_t next_median_buffer_index = static_cast<size_t>(sample_count_->value.ull_prop() % median_buffer_.size()); |
| 284 | |
| 285 | if (sample_count_->value.ull_prop() < median_buffer_.size()) { |
| 286 | median_sample_count_->value.ull_prop(median_sample_count_->value.ull_prop() + 1); |
| 287 | } |
| 288 | sample_count_->value.ull_prop(sample_count_->value.ull_prop() + 1); |
| 289 | |
| 290 | if (value < min_->value.double_prop()) { |
| 291 | min_->value.double_prop(value); |
| 292 | } |
| 293 | |
| 294 | if (max_->value.double_prop() < value) { |
| 295 | max_->value.double_prop(value); |
| 296 | } |
| 297 | |
| 298 | // sample_count should always be >= 1 by this point |
| 299 | OPENDDS_ASSERT(sample_count_->value.ull_prop() >= 1); |
| 300 | |
| 301 | if (sample_count_->value.ull_prop() == 1) { |
| 302 | mean_->value.double_prop(value); |
| 303 | // variance remains 0 until we have 2 samples, so don't touch var_x_sample_count_ here |
| 304 | } else { |
| 305 | // Incremental mean calculation (doesn't require storing all the data) |
| 306 | mean_->value.double_prop(prev_mean + ((value - prev_mean) / static_cast<double>(sample_count_->value.ull_prop()))); |
| 307 | // Incremental (variance * sample_count) calculation (doesn't require storing all the data, can be used to easily find variance / standard deviation) |
| 308 | var_x_sample_count_->value.double_prop(prev_var_x_sample_count + ((value - prev_mean) * (value - mean_->value.double_prop()))); |
| 309 | } |
| 310 | |
| 311 | median_buffer_[next_median_buffer_index] = value; |
| 312 | |
| 313 | if (timestamp_buffer_.size()) { |
| 314 | timestamp_buffer_[next_median_buffer_index] = time == Builder::ZERO ? Builder::get_sys_time() : time; |
| 315 | } |
| 316 | } |
| 317 | |
| 318 | void PropertyStatBlock::finalize() |
| 319 | { |
no test coverage detected