Browse Source

upper/lower bound in anomaly hsr

pull/25/head
Alexey Velikiy 3 years ago
parent
commit
ee893d223c
  1. 21
      client/src/components/Graph.vue
  2. 2
      client/src/components/pods/hastic_pod.ts
  3. 6
      client/src/services/analytics.service.ts
  4. 2
      client/src/views/Home.vue
  5. 6
      server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs
  6. 3
      server/src/services/analytic_service/types.rs

21
client/src/components/Graph.vue

@ -21,7 +21,7 @@ import _ from "lodash";
import { AnalyticUnitType } from '@/types/analytic_units'; import { AnalyticUnitType } from '@/types/analytic_units';
import { defineComponent, watch } from 'vue'; import { defineComponent, watch } from 'vue';
import { getHSR } from "@/services/analytics.service"; import { getHSRAnomaly } from "@/services/analytics.service";
// TODO: move to store // TODO: move to store
async function resolveDataPatterns(range: TimeRange): Promise<{ async function resolveDataPatterns(range: TimeRange): Promise<{
@ -86,6 +86,7 @@ async function resolveDataThreshold(range: TimeRange): Promise<{
// TODO: remove code repetition // TODO: remove code repetition
async function resolveDataAnomaly(range: TimeRange): Promise<{ async function resolveDataAnomaly(range: TimeRange): Promise<{
timeserie: LineTimeSerie[], timeserie: LineTimeSerie[],
segments: Segment[] segments: Segment[]
}> { }> {
@ -98,11 +99,25 @@ async function resolveDataAnomaly(range: TimeRange): Promise<{
// TODO: request in parallel // TODO: request in parallel
let [target, values] = await getMetrics(startTime, endTime, step); let [target, values] = await getMetrics(startTime, endTime, step);
let segments = await getSegments(startTime, endTime, false); let segments = await getSegments(startTime, endTime, false);
let hsr = await getHSR(startTime, endTime); let hsr = await getHSRAnomaly(startTime, endTime);
return { return {
timeserie: [ timeserie: [
{ target: target, datapoints: values, color: 'green' }, { target: target, datapoints: values, color: 'green' },
{ target: "HSR", datapoints: hsr, color: 'red', confidence: 100 } {
target: "HSR",
datapoints: hsr.map(([t, v, [l, u]]) => [t, v]),
color: 'red'
},
{
target: "HSR_Upper_bound",
datapoints: hsr.map(([t, v, [u, l]]) => [t, u]),
color: 'red'
},
{
target: "HSR_Lower_bound",
datapoints: hsr.map(([t, v, [u, l]]) => [t, l]),
color: 'red'
}
], ],
segments: segments, segments: segments,
} }

2
client/src/components/pods/hastic_pod.ts

@ -16,7 +16,7 @@ export abstract class HasticPod<T> extends LinePod {
protected segmentSet: SegmentsSet<Segment> protected segmentSet: SegmentsSet<Segment>
) { ) {
super(el, undefined, { super(el, undefined, {
renderLegend: false, renderLegend: true,
zoomEvents: { zoomEvents: {
mouse: { mouse: {
zoom: { zoom: {

6
client/src/services/analytics.service.ts

@ -57,7 +57,7 @@ export function getStatusGenerator(): AsyncIterableIterator<string> {
return getGenerator<string>(100, getStatus); return getGenerator<string>(100, getStatus);
} }
export async function getHSR(from: number, to: number): Promise<[number, number][]> { export async function getHSRAnomaly(from: number, to: number): Promise<[number, number, [number, number]][]> {
if(from >= to) { if(from >= to) {
throw new Error("`from` can`t be less than `to`"); throw new Error("`from` can`t be less than `to`");
} }
@ -65,8 +65,8 @@ export async function getHSR(from: number, to: number): Promise<[number, number]
const uri = ANALYTICS_API_URL + `hsr/?from=${from}&to=${to}`; const uri = ANALYTICS_API_URL + `hsr/?from=${from}&to=${to}`;
const res = await axios.get(uri); const res = await axios.get(uri);
const values = res["data"]["TimeSerie"]; const values = res["data"]["ConfidenceTimeSerie"];
console.log(values); console.log(values);
return values as [number, number][]; return values as [number, number, [number, number]][];
} }

2
client/src/views/Home.vue

@ -35,7 +35,7 @@
<div v-if="analyticUnitType == analyticUnitTypes[2]"> <div v-if="analyticUnitType == analyticUnitTypes[2]">
Alpha: Alpha:
<input :value="analyticUnitConfig.alpha" @change="alphaChange" /> <br/> <input :value="analyticUnitConfig.alpha" @change="alphaChange" /> <br/>
Confidence: Confidence:
<input :value="analyticUnitConfig.confidence" @change="confidenceChange" /> <br/><br/> <input :value="analyticUnitConfig.confidence" @change="confidenceChange" /> <br/><br/>
</div> </div>
</div> </div>

6
server/src/services/analytic_service/analytic_unit/anomaly_analytic_unit.rs

@ -77,14 +77,14 @@ impl AnalyticUnit for AnomalyAnalyticUnit {
} }
let mut sts = Vec::new(); let mut sts = Vec::new();
sts.push(ts[0]); sts.push((ts[0].0, ts[0].1, ((ts[0].1 + self.config.confidence, ts[0].1 - self.config.confidence))));
for t in 1..ts.len() { for t in 1..ts.len() {
let alpha = self.config.alpha; let alpha = self.config.alpha;
let stv = alpha * ts[t].1 + (1.0 - alpha) * sts[t - 1].1; let stv = alpha * ts[t].1 + (1.0 - alpha) * sts[t - 1].1;
sts.push((ts[t].0, stv)); sts.push((ts[t].0, stv, (stv + self.config.confidence, stv - self.config.confidence)));
} }
Ok(HSR::TimeSerie(sts)) Ok(HSR::ConfidenceTimeSerie(sts))
} }
} }

3
server/src/services/analytic_service/types.rs

@ -66,7 +66,8 @@ pub struct DetectionTask {
// varies for different analytic units // varies for different analytic units
#[derive(Debug, Serialize)] #[derive(Debug, Serialize)]
pub enum HSR { pub enum HSR {
TimeSerie(Vec<(u64, f64)>) TimeSerie(Vec<(u64, f64)>),
ConfidenceTimeSerie(Vec<(u64, f64, (f64, f64))>)
} }
#[derive(Debug)] #[derive(Debug)]

Loading…
Cancel
Save