Skip to content
Snippets Groups Projects
mmae_simulator_real_data.py 3.01 KiB
Newer Older
import numpy as np

from inputs import Input
from MMAE.mmae import MMAE
from System.system_simulator import SystemSimulator
from testbench_tools import simulation_configuration_setup
from testbench_tools import mmae_simulator_plots

class MMAESimulatorRealData:
    def __init__(self, λs, true_λ, dt, H, Q, R, x0, true_system_noisy, estimator_noisy, max_time, max_steps, amplitude):
        # Synthetic system simulator initialization
        self.TrueSystem = SystemSimulator(true_λ, dt, H, Q, R, x0, true_system_noisy)

        # Input initialization
        self.input_signal = Input(self.TrueSystem.model, max_time).step_function(max_steps, amplitude)

        # MMAE initialization
        self.MMAE = MMAE(λs, dt, H, Q, R, x0, estimator_noisy)
    
    def update(self, t: int, z: np.ndarray, dt: float) -> float:
        u = self.input_signal[t, :].reshape(-1, 1)

        λ_hat, cumulative_posteriors, pdvs = self.MMAE.update(u, z, dt)

        return λ_hat, cumulative_posteriors, pdvs

def real_data(dataset):
    data = np.loadtxt(dataset, delimiter=",", usecols=5, skiprows=1)  # skiprows=1 if there is a header
    dts = np.loadtxt(dataset, delimiter=",", usecols=2, skiprows=1)  # skiprows=1 if there is a header

    # Init Initial state
    time_track = 0.0
    times.append(time_track)
    zs.append(np.array([[data[0]]], dtype='float64'))

    for step_counter in range(1, max_time):
        curr_dt = dts[step_counter]
        time_track += curr_dt
        times.append(time_track)
        z = np.array([[data[step_counter]]], dtype='float64')
        zs.append(z)
        pass

if __name__ == "__main__":
    # Load configuration from JSON file
    λs, m, k, b, dt, H, Q, R, x0, max_time, max_steps, amplitude = simulation_configuration_setup()

    true_λ = [m, k, b]

    # MMAE simulator initialization
    MMAESimulator = MMAESimulatorRealData(λs, true_λ, dt, H, Q, R, x0, True, False, max_time, max_steps, amplitude)

    ### Run simulation ###
    times = []
    zs = []
    lambda_hats = []
    cumulative_posteriors_summary = []
    pdvs_summary = []

    data = np.loadtxt("./Data/Dataset_3.csv", delimiter=",", usecols=5, skiprows=1)  # skiprows=1 if there is a header
    dts = np.loadtxt("./Data/Dataset_3.csv", delimiter=",", usecols=2, skiprows=1)  # skiprows=1 if there is a header

    # Init Initial state
    time_track = 0.0
    times.append(time_track)
    z = np.array([[data[0]]], dtype='float64')
    zs.append(z)
    MMAESimulator.update(0.0, z, dt)

    # Main simulation loop
    for step_counter in range(1, max_time):
        dt = dts[step_counter]
        time_track += dt
        times.append(time_track)
        z = np.array([[data[step_counter]]], dtype='float64')
        zs.append(z)
        λ_hat, cumulative_posteriors, pdvs = MMAESimulator.update(step_counter, z, dt)
        lambda_hats.append(λ_hat)
        cumulative_posteriors_summary.append(cumulative_posteriors)
        pdvs_summary.append(pdvs)

    mmae_simulator_plots(times, true_λ, λs, lambda_hats, cumulative_posteriors_summary, pdvs_summary)