From fdde80d0998ef3282c005332bc8c11ccfaeaab69 Mon Sep 17 00:00:00 2001 From: Sebastian Schmidl Date: Fri, 22 Dec 2023 16:47:36 +0100 Subject: [PATCH] Update algorithm image links in README (#40) feat: update README to include instructions on how to use the new Docker registry --- README.md | 300 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 171 insertions(+), 129 deletions(-) diff --git a/README.md b/README.md index cc7d96b..c9e0e1f 100644 --- a/README.md +++ b/README.md @@ -9,170 +9,212 @@ ## Description This repository contains a collection of containerized (dockerized) time series anomaly detection methods that can easily be evaluated using [TimeEval](https://github.com/TimeEval/TimeEval). -Some of the algorithm's source code is access restricted and we just provide the TimeEval stubs and manifests. We are happy to share our TimeEval adaptations of excluded algorithms upon request, if the original authors approve this. +Some of the algorithm's source code is access restricted and we just provide the TimeEval stubs and manifests. +We are happy to share our TimeEval adaptations of excluded algorithms upon request, if the original authors approve this. -Each folder contains the implementation of an algorithm that will be build into a runnable Docker container using CI. -The namespace prefix (repository) for the built Docker images is `registry.gitlab.hpi.de/akita/i/`. +Each folder contains the implementation of an algorithm that is built into a runnable Docker container using GitHub Actions. +We host the algorithm Docker images on GitHub. +Thus, the namespace prefix (repository) for the Docker images is `ghcr.io/timeeval/`. ## Overview | Algorithm (folder) | Image | Language | Base image | Learning Type | Input Dimensionality | | :----------------- | :---- | :------- | :--------- | :------------ | :------------------- | -| [arima](./arima) (_restricted access_) | `registry.gitlab.hpi.de/akita/i/arima` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [autoencoder](./autoencoder) | `registry.gitlab.hpi.de/akita/i/autoencoder` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [bagel](./bagel) | `registry.gitlab.hpi.de/akita/i/bagel` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | -| [baseline_increasing](./baseline_increasing) | `registry.gitlab.hpi.de/akita/i/baseline_increasing` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [baseline_normal](./baseline_normal) | `registry.gitlab.hpi.de/akita/i/baseline_normal` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [baseline_random](./baseline_random) | `registry.gitlab.hpi.de/akita/i/baseline_random` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [cblof](./cblof) | `registry.gitlab.hpi.de/akita/i/cblof` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [cof](./cof) | `registry.gitlab.hpi.de/akita/i/cof` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [copod](./copod) | `registry.gitlab.hpi.de/akita/i/copod` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [dae](./dae) (DeNoising Autoencoder) | `registry.gitlab.hpi.de/akita/i/dae` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [damp](./damp) | `registry.gitlab.hpi.de/akita/i/damp` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [dbstream](./dbstream) | `registry.gitlab.hpi.de/akita/i/dbstream` | R 4.2.0 | [`registry.gitlab.hpi.de/akita/i/r4-base`](./0-base-images/r4-base) | unsupervised | multivariate -| [deepant](./deepant) | `registry.gitlab.hpi.de/akita/i/deepant` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [deepnap](./deepnap) | `registry.gitlab.hpi.de/akita/i/deepnap` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [donut](./donut) | `registry.gitlab.hpi.de/akita/i/donut` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | -| [dspot](./dspot) | `registry.gitlab.hpi.de/akita/i/dspot` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [dwt_mlead](./dwt_mlead) | `registry.gitlab.hpi.de/akita/i/dwt_mlead` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [eif](./eif) | `registry.gitlab.hpi.de/akita/i/eif` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [encdec_ad](./encdec_ad) | `registry.gitlab.hpi.de/akita/i/encdec_ad` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [ensemble_gi](./ensemble_gi) | `registry.gitlab.hpi.de/akita/i/ensemble_gi` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [fast_mcd](./fast_mcd) | `registry.gitlab.hpi.de/akita/i/fast_mcd` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [fft](./fft) | `registry.gitlab.hpi.de/akita/i/fft` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [generic_rf](./generic_rf) | `registry.gitlab.hpi.de/akita/i/generic_rf` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | -| [generic_xgb](./generic_xgb) | `registry.gitlab.hpi.de/akita/i/generic_xgb` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | -| [grammarviz3](./grammarviz3) | `registry.gitlab.hpi.de/akita/i/grammarviz3` | Java| [`registry.gitlab.hpi.de/akita/i/java-base`](./0-base-images/java-base) | unsupervised | univariate | -| [grammarviz3_multi](./grammarviz3_multi) | `registry.gitlab.hpi.de/akita/i/grammarviz3_multi` | Java| [`registry.gitlab.hpi.de/akita/i/java-base`](./0-base-images/java-base) | unsupervised | multivariate | -| [hbos](./hbos) | `registry.gitlab.hpi.de/akita/i/hbos` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [health_esn](./health_esn) | `registry.gitlab.hpi.de/akita/i/health_esn` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [hif](./hif) | `registry.gitlab.hpi.de/akita/i/hif` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | supervised | multivariate | -| [hotsax](./hotsax) | `registry.gitlab.hpi.de/akita/i/hotsax` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [hybrid_knn](./hybrid_knn) | `registry.gitlab.hpi.de/akita/i/hybrid_knn` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [if_lof](./if_lof) | `registry.gitlab.hpi.de/akita/i/if_lof` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [iforest](./iforest) | `registry.gitlab.hpi.de/akita/i/iforest` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [img_embedding_cae](./img_embedding_cae) | `registry.gitlab.hpi.de/akita/i/img_embedding_cae` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | -| [kmeans](./kmeans) | `registry.gitlab.hpi.de/akita/i/kmeans` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [knn](./knn) | `registry.gitlab.hpi.de/akita/i/knn` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [laser_dbn](./laser_dbn) | `registry.gitlab.hpi.de/akita/i/laser_dbn` | Python 3.7 |[`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [left_stampi](./left_stampi) | `registry.gitlab.hpi.de/akita/i/left_stampi` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [lof](./lof) | `registry.gitlab.hpi.de/akita/i/lof` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [lstm_ad](./lstm_ad) | `registry.gitlab.hpi.de/akita/i/lstm_ad` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [lstm_vae](./lstm_vae) | `registry.gitlab.hpi.de/akita/i/lstm_vae` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | -| [median_method](./median_method) | `registry.gitlab.hpi.de/akita/i/median_method` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [mscred](./mscred) | `registry.gitlab.hpi.de/akita/i/mscred` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [mstamp](./mstamp) | `registry.gitlab.hpi.de/akita/i/mstamp` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [mtad_gat](./mtad_gat) | `registry.gitlab.hpi.de/akita/i/mtad_gat` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [multi_hmm](./multi_hmm) | `registry.gitlab.hpi.de/akita/i/multi_hmm` | Python 3.7 |[`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | supervised | multivariate | -| [multi_norma](./multi_norma) (_restricted access_) | `registry.gitlab.hpi.de/akita/i/multi_norma` | Python 3.7 |[`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [multi_subsequence_lof](./multi_subsquence_lof) | `registry.gitlab.hpi.de/akita/i/multi_subsequence_lof` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [mvalmod](./mvalmod) | `registry.gitlab.hpi.de/akita/i/mvalmod` | R 4.2.0 | [`registry.gitlab.hpi.de/akita/i/tsmp`](./1-intermediate-images/tsmp) -> [`registry.gitlab.hpi.de/akita/i/r4-base`](./0-base-images/r4-base) | unsupervised | multivariate | -| [norma](./norma) (_restricted access_) | `registry.gitlab.hpi.de/akita/i/norma` | Python 3.7 |[`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [normalizing_flows](./normalizing_flows) | `registry.gitlab.hpi.de/akita/i/normalizing_flows` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | supervised | multivariate | -| [novelty_svr](./novelty_svr) | `registry.gitlab.hpi.de/akita/i/novelty_svr` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [numenta_htm](./numenta_htm) | `registry.gitlab.hpi.de/akita/i/numenta_htm` | Python 2.7 |[`registry.gitlab.hpi.de/akita/i/python2-base`](./0-base-images/python2-base) | unsupervised | univariate | -| [ocean_wnn](./ocean_wnn) | `registry.gitlab.hpi.de/akita/i/ocean_wnn` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | -| [omnianomaly](./omnianomaly) | `registry.gitlab.hpi.de/akita/i/omnianomaly` | Python 3.6 |[`registry.gitlab.hpi.de/akita/i/python36-base`](./0-base-images/python36-base) | semi-supervised | multivariate | -| [pcc](./pcc) | `registry.gitlab.hpi.de/akita/i/pcc` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [pci](./pci) | `registry.gitlab.hpi.de/akita/i/pci` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [phasespace_svm](./phasespace_svm) | `registry.gitlab.hpi.de/akita/i/phasespace_svm` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [pst](./pst) | `registry.gitlab.hpi.de/akita/i/pst` | R 4.2.0 | [`registry.gitlab.hpi.de/akita/i/r4-base`](./0-base-images/r4-base) | | -| [random_black_forest](./random_black_forest) | `registry.gitlab.hpi.de/akita/i/random_black_forest` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [robust_pca](./robust_pca) | `registry.gitlab.hpi.de/akita/i/robust_pca` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [sand](./sand) (_restricted access_) | `registry.gitlab.hpi.de/akita/i/sand` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [sarima](./sarima) | `registry.gitlab.hpi.de/akita/i/sarima` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [series2graph](./series2graph) (_restricted access_) | `registry.gitlab.hpi.de/akita/i/series2graph` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [s_h_esd](./s_h_esd) | `registry.gitlab.hpi.de/akita/i/s_h_esd` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [sr](./sr) | `registry.gitlab.hpi.de/akita/i/sr` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [sr_cnn](./sr_cnn) | `registry.gitlab.hpi.de/akita/i/sr_cnn` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-base) | semi-supervised | univariate | -| [ssa](./ssa) (_restricted access_) | `registry.gitlab.hpi.de/akita/i/ssa` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | -| [stamp](./stamp) | `registry.gitlab.hpi.de/akita/i/stamp` | R 4.2.0 | [`registry.gitlab.hpi.de/akita/i/tsmp`](./1-intermediate-images/tsmp) -> [`registry.gitlab.hpi.de/akita/i/r4-base`](./0-base-images/r4-base) | unsupervised | univariate | -| [stomp](./stomp) | `registry.gitlab.hpi.de/akita/i/stomp` | R 4.2.0 | [`registry.gitlab.hpi.de/akita/i/tsmp`](./1-intermediate-images/tsmp) -> [`registry.gitlab.hpi.de/akita/i/r4-base`](./0-base-images/r4-base) | unsupervised | univariate | -| [subsequence_fast_mcd](./subsequence_fast_mcd) | `registry.gitlab.hpi.de/akita/i/subsequence_fast_mcd` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | -| [subsequence_knn](./subsequence_knn) | `registry.gitlab.hpi.de/akita/i/subsequence_knn` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [subsequence_if](./subsequence_if) | `registry.gitlab.hpi.de/akita/i/subsequence_if` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [subsequence_lof](./subsequence_lof) | `registry.gitlab.hpi.de/akita/i/subsequence_lof` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/pyod`](./1-intermediate-images/pyod) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [tanogan](./tanogan) | `registry.gitlab.hpi.de/akita/i/tanogan` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-torch) -> [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [tarzan](./tarzan) | `registry.gitlab.hpi.de/akita/i/tarzan` | Python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-torch`](./0-base-images/python3-base) | semi-supervised | univariate | -| [telemanom](./telemanom) | `registry.gitlab.hpi.de/akita/i/telemanom` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | -| [torsk](./torsk) | `registry.gitlab.hpi.de/akita/i/torsk` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | -| [triple_es](./triple_es) | `registry.gitlab.hpi.de/akita/i/triple_es` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [ts_bitmap](./ts_bitmap) | `registry.gitlab.hpi.de/akita/i/ts_bitmap` | python 3.7 | [`registry.gitlab.hpi.de/akita/i/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | -| [valmod](./valmod) | `registry.gitlab.hpi.de/akita/i/valmod` | R 4.2.0 | [`registry.gitlab.hpi.de/akita/i/tsmp`](./1-intermediate-images/tsmp) -> [`registry.gitlab.hpi.de/akita/i/r4-base`](./0-base-images/r4-base) | unsupervised | univariate | +| [arima](./arima) (_restricted access_) | [`ghcr.io/timeeval/arima`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/arima) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [autoencoder](./autoencoder) | [`ghcr.io/timeeval/autoencoder`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/autoencoder) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [bagel](./bagel) | [`ghcr.io/timeeval/bagel`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/bagel) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | +| [baseline_increasing](./baseline_increasing) | [`ghcr.io/timeeval/baseline_increasing`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/baseline_increasing) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [baseline_normal](./baseline_normal) | [`ghcr.io/timeeval/baseline_normal`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/baseline_normal) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [baseline_random](./baseline_random) | [`ghcr.io/timeeval/baseline_random`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/baseline_random) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [cblof](./cblof) | [`ghcr.io/timeeval/cblof`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/cblof) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [cof](./cof) | [`ghcr.io/timeeval/cof`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/cof) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [copod](./copod) | [`ghcr.io/timeeval/copod`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/copod) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [dae](./dae) (DeNoising Autoencoder) | [`ghcr.io/timeeval/dae`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/dae) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [damp](./damp) | [`ghcr.io/timeeval/damp`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/damp) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [dbstream](./dbstream) | [`ghcr.io/timeeval/dbstream`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/dbstream) | R 4.2.0 | [`ghcr.io/timeeval/r4-base`](./0-base-images/r4-base) | unsupervised | multivariate +| [deepant](./deepant) | [`ghcr.io/timeeval/deepant`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/deepant) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [deepnap](./deepnap) | [`ghcr.io/timeeval/deepnap`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/deepnap) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [donut](./donut) | [`ghcr.io/timeeval/donut`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/donut) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | +| [dspot](./dspot) | [`ghcr.io/timeeval/dspot`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/dspot) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [dwt_mlead](./dwt_mlead) | [`ghcr.io/timeeval/dwt_mlead`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/dwt_mlead) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [eif](./eif) | [`ghcr.io/timeeval/eif`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/eif) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [encdec_ad](./encdec_ad) | [`ghcr.io/timeeval/encdec_ad`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/encdec_ad) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [ensemble_gi](./ensemble_gi) | [`ghcr.io/timeeval/ensemble_gi`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/ensemble_gi) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [fast_mcd](./fast_mcd) | [`ghcr.io/timeeval/fast_mcd`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/fast_mcd) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [fft](./fft) | [`ghcr.io/timeeval/fft`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/fft) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [generic_rf](./generic_rf) | [`ghcr.io/timeeval/generic_rf`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/generic_rf) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | +| [generic_xgb](./generic_xgb) | [`ghcr.io/timeeval/generic_xgb`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/generic_xgb) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | +| [grammarviz3](./grammarviz3) | [`ghcr.io/timeeval/grammarviz3`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/grammarviz3) | Java| [`ghcr.io/timeeval/java-base`](./0-base-images/java-base) | unsupervised | univariate | +| [grammarviz3_multi](./grammarviz3_multi) | [`ghcr.io/timeeval/grammarviz3_multi`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/grammarviz3_multi) | Java| [`ghcr.io/timeeval/java-base`](./0-base-images/java-base) | unsupervised | multivariate | +| [hbos](./hbos) | [`ghcr.io/timeeval/hbos`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/hbos) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [health_esn](./health_esn) | [`ghcr.io/timeeval/health_esn`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/health_esn) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [hif](./hif) | [`ghcr.io/timeeval/hif`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/hif) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | supervised | multivariate | +| [hotsax](./hotsax) | [`ghcr.io/timeeval/hotsax`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/hotsax) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [hybrid_knn](./hybrid_knn) | [`ghcr.io/timeeval/hybrid_knn`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/hybrid_knn) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [if_lof](./if_lof) | [`ghcr.io/timeeval/if_lof`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/if_lof) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [iforest](./iforest) | [`ghcr.io/timeeval/iforest`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/iforest) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [img_embedding_cae](./img_embedding_cae) | [`ghcr.io/timeeval/img_embedding_cae`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/img_embedding_cae) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | +| [kmeans](./kmeans) | [`ghcr.io/timeeval/kmeans`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/kmeans) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [knn](./knn) | [`ghcr.io/timeeval/knn`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/knn) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [laser_dbn](./laser_dbn) | [`ghcr.io/timeeval/laser_dbn`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/laser_dbn) | Python 3.7 |[`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [left_stampi](./left_stampi) | [`ghcr.io/timeeval/left_stampi`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/left_stampi) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [lof](./lof) | [`ghcr.io/timeeval/lof`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/lof) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [lstm_ad](./lstm_ad) | [`ghcr.io/timeeval/lstm_ad`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/lstm_ad) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [lstm_vae](./lstm_vae) | [`ghcr.io/timeeval/lstm_vae`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/lstm_vae) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | +| [median_method](./median_method) | [`ghcr.io/timeeval/median_method`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/median_method) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [mscred](./mscred) | [`ghcr.io/timeeval/mscred`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/mscred) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [mstamp](./mstamp) | [`ghcr.io/timeeval/mstamp`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/mstamp) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [mtad_gat](./mtad_gat) | [`ghcr.io/timeeval/mtad_gat`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/mtad_gat) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [multi_hmm](./multi_hmm) | [`ghcr.io/timeeval/multi_hmm`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/multi_hmm) | Python 3.7 |[`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | supervised | multivariate | +| [multi_norma](./multi_norma) (_restricted access_) | [`ghcr.io/timeeval/multi_norma`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/multi_norma) | Python 3.7 |[`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [multi_subsequence_lof](./multi_subsquence_lof) | [`ghcr.io/timeeval/multi_subsequence_lof`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/multi_subsequence_lof) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [mvalmod](./mvalmod) | [`ghcr.io/timeeval/mvalmod`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/mvalmod) | R 4.2.0 | [`ghcr.io/timeeval/tsmp`](./1-intermediate-images/tsmp) -> [`ghcr.io/timeeval/r4-base`](./0-base-images/r4-base) | unsupervised | multivariate | +| [norma](./norma) (_restricted access_) | [`ghcr.io/timeeval/norma`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/norma) | Python 3.7 |[`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [normalizing_flows](./normalizing_flows) | [`ghcr.io/timeeval/normalizing_flows`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/normalizing_flows) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | supervised | multivariate | +| [novelty_svr](./novelty_svr) | [`ghcr.io/timeeval/novelty_svr`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/novelty_svr) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [numenta_htm](./numenta_htm) | [`ghcr.io/timeeval/numenta_htm`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/numenta_htm) | Python 2.7 |[`ghcr.io/timeeval/python2-base`](./0-base-images/python2-base) | unsupervised | univariate | +| [ocean_wnn](./ocean_wnn) | [`ghcr.io/timeeval/ocean_wnn`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/ocean_wnn) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | +| [omnianomaly](./omnianomaly) | [`ghcr.io/timeeval/omnianomaly`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/omnianomaly) | Python 3.6 |[`ghcr.io/timeeval/python36-base`](./0-base-images/python36-base) | semi-supervised | multivariate | +| [pcc](./pcc) | [`ghcr.io/timeeval/pcc`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/pcc) | Python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [pci](./pci) | [`ghcr.io/timeeval/pci`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/pci) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [phasespace_svm](./phasespace_svm) | [`ghcr.io/timeeval/phasespace_svm`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/phasespace_svm) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [pst](./pst) | [`ghcr.io/timeeval/pst`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/pst) | R 4.2.0 | [`ghcr.io/timeeval/r4-base`](./0-base-images/r4-base) | | +| [random_black_forest](./random_black_forest) | [`ghcr.io/timeeval/random_black_forest`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/random_black_forest) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [robust_pca](./robust_pca) | [`ghcr.io/timeeval/robust_pca`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/robust_pca) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [sand](./sand) (_restricted access_) | [`ghcr.io/timeeval/sand`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/sand) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [sarima](./sarima) | [`ghcr.io/timeeval/sarima`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/sarima) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [series2graph](./series2graph) (_restricted access_) | [`ghcr.io/timeeval/series2graph`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/series2graph) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [s_h_esd](./s_h_esd) | [`ghcr.io/timeeval/s_h_esd`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/s_h_esd) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [sr](./sr) | [`ghcr.io/timeeval/sr`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/sr) | Python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [sr_cnn](./sr_cnn) | [`ghcr.io/timeeval/sr_cnn`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/sr_cnn) | Python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-base) | semi-supervised | univariate | +| [ssa](./ssa) (_restricted access_) | [`ghcr.io/timeeval/ssa`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/ssa) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | +| [stamp](./stamp) | [`ghcr.io/timeeval/stamp`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/stamp) | R 4.2.0 | [`ghcr.io/timeeval/tsmp`](./1-intermediate-images/tsmp) -> [`ghcr.io/timeeval/r4-base`](./0-base-images/r4-base) | unsupervised | univariate | +| [stomp](./stomp) | [`ghcr.io/timeeval/stomp`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/stomp) | R 4.2.0 | [`ghcr.io/timeeval/tsmp`](./1-intermediate-images/tsmp) -> [`ghcr.io/timeeval/r4-base`](./0-base-images/r4-base) | unsupervised | univariate | +| [subsequence_fast_mcd](./subsequence_fast_mcd) | [`ghcr.io/timeeval/subsequence_fast_mcd`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/subsequence_fast_mcd) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | univariate | +| [subsequence_knn](./subsequence_knn) | [`ghcr.io/timeeval/subsequence_knn`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/subsequence_knn) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [subsequence_if](./subsequence_if) | [`ghcr.io/timeeval/subsequence_if`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/subsequence_if) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [subsequence_lof](./subsequence_lof) | [`ghcr.io/timeeval/subsequence_lof`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/subsequence_lof) | python 3.7 | [`ghcr.io/timeeval/pyod`](./1-intermediate-images/pyod) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [tanogan](./tanogan) | [`ghcr.io/timeeval/tanogan`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/tanogan) | python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-torch) -> [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [tarzan](./tarzan) | [`ghcr.io/timeeval/tarzan`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/tarzan) | Python 3.7 | [`ghcr.io/timeeval/python3-torch`](./0-base-images/python3-base) | semi-supervised | univariate | +| [telemanom](./telemanom) | [`ghcr.io/timeeval/telemanom`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/telemanom) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | semi-supervised | multivariate | +| [torsk](./torsk) | [`ghcr.io/timeeval/torsk`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/torsk) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | multivariate | +| [triple_es](./triple_es) | [`ghcr.io/timeeval/triple_es`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/triple_es) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [ts_bitmap](./ts_bitmap) | [`ghcr.io/timeeval/ts_bitmap`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/ts_bitmap) | python 3.7 | [`ghcr.io/timeeval/python3-base`](./0-base-images/python3-base) | unsupervised | univariate | +| [valmod](./valmod) | [`ghcr.io/timeeval/valmod`](https://github.com/TimeEval/TimeEval-algorithms/pkgs/container/valmod) | R 4.2.0 | [`ghcr.io/timeeval/tsmp`](./1-intermediate-images/tsmp) -> [`ghcr.io/timeeval/r4-base`](./0-base-images/r4-base) | unsupervised | univariate | ## Usage -### Prerequisites +### Use the published algorithm images + +Please always use a version-tagged Docker image for your algorithms to ensure reproducibility! + +You can pull the TimeEval algorithm images directly from the GitHub registry. +This registry does not require authentication. + +```bash +docker pull ghcr.io/timeeval/:0.3.0 +``` + +### Build the algorithm images + +Each algorithm in this repository is bundled in a self-contained Docker image so that it can be executed with a single command and no additional dependencies must be installed. +This allows you to test the algorithm without installing its dependencies on your machine. +The only requirement is a (x86-)Docker runtime. + +In the following, we assume that you want to build the Docker image for the [`lof`](./lof)-algorithm. + +> :warning: **Use correct version tags!** +> +> Please tag the base and intermediate images with the correct version. +> You can find the required version for each algorithm image in its `Dockerfile`. +> E.g. for [`lof`](./lof/Dockerfile) the version for `pyod` must be `0.3.0` (as of 2023-12-16): +> +> ```Dockerfile +> FROM ghcr.io/timeeval/pyod:0.3.0 +> ``` + +#### Prerequisites You need the following tools installed on your development machine: - git - docker - access to this repository +- (optionally) Docker BuildKit Please make yourself familiar with the [concepts of TimeEval](https://timeeval.readthedocs.io/en/latest/concepts), and read the [TimeEval documentation](https://timeeval.readthedocs.io) and this document carefully! -### Testing an algorithm and its TimeEval integration +#### 1. Prepare base image -Testing an algorithm locally can be done in two different ways: +You'll need the required base Docker images to build your algorithm's image. +You can either pull the base image from the registry or build it yourself. +In this guide, we assume that you want to build all Docker images locally. -1. Test the algorithm's code directly (using the tools provided by the programming language) -2. Test the algorithm within its docker container - -The first option is specific to the programming language, so we won't cover it here. +1. Clone this repository and change to its root folder -Each algorithm in this repository will be bundled in a self-contained Docker image so that it can be executed with a single command and no additional dependencies must be installed. -This allows you to test the algorithm without installing its dependencies on your machine. -The only requirement is a (x86-)Docker runtime. -Follow the below steps to test your algorithm using Docker (examples assume that you want to build the image for the LOF algorithm): + ```bash + git clone https://github.com/TimeEval/TimeEval-algorithms.git + cd TimeEval-algorithms + ``` -1. **Prepare base image** - You'll need the required base Docker image to build your algorithm's image. - If you find yourself situated in the HPI network (either VPN or physically), you are able to pull the docker images from our docker repository `registry.gitlab.hpi.de/akita/i/`. - If this is not the case you have to build the base images yourself as follows: +2. Change to the `0-base-images` folder: - 1.1 change to the `0-base-images` folder: + ```bash + cd 0-base-images + ``` - ```bash - cd 0-base-images - ``` +3. Build your desired base image: - 1.2 build your desired base image: + ```bash + docker build -t ghcr.io/timeeval/python3-base:0.3.0 python3-base + ``` - ```bash - docker build -t registry.gitlab.hpi.de/akita/i/python3-base:0.2.5 ./python3-base - ``` +#### Prepare intermediate image (optional) - 1.3 (conditional step) because `lof` depends on a derived base image, we need to additionally build the `pyod`-image +Because the algorithm `lof` depends on an intermediate image, we, first, need to build the required intermediate image `pyod`. +Please see the table in this repository's README for the dependencies. - - re-tag the base image `python3-base` with `latest` (because the `pyod`-image depends on the latest `python3-base`-image): +You can build the intermediate image `pyod` using these commands: - ```bash - docker tag registry.gitlab.hpi.de/akita/i/python3-base:0.2.5 registry.gitlab.hpi.de/akita/i/python3-base:latest - ``` +```bash +cd ../1-intermediate-images +docker build -t ghcr.io/timeeval/pyod:0.2.5 pyod +``` - - build intermediate image: +#### Build algorithm image - ```bash - cd ../1-intermediate-images - docker build -t registry.gitlab.hpi.de/akita/i/pyod:0.2.5 ./pyod - ``` +Once you have built all dependent images, you can build your algorithm image from the base image(s): - 1.4 now you can build your algorithm image from the base image (next item) +1. Change to the repository's root directory: -2. **Build algorithm image** - Next, you'll need to build the algorithm's Docker image. - It is based on the previously built base image and contains the algorithm-specific source code. + ```bash + cd .. + ``` - - change to the root directory of the `timeeval-algorithms`-repository - - build the algorithm image +2. Build the Docker image for your algorithm (`lof` in this case): ```bash - cd .. - docker build -t registry.gitlab.hpi.de/akita/i/lof ./lof + docker build -t ghcr.io/timeeval/lof:0.3.0 ./lof ``` -3. **Train your algorithm (optional)** +### Testing an algorithm and its TimeEval integration + +Testing an algorithm locally can be done in two different ways: + +1. Test the algorithm's code directly (using the tools provided by the programming language) +2. Test the algorithm within its docker container + +The first option is specific to the programming language, so we won't cover it here. + +Each algorithm in this repository will be bundled in a self-contained Docker image so that it can be executed with a single command and no additional dependencies must be installed. +This allows you to test the algorithm without installing its dependencies on your machine. +The only requirement is a (x86-)Docker runtime. +Follow the below steps to test your algorithm using Docker (examples assume that you want to build the image for the LOF algorithm): + +1. **Pull or build the algorithm image** + We refer the reader to the previous section for detailed instructions. + +2. **Train your algorithm (optional)** If your algorithm is supervised or semi-supervised, execute the following command to perform the training step (_not necessary for LOF_): ```bash @@ -182,7 +224,7 @@ Follow the below steps to test your algorithm using Docker (examples assume that -v $(pwd)/results:/results:rw \ # -e LOCAL_UID= \ # -e LOCAL_GID= \ - registry.gitlab.hpi.de/akita/i/:latest execute-algorithm '{ + ghcr.io/timeeval/:latest execute-algorithm '{ "executionType": "train", "dataInput": "/data/dataset.csv", "dataOutput": "/results/anomaly_scores.ts", @@ -194,7 +236,7 @@ Follow the below steps to test your algorithm using Docker (examples assume that Be warned that the result and model files will be written to the `results`-directory as the root-user if you do not pass the optional environment variables `LOCAL_UID` and `LOCAL_GID` to the container. -4. **Execute your algorithm** +3. **Execute your algorithm** Run the following command to perform the execution step of your algorithm: ```bash @@ -205,7 +247,7 @@ Follow the below steps to test your algorithm using Docker (examples assume that -v $(pwd)/results:/results:rw \ # -e LOCAL_UID= \ # -e LOCAL_GID= \ - registry.gitlab.hpi.de/akita/i/${TIMEEVAL_ALGORITHM}:latest execute-algorithm '{ + ghcr.io/timeeval/${TIMEEVAL_ALGORITHM}:latest execute-algorithm '{ "executionType": "execute", "dataInput": "/data/dataset.csv", "dataOutput": "/results/anomaly_scores.ts",