From c9a4f4a7c383bf2a0e11c2b57e0dcc649c321aa8 Mon Sep 17 00:00:00 2001 From: Pierre LOTTE <pierrelotte.dev@gmail.com> Date: Wed, 25 Sep 2024 16:33:12 +0200 Subject: [PATCH] Frequency anomalies added --- config_maker/anomalies/frequency.py | 22 +++++++++++++ generator/anomaly/frequency.py | 50 +++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 config_maker/anomalies/frequency.py create mode 100644 generator/anomaly/frequency.py diff --git a/config_maker/anomalies/frequency.py b/config_maker/anomalies/frequency.py new file mode 100644 index 0000000..8df01c6 --- /dev/null +++ b/config_maker/anomalies/frequency.py @@ -0,0 +1,22 @@ +""" +This module provides a frequency anomaly generator class +""" +import numpy as np + +from .base import BaseAnomaly + + +class FrequencyAnomaly(BaseAnomaly): + """ + This class generates and handles its anomaly type + """ + def generate(self): + """ + This function creates and returns the anomaly configuration. + """ + return { + "kind": "FREQUENCY", + "length": int(self.length), + "position": np.random.choice(["start", "middle", "end"]), + "frequency": np.random.uniform(8, 18) + } diff --git a/generator/anomaly/frequency.py b/generator/anomaly/frequency.py new file mode 100644 index 0000000..b2e9069 --- /dev/null +++ b/generator/anomaly/frequency.py @@ -0,0 +1,50 @@ +""" +This module defines the behavior of a frequency anomaly generator. +""" +from typing import Tuple + +import numpy as np + +from .base import BaseAnomaly + + +class FrequencyAnomaly(BaseAnomaly): + """ + This class defines the behavior that every anomaly generator should have. + """ + OSCILLATING_FUNCTIONS = { + "sin": np.sin, + "cos": np.cos, + "versine": lambda x: 1 - np.cos(x), + "vercosine": lambda x: 1 + np.cos(x), + "coversine": lambda x: 1 - np.sin(x), + "covercosine": lambda x: 1 + np.sin(x), + "haversine": lambda x: (1 - np.cos(x)) / 2, + "havercosine": lambda x: (1 + np.cos(x)) / 2, + "hacoversine": lambda x: (1 - np.sin(x)) / 2, + "hacovercosine": lambda x: (1 + np.sin(x)) / 2, + } + + def inject(self) -> Tuple[np.array, np.array]: + start, end = self.find_anomaly_index() + dt = .001 + + res = np.zeros(len(self.data[self.idx])) + + self.data[self.idx] = np.zeros(len(self.data[self.idx])) + self.data[self.idx, start:end] = 2 * np.pi * self.params["frequency"] * dt + + for term in self.dimension: + func = self.OSCILLATING_FUNCTIONS[term["function"]] + + # Generate testing data + signal = self.data[self.idx] + signal += 2 * np.pi * term["frequency"] * dt + signal = func(np.cumsum(signal)) + signal *= term["amplitude"] + res += signal + + self.data[self.idx] = res + + + return self.data, self.labels -- GitLab