{"id":18925623,"url":"https://github.com/jm1/python-edamer","last_synced_at":"2026-04-29T10:34:30.942Z","repository":{"id":69767731,"uuid":"317850126","full_name":"JM1/python-edamer","owner":"JM1","description":"EDAMER: Exascale Data Analysis Methods with Enhanced Reusability","archived":false,"fork":false,"pushed_at":"2021-09-20T09:15:29.000Z","size":143,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-25T00:18:50.182Z","etag":null,"topics":["cpp","distributed-computing","hbrs-mpl","hpc","linear-algebra","mpi","mpi4py","pca","python3"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/JM1.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING-CMAKE-SCRIPTS","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2020-12-02T12:08:39.000Z","updated_at":"2021-09-20T09:15:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"e60d3fb0-402f-4b4b-982f-c0b9f4a28889","html_url":"https://github.com/JM1/python-edamer","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JM1/python-edamer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fpython-edamer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fpython-edamer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fpython-edamer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fpython-edamer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JM1","download_url":"https://codeload.github.com/JM1/python-edamer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JM1%2Fpython-edamer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32422043,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T06:29:02.080Z","status":"ssl_error","status_checked_at":"2026-04-29T06:29:00.631Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cpp","distributed-computing","hbrs-mpl","hpc","linear-algebra","mpi","mpi4py","pca","python3"],"created_at":"2024-11-08T11:12:38.609Z","updated_at":"2026-04-29T10:34:30.936Z","avatar_url":"https://github.com/JM1.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Python library `edamer` feat. distributed algorithms powered by [`hbrs-mpl`][hbrs-mpl] and [`Elemental`][elemental]\n\n`edamer` is a Python 3 library\n([GitHub.com][py-edamer], [H-BRS GitLab][hbrs-gitlab-py-edamer], [FHG GitLab][fhg-gitlab-py-edamer])\nthat provides data structures and algorithms like PCA for distributed scientific computing at HPC clusters.\nOur research goal is to make the full power of generic C++ libraries usable for data analysis\nand machine learning applications in Python without sacrificing space and time efficiency.\nFor example, `edamer` allows to run a distributed PCA on CFD data from [NEK5000][nek5000] in-situ from a\n[ParaView Catalyst][pv-catalyst-guide] script written in Python only.\n\nIts development started in Juli 2020 as part of the [`EDAMER`][fhg-gitlab-edamer] research project and is funded by\n[Fraunhofer SCAI][fhg-scai]. `EDAMER` is an acronym for `Exascale Data Analysis Methods with Enhanced Reusability` and\nexpresses our ambition to bring our efficient and scalable software components for dense linear algebra and dimension\nreduction from C++ library [`hbrs-mpl`][hbrs-mpl] to the broader audience of Python developers. We want to equip\nscientists with a generic framework and a predefined set of reusable and robust components which allows them to codify\ncomplex algorithms for exascale computers rapidly, without need for in-depth programming knowledge in C++ or HPC.\nNumerical analysis of large simulation datasets is a representative domain for generic libraries, as quick and easy\ncomparison of varied algorithms is of particular interest here.\n\n:warning: **WARNING:**\nThis code is still under development and is not ready for production yet.\nCode might change or break at any time and is missing proper documentation.\n:warning:\n\n:warning: **DEPRECATION NOTICE:**\nApparently, this code meets the inevitable fate of many state-funded research projects. It has not been actively worked\non since early 2021. **Software consists of teams of people. If you want people to continue developing a project after\nit ceases to be their personal interest, fund them for it.**\n:warning:\n\n## Example: Distributed PCA in 12 lines of Python code\n\n```Python\n#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n# Copyright (c) 2020 Jakob Meng, \u003cjakobmeng@web.de\u003e\n\nfrom edamer import detail, dt, fn\nfrom mpi4py import MPI\nimport numpy as np\n\n# Generate example data\ndataset = np.asarray(np.arange(1000*2000).reshape(1000, 2000), order='F')\n\n# Wrap NumPy array in Elemental matrix (no copy)\nmatrix = dt.ElMatrix.view_from_numpy(dataset)\n\n# Construct distributed Elemental matrix from local matrices (no copy)\ngrid = dt.ElGrid(MPI.COMM_WORLD)\nstar_star = dt.MatrixDistribution.make(dt.ElDist.STAR, dt.ElDist.STAR, dt.ElDistWrap.ELEMENT)\ndist_matrix = dt.ElDistMatrix.make_view(grid, matrix, star_star)\n\n# Apply PCA on distributed Elemental matrix\npca_ctrl = dt.PcaControl.make(economy=True, center=False, normalize=False)\ndec = fn.pca(dist_matrix, pca_ctrl)\n\n# Rebuild and test dataset\nrebuild = fn.multiply(dec.score, fn.transpose(dec.coeff))\nassert detail.test.matrix_matrix_allclose(dataset, rebuild)\n```\n\n## Under the hood\n\n`edamer`'s [functions][py-edamer-fn] are mostly geared towards compatibility with [MATLAB's API][matlab-help], because\nthe latter has a strong focus on mathematical notations, is properly documented and useful for rapid prototyping.\n\n`edamer` builds heavily upon C++ libraries [`hbrs-mpl`][hbrs-mpl] and [`Elemental`][elemental] which provide HPC-ready\ndata structures and algorithms for linear algebra and dimension reduction.\n\nThe full tech stack consists of:\n* [`Python 3`][python3-ref] for user code\n* [`C++17`][cpp-ref] for generic and efficient library code\n* [`pybind11`][pybind11-doc] for language interop between Python and C++\n* C++ library [`hbrs-mpl`][hbrs-mpl] ([GitHub.com][hbrs-mpl], [H-BRS GitLab][hbrs-gitlab-hbrs-mpl])\n* C++ library [`Elemental`][elemental]\n* C++ metaprogramming library [`Boost.Hana`][boost-hana-ref] to generate\n  [`pybind11`][pybind11-bindings-with-boost-hana] bindings\n* [MPI][wiki-mpi] and [`mpi4py`][mpi4py-ref] as building blocks for distributing computing\n* [`pytest`][pytest-doc] for unit tests, e.g. [`edamer.fn.transpose`][py-edamer-fn-transpose-pytest] and\n  [`edamer.fn.pca`][py-edamer-fn-pca-pytest]\n* [CMake 3][cmake3-tut] and [`hbrs-cmake`][hbrs-cmake] to [build, export and install our library](CMakeLists.txt)\n* [GitLab CI][hbrs-gitlab-py-edamer-ci] to continuously build and test our code\n\n### Status Quo\n\nSo far, `Elemental`'s data structures for non-distributed and distributed matrices and its corresponding wrappers from\n`hbrs-mpl` has been integrated with `NumPy`. For example, 2d NumPy arrays (matrices) can be converted into\nnon-distributed Elemental matrices and vice versa, without having to copy any matrix entry. Further, Elemental's MPI\ninterface has been integrated with `mpi4py`. This allows e.g. to define the MPI computation grid with mpi4py and then\nhand it over Elemental. This conversion is done implicitly, i.e. a custom adapter takes care of converting mpi4py\ncommunicators into MPI handles (as defined by the official MPI C API) that can be consumed by Elemental and vice versa.\nDistributed Elemental matrices can be constructed from a MPI computation grid and local matrices. All of\n[Elemental's matrix distributions][el-matrix-dists] are available in `edamer`, i.e. [`[MC,MR]`][el-dist-mc-mr],\n[`[STAR,STAR]`][el-dist-star-star] and [`[VC,STAR]`][el-dist-vc-star].\n\nThe functionality for the Python and C++ interop is heavily based on [`pybind11`][pybind11-doc] and\n[`Boost.Hana`][boost-hana-ref].\n\n## How to build, install and run code using `Docker` or `Podman`\n\nFor a quick and easy start into developing with Python and C++, a set of ready-to-use `Docker`/`Podman` images\n`jm1337/debian-dev-hbrs` and `jm1337/debian-dev-full` (supports more languages) has been created. They contain a full\ndevelopment system including all tools and libraries necessary to hack on distributed decomposition algorithms and more\n([Docker Hub][docker-hub-jm1337], [source files for Docker images][docker-artifacts]).\n\nSidenote:\n\u003e Creating the Docker images was tedious, especially because bugs ([`#959387`][debian-bug-959387],\n\u003e [`#972551`][debian-bug-972551]) in Debian's ParaView package (affected Ubuntu and derivates as well) had to be fixed\n\u003e or worked around, i.e. Debian's did not package the development files necessary to use e.g. ParaView Catalyst. But by\n\u003e now most of the proposed patches have been incorporated into Debian.\n\n### Install `Docker` or `Podman`\n\n* On `Debian 10 (Buster)` or `Debian 11 (Bullseye)` just run `sudo apt install docker.io`\n  or follow the [official install guide][docker-install-debian] for Docker Engine on Debian\n* On `Ubuntu 18.04 LTS (Bionic Beaver)` and `Ubuntu 20.04 LTS (Focal Fossa)` just run `sudo apt install docker.io`\n  (from `bionic/universe` and `focal/universe` repositories)\n  or follow the [official install guide][docker-install-ubuntu] for Docker Engine on Ubuntu\n* On `Windows 10` follow the [official install guide][docker-install-windows] for Docker Desktop on Windows\n* On `Mac` follow the [official install guide][docker-install-mac] for Docker Desktop on Mac\n* On `Fedora`, `Red Hat Enterprise Linux (RHEL)` and `CentOS` follow the [official install guide][podman-install] for\n  Podman\n\n### Setup and run container\n\n```sh\n# docker version 18.06.0-ce or later is recommended\ndocker --version\n\n# fetch docker image\ndocker pull jm1337/debian-dev-hbrs:bullseye\n\n# log into docker container\ndocker run -ti jm1337/debian-dev-hbrs:bullseye\n# or using a persistent home directory, e.g.\ndocker run -ti -v /HOST_DIR:/home/devil/ jm1337/debian-dev-hbrs:bullseye\n# or using a persistent home directory on Windows hosts, e.g.\ndocker run -ti -v C:\\YOUR_DIR:/home/devil/ jm1337/debian-dev-hbrs:bullseye\n```\n\nPodman strives for complete CLI compatibility with Docker, hence\n[you may use the `alias` command to create a `docker` alias for Podman][docker-to-podman-transition]:\n```sh\nalias docker=podman\n```\n\n### Build and run code inside container\n\nExecute the following commands within the `Docker`/`Podman` container:\n\n```sh\n# choose a compiler\nexport CC=clang-10\nexport CXX=clang++-10\n# or\nexport CC=gcc-10\nexport CXX=g++-10\n\n# fetch, compile and install prerequisites\ngit clone --depth 1 https://github.com/JM1/hbrs-cmake.git\ncd hbrs-cmake\nmkdir build \u0026\u0026 cd build/\n# install to non-system directory because sudo is not allowed in this docker container\ncmake \\\n    -DCMAKE_INSTALL_PREFIX=$HOME/.local \\\n    ..\nmake -j$(nproc)\nmake install\ncd ../../\n\ngit clone --depth 1 https://github.com/JM1/hbrs-mpl.git\ncd hbrs-mpl\nmkdir build \u0026\u0026 cd build/\ncmake \\\n -DCMAKE_INSTALL_PREFIX=$HOME/.local \\\n -DHBRS_MPL_ENABLE_ELEMENTAL=ON \\\n -DHBRS_MPL_ENABLE_MATLAB=OFF \\\n -DHBRS_MPL_ENABLE_TESTS=OFF \\\n -DHBRS_MPL_ENABLE_BENCHMARKS=OFF \\\n ..\nmake -j$(nproc)\nmake install\ncd ../../\n\n# fetch, compile and install python-edamer\ngit clone --depth 1 https://github.com/JM1/python-edamer.git\ncd python-edamer\nmkdir build \u0026\u0026 cd build/\ncmake \\\n    -DCMAKE_Python3_COMPILER_FORCED=ON \\\n    -DCMAKE_INSTALL_PREFIX=$HOME/.local \\\n    -DEDAMER_ENABLE_SCALAR_INT=ON \\\n    -DEDAMER_ENABLE_SCALAR_FLOAT=ON \\\n    -DEDAMER_ENABLE_SCALAR_DOUBLE=ON \\\n    -DEDAMER_ENABLE_SCALAR_COMPLEX_FLOAT=ON \\\n    -DEDAMER_ENABLE_SCALAR_COMPLEX_DOUBLE=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_CIRC_CIRC=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_MC_MR=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_MC_STAR=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_MD_STAR=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_MR_MC=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_MR_STAR=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_STAR_MC=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_STAR_MD=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_STAR_MR=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_STAR_STAR=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_STAR_VC=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_STAR_VR=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_VC_STAR=ON \\\n    -DEDAMER_ENABLE_MATRIX_DISTRIBUTION_VR_STAR=ON \\\n    -DEDAMER_ENABLE_TESTS=ON \\\n    -DMPIEXEC_MAX_NUMPROCS=2 \\\n    ..\nmake -j$(nproc)\n# If unit test dt_el_dist_matrix fails in function test_copy_redist due to zeros\n# in the upper matrix indices, then try to use a different MPI point-to-point\n# management layer, e.g. ob1 instead of ucx.\n#export OMPI_MCA_pml=ob1\nctest --verbose --output-on-failure\nmake install\n\nexport LD_LIBRARY_PATH=$HOME/.local/lib\nexport PYTHONPATH=$HOME/.local/lib/python3/dist-packages\npython3 -c \"from edamer import detail, dt, fn; print('All systems go')\"\n```\n\nFor more examples on how to build and test this code see [`.gitlab-ci.yml`](.gitlab-ci.yml).\n\n## Knowledge Base\n\n### Why does compilation take so much time and memory? The compiled library is several hundreds of megabytes large!!!\n\nCalling C++ functions from Python requires to declare and compile bindings with `pybind11` for all C++ function\nsignatures that should be callable from Python into the wrapper library. For example, the function\n[`multiply`][py-edamer-fn-multiply] must be bound for Elemental matrices with entry type\n[`int`, `float`, `double`, ...][py-edamer-dt-el-matrix-bindings].\nIf `multiply` is not wrapped for Elemental's matrices with `float` entries, then it cannot be used from Python.\nCurrently, `multiply` is wrapped for `int`, `float`, `double`, `complex\u003cfloat\u003e` and `complex\u003cdouble\u003e`. For\nElemental's non-distributed matrices, this results into five function overloads for `multiply` in Python:\n\n```\n1. multiply(a: ElMatrix_StdInt32T, b: ElMatrix_StdInt32T) -\u003e ElMatrix_StdInt32T\n2. multiply(a: ElMatrix_Float, b: ElMatrix_Float) -\u003e ElMatrix_Float\n3. multiply(a: ElMatrix_Double, b: ElMatrix_Double) -\u003e ElMatrix_Double\n4. multiply(a: ElMatrix_ElComplex_Float, b: ElMatrix_ElComplex_Float) -\u003e ElMatrix_ElComplex_Float\n5. multiply(a: ElMatrix_ElComplex_Double, b: ElMatrix_ElComplex_Double) -\u003e ElMatrix_ElComplex_Double\n```\n\nFor Elemental's distributed matrices it gets messy. For example, it should be possible to multiply a matrix with\n`[STAR,STAR]` distribution and a matrix with `[MC,MR]` distribution. Hence `multiply` must be provided for all\npossible combinations of matrix distributions, i.e. the cartesian product of `[int, float, double, ...]`,\n`[[STAR,STAR],[MC,MR],[MR,MC], ...]` and `[[STAR,STAR],[MC,MR],[MR,MC], ...]`. This results into another `845`(!)\nfunction overloads for `multiply`!\n\nFor each of these Python function overloads, a C++ compiler generates a separate code path, because\n[function templates in C++ get instantiated][cpp-ref-class-template]. Generic code in other languages such as Java, is\ncompiled differently, e.g. Java implements generics using type erasure and generates code just once for all generic\nfunctions. Both has advantages and disadvantages, i.e. a C++ compiler can apply optimizations a Java compiler cannot.\nBut with many template instantiations, C++ libraries might get huge in size. For all entry types and all matrix\ndistributions, the object file of `multiply` growths to `50MiB` in debug mode. The compilation and linking processes\ntake up to `6GiB` of RAM.\n\nTo reduce compilation time, memory usage and code size, irrelevant matrix entry types aka scalar types and matrix\ndistributions can be disabled at compile time using\n[CMake options `EDAMER_ENABLE_SCALAR_*` and `EDAMER_ENABLE_MATRIX_DISTRIBUTION_*`][py-edamer-cmake-options].\nBut beware that disabled matrix template instantiations cannot be used as function arguments and function return values!\nFor example, if `transpose` is applied to a matrix with `[MC,MR]` distribution, then `transpose` will return a matrix\nwith `[MR,MC]` distribution. The returned matrix can only be used if this matrix distribution has been compiled in.\nAccessing a return value with a type that has not been compiled in results in an runtime error.\n\n### Unit test `dt_el_dist_matrix` fails in function `test_copy_redist` due to zeros in the upper matrix indices!?\n\nTry to use a different MPI point-to-point management layer, e.g. `ob1` instead of `ucx`.\nFor example, set and export variable `OMPI_MCA_pml` before executing the unit tests:\n\n```sh\nexport OMPI_MCA_pml=ob1\nctest --verbose\n```\n\nReason for this error is still unknown. Till now, it only occurs sporadically and inside container\n`jm1337/debian-dev-hbrs:bullseye`.\n\n## License\n\nGNU Lesser General Public License v3.0 or later\n\nSee [LICENSE.md](LICENSE.md) to see the full text.\n\n## Author\n\nJakob Meng\n@jm1 ([GitHub.com][github-jm1], [Web][jm])\n\n[//]: # (References)\n\n[boost-hana]: https://github.com/boostorg/hana\n[boost-hana-ref]: https://boostorg.github.io/hana/\n[cmake3-tut]: https://cmake.org/cmake/help/latest/guide/tutorial/index.html\n[cpp-ref]: https://en.cppreference.com/w/cpp\n[cpp-ref-class-template]: https://en.cppreference.com/w/cpp/language/class_template\n[debian-bug-959387]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=959387\n[debian-bug-972551]: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=972551\n[docker-artifacts]: https://github.com/JM1/docker-artifacts\n[docker-hub-jm1337]: https://hub.docker.com/r/jm1337/\n[docker-install-debian]: https://docs.docker.com/engine/install/debian/\n[docker-install-mac]: https://docs.docker.com/docker-for-mac/install/\n[docker-install-ubuntu]: https://docs.docker.com/engine/install/ubuntu/\n[docker-install-windows]: https://docs.docker.com/docker-for-windows/install/\n[docker-to-podman-transition]: https://developers.redhat.com/blog/2020/11/19/transitioning-from-docker-to-podman/\n[elemental]: https://github.com/elemental/Elemental\n[el-matrix-dists]: https://github.com/elemental/elemental-web/blob/master/source/doc-dev/core/dist_matrix/DM.rst\n[el-dist-vc-star]: https://github.com/elemental/elemental-web/blob/master/source/doc-dev/core/dist_matrix/Element/VC_STAR.rst\n[el-dist-mc-mr]: https://github.com/elemental/elemental-web/blob/master/source/doc-dev/core/dist_matrix/Element/MC_MR.rst\n[el-dist-star-star]: https://github.com/elemental/elemental-web/blob/master/source/doc-dev/core/dist_matrix/Element/STAR_STAR.rst\n[fhg-gitlab-edamer]: https://gitlab.scai.fraunhofer.de/ndv/research/excellerat/edamer\n[fhg-gitlab-py-edamer]: https://gitlab.scai.fraunhofer.de/ndv/research/excellerat/edamer-python-library\n[fhg-scai]: https://www.scai.fraunhofer.de/\n[github-jm1]: https://github.com/jm1\n[hbrs-gitlab-hbrs-mpl]: https://git.inf.h-brs.de/jmeng2m/hbrs-mpl/\n[hbrs-gitlab-py-edamer]: https://git.inf.h-brs.de/jmeng2m/python-edamer\n[hbrs-gitlab-py-edamer-ci]: https://git.inf.h-brs.de/jmeng2m/python-edamer/-/pipelines\n[hbrs-cmake]: https://github.com/JM1/hbrs-cmake/\n[hbrs-mpl]: https://github.com/JM1/hbrs-mpl/\n[jm]: http://www.jakobmeng.de\n[matlab-help]: https://de.mathworks.com/help/\n[mpi4py-ref]: https://mpi4py.readthedocs.io/\n[nek5000]: https://nek5000.mcs.anl.gov/\n[podman-install]: https://podman.io/getting-started/installation\n[pv-catalyst-guide]: https://www.paraview.org/files/catalyst/docs/ParaViewCatalystUsersGuide_v2.pdf \"The ParaView Catalyst Users Guide v2\"\n[py-edamer]: https://github.com/JM1/python-edamer\n[py-edamer-cmake-options]: https://github.com/JM1/python-edamer/blob/master/CMakeLists.txt#L17\n[py-edamer-dt-el-matrix-bindings]: https://github.com/JM1/python-edamer/blob/master/src/edamer/dt/el_matrix/impl.cpp#L122\n[py-edamer-fn-multiply]: https://github.com/JM1/python-edamer/tree/master/src/edamer/fn/multiply\n[py-edamer-fn]: https://github.com/JM1/python-edamer/tree/master/src/edamer/fn\n[py-edamer-fn-pca-pytest]: https://github.com/JM1/python-edamer/blob/master/src/edamer/fn/pca/test/elemental.py\n[py-edamer-fn-transpose-pytest]: https://github.com/JM1/python-edamer/blob/master/src/edamer/fn/transpose/test/elemental.py\n[pybind11-doc]: https://pybind11.readthedocs.io/\n[pybind11-bindings-with-boost-hana]: https://github.com/jwbuurlage/pybind11_plus_hana\n[pytest-doc]: https://docs.pytest.org/\n[python3-ref]: https://docs.python.org/3/reference/\n[wiki-cpp17]: https://en.wikipedia.org/wiki/C++17\n[wiki-mpi]: https://en.wikipedia.org/wiki/Message_Passing_Interface\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjm1%2Fpython-edamer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjm1%2Fpython-edamer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjm1%2Fpython-edamer/lists"}