#pragma once
#include <cmath>
#include <cstdint>
enum class Evidence { Incomplete, Review, Observed };
inline Evidence streamEvidence(bool initialized, uint32_t elapsed, uint32_t minimum,
                               uint32_t anomalies, const uint32_t counts[3],
                               float lowHz, float highHz) {
  if (!initialized) return Evidence::Incomplete;
  if (anomalies) return Evidence::Review;
  if (elapsed < minimum) return Evidence::Incomplete;
  for (int i = 0; i < 3; ++i) {
    const float hz = elapsed ? counts[i] * 1000.0f / elapsed : 0;
    if (hz < lowHz || hz > highHz) return Evidence::Review;
  }
  return Evidence::Observed;
}
inline Evidence overallEvidence(Evidence stream, bool stillDone, bool stillOK,
                                const bool motionDone[3], const bool motionOK[3]) {
  if (stream == Evidence::Review || (stillDone && !stillOK)) return Evidence::Review;
  for (int i = 0; i < 3; ++i)
    if (motionDone[i] && !motionOK[i]) return Evidence::Review;
  if (stream != Evidence::Observed || !stillDone) return Evidence::Incomplete;
  for (int i = 0; i < 3; ++i) if (!motionDone[i]) return Evidence::Incomplete;
  return Evidence::Observed;
}
inline bool finiteVector(const float *v, int n, float limit) {
  for (int i = 0; i < n; ++i)
    if (!std::isfinite(v[i]) || std::fabs(v[i]) > limit) return false;
  return true;
}
