Skip to content

Commit cdcc1f8

Browse files
authored
Merge branch 'master' into mrcosts-clean
2 parents dcddd5b + c163a7a commit cdcc1f8

File tree

7 files changed

+85
-32
lines changed

7 files changed

+85
-32
lines changed

LICENSE.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
The MIT License (MIT)
22

3-
Copyright (c) 2017-2023 PyDMD contributors
3+
Copyright (c) 2017-2024 PyDMD contributors
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

README.md

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,20 @@
77
<a href="http://pydmd.github.io/PyDMD" target="_blank">
88
<img alt="Docs" src="https://img.shields.io/badge/PyDMD-docs-blue?style=for-the-badge"/>
99
</a>
10-
<a href="https://doi.org/10.21105/joss.00530" target="_blank">
11-
<img alt="JOSS DOI" src="https://img.shields.io/badge/JOSS-10.21105/joss.00530-blue?style=for-the-badge">
10+
<a href="https://pypi.org/project/pydmd/" target="_blank">
11+
<img alt="PyPI version" src="https://img.shields.io/pypi/v/pydmd?style=for-the-badge">
12+
</a>
13+
<a href="#dependencies-and-installation" target="_blank">
14+
<img alt="Python versions" src="https://img.shields.io/pypi/pyversions/PyDMD?style=for-the-badge">
1215
</a>
1316
<a href="https://github.com/PyDMD/PyDMD/blob/master/LICENSE" target="_blank">
1417
<img alt="Software License" src="https://img.shields.io/badge/license-MIT-brightgreen.svg?style=for-the-badge">
1518
</a>
16-
<a href="https://pypi.org/project/pydmd/" target="_blank">
17-
<img alt="PyPI version" src="https://img.shields.io/pypi/v/pydmd?style=for-the-badge">
18-
</a>
1919
<br>
2020
<a href="https://github.com/PyDMD/PyDMD/actions/workflows/deploy_after_push.yml" target="_blank">
2121
<img alt="CI Status" src="https://img.shields.io/github/actions/workflow/status/PyDMD/PyDMD/deploy_after_push.yml?style=for-the-badge">
2222
</a>
23-
<a href="https://www.codacy.com/gh/PyDMD/PyDMD/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=PyDMD/PyDMD&amp;utm_campaign=Badge_Coverage" target="_blank">
23+
<a href="https://app.codacy.com/gh/PyDMD/PyDMD/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_coverage" target="_blank">
2424
<img src="https://img.shields.io/codacy/coverage/3d8b278a835e402c86cac9625bb4912f/master?style=for-the-badge"/>
2525
</a>
2626
<a href="https://app.codacy.com/gh/PyDMD/PyDMD/dashboard?utm_source=gh&utm_medium=referral&utm_content=&utm_campaign=Badge_grade" target="_blank">
@@ -31,12 +31,17 @@
3131
</a>
3232
<br>
3333
<a href="#developers-and-contributors">
34-
<img alt="All Contributors" src="https://img.shields.io/badge/all_contributors-25-orange.svg?style=for-the-badge"/>
34+
<img alt="All Contributors" src="https://img.shields.io/github/contributors-anon/PyDMD/PyDMD?style=for-the-badge"/>
3535
</a>
3636
<a href="#stargazers">
3737
<img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/PyDMD/PyDMD?style=for-the-badge">
3838
</a>
39-
39+
<a href="#dependencies-and-installation" target="_blank">
40+
<img alt="PyPI downloads per month" src="https://img.shields.io/pypi/dm/PyDMD?label=pypi&logo=python&logoColor=yellow&style=for-the-badge">
41+
</a>
42+
<a href="https://doi.org/10.21105/joss.00530" target="_blank">
43+
<img alt="JOSS DOI" src="https://img.shields.io/badge/JOSS-10.21105/joss.00530-blue?style=for-the-badge">
44+
</a>
4045
</p>
4146

4247
## Table of contents
@@ -48,6 +53,7 @@
4853
* [References](#references)
4954
* [Developers and contributors](#developers-and-contributors)
5055
* [Funding](#funding)
56+
* [Affiliations](#affiliations)
5157

5258
## Description
5359

@@ -202,3 +208,10 @@ Beyond this, PyDMD has also been supported by some dedicated projects that have
202208
<p align="center">
203209
<img src="readme/logos_funding.png" width="800" />
204210
</p>
211+
212+
## Affiliations
213+
<p align="center">
214+
<a href="https://numfocus.org/sponsored-projects/affiliated-projects">
215+
<img src="readme/numfocus-affiliated-project.png" width="300" />
216+
</a>
217+
</p>

pydmd/mrdmd.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,26 @@ def partial_eigs(self, level, node=None):
386386
[self.dmd_tree[level, leaf].eigs for leaf in leaves]
387387
)
388388

389+
def partial_amplitudes(self, level, node=None):
390+
"""
391+
Return the amplitudes of the specific `level` and of the specific
392+
`node`; if `node` is not specified, the method returns the amplitudes
393+
of the given `level` (all the nodes).
394+
395+
:param int level: the index of the level from where the amplitudes are
396+
extracted.
397+
:param int node: the index of the node from where the amplitudes are
398+
extracted; if None, the amplitudes are extracted from all the
399+
nodes of the given level. Default is None.
400+
401+
:return: the selected eigs
402+
:rtype: numpy.ndarray
403+
"""
404+
leaves = self.dmd_tree.index_leaves(level) if node is None else [node]
405+
return np.concatenate(
406+
[self.dmd_tree[level, leaf].amplitudes for leaf in leaves]
407+
)
408+
389409
def partial_reconstructed_data(self, level, node=None):
390410
"""
391411
Return the reconstructed data computed using the modes and the time

pydmd/rdmd.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
Systems, 18, 2019.
88
"""
99

10-
1110
from .cdmd import CDMD
1211
from .utils import compute_rqb
1312

9.83 KB
Loading

tests/test_mrdmd.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,28 @@ def test_partial_eigs2():
233233
assert peigs.shape == (rank,)
234234

235235

236+
def test_partial_eigs1():
237+
max_level = 5
238+
level = 2
239+
rank = 2
240+
dmd = DMD(svd_rank=rank)
241+
mrdmd = MrDMD(dmd, max_level=max_level, max_cycles=2)
242+
mrdmd.fit(X=sample_data)
243+
pamps = mrdmd.partial_amplitudes(level)
244+
assert pamps.shape == (rank * 2**level,)
245+
246+
247+
def test_partial_eigs2():
248+
max_level = 5
249+
level = 2
250+
rank = 2
251+
dmd = DMD(svd_rank=rank)
252+
mrdmd = MrDMD(dmd, max_level=6, max_cycles=2)
253+
mrdmd.fit(X=sample_data)
254+
pamps = mrdmd.partial_amplitudes(level, 3)
255+
assert pamps.shape == (rank,)
256+
257+
236258
def test_partial_reconstructed1():
237259
max_level = 5
238260
level = 2

tutorials/README.md

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,27 @@
33
In this folder we collect several useful tutorials in order to understand the principles and the potential of **PyDMD**. Please read the following table for details about the tutorials.
44
An additional PDF tutorial ([DSWeb contest winner](https://dsweb.siam.org/The-Magazine/All-Issues/dsweb-2019-contest-tutorials-on-dynamical-systems-software)) is available [here](tutorial_dsweb.pdf).
55

6-
7-
| Name | Description | PyDMD used classes |
8-
|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------|-----------------------------|
9-
| Tutorial1&#160;[[.ipynb](tutorial1/tutorial-1-dmd.ipynb),&#160;[.py](tutorial1/tutorial-1-dmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial1dmd.html)] | Analyzing real, simple data sets with PyDMD | `pydmd.DMD`, `pydmd.BOPDMD` |
10-
| Tutorial2&#160;[[.ipynb](tutorial2/tutorial-2-adv-dmd.ipynb),&#160;[.py](tutorial2/tutorial-2-adv-dmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial2advdmd.html)] | advanced features of standard DMD | `pydmd.DMD` |
11-
| Tutorial3&#160;[[.ipynb](tutorial3/tutorial-3-mrdmd.ipynb),&#160;[.py](tutorial3/tutorial-3-mrdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial3mrdmd.html)] | multi-resolution DMD for transient phenomena | `pydmd.MrDMD` |
12-
| Tutorial4&#160;[[.ipynb](tutorial4/tutorial-4-cdmd.ipynb),&#160;[.py](tutorial4/tutorial-4-cdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial4cdmd.html)] | compress DMD for computation speedup | `pydmd.CDMD` |
13-
| Tutorial5&#160;[[.ipynb](tutorial5/tutorial-5-fbdmd.ipynb),&#160;[.py](tutorial5/tutorial-5-fbdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial5fbdmd.html)] | forward-backward DMD for CFD model analysis | `pydmd.FbDMD` |
14-
| Tutorial6&#160;[[.ipynb](tutorial6/tutorial-6-hodmd.ipynb),&#160;[.py](tutorial6/tutorial-6-hodmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial6hodmd.html)] | higher-order DMD applied to scalar time-series | `pydmd.HODMD` |
15-
| Tutorial7&#160;[[.ipynb](tutorial7/tutorial-7-dmdc.ipynb),&#160;[.py](tutorial7/tutorial-7-dmdc.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial7dmdc.html)] | DMD with control | `pydmd.DMDC` |
16-
| Tutorial8&#160;[[.ipynb](tutorial8/tutorial-8-comparisons.ipynb),&#160;[.py](tutorial8/tutorial-8-comparisons.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial8comparison.html)] | comparison between DMD and optimal closed-form DMD | `pydmd.OptDMD` |
17-
| Tutorial9&#160;[[.ipynb](tutorial9/tutorial-9-spdmd.ipynb),&#160;[.py](tutorial9/tutorial-9-spdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial9spdmd.html)] | sparsity-promoting DMD | `pydmd.SpDMD` |
18-
| Tutorial10&#160;[[.ipynb](tutorial10/tutorial-10-paramdmd.ipynb),&#160;[.py](tutorial10/tutorial-10-paramdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial10paramdmd.html)] | parametric DMD | `pydmd.ParametricDMD` |
19-
| Tutorial11&#160;[[.ipynb](tutorial10/tutorial-11-regularization.ipynb),&#160;[.py](tutorial11/tutorial-11-regularization.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial11regularization.html)] | Tikhonov regularization | `pydmd.DMDBase` |
20-
| Tutorial12&#160;[[.ipynb](tutorial12/tutorial-12-cdmd.ipynb),&#160;[.py](tutorial12/tutorial-12-cdmd.py)] | cDMD for background modeling | `pydmd.CDMD` |
21-
| Tutorial13&#160;[[.ipynb](tutorial13/tutorial-13-subspacedmd.ipynb),&#160;[.py](tutorial13/tutorial-13-subspacedmd.py)] | SubspaceDMD for locating eigenvalues of stochastic systems | `pydmd.SubspaceDMD` |
22-
| Tutorial14&#160;[[.ipynb](tutorial14/tutorial-14-bop-dmd.ipynb),&#160;[.py](tutorial14/tutorial-14-bop-dmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial14-bop-dmd.html)] | Comparison between Bagging-/ Optimized DMD and exact DMD | `pydmd.BOPDMD` |
23-
| Tutorial15&#160;[[.ipynb](tutorial15/tutorial-15-pidmd.ipynb),&#160;[.py](tutorial15/tutorial-15-pidmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial15-pidmd.html)] | Physics-informed DMD for manifold enforcement | `pydmd.PiDMD` |
24-
| Tutorial16&#160;[[.ipynb](tutorial16/tutorial-16-rdmd.ipynb),&#160;[.py](tutorial16/tutorial-16-rdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial16-rdmd.html)] | Randomized DMD for greater computation speedup | `pydmd.RDMD` |
25-
| Tutorial17&#160;[[.ipynb](tutorial17/tutorial-17-edmd.ipynb),&#160;[.py](tutorial17/tutorial-17-edmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial17-edmd.html)] | Extended DMD for nonlinear eigenfunction discovery | `pydmd.EDMD` |
26-
| Tutorial18&#160;[[.ipynb](tutorial18/tutorial-18-lando.ipynb),&#160;[.py](tutorial18/tutorial-18-lando.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial18-lando.html)] | LANDO for nonlinear system modeling | `pydmd.LANDO` |
27-
| Tutorial19&#160;[[.ipynb](tutorial19/tutorial-19-havok.ipynb),&#160;[.py](tutorial19/tutorial-19-havok.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial19-havok.html)] | HAVOK for modeling chaos with partial measurements | `pydmd.HAVOK` |
6+
| Name | Description | PyDMD used classes |
7+
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------|-----------------------|
8+
| Tutorial1&#160;[[.ipynb](tutorial1/tutorial-1-dmd.ipynb),&#160;[.py](tutorial1/tutorial-1-dmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial1dmd.html)] | Analyzing real, simple data sets with PyDMD | `pydmd.DMD`, `pydmd.BOPDMD` |
9+
| Tutorial2&#160;[[.ipynb](tutorial2/tutorial-2-adv-dmd.ipynb),&#160;[.py](tutorial2/tutorial-2-adv-dmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial2advdmd.html)] | advanced features of standard DMD | `pydmd.DMD` |
10+
| Tutorial3&#160;[[.ipynb](tutorial3/tutorial-3-mrdmd.ipynb),&#160;[.py](tutorial3/tutorial-3-mrdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial3mrdmd.html)] | multi-resolution DMD for transient phenomena | `pydmd.MrDMD` |
11+
| Tutorial4&#160;[[.ipynb](tutorial4/tutorial-4-cdmd.ipynb),&#160;[.py](tutorial4/tutorial-4-cdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial4cdmd.html)] | compress DMD for computation speedup | `pydmd.CDMD` |
12+
| Tutorial5&#160;[[.ipynb](tutorial5/tutorial-5-fbdmd.ipynb),&#160;[.py](tutorial5/tutorial-5-fbdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial5fbdmd.html)] | forward-backward DMD for CFD model analysis | `pydmd.FbDMD` |
13+
| Tutorial6&#160;[[.ipynb](tutorial6/tutorial-6-hodmd.ipynb),&#160;[.py](tutorial6/tutorial-6-hodmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial6hodmd.html)] | higher-order DMD applied to scalar time-series | `pydmd.HODMD` |
14+
| Tutorial7&#160;[[.ipynb](tutorial7/tutorial-7-dmdc.ipynb),&#160;[.py](tutorial7/tutorial-7-dmdc.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial7dmdc.html)] | DMD with control | `pydmd.DMDC` |
15+
| Tutorial8&#160;[[.ipynb](tutorial8/tutorial-8-comparisons.ipynb),&#160;[.py](tutorial8/tutorial-8-comparisons.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial8comparison.html)] | comparison between DMD and optimal closed-form DMD | `pydmd.OptDMD` |
16+
| Tutorial9&#160;[[.ipynb](tutorial9/tutorial-9-spdmd.ipynb),&#160;[.py](tutorial9/tutorial-9-spdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial9spdmd.html)] | sparsity-promoting DMD | `pydmd.SpDMD` |
17+
| Tutorial10&#160;[[.ipynb](tutorial10/tutorial-10-paramdmd.ipynb),&#160;[.py](tutorial10/tutorial-10-paramdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial10paramdmd.html)] | parametric DMD | `pydmd.ParametricDMD` |
18+
| Tutorial11&#160;[[.ipynb](tutorial11/tutorial-11-regularization.ipynb),&#160;[.py](tutorial11/tutorial-11-regularization.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial11regularization.html)] | Tikhonov regularization | `pydmd.DMDBase` |
19+
| Tutorial12&#160;[[.ipynb](tutorial12/tutorial-12-cdmd.ipynb),&#160;[.py](tutorial12/tutorial-12-cdmd.py)] | cDMD for background modeling | `pydmd.CDMD` |
20+
| Tutorial13&#160;[[.ipynb](tutorial13/tutorial-13-subspacedmd.ipynb),&#160;[.py](tutorial13/tutorial-13-subspacedmd.py)] | SubspaceDMD for locating eigenvalues of stochastic systems | `pydmd.SubspaceDMD` |
21+
| Tutorial14&#160;[[.ipynb](tutorial14/tutorial-14-bop-dmd.ipynb),&#160;[.py](tutorial14/tutorial-14-bop-dmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial14-bop-dmd.html)] | Comparison between Bagging-/ Optimized DMD and exact DMD | `pydmd.BOPDMD` |
22+
| Tutorial15&#160;[[.ipynb](tutorial15/tutorial-15-pidmd.ipynb),&#160;[.py](tutorial15/tutorial-15-pidmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial15-pidmd.html)] | Physics-informed DMD for manifold enforcement | `pydmd.PiDMD` |
23+
| Tutorial16&#160;[[.ipynb](tutorial16/tutorial-16-rdmd.ipynb),&#160;[.py](tutorial16/tutorial-16-rdmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial16-rdmd.html)] | Randomized DMD for greater computation speedup | `pydmd.RDMD` |
24+
| Tutorial17&#160;[[.ipynb](tutorial17/tutorial-17-edmd.ipynb),&#160;[.py](tutorial17/tutorial-17-edmd.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial17-edmd.html)] | Extended DMD for nonlinear eigenfunction discovery | `pydmd.EDMD` |
25+
| Tutorial18&#160;[[.ipynb](tutorial18/tutorial-18-lando.ipynb),&#160;[.py](tutorial18/tutorial-18-lando.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial18-lando.html)] | LANDO for nonlinear system modeling | `pydmd.LANDO` |
26+
| Tutorial19&#160;[[.ipynb](tutorial19/tutorial-19-havok.ipynb),&#160;[.py](tutorial19/tutorial-19-havok.py),&#160;[.html](http://pydmd.github.io/PyDMD/tutorial19-havok.html)] | HAVOK for modeling chaos with partial measurements | `pydmd.HAVOK` |
2827
| Tutorial20a&#160;[[.ipynb](tutorial20/costs-tutorial_toy-data.ipynb)] <br/><br/><br/><br/> | COSTS for decomposing toy data | `pydmd.COSTS` |
2928
| Tutorial20b&#160;[[.ipynb](tutorial20/costs-tutorial_real-data.ipynb)] <br/><br/><br/> | mrCOSTS for decomposing multi-scale physics of real, noisy data | `pydmd.mrCOSTS` |
3029

0 commit comments

Comments
 (0)