static Averages EvalAvQ(EvalContext *ctx, char *t) { Averages *lastweek_vals, newvals; double last5_vals[CF_OBSERVABLES]; double This[CF_OBSERVABLES]; char name[CF_MAXVARSIZE]; time_t now = time(NULL); int i; Banner("Evaluating and storing new weekly averages"); if ((lastweek_vals = GetCurrentAverages(t)) == NULL) { Log(LOG_LEVEL_ERR, "Error reading average database"); exit(1); } /* Discard any apparently anomalous behaviour before renormalizing database */ for (i = 0; i < CF_OBSERVABLES; i++) { double delta2; char desc[CF_BUFSIZE]; name[0] = '\0'; GetObservable(i, name, desc); /* Overflow protection */ if (lastweek_vals->Q[i].expect < 0) { lastweek_vals->Q[i].expect = 0; } if (lastweek_vals->Q[i].q < 0) { lastweek_vals->Q[i].q = 0; } if (lastweek_vals->Q[i].var < 0) { lastweek_vals->Q[i].var = 0; } // lastweek_vals is last week's stored data This[i] = RejectAnomaly(CF_THIS[i], lastweek_vals->Q[i].expect, lastweek_vals->Q[i].var, LOCALAV.Q[i].expect, LOCALAV.Q[i].var); newvals.Q[i].q = This[i]; newvals.last_seen = now; // Record the freshness of this slot LOCALAV.Q[i].q = This[i]; Log(LOG_LEVEL_DEBUG, "Previous week's '%s.q' %lf", name, lastweek_vals->Q[i].q); Log(LOG_LEVEL_DEBUG, "Previous week's '%s.var' %lf", name, lastweek_vals->Q[i].var); Log(LOG_LEVEL_DEBUG, "Previous week's '%s.ex' %lf", name, lastweek_vals->Q[i].expect); Log(LOG_LEVEL_DEBUG, "Just measured: CF_THIS[%s] = %lf", name, CF_THIS[i]); Log(LOG_LEVEL_DEBUG, "Just sanitized: This[%s] = %lf", name, This[i]); newvals.Q[i].expect = WAverage(This[i], lastweek_vals->Q[i].expect, WAGE); LOCALAV.Q[i].expect = WAverage(newvals.Q[i].expect, LOCALAV.Q[i].expect, ITER); if (last5_vals[i] > 0) { newvals.Q[i].dq = newvals.Q[i].q - last5_vals[i]; LOCALAV.Q[i].dq = newvals.Q[i].q - last5_vals[i]; } else { newvals.Q[i].dq = 0; LOCALAV.Q[i].dq = 0; } // Save the last measured value as the value "from five minutes ago" to get the gradient last5_vals[i] = newvals.Q[i].q; delta2 = (This[i] - lastweek_vals->Q[i].expect) * (This[i] - lastweek_vals->Q[i].expect); if (lastweek_vals->Q[i].var > delta2 * 2.0) { /* Clean up past anomalies */ newvals.Q[i].var = delta2; LOCALAV.Q[i].var = WAverage(newvals.Q[i].var, LOCALAV.Q[i].var, ITER); } else { newvals.Q[i].var = WAverage(delta2, lastweek_vals->Q[i].var, WAGE); LOCALAV.Q[i].var = WAverage(newvals.Q[i].var, LOCALAV.Q[i].var, ITER); } Log(LOG_LEVEL_VERBOSE, "[%d] %s q=%lf, var=%lf, ex=%lf", i, name, newvals.Q[i].q, newvals.Q[i].var, newvals.Q[i].expect); Log(LOG_LEVEL_VERBOSE, "[%d] = %lf -> (%lf#%lf) local [%lf#%lf]", i, This[i], newvals.Q[i].expect, sqrt(newvals.Q[i].var), LOCALAV.Q[i].expect, sqrt(LOCALAV.Q[i].var)); if (This[i] > 0) { Log(LOG_LEVEL_VERBOSE, "Storing %.2lf in %s", This[i], name); } } UpdateAverages(ctx, t, newvals); UpdateDistributions(ctx, t, lastweek_vals); /* Distribution about mean */ return newvals; }
static Averages EvalAvQ(char *t) { Averages *currentvals, newvals; double This[CF_OBSERVABLES]; char name[CF_MAXVARSIZE]; int i; Banner("Evaluating and storing new weekly averages"); if ((currentvals = GetCurrentAverages(t)) == NULL) { CfOut(cf_error, "", "Error reading average database"); exit(1); } /* Discard any apparently anomalous behaviour before renormalizing database */ for (i = 0; i < CF_OBSERVABLES; i++) { double delta2; char desc[CF_BUFSIZE]; name[0] = '\0'; GetObservable(i, name, desc); /* Overflow protection */ if (currentvals->Q[i].expect < 0) { currentvals->Q[i].expect = 0; } if (currentvals->Q[i].q < 0) { currentvals->Q[i].q = 0; } if (currentvals->Q[i].var < 0) { currentvals->Q[i].var = 0; } This[i] = RejectAnomaly(CF_THIS[i], currentvals->Q[i].expect, currentvals->Q[i].var, LOCALAV.Q[i].expect, LOCALAV.Q[i].var); newvals.Q[i].q = This[i]; LOCALAV.Q[i].q = This[i]; CfDebug("Current %s.q %lf\n", name, currentvals->Q[i].q); CfDebug("Current %s.var %lf\n", name, currentvals->Q[i].var); CfDebug("Current %s.ex %lf\n", name, currentvals->Q[i].expect); CfDebug("CF_THIS[%s] = %lf\n", name, CF_THIS[i]); CfDebug("This[%s] = %lf\n", name, This[i]); newvals.Q[i].expect = WAverage(This[i], currentvals->Q[i].expect, WAGE); LOCALAV.Q[i].expect = WAverage(newvals.Q[i].expect, LOCALAV.Q[i].expect, ITER); newvals.Q[i].dq = newvals.Q[i].q - currentvals->Q[i].q; LOCALAV.Q[i].dq = newvals.Q[i].q - currentvals->Q[i].q; delta2 = (This[i] - currentvals->Q[i].expect) * (This[i] - currentvals->Q[i].expect); if (currentvals->Q[i].var > delta2 * 2.0) { /* Clean up past anomalies */ newvals.Q[i].var = delta2; LOCALAV.Q[i].var = WAverage(newvals.Q[i].var, LOCALAV.Q[i].var, ITER); } else { newvals.Q[i].var = WAverage(delta2, currentvals->Q[i].var, WAGE); LOCALAV.Q[i].var = WAverage(newvals.Q[i].var, LOCALAV.Q[i].var, ITER); } CfOut(cf_verbose, "", "[%d] %s q=%lf, var=%lf, ex=%lf", i, name, newvals.Q[i].q, newvals.Q[i].var, newvals.Q[i].expect); CfOut(cf_verbose, "", "[%d] = %lf -> (%lf#%lf) local [%lf#%lf]\n", i, This[i], newvals.Q[i].expect, sqrt(newvals.Q[i].var), LOCALAV.Q[i].expect, sqrt(LOCALAV.Q[i].var)); if (This[i] > 0) { CfOut(cf_verbose, "", "Storing %.2lf in %s\n", This[i], name); } } UpdateAverages(t, newvals); UpdateDistributions(t, currentvals); /* Distribution about mean */ return newvals; }