From a955d8c58c1173cb9b8dd1714dbce0f1890f243e Mon Sep 17 00:00:00 2001 From: Jonas Nicodemus Date: Wed, 27 Apr 2022 13:36:00 +0200 Subject: [PATCH] Initial commit --- .gitignore | 436 +++++++++++++++++++++++++++++ LICENSE | 21 ++ README.md | 88 ++++++ docs/Makefile | 20 ++ docs/make.bat | 35 +++ docs/requirements.txt | 4 + docs/source/algorithm.rst | 37 +++ docs/source/bibliography.rst | 8 + docs/source/conf.py | 130 +++++++++ docs/source/contact.rst | 10 + docs/source/index.rst | 46 +++ docs/source/linalg.rst | 37 +++ docs/source/model.rst | 29 ++ docs/source/modules.rst | 11 + docs/source/refs.bib | 23 ++ docs/source/system.rst | 21 ++ docs/source/utils.rst | 29 ++ requirements.txt | 5 + src/algorithm/__init__.py | 0 src/algorithm/phdmd.py | 224 +++++++++++++++ src/algorithm/skew_procrustes.py | 81 ++++++ src/algorithm/spsd_procrustes.py | 129 +++++++++ src/config.py | 90 ++++++ src/linalg/__init__.py | 1 + src/linalg/definiteness.py | 51 ++++ src/linalg/svd.py | 102 +++++++ src/linalg/symmetric.py | 105 +++++++ src/main.py | 106 +++++++ src/model/__init__.py | 1 + src/model/msd.py | 84 ++++++ src/model/poro.py | 95 +++++++ src/model/resources/poro-n1805.mat | Bin 0 -> 12520000 bytes src/model/resources/poro-n320.mat | Bin 0 -> 395272 bytes src/model/resources/poro-n980.mat | Bin 0 -> 3693160 bytes src/system/__init__.py | 0 src/system/phlti.py | 189 +++++++++++++ src/utils/__init__.py | 0 src/utils/norm.py | 41 +++ src/utils/plotting.py | 313 +++++++++++++++++++++ 39 files changed, 2602 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 docs/Makefile create mode 100644 docs/make.bat create mode 100644 docs/requirements.txt create mode 100644 docs/source/algorithm.rst create mode 100644 docs/source/bibliography.rst create mode 100644 docs/source/conf.py create mode 100644 docs/source/contact.rst create mode 100644 docs/source/index.rst create mode 100644 docs/source/linalg.rst create mode 100644 docs/source/model.rst create mode 100644 docs/source/modules.rst create mode 100755 docs/source/refs.bib create mode 100644 docs/source/system.rst create mode 100644 docs/source/utils.rst create mode 100644 requirements.txt create mode 100644 src/algorithm/__init__.py create mode 100644 src/algorithm/phdmd.py create mode 100644 src/algorithm/skew_procrustes.py create mode 100644 src/algorithm/spsd_procrustes.py create mode 100644 src/config.py create mode 100644 src/linalg/__init__.py create mode 100644 src/linalg/definiteness.py create mode 100644 src/linalg/svd.py create mode 100644 src/linalg/symmetric.py create mode 100644 src/main.py create mode 100644 src/model/__init__.py create mode 100644 src/model/msd.py create mode 100644 src/model/poro.py create mode 100644 src/model/resources/poro-n1805.mat create mode 100644 src/model/resources/poro-n320.mat create mode 100644 src/model/resources/poro-n980.mat create mode 100644 src/system/__init__.py create mode 100644 src/system/phlti.py create mode 100644 src/utils/__init__.py create mode 100644 src/utils/norm.py create mode 100644 src/utils/plotting.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3dba2f5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,436 @@ +### General ### +# Jetbrains +.idea + +# VS Code +.vscode + +# macOS +.DS_store + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +### LaTeX ### +## Core latex/pdflatex auxiliary files: +*.aux +*.lof +*.log +*.lot +*.fls +*.out +*.toc +*.fmt +*.fot +*.cb +*.cb2 +.*.lb + +## Intermediate documents: +*.dvi +*.xdv +*-converted-to.* +# these rules might exclude image files for figures etc. +# *.ps +# *.eps +# *.pdf + +## Generated if empty string is given at "Please type another file name for output:" +MorNU21.pdf +MorNU22.pdf + +## Bibliography auxiliary files (bibtex/biblatex/biber): +*.bbl +*.bcf +*.blg +*-blx.aux +*-blx.bib +*.run.xml + +## Build tool auxiliary files: +*.fdb_latexmk +*.synctex +*.synctex(busy) +*.synctex.gz +*.synctex.gz(busy) +*.pdfsync + +## Build tool directories for auxiliary files +# latexrun +latex.out/ + +## Auxiliary and intermediate files from other packages: +# algorithms +*.alg +*.loa + +# achemso +acs-*.bib + +# amsthm +*.thm + +# beamer +*.nav +*.pre +*.snm +*.vrb + +# changes +*.soc + +# comment +*.cut + +# cprotect +*.cpt + +# elsarticle (documentclass of Elsevier journals) +*.spl + +# endnotes +*.ent + +*.lox + +# feynmf/feynmp +*.mf +*.mp +*.t[1-9] +*.t[1-9][0-9] +*.tfm + +#(r)(e)ledmac/(r)(e)ledpar +*.end +*.?end +*.[1-9] +*.[1-9][0-9] +*.[1-9][0-9][0-9] +*.[1-9]R +*.[1-9][0-9]R +*.[1-9][0-9][0-9]R +*.eledsec[1-9] +*.eledsec[1-9]R +*.eledsec[1-9][0-9] +*.eledsec[1-9][0-9]R +*.eledsec[1-9][0-9][0-9] +*.eledsec[1-9][0-9][0-9]R + +# glossaries +*.acn +*.acr +*.glg +*.glo +*.gls +*.glsdefs +*.lzo +*.lzs + +# uncomment this for glossaries-extra (will ignore makeindex's style files!) +# *.ist + +# gnuplottex +*-gnuplottex-* + +# gregoriotex +*.gaux +*.glog +*.gtex + +# htlatex +*.4ct +*.4tc +*.idv +*.lg +*.trc +*.xref + +# hyperref +*.brf + +# knitr +*-concordance.tex +# Uncomment the next line if you use knitr and want to ignore its generated tikz files +# *.tikz +*-tikzDictionary + +# listings +*.lol + +# luatexja-ruby +*.ltjruby + +# makeidx +*.idx +*.ilg +*.ind + +# minitoc +*.maf +*.mlf +*.mlt +*.mtc[0-9]* +*.slf[0-9]* +*.slt[0-9]* +*.stc[0-9]* + +# minted +_minted* +*.pyg + +# morewrites +*.mw + +# newpax +*.newpax + +# nomencl +*.nlg +*.nlo +*.nls + +# pax +*.pax + +# pdfpcnotes +*.pdfpc + +# sagetex +*.sagetex.sage +*.sagetex.py +*.sagetex.scmd + +# scrwfile +*.wrt + +# sympy +*.sout +*.sympy +sympy-plots-for-*.tex/ + +# pdfcomment +*.upa +*.upb + +# pythontex +*.pytxcode +pythontex-files-*/ + +# tcolorbox +*.listing + +# thmtools +*.loe + +# TikZ & PGF +*.dpth +*.md5 +*.auxlock + +# todonotes +*.tdo + +# vhistory +*.hst +*.ver + +*.lod + +# xcolor +*.xcp + +# xmpincl +*.xmpi + +# xindy +*.xdy + +# xypic precompiled matrices and outlines +*.xyc +*.xyd + +# endfloat +*.ttt +*.fff + +# Latexian +TSWLatexianTemp* + +## Editors: +# WinEdt +*.bak +*.sav + +# Texpad +.texpadtmp + +# LyX +*.lyx~ + +# Kile +*.backup + +# gummi +.*.swp + +# KBibTeX +*~[0-9]* + +# TeXnicCenter +*.tps + +# auto folder when using emacs and auctex +./auto/* +*.el + +# expex forward references with \gathertags +*-tags.tex + +# standalone packages +*.sta + +# Makeindex log files +*.lpz + +# xwatermark package +*.xwm + +# REVTeX puts footnotes in the bibliography by default, unless the nofootinbib +# option is specified. Footnotes are the stored in a file with suffix Notes.bib. +# Uncomment the next line to have this generated file ignored. +#*Notes.bib + +### LaTeX Patch ### +# LIPIcs / OASIcs +*.vtc + +# glossaries +*.glstex diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..147b9fb --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Jonas Nicodemus + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ecc8286 --- /dev/null +++ b/README.md @@ -0,0 +1,88 @@ + + + + + + +# Port-Hamiltonian Dynamic Mode Decomposition + +We present a novel physics-informed system identification method to construct a passive linear time-invariant system. In more detail, for a given quadratic energy functional, measurements of the input, state, and output of a system in the time domain, we find a realization that approximates the data well while guaranteeing that the energy functional satisfies a dissipation inequality. To this end, we use the framework of port-Hamiltonian (pH) systems and modify the dynamic mode decomposition to be feasible for continuous-time pH systems. We propose an iterative numerical method to solve the corresponding least-squares minimization problem. We construct an effective initialization of the algorithm by studying the least-squares problem in a weighted norm, for which we present the analytical minimum-norm solution. The efficiency of the proposed method is demonstrated with several numerical examples. + + +
+

Table of Contents

+
    +
  1. + Citing +
  2. +
  3. + Installation +
  4. +
  5. Usage
  6. +
  7. License
  8. +
  9. Contact
  10. +
+
+ + + +## Installation +A python environment is required with at least **Python 3.10**. + +Install dependencies via `pip`: + ```sh + pip install -r requirements.txt + ``` + + +## Usage + +The executable script `main.py` executes the `pHDMD` algorithm for the current configuration, defined in `config.py`. Both files are located in `src`. + + +## Documentation + +Documentation is available [online][docs-url] +or you can build it yourself from inside the `docs` directory +by executing: + + make html + +This will generate HTML documentation in `docs/build/html`. +It is required to have the `sphinx` dependencies installed. This can be done by + + pip install -r requirements.txt + +within the `docs` directory. + + + +## License + +Distributed under the MIT License. See `LICENSE` for more information. + + +## Contact +Jonas Nicodemus - jonas.nicodemus@simtech.uni-stuttgart.de + +Benjamin Unger - benjamin.unger@simtech.uni-stuttgart.de\ +Riccardo Morandin - morandin@math.tu-berlin.de + +Project Link: [https://github.com/Jonas-Nicodemus/phdmd][project-url] + +[license-shield]: https://img.shields.io/github/license/Jonas-Nicodemus/phdmd.svg?style=for-the-badge +[license-url]: https://github.com/Jonas-Nicodemus/phdmd/blob/main/LICENSE +[linkedin-shield]: https://img.shields.io/badge/-LinkedIn-black.svg?style=for-the-badge&logo=linkedin&colorB=555 +[linkedin-url]: https://linkedin.com/in/jonas-nicodemus-a34931209/ +[doi-shield]: https://img.shields.io/badge/DOI-10.5281%20%2F%20zenodo.5520662-blue.svg?style=for-the-badge +[doi-url]: https://zenodo.org/badge/latestdoi/409099116 +[arxiv-shield]: https://img.shields.io/badge/arXiv-2109.10793-b31b1b.svg?style=for-the-badge +[arxiv-url]: https://arxiv.org/abs/2109.10793 +[project-url]:https://github.com/Jonas-Nicodemus/phdmd +[docs-url]:https://jonas-nicodemus.github.io/phdmd/ \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..d0c3cbf --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..dc1312a --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..56e0564 --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,4 @@ +Sphinx>=4.5.0 +sphinx-rtd-theme>=1.0.0 +sphinxcontrib-bibtex>=2.4.2 +sphinxcontrib-katex>=0.8.6 \ No newline at end of file diff --git a/docs/source/algorithm.rst b/docs/source/algorithm.rst new file mode 100644 index 0000000..be010af --- /dev/null +++ b/docs/source/algorithm.rst @@ -0,0 +1,37 @@ +algorithm package +================= + +Submodules +---------- + +algorithm.phdmd module +---------------------- + +.. automodule:: algorithm.phdmd + :members: + :undoc-members: + :show-inheritance: + +algorithm.skew\_procrustes module +--------------------------------- + +.. automodule:: algorithm.skew_procrustes + :members: + :undoc-members: + :show-inheritance: + +algorithm.spsd\_procrustes module +--------------------------------- + +.. automodule:: algorithm.spsd_procrustes + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: algorithm + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/bibliography.rst b/docs/source/bibliography.rst new file mode 100644 index 0000000..73b294f --- /dev/null +++ b/docs/source/bibliography.rst @@ -0,0 +1,8 @@ +************ +Bibliography +************ + +.. + see https://sphinxcontrib-bibtex.readthedocs.io/en/latest/usage.html for options + +.. bibliography:: diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..1b4a7bc --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,130 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../../src')) + + +# -- Project information ----------------------------------------------------- + +project = 'pHDMD' +copyright = '2022, Jonas Nicodemus' +author = 'Jonas Nicodemus' + +# The full version, including alpha/beta/rc tags +release = '1.0.0' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinxcontrib.katex', + 'sphinxcontrib.bibtex', +] + +import sphinxcontrib.katex as katex + +latex_macros = r""" + \def \i {\mathrm{i}} + \def \e #1{\mathrm{e}^{#1}} + \def \vec #1{\mathbf{#1}} + \def \x {\vec{x}} + \def \d {\operatorname{d}\!} + \def \dirac #1{\operatorname{\delta}\left(#1\right)} + \def \scalarprod #1#2{\left\langle#1,#2\right\rangle} + \def \timeStep {\delta_t} + \def \nrSnapshots {M} + \def \nrSnapshotsGen {\tilde{\nrSnapshots}} + \def \state {x} + \def \stateVar {\state} + \def \stateDim {n} + \def \stateDimRed {r} + \def \inpVar {u} + \def \inputVar {\inpVar} + \def \inpVarDim {m} + \def \inputDim {\inpVarDim} + \def \outVar {y} + \def \outputVar {\outVar} + \def \dmdV {X_+} + \def \dmdW {X_{-}} + \def \dmdY {Y} + \def \dmdU {U} + \def \dataZ {\mathcal{Z}} + \def \dataT {\mathcal{T}} + \def \dmdJJ {\widetilde{\mathcal{J}}} + \def \dmdRR {\widetilde{\mathcal{R}}} +""" + +# Translate LaTeX macros to KaTeX and add to options for HTML builder +katex_macros = katex.latex_defs_to_katex_macros(latex_macros) +katex_options = 'macros: {' + katex_macros + '}' + +# Add LaTeX macros for LATEX builder +latex_elements = {'preamble': latex_macros} + +bibtex_bibfiles = ['refs.bib'] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'sphinx_rtd_theme' + +# # Material theme options (see theme.conf for more information) +# html_theme_options = { +# +# # Set the name of the project to appear in the navigation. +# 'nav_title': 'pHDMD', +# +# # Set you GA account ID to enable tracking +# 'google_analytics_account': 'UA-XXXXX', +# +# # Specify a base_url used to generate sitemap.xml. If not +# # specified, then no sitemap will be built. +# 'base_url': 'https://project.github.io/project', +# +# # Set the color and the accent color +# 'color_primary': 'blue', +# 'color_accent': 'light-blue', +# +# # Set the repo location to get a badge with stats +# # TODO: change when release +# 'repo_url': 'https://github.com/Jonas-Nicodemus/crispy-pancake', +# 'repo_name': 'crispy-pancake', +# +# # Visible levels of the global TOC; -1 means unlimited +# 'globaltoc_depth': 3, +# # If False, expand all TOC entries +# 'globaltoc_collapse': False, +# # If True, show hidden TOC entries +# 'globaltoc_includehidden': False, +# } + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] \ No newline at end of file diff --git a/docs/source/contact.rst b/docs/source/contact.rst new file mode 100644 index 0000000..7a460e6 --- /dev/null +++ b/docs/source/contact.rst @@ -0,0 +1,10 @@ +Contact +======= + +Jonas Nicodemus - jonas.nicodemus@simtech.uni-stuttgart.de + +Benjamin Unger - benjamin.unger@simtech.uni-stuttgart.de + +Riccardo Morandin - morandin@math.tu-berlin.de + +Project link: https://github.com/Jonas-Nicodemus/phdmd \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..43258af --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,46 @@ +.. pHDMD documentation master file, created by + sphinx-quickstart on Thu Apr 21 11:21:24 2022. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Port-Hamiltonian Dynamic Mode Decomposition +=========================================== + +We present a novel physics-informed system identification method to construct +a passive linear time-invariant system. In more detail, for a given quadratic +energy functional, measurements of the input, state, and output of a system +in the time domain, we find a realization that approximates the data well +while guaranteeing that the energy functional satisfies a dissipation inequality. +To this end, we use the framework of port-Hamiltonian (pH) systems and modify +the dynamic mode decomposition to be feasible for continuous-time pH systems. +We propose an iterative numerical method to solve the corresponding least-squares +minimization problem. We construct an effective initialization of the algorithm +by studying the least-squares problem in a weighted norm, for which we present +the analytical minimum-norm solution. The efficiency of the proposed method is +demonstrated with several numerical examples. + +Citing +========= +If you use this project for academic work, please consider citing our +`Publication `_: + + R. Morandin, J. Nicodemus, and B. Unger + Port-Hamiltonian Dynamic Mode Decomposition + ArXiv e-print TODO, 2022. + + + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + modules + bibliography + contact + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/docs/source/linalg.rst b/docs/source/linalg.rst new file mode 100644 index 0000000..b531521 --- /dev/null +++ b/docs/source/linalg.rst @@ -0,0 +1,37 @@ +linalg package +============== + +Submodules +---------- + +linalg.definiteness module +-------------------------- + +.. automodule:: linalg.definiteness + :members: + :undoc-members: + :show-inheritance: + +linalg.svd module +----------------- + +.. automodule:: linalg.svd + :members: + :undoc-members: + :show-inheritance: + +linalg.symmetric module +----------------------- + +.. automodule:: linalg.symmetric + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: linalg + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/model.rst b/docs/source/model.rst new file mode 100644 index 0000000..9d6a5c5 --- /dev/null +++ b/docs/source/model.rst @@ -0,0 +1,29 @@ +model package +============= + +Submodules +---------- + +model.msd module +---------------- + +.. automodule:: model.msd + :members: + :undoc-members: + :show-inheritance: + +model.poro module +----------------- + +.. automodule:: model.poro + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: model + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/modules.rst b/docs/source/modules.rst new file mode 100644 index 0000000..58d11c3 --- /dev/null +++ b/docs/source/modules.rst @@ -0,0 +1,11 @@ +API Reference +============= + +.. toctree:: + :maxdepth: 4 + + algorithm + linalg + model + system + utils diff --git a/docs/source/refs.bib b/docs/source/refs.bib new file mode 100755 index 0000000..5b49a9d --- /dev/null +++ b/docs/source/refs.bib @@ -0,0 +1,23 @@ +@STRING{MathCompModDynSys = {Math. Comput. Model. Dyn. Sys.}} %Mathematical and Computer Modelling of Dynamical Systems} + +@article{AltMU21, + author = {{Altmann}, R. and {Mehrmann}, V. and {Unger}, B.}, + title = {Port-{H}amiltonian formulations of poroelastic network models}, + journal = MathCompModDynSys, + year = {2021}, + doi = {10.1080/13873954.2021.1975137}, + volume = {27}, + number = {1}, + pages = {429--452}, +} + +@Article{GugPBV12, + author = {Gugercin, S. and Polyuga, Rostyslav V. and Beattie, C. and {van der Schaft}, A.}, + title = {Structure-preserving tangential interpolation for model reduction of port-{H}amiltonian systems}, + journal = {Automatica}, + volume = {48}, + number = {9}, + pages = {1963--1974}, + year = {2012}, + doi = {10.1016/j.automatica.2012.05.052}, +} \ No newline at end of file diff --git a/docs/source/system.rst b/docs/source/system.rst new file mode 100644 index 0000000..2432f41 --- /dev/null +++ b/docs/source/system.rst @@ -0,0 +1,21 @@ +system package +============== + +Submodules +---------- + +system.phlti module +------------------- + +.. automodule:: system.phlti + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: system + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/source/utils.rst b/docs/source/utils.rst new file mode 100644 index 0000000..1033bb7 --- /dev/null +++ b/docs/source/utils.rst @@ -0,0 +1,29 @@ +utils package +============= + +Submodules +---------- + +utils.norm module +----------------- + +.. automodule:: utils.norm + :members: + :undoc-members: + :show-inheritance: + +utils.plotting module +--------------------- + +.. automodule:: utils.plotting + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: utils + :members: + :undoc-members: + :show-inheritance: diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..b18fa54 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +numpy >= 1.22.3 +scipy >= 1.8.0 +matplotlib >= 3.5.1 +pymor >= 2021.2.1 +slycot >= 0.4.0 \ No newline at end of file diff --git a/src/algorithm/__init__.py b/src/algorithm/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/algorithm/phdmd.py b/src/algorithm/phdmd.py new file mode 100644 index 0000000..b3933e5 --- /dev/null +++ b/src/algorithm/phdmd.py @@ -0,0 +1,224 @@ +import logging + +import numpy as np + +from algorithm.skew_procrustes import skew_procrustes +from linalg.definiteness import project_spsd +from linalg.svd import svd +from linalg.symmetric import skew + + +def phdmd(X, Y, U, delta_t, E, max_iter=20, delta=1e-10): + r""" + The pHDMD algorithm identifies a port-Hamiltonian system from state, output and input measurements. + + Define + + .. math:: + \begin{align*} + \dmdW &\vcentcolon= \tfrac{1}{\timeStep} + \begin{bmatrix} + \state_1-\state_0 & \ldots & \state_{\nrSnapshots} - \state_{\nrSnapshots-1} + \end{bmatrix}\in\R^{\stateDim\times\nrSnapshots},\\ + \dmdV &\vcentcolon= \tfrac{1}{2}\begin{bmatrix} + \state_1+\state_0 & \ldots & \state_{\nrSnapshots} + \state_{\nrSnapshots-1} + \end{bmatrix}\in\R^{\stateDim\times\nrSnapshots},\\ + \dmdU &\vcentcolon= \tfrac{1}{2}\begin{bmatrix} + \inpVar_1 + \inpVar_0 & \ldots & \inpVar_{\nrSnapshots} + \inpVar_{\nrSnapshots-1} + \end{bmatrix} \in\R^{\inpVarDim\times\nrSnapshots},\\ + \dmdY &\vcentcolon= \tfrac{1}{2}\begin{bmatrix} + \outVar_1 + \outVar_0 & \ldots & \outVar_{\nrSnapshots} + \outVar_{\nrSnapshots-1} + \end{bmatrix}\in\R^{\inpVarDim\times\nrSnapshots}, + \end{align*} + + and + + .. math:: + \dataZ \vcentcolon= \begin{bmatrix}H \dmdW \\ -\dmdY\end{bmatrix} \quad + \mathrm{and} \quad \dataT \vcentcolon= \begin{bmatrix}\dmdV \\ \dmdU\end{bmatrix}. + + Solve the minimization problem + + .. math:: + \min_{\mathcal{J},\mathcal{R}} \|Z - (\mathcal{J} - \mathcal{R}) T\|_F, + \quad \mathrm{s.t.} \quad \mathcal{J}=-\mathcal{J}^T, \mathcal{R}\in\mathbb{S}^{n}_{\succeq}. + + Parameters + ---------- + X : numpy.ndarray + Sequence of states. + Y : numpy.ndarray + Sequence of outputs. + U : numpy.ndarray + Sequence of inputs. + delta_t : float + Time step size. + E : numpy.ndarray + Hamiltonian matrix. + max_iter : int, optional + Maximum number of iterations. Default 20. + delta : float, optional + Convergence criteria. Default 1e-10. + + Returns + ------- + J : numpy.ndarray + Conservation of energy matrix. + R : numpy.ndarray + Dissipation matrix. + """ + W = (X[:, 1:] - X[:, :-1]) / delta_t + V = 1 / 2 * (X[:, 1:] + X[:, :-1]) + U = 1 / 2 * (U[:, 1:] + U[:, :-1]) + Y = 1 / 2 * (Y[:, 1:] + Y[:, :-1]) + + T = np.concatenate((V, U)) + Z = np.concatenate((E @ W, -Y)) + + # Fantastic initialization + J, R = init_phdmd(T, Z) + + J, R, e = phdmd_FGM(T, Z, J, R, max_iter, delta) + + return J, R + + +def init_phdmd(T, Z, tol=1e-12): + r""" + Returns an initialization for the pHDMD algorithm by solving the related weighted minimization problem + + .. math:: + \min_{\mathcal{J},\mathcal{R}} \|T^TZ - T^T(\mathcal{J} - \mathcal{R}) T\|_F, + \quad \mathrm{s.t.} \quad \mathcal{J}=-\mathcal{J}^T, \mathcal{R}\in\mathbb{S}^{n}_{\succeq}. + + Parameters + ---------- + T : numpy.ndarray + Stacked data matrix + Z : numpy.ndarray + Stacked data matrix + tol : float, optional + Zero tolerance. + + Returns + ------- + J : numpy.ndarray + Conservation of energy matrix. + R : numpy.ndarray + Dissipation matrix. + """ + + n, m = T.shape + + U, s, V = svd(T) + r = np.argmax(s / s[0] < tol) + r = r if r > 0 else len(s) + s = s[:r] + + S = np.diag(s) + S_inv = np.diag(1 / s) + + if r < n: + logging.warning(f'Rank(T) < n + m ({r} < {n})') + + Z_1 = U.T @ Z @ V + + J_11 = skew(S @ Z_1[:r, :r]) + R_11 = project_spsd(-S @ Z_1[:r, :r]) + + R = U[:, :r] @ S_inv @ R_11 @ S_inv @ U[:, :r].T + J = U[:, :r] @ S_inv @ J_11 @ S_inv @ U[:, :r].T + + if r < n: + # compensate rank deficit + J_21 = np.linalg.lstsq(np.diag(s), Z_1[r:, :r].T, rcond=None)[0].T + J_cmp = np.zeros((n, n)) + J_cmp[r:, :r] = J_21 + J_cmp[:r, r:] = -J_21.T + J = J + U @ J_cmp @ U.T + + return J, R + + +def phdmd_FGM(T, Z, J0, R0, max_iter=20, delta=1e-10): + r""" + Iterative algorithm to solve the pHDMD problem via a fast-gradient method. + + Parameters + ---------- + T : numpy.ndarray + Stacked data matrix. + Z : numpy.ndarray + Stacked data matrix. + J0 : numpy.ndarray + Initial matrix for `J`. + R0 : numpy.ndarray + Initial matrix for `R`. + max_iter : int, optional + Maximum number of iterations. Default 20. + delta : float, optional + Convergence criteria. Default 1e-10. + + Returns + ------- + J : numpy.ndarray + Conservation of energy matrix. + R : numpy.ndarray + Dissipation matrix. + e : numpy.ndarray + Value of the cost functional at each iteration. + """ + R = R0 + J = J0 + + # Precomputations + TTt = T @ T.T + w, _ = np.linalg.eigh(TTt) + L = max(w) # Lipschitz constant + mu = min(w) + q = mu / L + + beta = np.zeros(max_iter) + alpha = np.zeros(max_iter) + e = np.zeros(max_iter) + + # Parameters and initialization + alpha_0 = 0.1 # Parameter of the FGM in (0,1) - can be tuned. + + Q = R + alpha[0] = alpha_0 + e[0] = np.linalg.norm(Z - (J - R) @ T, 'fro') / np.linalg.norm(Z) + logging.info(f'|Z - (J^(0) - R^(0) T|_F / |Z|_F={e[0]:.2e}') + + for i in range(max_iter): + # Previous iterate + Rp = R + Jp = J + + Z_1 = Z + R @ T + # Solution of the skew-symmetric Procrustes + J, _ = skew_procrustes(T, Z_1) + + Z_2 = J @ T - Z + # Projected gradient step from Y + G = Q @ TTt - Z_2 @ T.T + R = project_spsd(Q - G / L) + + # FGM Coefficients + alpha[i + 1] = (np.sqrt((alpha[i] ** 2 - q) ** 2 + 4 * alpha[i] ** 2) + (q - alpha[i] ** 2)) / 2 + beta[i + 1] = alpha[i] * (1 - alpha[i]) / (alpha[i] ** 2 + alpha[i + 1]) + + # Linear combination of iterates + Q = R + beta[i] * (R - Rp) + + e[i + 1] = np.linalg.norm(Z - (J - R) @ T, 'fro') / np.linalg.norm(Z) + logging.info(f'|Z - (J^({i + 1}) - R^({i + 1}) T|_F / |Z|_F={e[i + 1]:.2e}') + + eps = np.linalg.norm(Jp - J, 'fro') / (np.linalg.norm(J, 'fro')) + \ + np.linalg.norm(Rp - R, 'fro') / (np.linalg.norm(R, 'fro')) + if eps < delta or e[i] - e[i + 1] < delta: + e = e[:i+2] + logging.info(f'Converged after {i + 1} iterations.') + break + + return J, R, e diff --git a/src/algorithm/skew_procrustes.py b/src/algorithm/skew_procrustes.py new file mode 100644 index 0000000..5c22260 --- /dev/null +++ b/src/algorithm/skew_procrustes.py @@ -0,0 +1,81 @@ +import logging + +import numpy as np + +from linalg.svd import svd + + +def skew_procrustes(X, Y, trunc_tol=1e-12, zero_tol=1e-14): + r""" + Solves the skew-symmetric Procrustes problem + + .. math:: + \min_{A} \|Y - AX\|_F \quad s.t. \quad A = -A^T. + + Parameters + ---------- + X : numpy.ndarray + Matrix. + Y : numpy.ndarray + Matrix. + Returns + ------- + A : numpy.ndarray + The minimizer of the skew-symmetric Procrustes problem. + e : float + Error of the skew-symmetric Procrustes problem. + """ + + n = X.shape[0] + U, s, V = svd(X) + r = np.argmax(s / s[0] < trunc_tol) + r = r if r > 0 else len(s) + + s = s[:r] + + Z_transform = U.T @ Y @ V + Z1 = Z_transform[:r, :r] + Z3 = Z_transform[r:, :r] + + # Assemble Phi + [ii, jj] = np.mgrid[:r, :r] + tmp = np.square(s[ii]) + np.square(s[jj]) + Phi = 1. / tmp + + A1 = Phi * (Z1 @ np.diag(s) - np.diag(s) @ Z1.T) + + A2 = -np.linalg.solve(np.diag(s), Z3.T) + A4 = np.zeros((n - r, n - r)) + + A = U @ np.array(np.concatenate( + (np.hstack((A1, A2)), np.hstack((-A2.T, A4))) + )) @ U.T + + max_A = np.amax(np.abs(A)) + indices = np.where(np.abs(A) / max_A < zero_tol) + A[indices] = 0 + + e = np.linalg.norm(A @ X - Y, 'fro') + + return A, e + + +if __name__ == "__main__": + logging.basicConfig() + logging.getLogger().setLevel(logging.INFO) + + n = 6 + M = 500 + A = np.random.random((n, n)) + A = (A - A.T) / 2 + + X = np.random.random((n, M)) + r = np.linalg.matrix_rank(X) + + Y = A @ X + + X_res, res = skew_procrustes(X, Y) + + logging.info(f'Error of the skew symmetric Procrustes ||A @ X - Y||_F:\t{res:.2e}') + + assert res <= 1e-2 diff --git a/src/algorithm/spsd_procrustes.py b/src/algorithm/spsd_procrustes.py new file mode 100644 index 0000000..67508f9 --- /dev/null +++ b/src/algorithm/spsd_procrustes.py @@ -0,0 +1,129 @@ +import logging + +import matplotlib.pyplot as plt +import numpy as np + +from linalg.definiteness import project_spsd + + +def spsd_procrustes(X, Y, A0=None, max_iter=1000): + """ + Solves the symmetric positive semi-definite Procrustes problem via the fast-gradient method + + .. math:: + \min_{A} \| Y - A X \|_F \quad s.t. \quad A\in\mathbb{S}^{n}_{\succeq}. + + Parameters + ---------- + X : numpy.ndarray + Matrix. + Y : numpy.ndarray + Matrix. + A0 : numpy.ndarraym, optional + Initial matrix for `A`. Default `None`. + max_iter : int, optional + Maximum number of iterations. Default 1000. + + Returns + ------- + A : numpy.ndarray + Symmetric positive-definite matrix that (most) closely maps `X` to `Y`. + e : float + Remaining error of the symmetric positive-definite Procrustes problem. + """ + if A0 is None: + A0, _ = init_spsd_procrustes(X, Y) + + A = A0 + + # Precomputations + XXt = X @ X.T + x, _ = np.linalg.eigh(XXt) + Lx = max(x) # Lipschitz constant + mux = min(x) + qx = mux / Lx + YXt = Y @ X.T + + # Parameters and initalization + alpha0 = 0.1 # Parameter of the FGM in (0,1) -it can be tuned. + + beta = np.zeros(max_iter) + alpha = np.zeros(max_iter + 1) + e = np.zeros(max_iter + 1) + + B = A + alpha[0] = alpha0 + e[0] = np.linalg.norm(A @ X - Y, 'fro') + + for i in range(max_iter): + # Previous iterate + Ap = A + + # Projected gradient step from Y + A = project_spsd(B - (B @ XXt - YXt) / Lx) + + # FGM Coefficients + alpha[i + 1] = (np.sqrt((alpha[i] ** 2 - qx) ** 2 + 4 * alpha[i] ** 2) + (qx - alpha[i] ** 2)) / 2 + beta[i] = alpha[i] * (1 - alpha[i]) / (alpha[i] ** 2 + alpha[i + 1]) + + # Linear combination of iterates + B = A + beta[i] * (A - Ap) + + e[i + 1] = np.linalg.norm(A @ X - Y, 'fro') + + return A, e + + +def init_spsd_procrustes(X, Y): + """ + Returns an initialization of the symmetric positive semi-definite Procrustes problem. + + Parameters + ---------- + X : numpy.ndarray + Matrix. + Y : numpy.ndarray + Matrix. + + Returns + ------- + A0 : numpy.ndarray + Initial matrix for `A` for the Symmetric positive-definite Procrustes problem. + e0 : float + Error for the initial matrix `A` of the symmetric positive-definite Procrustes problem. + """ + n = Y.shape[0] + + A0 = np.zeros((n, n)) + for i in range(n): + A0[i, i] = max(0, X[i, :] @ Y[i, :].T) / np.linalg.norm(X[i, :]) ** 2 + 1e-6 + + e0 = np.linalg.norm(A0 @ X - Y, 'fro') + + return A0, e0 + + +if __name__ == "__main__": + logging.basicConfig() + logging.getLogger().setLevel(logging.INFO) + + n = 100 + m = 1200 + + A = np.random.randn(n, n) + A = 1 / 2 * (A + A.T) + A = A + n * np.eye(n) + + X = np.random.randn(n, m) + Y = A @ X + + A0 = None + + A_proc, e = spsd_procrustes(X, Y, A0=A0, max_iter=200) + + e_rel = e / np.linalg.norm(Y, 'fro') + plt.semilogy(e_rel) + plt.show() + + logging.info(f'||Y - AX||_F = {e[-1]:.2e}') + logging.info(f'||Y - AX||_F / ||Y||_F = {e_rel[-1]:.2e}') diff --git a/src/config.py b/src/config.py new file mode 100644 index 0000000..0d294eb --- /dev/null +++ b/src/config.py @@ -0,0 +1,90 @@ +import os + +import numpy as np + +from scipy.signal import sawtooth + +from model.msd import msd +from model.poro import poro + +save_results = False # If true all figures will be saved as pgf plots +figures_path = os.path.join('../figures') + +match 1: # 1 - SISO MSD with few data, 2 - MIMO MSD with few data, 3 - MIMO MSD with many data, 4 - PORO + case 1: # SISO MSD with few data + model = 'msd' # msd, poro + n = 6 + m = 1 + ph_matrices = lambda: msd(n, m) + u = lambda t: np.exp(-0.5 * t) * np.sin(t ** 2) + exp_id = model + f'_n_{n}_m_{m}' + + x0 = np.zeros(n) + N = 100 + T_end = 4 + T = np.linspace(0, T_end, N) + delta = T[1] - T[0] + + T_test = np.linspace(0, 10, 1000) + freq = 0.5 # Hz + u_test = lambda t: sawtooth(2 * np.pi * freq * t) + + case 2: # MIMO MSD with few data + model = 'msd' # msd, poro + n = 100 + m = 2 + ph_matrices = lambda: msd(n, m) + factor = 100 + u = lambda t: np.array([np.exp(-0.5 * t) * np.sin(t ** 2), + np.exp(-0.5 * t) * np.cos(t ** 2)]) + exp_id = model + f'_n_{n}_m_{m}_short' + + x0 = np.zeros(n) + N = 100 + T_end = 4 + T = np.linspace(0, T_end, N) + delta = T[1] - T[0] + + T_test = np.linspace(0, 10, 1000) + freq = 0.5 # Hz + u_test = lambda t: np.array([sawtooth(2 * np.pi * freq * t), - sawtooth(2 * np.pi * freq * t)]) + + case 3: # MIMO MSD with many data + model = 'msd' # msd, poro + n = 100 + m = 2 + ph_matrices = lambda: msd(n, m) + factor = 100 + u = lambda t: np.array([np.exp(-0.5 / factor * t) * np.sin(1 / factor * t ** 2), + np.exp(-0.5 / factor * t) * np.cos(1 / factor * t ** 2)]) + exp_id = model + f'_n_{n}_m_{m}_long' + + x0 = np.zeros(n) + N = 100 * factor + T_end = 4 * factor + T = np.linspace(0, T_end, N) + delta = T[1] - T[0] + + T_test = np.linspace(0, 10, 1000) + freq = 0.5 # Hz + u_test = lambda t: np.array([sawtooth(2 * np.pi * freq * t), - sawtooth(2 * np.pi * freq * t)]) + + case 4: # PORO + model = 'poro' # msd, poro + n = 980 + m = 2 + ph_matrices = lambda: poro(n) + factor = 100 + u = lambda t: np.array([np.exp(-0.5 / factor * t) * np.sin(1 / factor * t ** 2), + np.exp(-0.5 / factor * t) * np.cos(1 / factor * t ** 2)]) + exp_id = model + f'_n_{n}_m_{m}' + + x0 = np.zeros(n) + N = 100 * factor + T_end = 4 * factor + T = np.linspace(0, T_end, N) + delta = T[1] - T[0] + + T_test = np.linspace(0, 10, 10000) + freq = 0.5 # Hz + u_test = lambda t: np.array([sawtooth(2 * np.pi * freq * t), - sawtooth(2 * np.pi * freq * t)]) diff --git a/src/linalg/__init__.py b/src/linalg/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/linalg/__init__.py @@ -0,0 +1 @@ + diff --git a/src/linalg/definiteness.py b/src/linalg/definiteness.py new file mode 100644 index 0000000..30ca2e7 --- /dev/null +++ b/src/linalg/definiteness.py @@ -0,0 +1,51 @@ +import numpy as np + +from linalg.symmetric import is_sym, sym + + +def is_spsd(A): + """ + Checks if a matrix is symmetric positive semi-definite. + + Parameters + ---------- + A : numpy.ndarray + The matrix to check for symmetric positive semi-definiteness. + + Returns + ------- + is_spsd : bool + `True` if `A` is symmetric positive semi-definiteness, else `False`. + """ + if is_sym(A): + try: + np.linalg.cholesky(A) + return True + except np.linalg.LinAlgError: + A += 1e-5 * np.eye(A.shape[0]) + try: + np.linalg.cholesky(A) + return True + except np.linalg.LinAlgError: + return False + else: + return False + + +def project_spsd(A): + """ + Projects a matrix on the set of symmetric positive semi-definite matrices. + + Parameters + ---------- + A : array_like + The matrix to project on the set of symmetric positive semi-definite matrices. + + Returns + ------- + A_spsd : numpy.ndarray + The projected symmetric positive semi-definite matrix. + """ + w, U = np.linalg.eigh(sym(A)) + + return U @ np.diag(w.clip(min=0)) @ U.T diff --git a/src/linalg/svd.py b/src/linalg/svd.py new file mode 100644 index 0000000..7c93812 --- /dev/null +++ b/src/linalg/svd.py @@ -0,0 +1,102 @@ +import numpy as np + + +def svd(A, hermitian=False, variant=None, tol=1e-12, t=None): + """ + Wrapper around `numpy.svd` to perform the four variants of the singular value decomposition + (https://en.wikipedia.org/wiki/Singular_value_decomposition). + + Parameters + ---------- + A : numpy.ndarray + A real or complex matrix to perform the svd on. + hermitian : bool, optional + If True, `A` is assumed to be Hermitian (symmetric if real-valued), + enabling a more efficient method for finding singular values. + Defaults to False. + variant : str, optional + Variant of the svd. Should be one of + + - 'full' + - 'thin' + - 'skinny' + - 'trunc' + tol : float, optional + In the case of 'skinny' the zero tolerance and in the case of 'trunc' the truncation tolerance. + t : int, optional + In the case of 'trunc' the truncation index. + + Returns + ------- + U : numpy.ndarray + Left singular vectors. + s : numpy.ndarray + Singular values. + V : numpy.ndarray + Right singular vectors. + """ + U, s, Vh = np.linalg.svd(A, hermitian=hermitian) + V = Vh.conj().T + + match variant: + case 'full': + pass + case 'thin': + n, m = A.shape + k = min(n, m) + U = U[:, :k] + V = V[:, :k] + case 'skinny': + r = np.argmax(s / s[0] < tol) + r = r if r > 0 else len(s) + U = U[:, :r] + V = V[:, :r] + s = s[:r] + case 'trunc': + t = np.argmax(s / s[0] < tol) if t is None else t + t = t if t > 0 else len(s) + U = U[:, :t] + V = V[:, :t] + s = s[:t] + case None: + pass + + return U, s, V + + +if __name__ == "__main__": + n = 10 + m = 100 + A = np.random.randint(10, size=(n, m)) + A[-1] = 0 + r = np.linalg.matrix_rank(A) + assert r == 9 + + U, s, V = svd(A) + assert U.shape == (n, n) + assert V.shape == (m, m) + assert len(s) == n + + U, s, V = svd(A, variant='thin') + assert U.shape == (n, n) + assert V.shape == (m, n) + assert len(s) == n + + U, s, V = svd(A, variant='skinny') + assert U.shape == (n, r) + assert V.shape == (m, r) + assert len(s) == r + + t = 5 + U, s, V = svd(A, variant='trunc', t=t) + assert U.shape == (n, t) + assert V.shape == (m, t) + assert len(s) == t + + + + + + + + diff --git a/src/linalg/symmetric.py b/src/linalg/symmetric.py new file mode 100644 index 0000000..78da3ad --- /dev/null +++ b/src/linalg/symmetric.py @@ -0,0 +1,105 @@ +import numpy as np + + +def toeplitz(A): + r""" + Toeplitz decomposition. + + Returns the symmetric and skew-symmetric part, + + .. math:: + + S = \tfrac{1}{2} (A + A^T),\quad N = \tfrac{1}{2} (A - A^T) + + of a square matrix :math:`A`. + + Parameters + ---------- + A : numpy.ndarray + Square matrix to split in symmetric and skew-symmetric part. + + Returns + ------- + S : numpy.ndarray + Symmetric part of `A`. + N : numpy.ndarray + Skew-symmetric part of `A`. + """ + return sym(A), skew(A) + + +def sym(A): + """ + Symmetric part of a square matrix `A`. + + Parameters + ---------- + A : numpy.ndarray + Square matrix. + + Returns + ------- + S : numpy.ndarray + Symmetric part of `A`. + """ + return 1 / 2 * (A + A.T) + + +def skew(A): + """ + Skew-symmetric part of a square matrix `A`. + + Parameters + ---------- + A : numpy.ndarray + Square matrix. + + Returns + ------- + N : numpy.ndarray + Skew-symmetric part of `A`. + """ + return 1 / 2 * (A - A.T) + + +def is_sym(A, rtol=1e-05, atol=1e-08): + """ + Checks if a square matrix `A` is symmetric. + + Parameters + ---------- + A : numpy.ndarray + Square matrix. + + Returns + ------- + is_sym : bool + `True` if `A` is symmetric, else `False`. + """ + return np.allclose(A, A.T, rtol=rtol, atol=atol) + + +def is_skew(A, rtol=1e-05, atol=1e-08): + """ + Checks if a square matrix `A` is skew-symmetric. + + Parameters + ---------- + A : numpy.ndarray + Square matrix. + + Returns + ------- + is_sym : bool + `True` if `A` is skew-symmetric, else `False`. + """ + return np.allclose(A, -A.T, rtol=rtol, atol=atol) + + +if __name__ == "__main__": + n = 5 + A = np.random.random((n, n)) + + A_sym, A_skew = toeplitz(A) + + assert is_sym(A_sym) and is_skew(A_skew) diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..70542ce --- /dev/null +++ b/src/main.py @@ -0,0 +1,106 @@ +import logging +import os +import config + +import numpy as np + +from algorithm.phdmd import phdmd +from system.phlti import PHLTI +from utils.norm import lnorm +from utils.plotting import trajectories_plot, abs_error_plot, bode_plot, magnitude_plot, poles_plot + + +def main(): + logging.basicConfig() + logging.getLogger().setLevel(logging.INFO) + + if config.save_results: + import matplotlib + matplotlib.use("pgf") + matplotlib.rcParams.update({ + "pgf.texsystem": "pdflatex", + 'font.family': 'serif', + 'text.usetex': True, + 'pgf.rcfonts': False, + }) + + if not os.path.exists(config.figures_path): + os.makedirs(config.figures_path) + + # Initialize the original ph system + E, J, R, G, P, D, Q = config.ph_matrices() + + ph = PHLTI(E, J, R, G, P, D, Q) + lti = ph.to_lti(matrices=False) + + # Generate training data + U_train, X_train, Y_train = ph.sim(config.u, config.T, config.x0) + + trajectories_plot(config.T, U_train, label='u', train=True) + trajectories_plot(config.T, Y_train, train=True) + + # Perform pHDMD + J_dmd, R_dmd = phdmd(X_train, Y_train, U_train, config.delta, + E=ph.E, max_iter=100) + ph_dmd = PHLTI(ph.E, J_dmd, R_dmd) + + # Testing + U_train_dmd, X_train_dmd, Y_train_dmd = ph_dmd.sim(config.u, config.T, config.x0) + U_test, X_test, Y_test = ph.sim(config.u_test, config.T_test, config.x0) + U_dmd, X_dmd, Y_dmd = ph_dmd.sim(config.u_test, config.T_test, config.x0) + + # Error lti system + lti_dmd = ph_dmd.to_lti(matrices=False) + lti_error = lti - lti_dmd + + # Trajectories + trajectories_plot(config.T_test, U_test, label='u') + trajectories_plot(config.T_test, Y_test, Y_dmd) + + # Absolute Error of the trajectories + abs_error_plot(config.T_test, Y_test, Y_dmd) + + # Only first part of the trajectories + trajectories_plot(config.T_test, Y_test, Y_dmd, zoom=100) + abs_error_plot(config.T_test, Y_test, Y_dmd, zoom=100) + + # Bode + w = np.logspace(-1, 3, 100) + bode_plot(w, lti, lti_dmd) + + # Magnitude error system + magnitude_plot(w, lti_error) + + # Poles + poles_plot(lti, lti_dmd) + + # Norms + l2_train = lnorm(Y_train - Y_train_dmd, p=2, tau=config.delta) + l2_rel_train = l2_train / lnorm(Y_train, p=2, tau=config.delta) + logging.info(f'Relative L2 error (Training data): {l2_rel_train:.2e}') + + linf_train = lnorm(Y_train - Y_train_dmd, p=np.inf, tau=config.delta) + linf_rel_train = linf_train / lnorm(Y_train, p=np.inf, tau=config.delta) + logging.info(f'Relative Linf error (Training data): {linf_rel_train:.2e}') + + l2 = lnorm(Y_test - Y_dmd, p=2, tau=config.delta) + l2_rel = l2 / lnorm(Y_test, p=2, tau=config.delta) + logging.info(f'Relative L2 error: {l2_rel:.2e}') + + linf_train = lnorm(Y_test - Y_dmd, p=np.inf, tau=config.delta) + linf_rel = linf_train / lnorm(Y_test, p=np.inf, tau=config.delta) + logging.info(f'Relative Linf error: {linf_rel:.2e}') + + # H-norm calculation fails for the poro benchmark system + if config.model != 'poro': + h2 = lti_error.h2_norm() + h2_rel = h2 / lti.h2_norm() + logging.info(f'Relative H2 error: {h2_rel:.2e}') + + hinf = lti_error.hinf_norm() + hinf_rel = hinf / lti.hinf_norm() + logging.info(f'Relative Hinf error: {hinf_rel:.2e}') + + +if __name__ == "__main__": + main() diff --git a/src/model/__init__.py b/src/model/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/src/model/__init__.py @@ -0,0 +1 @@ + diff --git a/src/model/msd.py b/src/model/msd.py new file mode 100644 index 0000000..f654da2 --- /dev/null +++ b/src/model/msd.py @@ -0,0 +1,84 @@ +import numpy as np + +from scipy.linalg import block_diag + + +def msd(n=6, m=2, m_i=4, k_i=4, c_i=1): + """ + Returns the mass-spring-damper benchmark system (cf. :cite:`GugPBV12`), as port-Hamiltonian system. + + Parameters + ---------- + n : int, optional + Dimension of the state. + m : int, optional + Dimension of the input resp. output. (only 1 or 2 are implemented) + m_i : float, optional + Weight of the masses. + k_i : float, optional + Stiffness of the springs. + c_i : float, optional + Amount of damping. + + Returns + ------- + E : numpy.ndarray + Hamiltonian matrix. + J : numpy.ndarray + Skew-symmetric matrix. + R : numpy.ndarray + Dissipative matrix. + G : numpy.ndarray + Input matrix. + P : numpy.ndarray + Input matrix. + D : numpy.ndarray + Feed trough matrix. + Q : numpy.ndarray + Hamiltonian matrix. + """ + assert (n % 2) == 0 + + n = int(n / 2) + + if m == 2: + B = np.array([[0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]]).T + C = np.array([[0, 1 / m_i, 0, 0, 0, 0], [0, 0, 0, 1 / m_i, 0, 0]]) + elif m == 1: + B = np.array([[0, 1, 0, 0, 0, 0]]).T + C = np.array([[0, 1 / m_i, 0, 0, 0, 0]]) + else: + assert False + + A = np.array( + [[0, 1 / m_i, 0, 0, 0, 0], [-k_i, -c_i / m_i, k_i, 0, 0, 0], + [0, 0, 0, 1 / m_i, 0, 0], [k_i, 0, -2 * k_i, -c_i / m_i, k_i, 0], + [0, 0, 0, 0, 0, 1 / m_i], [0, 0, k_i, 0, -2 * k_i, -c_i / m_i]]) + + J_i = np.array([[0, 1], [-1, 0]]) + J = np.kron(np.eye(3), J_i) + R_i = np.array([[0, 0], [0, c_i]]) + R = np.kron(np.eye(3), R_i) + + G = B + for i in range(4, n + 1): + G = np.vstack((G, np.zeros((2, m)))) + C = np.hstack((C, np.zeros((m, 2)))) + J = block_diag(J, J_i) + R = block_diag(R, R_i) + + A = block_diag(A, np.zeros((2, 2))) + A[2 * i - 2, 2 * i - 2] = 0 + A[2 * i - 1, 2 * i - 1] = -c_i / m_i + A[2 * i - 3, 2 * i - 2] = k_i + A[2 * i - 2, 2 * i - 1] = 1 / m_i + A[2 * i - 2, 2 * i - 3] = 0 + A[2 * i - 1, 2 * i - 2] = -2 * k_i + A[2 * i - 1, 2 * i - 4] = k_i + + Q = np.linalg.solve(J - R, A) + P = np.zeros(G.shape) + D = np.zeros((m, m)) + E = np.eye(2 * n) + + return E, J, R, G, P, D, Q \ No newline at end of file diff --git a/src/model/poro.py b/src/model/poro.py new file mode 100644 index 0000000..4f7c778 --- /dev/null +++ b/src/model/poro.py @@ -0,0 +1,95 @@ +import os +import pkg_resources + +import numpy as np + +from scipy.io import loadmat + + +def poro(n=320): + """ + Returns a port-Hamiltonian model of linear poroelasticity in a + bounded Lipschitz domain as described in :cite:`AltMU21`. + + Parameters + ---------- + n : int, optional + System dimension (can only be either: 320, 980, or 1805). Default = 980. + + Returns + ------- + Returns + ------- + E : numpy.ndarray + Hamiltonian matrix. + J : numpy.ndarray + Skew-symmetric matrix. + R : numpy.ndarray + Dissipative matrix. + G : numpy.ndarray + Input matrix. + P : numpy.ndarray + Input matrix. + D : numpy.ndarray + Feed trough matrix. + Q : numpy.ndarray + Hamiltonian matrix. + """ + # load matrices + path = os.path.join(f'resources/poro-n{n}.mat') + path = pkg_resources.resource_stream(__name__, path) + + data = loadmat(path) + A = data['A'] + + # parameter settings + rho = 1e-3 + alpha = 0.79 + Minv = 7.80e3 + kappaNu = 633.33 + Rshift = 1e-3 + + # update discretization matrices to reflect the parameter settings + Y = rho * data['Y'] + D = alpha * data['D'] + M = Minv * data['M'] + K = kappaNu * data['K'] + Bp = data['Bp'].T + Bf = data['Bf'].T + + # construct first-order port-Hamiltonian descriptor system + # representation, similarly as in + # R.Altmann, V.Mehrmann, B.Unger: Port - Hamiltonian + # formulations of poroelastic network models, arXiv preprint + # arXiv: 2012.01949, 2020. + n = A.shape[0] + m = M.shape[0] + E = np.block([ + [Y, np.zeros((n, n + m))], + [np.zeros((n, n)), A, np.zeros((n, m))], + [np.zeros((m, n + n)), M] + ]) + + J = np.block([ + [np.zeros((n, n)), -A, D.T], + [A, np.zeros((n, n + m))], + [-D, np.zeros((m, n + m))] + ]) + + R = np.block([ + [np.zeros((n, 2 * n + m))], + [np.zeros((n, 2 * n + m))], + [np.zeros((m, 2 * n)), K] + ]) + Rshift * np.eye(2 * n + m) + + G = np.block([ + [Bf, np.zeros((n, 1))], + [np.zeros((n, 2))], + [np.zeros((m, 1)), Bp] + ]) + + P = np.zeros(G.shape) + D = np.zeros((G.shape[1], G.shape[1])) + Q = np.eye(J.shape[0]) + + return E, J, R, G, P, D, Q \ No newline at end of file diff --git a/src/model/resources/poro-n1805.mat b/src/model/resources/poro-n1805.mat new file mode 100644 index 0000000000000000000000000000000000000000..5385275827acab130856215f531da7f0e4237abf GIT binary patch literal 12520000 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
Ez+5b4p#hoUblD70~en2oNAZfB*pkT?LNK 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 BjgtTX literal 0 HcmV?d00001 diff --git a/src/model/resources/poro-n320.mat b/src/model/resources/poro-n320.mat new file mode 100644 index 0000000000000000000000000000000000000000..9c4bb0502a45c48ab27e94c1d97d8dad17ccca36 GIT binary patch literal 395272 zcmeI5&yMA|b%$?H+>M#dB)b^|3DDNoN!-)GV0ttWffAYP@?>%|^-uus=zW4n7_a8rf^7OsKjGqVp`0?AvYEKSt z93CChH;{{GhSb2yfFKQFKRFC-9vz-|c;2X^av8V-Rw z0&n(rzw!$NAh1&c#DSeUo@PVfH3Gze*I@7~1a?Y*IIvU4(`*R5Mu0f*8Vr7gz)lGe z2X^Xsnhk+h1U`KD#h?7_=Rb(vKk&;(KmO4de){#h^1n8DutER=?GYdjwC6J{hCmqt zTo;t#ic|=+M1VNZlDDuG0%Zsg2g-0oDg;_0KpbevTi6PL5CMBXKUDsid0z0F#QXoh zGv#@H5F*Zb2$Uy494OBi4G^e}KhPM4S?xfmd<&lQ~1kwqljyvK&I%8@; zU>^jyPq+_1(@F^3M}RnRA05s?U>^jC1N-nZt%SgR1c(Fo(cv5fYA0Zy->2I9-0UCt zgV_&|D$m}x{Ov+{sro4ofjtr+4(!qEw0Z9Y?0jpV--r0v`F`nsLaWclC2OxOPaXmg zNGD*&6>%V)AvGY-IsqF8QrnYzACc8>hy#1_Hf?R6z|#AKmVn(q@cYdB|E#?>Z|xxu z0SJT%s9XG^*Q$`$tz@-zgabRhCOYbYT_WjB{ zf3WKVTb?`wAaF{6IB?2@BM^W<2?FdRDnS*Q5NL}4aiA@KVJ!qo5Fieepo&Zgv_*h8 z(3Zcjc5ei7-zT*EO7APS`fPh_-j*j10SGMr{-F><;y{QH=OM5@0Xsk1{8EeT`vt^- zr9`O@f&2vQxVQPG8i@l-2~r;d64Xu6~*KB)jdGZk0BLO=ua__?> z4(zd4(dO0&*!j}#&tKXe`@Z3a=Ipv+`J5I*pbi4;E3U&2SOI}82@nUiq>pY0 zR6?My#171W00g!p&~K+2%@BZqC19T$+Vi>dYrkJ$?O(gSRzGG$vKd~d&hptSzA+neeS%0pla0&9;8;=mSOMkfUBCs2C+ zwc4#dyMMrz&z-mWbIV5_1X?7p_PDV6hyyM58f=C@5dwV?sR)Gt1X?1{w`44~LI46K z2=F~5C8#130&Ni>4z%Sjti3b>b|10Lmu|1UPiXfU<<`G;`*PclJP4E^V8?~cm(cmT zOya=nH256?+Yqqh-sW>#W#{|Salp36=5x0Xc@SukfE^b$pSw-Of!suq2Z7}T?6|k@ z9WB=|mSE$6eZRo|{ljtX^qg&v-AA1+ks1)VJOadl%kwEMfYiOK#N|)W(X`JVBh<(`DM~iYumU}`tKc=j%%kaYC_;r2oMJ@#gnuH0`mzF2j;V* zCIs>mu+Q6VKDWlT-!I5*Kk^`Oi3IGpxB1*{CJy8#iaZD`Ct%0D-JicygMDsj_Y>Ov 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%0A7nmu(~ z=ap(bpj5|6n<8*+tyLWG@!>8WoG-_7M9byU@|q`nznGlwbzbE!jl-q3M}7;nFI3K- z=lUQ7va<93zTVw)LTjG@gal*?z=~uQq`E3bkTu=GSpTD~vQ28mVy&U4e6rf6v%WrnP%Ul~D zG|qM2riv3@E^)vDsw}T@J>@Tdo;XmM-*THXHU6b1bYA6@Do!ZXanh;@Tu)i2IH2pt zsd755a;g1B^-1d{p!vf0i{L!3a;jH%>-KA%{1i(dw!AOL^+7Dyjmr7)8T6CR_ezW}`cD?WGvCnuL_Xf4fKYqMU z#%b$+)e9-`a)|>WP#d3@pX_}=YnHvv(|tf&&gK;_yq?K^X6un(hk(X&$UnXu>w$IL zvbq-U|H*v=GRVdWjc=WwN)<0c{cNf}$IBA%<2$%s8^?jKeks=fvFpvUtwef=fSu>3 z%Ey+o_0?aL+VkYAAaEVBLjKph5h}0qDsSfzohNORfcLAv@Aql+I^WMH+%K%m?ea^i zS*i7WdF~UWf-YR%`6d2+5cyGN&Flxn0Rh}NmH&J{2*&d~{*Ui(8{^rHdhh?}_?)L7 zd`cXsq=$KbM*Aa=|A_;Yxc|l#)>3c<1srA3= z+j3KRuP1umnUcftyaeQz*!wrSPb4e!96ygjbCK^(ATw#mzXvHr0AME;DmUj5DXquBbCD?`Bg zHKZlAyp^YZr_`P&zX^fsSgjhr8qcxyR8IAl_9Mw7-Ijp!r|$Q~KR1-ss;@lhHU#GS zLG_ewV?A1z5^(-Yzi;dP?ynCIhtz(c@?Jmp2bMZ=X8pN-@bwn@KfT}0Y$nwL1pGKm zzHghSA7~vBzCRsk2B&8dAP&p~cVX3t0~hAd#O4qO5`kT4@wv}$?0O*eexLeZ>~pFM z#lLy8=K5jmf1Vp|?#P7(IDel0y`qp0 zR{pSl4S~^fBb8HsQa+R_ZV(4Tq{^P3>xZTOpWE-s(%7%`)bTG;s;5-P6VvO&@)R#a zAlVP{yV6v%=GIHqL-{xYE-rtX{Jg+Q_j01w_o?NrKJs}8$PX?}e{Q3Cl9R_Oq^wQA z`!P8Vc)uq~R<`Ja6Qwe>GQ9*G0BIc6n$hyyEuu3QaqpmGNl zHcxRN_4%!@=huVr&kg53r!I_P_u}XJW!w)A2Y=ruxXz#3?{@E~LIC79=a=~V1NJ_j zo;!rh^m?xB^M+78&X*-H*DrJX!Q6gVmco9eYy76h0XvT6*APkdH`{+g^*CRaz+Atm zAEoDPD+x#;?*?HFL-D+s6zHB z4#Yk;7{`I|^MbkeqYE_`u@eM{0~26&a#;5Vd_M@T*X(t^?l(^1QvcF@rKxfp-zNPMH-uu4Bth>EZac1T@Z- zhOF`BCf5U@`kb$efczP{PoVRmxKUT@uqKv(>j%^OKy7?bzma_9y_}QypmL;j641Dw z@}HgObv>ch_dId07t*!}Xg#3RT5s0_spoBZ@^uqX98fxCtv`RV9+)c6@iqu34)}O~ z=U-W`<61xHIO$~(@P0noPvFP>m0IibFUBd?1LD(as`2gn!Cf4fx-RhLxE^TL;S+Yt zuYP>naqr{9XLrZFnCl5~9Bzz&)&ojq{?v8B)N$1#ZJU7NfKuBUfBbGeV9%3po50k% z!1?{N7dB3`-CC@lBH;afcYUCEpyR&Y^;CV1w@pCf+@yEwK-K|m`#074@%T@FFELdg zJ_qV>hQq@x$s{bWlU#a9Ml^mrZd8(&Wa+T`1QXN;CDqnJxO3qZO zb|_t{PkNR9o#&}kdZyB)`ls5d<5q8~KFLw4b}H3zr6Kt$r&My3>bTO7Jk?XGdP+m} zRZeNBeCYhExbepQaic#9d2l$!jqm!naV#JDksob2wR`Hk+7&9N^R~S5Q+jPZm7lUl dQivET!cfrTDI;B@zeO?IQ%jb>j41WB+|85Uo9#g`G85gBgo<{rNSn4TWt zZuZ&Ff*Jm~xw*gpcmMW({=5JFC;#TZ{p+8+|9AiPzxj9n{y+S~PyUzx@b~}m-~Ho1 z{qKMKlmGJ{|F3`lfB)A%`5*r2AO8M7{=?6I@{j+=-~Qx(eYJf5@Bis1fAiNr`I~?9 zw@;t`?SJ>|Cr|(S>EB#E;NKhni{{=0g$efjtGd)r?u2oNAZfB*pk1PBlyaHN1d;z%f)5gE_)9z;b-=%e|1PBlyK!5-N z0t5&wUqBwQ{65w~0t5&UAV7cs0RnXdT-Q{`RjC9B5FkK+009C7mMkETSaR=b8vz0Y z2oNAZfB=Cy0`iDDu1Y09fB*pk1PBlyuw(&w#FBeg+XxUKK!5-N0t5)$Cy?)_bl>)Q zp7kG3y#LZ~()RA(bf38Q2@oJafB*pk1PHVzAdhITPeeq3009C72oNAZpf!P0&;RG~ zhCCi|YWs5Da%w!M)@OSH1PBlyK!5-N0tC(%IQ6()9&x_85(p3=K!5-N0t5&UxE3(a z+UI}(0RjXF5FkK+0D)5l+LnC3rr)OLL7ZBi`!}5`W_tnz2oNAZfB*pk;|s_m z#y3|Z0RjXF5FkK+0D-v)RJ=xj009C72oNAZfWTb> z@`$^1yhnfl0RjXF5FkK+z&-(a#6A_T5g&2l-jmytx3^A!009C72oNAZfWY|z`M6sialWY% z2oNAZfB*pk1PCl$Amh+(1PBlyKw$X-`S}Y& zw>aOgDL-Fg==$8hX=qX95g=V8~XH_G)qiIA`)K!5-N0t5&UAnjVf8 zAV7cs0RjXFTwUekW_g712>)LYAV7cs0RjXF5V%hu=Mnk*{C)eM`hFg7$m0=tyyDdI zPu)J}P1)nr@@!9l009C72oNAZ;1UG#akD(ac*G@q?zNEs0RjXF5FkL{Jb|1?GUBl38~?GlE4CFf1qW7yi1Mt}eT0t5&UAV6Rl0{OUE9$`FU8J}#eAV7cs z0RjXF5U44T^N4(Ye(1XMctakK$m115*PqMFc~kbt+gm39fB*pk1PBlyumpie-4a@%4Fm`fAV7cs0RjXFj42?G7*kta z1PBlyK!5-N0tA*JAdgr^KWYU50t5&UAV7csfiVT-5o2nrivR%v1PBlyK!Cux0{Qs~ z=azTs{`r1Q`S}v3mUr&$Wv2oNAZfB*pkmmrXji{%l!y)KW~ z^{_^O009C72oNAZ;94N(5&5{ewo-ncbsmq%;}x~z$>ry~DtqPatrH+XfB*pk1PBng z1c7{9ERWdjb$P_DhcyBO2oNAZfB*pk*8(|@$j8mKmGXE)9*@Z56}98Z<>$OAd*$t| z6Cgl<009C72oSggfqYynkJ#;XdBm=VH39?(5FkK+009Em0y&S!$IZ2s@_0iYkI3T{ zwd2X<=e#O=4($;Tgl^zH}mMemFqPt+UB&y&a4c~-<>Nq_(W0t5&UAV8oc0eQsTy&;dd z+sC^E2oNAZfB*pkmnrZ?I^RCFLLP6(^CQNNC)by+Yx-(puN@5i2oNAZfWV~+#A(X%h||1mO@IIa0t5&U zAg~O9d>ovgvo>}s^LRskp7kHo_{rGu<@$2ol|A$J)(H?GK!5-N0t5&wK_DOZ$|Fwe zRe8i|UbZGcfB*pk1PBmVhCt3E@^SIlt<2*Mc|0PISBxEBt}o|Z*)wl%od5v>1PBly zK!Cs!1oCmOJmR!ol}DWBWorTi2oNAZfB=DI2;@8>9~Y0^$~@kX$0PE1#n|!X`f}ct zJ@fX~2@oJafB*pk1PClaARqV2BTnm8dBka6wkAM;009C72oP9?K+YpRpZI=AdAuP% zKVs_maW9R!@^PA_VP}Bqn5FkK+009DX6KL%?SROIAPmp*C5FkK+009C7 zE>YmC#?J5O@rGZf@rc&?DEpZo(OM6QhX4Tr1PBlyK%j;|J`S!?$0=pXBTmt>Edc@q z2oNAZfB*pkhXo#Whu`xK0RjXF5FkK+009C7_6f)%_NjP{009C72oNAZfB=EJ1mqES z>3EL-0RjXF5FkK+0D*l1@`!yZUL!z&009C72oNAJl|X(D-BfWLsy9DBB0u--(0)_B zo;~yWRB@@7009C72oNAZfWVLftsm#gBZlm4Wf34ifB*pk1PBm#m_W`O^7_L{9d55Y z-XM<{&Q?hT2oNAZfB*pk1Rg4o^M<_s&~k^`PaZLpq;d!lAV7cs0RjXF3@7kqdVck9 z()w^UJ*=dhM|_r^XZ_p8;?1qhd0F<(+gm3 z009C72oNAZpbde1oco8y&hO{(hF_)eh(9(KZ|>Ecmu2s~y>$Wv2oNAZfB*pka}dbK zwepBzdrclOtf$fl5FkK+009C7+7QTjL_Y4FI?6oWkjEqPc*WH5=K6D9mc8@#)(H?G zK!5-N0t5)mK_DO3$|HvDHF?Cao=PJ?fB*pk1PBmlLm=l7`Tj^#N14YP{yEK$Xf59C z^?91V(ORCC77kI$ziHRq}2vUhxnhK!5-N0t5&UI7UDoag5T#w~VAV7cs0RjZ36!_iDp07N&=SSqe&E9!EZ*QFd0RjXF5FkK+ zK#Kx%JC2n{wD>6!69EDQ2oNAZfWXoPa^8^FTWf!QeuO-twH^`=0RjXF5FkK+z$FOe zydkf*W+0Dftw+Q|fB*pk1PBlyaESsrZ^-MdnaCqr>k;t~AV7cs0RjXFT%thE8}fQ< zCh~~ZdPF<~2oNAZfB*pkmniUMxED(EOXwL z`y;lqBtU=w0RjXF5FpT!Kt67jM~vG$@`!Q0)kc5-0RjXF5Fjv&Kt7KBL*wW3^LWFr z(s;xl8;?KtTF%>Yf8_106Cgl<009C72oPvNARo8NBgX9&dBnKhY9l~^009C72oM-X zAm3&T)&uG0*=H}nJr}zjEAV7cs0RjZZ5t!R? ztUO|z&xKkD5FkK+009C72;3#$x~98y>c2NP|N0_oAV7cs0RjXF5SW9&+>T@ObxY=1 z&*4)hMgjx~5FkK+0D+|mk9IS)_X{N1PBlyK!5-N0tDtF@Ti+hq~at%fB*pk1PBlyK%f-?c|eM6Tgj~H51c?1X$AV7cs0RjZ>7sz=- zUcbMDX}6F^OzW?90t5&UAV7csfy)%gc|%@rT}2+zdJl<@009C72oNAZV2J`bZ^-Md zw^<(1dJl<@009C72oNAZV2J`bZ^-Mdw^<(1dJl<@009C72oNAZV2J`>rspgCCat&L z=A1`-_Q}T|e)R4K??v3domqP#?pWr$F85b#XGwqn0RjXF5FkKcOo4n{Dvuab|Ngq< z5%(L}f&c*m1PBlyKwx}E2oNAZfWV~+d@=L$-Fdv>R|^}D_(STSuhROZer~m! z009C72oNAZU|Ior#I*kR)h>^?PssZO2oNAZfB*pkQwYrcI5m$){CZ*I5p&P;rua;& zlK=q%1PBlyK%l;WJfgnwIW@>5&e5|k0RjXF5FkK+KrMl}AE)N=2=gOqeNvQ5fB*pk z1PBlyK%f_pNAwmg{xcZ9c!c>8=YJ-YK!5-N0t5&U zAVA_0&#)009C72oNApOCTSo)~csgxp_Py&yT28?^xx|Jobp%w}sf0RjXF z5FkK+0D*A?e)qFqeE;*GcJGZ-Tm4#=_WXz}wzU4r?XymR009C72oNAJ4}ql}m&zmN z@wpQv0RjXF5FkK+z`O)<-jLVl)talT{QQWeyVLtdX-o8%F5>oM^XAV7cs0RjXF%uyic4S9WTZIVaK zt;fVmfB*pk1PBlyFh_x$H{|uXwMiZ^w;mHO0RjXF5FkK+z#Ii~-jLVl)+Twx+#we<#Pd1?Js!$_F~2oNAZfB*pk^#zu8Txxzq z{m+aV2oNAZfB*pk1PJ8on&vKY-*ruMZ{O1TYwrCaegXst5FkK+z@-W-?YLAPajBnV z?Iu8g009C72oNAJxIi~}i3%h@fB*pk1PBlyKw#+t-O?MVeFO*)AV7cs0RjXF3@z}e z8@fd05g}@* z%U^%;@rNJ1`@v27exKSqw{|V9f9B>dUIGLN5FkK+0D&Tqk4y9V+@0hRbMHa%6Cgl< z009C72(&1W^M<_MV$65Nl*b$9o=4>V$m@4mc#i-90t5&UAV7dXErEPon%8U9TdQ1o zL@in65+Fc;009C72oUH6a^8^F`z`13n>=D3{Uk~P1PBlyK!5;&c?;ycA+OJ^b@GV0 z^_X}G5FkK+009C7<|vT!hP*zvHpwIA)??x&K!5-N0t5&Un4>_>8}jT`*MH$W@hov@&5@i6Cgl<009C72;46q zkGS7x$}Qv(Q|ham009C72oNAZ;E=%Q>HPNG&v)nXhCCjT$14uGwDNk+^X3+RD~{qI zK!5-N0t5&U7*;?YF|6m%rO6|P7F8Yr0t5&UAV7e?5CVTl;}Kt_^&#pQvy6Pce(uk+ z{v!3q+{cT?{4A)8009C72oNAZpq_v{qMq##CCej*P*es10t5&UAV7e?&;m<4PR-*H zze@LO%I^>DIdpkT%kzfzQ62#T1PBlyK!CtB0`iDy+>fnQ9&xOc?FbMcK!5-N0tChs zSlV%F9&a!|V$4sIx(E;;K!5-N0t7BaKpxR{PcLn}sBLZ05g!N6AV7cs0RjY$6Ocz7=QPz;@`$PA)k}Z?0RjXF5FkL{QOAG) z0RjXF5FkK+009E03CJT(^RhJo0t5&UAV7cs0RmT7@(7;-0t5&UAV7cs0RjY06_7`q zDrS2E1PBlyK!5-N0;dT4?q|RF{^vjK-iv+mdb~cDWxiiizMoU;?U=iN>%QV6K!5-N z0t5&U7)Br;x90U>Y8kH-dBk|uY9c^@009C72oShjft)ww_10zbc*ETCi0qx$TlW_q z0RjXF5FkK+z-0>L{hP+)ZT<5gJ^};?5FkK+0D*A?hn0009C72oNAJj(|L39Opx|$RiHP zc%1+N0t5&UAV8pHfjqz9i6i49#Q9Wp;Q6{2oNAZfB*pkcL{uz&ezXvencK`_+`3ZQ_eH)vY6t%x%*FH zrcMF`2oNAZfB=E%1?GMnE037|Gb9261PBlyK!5;&%M);2)3kj)cmHYi)J}i^0RjXF z5Fjv>z}$~x^L0z+Sx@yzQZE4l1PBlyK!Cs{2`v4(rq=s1`?nsi_y`anK!5-N0t5(L z3*_V2rOmT$y_d6p>+y<@009C72oNAZfWUGE9(BuYo0btEK!5-N0t5&UAW%m@9#O|t zsRRfRAV7cs0RjY;EFh0qa_?#z0RjXF5FkK+0D(FJ@`yUFN+m#m009C72oNB!U*LD? z`PO-T|6c99n(zDi`_!IxA}x{3&9^l_@em+DfB*pk1PHVtkdJHgdK*z5jzS)B*v2~q z2oNAZfB*pk1ZoN7ydkgGs`sJg=JAHs^N8%3*B|O&KLP{@5FkK+009D13gqM3ygp@Y z`|6fQ>{Ia?0RjXF5FkK+0D*A@a^CP|xwdBo{v_8>rj009C72oPvrAfF%4c|~h2$m0#aO5+iK zZ0vl0_WVO*@wL{!;vqnQ009C72oRWufIOmZKglEN`YN3O0RjXF5FkKc8i9O%JRkQ? z6V>5b^LRrZkI3T{hf5mgo$Q(OwsE3R3jqQI2oNAZfB=DE1>_OKdgjvP5n04K0RjXF z5FkK+z!C&LPuJ_We!e`9H{|;@<@-5J-A6f(Xf3{}ebi5Y009C72oNAJPXT#E-F}lt z)b&+50RjXF5FkK+z%&B+x~8wv_{20(9j-N>&u{&C)?Xyg*2jAe%X^0a0RjXF5FkK+ zKrbMV=q+meCXcA0s!Rd|2oNAZfB=E11?F~~o5v&a{hIRoQ~S;>Pn+6H{R9XQAV7cs z0Rr<7kVn+*CwW9&U!@ZuK!5-N0t5(5BQUq)+&tcp=SNJVc(~S_rybtXI|K+2AV7cs z0RjZ(BOs5c+gI|4y1q&$K!5-N0t5&UAn0#6UUpqelu}A;bKXE009C72oNAZ zpr(L4;yhh>#Cd-9CP07y0RjXF5SXVxK7XF`im6+b#~Xf?#v}eX@%jJkm7nuBwV(P4 z5FkK+009C72-FaeN1UfBk2ufI-UJ8`AV7cs0Rr-o5OY?VCTkjEqPct!2_vPaIlYS*uP0t5&UAV7cs0Rk-w$RqCV6?w$nKHeoj zfB*pk1PBngOo4oUJs&rZt&+zZ@_0lZuc#eg_Q-ix?fR8ZfB*pk1PBlyK%hkddBokl zB9FM+$GZdw5FkK+009D*DUi>v=i}zFRq}X49*@Z56}98b9y#x-UBB`P5FkK+009C7 z2(&05kGQ*6j?1*YwrM=lipIKHvZA^gQdl zeeLxxCibY^KIIc2K!5-N0t5&Uc!+>J;%+s0#N9sLB|v}x0RjXF5FpU5z@x6+*hEHv z009C72oNAZfIyo9@`yJ3MN|X`5FkK+009C7S{9H;wA?#lBS3%v0RjXF5FpT|fIOnj zei0P`0t5&UAV7csfg+HfACd2SI<`}Oo^^iSb?tcaJoMW2DW3oV0t5&UAV7e?90lYN zyS*ll*!8eRfB*pk1PBlyKwzIhK5ia+JR*-b@5i2oNAZfB=ER0{OT( zpPxUx=P>W&@rFDek;f~BskJX9w>Rfi{g!?sK!5-N0t5&UAV44lp|J02mAh);$k0RjXF5FkK+0D;2-zyI0par75y{qUZ{ypzWpKKtb34?lYMgPZ%X z4pYnFQu27j;Vr#GfB*pk1PBlyK!899$Rl?1sBp0)K!5-N0t5&UAV6Sl0*|`6MJ!$d z1PBlyK!5-N0tBWOkVj121L`M0fB*pk1PBlyFh2o##Qge9!~_TsAV7cs0RjZ37LZ3w z-2>_;K!5-N0t5&UAaII6zVGSS_cO}RkI2uLIHfJeY@6?Ud(1wzAwYlt0RjXF5FkKc zS3n-I>tT%m0RjXF5FkK+0D=1j^7;AN;}LnhA&*Do=S$q*g1fiK?a6u5-FthN009C7 z2oNAZfB=Dg0`iD`DqbT%fB*pk1PBlyK;SNce11NkzrSnWhrE}^8}fKW9~(D>K!5-N0t5&UAaI^QK0lw& z-=A0d?Y;AOLmrQ~y~la4)Napt(b<~-0RjXF5FkK+z&r)y5%cUfQ4=6QfB*pk1PBly z@Tg-zfB*pk1PBlyK!5;&(*)!Zr+L|$009C72oNAZfB=E3D|v)Z0RaL82oNAZfB*pk zrwYg;P8G8~0RjXF5FkK+0D+bS#=Z}1zF$+mpVPTEc^>(><=LMA0RjXF5FkK+0D;>A z@`&3eULin$009C72oNAZ;BJ9@{(k7^FXZutJRXsscYSxXx8Ke2=Dg_k9$q0pfB*pk z1PBlyK;T>fdBnMb_9sAq009C72oNA}c>?+TeLlZ`u1Fql$m0=tyyDdQa=bY&I<-98 z6Cgl<009C72oNA}zkodAej{5DAV7cs0RjXF5FoHCkk8-e^ZUD7pT3sI8}fL>=_T&& zF?77UrCTFFfB*pk1PBlyKwzJMJYt`U*9Z_GK!5-N0t5&UXiva%=-TTO5fLCjfB*pk z1PBmlT|geudJl<@009C72oNAZfIxc!@`(2OL_`D#5FkK+009C7S{IN6L`4XqZdcAGFZ|$l3+nxXc0t5&UAV7csf%66A5$78!fdByl z1PBlyK!Cud3FPzp=RThyk2mD;i2Qts`@C~JIq$h|fA13@K!5-N0t5&UATYduJYslL zB@!S&fB*pk1PBmVx9z0RjXF5FkK+z`Oodg}OQk5FkK+009C72+UhR9x?C!6FmU}1PBlyK!5;&y9I{64{W|)Q@)?m-O*fK z<$2)uZSQ>o1PBlyK!5-N0tChvkVlMfu0{d`2oNAZfB*pka~H_x|4)5>LmqF);}Q4y zoLb*~<$0d~0RjXF5FkK+0D<}f@`(DzY9K&>009C72oNAZ;1~h(tdCK$4FLiK2oNAZ zfB*pkuM5Z{Uf1wD0RjXF5FkK+009EW2*@LjQL+sI0t5&UAV7cs0RpcJ$Rl3Y@H+tl z1PBlyK!5;&r3;)p@A}mHH7(s!`v?#qK!5-N0t5(Lf`B~Y5_(x12@oJafB*pk1PHV! z;JT(3dqqqH2oNAZfB*pk1lksmN3`8Pq9Z_n009C72oNC9qJTW2#aagv^}l@e-_@(_%RhO@7Q%u60RjXF5FkK+0D+?gfIQ+9q22a=bS$zNU`rqUAX7Tc!?S9YKuO3hF>ffrn{^=h90t5&UAV7cs z0Rl@Fc)HC8-tUfU<*F-r#Iu{c;fHNraoqm4B0zuu0RjXF5FkKcIRdV0T25bT2>}8G z2oNAZfB=E91mqE8Nvnqd0RjXF5FkK+z;XoS5zFaIEg?XF009C72oNAJmVi8BENS%+ zAV7cs0RjXF5NJ_g|NWE>M_TT)bm)FftM%bM%R4{bES}uVyDqOjPxo`WuN3bSAV7cs z0RjXF5Fjv}Kz~1_<6?NaJ^qh8;{LoL%8mQH{%G^U^L2TB)xEj-<;ixvyy_JJ*x?fYCmwkV^?%#C3ku3-iAV7cs0RjXFOeGNaN7{XU!>Q5a`!$`OH|*Bv z{!P0c)(8+FK!5-N0t5)OB+x%EV*mO7V`E*V=g{TnN1UEl>>nTTeCuO-#C8M-5FkK+ z009C7h8M`si|)_=A6Hk-3m*PF>s;Ud@sS*F-pe`x0t5&UAV7cs0RrO*^y3ld)fsuk zq4^P~m%e{|#Ph9Bm$U}~0t5&UAV7csf%668eE(_Bug>*G-Vm?n`4RE@Lzn&d$T0Cf zG!FX_AV7cs0RjXF5Fk)rz@i;0RjXF5FkK+z|sWd5lib)?IA#b009C72oNAp zUqBvF-&hR<2oNAZfB*pk1ePWsk62odY7YSd1PBlyK!5;&*9G?959#$SPW!#ghdy+_ zraUkEw6d?a_B@Hx&Fn#d009C72oNAZU|50ven`WVJKXalay)Urrrqald!9sgvQB^i z0RjXF5FkLHo>odQzJ9s+_fD51vQB^i0RjXF5FkK+z_|i>K0$we|6wKP@dooF z9_DB-0t5&UAV7cs0RnRn=*J_5jW+U%L*o(W*S3HB#Qcc!WtBjH009C72oNAZ;I=@W z`2>+SM16UFM7%!KvL8RG)1IN?R1N_G1PBlyK!5-N0;daj4&CWy_8>rj009C72oNA} z=>qbIOaBCDKLG*+2oNAZfB=Eh1>_N@o7sZ^0RjXF5FkK+z@-bwBQE_Dp#2005FkK+ z009Ea64?Lzg`wMc=zdLkUiSI*x_{I8hDsnnfB*pk1PBlya7ZBTZ*<=Cs}GePujl(U z4WBneO=ao+O}ie}2oNAZfB*pk1PBZ%&_6F?|M~l&>Z<=d>m2F+@fFXv&Q8_|5FkK+ z009C72plgk^z*B8&3U|`-t(+;&HKk!a(nY$)(H?GK!5-N0t5&UI9{M1kJx|y{`iva z-ZJtE^CRwd@-6`a1PBlyK!5;&HU;8*{SPm%|2zL)QG!`G-p0t5&U zAV7cs0Rl@C=*HA$CXQf009C72oNB!1c5vspg%ufr*(O}!Tg9i&PpXffB*pk1PBlyFor-s9F5yrIM?6b;#FOgQ!2+Oy8L0t5&U zAV7e?JOtu?O>v*ov7?T>;jK-@FS=6yRCz<(KWfz#m*?C2(XP69F5lQb>LWma009C7 z2oNC9oBafJVJYxU&jOSaA`?*jX0RjXF5FkK+KwAR& zdChUY{n>h)IP-YJ)09W#_s5Cqx|aRpGudmrc+^CI009C72oNAZpgn34AV7cs0RjYC5Qy{b@%-voA9sF4LEaY009C72oNCf zaDjZie}De{;boq(XC7}bKjIWU+Y%r^fB*pk1PBnAR-hk`Fh63qC-#rem>;pLWQ_m; z0t5&UAVAz{yrd?tL%k9gh3?*s@CAV7cs0RopT(2qxayP4?xcwIbJ zU0IIxbG3eZQ&l_nYbwvh>z`*Gc~;~VW67w8009C72oNAZfIvF}{rreHF8*edM@;wp zh+-3YM4mq}w%n>Kc};&EQ^_NqtjCT-eFO*)AV7cs0RjYC5{UEbC8kw3ZEW}5uW9_~ zzDwgXW&N4wM~vSUY9v5_009C72oPvMAjTi2J-?pE8}j{{riNN|Id6!0*HcHPegXst z5FkK+009C7vcRJ*zha#L0RjXF5FkK+009Db3&&&g$LsMNx^e2>S4-p#Wf^%yzMs>+ zJ;!-1d&PRG-SZ^I=>@eAAV7cs0RjXFOeOHc_BnHJZUR_!Ki(|+^XpT^wLLChm-=6H zCBA+D*UD$D2V$iu?3-_mac2oNAZfB*pk1ePig*D^WV0Y9>H{009C72oNApU!Wh4*nfV#egyk#h`b@LYie(P#QyOc_iNhU zpI#+EfB*pk1PBnAyFi>zFY|&QuVa1p{QB6fjJzT0eY(9q=>4v|lHZT*rdsynH{lna zQ$?g+0t5&UAV7cs0RrO*^y3lx&##Xc$!<;NN9=l7BS3%v0RjXF5FpTkK)#;8KfgXr zba}kN{D^7#L9GM`5FkK+009C7juGg`Bg%bN`+3*L>|Jl0)%Jd>@f^B-e#G`VqIJEx zk1P4x&5fCEUl$hFIUQGutq2exK!5-N0t5)mLm-ZG<9hyBe|r;tXS;uY?8x@lx9YyxKF2To%KVbZ!}jmxRRRPE5FkK+009DX7l?V)@f@}9w&&MN zyH?#)?b{xgZ|8sC9*@|@x1K7#s5kP4$Rmnh+&6dC#deki2oNAZfB*pk1ePEW$GveJ zT-vnic8`O{YiZ;SQDa$ecYZ|VU6F_F`aNDpJ1hwhAV7cs0RjXFEKy)LZ&-D0wK1+^ zIy4?JeYA0ZtKGcJ^CPD384(a5K!5-N0t5)u5QyX6I1a8+$LVE8-Vo1=j(OGb9J

zth+})eiNR%<2!Y0S2_U#1PBlyK!5-N0(S{K>h5~idjtp&AV7cs0RjXF5V$QMkGO5( z6#@hZ5FkK+009C7?iP?o-0kCC0t5&UAV7cs0RjYW3&o4<{Z{M$JJFj`2w{K&;_bhR`e^VR%A_@Wo2oNAZfB=DW1>*ifah!W@ zc|-4C;_9Ctv5j{l<)c0Lpdvl009C72oNAZU>bpPe4EdY_vg>2iRyN( zkvEj3@rc_(ULin$009C72oNApUm%|!kM**AzOEm^-8F3Exrw8!8;`hK&AS8$5FkK+ z009C7#u518<@LX3>o+&mt-2p?mhFy56qOfUi8r207gqgq>*AF*mc3_qN8Z*(e4-#g zfB*pk1PBlyaGXFK$Hw!kW4%0oxxMj-$Q$0;G%ucK-D=(t&);5k#r643o)+H6^^&a! z5FkK+009C72(&B^dBduU{dwo#cKPd8uXX`d1&f^XJ{D=}?e!q>VucO#MzLUM%iB}{92oNAZfB*pk z1Wp&|$0PQiKR><1I(tOkFrV>={o_0N{#bRiluCdA0RjXF5FkKcXn{CiUgrHizIpCk zEAt~tdn0d%)<4}|5A=Sw|NYpmm1RG^lf7GsP#gpZ5FkK+009C79xl+2M|``vaR2eT zl(p*0vX!5!_1l|J<})5q=7sn7Yl=KA@`_eu#X*1o0RjXF5FkL{c!B zJ3pedE%JywUU7WO$Juh#mAt3Fj;Z7kF&|}|DAYoL009C72oNAZU}%9jKVHgRb#a^< zdBxE6ombxc?$`8P8s91F&u*?GJI}-31PBlyK!5-N0tChth&&=D;fd>2oNAZfB*pk#|Xsv@;-0a%`1*6qvke|H$)wgH$)zh-;eEDS;lo@=0~*B zBjO-HfB*pk1PBlqMqu|krd2mgskKVEZ+=9rdLLeH$;x|``DxvS%Dtaj8A8-2?~_AV7cs0RjXb zE+CJ1xSc%-5FkK+009C72n;3gWH!%NF7v}*bY&U$fxWug&KqA3B~rJX-n+!z-xs!S zy-FuQfB*pk1PBlyaGt>SxO;m%{(OC2Y4!JxyrC>3kI46PsvpNgYslWQUdns2erUP& zBS3%v0RjXF5FjvyKskQR=fC^&<733|kUF-<-P>`K$RmtLJjBvI1PBlyK!5-N0tAi~ z$mhRfJ@SfU%Nc9C$Qz=*vfe*GBEKKowYuEKdo%tM>m^>}5v}%{xCjs+K!5-N0tAXc zIes-BG41D}AOG3kAJaysb^-(l5FkK+009Cakk5a|dK|~bcC9S8@vS4CvTi&gJS+(i zAV7cs0RjXFj4ANL%j}1q&yOf&&1K$o?;ZWI zZC`haiERlGAV7cs0RjXF)E0>2)bBTW#N+LJS}d!zoruB z{Kg~pkN-Sh&%?j%PlxCT5FkK+009C7Y6+~i*8|17Aj~k*6We^}hfB*pk1PBlqULdZkiFv-?ZO@OFnpWNLH4ana zHV?X)9}#)QZt3mk6~({5UsLgq>&jN$ZhNc|AV7cs0RjXF5SUgV#v|f5wnVe)c8_DH zjq&x`BX5Y;B5x?m`Q5K6^0vt1cKsi(qn(xn2oNAZfB*pk1X>i>%^Tvrul@P)7Gv&X zit&c|&X0)uW9{a3&u^}C>f7o!0t5&UAV7cs0Rqzt#BuAPL*x;8d}!Qg z)JA{+0RjXF5FkL{Zh<&%jpNv|b$@>R?!Cu7c7?zB5z)_< z1PBlyK!5-N0&NP+`}}uY#}wB!#dS_?TJMYM&~;^z=k43aYXk@oAV7cs0RjZ35{To} zIF6kvj??Omyy5ozh||hxW$PG!@cf8YdPE!q2oNAZfB*pkmn870yQJ1?D**xo2oNAZ zfB*pkLkP$thEP-n0RjXF5FkK+0D;RAkVjlre`_rP0t5&UAV7csfguFs5kn{{g8%^n z1PBlyK!Ct$0&{tO_3c)b`Qo?l*R-8SzP`Q39A4@BqqM{Gt>@5dVkAI-009C72wZ|d z+^;E)Q|H#^5_kXnh;4h;b8AP$oBJcy%ll7e+pcJzB>@5i2oNAZfWW*3%JFGFzulkz zo=fW@ZzxOS5p(G`aS|XvfB*pk1PIJaAfMlk^|E}vZoM_zcyHn?>&7Em?>F%gAV7cs z0RjXFEJGmjhV5~AS6XE}qOIQT`(uB9wH2*s2oNAZfB*pk1ePmsC~t`4)Ye^z2 zI@W)*Y2f_EBO-5jYZL#AuJqGf^MxJBH#adcG-8;mGwTacu1Mk?X%h*Z$};xc|}Atzr5nRG(J?;pWWmY(K1T{1PBlyK!5-N z0%Hiobul?_*v%`(h~%6)a$e9sKcbYH-#@3WDfV4;Id3pOVv2rHCjkNk2oNAZfIt?A z0TWjw$kp{C;dVmt|aMW`4w6dQ6-I2oNAZfB=C@5!k(sDUMssk7%X;OJ4VQ zUE+zn&-{p1`bQiD2oNAZfB=C@6Nu|#4qZ1h505-Ip*81~Mo)>vwYw?PQ009C72oNAZ;1UGlIvMjL+U)JP&dmIXHv30Z1PBlyK!5;& z%N5A;Bjzn}-}58p*E;hf=GSK;CP07y0RjXFELk9~i;3%I=GoT!=10u4RejVkUewR4 zj{EZV+xU$D0RjXF5FkK+0D)ly9(BW%qZ9%J2oNAZfB*pk1TIHF9&tH+t)&DA5FkK+ z009C71{3H8D@j2F2oNAZfB*pk1PEM;KzAt()lLEg2oNAZfB*pk(+SM=`PH|@%KY&c zU0FU|#}?apWbqxpRH{Kq4<$Jy)MJYp&15qrYc2G2iis=&!Q8o%cn% zEeQ}HK!5-N0t5(*A#mupG>%)xh@nOu+xSx+VLYOSwK541AV7cs0RjXrM_@NkFdor* z&qsfirSXW?`%8QT2oNAZfB=D|3miHwjpNq2wtpMH@rb#0ptuPTAV7cs0RjY?6xhuZ zj7K!tNv{PJ{Z*F6BVMEND**xo2oNAZfWQO-hmK3*xOIY%2B~rzzwwAcG!;UC009C7 z2oNAZpa|^d3C1H@|6D|Wm8J2B*859*1PBlyK!5;&r3?J<^7`Mi^_!c9uDZ82%XqHY zs@ts2@JEbCl+fcjbo0Mo)AyVHdb}NHS#@u38kqBn8FrYE2@oJafB*pk1ZE)+=eG|X zm(HRQuLZfAH!SaY){*B$-dCEQ^S;+W{7QfT0RjXF5FkLHqQH+fWk0_ekN9qTzPnVp z>dJC{KO?Uw%iH4-rA705E?w!b{yMbMU(eRt_HgWZw(Xi*KZutA0RjXF5FkLH z2<+w!t1j}2$TQ~c6ypuI$0KsyF_(7c>(C;vSVn)%r5D6WfB*pk1PBngT!A?5Jak+- zPnpOY`uP#19g#=$@6WV-H{(Uof06givpu3FK!5-N0t5&Un5#gX&yMS6%#UchCnIl& zJR*-LwH>|a2oNAZfB*pk1m-Rf$DwgtTH0fNM63N8d0ymwyZvQ;M63NKE&>Dy5FkK+ zz)}VB`RvFmBF~t2yW={hxUOk=&yR?_Vj2B4?@ycP2@oJafB*pkmmmCbo1t$o|}tRwES?)eenVM%}h0RjXF5FkKcNP%Ua&ptdqVo1X=%gWcG zjaj$42oNAZfB*pk1PH`!kcLnQKs+s}_!Nc(P{AF+(~XaxZR1PBlyK!5;&rUkmD zqZ1qf0t5&UAV7cs0Rk-wbS(xYCISQq5FkK+009C7S{8WJwH%$;2oNAZfB*pk1PBml zQ9vHiVy}pa009C72oNAZV7>xnzV-8U%)2fvd6L%W-oE8L&w77<&9{FC?xEZS*FfB*pk1PBlyKwt`iL&vFc96Lo!L)5vA-+06jn93kPfB*pk1PBlyuoc+N z6O2c+_Q8n$DNExKt@V$12oNAZfB*pkmo9MVI5m!A=jyYK-+07aJ5byN2oNAZfB*pk zO$zMh3C1H@>!j$PvNRsiTK|ZL009C72oNA}=>qvU_4}9C{~oX3+`z25x%zC6!?*2t z(UtZ*UGKJMmDYFPZDB3?Bl3zLZGy^qMGKLNfdByl1PBlyK;RMt;<&W5wI7f8VUtHZ zThGlP@`i{z@`g=wUcTRz*W1q`l(I3%YKi+KcWF6aC5+Fc;009C72oRV;;O$MN z&)22yRaee;_j$z>F%4JeYQ39B%x^rR=xix{^mc-rgTI*5@}rqO>{kh7gFnA@Yd)er(t3GOjc0=T%2u(Q3rvB0zuu0RjXF z5V#D1IKN$58^^8vbx!kESlv87qO>FOifC2)c}3)T(LXVMWIQ7J(2@WF0t5&UAV6SD zfjAD0^V_@YaXtQ+5e-pS&I_KVJR-k8M4dIu=*Nemf8x5cnzbsM009C72oNAZfWUnM zaeljOXMV(eUSq$1D9?+$V(fU-M}PnU0t5&UAVA>iD$aMCAJOKgA+9qsKcdb45fuRf z1PBlyK;Uu(%#Uch@6C^ByMIJSfB*pk1PBngG=aD-=FoLB^YqB`AIy)KXFrOX009C7 z2oNAZpml-Eo*&VA?_6EwJg@zTMM!`E0RjXF5FoI8flHeoF}EJ==SR#fa`6%%K!5-N z0t5&Un7_cIZvJi10s;gG5FkK+009C7#ubo9jO(p70t5&UAV7cs0Rl@9kVh<`7qx)^ z0RjXF5FkK+z_nw7(OQ(^AwYlt0RjXF5V%x(Rx8e_0xjI2z7|1PBlyK!5-N z0!;|y}&ICj;w8TFy4RyX4jWsCO5BeHiH zpNKqe)g5Z7*9j0HK!5-N0t5(5A&}31m-G1VbS0MO>nUP7z0N$|(BH4Al$GBe#F?H9Q6?(K!5-N0t5&gClKQi-){1V{x~+Sb2_e+skiFK8%leg z-dxwTZQpw82=A_c)s^>S{Abm@wRs_~D=Y8%Nq_(W0t5&UAV8osfyf)mb^5FByKP=k z;#_sD#d|28$Q#P?_VcXEetq6?sGPB1&*MME-~5QN`$2sK2oNAZfB*pk#|dnYyKk;z zDtkp95y!E|l{LjykvBx$Wqm&LBO-5$JZ{(j@jBXNNq_(W0t5&UAV8o+fqecupC4~A z=EE_?c*E`Sh@5vEE@RwxVqW!bUT1#9xV@k@0t5&UAV7csfnx>Yxb@I+?6KucyItfB zS649}QR0a_qJMwdI1km{kN-q}L>_l&53ds-K!5-N0t5&UXh9&ZtBLDu%#RqiS0ZnS zJR*+|jT?>H2oNAZfB*pk1PI(M5XY@?99y>T&yU}|_w?^><6lQ4W!?OU@USF6fB*pk z1PBlyP*WhE|Bk#O@{F2w4_|g%#}wB!<>y%sU*owY=IhGNEzkZ02oNAZfB*pk1ZoOI zo{*1Y<2t9Bbq`l|#y*#rm>AV7cs0RjZt5O~zJ5r-%U5FkK+ z009C72oRW$fIMP8eI-%?1PBlyK!5-N0<8$hBUm=kBhz z*QRZJ+i{cD$0Kg%X|4OV*W)50K!5-N0t5&UXhC52IQI5&ZVNHK9z)~}@mg7LcRV6| z%kp`;PVC7#+F?n6009C72oNAZV2%R$I5(bC_vWTCtFF~HZI9E}CC(RJS?1?i_s^}H zsvY4Oc||<;FV?4uOT7dL5FkK+009C79wM-N9NUja{P6Pn-?Q~Y%B;Ch)h;ThgP-fUnzBAhG<5FkK+009C7<|&ZRkC)@~IL=*lZMSN5Gagam zY;QawdzSHu$kST)ZM*kHM}PnU0t5&UATYi_K0jX0>%Y^LNS?39kLZ{h^LRr)KceiN z-#@0zn%k_pQu_0C_{MckHEUHi0RjXF5FkK+0D;;9`TTgf4(D;27hF4vhn63C!;7wz z(B61N_RQly4{f>q2oNAZfB*pk1PDwakk60D_(X}tc*HP$vg*P!e9ey-Mph{V2oNAZ zfB*pk(+a%3sXp?CRaefJ_w%l&jqbkMSKI4_VxDz-;}LmbD+?%7Pnd+zi1J^=y* z2oNAZfWV~*#QE{JHVyCdhPdvgO^>*aDWZG2F7d~8P5J%UZmQ*~D>e6d+P9lL;_IA>NO?A@Yd)erz|@GOiQrpJyF;#Z(cgmjD3* z1PBlyK!Csy0loiLl{dG=5)KRaD)pnjilMt}eT z0t5&UAV8p&fIOm>ta1quAV7cs0RjXF93xQf|Jpw{t?bk8^CU{VFS@eqpC7TkkL~)H zHrL!{zh})Fl}&&E0RjXF5FkKcJb~?TcUNlc^M*JM9xsyPYASK{&yU!~zdmm7`deks z`ZcP7009C72oNAZfWUMDkvGI~a6C8d%}q$FZo0^JYmU63#Py;p%YHnfY@MH5w_8Sy zweSkRcwTs{*QisO1PBlyK!5-N0tBWK*geke$0L4tdHwI%daAgh-pCtbJ@ST4crV}Y z%Io9j4ZHEIy6_6mA8$5zvX1R62@oJafB*pk1PClqAfG=k$Lnz%yz1I&^J*RA5hbqa z$0M>=8J~zetTn&3dQ&t62oNAZfB*pk^ApJD&&zrKce>J&R-VV4#~b?j5hc$2{@DGn z>Pn5z*Wnk}IgK5O`UnspK!5-N0t5(*DUi>fm+N#MuOrVGGnV`7ioD@PSGJvgJR*DL z@tynIWD5cW2oNAZfB*pk^AX7B&v)|%;}OU8JQNnAV7cs0RjXFT$(_PKg9X-7@sH(#v_jVJgmC#3P1BBj+3($ z0RjXF5FkK+z`O;%*&G1(_ZKST6a9T)+iKlvUFIXa-^}x@^ZbanH(>pBPHp*#h5!Kq z1PBlyK!Ct`0x=%(?Iw@t=T*mbPUn?A)ZQ_#`s%90`}F3%uiN<7L)G-Ka#mg0FUD_H z-CLU%o~+C3ei9%+fB*pk1PBmVra9(hIN8Ev&Wu5&sx9x;BjF|WE!ukk(9NPqwV z0t5&UAh2wKIPT5I!Mo?zr#6VZp`Ra7B8unGO&;I&IE+|KLG*+2oNAZfB=E^ z1s-+n$0$Mq1PBlyK!5-N0tDI;kVmxDAEF^ZfB*pk1PBlyFb4s7#2k7_j06Y}AV7cs z0RjZt5|Br<)gPiEK!5-N0t5&UxO9Os|GIx3bIikz`SMmu~v|5k=mx3FqbeT@f5VZ-|}? zpC4~t@cimcS&@%#SD{ei9%+fB*pk1PENVKt8{o=L1ZuV}8W6{%R*cfB*pk1PBly zuq%+yugCaA*~)lCaaeWX5kBTe6cIlO5FkK+009C7E?dC-h`amW{D`}Kyi0%p0RjXF z5Fl__0{Q%Uj87B=;}OMS)rCj+m>*F@{3Jkt009C72oShzfwwo!kGx^kmH86=bLpnl zS#9sP8qc8{|9(w*zQ{M51ngNO_p_R|chpXR009C72oNA}c>-~M{jE*Y`@A9MT~8wt z_j!%lpRP-Mao^Ycer#83x#~*EeV+C0CXaZ$F0cDZfB*pk1PBlyK;SY3zT2K(FRfp7 zF^@R%jA>OOZ-_i1k4MyxuC4Kz`t4N%0RjXF5FkK+0D=1jR$a*>`sdE=<`wssFzgnQ zH$%3w-Vyt@ALx2DQ0t5&UAV7e?`2vr+^UF{I0RjXF5FkK+009D* zB_NNutp3(o0t5&UAV7cs0Rlq^$RmbOR0aV81PBlyK!5;&%My@BTvmT;Edc@q2oNAZ zfWX`Y;=ZqOzoz{Bgt6OG>W_KWG4DE}$n&z}_2HKJdEdj8tRw;i2oNAZfB*pk^B0J` zA)eP9&$})yo9cc=Pq)u|i#(!!-Vi+*?T`E5#_N^@2oNAZfB*pk1PI&~$midG*gkhH z@{HSi)O;oKhR7r8k4NP8=JA=DtyMMw0t5&UAV7csfw>9f^Y6QP!&u`HkvD|i*y9na zuGIW|I}WnyVtghdvLrx&009C72oNAZ;I=?M|32;fh}C-R`4PFjd3@%!m{$l8AV7cs z0RjXFT&_TjKg9X>7@sI2mp2{}?KeN-a{r&uasmVh5FkK+0DiBiwyjYmZLV|-?4Z{-mnK!5-N0t5&USdxJG z5!b!>WL^4n)#dS-^17b{2oNAZfB*pk1PELU#mpZLb zDggon2oNAZfB*pk*8-0^4g?4gAV7cs0RjXF5I9Xh9&wtNtqBkyK!5-N0t5&UFdpGE zK!5-N0t5&UAV7e?=>oxu4N^&$EtsK1oHX$7@sH(%Nvh~_L(1XX`giMB|v}x0RjXF5U3%L&(G)i1U2gH z%QQctx9}SQ0t5&UAV7csf%XOR`S}>1D3LF3JR;g>enk79O%W0xK!5-N0t5)OFVOb< zi1YpO{D|{QR00741PBlyK!5;&%N5Ay=VN@Lh)gveF?4^dy1MNdI$q@wAV7cs0RjXF z5Fl{8z@zT?ZEZ<_009C72oNAZfB=DO0eOVa0RaL82oNAZfB*pkrwYg;P8G8~0RjXF z5FkK+009E>2%iB01PBlyK!5-N0&^A^`*{-Oc@_1ZXPxgyHRrw&I{^X&2oNAZfB=Ek z1mb>8@x14_pHqpm*8Q8Fu1mdpp)W z@`lJGp00Nzi}!b5y=yJUo5xq~+Shvo2oNAZfB*pk1PGiakk8-8_(UmXsPTxL7Yscf zvFak;h(E?x%Ikg-AV7cs0RjXF5Fk)PAfLZ4^B111OI@q3EQk8JS`R%xBFCG@SB8pQ zIRpq0AV7cs0RjXFTwUe!_c1!gQ z=X7X(#Obxwjra6;>_LD40RjXF5FkKc$pZQOeT+|(HjgzPajx*H8#dl^Dy5FkK+009E^1mqF*Y?Vxa z009C72oNAZV5tJ~h^6+db`c;zfB*pk1PENFz&Q7BI&{CLxS!MU_WAi2$M0!N0t5&U zAV7cs0RjZh6&UCKO~XCUI_@v!`PJw4y!{CfAV7cs0RjXFoG*~i@8{=5pI5{A&$G_) zLTJN0RjXF z5FkK+0D&n5^7;K?pBEi@#i98T_qTl5c``kx z;&43s-&u9#^@ql@zf`XhAV7cs0RjXF5FjuI0r!2KLobPu009C72oNAZfIwRU@`$$j zLo@^k5FkK+009C7<{%)Cm_sj#kpKY#1PBlyK!8A70`iEq`a?7X2oNAZfB*pk1cntD z`gs!N`45Ng*A(}2I^2eQKdHl8dWQf30t5&UAV7csfw2YReogVb=(wL#iQ}R7OM3Y8 zBcguKix~TppgsZw2oNAZfB*pkrwios|K~lwA;udHjYr&$@4WhMm**7%1PBlyK!5-N z0tD&_zozqI zwl@I+1PBlyK!5-N0!tEbUDJ|!Q(FiSAV7cs0RjXFj3XeA7{^&H1PBlyK!5-N0tA*M zAdgs5Z)ytx0t5&UAV7csfpG-n5#uP>ASK!5-N0t5&U zATW-AJYpPYwGbdcfB*pk1PBmVlEByREvYryLVy4P0t5&UAV7e?7y@6v_gAl~`Op9P z?W-TXT0VO9-}UnP-(S4??|S|J-TwE+)f-p;)2rYA^3{L;&#UdrKY7R&!h!$+0tEI7 z828@G;za@k2oTr`_@3}lAV7csfx85JPu!*BJpu#>T(ZCqn+I+Gt1cUSyLtUjpO)uv z|LN2GzI6fw2oSg=0r|uw^|rPWAVA=B0pAm+o7sZ^0Rqbsi1SFfRpq?W?ek8t-J6?V zzTTd9iet2w8UQ3CISQq3@6}w zVmM1B5g_R!%O~dA!{R1DfWVjn#wW(qRu=&R1m-8;dt!clCSn2v2%INy-?&7Se(d-} zY;T+*BrFLKATUpX7?;@ndw#er$Bs`#3Gw|C^~CFz1PBlyFeicguXBpl$R|R=k^lh$ zmmzTKalU-wGCmhtNq_)>^8}1zpXX<90t5&wUBLIm(tB9@2oN9;0>_SD$M&b5cZ&Ut zXNQC(0RjZ(Byjxrb+qc#aqQS{_xs3wJi^72009E63dH#J?%(hGqm@tGZ)6Js1PClg zKt8dYzSI%|1PBZ(5c$NZrOGEx6|+470t7Bm!1Yd-*z4L%fB=Ex1$<8&Z)HmY1PIJi zAg)tAHTs8M?-cdyj+?vgDO@ZG5FpTsK#WW5{=Ggvx`&QWL=Ex%6mi7smIMe8AkdP) z>DM_$^zw<2up~f$z%m8mI9@)n%>LCX0t5&QBOsp`#!)E*2oPAFK;#qWwd}v@9=iX( zYy$Yxr*CfxFpm9DNBa>VK%i{_*TuHoKcXW*fWXuOz9**c0re9gK%kbuL&vXo<9Yab zrzq!*%`abnTCTJG)2H#eB>@5i2uvyP@bT-2`rPYcqnzFEE8`U5Vo87ifvE&y{CfBA z^Xbu?JI^j^G~X^HEC~=G(2{_BqNUyt3jqQIS`v^?wA347AwYmYs{&tt8uJ&^T2r9>sY*VQ&Hi2n;1K?BC<_zbC%g&bN!@Q0-I>0RjXFv>;&qL<_wj1_A^Kv@76y zqTRj`836(W9wrd;+8(xdzgH>e{PRvxV#F28c-@i!0RjZZ5s3NDF>X9et;2s$M4ZFK zrxXGN2oN|;;QV!fIwRU@%MMw`E0{|Pt=L8tv(P9 z0RjYC78v&XAzC`z_e8`O-xpDXB>@5i2+Uc)Ji9sfp4bTxAW&bx_e6bTH4q>`U>t#= z=Q$5OA3GEx&RE9lmIMe8AW%mj{@%uNs9H*S!;McwToGq1<8?~{1PBnQBM|q&*q!e@ zR9*GHCnD~lB2^9n0t5)$B{1Clx~OI7`*uXRyWeN--w`gB1PBnQB~WL6-PP65_w9)G zyMISWSP~#WU`&Cbo^zUG9{#*jZXN0@Dllo|wK5L_mN5f%61v&1z9+_se<%m# z5FkKcegg6R5Pxs$w4mPi#5nQSQBf)Z0tDtDQ1|;G1nPZHMEvo65j9#8AV7e?oCMsr zV@|y#RssYFj4$AOVtjKo5+Fce7=c>zup_$K^Raj9`TEn^?TPv<2@oK#bbI%et^LFo# zRIAQ<*TqJ}@qHKViq|a(5FkL{9D%Ptjr${=Q_B7O*8iS}?>qA-?(Yp-5FkL{7=ieE z8p~t$dH6Q#ENi!KtnZ0vPb_PW^bbdtzC;UCJjwfWT4( z;_qlIYqzu1<9njEv+@ZLATX3bd_Tl;sB#aL<9p(ejMoVeAkd~j+)p*`n>S9B_4A2o z+BJ@zS_lvzFs4AvuN!whTK(^dY1%br+50RrO)#P>t|T^*;^`ri}Nv}+tawGbdc zU`&Ddeu%%T{!-r+}QK6Yqv-F1PBmVxSRs zhst@m`S-87L+_vadbDHQ`x>4bwfzYYAkeNr{5_3%Y2!p%FP|v!fBosdY`%~F^yxV5 zQ40YA1ePlh^U-2CPD|^3PsI0KEXQe&S_lvzuv~%odm77eT3YXWBEIipIZk`jLVy5) zU4;Wi5wN{_x}25qB(W#jjif z1PENJK>U4;`yQY(Jt5+Fd}QU!MZzJ6W#zDUF86Q$q2{`6b-b-L7# zuyzw5P+1`En>WttqU{!_r$pI*VR!v0RjYC6o~JK_^i1~K099pE5JN$X4 zTJa9ue&rD$Kw$0y@%J{CL$_z>?}>;rmP5y@JOTs=5ZD!nzqfH8jNNz7UmN%EK!Csy0&#z&xDUnV0 zdX0W3K!5;&AqC>^ZQXek!{-xmf2tuZltq950Rp!LV!m1|Z*MWgE5m(H#P?Y&hloxY z1PBlya9AMz-p2C(Z|{C~Y&Y)wfFA|1VFQ7;0fYnyva)x100Dg!WE&u_5Won$oSg%$ zdO5f+AfVTJfPvP6dgF%(#-2ff{Fxxh0QTOC^!4GlCDv_T{;T34c|MAj5_!mC)rURx zR1PJU)An~Ei^LFdwMBDc5>s)9J z0RjZ}D3JJ&@wjdq*T;#puWq~4Mt}eT0{al~oZUXogH{kAKwz%|;>2FhjCK(qKwz#w z?dR=k-51-xA8T%}Y)^my0RpuI`r~n}=k3*pu(ym;N-s*L~v0tDs? zZoGQCb=DFfK!Cul1w21->oef^1PBn=w}3dY@AIQ|1PBnAFOYeP z>z-?$qgejEQ|8s@_rM+m2oNC9QXu1Vo?lpctfkLSW_K| z5FkKc&jRj?-SgSeHUb0)++IMOxcxcM0s;gGv=LZ4pS|?H*#7)To4%=)009C7)(iB< z>!tU{&YhodKkWK5rv?H92y7#;bv}{#>wbLNrmv1dfB*pk^9B0jwR~c}pgjl>AaHJh zTjdkyR@FNK1PBo53%K8@?_r4m0Rja20^&s9!x8}k1kNY0Zk}TL{Z9Fw>wJQGM1TN+ za|>kr&izPJdpq^{iPYPVM^letI|2j<5V*BKfBc?%-_z85!gCY1KF^L%fB=D|0$b%1 zOWS8Z0t5&UII@6w>?5B&Z6`p0KzjjkqP?*r5FkKc9|Ci~f0{av-Jk#1M_;vq009C7 z<_q-4^QrUMWAoVNujii$dk`Q%V4niD^NHLKyU*Tg6#)VS2y7!@eqtMEMIVS=1m+5ieg8D{z0=&|*q#6Z0tC)1AfGt%+0{1!1PH7b z5GU3fs(}Cj0%sNwC(e9!^^E`l0_z3-`0$IDO8(|={^{kXFXhi({{2vX_~$1t|9)8h zUH9*2m(MQ${^h@a{_^kR%l6lQ{`k=Shk^hB0t5)WAs`=l1H~!=1PBm#6%Z$0Df|Zk z0t5)WAs|k?fnpT_0t5)W2>jjm-+uM=7r*&ve&YZA>bHOX^)KH&{O_)WMSuVS0{1K+ zpSb6a|mQUA>(`5tHg!GiOg4&+hsZNCiP~$k^lh$1db^%Hl8OgBuCVkq8hVun&QJPc+t=eD9R+p~kj1 zPcbIsa{>ei>{}r72N}3srA~9009C7_AFo?d(US_+XxUK zaC-r9;`Zl23kVP(u#G_G52hY1-#cZ#V(Narf0`;~I|2j<>_Z^)1sT7`T9vqvIFb2^ zvHkLS;!%#9^-2N+2oTt(K*sBg-(#&zTu7Wq+!)(0pC=yWxLL0xK!5;&eF|i}&iFmn z%EX1liNuYu{qlL@QI4DSN&*B35ZI@{-0?bbA#q}EuM&^u9(V3>Y)^my0RnpvaKFTU)+&%J)!n_cu>5SIqVV2oTs-AoBwmucsb8 zaUpRc^V(DQ&vuDVX-C#82@oJaU>^b*pEF)hZB^nz;zZ)c)cvzv;#1m@^-2N+2oTtZ zK*r~c*Hc@SxR5xJxG{DAY?t_yc4WPh009C7_92k*Ipg)zRwXVZP9$zj-9OtUKBXO5 zuOvW#0D*l7EFGT{7ykD9Z@>Ebi{Csf?alxB)o=g&>tDWm_@7<5v>y8rAV7e?o(0?& zyXUi`Z3GAqxV?Zlar<+i1q28XXd{sMfu*(Qd#B7-EUhQsfBi4tKP@G+9{~acstROW zo;!b?MkFq*oySgniC1Y?)+-4RAVA+ls`6#EHa>x%FiG#H+L`>y-ou5Fl_HfsDr)pXatBaUpRcabs>h**@_q z?aF#30RjXF+(sbdah_k8+ls`6-*?YXEUhQU{qNoU_0qVNdXxkR5Fk)TVC{2li3`am z*0w77#Q$}_(^^XV6CglfhXS6T*x^ahBmx8o>_|YI*wM+*6aoYYR1wJh#M;XKzS8_e z+L3mp%z7mO0t5(bBar8v*UlGbexla%*y(-ZL)w}3N&*B35ZFc_<8bDUmmW3uJ7pd_ z_sK4;FZ(5arJY%?BtU=wfo%jb{$@O0dep>)#EHa>rS)aM#ILk7>y-ou5FoIPK*ryU z$4ifzxR5xJxUsap?3ehJc4obj009C7wh_qqo9Eh=9yM_x^Al_9OFJ^}vG)0n)Tbms zfB=Dc0=Zsan@=Pzv`wIg+HwP-P5!yW!fj7h=`H^ z0Rm?b@SNQl&Z0gLAV8pk=1gKWCTv6VKA_tXC2sK!89SfsD5qf7c!*&)FqTByOy&H~S}^rQKPt zBtU=wfi?meZ}WZ8+M^^c)cW1ivORf@uU1?u>$gmR009DhfjqZXYurt|Nj{O~{!y1N zC7;N1cgt(CCjkNk2uu;EJ?W)c(0DiteRPU2hok@ZRf1PBnQBam@6_nFqI^>WGc*tst@@A0Trf9gqmOFyz+Nq_(W0(As3 zzUDm`b!xp_5*LzB)UH46Ox{xa`H$4EBtU?`y$j@eymmg3xR815{9bl#?^f-v-A?rp zAVA=#0(n1D?d$Qxg+F}%?N?ua@tcRljoMDF+F!e!>LWmaz)=NSU5_U&$S02am!aJR z2oSgmBcI16ewU3kf67SNltXC2s zK!Ct9fsCse&zIFQyjSAF@4M%*TOB7Y$a8(I;$DuUBtU?`y$IyFv{vJ4;zHgRo8?x% zc|TR2yK8kE^%5XJ;9dk;kE@9bTix%}I_}-e--Uh>AV44jt;f~G3He0Cl>`V7IF^8X z;#lWPYY7k_u(d$)iB`ug^NCi+NxiM(UXG(AK!5;&76RVy)IwFA1PBl~k-)nX^+i_* z5Fl_D0(pL-b!WG_-zojrs$V&tk^lh$XA{UcnzB{@GC#3ZoJfCCw(6I92@oJ~c7cqe zDO>edoMCVe+p1r!ywpp80D-*-lMJ zwK`hj#NT%B?f8dA?{`W+@?1!({-~D#0Rs0TkoRe{9#<0=5+@QjYC9+HwW_~%d(}sP z0D-*=i+R0Rr0!BtGQ*NVSiiIFa{u zj+1tK4!f49dI%68&=<(~nt0Lwbp2A|LY~L|$I9;kOuKWR@A?+2fdByl1b!@#>-|>G zA0#d$pUC?Mf82&O|D8BdyWTZzvM&Jw1kNOoe4^F$c*gJC@ARk2`9$mXpXprd3jqQI zmI&m1v90on#Dza}?*UBQSkl(F_G#Vzw~lEY0RjZ>Nuc%hc;bS5;-3Dh^pyaCGYPc5 z9xwBW+IDGw?RwQmfB*pkw-E5&j$5cZCIJEjjw2vW9OqnVDFFfm`U1JXG-dzO^-Gzb z$bGo$YrNLbs=c+^ryc?X2%JSA<88`X{YqS@9VgPxl(pKc9s&di5O`Z4<89u9@%C2p z*CtNnIlDZcJ-?>@9%*Op*Xn<2i2wlt1ZoRpyiL5QRe$0_?e})1ovoe^tkr+@5FkL{ zECLyCGyc}&XZ zw2Eufj&3Ug1PI)pK&x>#aUuCcE!o7iTJ@=i009C7_8{PS>^+N z$u6xg?Q);fQbGF>AV6T9K*rz1i*>bKE{O}d-zm@CEv+~0%Dns1dhADl009Ea1Ty|+ zJYH7I4|^ppBu*r5{IJEm|4O?O&*trIYXSra5Lhda@i*h~+WHa~5+@Qjme!kgC7vy< z$9@C|5FoHjAoB^eo=-?z$oxd!53;OvmrLTr+Ip5A-+lxL5V&`N69zW?^CufO=s!&=w0Z*4vHCqRGzfjtU%&Tfxq zMVkl^Ag~_+abiE`LQ4n`Ah1p#^Tm0tZC!1bOXjh2|I^a?GC#3&fBO+2K!89UfsDtA z7fWkRTv&TwY}!$4etl_w>_>nA0RmTnjK>+Dm%8M>*u;s%jk)!u9f@Ca_qRO(0t5)u z707s;@p)Kk7s)V1PBoLv_SHSwa>L>T+j2^pFZmF zr?sB@8$NOf^a@@qLsr%WE009C7wh_qqobh_@Q4<#uClWWN)|2BVUQON4b_56zAh3-< z#^;RJbB~(1kT{XJF}0o?H}Pufezqe(fB=DQ1oHgD(&rZv7xJ9l+*T(}%-zrS1PBly za6|$3#UAmjX)^%=1hx|pC$_V8Bmx8oY%7rYfu-LAWqu;_6;oTE`H`vH+l~MM0t9X& zknwtMoJd?qoXC8|STAy%#HX?CeNKP?0Rp!b$atOcdunSE7ZN8DH^%nQaT1@#w)Z&! z0t5)$Rv_bb#_y@ENnA*rNZc6PKgUUY8r$CI1PBlya9e?l*BQU3wkB~QaboIzbB{B% zUfU5MK!CuW1>Enn=d+`21PBngy?{7z`*WZL1PBmlE3kB)BHugZd#JHi=6kNO?R-vv z009E~63F;Hb^ai6A#oz}+C#lcy@^Ld+gVS5009E~6v+6U@qDb6i3^Dni5o-vrQXD& zq3x_EK!5;&eF|j!&Uil7%EX1liLvdc);m^@&j}D9K;Vc1=CO}>*0h-b0Rr0zh!fjc zI}!l`1a2!Z_xq=O@09t9q1I>qW9W112@oJa;1~iK&&TEy5*HFDGG9^lGW8_>l%HEB zK!5;&V+mwD&-gyn`ox9AiJ|Sr>KWS4dIAIp5IB>7`H3@~O?@FifIxi#aiYGd8VL{} zuy28>^A!2sDc?hty~_7k<$B8m2oNA}Y=MmLL-PxX3yBkDZ-@3Px3f%u009E`AmDqa zdpOJbNPqx=Q0%PAl4Snx)>|Sd<0RjXF)D@6V)b&&w0RjZhCLm6n z?TqRV0RjZ-3WyVRJ=I2l0D-d!{PE!zFJ1aK|MBOSpT3kod-?Z6`Qe|Ry!`uN`FAh> z{`F^<%V#hD@87-r_s?Jcy}WGy&%gQd^KZU<|6GtBX`6CiLe0_A)|+3%sx`}v0Zn@Ts!1PBl~ zxEuWs#i{uBz^6TgQ_2wnwp(H?n zz}WnK!&HCtoQ0pZr1|QOZ~*K!Cup1>_OOK7U$IfB=Ek0%iV?;|;CP=P8q4 zq|ACH0RjXFoI>ES>_z4yx_OG%@0;G<&U{4aVwnH|0{0@2d4|k84D~yCM7AH=&Uyj_ z2oN}iK;|RHT06E~Kkx9I#F(eg2@oK#cY&e%nbPio=OsS6|FziuSsoD)B>@5ijwz75 z;9CChTts@4yr5Vfj1OHsexEL2N&*B399$rIM42z7TjhOC<|87bBtU?`xdr4A=RUuB zM}PowIY~0RjZJ78uGO(vGpu zvt7#M87Z?~Nq_(W0*4fM9BOs$Ys&pfL)&G2w#$B5uOvW#0D*H0WPV|4eqdhW+VX5Kg!Q7 z6Cgl}qTB8vy~%!A9xA(fdR$RkP_%LE7z*tbCPf$n-=9h8ef9ig=BS3%vf!hdVK4R|C=kC|f zL*7r$L*};2_5=tJAW%nO>itYP+S2=)iv6GE5fM=mAV6TB0?7le_OOK7U$IfB=Ek0?8xF z{9x#~WxkR7l!mr1*C+2VA5qF!CP09|z69hE`#K+5Lx2E*y$K|bDD#7%c9!`@@`9o5 z%k{}S`Oo%v9I%?H3SF{*qcD|h%!GIYG;{mBrh1+zFeQYLmpAeSSCP# zz`g|J5&JqHT0?*UfxQV#%^%Y4x!Y&Il*v0%X1$UC0RjYeDeyS8RbAfk@cB1izWi_c zdtXz3_FEfgQlF9l0RjZ}DbS7g&r9=xe9x77_Ss9VB0zw^{R(89UMjG3|KuYnmmc4K z1PBly&_*ElGnMx#jUBE0o+$SzjqO){p8Ui8O{I)w0t5)$Rv_2^*K+)QuW4<0-Jg2$ z`P8yIuJ^xA1+yIi0t7Y|NFGt<1!K)9^N!>LWBZk#C;yN~lrokH5Fl_{fn5K0*Yh)f z|KW$;d#btnXZ!45es7h}l>`V7AaHDf>-SDi&-vbJX>YQB>RVcm z{Rj{sK%kC5#^trOt*xiq-}_(Jo(TIBAV8p!z}orZjO%I6+WCaUnYr`lIlhtr0RjZ- z2xL6ImeYSXB1bRdL+Z=tbIYzB@`$-`wkJSi*?+$wTB3rHo|)1PE*^kn8^L`duEeEx)4?AV6UE0?8xFd|+zB%lspGz|{TA?UIMc zBT5;|1PBn=RzM!Ht+%5QAVA<~0?8xFd|+xn%KRgFz|{TA?UIMcBT5;|1PBn=RzM!H zt+%5QAVA<~0?8xFd|+xn%KRgFz|{TA?UIMcBT5;|1PBn=Rv>xA()V6;`@cRPk@0k0|qjx3~UyZJB?pjT6a3sq^idBnu6l;!7^2@oJaU{is|rAN#4ey;zQ z)|35GPwlvq`jrF-5Fl_Hf$RMB`rn~T>ocF8db3_hfB*pk+X!SFu649p^>y`l|7)!i zqaFeT2+S1duFqGG!x_(W_{wqOxohX__YI~!N&*B35SS;BaeVFg+tu^>d_?M<*P4&F z?%K6FetlfCH3SF{ATULs*7Is*oTzm_QsT|h=liA@*oFWB0t7x5$oSh`uP^={r;HD& z_v0hZThp~m9x;#2)&vL;s3ws6OmqM0(u&LbRM$R7mv$r{>DswCj-@^&0RjXFOcTiU zes{gTc>L|^F&{CF-Btt$5IBrL@`y4InA?Fe56Sia+-oO6ifSi7fWUbLl1G$z zz}y~}c}TAR=hjnhpLipWC}k`YAV8q4K&|n&A0O8L4qbX(D}JRuB>@5i2+R}6INTrS z=hg9H>oN~X{Fz@LWmaz<@w^Jzj0x%{ZRJHHs6@UAq^* z$2{#*5+Fc;z}o^DziW-RU47MmKO(K~+F320rCucg0t5)WEl_*h-6l@Fmq)yPI;|x@ zfIu~YZal9x-fj~gp5zhL{sL4)fB=C{3)FsJUKuB9KhKc3w)XvlpH}fH0RjXFWW2qW zPpjvD%lMG`Ye{$Qlt34IIBSNi1PY>X@ARnq;{N0ULucJdWP&rfB=DM0vW$+jko@5i2-Fp*J?{47#Ov={ufDG~y{;YCQm>K#0Rja20=2)l>0jU1`#tNl zI`OQGL-|}ufB*pkbp>jVyZtzEx#YUPR;z2rwOZ{`4*>!M&L)uYyNeU6zYpqP-t&y?@4YSo*1Qg7=xl;bH0 z5FkLHjllJJx~J~uMR^yH)*Ny?#exnBFG@ z2oP8$&|QC5A7?Xur*VzrM3<+m|9zyiS4n^XfqNIoxZTBxYTpBG8z20x^}YWc>puYk z?F72`AdhHAtY!iP2pm#C9&yOirqKil5ZFvW9912owUz zBg*UkVzb$cWnPl&{n-_b?2!CK9x(#tV*&&S%oIo-QG33(tGD@lb*uUInT$3kK!Ct$ z1(HXU*ZpfdT;?UY-d|g9xqtE#c|<8=nE(L->jYYjul@K?|99xp>sIkC^(zSwAaL&j z8E5>eecS=B=Kl{&HWk@f8-H;7fS>P5LheFYJBa-2lEkY&y)QL5Fl_Xf#ebWaeaMj z%Dg1;XnoE78j_#LBl<3u2oNB!R-o1R+K&(BBi5cL`x78Q;8p^)^M~}KRlTV{W%84h zS+68OfB=Ci0*_T{`B5c_5BVPJM;}%F&(z<~TdE#HWdsNiAka`C?+eU(KUy6s_2+o4 zj-y@z1PI)VK*rV9{cU}mu71BG(fUNHp8$co5$LYBn~kd(w*$ISoOtf~RqZ|JX}^*H z0Rs0Tkny_Jc-qzf`rg+Zua$4tk7n_%RlC(ofB=EL3bY`h9q1 zevfPGme`U20RqPs$avi@5i2+R{`J+AiS z#O0Ff{CTaMzIE%kH@zjcBtU?`u>~?-x5^{>*YoBhj{Vo7^#lmqqd@YA@_N6PML$lM zkErFU9s&div=(Uny-Yvun2%_EKGjcv0D;;9$s@|^{aVNA#|iThwOrLhfB=Ek0_G!H z3#*?10RqPsXq7)irFH!|PRhi+lv%GNK!5;&MFNkD_L{I$zGuq!Src|ywMmY%bzEB2 zXgd=iK!Cs{?+;Abnq;fvwC;!c2@oJ~D}k-X(Htk`t@`V@1PBlyFiqe(UOzSeJ)SNu zJfu~v<3#H3`d9sTlhO|*0RjZhDzMc!+8t-(_|QJ?o%QcRzX%W@5P|MGTOJV*B>@5i z2>eAr9^nsx009C7J|!TJ_>_*%2oNA}zXI}z`#tx1PJjS`DFX6{DN42>K!Cvg3CJVv z@0{x~0RjZ(2*@MmXxWwk0Rs0UAdk48bFHTY2oP8z@cB1izWnd$q4oRkx_I>Z99`@8 zu_pd?{qvmll0Odn5Fl{Z0$YuvTgQj3;@(~V@#s7O0(T*h_h{$+-K{!Z<|*CrnqA)~ zPwD#C>^QBw)JuQ>fm;h~HIDY63cL@QzS5+HDPfvv{Teta+=arVC}{Ubo&JOarh`r~;0{*`%3;#2)2U29C9B9CY# ztX={H&MvUkINFa7<|EGjccp&>2%JYCc|?C4uiw8iPf2{Lf23=T$y4MJt%TJ}fWX-W zwi-wK@xgq=+5fKej{t%52qcf_kK^_GSLP{+PxX&APAaHhp$JQN8Tu8aq@me28{R9XQIJ-dJ z+nsW&{^q^pt&Z2a{#NZ)F98As_9BpR^jbbOe}8t4ljH8iK|2T#AVA=4fo|M>=*I1b zx3^lqwyeKZoJhUbvVGiJFQWzm1PJU?V5{-8JI-tT$#H9|baA11ysO=A^${RIV6OsO zjjP+niTBT4znXu4w%7BjT?7aaSS!$t+s((*ZR5j}JYwx1hW!Z;AkYbP*W1m<)otU1 zJi;G10RjZp3dkeY3fi9l0Rrb1kVl;R{OTP60tA){$Rn1@*^dAL0{0;xkGPNXtd|4` z5SS~FJmT|jzI^##yXVci5+Fceu0XEmTmKGE|GK{2@6hG!Mh6IvFl-Kz~+b><;j}zu2mO9#x009D9 z32gPfOh5jZkJ#$`It~E>1l9^9k0`J6*VbF^-;WdKBT6631PBn=n}GR)2+wTe*7^XvA4ei?IA#bz>q-l zi1IprX#1t>6DM-KrS(kQ?{VUGHX}fQ0D%F4%txdg*lhLc*6}9|-0CLWmaz)=J;u3pR5za#PVoZ}tEM>`1+AaL&jU3_@x#_!kP z1FGdx)>}JHq`qs}F3#2RP!9nD1dbxmdVKBbe~mjiUM-(4E;Ng8wc4p30t5&gRiO1a zyG@*U-+hlIk2vbzp>`7>us?xZ*LQKE`tM9{6Ca-B5&Qeo(jo!`P9o67hi2pKHgQ58 zagskr-5@|qYXD9H(B*y_z0-OBM(aAV6TXK)&}$xw^ul zg2abnb+yIT^;c`CiU<%OaBzXVS1Dzy?&SSSwd${3U#)hjhX4TrXA#Iado5f2j>J>< zdw1_W=XRDq9Q`0b;BExE_)z_Kt-JX15Xi)%EH5onPuFg7XDOup2oNAJBG78Q?dok5 zAN-E>$Z7R40RjZ733S)v@`!4pDk4CDz&Qlu5$8CMdO?5yfmQW_Pw1K?IA#bz^w($N8I`hI6eUa1okbE?{E6w53O%=`F&8n*IHY1 ztGKqdUG^tHfWX-VGH%ztuc;qz%txHlx=h|^? zZM*DGfB=EB31r-^J>K@?jprlI_IIN{1PI)ZK=O$4x__-eKTcdO`ChA1z4C~)koG4) zfWU}A#_ig9L_gk`j~F=(J|;kbz-|SSN0it7Ya5(6k^0xxSM2{-EL$W%fB=EY0-29U zS*!Zm@h0tRRd4E75+Fc;z}o_OE;{AgTP1cQ-D~+& z`FA9qo>Tw5c{nST*0D-d$bl2zA#^E+`;(hnMRlV=S&VF9?j{pGzYXy==)Oz1`86Vc( zH`VI>BPPXYu8%oE6Uey!)N`_D0~e_vCc!^?Ad^Ll4%0t5&U zSSuipSSx6M0t5)0Q=s;HoBG%L>)+RuJffeUobz1h6#)VS_9!5a*yCBzCISQq++M(Z z#O=?477!pnV9x@z?=P)=|7%y@bFKSx_k1q2jQ{}xdlE1ov8S`4Ed&S<*q=b=h5Pf( z%iCGbFDDKyt+Dp^VN2U#KLP{@+?zn{@wXozJRfmye^2^LfWY|#l1KE%_vQU8^O3}% zr8OoG>DuYNuS+5AM}Pop1}e1U@BTKH^h4J|jSY00DV~zX1XS2oQKnz1 zwkJS<0D)-&8JE}ojzsofo0m*$wXFycAV6R%foq(2TKqc_U7UG+J|b~vYWuT&*ABlw zHx5nF0I76AeTjwc|GINmwa zVgdvRY$0GiVhd%*AV7e?aRuZN$31siPJjS`mICG@TI#Bs009EW7g+mybk{s&`R~wm z`}_U5}~njTe3ia009Cw z7sz}>%DD|ne3-jmwqLt{>QNFPK!8A7fy^tUTza(3FHGHk?)FpbwH*Nh1PIg-NFLFB zUo`vu+}SVl8+BTx76Jqa5ZH^r^?H8(??{w+$JD$a+jYmC9hdgvrX2(b5IDO)uK$w{ zOzm%fo_qRxUo*dLK4Pl0?FbMca9e@ydVcorNObwY?BAi2N8I*&J30XZ1f~isosa0} z0n>knE_p;h51HCp+Yul@fWX!Q@`$a)9ghG30>=dfWTe^mi~@J_ngB+_Mh3G z$C=yPoB#m=1U44Pd_>BrhwnchF?FxYW$Av?k6=pz1PBmlA&|Tv<=kU*`;ESTY3g=! zk8gVd1PBmlBd~N{BJX*cn}@XNg<1&^AV8p%!1elm`uktYd}Ay>$miX0M)QqU{Zuaj z0t5)m6G$GAykKna{=CBY`1=BS3(_ zkigveh;I8XK8*ij@AbKwxhI@`$~i5$z#BfWSTk%t!3wJZJ?00tEId zAdlGVnb9r+1PI(#z9SI&RQOEuD=JpAwYmY1jgng`p-?j`!0D$_D>$s&o}a^k^lh$ z1dc8+HIK-41O0s*SZ_4}0t5&gR3Ldl%CZ|{`N7!dWqp8Ji|xx66tM!9^(D${Z08?Nq_(W0_PMMnwQ8tMVV)uQ$eo?5FkKc zNFehLWj>Mh-F}Zl`&&l&|meGY@gj^R8C}2oRVn@OB>Y{xx3AtJ|Lk)4=}Y;umw!K$AO88t%fBC%KYRK2uV4PZ&o2Mu@^Ams zmDw);_g>bM_1SK$p7Qgd`o`+b@v>c6j@6s(Q%~AeE@ypNPOZN@PU_G4 zv2yNlQs2_+thvWae^Tc7W98K2q~7?K%UNHRWAzW!ll4RGAF4O|mF>v#(C1}+L))dE gl-VxrEbGa3V`b`Dy8qn$rfxsB-O%Ud`f~aI0}QZ~{Qv*} literal 0 HcmV?d00001 diff --git a/src/system/__init__.py b/src/system/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/system/phlti.py b/src/system/phlti.py new file mode 100644 index 0000000..a43092c --- /dev/null +++ b/src/system/phlti.py @@ -0,0 +1,189 @@ +import numpy as np + +from pymor.models.iosys import LTIModel + +from linalg.symmetric import sym, skew + + +class PHLTI(object): + """ + Class representing a linear time invariant port-Hamiltonian system. + """ + def __init__(self, E, J, R, G=None, P=None, D=None, Q=None): + """ + Constructor. + + Parameters + ---------- + E : numpy.ndarray + Hamiltonian matrix. + J : numpy.ndarray + Skew-symmetric matrix. + R : numpy.ndarray + Dissipative matrix. + G : numpy.ndarray, optional + Input matrix. If `None` it is assumed that `J` and `R` contain already all other system matrices. + P : numpy.ndarray + Input matrix. If `None` it is assumed that `J` and `R` contain already all other system matrices. + D : numpy.ndarray + Feed trough matrix. If `None` it is assumed that `J` and `R` contain already all other system matrices. + Q : numpy.ndarray + Hamiltonian matrix. If `None` it is assumed that `Q` ist the identity i.e., `Q` already on the lhs, + otherwise `Q` will be brought to the lhs by multiplying with `Q.T` from left. + """ + if G is None: + n = E.shape[0] + P = R[:n, n:] + S = R[n:, n:] + + G = J[:n, n:] + N = J[n:, n:] + + R = R[:n, :n] + J = J[:n, :n] + D = S + N + + if Q is None: + # Q already on lhs + self.E = E + self.J = J + self.R = R + self.G = G + self.P = P + self.D = D + else: + # bring Q on lhs + self.E = Q.T @ E + self.J = Q.T @ J @ Q + self.R = Q.T @ R @ Q + self.G = Q.T @ G + self.P = Q.T @ P + self.D = D + + self.S = sym(self.D) + self.N = -skew(self.D) + + self.n, self.m = G.shape + self.p = self.m + + def sim(self, U, T=None, x0=None): + """ + Simulate the system for a given input signal and returns the resulting discrete input, state and output. + + Parameters + ---------- + U : numpy.ndarray, callable + Input signal as `numpy.ndarray` or `callable` object. + T : numpy.ndarray, optional + Time steps at which the input is defined and the output und state is returned. + If `None` the input signal `U` is assumed to be an `numpy.ndarray` and the time steps are calculated from it + with a step-size of 1. + x0 : numpy.ndarray, optional + Initial condition of the state. If `None` the initial condition is set to zero for all states. + + Returns + ------- + U : numpy.ndarray + Input values at the time steps `T`. + X : numpy.ndarray + States at the time steps `T`. + Y : numpy.ndarray + Output values at the time steps `T`. + """ + if T is None: + assert isinstance(U, np.ndarray) + T = np.linspace(0, len(U)) + if not isinstance(U, np.ndarray): + U = U(T) + if U.ndim < 2: + U = U[np.newaxis, :] + + if x0 is None: + x0 = np.zeros(self.n) + + return self.implicit_midpoint(U, T, x0) + + def implicit_midpoint(self, U, T, x0): + """ + Simulate the system via the implicit midpoint rule. + + Parameters + ---------- + U : numpy.ndarray + Input signal. + T : numpy.ndarray + Time steps at which the input is defined and the output und state is returned. + x0 : numpy.ndarray + Initial condition of the state. + + Returns + ------- + U : numpy.ndarray + Input values at the time steps `T`. + X : numpy.ndarray + States at the time steps `T`. + Y : numpy.ndarray + Output values at the time steps `T`. + """ + delta = T[1] - T[0] + + M = (self.E - delta / 2 * (self.J - self.R)) + A = (self.E + delta / 2 * (self.J - self.R)) + + X = np.zeros((self.n, len(T))) + X[:, 0] = x0 + + for i in range(len(T) - 1): + U_midpoint = 1 / 2 * (U[:, i] + U[:, i + 1]) + X[:, i + 1] = np.linalg.solve(M, A @ X[:, i] + delta * (self.G - self.P) @ U_midpoint) + + Y = (self.G + self.P).T @ X + self.D @ U + + return U, X, Y + + def to_lti(self, matrices=True): + """ + Converts the port-Hamiltonian linear time-invariant system in a standard linear time-invariant system. + + Parameters + ---------- + matrices : bool, optional + If `True` the lti matrices are returned, else a pymor `LTIModel`. Default `True`. + + Returns + ------- + A : numpy.ndarray + `A` matrix of the lti system. + B : numpy.ndarray + `B` matrix of the lti system. + C : numpy.ndarray + `C` matrix of the lti system. + D : numpy.ndarray + `D` matrix of the lti system. + E : numpy.ndarray + `E` matrix of the lti system. + lti : `LTIModel` + Instance of pyMOR `LTIModel`. + """ + A = self.J - self.R + B = self.G - self.P + C = (self.G + self.P).T + D = self.D + E = self.E + + if matrices: + return A, B, C, D, E + else: + return LTIModel.from_matrices(A, B, C, D, E=E) + + +if __name__ == "__main__": + from model.msd import msd + E, J, R, G, P, D, Q = msd() + n = J.shape[0] + x0 = np.zeros(n) + u = lambda t: np.array([2 * np.sin(t ** 2), -np.cos(t ** 2)]) + T = np.linspace(0, 6, 500) + ph = PHLTI(E, J, R, G, P, D, Q) + + U, X, Y = ph.sim(u, T, x0) diff --git a/src/utils/__init__.py b/src/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/norm.py b/src/utils/norm.py new file mode 100644 index 0000000..3f0d31c --- /dev/null +++ b/src/utils/norm.py @@ -0,0 +1,41 @@ +import numpy as np + + +def lnorm(X, p=2, tau=1.0): + r""" + Approximates the :math:`\mathcal{L}^p` norm for discrete values. + + Parameters + ---------- + X : numpy.ndarray + Function values. + p : int, optional + Order. Default 2. + tau : float, optional + Stepsize. Default 1.0. + + Returns + ------- + norm : float + Norm. + """ + if p == np.inf: + return X.max() + + w = np.ones(X.shape[1]) * tau / 2 + w[0] = tau + w[-1] = tau + x = np.zeros(X.shape[1]) + for x_i in X: + x += x_i ** p + + return np.inner(w, x) ** (1 / p) + + +if __name__ == '__main__': + x = np.vstack((np.arange(1, 11), np.arange(10, 0, -1))) + + l2 = lnorm(x, p=2) + print(f'|f(x)|_l2={l2:.2e}') + linf = lnorm(x, p=np.inf) + print(f'|f(x)|_linf={linf:.2e}') diff --git a/src/utils/plotting.py b/src/utils/plotting.py new file mode 100644 index 0000000..720b2d0 --- /dev/null +++ b/src/utils/plotting.py @@ -0,0 +1,313 @@ +import os + +import matplotlib.pyplot as plt +import numpy as np + +import config + + +def fig_size(width_pt, fraction=1, ratio=(5 ** .5 - 1) / 2, subplots=(1, 1)): + """ + Returns the width and heights in inches for a matplotlib figure. + + Parameters + ---------- + width_pt : float + Document width in points, in latex can be determined with `\showthe\textwidth`. + fraction : float, optional + The fraction of the width with which the figure will occupy. Default 1. + ratio : float, optional + Ratio of the figure. Default is the golden ratio. + subplots : tuple, optional + The shape of subplots. + + Returns + ------- + fig_width_in : float + Width of the figure in inches. + fig_height_in : float + Height of the figure in inches. + """ + # Width of figure (in pts) + fig_width_pt = width_pt * fraction + # Convert from pt to inches + inches_per_pt = 1 / 72.27 + + # Golden ratio to set aesthetic figure height + golden_ratio = ratio + + # Figure width in inches + fig_width_in = fig_width_pt * inches_per_pt + # Figure height in inches + fig_height_in = fig_width_in * golden_ratio * (subplots[0] / subplots[1]) + + return fig_width_in, fig_height_in + + +def new_fig(width_pt=420, fraction=1 / 2, ratio=(5 ** .5 - 1) / 2, subplots=(1, 1)): + """ + Creates new instance of a `matplotlib.pyplot.figure` by using the `fig_size` function. + + Parameters + ---------- + width_pt : float, optional + Document width in points, in latex can be determined with `\showthe\textwidth`. + Default is 420. + fraction : float, optional + The fraction of the width with which the figure will occupy. Default 1. + ratio : float, optional + Ratio of the figure. Default is the golden ratio. + subplots : tuple, optional + The shape of subplots. + + Returns + ------- + fig : matplotlib.pyplot.figure + The figure. + """ + + fig = plt.figure(figsize=fig_size(width_pt, fraction, ratio, subplots)) + return fig + + +def trajectories_plot(T, Y, Y_dmd=None, zoom=None, label='y', train=False): + """ + Creates plot of a trajectory (input, state, output, ...). + + Parameters + ---------- + T : numpy.ndarray + Time steps. + Y : numpy.ndarray + Trajectory value at the time steps. + Y_dmd : numpy.ndarray, optional + Approximated trajectory value at the time steps. Default `None`. + zoom : int, optional + Number of samples to plot. Default `None`. + label : str, optional + Label of the trajectory. Default 'y'. + train : bool, optional + Flag if trajectory is related to the training. + """ + fraction = 1 / 2 if config.save_results else 1 + + for i, y in enumerate(Y): + label_ = f'{label}_{i + 1}' if Y.shape[0] > 1 else f'{label}' + title = f'Training ${label_}$' if train else f'Testing ${label_}$' + match label: + case 'y': + ylabel = 'Output' + case 'u': + ylabel = 'Input' + case _: + ylabel = '' + + fig = new_fig(fraction=fraction) + ax = fig.add_subplot(1, 1, 1) + ax.set_title(title) + if zoom is not None: + T = T[:zoom] + ax.set(xlim=[np.min(T), np.max(T)]) + ax.set(xlabel='Time (s)', ylabel=ylabel) + if zoom is not None: + ax.plot(T, Y[i, :zoom], label=f'${label_}$') + else: + ax.plot(T, Y[i], label=f'${label_}$') + + if Y_dmd is not None: + dmd_label = r'\widetilde{' + label + '}' + dmd_ylabel = f'{dmd_label}_{i + 1}' if Y.shape[0] > 1 else f'{dmd_label}' + if zoom is not None: + ax.plot(T, Y_dmd[i,:zoom], ls='--', label=f'${dmd_ylabel}$') + else: + ax.plot(T, Y_dmd[i], ls='--', label=f'${dmd_ylabel}$') + + ax.legend(loc='best') + + if config.save_results: + assert config.figures_path is not None and config.exp_id is not None + ax.set_title('') + fig.tight_layout() + filename = f'{config.exp_id}_{label_}_train' if train else f'{config.exp_id}_{label_}' + if zoom is not None: + filename += '_zoom' + filename += '.pgf' + fig.savefig(os.path.join(config.figures_path, filename)) + else: + plt.show() + + +def abs_error_plot(T, Y, Y_dmd, label='y', zoom=None): + """ + Creates plot of an absolute error between two trajectories (state, output, ...). + + Parameters + ---------- + T : numpy.ndarray + Time steps. + Y : numpy.ndarray + Trajectory value at the time steps. + Y_dmd : numpy.ndarray, optional + Approximated trajectory value at the time steps. Default `None`. + label : str, optional + Label of the trajectory. Default 'y'. + zoom : int, optional + Number of samples to plot. Default `None`. + """ + + assert Y.shape == Y_dmd.shape + assert len(T) == Y.shape[1] + + fraction = 1 / 2 if config.save_results else 1 + + for i, y in enumerate(Y): + if zoom is not None: + T = T[:zoom] + + fig = new_fig(fraction=fraction) + ax = fig.add_subplot(1, 1, 1) + ax.set(xlim=[np.min(T), np.max(T)]) + ax.set(xlabel='Time (s)', ylabel=f'Absolut error') + label_ = f'$|{label}_{i + 1} - ' + r'\widetilde{' + label + '}_' + str(i + 1) + '|$' if len(Y) > 1 \ + else f'$|{label} - ' + r'\widetilde{' + label + '}|$' + if zoom is not None: + E = np.abs(Y[i, :zoom] - Y_dmd[i, :zoom]) + else: + E = np.abs(Y[i] - Y_dmd[i]) + + ax.semilogy(T, E, label=label_) + ax.legend() + + if config.save_results: + ax.set_title('') + fig.tight_layout() + filename = f'{config.exp_id}_error_{label}_{i + 1}' + if zoom is not None: + filename += '_zoom' + filename += '.pgf' + fig.savefig(os.path.join(config.figures_path, filename)) + else: + plt.show() + + +def bode_plot(w, lti, lti_dmd, i=None, j=None): + """ + Creates bode plot of two lti systems. + + Parameters + ---------- + w : numpy.ndarray + Frequencies. + lti : pymor.models.iosys.LTIModel + Original lti system. + lti_dmd : pymor.models.iosys.LTIModel + Identified lti system. + i : int, optional + If specified only the bode plot of the `i`,`j` input output combination is plotted. Default `None`. + j : int, optional + If specified only the bode plot of the `i`,`j` input output combination is plotted. Default `None`. + """ + fig = new_fig(fraction=1, ratio=1) + ax = fig.subplots(2 * config.m, config.m, sharex=True, squeeze=False) + artists = lti.transfer_function.bode_plot(w, ax=ax, label='G(s)') + artists_dmd = lti_dmd.transfer_function.bode_plot(w, ax=ax, label='\widetilde{G}(s)', ls='--') + if not config.save_results: + plt.show() # can only show figures when Matplotlib is not using pgf + + if i is not None and j is not None: + # Bode of i,j input pair + + # Magnitude + fig = new_fig() + ax = fig.add_subplot(111) + ax.set(xlim=[np.min(w), np.max(w)]) + ax.loglog(*artists[2 * i, j][0].get_data(), label='$G$') + ax.loglog(*artists_dmd[2 * i, j][0].get_data(), + ls='--', label=r'$\widetilde{G}$') + ax.legend() + ax.set_title(r'Magnitude plot of $G_{' + str(i + 1) + str(j + 1) + '}$') + ax.set_xlabel('Frequency (rad/s)') + ax.set_ylabel('Magnitude') + + if config.save_results: + ax.set_title('') + fig.tight_layout() + fig.savefig(os.path.join(config.figures_path, f'{config.exp_id}_mag_{i + 1}_{j + 1}.pgf')) + else: + plt.show() + + # Phase + fig = new_fig() + ax = fig.add_subplot(111) + ax.set(xlim=[np.min(w), np.max(w)]) + ax.semilogx(*artists[2 * i + 1, j][0].get_data(), label='$G$') + ax.semilogx(*artists_dmd[2 * i + 1, j][0].get_data(), + ls='--', label=r'$\widetilde{G}$') + ax.legend() + ax.set_title(r'Phase plot of $G_{' + str(i + 1) + str(j + 1) + '}$') + ax.set_xlabel('Frequency (rad/s)') + ax.set_ylabel('Phase (deg)') + + if config.save_results: + ax.set_title('') + fig.tight_layout() + fig.savefig(os.path.join(config.figures_path, f'{config.exp_id}_phase_{i + 1}_{j + 1}.pgf')) + else: + plt.show() + + +def magnitude_plot(w, lti): + """ + Creates magnitude bode plot an lti system. + + Parameters + ---------- + w : numpy.ndarray + Frequencies. + lti : pymor.models.iosys.LTIModel + (Error) lti system. + """ + fraction = 1 / 2 if config.save_results else 1 + + fig = new_fig(fraction=fraction) + ax = fig.add_subplot(1, 1, 1) + ax.set(xlim=[np.min(w), np.max(w)]) + lti.transfer_function.mag_plot(w, ax=ax, label='Error') + _ = ax.legend() + if config.save_results: + ax.set_title('') + fig.tight_layout() + fig.savefig(os.path.join(config.figures_path, f'{config.exp_id}_error_mag_plot.pgf')) + else: + plt.show() + + +def poles_plot(lti, lti_dmd=None): + """ + Creates poles bode plot of one or two lti systems. + + Parameters + ---------- + lti : pymor.models.iosys.LTIModel + Original lti system. + lti_dmd : pymor.models.iosys.LTIModel + Identified lti system. + """ + # Eigenvalues + poles = lti.poles() + fig, ax = plt.subplots() + ax.plot(poles.real, poles.imag, '.', label='FOM') + if lti_dmd is not None: + poles_dmd = lti_dmd.poles() + ax.plot(poles_dmd.real, poles_dmd.imag, 'x', label='dmd') + + _ = ax.set_title('Poles') + _ = ax.legend() + ax.set(xlabel='Re($\lambda$)', ylabel='Im($\lambda$)') + + if config.save_results: + ax.set_title('') + fig.tight_layout() + fig.savefig(os.path.join(config.figures_path, f'{config.exp_id}_poles.pgf')) + else: + plt.show()