---
# System prepended metadata

title: Notes on mpEDM

---

# Notes on mpEDM

## Code Structure

Source files are located under [`src/`](https://github.com/keichi/mpEDM/tree/master/src).

### User-facing classes

- `simplex_*.cc`: Performs prediction of a time series using  the simplex projection algorithm.
- `embedding_dim_*.cc`: Finds the optimal embedding dimension of a time series using simplex projection.
- `cross_mapping_*.cc`: Performs cross mapping from one time series to multiple other time series.

### Internal classes

- `nearest_neighbors_*.cc`: k-nearest neighbor search. CPU version uses OpenMP for multi-core and SIMD parallelization. GPU version uses ArrayFire.
- `data_frame.cc`: Class to hold the input dataset (a column-major 2D array). Supports reading data from a CSV file or an HDF5 file.
- `lut.cc`: Lookup table for holding the pre-computed nearest neighbors.
- `mpi_master.cc`, `mpi_worker.cc`: Utility class for distributing computation across multiple nodes using master-worker model.

Automated unit tests are located under [`test/`](https://github.com/keichi/mpEDM/tree/master/test). Output is validated against ground-truth data generated using pyEDM (cppEDM).

## Stand-alone applications

When building mpEDM, several stand-alone applications are generated in addition to the shared library (`libmpedm.so`).

- `cross_mapping_bench`: This is the cross mapping application we used for the fish brain project. It performs an all-to-all cross mapping of the input time series and writes the CCM rho values to a file.
- `cross_mapping_mpi_bench`: This is the cross mapping application we used for running on multiple nodes. A Message Passing Interface (MPI) implementation must be available.
- `simplex_bench`, `knn_bench`: These are used for performance measurement/optimization purposes only and do not produce any output.

## Performance Numbers

Performance measurements were done on AIST's [ABCI](https://abci.ai/) supercomputer using the GPU backend of mpEDM. Each compute node in ABCI is equipped with the following hardware:

- NVIDIA Tesla V100 SXM2 x4
- Intel Xeon Gold 6148 x2

The table below shows the total runtime to complete an all-to-all cross mapping (cross maps from every time series to every other time series)  of the input dataset.

| Dataset     | # of Time Steps | # of Time Series | Single Node | 512 Nodes |
|:----------- | ---------------:| ----------------:| -----------:| ---------:|
| Fish1_Normo |           1,450 |           53,053 |      1,973s |       20s |
| Subject6    |           3,780 |           92,538 |     13,953s |      101s |
| Subject11   |           8,528 |          101,729 |     39,572s |      199s |
| Fly80XY     |          10,608 |               83 |         14s |       N/A |