From a7a14110913301681791182489b6bdbfec660947 Mon Sep 17 00:00:00 2001 From: hadifawaz1999 Date: Sun, 21 Jul 2024 19:35:25 +0200 Subject: [PATCH] finalize --- README.md | 101 ++++- config/config_hydra.yaml | 34 ++ draw_functions.py | 509 ++++++++++++++++++++++++++ exps/dtw-vis/.hydra/config.yaml | 27 ++ exps/dtw-vis/.hydra/hydra.yaml | 154 ++++++++ exps/dtw-vis/.hydra/overrides.yaml | 1 + exps/dtw-vis/ItalyPowerDemand/dtw.mp4 | Bin 0 -> 68765 bytes exps/dtw-vis/ItalyPowerDemand/dtw.pdf | Bin 0 -> 22074 bytes exps/dtw-vis/config_hydra.yaml | 27 ++ main.py | 57 +++ utils.py | 51 ++- 11 files changed, 956 insertions(+), 5 deletions(-) create mode 100644 config/config_hydra.yaml create mode 100644 draw_functions.py create mode 100644 exps/dtw-vis/.hydra/config.yaml create mode 100644 exps/dtw-vis/.hydra/hydra.yaml create mode 100644 exps/dtw-vis/.hydra/overrides.yaml create mode 100644 exps/dtw-vis/ItalyPowerDemand/dtw.mp4 create mode 100644 exps/dtw-vis/ItalyPowerDemand/dtw.pdf create mode 100644 exps/dtw-vis/config_hydra.yaml create mode 100644 main.py diff --git a/README.md b/README.md index 616a02b..f7dc6cb 100644 --- a/README.md +++ b/README.md @@ -1 +1,100 @@ -# DTW_VIS \ No newline at end of file +# Elastic Warping Visualization For Time Series + +## Author + +- **Ali Ismail-Fawaz** ([hadifawaz1999](https://github.com/hadifawaz1999)) + +This repository contains a project for visualizing warping distortions such as the ones produced by Dynamic Time Warping (DTW) between two time series. The project includes functions to generate plots and animated MP4s showcasing the alignment between the series. The repository is configured using [Hydra](https://hydra.cc/docs/intro/) for flexible and organized parameter management, and [aeon-toolkit](https://www.aeon-toolkit.org/en/stable/) for all time series processing and similarity measure calculation. + +## Contents + +- `main.py`: The main script to run the DTW visualization. +- `draw_functions.py`: Contains the functions for generating plots and GIFs. +- `utils.py`: Utility functions used in the project. +- `config/config_hydra.yaml`: Configuration file for Hydra. + + +## Usage + +### Prerequisites + +- Python >= 3.10 +- Required Python libraries: + - `numpy==1.26.4` + - `matplotlib==3.9.0` + - `hydra-core==1.3.2` + - `aeon==0.10.0` +- Required on the system: + - `ffmpeg` version `4.4.2` + +### Running the Code + +1. Configure the parameters in `config/config_hydra.yaml` as needed. +2. Run the main script: + ```sh + python3 main.py + ``` + +### Configuration Parameters + +The following parameters can be configured in the `config/config_hydra.yaml` file: + +- **Hydra Configuration:** + - `hydra.job.name`: Name of the job (default: `dtw-vis`). + - `hydra.run.dir`: Directory to save experiment results (default: `exps/${hydra.job.name}`). + +- **General Parameters:** + - `output_dir`: Directory where output plots and MP4s will be saved (default: `./`). + - `dataset`: Name of the dataset to use (default: `ItalyPowerDemand`) loaded from aeon-toolkit, see the [classification dataset list](https://github.com/aeon-toolkit/aeon/blob/main/aeon/datasets/tsc_datasets.py), the [regression datasets list](https://github.com/aeon-toolkit/aeon/blob/main/aeon/datasets/tser_datasets.py) and the [forecasting datasets lists](https://github.com/aeon-toolkit/aeon/blob/main/aeon/datasets/tsf_datasets.py). + - `split`: Dataset split (default: `None`). + - `znormalize`: Whether to Z-normalize the time series (default: `True`). + - `class_x`: Class label for the first time series (default: `0`). + - `class_y`: Class label for the second time series (default: `1`). + - `show_warping`: Whether to show warping connections in the plot (default: `False`). + - `figsize`: Figure size for the plots (default: `[12, 10]`). + +- **Metric Parameters:** + - `metric`: Metric used for elastic warping calculation (default: `dtw`), see [aeon's list of elastic measures](https://www.aeon-toolkit.org/en/stable/api_reference/distances.html). + - `metric_params`: Additional parameters for the DTW metric, including: + - `window`: Window size for the Sakoe-Chiba band (default: `None`). + - `p`: Parameter for p-norm (default: `2.0`). + - `w`: Window size (default: `None`). + - `itakura_max_slope`: Maximum slope for Itakura parallelogram (default: `None`). + - `descriptor`: Descriptor function (default: `identity`). + - `reach`: Reach parameter (default: `5`). + - `g`: Parameter for derivative DTW (default: `0.05`). + - `epsilon`: Epsilon parameter for soft-DTW (default: `1.0`). + - `g_arr`: G array for derivative DTW (default: `None`). + - `nu`: Regularization parameter for shape-based DTW (default: `0.001`). + - `lmbda`: Regularization parameter for penalized DTW (default: `1.0`). + - `independent`: Whether to use independent feature DTW (default: `True`). + - `c`: Regularization parameter for elastic shape DTW (default: `1.0`). + - `warp_penalty`: Penalty for warping path length (default: `1.0`). + - `standardize`: Whether to standardize the time series before DTW (default: `True`). + +## Example + +Using DTW on ItalyPowerDemand dataset + +- In video format: [dtw-italy](exps/dtw-vis/ItalyPowerDemand/dtw.mp4) +- In pdf format: [dtw-italy-pdf](exps/dtw-vis/ItalyPowerDemand/dtw.pdf) + +## Citation + +If you use this code in your research, please cite this repository: + +```bibtex +@misc{ismail-fawaz2024elastic-vis, + author = {Ismail-Fawaz, Ali and Devanne, Maxime and Berretti, Stefano and Weber, Jonathan and Forestier, Germain}, + title = {Elastic Warping Visualization For Time Series}, + year = {2024}, + publisher = {Github}, + journal = {GitHub repository}, + howpublished = {\url{https://github.com/yourusername/dtw-visualization}} +} +``` + +## Acknowledgments + +@e would like to thank the authors of the UCR, UEA and Monash archives for making the Time Series Classification/Regression/Forecasting datasets publicly available. +We would also like to thank the Aeon time series machine learning python toolkit for their fast implementation of elastic similarity measures. \ No newline at end of file diff --git a/config/config_hydra.yaml b/config/config_hydra.yaml new file mode 100644 index 0000000..b329529 --- /dev/null +++ b/config/config_hydra.yaml @@ -0,0 +1,34 @@ +hydra : + job : + name : dtw-vis + run : + dir : exps/${hydra.job.name} + +output_dir: './' # output directory +dataset : "ItalyPowerDemand" # dataset name to load from aeon +split: Null # either use train/test or both splits +znormalize: True # znormalize each time series channel independent + +class_x: 0 # In case of classification, class of first sample +class_y: 1 # In case of classification, class of second sample + +show_warping: False # Show warping connections in pdf +figsize: [12,10] # figure size + +metric : "dtw" # similarity measure to use +metric_params : # dictionary with measure parameters + window: null # for all warping based distances + p : 2.0 # for the minkowski, erp, wddtw, wdtw + w : null # for the minkowski distance + itakura_max_slope: null # for all warping based distances + descriptor : "identity" # for shape_dtw + reach : 5 # for shape_dtw + g : 0.05 # for wdtw + epsilon : 1.0 # for lcss, edr + g_arr : null # for erp + nu : 0.001 # for twe + lmbda : 1.0 # for twe + independent : True # for msm + c : 1.0 # for msm + warp_penalty : 1.0 # for adtw + standardize : True # for sbd \ No newline at end of file diff --git a/draw_functions.py b/draw_functions.py new file mode 100644 index 0000000..5da1111 --- /dev/null +++ b/draw_functions.py @@ -0,0 +1,509 @@ +from typing import Tuple + +import os +import numpy as np + +import matplotlib.pyplot as plt +from matplotlib.lines import Line2D +from matplotlib.patches import ConnectionPatch +from mpl_toolkits.axes_grid1 import make_axes_locatable + +from matplotlib.animation import FuncAnimation, FFMpegWriter + +from aeon.distances import cost_matrix +from aeon.distances._alignment_paths import compute_min_return_path + +from utils import alignment_path_to_plot + + +def draw_elastic( + x: np.ndarray, + y: np.ndarray, + channel_used: int = 0, + output_dir: str = "./", + figsize: Tuple[int, int] = None, + metric: str = "dtw", + metric_params: dict = None, + show_warping_connections: bool = False, + fontsize: int = 10, +): + """ + Draws an elastic plot comparing two time series with an elastic measure. + + Parameters + ---------- + x : np.ndarray + The first time series to compare. Expected to be a 2D array with shape (channels, length). + y : np.ndarray + The second time series to compare. Expected to be a 2D array with shape (channels, length). + channel_used : int, optional + The index of the channel to be used for comparison. Default is 0. + output_dir : str, optional + The directory where the output plot will be saved. Default is "./". + figsize : Tuple[int, int], optional + The size of the figure in inches (width, height). Default is None, which uses a default size. + metric : str, optional + The metric used for DTW calculation. Default is "dtw". + metric_params : dict, optional + Additional parameters for the elastic metric. Default is None. + show_warping_connections : bool, optional + Whether to show the warping connections between the time series. Default is False. + fontsize : int, optional + The font size used for the plot title and labels. Default is 10. + + Returns + ------- + None + + Saves: + ------ + A plot comparing the two time series with elastic alignment. + """ + if int(x.shape[0]) == 1: + channel_used = 0 + + figsize = (10, 10) if figsize is not None else figsize + + _x = np.copy(x) + _y = np.copy(y) + + _cost_matrix = cost_matrix(x=_x, y=_y, metric=metric, **metric_params) + optimal_path = compute_min_return_path(cost_matrix=_cost_matrix) + path_dtw_x, path_dtw_y = alignment_path_to_plot(path_dtw=optimal_path) + + fig, ax_matrix = plt.subplots(figsize=figsize) + fig.subplots_adjust(0.05, 0.1, 0.95, 0.95) + + divider = make_axes_locatable(ax_matrix) + ax_x = divider.append_axes("left", size="30%", pad=0.5) + ax_y = divider.append_axes("top", size="30%", pad=0.25) + ax_cbar = fig.add_axes([0.82, 0.2, 0.2, 0.5]) + ax_legend = fig.add_axes([0.1, 0.75, 0.2, 0.2]) + ax_legend.axis("off") + + lines_for_legend = [] + + lines_for_legend.append( + ax_x.plot( + -x[channel_used, 0 : len(x[channel_used])][::-1], + np.arange(0, len(x[channel_used])), + lw=4, + color="blue", + label="Time Series 1", + )[0] + ) + + lines_for_legend.append( + ax_y.plot( + np.arange(0, len(y[channel_used])), + y[channel_used, 0 : len(y[channel_used])], + lw=4, + color="red", + label="Time Series 2", + )[0] + ) + + ax_x.arrow( + x=-np.max(x[channel_used]) - 0.5, + y=len(x[channel_used]) - 1, + dx=0, + dy=-len(x[channel_used]) + 1, + head_width=0.1, + color="gray", + ) + ax_x.text(x=-np.max(x[channel_used]) - 0.7, y=0, s="time", rotation="vertical") + + ax_y.arrow( + x=0, + y=np.max(y[channel_used]) + 0.5, + dx=len(y[channel_used]) - 1, + dy=0, + head_width=0.1, + color="gray", + ) + ax_y.text( + x=len(y[channel_used]) - 1, + y=np.max(y[channel_used]) + 0.7, + s="time", + rotation="horizontal", + ) + + im = ax_matrix.imshow(_cost_matrix, aspect="equal", cmap="cool", alpha=0.6) + cbar = ax_cbar.figure.colorbar(im, ax=ax_cbar) + cbar.set_label(label="Cost Matrix", size=15) + + ax_matrix.plot(path_dtw_y, path_dtw_x, color="black", lw=4) + + if show_warping_connections: + for pair in optimal_path: + + i, j = pair[0], pair[1] + i_mid, j_mid = i, j + + con_x = ConnectionPatch( + ( + -x[channel_used, ::-1][len(x[channel_used]) - 1 - i_mid], + len(x[channel_used]) - 1 - i_mid, + ), + (j, i), + "data", + "data", + axesA=ax_x, + axesB=ax_matrix, + color="orange", + linewidth=1, + ) + + con_y = ConnectionPatch( + (j_mid, y[channel_used, j_mid]), + (j, i), + "data", + "data", + axesA=ax_y, + axesB=ax_matrix, + color="orange", + linewidth=1, + ) + + ax_matrix.add_artist(con_x) + ax_matrix.add_artist(con_y) + + ax_x.axis("OFF") + ax_y.axis("OFF") + ax_cbar.axis("OFF") + + labels = [line.get_label() for line in lines_for_legend] + lines_for_legend.append(Line2D([], [], lw=4, color="black")) + labels.append("Warping Path - " + metric) + ax_legend.legend( + lines_for_legend, + labels, + loc="upper left", + prop={"size": fontsize}, + bbox_to_anchor=(-0.3, 1), + ) + + ax_x.margins(y=0) + ax_y.margins(x=0) + + fig.savefig(os.path.join(output_dir, metric + ".pdf"), bbox_inches="tight") + + +# def draw_elastic( +# x: np.ndarray, +# y: np.ndarray, +# channel_used: int = 0, +# output_dir: str = "./", +# figsize: Tuple[int, int] = None, +# metric: str = "dtw", +# metric_params: dict = None, +# show_warping_connections: bool = False, +# ): + +# if int(x.shape[0]) == 1: +# channel_used = 0 + +# figsize = (10, 10) if figsize is not None else figsize + +# reach = metric_params["reach"] + +# if metric != "shape_dtw": +# reach = 0 + +# _x = np.copy(x) +# _y = np.copy(y) + +# x = np.pad(x, pad_width=[[0,0],[reach, reach]], mode="edge") +# y = np.pad(y, pad_width=[[0,0],[reach, reach]], mode="edge") + +# _cost_matrix = cost_matrix(x=_x, y=_y, metric=metric,**metric_params) +# optimal_path = compute_min_return_path(cost_matrix=_cost_matrix) +# path_dtw_x, path_dtw_y = alignment_path_to_plot(path_dtw=optimal_path) + +# fig = plt.figure(figsize=figsize) + +# ax_x = fig.add_axes([0.1, 0.1, 0.2, 0.5]) +# ax_y = fig.add_axes([0.1 + 0.25, 0.65, 0.5, 0.17]) +# ax_matrix = fig.add_axes([0.1 + 0.25, 0.1, 0.5, 0.5]) +# ax_cbar = fig.add_axes([0.1 + 0.25 + 0.37, 0.1, 0.2, 0.5]) + +# ax_x.plot( +# -x[channel_used,reach : len(x[channel_used]) - reach][::-1], +# np.arange(reach, len(x[channel_used]) - reach), +# lw=4, +# color="blue", +# ) +# if reach > 0: +# ax_x.plot(-x[channel_used,::-1][channel_used,:reach], np.arange(reach), lw=4, color="green") +# ax_x.plot( +# -x[channel_used,::-1][len(x[channel_used]) - reach :], +# np.arange(len(x[channel_used]) - reach, len(x[channel_used])), +# lw=4, +# color="green", +# ) + +# ax_y.plot( +# np.arange(reach, len(y[channel_used]) - reach), y[channel_used,reach : len(y[channel_used]) - reach], lw=4, color="red" +# ) +# if reach > 0: +# ax_y.plot(np.arange(reach), y[channel_used,:reach], lw=4, color="green") +# ax_y.plot( +# np.arange(len(y[channel_used]) - reach, len(y[channel_used])), y[channel_used,len(y[channel_used]) - reach :], lw=4, color="green" +# ) + +# ax_x.arrow( +# x=-np.max(x[channel_used]) - 0.5, +# y=len(x[channel_used]) - 1, +# dx=0, +# dy=-len(x[channel_used]) - 1, +# head_width=0.1, +# color="gray", +# ) +# ax_x.text(x=-np.max(x[channel_used]) - 0.7, y=0, s="time", rotation="vertical") + +# ax_y.arrow( +# x=0, y=np.max(y[channel_used]) + 0.5, dx=len(y[channel_used]) - 1, dy=0, head_width=0.1, color="gray" +# ) +# ax_y.text(x=len(y[channel_used]) - 1, y=np.max(y[channel_used]) + 0.7, s="time", rotation="horizontal") + +# im = ax_matrix.imshow(_cost_matrix, aspect="equal", cmap="cool", alpha=0.6) +# cbar = ax_cbar.figure.colorbar(im, ax=ax_cbar) +# cbar.set_label(label="Cost Matrix", size=15) + +# ax_matrix.plot(path_dtw_y, path_dtw_x, color="black", lw=4) + +# if show_warping_connections: +# for pair in optimal_path: + +# i, j = pair[0], pair[1] +# i_mid, j_mid = i + reach, j + reach + +# con_x = ConnectionPatch( +# (-x[channel_used,::-1][channel_used,len(x[channel_used]) - 1 - i_mid], len(x[channel_used]) - 1 - i_mid), +# (j, i), +# "data", +# "data", +# axesA=ax_x, +# axesB=ax_matrix, +# color="orange", +# linewidth=1, +# ) + +# con_y = ConnectionPatch( +# (j_mid, y[channel_used,j_mid]), +# (j, i), +# "data", +# "data", +# axesA=ax_y, +# axesB=ax_matrix, +# color="orange", +# linewidth=1, +# ) + +# ax_matrix.add_artist(con_x) +# ax_matrix.add_artist(con_y) + +# ax_x.axis("OFF") +# ax_y.axis("OFF") +# ax_cbar.axis("OFF") + +# fig.savefig(os.path.join(output_dir, metric + ".pdf"), bbox_inches="tight") + + +def draw_elastic_gif( + x: np.ndarray, + y: np.ndarray, + output_dir: str = "./", + channel_used: int = 0, + figsize: Tuple[int, int] = None, + metric: str = "dtw", + fontsize: int = 10, + metric_params: dict = None, + fps: int = 10, +): + """ + Creates and saves an animated video showing the warping alignment between two time series. + + Parameters + ---------- + x : np.ndarray + The first time series to compare. Expected to be a 2D array with shape (channels, length). + y : np.ndarray + The second time series to compare. Expected to be a 2D array with shape (channels, length). + output_dir : str, optional + The directory where the output GIF will be saved. Default is './'. + channel_used : int, optional + The index of the channel to be used for comparison. Default is 0. + figsize : Tuple[int, int], optional + The size of the figure in inches (width, height). Default is None, which uses a default size of (10, 10). + metric : str, optional + The metric used for DTW calculation. Default is "dtw". + fontsize : int, optional + The font size used for the plot title and labels. Default is 10. + metric_params : dict, optional + Additional parameters for the elastic metric. Default is None. + fps: int, optional + The number of frames per second, default is 10. + + Returns + ------- + None + + Saves + ----- + An animated MP$ showing the alignment of the two time series. + """ + if figsize is None: + figsize = (10, 10) + + _x = np.copy(x) + _y = np.copy(y) + + _cost_matrix = cost_matrix(x=_x, y=_y, metric=metric, **metric_params) + optimal_path = compute_min_return_path(cost_matrix=_cost_matrix) + path_dtw_x, path_dtw_y = alignment_path_to_plot(path_dtw=optimal_path) + + fig, ax_matrix = plt.subplots(figsize=figsize) + fig.subplots_adjust(0.05, 0.1, 0.95, 0.95) + + divider = make_axes_locatable(ax_matrix) + ax_x = divider.append_axes("left", size="25%", pad=0.5) + ax_y = divider.append_axes("top", size="25%", pad=0.25) + ax_cbar = fig.add_axes([0.75, 0.2, 0.2, 0.5]) + ax_legend = fig.add_axes([0.1, 0.75, 0.2, 0.2]) + ax_legend.axis("off") + + lines_for_legend = [] + + lines_for_legend.append( + ax_x.plot( + -x[channel_used, 0 : len(x[channel_used])][::-1], + np.arange(0, len(x[channel_used])), + lw=4, + color="blue", + label="Time Series 1", + )[0] + ) + + lines_for_legend.append( + ax_y.plot( + np.arange(0, len(y[channel_used])), + y[channel_used, 0 : len(y[channel_used])], + lw=4, + color="red", + label="Time Series 2", + )[0] + ) + + ax_x.arrow( + x=-np.max(x[channel_used]) - 0.5, + y=len(x[channel_used]) - 1, + dx=0, + dy=-len(x[channel_used]) + 1, + head_width=0.1, + color="gray", + ) + ax_x.text(x=-np.max(x[channel_used]) - 0.7, y=0, s="time", rotation="vertical") + + ax_y.arrow( + x=0, + y=np.max(y[channel_used]) + 0.5, + dx=len(y[channel_used]) - 1, + dy=0, + head_width=0.1, + color="gray", + ) + ax_y.text( + x=len(y[channel_used]) - 1, + y=np.max(y[channel_used]) + 0.7, + s="time", + rotation="horizontal", + ) + + im = ax_matrix.imshow(_cost_matrix, aspect="equal", cmap="cool", alpha=0.6) + + cbar = ax_cbar.figure.colorbar(im, ax=ax_cbar) + cbar.set_label(label="Cost Matrix", size=15) + + dtw_plot = ax_matrix.plot(path_dtw_y, path_dtw_x, color="black", lw=4)[0] + + con_x = ConnectionPatch( + ( + -x[channel_used, ::-1][len(x[channel_used]) - 1 - optimal_path[0][0]], + len(x[channel_used]) - 1 - optimal_path[0][0], + ), + (optimal_path[0][1], optimal_path[0][0]), + "data", + "data", + axesA=ax_x, + axesB=ax_matrix, + color="orange", + linewidth=2, + ) + + con_y = ConnectionPatch( + (optimal_path[0][1], y[channel_used, optimal_path[0][1]]), + (optimal_path[0][1], optimal_path[0][0]), + "data", + "data", + axesA=ax_y, + axesB=ax_matrix, + color="orange", + linewidth=2, + ) + + ax_matrix.add_artist(con_x) + ax_matrix.add_artist(con_y) + + def animate(i): + + if i >= len(optimal_path): + i = len(optimal_path) - 1 + + time_mesh = np.arange(i + 1) + + i_x = path_dtw_x[i] + i_y = path_dtw_y[i] + i_x_mid, i_y_mid = i_x, i_y + + dtw_plot.set_data(path_dtw_y[time_mesh], path_dtw_x[time_mesh]) + + con_x.xy1 = ( + -x[channel_used, ::-1][len(x[channel_used]) - 1 - i_x_mid], + len(x[channel_used]) - 1 - i_x_mid, + ) + con_x.xy2 = path_dtw_y[i], path_dtw_x[i] + + con_y.xy1 = i_y_mid, y[channel_used, i_y_mid] + con_y.xy2 = path_dtw_y[i], path_dtw_x[i] + + return dtw_plot, con_x, con_y + + ax_x.margins(y=0) + ax_y.margins(x=0) + + ani = FuncAnimation( + fig, + animate, + interval=fps, + blit=False, + frames=len(optimal_path) + 10, + ) + + ax_x.axis("OFF") + ax_y.axis("OFF") + ax_cbar.axis("OFF") + + labels = [line.get_label() for line in lines_for_legend] + lines_for_legend.append(Line2D([], [], lw=4, color="black")) + labels.append("Warping Path - " + metric) + ax_legend.legend( + lines_for_legend, + labels, + loc="upper left", + prop={"size": fontsize}, + bbox_to_anchor=(-0.3, 1), + ) + + writervideo = FFMpegWriter(fps=fps) + ani.save(os.path.join(output_dir, metric + ".mp4"), writer=writervideo) diff --git a/exps/dtw-vis/.hydra/config.yaml b/exps/dtw-vis/.hydra/config.yaml new file mode 100644 index 0000000..b4bec86 --- /dev/null +++ b/exps/dtw-vis/.hydra/config.yaml @@ -0,0 +1,27 @@ +output_dir: ./ +dataset: ItalyPowerDemand +split: null +znormalize: true +class_x: 0 +class_y: 1 +show_warping: false +figsize: +- 12 +- 10 +metric: dtw +metric_params: + window: null + p: 2.0 + w: null + itakura_max_slope: null + descriptor: identity + reach: 5 + g: 0.05 + epsilon: 1.0 + g_arr: null + nu: 0.001 + lmbda: 1.0 + independent: true + c: 1.0 + warp_penalty: 1.0 + standardize: true diff --git a/exps/dtw-vis/.hydra/hydra.yaml b/exps/dtw-vis/.hydra/hydra.yaml new file mode 100644 index 0000000..f904d9a --- /dev/null +++ b/exps/dtw-vis/.hydra/hydra.yaml @@ -0,0 +1,154 @@ +hydra: + run: + dir: exps/${hydra.job.name} + sweep: + dir: multirun/${now:%Y-%m-%d}/${now:%H-%M-%S} + subdir: ${hydra.job.num} + launcher: + _target_: hydra._internal.core_plugins.basic_launcher.BasicLauncher + sweeper: + _target_: hydra._internal.core_plugins.basic_sweeper.BasicSweeper + max_batch_size: null + params: null + help: + app_name: ${hydra.job.name} + header: '${hydra.help.app_name} is powered by Hydra. + + ' + footer: 'Powered by Hydra (https://hydra.cc) + + Use --hydra-help to view Hydra specific help + + ' + template: '${hydra.help.header} + + == Configuration groups == + + Compose your configuration from those groups (group=option) + + + $APP_CONFIG_GROUPS + + + == Config == + + Override anything in the config (foo.bar=value) + + + $CONFIG + + + ${hydra.help.footer} + + ' + hydra_help: + template: 'Hydra (${hydra.runtime.version}) + + See https://hydra.cc for more info. + + + == Flags == + + $FLAGS_HELP + + + == Configuration groups == + + Compose your configuration from those groups (For example, append hydra/job_logging=disabled + to command line) + + + $HYDRA_CONFIG_GROUPS + + + Use ''--cfg hydra'' to Show the Hydra config. + + ' + hydra_help: ??? + hydra_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][HYDRA] %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + root: + level: INFO + handlers: + - console + loggers: + logging_example: + level: DEBUG + disable_existing_loggers: false + job_logging: + version: 1 + formatters: + simple: + format: '[%(asctime)s][%(name)s][%(levelname)s] - %(message)s' + handlers: + console: + class: logging.StreamHandler + formatter: simple + stream: ext://sys.stdout + file: + class: logging.FileHandler + formatter: simple + filename: ${hydra.runtime.output_dir}/${hydra.job.name}.log + root: + level: INFO + handlers: + - console + - file + disable_existing_loggers: false + env: {} + mode: RUN + searchpath: [] + callbacks: {} + output_subdir: .hydra + overrides: + hydra: + - hydra.mode=RUN + task: [] + job: + name: dtw-vis + chdir: null + override_dirname: '' + id: ??? + num: ??? + config_name: config_hydra.yaml + env_set: {} + env_copy: [] + config: + override_dirname: + kv_sep: '=' + item_sep: ',' + exclude_keys: [] + runtime: + version: 1.3.2 + version_base: '1.1' + cwd: /media/hadi/kousa/these/DTW_VIS + config_sources: + - path: hydra.conf + schema: pkg + provider: hydra + - path: /media/hadi/kousa/these/DTW_VIS/config + schema: file + provider: main + - path: '' + schema: structured + provider: schema + output_dir: /media/hadi/kousa/these/DTW_VIS/exps/dtw-vis + choices: + hydra/env: default + hydra/callbacks: null + hydra/job_logging: default + hydra/hydra_logging: default + hydra/hydra_help: default + hydra/help: default + hydra/sweeper: basic + hydra/launcher: basic + hydra/output: default + verbose: false diff --git a/exps/dtw-vis/.hydra/overrides.yaml b/exps/dtw-vis/.hydra/overrides.yaml new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/exps/dtw-vis/.hydra/overrides.yaml @@ -0,0 +1 @@ +[] diff --git a/exps/dtw-vis/ItalyPowerDemand/dtw.mp4 b/exps/dtw-vis/ItalyPowerDemand/dtw.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..dfd5282e69fa057bcdb98cf4d680e37d001bb130 GIT binary patch literal 68765 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 literal 0 HcmV?d00001 diff --git a/exps/dtw-vis/ItalyPowerDemand/dtw.pdf b/exps/dtw-vis/ItalyPowerDemand/dtw.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c5100009bb2655a2fa01fc806ff3ecb94ab7fb32 GIT binary patch literal 22074 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 R1U|O%;HP4RHI20B|36}CPG 0: stds[stds == 0.0] = 1.0 - return (x - x.mean(axis=1, keepdims=True)) / stds - return (x - x.mean(axis=1, keepdims=True)) / (x.std(axis=1, keepdims=True)) + return (x - x.mean(axis=2, keepdims=True)) / stds + return (x - x.mean(axis=2, keepdims=True)) / (x.std(axis=2, keepdims=True)) def encode_labels(y): @@ -26,7 +69,7 @@ def encode_labels(y): return labenc.fit_transform(y) -def dtw_path_to_plot(path_dtw): +def alignment_path_to_plot(path_dtw): axis_x = [] axis_y = []