You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

159 lines
4.5 KiB

import { SegmentsSet } from './segment_set';
import { SegmentArray } from './segment_array';
import { Segment, SegmentKey } from './segment';
import { Metric } from './metric';
import _ from 'lodash';
export type AnomalySermentPair = { anomalyType: AnomalyType, segment: AnomalySegment };
export type AnomalySegmentsSearcher = (point: number) => AnomalySermentPair[];
export type AnomalyKey = string;
export class AnomalySegment extends Segment {
constructor(public labeled: boolean, key: SegmentKey, from: number, to: number) {
super(key, from, to);
if(!_.isBoolean(labeled)) {
throw new Error('labeled value is not boolean');
}
}
}
export class AnomalyType {
private _selected: boolean = false;
private _deleteMode: boolean = false;
private _saving: boolean = false;
private _segmentSet = new SegmentArray<AnomalySegment>();
private _status: string;
private _metric: Metric;
private _alertEnabled?: boolean;
constructor(private _panelObject?: any) {
if(_panelObject === undefined) {
this._panelObject = {};
}
_.defaults(this._panelObject, {
name: 'anomaly_name', confidence: 0.2, color: 'red'
});
//this._metric = new Metric(_panelObject.metric);
}
get key(): AnomalyKey { return this.name; }
set name(value: string) { this._panelObject.name = value; }
get name(): string { return this._panelObject.name; }
set confidence(value: number) { this._panelObject.confidence = value; }
get confidence(): number { return this._panelObject.confidence; }
set color(value: string) { this._panelObject.color = value; }
get color(): string { return this._panelObject.color; }
get selected(): boolean { return this._selected; }
set selected(value: boolean) { this._selected = value; }
get deleteMode(): boolean { return this._deleteMode; }
set deleteMode(value: boolean) { this._deleteMode = value; }
get saving(): boolean { return this._saving; }
set saving(value: boolean) { this._saving = value; }
get visible(): boolean {
return (this._panelObject.visible === undefined) ? true : this._panelObject.visible
}
set visible(value: boolean) {
this._panelObject.visible = value;
}
get metric() { return this._metric; }
addLabeledSegment(segment: Segment): AnomalySegment {
var asegment = new AnomalySegment(true, segment.key, segment.from, segment.to);
this._segmentSet.addSegment(asegment);
return asegment;
}
removeSegmentsInRange(from: number, to: number): AnomalySegment[] {
return this._segmentSet.removeInRange(from, to);
}
get segments(): SegmentsSet<AnomalySegment> { return this._segmentSet; }
set segments(value: SegmentsSet<AnomalySegment>) {
this._segmentSet.setSegments(value.getSegments());
}
get status() { return this._status; }
set status(value) {
if(
value !== 'ready' &&
value !== 'learning' &&
value !== 'pending' &&
value !== 'failed'
) {
throw new Error('Unsupported status value: ' + value);
}
this._status = value;
}
get isActiveStatus() {
return this.status !== 'ready' && this.status !== 'failed';
}
get panelObject() { return this._panelObject; }
get alertEnabled(): boolean {
return this._alertEnabled;
}
set alertEnabled(value) {
this._alertEnabled = value;
}
}
export class AnomalyTypesSet {
private _mapAnomalyKeyIndex: Map<AnomalyKey, number>;
private _anomalyTypes: AnomalyType[];
constructor(private _panelObject: any[]) {
if(_panelObject === undefined) {
throw new Error('panel object can`t be undefined');
}
this._mapAnomalyKeyIndex = new Map<AnomalyKey, number>();
this._anomalyTypes = _panelObject.map(p => new AnomalyType(p));
this._rebuildIndex();
}
get anomalyTypes() { return this._anomalyTypes; }
addAnomalyType(anomalyType: AnomalyType) {
this._panelObject.push(anomalyType.panelObject);
this._mapAnomalyKeyIndex[anomalyType.name] = this._anomalyTypes.length;
this._anomalyTypes.push(anomalyType);
}
removeAnomalyType(key: AnomalyKey) {
var index = this._mapAnomalyKeyIndex[key];
this._panelObject.splice(index, 1);
this._anomalyTypes.splice(index, 1);
this._rebuildIndex();
}
_rebuildIndex() {
this._anomalyTypes.forEach((a, i) => {
this._mapAnomalyKeyIndex[a.key] = i;
});
}
byKey(key: AnomalyKey): AnomalyType {
return this._anomalyTypes[this._mapAnomalyKeyIndex[key]];
}
byIndex(index: number): AnomalyType {
return this._anomalyTypes[index];
}
}