[
  {
    "path": ".gitattributes",
    "content": "# Override jupyter in Github language stats for more accurate estimate of repo code\n# reference: https://github.com/github/linguist/blob/master/docs/overrides.md#generated-code\n*.ipynb linguist-generated"
  },
  {
    "path": ".gitignore",
    "content": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions / Cython / Weave\n*.c\n!*/_ext/src_numerics.c\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\ncover/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/build/\n\n# PyBuilder\n.pybuilder/\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n#   For a library or package, you might want to ignore these files since the code is\n#   intended to run in multiple environments; otherwise, check them in:\n# .python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# UV\n#   Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\nuv.lock\n\n# poetry\n#   Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.\n#   This is especially recommended for binary packages to ensure reproducibility, and is more\n#   commonly ignored for libraries.\n#   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control\n#poetry.lock\n\n# pdm\n#   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.\n#pdm.lock\n#   pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it\n#   in version control.\n#   https://pdm.fming.dev/#use-with-ide\n.pdm.toml\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Devenv\n.devenv*\ndevenv.local.nix\ndevenv.lock\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# Eclipse project settings\n.settings/org.eclipse.*\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n\n# pytype static type analyzer\n.pytype/\n\n# Cython debug symbols\ncython_debug/\n\n# PyCharm\n#  JetBrains specific template is maintained in a separate JetBrains.gitignore that can\n#  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore\n#  and can be added to the global gitignore or merged into this file.  For a more nuclear\n#  option (not recommended) you can uncomment the following to ignore the entire idea folder.\n#.idea/\n\n# cached data\n*.data\ndocs/source/examples/tutorials/data\n"
  },
  {
    "path": ".travis.yml",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n\n\n# documentation & validation ==================================================\n\n# - https://docs.travis-ci.com/user/reference/overview\n# - https://docs.travis-ci.com/user/build-matrix/\n# - https://docs.travis-ci.com/user/multi-os/\n\n# - https://docs.travis-ci.com/user/build-config-validation/\n# - https://config.travis-ci.com/explore\n\n\n# meta ========================================================================\n\n# enable build config validation\nversion: ~> 1.0\n\n# save Travis budget\nif: branch = master\n\n# report outcomes\nnotifications:\n  email:\n    on_success: change\n    on_failure: always\n\n\n# default jobs: Linux, all Python versions ====================================\n\nos: linux\ndist: focal\narch: arm64\nvirt: lxd\nlanguage: generic\n\nenv:\n  global:\n    # limit procs to available cores\n    - TOX_JOBS=2\n  jobs:\n    - PYTHON=3.14\n    - PYTHON=3.13\n    - PYTHON=3.12\n    - PYTHON=3.11\n    - PYTHON=3.10\n\nbefore_install: export ARCH=Linux-aarch64\n\ninstall:\n  - | # install Miniconda\n    travis_retry wget https://repo.anaconda.com/miniconda/Miniconda3-latest-${ARCH}.sh -O miniconda.sh\n    bash miniconda.sh -b -p ${HOME}/miniconda\n    export PATH=\"${HOME}/miniconda/bin:${PATH}\"; hash -r\n    conda config --set quiet yes --set always_yes yes --set changeps1 no\n    travis_retry conda update -n base -c defaults conda\n    travis_retry conda update --all\n    conda config --set solver libmamba\n    conda info -a\n    conda list\n  - | # install executables via Miniconda: Python, Pandoc, Codecov\n    travis_retry conda create -n test-env\n    eval \"$(conda shell.bash hook)\"\n    conda activate test-env\n    travis_retry conda install -c conda-forge python=${PYTHON} pandoc codecov\n    travis_retry conda update  -c conda-forge --all\n    conda info -a\n    conda list\n  - | # install Python libs via Miniconda\n    travis_retry conda install -c conda-forge \\\n        numpy scipy python-igraph h5netcdf[h5py] tqdm \\\n        ipython networkx matplotlib cartopy sphinx nbsphinx \\\n        tox flake8 pylint pytest-xdist pytest-cov\n    conda info -a\n    conda list\n\nscript:\n  - | # install Python libs via Pip: self (+ dependencies, if on Windows)\n    travis_retry pip install -v -e . --group tests --group docs\n  - | # run test suite\n    tox -v\n\n# report statistics\nafter_success: codecov\n\n\n# modified job: Windows, newest Python version ================================\n# (inherit only 1st `env.jobs` entry)\n\njobs:\n  fast_finish: true\n  include:\n    - os: windows\n      language: shell\n      before_install:\n        - export ARCH=Windows-x86_64\n        - export PATH=/c/Python${PYTHON/.}:/c/Python${PYTHON/.}/Scripts:${PATH}\n      install:\n        - | # install executables via Chocolatey: Python, Pandoc, Codecov\n          travis_retry choco install python${PYTHON/.}\n          travis_retry python -m pip install --upgrade pip\n          travis_retry choco install pandoc codecov\n"
  },
  {
    "path": "CHANGELOG.rst",
    "content": "\nChangelog\n=========\n\n0.9.0\n-----\n\nNew/updated functionality:\n\n- enabled link/edge weighting in calculation of shortest path betweenness centrality (i.e. ``Network.betweenness()``) and\n  corrected implementation of ``Network.nsi_betweenness()`` to enable calculation of n.s.i. shortest path betweenness\n  centrality of directed networks.\n  (`#142 <https://github.com/pik-copan/pyunicorn/issues/142>`_, \n  `#248 <https://github.com/pik-copan/pyunicorn/issues/248>`_, \n  `#250 <https://github.com/pik-copan/pyunicorn/pull/250>`_)\n- updated and enhanced structure, documentation and testing of ``Cached`` mix-in class\n  (`#252 <https://github.com/pik-copan/pyunicorn/issues/252>`_,\n  `#253 <https://github.com/pik-copan/pyunicorn/pull/253>`_)\n\nPackage:\n\n- updated CI to discontinue macOS support\n  (`1a7973b <https://github.com/pik-copan/pyunicorn/commit/1a7973b247fd2b71315ca65a7773a8807c58959c>`_)\n- updated CI to observe end-of-life for ``python=3.9`` and add support for ``python=3.14``\n  (`#253 <https://github.com/pik-copan/pyunicorn/pull/253>`_)\n- migrated ``setup.cfg`` to ``pyproject.toml`` and established support for ``uv`` package manager\n  (`1c94599 <https://github.com/pik-copan/pyunicorn/commit/1c94599e70590d4365a65e5fcd1806df9ac04510>`_)\n- simplified CI configuration wrt. limiting of processes\n  (`d8bc4a0 <https://github.com/pik-copan/pyunicorn/commit/d8bc4a0163abd279f9ff7ceea6bbbf78adb89e70>`_)\n- updated dependencies and CI to ``h5netcdf>=1.8.1``\n  (`a88ab4d <https://github.com/pik-copan/pyunicorn/commit/a88ab4d08231f09e2ae5ff8024cbf39bba0d7e7a>`_)\n\nDocumentation:\n\n- minor fix in API documentation (`#246 <https://github.com/pik-copan/pyunicorn/pull/246>`_)\n\nBug Fixes:\n\n- updated download URL for test data \n  (`40cd2b9 <https://github.com/pik-copan/pyunicorn/commit/40cd2b96b69a377d1d300b399982ef171fedb6d2>`_,\n  `#251 <https://github.com/pik-copan/pyunicorn/issues/251>`_)\n- adapted ``Network`` to API of ``scipy>=1.19``\n  (`031fdfe <https://github.com/pik-copan/pyunicorn/commit/031fdfeddff4947941cf221f77ac78f5be5f58dd>`_)\n\n0.8.2\n-----\n\nDocumentation:\n\n- Review ``CITATION.cff`` to fix `Zenodo-Hook <https://zenodo.org/records/10697647>`_.\n\n\n0.8.1\n-----\n\nPackage:\n\n- Established support for Python 3.13, faded out support for Python 3.8\n  (`1bfd5d2 <https://github.com/pik-copan/pyunicorn/commit/1bfd5d2e9f89517326ee034cf9b8ed7b31d4f078>`_)\n\nDocumentation:\n\n- Enabled automated `Zenodo-Hook <https://zenodo.org/records/10697647>`_.\n\nBug Fixes:\n\n- Fixed bugs in parallel code of ``Network`` class as well as ``utils.mpi`` example scripts\n  (`#241 <https://github.com/pik-copan/pyunicorn/issues/241>`_,\n  `#242 <https://github.com/pik-copan/pyunicorn/pull/242>`_).\n\n0.8.0\n-----\n\nPackage:\n\n- Improved `test coverage <https://app.codecov.io/gh/pik-copan/pyunicorn?search=&trend=all%20time>`_.\n- Improved style and linting by revising and reducing global message disables\n  (`#224 <https://github.com/pik-copan/pyunicorn/pull/224>`_,\n  `#231 <https://github.com/pik-copan/pyunicorn/pull/231>`_,\n  `#233 <https://github.com/pik-copan/pyunicorn/pull/233>`_).\n- Ensured ``numpy=2.0`` support\n  (`#234 <https://github.com/pik-copan/pyunicorn/pull/234>`_).\n- Removed experimental and untested code\n  (`#40 <https://github.com/pik-copan/pyunicorn/issues/40>`_,\n  `#239 <https://github.com/pik-copan/pyunicorn/pull/239>`_).\n\nNew/Updated functionality:\n\n- Extended Caching to ``RecurrenceNetwork`` and child classes as well as ``Surrogates``.\n  (`#236 <https://github.com/pik-copan/pyunicorn/pull/236>`_).\n- Revised API of ``Surrogates`` to conform to OO structure assumed by ``Cached``.\n  (`#236 <https://github.com/pik-copan/pyunicorn/pull/236>`_).\n\nDocumentation:\n\n- Removed malfunctioning links from Introduction\n  (`369b086 <https://github.com/pik-copan/pyunicorn/commit/369b086a8535dbfad6651caa62bee5a5488a0bfd>`_).\n- Moved tutorial notebooks into ``docs``, dropped ``nbsphinx-link`` dependency\n  (`c54102e <https://github.com/pik-copan/pyunicorn/commit/c54102e42b767271be6299f8bf8170b27bda28e6>`_).\n- Added ``EventSeriesClimateNetwork`` to API documentation\n  (`#232 <https://github.com/pik-copan/pyunicorn/pull/232>`_).\n- Removed outdated MathJax path for correct math display\n  (`0dd133c <https://github.com/pik-copan/pyunicorn/commit/0dd133c59da252b8c0e0e17f82290881508d0274>`_).\n\nBug fixes:\n\n- Fixed unnoticed bug in ``SpatialNetwork.{in|out}average_link_distance()``\n  (`6b40587 <https://github.com/pik-copan/pyunicorn/commit/6b405873bede4ec18cd72164c734ed47964d2930>`_).\n- Substituted deprecated shorthand ``scipy.sparse.*_matrix.A`` for ``scipy>=1.14`` compatibility\n  (`1d96e58 <https://github.com/pik-copan/pyunicorn/commit/1d96e58040c831afdcd7f7bf97be3ebd6ae6815a>`_).\n- Substituted variable name ``I`` in C code, which might interfere with C's own macro for complex numbers\n  (`#225 <https://github.com/pik-copan/pyunicorn/issues/225>`_,\n  `#226 <https://github.com/pik-copan/pyunicorn/pull/232>`_).\n- Fixed setup of Travis-CI on Windows builds\n  (`#237 <https://github.com/pik-copan/pyunicorn/pull/237>`_).\n\n0.7.0\n-----\n\nPackage:\n\n- Migrated to PEP 517/518 package format\n  (`a6c4c83 <https://github.com/pik-copan/pyunicorn/commit/a6c4c83905fcc4b73f46643fbe2f160917755e0e>`_).\n- Added full Windows support\n  (`#159 <https://github.com/pik-copan/pyunicorn/issues/159>`_,\n  `#160 <https://github.com/pik-copan/pyunicorn/issues/160>`_).\n- Reestablished `CI <https://app.travis-ci.com/github/pik-copan/pyunicorn>`_ on Linux\n  (`#191 <https://github.com/pik-copan/pyunicorn/issues/191>`_,\n  `#192 <https://github.com/pik-copan/pyunicorn/pull/192>`_)\n  and added macOS and Windows\n  (`#214 <https://github.com/pik-copan/pyunicorn/pull/214>`_).\n- Improved `test coverage <https://app.codecov.io/gh/pik-copan/pyunicorn?search=&trend=all%20time>`_.\n- Discontinued Python 3.7 support\n  (`4cf6969 <https://github.com/pik-copan/pyunicorn/commit/4cf6969c40de39f01f31ea141767ec67cc3d6d31>`_).\n- Replaced optional dependecy ``netcdf4`` with ``h5netcdf``\n  (`cd8ee00 <https://github.com/pik-copan/pyunicorn/commit/cd8ee00a534c0eae9440414d38a0eaaa5100aaec>`_,\n  `#12 <https://github.com/pik-copan/pyunicorn/issues/12>`_,\n  `#210 <https://github.com/pik-copan/pyunicorn/issues/210>`_).\n- Replaced outdated ``progressbar`` with ``tqdm``\n  (`#202 <https://github.com/pik-copan/pyunicorn/pull/202>`_).\n\nDocumentation:\n\n- Added new tutorials\n  (`#175 <https://github.com/pik-copan/pyunicorn/pull/175>`_,\n  `#180 <https://github.com/pik-copan/pyunicorn/pull/180>`_,\n  `#190 <https://github.com/pik-copan/pyunicorn/pull/190>`_).\n- Edited tutorials and included notebooks in documentation\n  (`#179 <https://github.com/pik-copan/pyunicorn/pull/179>`_,\n  `#185 <https://github.com/pik-copan/pyunicorn/issues/185>`_,\n  `#213 <https://github.com/pik-copan/pyunicorn/pull/213>`_).\n\nNew/Updated functionality:\n\n- Generalized spatial and interacting network analysis\n  (`#131 <https://github.com/pik-copan/pyunicorn/pull/131>`_):\n  added ``SpatialNetwork`` class, added Watts-Strogatz model to ``Network``,\n  added new metrics to ``RecurrencePlot``, ``CoupledClimateNetwork`` and\n  ``InteractingNetworks``.\n- Added ``EventSeries`` and ``EventSeriesClimateNetwork`` classes\n  (`#156 <https://github.com/pik-copan/pyunicorn/pull/156>`_).\n- Extended n.s.i. measures in ``Network`` with directed and weighted versions\n  (`#153 <https://github.com/pik-copan/pyunicorn/pull/153>`_).\n- Replaced ``MapPlots`` class with simplified ``MapPlot`` based on ``Cartopy``\n  (`#174 <https://github.com/pik-copan/pyunicorn/pull/174>`_,\n  `#203 <https://github.com/pik-copan/pyunicorn/issues/203>`_).\n\nExtensions:\n\n- Overhauled the Python/Cython interface\n  (`3dab5bf <https://github.com/pik-copan/pyunicorn/commit/3dab5bf89d2e224fc319ddd64aeeecc480f27fba>`_,\n  `402197f <https://github.com/pik-copan/pyunicorn/commit/402197fedff6dc4ce9796b5d2c32bb63ef6ecba8>`_).\n- Made Cython/C extensions compatible with MSVC\n  (`#160 <https://github.com/pik-copan/pyunicorn/issues/160>`_,\n  `#165 <https://github.com/pik-copan/pyunicorn/issues/165>`_).\n- Ported most of the remaining C extensions to Cython\n  (`#128 <https://github.com/pik-copan/pyunicorn/issues/128>`_,\n  `#142 <https://github.com/pik-copan/pyunicorn/issues/142>`_,\n  `#145 <https://github.com/pik-copan/pyunicorn/issues/145>`_,\n  `#187 <https://github.com/pik-copan/pyunicorn/issues/187>`_,\n  `#195 <https://github.com/pik-copan/pyunicorn/pull/195>`_).\n  \nBug fixes:\n\n- Resolved indexing and typing problems in extensions\n  (`#126 <https://github.com/pik-copan/pyunicorn/issues/126>`_,\n  `#141 <https://github.com/pik-copan/pyunicorn/issues/141>`_,\n  `#145 <https://github.com/pik-copan/pyunicorn/issues/145>`_,\n  `#162 <https://github.com/pik-copan/pyunicorn/issues/162>`_,\n  `#163 <https://github.com/pik-copan/pyunicorn/issues/163>`_).\n- Overhauled the memoization/caching system\n  (`#124 <https://github.com/pik-copan/pyunicorn/issues/124>`_,\n  `#148 <https://github.com/pik-copan/pyunicorn/issues/148>`_,\n  `#219 <https://github.com/pik-copan/pyunicorn/pull/219>`_).\n- Shifted the histogram index in ``RecurrencePlot`` line distributions\n  (`#166 <https://github.com/pik-copan/pyunicorn/issues/166>`_,\n  `#209 <https://github.com/pik-copan/pyunicorn/pull/209>`_).\n- Resolved numerous other issues related to inheritance and method overloading,\n  deprecated APIs, etc. For a full list, see the `release milestone\n  <https://github.com/pik-copan/pyunicorn/milestone/1?closed=1>`_.\n\n0.6.1\n-----\n- Fixed some bugs and compatibility issues.\n- Improved test framework.\n- Added ``pyunicorn`` description paper reference to all code files.\n\n0.6.0\n-----\n- Migrated from Python 2.7 to Python 3.7.\n- Completed transition from ``Weave`` to ``Cython``.\n- Added Event Coincidence Analysis.\n\n0.5.2\n-----\n- Updated test suite and CI.\n\n0.5.1\n-----\n- Added reference to ``pyunicorn`` description paper published in the\n  journal *Chaos*.\n\n0.5.0\n-----\n- Substantial update of ``CouplingAnalysis``.\n- New methods in ``RecurrenceNetwork``: ``transitivity_dim_single_scale``,\n  ``local_clustering_dim_single_scale``.\n- Renamed time-directed measures in ``VisibilityGraph``: ``left/right`` ->\n  ``retarded/advanced``.\n- Improved documentation and extended publication list.\n- Began transition from ``Weave`` to ``Cython``.\n- Added unit tests and improved Pylint compliance.\n- Set up continuous testing with Travis-CI.\n- Fixed some minor bugs.\n\n0.4.1\n-----\n- Removed a whole lot of ``get_`` s from the API. For example,\n  ``Network.get_degree()`` is now ``Network.degree()``.\n- Fixed some minor bugs.\n\n0.4.0\n-----\n- Restructured package (subpackages: ``core``, ``climate``, ``timeseries``,\n  ``funcnet``, ``utils``).\n- Removed dependencies: ``Pysparse``, ``PyNio``, ``progressbar``.\n- Added a module for resistive networks.\n- Switched to ``tox`` for test suite management.\n- Ensured PEP8 and PyFlakes compliance.\n\n0.3.2\n-----\n- Fixed some minor bugs.\n- Switched to ``Sphinx`` documentation system.\n\n0.3.1\n-----\n- First public release of ``pyunicorn``.\n"
  },
  {
    "path": "CITATION.cff",
    "content": "cff-version: 1.2.0\nmessage: If you use this software, please cite it using the metadata provided below.\ntype: software\ntitle: 'Pyunicorn: Unified Complex Network and Recurrence Analysis Toolbox'\nabstract: pyunicorn (Unified Complex Network and RecurreNce analysis toolbox) is an\n  object-oriented Python package for the advanced analysis and modeling of complex networks.\n  Beyond the standard measures of complex network theory (such as degree, betweenness and\n  clustering coefficients), it provides some uncommon but interesting statistics like\n  Newman's random walk betweenness. pyunicorn also provides novel node-weighted (node\n  splitting invariant) network statistics, measures for analyzing networks of\n  interacting/interdependent networks, and special tools to model spatially embedded complex\n  networks.\n\n  Moreover, pyunicorn allows one to easily construct networks from uni- and multivariate\n  time series and event data (functional/climate networks and recurrence networks). This\n  involves linear and nonlinear measures of time series analysis for constructing functional\n  networks from multivariate data (e.g., Pearson correlation, mutual information, event\n  synchronization and event coincidence analysis). pyunicorn also features modern techniques\n  of nonlinear analysis of time series (or pairs thereof), such as recurrence quantification\n  analysis (RQA), recurrence network analysis and visibility graphs.\n\n  pyunicorn is fast, because all costly computations are performed in compiled C code. It can\n  handle large networks through the use of sparse data structures. The package can be used\n  interactively, from any Python script, and even for parallel computations on large cluster\n  architectures.\nauthors:\n- family-names: Donges\n  given-names: Jonathan\n  email: donges@pik-potsdam.de\n  orcid: https://orcid.org/0000-0001-5233-7703\n- family-names: Heitzig\n  given-names: Jobst\n  email: jobst.heitzig@pik-potsdam.de\n  orcid: https://orcid.org/0000-0002-0442-8077\n- family-names: Beronov\n  given-names: Boyan\n  email: beronov@cs.ubc.ca\n  orcid: https://orcid.org/0000-0002-0900-752X\n- family-names: Kühlein\n  given-names: Fritz\n  email: fritzku@pik-potsdam.de\n- family-names: Bechthold\n  given-names: Max\n  email: maxbecht@pik-potsdam.de\n  orcid: https://orcid.org/0009-0007-7113-4814\n- family-names: Kroenke\n  given-names: Jonathan\n  email: kroenke@pik-potsdam.de\n- family-names: Barfuss\n  given-names: Wolfram\n  email: barfuss@uni-bonn.de\n  orcid: https://orcid.org/0000-0002-9077-5242\n- family-names: Harmening\n  given-names: Nils\n- family-names: Nascimento Silva\n  given-names: Filipi\n- family-names: Kassel\n  given-names: Johannes\n- family-names: Ziehbarth\n  given-names: Malte\n- family-names: Odenweller\n  given-names: Adrian\n- family-names: Tzinis\n  given-names: Efthymios\n- family-names: Hotz\n  given-names: Ronja\n\nlicense: GPL-3.0\nrepository-code: https://github.com/pik-copan/pyunicorn\n\npreferred-citation:\n  type: article\n  title: 'Unified functional network and nonlinear time series analysis for complex\n    systems science: The pyunicorn package'\n  authors:\n  - family-names: Donges\n    given-names: Jonathan\n    email: donges@pik-potsdam.de\n    orcid: https://orcid.org/0000-0001-5233-7703\n  - family-names: Heitzig\n    given-names: Jobst\n    email: jobst.heitzig@pik-potsdam.de\n    orcid: https://orcid.org/0000-0002-0442-8077\n  - family-names: Beronov\n    given-names: Boyan\n    email: beronov@pik-potsdam.de\n    orcid: https://orcid.org/0000-0002-0900-752X\n  - family-names: Wiedermann\n    given-names: Marc\n    orcid: https://orcid.org/0000-0001-9869-3789\n  - family-names: Runge\n    given-names: Jakob\n  - family-names: Feng\n    given-names: Quing Yi\n  - family-names: Tupikina\n    given-names: Liubov\n  - family-names: Stolbova\n    given-names: Veronika\n  - family-names: Donner\n    given-names: Reik V.\n    email: redonner@pik-potsdam.de\n    orcid: https://orcid.org/0000-0001-7023-6375\n  - family-names: Marwan\n    given-names: Norbert\n    email: marwan@pik-potsdam.de\n    orcid: https://orcid.org/0000-0003-1437-7039\n  - family-names: Dijkstra\n    given-names: Henk A.\n  - family-names: Kurths\n    given-names: Jürgen\n    email: juergen.kurths@pik-potsdam.de\n    orcid: https://orcid.org/0000-0002-5926-4276\n  abstract: We introduce the pyunicorn (Pythonic unified complex network and recurrence analysis\n    toolbox) open source software package for applying and combining modern methods of data\n    analysis and modeling from complex network theory and nonlinear time series analysis. pyunicorn\n    is a fully object-oriented and easily parallelizable package written in the language Python. It\n    allows for the construction of functional networks such as climate networks in climatology or\n    functional brain networks in neuroscience representing the structure of statistical\n    interrelationships in large data sets of time series and, subsequently, investigating this\n    structure using advanced methods of complex network theory such as measures and models for\n    spatial networks, networks of interacting networks, node-weighted statistics, or network\n    surrogates. Additionally, pyunicorn provides insights into the nonlinear dynamics of complex\n    systems as recorded in uni- and multivariate time series from a non-traditional perspective by\n    means of recurrence quantification analysis, recurrence networks, visibility graphs, and\n    construction of surrogate time series. The range of possible applications of the library is\n    outlined, drawing on several examples mainly from the field of climatology.\n  doi: 10.1063/1.4934554\n  journal: Chaos\n  month: 11\n  issue: 11\n  volume: 25\n  year: 2015\n"
  },
  {
    "path": "CONTRIBUTIONS.rst",
    "content": "\nContributions\n=============\n\nCopyright\n---------\n\\ |copy| 2008-2026 Jonathan F. Donges and pyunicorn authors.\n\nLicense\n-------\nBSD (3-clause)\n\nURL\n---\nhttps://www.pik-potsdam.de/members/donges/software-2/software\n\nMail\n----\nJonathan Donges, Potsdam Institute for Climate Impact Research,\nP.O. Box 60 12 03, D-14412 Potsdam, Germany\n\nRelated publications\n--------------------\nSee `Publications <docs/source/publications.rst>`_.\n\nAuthors\n-------\nWritten as part of a diploma/PhD thesis in physics by `Jonathan F. Donges\n<donges@pik-potsdam.de>`_ at Humboldt University Berlin and the Potsdam\nInstitute for Climate Impact Research (PIK) and completed at the University of\nPotsdam, Germany. Substantially extended by `Jobst Heitzig\n<heitzig@pik-potsdam.de>`_.\n\nContributors\n------------\n- Jakob Runge (extended ``core`` and ``climate``)\n- Alexander Radebach\n- Hanna Schultz\n- Marc Wiedermann (extended ``core`` and ``climate``)\n- `Alraune Zech <alrauni@web.de>`_\n  (extended ``timeseries`` during an internship at PIK)\n- `Jan Feldhoff <feldhoff@pik-potsdam.de>`_ (extended ``timeseries``)\n- Aljoscha Rheinwalt\n- Hannes Kutza\n- `Boyan Beronov <beronov@cs.ubc.ca>`_ (restructured, updated and linted\n  codebase and documentation, consolidated original packaging, prepared\n  Cythonization and migration to Python 3, managed open-sourcing, introduced CI,\n  migrated to PEP 517/518 package format, overhauled the Python/Cython interface,\n  made Cython/C extensions compatible with MSVC, edited tutorials,\n  overhauled the caching system, maintained test suite and CI)\n- `Paul Schultz <pschultz@pik-potsdam.de>`_, `Stefan Schinkel\n  <mail@dreeg.org>`_ (added ``resistive_network`` and corresponding\n  tests)\n- `Wolfram Barfuss <barfuss@pik-potsdam.de>`_\n  (contributed to Cythonization, extended and maintained package)\n- Malte Ziehbarth (contributed to Python 3 support in\n  `#106 <https://github.com/pik-copan/pyunicorn/pull/106>`_)\n- Nils Harmening (added event coincidence analysis, contributed to Cythonization,\n  extended test suite, migrated from Python 2.7 to 3.6)\n- Jonathan Kroenke (fixed numerous bugs and style issues in\n  `#119 <https://github.com/pik-copan/pyunicorn/pull/119>`_,\n  generalized spatial and interacting network analysis in\n  `#131 <https://github.com/pik-copan/pyunicorn/pull/131>`_,\n  extended test suite, maintained package and managed release)\n- Johannes Kassel (added ``eventseries`` and\n  ``climate.eventseries_climatenetwork`` in\n  `#156 <https://github.com/pik-copan/pyunicorn/pull/156>`_)\n- `Frederik Wolf <Frederik.Wolf@bmz.bund.de>`_ (contributed to ``eventseries``)\n- Lena Schmidt (added tutorials, maintained package)\n- `Max Bechthold <maxbecht@pik-potsdam.de>`_\n  (reenabled CI, migrated plotting to ``Cartopy``, added tutorials,\n  maintained package)\n- `Ronja Hotz <ronja.hotz@yahoo.de>`_ (added a tutorial\n  in `#190 <https://github.com/pik-copan/pyunicorn/pull/190>`_)\n- `Fritz Kühlein <fritzku@pik-potsdam.de>`_\n  (fixed numerous bugs and style issues, improved test coverage and CI,\n  integrated tutorial notebooks into documentation,\n  maintained package and managed releases)\n\nAcknowledgements\n----------------\n- Travis-CI (https://www.travis-ci.com/) for providing free builds for this open\n  source project.\n\n.. |copy|   unicode:: U+000A9 .. COPYRIGHT SIGN\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "\nCopyright (C) 2008-2026, Jonathan F. Donges (Potsdam-Institute for Climate\nImpact Research), pyunicorn authors\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright notice, this\n      list of conditions and the following disclaimer.\n\n    * Redistributions in binary form must reproduce the above copyright notice,\n      this list of conditions and the following disclaimer in the documentation\n      and/or other materials provided with the distribution.\n\n    * Neither the name of pyunicorn authors and the Potsdam-Institute for\n      Climate Impact Research nor the names of its contributors may be used to\n      endorse or promote products derived from this software without specific\n      prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "MANIFEST.in",
    "content": "include MANIFEST.in\nrecursive-exclude src/pyunicorn/*/_ext *.c\nrecursive-include src/pyunicorn/*/_ext *.pxd *.pyx src_*.c\n\ninclude *.rst *.txt docs/Makefile\ngraft docs/source\nprune **/.ipynb_checkpoints\n\nrecursive-include tests *.py\n"
  },
  {
    "path": "README.rst",
    "content": "=========\npyunicorn\n=========\n\n.. image:: https://app.travis-ci.com/pik-copan/pyunicorn.svg?branch=master\n  :target: https://app.travis-ci.com/github/pik-copan/pyunicorn\n\n.. image:: https://codecov.io/gh/pik-copan/pyunicorn/branch/master/graph/badge.svg\n  :target: https://codecov.io/gh/pik-copan/pyunicorn\n\n.. image:: https://img.shields.io/pypi/v/pyunicorn\n  :target: https://pypi.org/project/pyunicorn/\n\n.. image:: https://img.shields.io/pypi/pyversions/pyunicorn\n  :target: https://pypi.org/project/pyunicorn/\n\n.. image:: https://zenodo.org/badge/33720178.svg\n  :target: https://zenodo.org/badge/latestdoi/33720178\n\nAbout\n=====\n``pyunicorn`` (**Uni**\\ fied **Co**\\ mplex Network and **R**\\ ecurre\\ **N**\\ ce\nanalysis toolbox) is an object-oriented Python package for the advanced analysis\nand modeling of complex networks. Beyond the standard **measures of complex\nnetwork theory** (such as *degree*, *betweenness* and *clustering coefficients*), it\nprovides some uncommon but interesting statistics like *Newman's random walk\nbetweenness*. ``pyunicorn`` also provides novel **node-weighted** *(node splitting invariant)*\nnetwork statistics, measures for analyzing networks of **interacting/interdependent\nnetworks**, and special tools to model **spatially embedded** complex networks.\n\nMoreover, ``pyunicorn`` allows one to easily *construct networks* from uni- and\nmultivariate time series and event data (**functional/climate networks** and\n**recurrence networks**). This involves linear and nonlinear measures of\n**time series analysis** for constructing functional networks from multivariate data\n(e.g., *Pearson correlation*, *mutual information*, *event synchronization* and *event\ncoincidence analysis*). ``pyunicorn`` also features modern techniques of\nnonlinear analysis of time series (or pairs thereof), such as *recurrence\nquantification analysis* (RQA), *recurrence network analysis* and *visibility\ngraphs*.\n\n``pyunicorn`` is **fast**, because all costly computations are performed in\ncompiled C code. It can handle **large networks** through the\nuse of sparse data structures. The package can be used interactively, from any\nPython script, and even for parallel computations on large cluster architectures.\nFor information about individual releases,\nsee our `CHANGELOG <CHANGELOG.rst>`_ and `CONTRIBUTIONS <CONTRIBUTIONS.rst>`_.\n\n\nLicense\n-------\n``pyunicorn`` is `BSD-licensed <LICENSE.txt>`_ (3 clause).\n\nReference\n---------\n*Please acknowledge and cite the use of this software and its authors when\nresults are used in publications or published elsewhere. You can use the\nfollowing reference:*\n\n    J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n    L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra, and J.\n    Kurths.\n    **\"Unified functional network and nonlinear time series analysis for complex\n    systems science: The pyunicorn package\"**.\n    Chaos 25, 113101 (2015), `doi:10.1063/1.4934554\n    <http://dx.doi.org/10.1063/1.4934554>`_, Preprint: `arxiv.org:1507.01571\n    <http://arxiv.org/abs/1507.01571>`_ [physics.data-an].\n\nFunding\n-------\nThe development of ``pyunicorn`` has been supported by various funding sources,\nnotably the `German Federal Ministry for Education and Research\n<https://www.bmbf.de/bmbf/en/home/home_node.html>`_ (projects `GOTHAM\n<https://www.belmontforum.org/projects>`_ and `CoSy-CC2\n<http://cosy.pik-potsdam.de/>`_), the `Leibniz Association\n<https://www.leibniz-gemeinschaft.de/en/>`_ (projects `ECONS\n<http://econs.pik-potsdam.de/>`_ and `DominoES\n<https://www.pik-potsdam.de/en/institute/departments/activities/dominoes>`_),\nthe `German National Academic Foundation <https://www.studienstiftung.de/en/>`_,\nand the `Stordalen Foundation <http://www.stordalenfoundation.no/>`_ via the\n`Planetary Boundary Research Network\n<https://web.archive.org/web/20200212214011/http://pb-net.org/>`_ (PB.net) among\nothers.\n\nGetting Started\n===============\n\nInstallation\n------------\nOfficial releases\n.................\n`Stable releases <https://pypi.org/project/pyunicorn/#history>`_ can be\ninstalled from the Python Package Index, using a Python package manager such as\n`pip <https://pip.pypa.io/en/latest/user_guide/>`__ or\n`uv <https://docs.astral.sh/uv/>`__::\n\n    $> pip install pyunicorn\n\nAlternatively, source distributions can be downloaded from the\n`GitHub Releases <https://github.com/pik-copan/pyunicorn/releases>`_.\n\nOn **Windows**, please *first* install the latest version of the\n`Microsoft C++ Build Tools <https://wiki.python.org/moin/WindowsCompilers>`_,\nwhich is required for compiling Cython modules.\n\nCurrent development version\n...........................\nIn order to use a `newer version <https://github.com/pik-copan/pyunicorn>`_,\nplease follow the `pip\n<https://packaging.python.org/en/latest/tutorials/installing-packages/#installing-from-vcs>`__\nor `uv <https://docs.astral.sh/uv/concepts/projects/dependencies/#git>`__\ninstructions for installing from version control.\n\nDependencies\n............\n``pyunicorn`` is implemented in `Python 3 <https://docs.python.org/3/>`_ /\n`Cython 3 <https://cython.org/>`_, is `tested\n<https://app.travis-ci.com/github/pik-copan/pyunicorn>`_ on *Linux*\nand *Windows*, and relies on the following packages:\n\n- Required:\n\n  - `numpy <http://www.numpy.org/>`_, `scipy <http://www.scipy.org/>`_\n  - `python-igraph <http://igraph.org/>`_ (for ``Network``)\n  - `h5netcdf <https://h5netcdf.org/>`_ (for ``Data``, ``NetCDFDictionary``)\n  - `tqdm <https://tqdm.github.io/>`_ (for progress bars)\n\n- Optional:\n\n  - `Matplotlib <http://matplotlib.org/>`_,\n    `Cartopy <https://scitools.org.uk/cartopy/docs/latest/index.html>`_\n    (for plotting features)\n  - `mpi4py <https://github.com/mpi4py/mpi4py>`_\n    (for parallelizing costly computations)\n  - `Sphinx <http://sphinx-doc.org/>`_\n    (for generating documentation)\n  - `Jupyter Notebook <https://jupyter-notebook.readthedocs.io/en/latest/>`_\n    (for tutorial notebooks)\n\n\nDocumentation\n-------------\nFor extensive HTML documentation, jump right to the `homepage\n<http://www.pik-potsdam.de/~donges/pyunicorn/>`_. In a local source tree,\nHTML and PDF documentation can be generated using ``Sphinx``::\n\n    $> pip install --group docs\n    $> cd docs; make clean html latexpdf\n\nTutorials\n---------\n\nFor some example applications look into the\n`tutorials <https://github.com/pik-copan/pyunicorn/tree/master/docs/source/examples/tutorials>`_ provided with the documentation.\nThey are designed to be self-explanatory, and are set up as Jupyter notebooks.\n\nDevelopment\n===========\n\nTest suite\n----------\nBefore committing changes or opening a pull request (PR) to the code base,\nplease make sure that all tests pass. The test suite is managed by `tox\n<https://tox.wiki/>`_ and is configured to use system-wide packages\nwhen available. Install the test dependencies as follows::\n\n    $> pip install --group tests\n\nThe test suite can be run from anywhere in the project tree by issuing::\n\n    $> tox\n\nTo display the defined test environments and target them individually::\n\n    $> tox -l\n    $> tox -e style,lint,test,docs\n\nTo test individual files::\n\n    $> flake8 src/pyunicorn/core/network.py     # style check\n    $> pylint src/pyunicorn/core/network.py     # static code analysis\n    $> pytest tests/test_core/test_network.py   # unit tests\n"
  },
  {
    "path": "devenv.nix",
    "content": "\n# Documentation: https://devenv.sh/\n\n{ pkgs, lib, config, inputs, ... }:\n\n{\n  packages = with pkgs; [ stdenv.cc.cc zlib git pandoc ];\n\n  cachix.enable = true;\n  cachix.pull = [ \"nixpkgs-python\" ];\n\n  languages.python = {\n    enable = true;\n    version = \"3.14\";\n    venv.enable = true;\n    uv = {\n      enable = true;\n      sync = {\n        enable = true;\n        allGroups = true;\n        allExtras = true;\n      };\n    };\n  };\n}\n"
  },
  {
    "path": "devenv.yaml",
    "content": "inputs:\n  nixpkgs-python:\n    url: github:cachix/nixpkgs-python\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    = -j 4\nSPHINXBUILD   = sphinx-build\nSPHINXPROJ    = pyunicorn\nSOURCEDIR     = source\nBUILDDIR      = build\n\n# Put it first so that \"make\" without argument is like \"make help\".\nhelp:\n\t@$(SPHINXBUILD) -M help \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n\n.PHONY: help Makefile\n\n# Catch-all target: route all unknown targets to Sphinx using the new\n# \"make mode\" option.  $(O) is meant as a shortcut for $(SPHINXOPTS).\n%: Makefile\n\t@$(SPHINXBUILD) -M $@ \"$(SOURCEDIR)\" \"$(BUILDDIR)\" $(SPHINXOPTS) $(O)\n"
  },
  {
    "path": "docs/source/_static/default.css",
    "content": "/**\n * Alternate Sphinx design\n * Originally created by Armin Ronacher for Werkzeug, adapted by Georg Brandl.\n */\n\nbody {\n    font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva', 'Verdana', sans-serif;\n    font-size: 14px;\n    letter-spacing: -0.01em;\n    line-height: 150%;\n    text-align: center;\n    /*background-color: #AFC1C4; */\n    background-color: #BFD1D4;\n    color: black;\n    padding: 0;\n    border: 1px solid #aaa;\n\n    margin: 0px 80px 0px 80px;\n    min-width: 740px;\n}\n\na {\n    color: #CA7900;\n    text-decoration: none;\n}\n\na:hover {\n    color: #2491CF;\n}\n\npre {\n    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;\n    font-size: 0.95em;\n    letter-spacing: 0.015em;\n    padding: 0.5em;\n    border: 1px solid #ccc;\n    background-color: #f8f8f8;\n}\n\ntd.linenos pre {\n    padding: 0.5em 0;\n    border: 0;\n    background-color: transparent;\n    color: #aaa;\n}\n\ntable.highlighttable {\n    margin-left: 0.5em;\n}\n\ntable.highlighttable td {\n    padding: 0 0.5em 0 0.5em;\n}\n\ncite, code, tt {\n    font-family: 'Consolas', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;\n    font-size: 0.95em;\n    letter-spacing: 0.01em;\n}\n\nhr {\n    border: 1px solid #abc;\n    margin: 2em;\n}\n\ntt {\n    background-color: #f2f2f2;\n    border-bottom: 1px solid #ddd;\n    color: #333;\n}\n\ntt.descname {\n    background-color: transparent;\n    font-weight: bold;\n    font-size: 1.2em;\n    border: 0;\n}\n\ntt.descclassname {\n    background-color: transparent;\n    border: 0;\n}\n\ntt.xref {\n    background-color: transparent;\n    font-weight: bold;\n    border: 0;\n}\n\na tt {\n    background-color: transparent;\n    font-weight: bold;\n    border: 0;\n    color: #CA7900;\n}\n\na tt:hover {\n    color: #2491CF;\n}\n\ndl {\n    margin-bottom: 15px;\n}\n\ndd p {\n    margin-top: 0px;\n}\n\ndd ul, dd table {\n    margin-bottom: 10px;\n}\n\ndd {\n    margin-top: 3px;\n    margin-bottom: 10px;\n    margin-left: 30px;\n}\n\n.refcount {\n    color: #060;\n}\n\ndt:target,\n.highlight {\n    background-color: #fbe54e;\n}\n\ndl.class, dl.function {\n    border-top: 2px solid #888;\n}\n\ndl.method, dl.attribute {\n    border-top: 1px solid #aaa;\n}\n\ndl.glossary dt {\n    font-weight: bold;\n    font-size: 1.1em;\n}\n\npre {\n    line-height: 120%;\n}\n\npre a {\n    color: inherit;\n    text-decoration: underline;\n}\n\n.first {\n    margin-top: 0 !important;\n}\n\ndiv.document {\n    background-color: white;\n    text-align: left;\n    background-image: url(contents.png);\n    background-repeat: repeat-x;\n}\n\n/*\ndiv.documentwrapper {\n    width: 100%;\n}\n*/\n\ndiv.clearer {\n    clear: both;\n}\n\ndiv.related h3 {\n    display: none;\n}\n\ndiv.related ul {\n    background-image: url(navigation.png);\n    height: 2em;\n    list-style: none;\n    border-top: 1px solid #ddd;\n    border-bottom: 1px solid #ddd;\n    margin: 0;\n    padding-left: 10px;\n}\n\ndiv.related ul li {\n    margin: 0;\n    padding: 0;\n    height: 2em;\n    float: left;\n}\n\ndiv.related ul li.right {\n    float: right;\n    margin-right: 5px;\n}\n\ndiv.related ul li a {\n    margin: 0;\n    padding: 0 5px 0 5px;\n    line-height: 1.75em;\n    color: #EE9816;\n}\n\ndiv.related ul li a:hover {\n    color: #3CA8E7;\n}\n\ndiv.body {\n    margin: 0;\n    padding: 0.5em 20px 20px 20px;\n}\n\ndiv.bodywrapper {\n    margin: 0 240px 0 0;\n    border-right: 1px solid #ccc;\n}\n\ndiv.body a {\n    text-decoration: underline;\n}\n\ndiv.sphinxsidebar {\n    margin: 0;\n    padding: 0.5em 15px 15px 0;\n    width: 210px;\n    float: right;\n    text-align: left;\n/*    margin-left: -100%; */\n}\n\ndiv.sphinxsidebar h4, div.sphinxsidebar h3 {\n    margin: 1em 0 0.5em 0;\n    font-size: 0.9em;\n    padding: 0.1em 0 0.1em 0.5em;\n    color: white;\n    border: 1px solid #86989B;\n    background-color: #AFC1C4;\n}\n\ndiv.sphinxsidebar ul {\n    padding-left: 1.5em;\n    margin-top: 7px;\n    list-style: none;\n    padding: 0;\n    line-height: 130%;\n}\n\ndiv.sphinxsidebar ul ul {\n    list-style: square;\n    margin-left: 20px;\n}\n\np {\n    margin: 0.8em 0 0.5em 0;\n}\n\np.rubric {\n    font-weight: bold;\n}\n\nh1 {\n    margin: 0;\n    padding: 0.7em 0 0.3em 0;\n    font-size: 1.5em;\n    color: #11557C;\n}\n\nh2 {\n    margin: 1.3em 0 0.2em 0;\n    font-size: 1.35em;\n    padding: 0;\n}\n\nh3 {\n    margin: 1em 0 -0.3em 0;\n    font-size: 1.2em;\n}\n\nh1 a, h2 a, h3 a, h4 a, h5 a, h6 a {\n    color: black!important;\n}\n\nh1 a.anchor, h2 a.anchor, h3 a.anchor, h4 a.anchor, h5 a.anchor, h6 a.anchor {\n    display: none;\n    margin: 0 0 0 0.3em;\n    padding: 0 0.2em 0 0.2em;\n    color: #aaa!important;\n}\n\nh1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,\nh5:hover a.anchor, h6:hover a.anchor {\n    display: inline;\n}\n\nh1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,\nh5 a.anchor:hover, h6 a.anchor:hover {\n    color: #777;\n    background-color: #eee;\n}\n\ntable {\n    border-collapse: collapse;\n    margin: 0 -0.5em 0 -0.5em;\n}\n\ntable td, table th {\n    padding: 0.2em 0.5em 0.2em 0.5em;\n}\n\ndiv.footer {\n    background-color: #E3EFF1;\n    color: #86989B;\n    padding: 3px 8px 3px 0;\n    clear: both;\n    font-size: 0.8em;\n    text-align: right;\n}\n\ndiv.footer a {\n    color: #86989B;\n    text-decoration: underline;\n}\n\ndiv.pagination {\n    margin-top: 2em;\n    padding-top: 0.5em;\n    border-top: 1px solid black;\n    text-align: center;\n}\n\ndiv.sphinxsidebar ul.toc {\n    margin: 1em 0 1em 0;\n    padding: 0 0 0 0.5em;\n    list-style: none;\n}\n\ndiv.sphinxsidebar ul.toc li {\n    margin: 0.5em 0 0.5em 0;\n    font-size: 0.9em;\n    line-height: 130%;\n}\n\ndiv.sphinxsidebar ul.toc li p {\n    margin: 0;\n    padding: 0;\n}\n\ndiv.sphinxsidebar ul.toc ul {\n    margin: 0.2em 0 0.2em 0;\n    padding: 0 0 0 1.8em;\n}\n\ndiv.sphinxsidebar ul.toc ul li {\n    padding: 0;\n}\n\ndiv.admonition, div.warning {\n    font-size: 0.9em;\n    margin: 1em 0 0 0;\n    border: 1px solid #86989B;\n    background-color: #f7f7f7;\n}\n\ndiv.admonition p, div.warning p {\n    margin: 0.5em 1em 0.5em 1em;\n    padding: 0;\n}\n\ndiv.admonition pre, div.warning pre {\n    margin: 0.4em 1em 0.4em 1em;\n}\n\ndiv.admonition p.admonition-title,\ndiv.warning p.admonition-title {\n    margin: 0;\n    padding: 0.1em 0 0.1em 0.5em;\n    color: white;\n    border-bottom: 1px solid #86989B;\n    font-weight: bold;\n    background-color: #AFC1C4;\n}\n\ndiv.warning {\n    border: 1px solid #940000;\n}\n\ndiv.warning p.admonition-title {\n    background-color: #CF0000;\n    border-bottom-color: #940000;\n}\n\ndiv.admonition ul, div.admonition ol,\ndiv.warning ul, div.warning ol {\n    margin: 0.1em 0.5em 0.5em 3em;\n    padding: 0;\n}\n\ndiv.versioninfo {\n    margin: 1em 0 0 0;\n    border: 1px solid #ccc;\n    background-color: #DDEAF0;\n    padding: 8px;\n    line-height: 1.3em;\n    font-size: 0.9em;\n}\n\n\na.headerlink {\n    color: #c60f0f!important;\n    font-size: 1em;\n    margin-left: 6px;\n    padding: 0 4px 0 4px;\n    text-decoration: none!important;\n    visibility: hidden;\n}\n\nh1:hover > a.headerlink,\nh2:hover > a.headerlink,\nh3:hover > a.headerlink,\nh4:hover > a.headerlink,\nh5:hover > a.headerlink,\nh6:hover > a.headerlink,\ndt:hover > a.headerlink {\n    visibility: visible;\n}\n\na.headerlink:hover {\n    background-color: #ccc;\n    color: white!important;\n}\n\ntable.indextable td {\n    text-align: left;\n    vertical-align: top;\n}\n\ntable.indextable dl, table.indextable dd {\n    margin-top: 0;\n    margin-bottom: 0;\n}\n\ntable.indextable tr.pcap {\n    height: 10px;\n}\n\ntable.indextable tr.cap {\n    margin-top: 10px;\n    background-color: #f2f2f2;\n}\n\nimg.toggler {\n    margin-right: 3px;\n    margin-top: 3px;\n    cursor: pointer;\n}\n\nimg.inheritance {\n    border: 0px\n}\n\nform.pfform {\n    margin: 10px 0 20px 0;\n}\n\ntable.contentstable {\n    width: 90%;\n}\n\ntable.contentstable p.biglink {\n    line-height: 150%;\n}\n\na.biglink {\n    font-size: 1.3em;\n}\n\nspan.linkdescr {\n    font-style: italic;\n    padding-top: 5px;\n    font-size: 90%;\n}\n\nul.search {\n    margin: 10px 0 0 20px;\n    padding: 0;\n}\n\nul.search li {\n    padding: 5px 0 5px 20px;\n    background-image: url(file.png);\n    background-repeat: no-repeat;\n    background-position: 0 7px;\n}\n\nul.search li a {\n    font-weight: bold;\n}\n\nul.search li div.context {\n    color: #888;\n    margin: 2px 0 0 30px;\n    text-align: left;\n}\n\nul.keywordmatches li.goodmatch a {\n    font-weight: bold;\n}\n"
  },
  {
    "path": "docs/source/_templates/layout.html",
    "content": "{%- extends \"basic/layout.html\" %}\n\n\n{% block rootrellink %}\n        <li><a href=\"{{ pathto('index') }}\">home</a>&nbsp;|</li>\n        <li><a href=\"{{ pathto('search') }}\">search</a>&nbsp;|</li>\n{% endblock %}\n\n{% block relbar1 %}\n\n<div style=\"background-color: white; text-align: left; padding: 10px 10px 15px 15px\">\n<a href=\"{{ pathto('index') }}\"><img src=\"{{\npathto(\"_static/logo.png\", 1) }}\" border=\"0\" alt=\"py4sci\"/></a>\n</div>\n{{ super() }}\n{% endblock %}\n"
  },
  {
    "path": "docs/source/api/climate/climate_data.rst",
    "content": "\nclimate.climate_data\n====================\n\n.. automodule:: pyunicorn.climate.climate_data\n    :synopsis: complex climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/climate_network.rst",
    "content": "\nclimate.climate_network\n=======================\n\n.. automodule:: pyunicorn.climate.climate_network\n    :synopsis: complex climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/coupled_climate_network.rst",
    "content": "\nclimate.coupled_climate_network\n===============================\n\n.. automodule:: pyunicorn.climate.coupled_climate_network\n    :synopsis: complex coupled climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/coupled_tsonis.rst",
    "content": "\nclimate.coupled_tsonis\n======================\n\n.. automodule:: pyunicorn.climate.coupled_tsonis\n    :synopsis: complex coupled climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/eventseries_climatenetwork.rst",
    "content": "\nclimate.eventseries_climatenetwork\n==================================\n\n.. automodule:: pyunicorn.climate.eventseries_climatenetwork\n    :synopsis: event series climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/havlin.rst",
    "content": "\nclimate.havlin\n==============\n\n.. automodule:: pyunicorn.climate.havlin\n    :synopsis: complex climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/hilbert.rst",
    "content": "\nclimate.hilbert\n===============\n\n.. automodule:: pyunicorn.climate.hilbert\n    :synopsis: complex climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/map_plots.rst",
    "content": "\nclimate.map_plot\n=================\n\n.. automodule:: pyunicorn.climate.map_plot\n    :synopsis: spatially embedded complex networks, multivariate data,\n               time series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/mutual_info.rst",
    "content": "\nclimate.mutual_info\n===================\n\n.. automodule:: pyunicorn.climate.mutual_info\n    :synopsis: complex climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/partial_correlation.rst",
    "content": "\nclimate.partial_correlation\n===========================\n\n.. automodule:: pyunicorn.climate.partial_correlation\n    :synopsis: complex climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/rainfall.rst",
    "content": "\nclimate.rainfall\n================\n\n.. automodule:: pyunicorn.climate.rainfall\n    :synopsis: complex climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/spearman.rst",
    "content": "\nclimate.spearman\n================\n\n.. automodule:: pyunicorn.climate.spearman\n    :synopsis: complex climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/climate/tsonis.rst",
    "content": "\nclimate.tsonis\n==============\n\n.. automodule:: pyunicorn.climate.tsonis\n    :synopsis: complex climate networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/core/data.rst",
    "content": "\ncore.data\n=========\n\n.. automodule:: pyunicorn.core.data\n    :synopsis: spatially embedded complex networks, multivariate data,\n               time series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/core/geo_grid.rst",
    "content": "\ncore.geo_grid\n=============\n\n.. automodule:: pyunicorn.core.geo_grid\n    :synopsis: spatially embedded complex networks, multivariate data,\n               time series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/core/geo_network.rst",
    "content": "\ncore.geo_network\n================\n\n.. automodule:: pyunicorn.core.geo_network\n    :synopsis: spatially embedded complex networks, multivariate data,\n               time series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/core/grid.rst",
    "content": "\ncore.grid\n=========\n\n.. automodule:: pyunicorn.core.grid\n    :synopsis: spatially embedded complex networks, multivariate data,\n               time series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/core/interacting_networks.rst",
    "content": "\ncore.interacting_networks\n=========================\n\n.. automodule:: pyunicorn.core.interacting_networks\n    :synopsis: spatially embedded complex networks, multivariate data,\n               time series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/core/netcdf_dictionary.rst",
    "content": "\ncore.netcdf_dictionary\n======================\n\n.. automodule:: pyunicorn.core.netcdf_dictionary\n    :synopsis: NetCDF <-> Python dictionary, NetCDF4 compression\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/core/network.rst",
    "content": "\ncore.network\n============\n\n.. automodule:: pyunicorn.core.network\n    :synopsis: advanced statistics and models for general complex networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/core/resistive_network.rst",
    "content": "\ncore.resistive_network\n======================\n\n.. automodule:: pyunicorn.core.resistive_network\n    :synopsis: resistance based networks\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/core/spatial_network.rst",
    "content": "\ncore.spatial_network\n====================\n\n.. automodule:: pyunicorn.core.spatial_network\n    :synopsis: spatially embedded complex networks, multivariate data,\n               time series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/eventseries/event_series.rst",
    "content": "\neventseries.event_series\n========================\n\n.. automodule:: pyunicorn.eventseries.event_series\n    :synopsis: event synchronization, event coincidence analysis\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/funcnet/coupling_analysis.rst",
    "content": "\nfuncnet.coupling_analysis\n=========================\n\n.. automodule:: pyunicorn.funcnet.coupling_analysis\n    :synopsis: spatially embedded complex networks, multivariate data, time\n               series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/funcnet/coupling_analysis_pure_python.rst",
    "content": "\nfuncnet.coupling_analysis_pure_python\n=====================================\n\n.. automodule:: pyunicorn.funcnet.coupling_analysis_pure_python\n    :synopsis: spatially embedded complex networks, multivariate data, time\n               series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/timeseries/cross_recurrence_plot.rst",
    "content": "\ntimeseries.cross_recurrence_plot\n================================\n\n.. automodule:: pyunicorn.timeseries.cross_recurrence_plot\n    :synopsis: recurrence plots, RQA measures, recurrence network analysis\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/timeseries/inter_system_recurrence_network.rst",
    "content": "\ntimeseries.inter_system_recurrence_network\n==========================================\n\n.. automodule:: pyunicorn.timeseries.inter_system_recurrence_network\n    :synopsis: recurrence plots, RQA measures, recurrence network analysis\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/timeseries/joint_recurrence_network.rst",
    "content": "\ntimeseries.joint_recurrence_network\n===================================\n\n.. automodule:: pyunicorn.timeseries.joint_recurrence_network\n    :synopsis: recurrence plots, RQA measures, recurrence network analysis\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/timeseries/joint_recurrence_plot.rst",
    "content": "\ntimeseries.joint_recurrence_plot\n================================\n\n.. automodule:: pyunicorn.timeseries.joint_recurrence_plot\n    :synopsis: recurrence plots, RQA measures, recurrence network analysis\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/timeseries/recurrence_network.rst",
    "content": "\ntimeseries.recurrence_network\n=============================\n\n.. automodule:: pyunicorn.timeseries.recurrence_network\n    :synopsis: recurrence plots, RQA measures, recurrence network analysis\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/timeseries/recurrence_plot.rst",
    "content": "\ntimeseries.recurrence_plot\n==========================\n\n.. automodule:: pyunicorn.timeseries.recurrence_plot\n    :synopsis: recurrence plots, RQA measures, recurrence network analysis\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/timeseries/surrogates.rst",
    "content": "\ntimeseries.surrogates\n=====================\n\n.. automodule:: pyunicorn.timeseries.surrogates\n    :synopsis: spatially embedded networks, multivariate data,\n               time series surrogates\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/timeseries/visibility_graph.rst",
    "content": "\ntimeseries.visibility_graph\n===========================\n\n.. automodule:: pyunicorn.timeseries.visibility_graph\n    :synopsis: recurrence plots, RQA measures, recurrence network analysis\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/utils/mpi.rst",
    "content": "\nutils.mpi\n=========\n\n.. automodule:: pyunicorn.utils.mpi\n    :synopsis: parallelization using mpi4py\n    :members:\n    :private-members:\n    :special-members:\n    :show-inheritance:\n"
  },
  {
    "path": "docs/source/api/utils/navigator.rst",
    "content": "\nutils.navigator\n===============\n"
  },
  {
    "path": "docs/source/api_doc.rst",
    "content": "\nAPI\n===\n\n:Release: |release|\n:Date: |today|\n\n``pyunicorn`` consists of six subpackages, where the ``core`` and\n``utils.mpi`` namespaces are to be accessed by calling ``import pyunicorn``. \nThe subpackage ``eventseries`` only contains one function and will be extended\nin one of the next versions. All subpackages except for ``utils`` directly export the \nclasses defined in their submodules.\n\ncore\n----\nGeneral network analysis and modeling.\n\n.. toctree::\n    :maxdepth: 1\n    :glob:\n\n    api/core/*\n\nclimate\n-------\nConstructing and analysing climate networks, related climate data analysis.\n\n.. toctree::\n    :maxdepth: 1\n    :glob:\n\n    api/climate/*\n\ntimeseries\n----------\nRecurrence plots, recurrence networks, multivariate extensions and visibility\ngraph analysis of time series. Time series surrogates for significance testing.\n\n.. toctree::\n    :maxdepth: 1\n    :glob:\n\n    api/timeseries/*\n\nfuncnet\n-------\nConstructing and analysing general functional networks.\n\n.. toctree::\n    :maxdepth: 1\n    :glob:\n\n    api/funcnet/*\n\neventseries\n-----------\nAnalysis of event series.\n\n.. toctree::\n    :maxdepth: 1\n    :glob:\n\n    api/eventseries/*\n\nutils\n-----\nParallelization, interactive network navigator, helpers.\n\n.. toctree::\n    :maxdepth: 1\n    :glob:\n\n    api/utils/*\n"
  },
  {
    "path": "docs/source/changelog.rst",
    "content": "\n.. include:: ../../CHANGELOG.rst"
  },
  {
    "path": "docs/source/conf.py",
    "content": "# pyunicorn documentation build configuration file, created by\n# sphinx-quickstart on Thu Feb 23 19:15:07 2017.\n#\n# This file is execfile()d with the current directory set to its\n# containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n\nimport re\nimport os\nimport sys\n\nsys.path.insert(0, os.path.abspath('../..'))\nfrom pyunicorn import __version__\n\n\n# -- General configuration ------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\nneeds_sphinx = '1.3'\n\n# Add any Sphinx extension module names here, as strings. They can be\n# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom\n# ones.\nextensions = [\n    'sphinx.ext.autodoc',\n    'sphinx.ext.doctest',\n    'sphinx.ext.todo',\n    'sphinx.ext.coverage',\n    'sphinx.ext.mathjax',\n    'sphinx.ext.ifconfig',\n    'sphinx.ext.viewcode',\n    'sphinx.ext.githubpages',\n    'nbsphinx',\n]\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix(es) of source filenames.\n# You can specify multiple suffix as a list of string:\n#\nsource_suffix = ['.rst', '.md']\n\n# The master toctree document.\nmaster_doc = 'sitemap'\n\n# General information about the project.\nproject = u'pyunicorn'\ncopyright = u'2008-2026, Jonathan F. Donges and pyunicorn authors'\nauthor = u'Jonathan F. Donges'\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\nversion = re.search(r'\\d*\\.\\d*', __version__).group()\n# The full version, including alpha/beta/rc tags.\nrelease = __version__\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#\n# This is also used if you do content translation via gettext catalogs.\n# Usually you set \"language\" from the command line for these cases.\nlanguage = 'en'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\n# This patterns also effect to html_static_path and html_extra_path\nexclude_patterns = []\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\n# If true, `todo` and `todoList` produce output, else they produce nothing.\ntodo_include_todos = False\n\n# A list of ignored prefixes for module index sorting.\nmodindex_common_prefix = ['pyunicorn.']\n\n# Suppress warnings for test suite.\nsuppress_warnings = ['image.nonlocal_uri']\n\n\n# -- Options for HTML output ----------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\n#\nhtml_theme = 'classic'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#\n# html_theme_options = {}\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n\n# The name of an image file (relative to this directory) to place at the top\n# of the sidebar.\n# html_logo = '_static/logo.png'\n\n# Custom sidebar templates, maps document names to template names.\nhtml_sidebars = {\n    '**': [\n        'globaltoc.html',\n        'searchbox.html',\n    ]\n}\n\n\n# -- Options for HTMLHelp output ------------------------------------------\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'pyunicorndoc'\n\n\n# -- Options for LaTeX output ---------------------------------------------\n\nlatex_elements = {\n    # The paper size ('letterpaper' or 'a4paper').\n    #\n    'papersize': 'a4paper',\n\n    # The font size ('10pt', '11pt' or '12pt').\n    #\n    'pointsize': '10pt',\n\n    # Additional stuff for the LaTeX preamble.\n    #\n    # 'preamble': '',\n\n    # Latex figure (float) alignment\n    #\n    # 'figure_align': 'htbp',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title,\n#  author, documentclass [howto, manual, or own class]).\nlatex_documents = [\n    (master_doc, 'pyunicorn.tex', u'pyunicorn Documentation',\n    u'Jonathan F. Donges and pyunicorn authors', 'manual', False),\n]\n\n# The name of an image file (relative to this directory) to place at the top of\n# the title page.\nlatex_logo = '_static/logo.png'\n\n# If true, show URL addresses after external links.\nlatex_show_urls = 'inline'\n\n\n# -- Options for manual page output ---------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    (master_doc, 'pyunicorn', u'pyunicorn Documentation',\n     [author], 1)\n]\n\n\n# -- Options for Texinfo output -------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n    (master_doc, 'pyunicorn', u'pyunicorn Documentation',\n     author, 'pyunicorn', 'One line description of project.',\n     'Miscellaneous'),\n]\n"
  },
  {
    "path": "docs/source/contact.rst",
    "content": "\nContact\n=======\n\n.. include:: ../../README.rst\n    :start-after: (3 clause).\n    :end-before: Getting Started\n\n.. include:: ../../CONTRIBUTIONS.rst\n    :start-after: BSD (3-clause)\n"
  },
  {
    "path": "docs/source/development.rst",
    "content": "\n.. include:: ../../README.rst\n    :start-after: Jupyter notebooks."
  },
  {
    "path": "docs/source/download.rst",
    "content": "\n.. include:: ../../README.rst\n    :start-after: others.\n    :end-before: Development\n"
  },
  {
    "path": "docs/source/examples/modules/mpi/network_large.py",
    "content": "from pyunicorn import Network, mpi\n\n\ndef master():\n    net = Network.Model(\"BarabasiAlbert\", n_nodes=1000, n_links_each=10)\n    print(net.newman_betweenness())\n    mpi.info()\n\nmpi.run()\n"
  },
  {
    "path": "docs/source/examples/modules/mpi/network_mc.py",
    "content": "from pyunicorn import Network, mpi\n\n\ndef do_one():\n    net = Network.Model(\"BarabasiAlbert\", n_nodes=100, n_links_each=10)\n    return net.global_clustering()\n\n\ndef master():\n    n = 1000\n    for i in range(0, n):\n        mpi.submit_call(\"do_one\", ())\n    s = 0\n    for i in range(0, n):\n        s += mpi.get_next_result()\n    print(s/n)\n    mpi.info()\n\nmpi.run()\n"
  },
  {
    "path": "docs/source/examples/modules/mpi/network_scan_no_comm.py",
    "content": "import numpy\nfrom pyunicorn import Network, mpi\n\noffset = 10\nn_max = 1000\ns = 0\nn = mpi.rank + offset\nwhile n <= n_max + offset:\n    s += Network.Model(\"BarabasiAlbert\", n_nodes=n).global_clustering()\n    n += mpi.size\n\nnumpy.save(\"s\"+str(mpi.rank), s)\n"
  },
  {
    "path": "docs/source/examples/modules/timeseries/recurrence_network.py",
    "content": "import numpy as np\nfrom pyunicorn.timeseries import RecurrenceNetwork\n\nx = np.sin(np.linspace(0, 10 * np.pi, 1000))\nnet = RecurrenceNetwork(x, recurrence_rate=0.05)\nprint(net.transitivity())\n"
  },
  {
    "path": "docs/source/examples/tutorials/ClimateNetworks.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"c79b8e2b\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tutorial: Climate Networks\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"677ae7d7\",\n   \"metadata\": {},\n   \"source\": [\n    \"The objective of this tutorial is to introduce climate networks, and to explain and illustrate their application with the `pyunicorn` package. First some theoretical background for understanding general climate networks will be given, and then some methods provided by `pyunicorn.climate.ClimateNetwork` will be illustrated. An introduction and application of coupled climate networks will follow. For a detailed discussion and further references, please consult __[Donges et al. (2015)](https://aip.scitation.org/doi/10.1063/1.4934554)__, on which this tutorial is based. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"76c98668\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Introduction\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"a56c11e0\",\n   \"metadata\": {},\n   \"source\": [\n    \"_Climate networks (CN)_ are a way to apply complex network theory to the climate system, by assuming that each node represents a varying dynamical system. Of interest is then the collective behaviour of these interacting dynamical systems and the structure of the resulting network. This approach was first introduced by __[Tsonis and Roebber (2004)](https://www.sciencedirect.com/science/article/abs/pii/S0378437103009646)__.\\n\",\n    \"\\n\",\n    \"CN analysis is a versatile approach for investigating climatological data, and it can be used as a complementary method to classical techniques from multivariate statistics. The approach allows for the analysis of single fields of climatological time series, e.g., surface air temperature observed on a grid, or even two or more fields. It has been successfully applied in many cases, for example to dynamics and predictability of the El Niño Phenomenon (__[Radebach et al., 2013](https://arxiv.org/abs/1310.5494)__).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"05e76cc7\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Theory of Climate Networks (CNs)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"fcc79d2d\",\n   \"metadata\": {},\n   \"source\": [\n    \"CNs are a typical application of _functional networks_, which allow to study the dynamical relationships between subsystems of a high-dimensional complex system by constructing networks from it. `pyunicorn` provides classes for the construction and analysis of such networks, representing the statistical interdependency structure within and between fields of time series using various similarity measures.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"1860c9d0\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Coupling Analysis\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"30cd9555\",\n   \"metadata\": {},\n   \"source\": [\n    \"CNs represent strong statistical interrelationships between time series of climatological fields. These statistical interrelationships can be estimated with methods from the `funcnet.CouplingAnalysis` class in terms of matrices of _statistical similarities_ $\\\\textbf{S}$, such as the _(lagged) classical linear Pearson product-moment correlation coefficient_ (CC). The CC of two zero-mean time series variables $X,Y$, as implemented in `funcnet.CouplingAnalysis.cross_correlation()`, is given by \\n\",\n    \"$$\\\\rho_{XY}(\\\\tau)=\\\\frac{\\\\langle X_{t-\\\\tau}, Y_t \\\\rangle}{\\\\sigma_X \\\\sigma_Y}\\\\,,$$\\n\",\n    \"which depends on the covariance $\\\\langle X_{t-\\\\tau}, Y_t \\\\rangle$ and the standard deviations $\\\\sigma_X, \\\\sigma_Y$. Lags $\\\\tau > 0$ correspond to the linear association of past values of $X$ with $Y$, and vice versa for $\\\\tau < 0$. \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"70377c40\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Similarity Measures for CNs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"fadb2909\",\n   \"metadata\": {},\n   \"source\": [\n    \"By thresholding the matrix of a statistical similarity measure $\\\\textbf{S}$, the interrelationships between time series of climate networks can be reconstructed:\\n\",\n    \"$$A_{pq} = \\\\Theta(S_{pq}-\\\\beta)\\\\quad \\\\text{ if } p \\\\neq q; \\\\qquad 0\\\\quad\\\\text{otherwise}\\\\,,$$\\n\",\n    \"where $\\\\Theta$ is the Heaviside function, $\\\\beta$ denotes a threshold parameter, and $A_{pp} = 0$ for all nodes $p$ to exclude self-loops. A CN that is reconstructed using the Pearson CC from above is called a _Pearson correlation CN_.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"9c64c013\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Constructing CNs\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"ff7f5d81-129e-4966-a7fc-a0d25aea87f3\",\n   \"metadata\": {},\n   \"source\": [\n    \"Having established some basic theoretic background, we will now use `pyunicorn` to construct a CN. We start by importing the required packages, by downloading an example __[NOAA dataset](https://psl.noaa.gov/repository/entry/show?entryid=synth%3Ae570c8f9-ec09-4e89-93b4-babd5651e7a9%3AL25jZXAucmVhbmFseXNpcy5kZXJpdmVkL3N1cmZhY2UvYWlyLm1vbi5tZWFuLm5j)__, and by specifying some metadata for it.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"id\": \"e793f1a2\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"from matplotlib import pyplot as plt\\n\",\n    \"from pyunicorn import climate\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"id\": \"2a8e9a1d-982d-4216-8483-4f372f40d918\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"./data/air.mon.mean 100%[===================>]  28.12M  2.25MB/s    in 88s     \\n\",\n      \"2025-12-12 15:53:44 URL:https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis/Monthlies/surface/air.mon.mean.nc [29489350/29489350] -> \\\"./data/air.mon.mean.nc\\\" [1]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"DATA_NAME = \\\"air.mon.mean.nc\\\"\\n\",\n    \"DATA_URL = f\\\"https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis/Monthlies/surface/{DATA_NAME}\\\"\\n\",\n    \"DATA_FILE = f\\\"./data/{DATA_NAME}\\\"\\n\",\n    \"![ -f {DATA_FILE} ] || wget -O {DATA_FILE} -nv --show-progress \\\"{DATA_URL}\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"id\": \"6f79efc6-63ca-4726-bb8f-003744170bcc\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"DATA_FILENAME = \\\"./data/air.mon.mean.nc\\\"\\n\",\n    \"#  Indicate data source (optional)\\n\",\n    \"DATA_SOURCE = \\\"ncep_ncar_reanalysis\\\"\\n\",\n    \"#  Type of data file (\\\"NetCDF\\\" indicates a NetCDF file with data on a regular\\n\",\n    \"#  lat-lon grid, \\\"iNetCDF\\\" allows for arbitrary grids - > see documentation).\\n\",\n    \"FILE_TYPE = \\\"NetCDF\\\"\\n\",\n    \"#  Name of observable in NetCDF file (\\\"air\\\" indicates surface air temperature\\n\",\n    \"#  in NCEP/NCAR reanalysis data)\\n\",\n    \"OBSERVABLE_NAME = \\\"air\\\"\\n\",\n    \"#  Select a region in time and space from the data (here the whole dataset)\\n\",\n    \"WINDOW = {\\\"time_min\\\": 0., \\\"time_max\\\": 0., \\\"lat_min\\\": 0, \\\"lon_min\\\": 0,\\n\",\n    \"          \\\"lat_max\\\": 30, \\\"lon_max\\\": 0}\\n\",\n    \"#  Indicate the length of the annual cycle in the data (e.g., 12 for monthly\\n\",\n    \"#  data). This is used for calculating climatological anomaly values.\\n\",\n    \"TIME_CYCLE = 12\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"9f54ffe5-02a5-47e4-a459-870e1e8afef6\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we set some parameters for the CN construction, the first being the threshold $\\\\beta$ from above, and create a `ClimateData` object containing our data.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"id\": \"baf245bd-2f3e-401d-bc1d-9943fee4bbf2\",\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Global attributes:\\n\",\n      \"description: Data from NCEP initialized reanalysis (4x/day).  These are the 0.9950 sigma level values\\n\",\n      \"platform: Model\\n\",\n      \"Conventions: COARDS\\n\",\n      \"NCO: 20121012\\n\",\n      \"history: Thu May  4 20:11:16 2000: ncrcat -d time,0,623 /Datasets/ncep.reanalysis.derived/surface/air.mon.mean.nc air.mon.mean.nc\\n\",\n      \"Thu May  4 18:11:50 2000: ncrcat -d time,0,622 /Datasets/ncep.reanalysis.derived/surface/air.mon.mean.nc ./surface/air.mon.mean.nc\\n\",\n      \"Mon Jul  5 23:47:18 1999: ncrcat ./air.mon.mean.nc /Datasets/ncep.reanalysis.derived/surface/air.mon.mean.nc /dm/dmwork/nmc.rean.ingest/combinedMMs/surface/air.mon.mean.nc\\n\",\n      \"/home/hoop/crdc/cpreanjuke2farm/cpreanjuke2farm Mon Oct 23 21:04:20 1995 from air.sfc.gauss.85.nc\\n\",\n      \"created 95/03/13 by Hoop (netCDF2.3)\\n\",\n      \"Converted to chunked, deflated non-packed NetCDF4 2014/09\\n\",\n      \"title: monthly mean air.sig995 from the NCEP Reanalysis\\n\",\n      \"dataset_title: NCEP-NCAR Reanalysis 1\\n\",\n      \"References: http://www.psl.noaa.gov/data/gridded/data.ncep.reanalysis.derived.html\\n\",\n      \"Variables (size):\\n\",\n      \"lat (73)\\n\",\n      \"lon (144)\\n\",\n      \"time (935)\\n\",\n      \"air (935)\\n\",\n      \"ClimateData:\\n\",\n      \"Data: 10512 grid points, 9828720 measurements.\\n\",\n      \"Geographical boundaries:\\n\",\n      \"         time     lat     lon\\n\",\n      \"   min 1297320.0  -90.00    0.00\\n\",\n      \"   max 1979616.0   90.00  357.50\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"#  For setting fixed threshold\\n\",\n    \"THRESHOLD = 0.5\\n\",\n    \"#  For setting fixed link density\\n\",\n    \"LINK_DENSITY = 0.005\\n\",\n    \"#  Indicates whether to use only data from winter months (DJF) for calculating\\n\",\n    \"#  correlations\\n\",\n    \"WINTER_ONLY = False\\n\",\n    \"\\n\",\n    \"data = climate.ClimateData.Load(\\n\",\n    \"    file_name=DATA_FILENAME, observable_name=OBSERVABLE_NAME,\\n\",\n    \"    data_source=DATA_SOURCE, file_type=FILE_TYPE,\\n\",\n    \"    window=WINDOW, time_cycle=TIME_CYCLE)\\n\",\n    \"print(data)\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"2fade6f6-8457-436f-a52a-77464e92fd54\",\n   \"metadata\": {},\n   \"source\": [\n    \"Next, we construct a CN based on the Pearson CC, without lag and with fixed threshold. Alternatively, several other similarity measures and construction mechanisms may be used as well.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"id\": \"c5326b90\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Generating a Tsonis climate network...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"net = climate.TsonisClimateNetwork(\\n\",\n    \"    data, threshold=THRESHOLD, winter_only=WINTER_ONLY)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"id\": \"2cdee7ef-7d2f-46d9-83ed-c9253e0100c0\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"#  Create a climate network based on Pearson correlation without lag and with\\n\",\n    \"#  fixed link density\\n\",\n    \"# net = climate.TsonisClimateNetwork(\\n\",\n    \"#     data, link_density=LINK_DENSITY, winter_only=WINTER_ONLY)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"id\": \"e6bf3b44-193b-48c0-b7be-f056bd35d72c\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"#  Create a climate network based on Spearman's rank order correlation without\\n\",\n    \"#  lag and with fixed threshold\\n\",\n    \"# net = climate.SpearmanClimateNetwork(\\n\",\n    \"#     data, threshold=THRESHOLD, winter_only=WINTER_ONLY)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"id\": \"5cdcfc8a-6448-4df3-b49f-f3e5d220f0f2\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"#  Create a climate network based on mutual information without lag and with\\n\",\n    \"#  fixed threshold\\n\",\n    \"# net = climate.MutualInfoClimateNetwork(\\n\",\n    \"#     data, threshold=THRESHOLD, winter_only=WINTER_ONLY)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"b443476e\",\n   \"metadata\": {},\n   \"source\": [\n    \"We finish by calculating some basic network measures for the resulting CN, optionally saving them to text files.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"id\": \"4f568b0f\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Link density: 0.028533654023682083\\n\",\n      \"Calculating closeness...\\n\",\n      \"Calculating node betweenness...\\n\",\n      \"Calculating local clustering coefficients...\\n\",\n      \"Calculating average link distance...\\n\",\n      \"Calculating angular great circle distance...\\n\",\n      \"Calculating maximum link distance...\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"Link density:\\\", net.link_density)\\n\",\n    \"\\n\",\n    \"degree = net.degree()\\n\",\n    \"closeness = net.closeness()\\n\",\n    \"betweenness = net.betweenness()\\n\",\n    \"clustering = net.local_clustering()\\n\",\n    \"ald = net.average_link_distance()\\n\",\n    \"mld = net.max_link_distance()\\n\",\n    \"\\n\",\n    \"#  Save the grid (mainly vertex coordinates) to text files\\n\",\n    \"#data.grid.save_txt(filename=\\\"grid.txt\\\")\\n\",\n    \"#  Save the degree sequence. Other measures may be saved similarly.\\n\",\n    \"#np.savetxt(\\\"degree.txt\\\", degree)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"15af9941\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Plotting CNs\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"b26e5953-53c6-418a-b08b-509ad415081f\",\n   \"metadata\": {},\n   \"source\": [\n    \"`pyunicorn` provides a basic plotting feature based on the __[cartopy](https://scitools.org.uk/cartopy/docs/latest/)__ and `matplotlib` packages, which can be used to have a first look at the generated data. We start by initializing a `MapPlot` object:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"id\": \"b823297c\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# create a Cartopy plot instance called map_plot\\n\",\n    \"# from the data with title DATA_SOURCE\\n\",\n    \"map_plot = climate.MapPlot(data.grid, DATA_SOURCE)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"422af668\",\n   \"metadata\": {},\n   \"source\": [\n    \"With `MapPlot.plot()`, we can now plot some of our previously calculated measures on the given grid.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"id\": \"056f3a92\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAhQAAAEQCAYAAADoA+1uAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnXd4HMXZwH+zu1cknXTq1b1b7r1gioFgcIypoQVTQwmhJRBKQoAQQhJICCVASAJxKKEEPooJJXQDbrgX3Jus3svpdGV35vvjpLPPkmXJkhvs73n8WLs3Ozszt7fzzjtvEUophY2NjY2NjY1NF9AOdwNsbGxsbGxsjn5sgcLGxsbGxsamy9gChY2NjY2NjU2XsQUKGxsbGxsbmy5jCxQ2NjY2NjY2XcYWKGxsbGxsbGy6jC1Q2NjY2NjY2HQZW6CwsbGxsbGx6TK2QGFjY2NjY2PTZWyBwsbG5ojisssuo0+fPgel7s8++wwhBJ999tlBqd/G5ruMcbgbYGNjY3OoGDt2LAsXLiQ/P/9wN8XG5luHraGwsTlK8Pv9h+XabxNJSUlMnjyZpKSkw90UG5tvHbZAYXNQuffeexFCsG7dOi688EK8Xi9ZWVlcccUV1NXVRctJKXn88ccZPXo0cXFxJCcnM3nyZN5+++2Y+l555RWmTJlCQkICHo+HGTNmsGLFipgyl112GR6Ph3Xr1nHSSSeRkJBARkYG119/facn1pa6tmzZwsyZM/F4PPTs2ZNbbrmFYDAYUzYYDHLfffcxdOhQ3G43aWlpTJ8+nQULFkTLPPHEExx33HFkZmaSkJDAiBEjePDBBwmHwzF1nXDCCQwfPpz58+czdepU4uPjueKKKzrU5pYxX758Oeeeey4pKSn0798fAKUUTz75ZHScU1JSOPfcc9m2bVtMHR9++CFnnHEGPXr0wO12M2DAAK655hoqKyvbvNf+vt/O9H1vTjrpJIYMGcLeeQyVUgwYMIDvf//70XNPPfUUo0aNwuPxkJiYyJAhQ/jFL34R/bytLY9t27ZxwQUXkJubi8vlIisri5NOOomVK1fud6xtbGx2Y2952BwSzjnnHM4//3yuvPJK1qxZw5133gnAs88+C0Qm7hdeeIErr7yS++67D6fTyfLly9mxY0e0jgceeIC77rqLyy+/nLvuuotQKMRDDz3Esccey5IlS2LU2OFwmJkzZ3LNNddwxx13sGDBAu6//3527tzJvHnzOtX2cDjM7NmzufLKK7nllluYP38+v/nNb/B6vdx9990AmKbJaaedxhdffMHNN9/MiSeeiGmaLFq0iIKCAqZOnQrA1q1bueiii+jbty9Op5NVq1bx29/+lg0bNkTHooWSkhIuvvhibrvtNh544AE0rXPy/9lnn80FF1zAtddeS2NjIwDXXHMNc+fO5cYbb+QPf/gD1dXV3HfffUydOpVVq1aRlZUVbeeUKVP40Y9+hNfrZceOHTz88MNMmzaNNWvW4HA4Yu61v++3s33fk5tuuokzzjiDjz/+mJNPPjl6/r333mPr1q089thjALz88stcd9113HDDDfzxj39E0zS2bNnCN9980+44zZw5E8uyePDBB+nVqxeVlZUsWLCA2trajg+2jY0NKBubg8g999yjAPXggw/GnL/uuuuU2+1WUko1f/58Bahf/vKX+6ynoKBAGYahbrjhhpjzDQ0NKjs7W5133nnRc5deeqkC1KOPPhpT9re//a0C1Jdfftnh9rfU9eqrr8acnzlzpho8eHD0+LnnnlOA+vvf/97hui3LUuFwWD333HNK13VVXV0d/ez4449XgPr44487XF8LLWN+9913x5xfuHChAtSf/vSnmPO7du1ScXFx6rbbbmuzPimlCofDaufOnQpQb731Vqt7tff9tkV7fb/00ktV7969Y8r269dPnXHGGTF1nHbaaap///7Re1x//fUqOTm57UFp5tNPP1WA+vTTT5VSSlVWVipAPfLII+1eZ2Njs3/sLQ+bQ8Ls2bNjjkeOHEkgEKC8vJz33nsPgJ/85Cf7vP6DDz7ANE0uueQSTNOM/nO73Rx//PFtWu3/8Ic/jDm+6KKLAPj000871XYhBKeffnqr9u/cuTN6/N577+F2u/e7LbFixQpmz55NWloauq7jcDi45JJLsCyLTZs2xZRNSUnhxBNP7FRb9+Scc86JOX7nnXcQQnDxxRfHjGF2djajRo2KGcPy8nKuvfZaevbsiWEYOBwOevfuDcD69etb3au97/dA+r4nmqZx/fXX884771BQUABEtB3vv/8+1113HUIIACZOnEhtbS0XXnghb731VqvtmbZITU2lf//+PPTQQzz88MOsWLECKeV+r7OxsWmNLVDYHBLS0tJijl0uFwBNTU1UVFSg6zrZ2dn7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\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 2 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# plot degree\\n\",\n    \"map_plot.plot(degree, \\\"Degree\\\")\\n\",\n    \"\\n\",\n    \"# add matplotlib.pyplot or cartopy commands to customize figure\\n\",\n    \"plt.set_cmap('plasma')\\n\",\n    \"# optionally save figure\\n\",\n    \"#plt.savefig('degree.png')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"b8feb1e0\",\n   \"metadata\": {},\n   \"source\": [\n    \"Try plotting more measures if you like.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"id\": \"8b67424d\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAfoAAAEQCAYAAABYyratAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzsnWWYHUXWgN/rOu7uGZ8kE3dPSAjBITiBxZ3FYRdYZBf9cDa7+GLBQ4AAcXfPzETG3fW69ffjZm7GLROD+/LkYbpvd3VVdXWdqlPnnBIJgiDgxo0bN27cuPlDIj7dGXDjxo0bN27cnDzcgt6NGzdu3Lj5A+MW9G7cuHHjxs0fGLegd+PGjRs3bv7AuAW9Gzdu3Lhx8wfGLejduHHjxo2bPzBuQe/GjRs3btz8gXELejdu3Lhx4+YPjFvQu3Hjxo0bN39g3ILejRs3ZxTXX3890dHRJyXttWvXIhKJWLt27UlJ342bMxHp6c6AGzdu3JwqMjMz2bJlCykpKac7K27cnDLcM3o3bs4SDAbDabn3j4Snpydjx47F09PzdGfFjZtThlvQuzmpPPXUU4hEIrKysrjiiivw8vIiKCiIG264gaamJtd1DoeDN998k2HDhqFSqfD29mbs2LH8+OOP7dJbsmQJ48aNQ6PRoNVqmTNnDnv27Gl3zfXXX49WqyUrK4sZM2ag0WgICAjgzjvv7LfAa00rNzeXefPmodVqiYiI4K9//Stms7ndtWazmX/84x8kJyejVCrx8/Nj2rRpbN682XXN22+/zeTJkwkMDESj0ZCens6LL76I1Wptl9bUqVNJS0tj/fr1jB8/HrVazQ033NCnPLfW+e7du7nkkkvw8fEhLi4OAEEQeOedd1z17OPjwyWXXEJ+fn67NFasWMH5559PeHg4SqWS+Ph4brnlFmpra7t8Vm/vtz9l78iMGTNISkqi4/5bgiAQHx/Pueee6zr37rvvMnToULRaLR4eHiQlJfHYY4+5fu9KdZ+fn8/ChQsJDQ1FoVAQFBTEjBkz2Lt3b6917cbN2YBbde/mlHDxxRdz+eWXc+ONN3LgwAEeffRRAD744APAKVA//fRTbrzxRv7xj38gl8vZvXs3hYWFrjSef/55nnjiCRYtWsQTTzyBxWLhpZdeYtKkSWzfvr2dOtZqtTJv3jxuueUWHnnkETZv3syzzz5LUVERy5Yt61ferVYrCxYs4MYbb+Svf/0r69ev55lnnsHLy4u///3vANhsNubOncuGDRu49957mT59Ojabja1bt1JcXMz48eMByMvL48orryQmJga5XM6+fft47rnnOHTokKsuWqmoqODqq6/moYce4vnnn0cs7t+4/KKLLmLhwoXceuut6PV6AG655RY++ugj7r77bl544QXq6+v5xz/+wfjx49m3bx9BQUGufI4bN46//OUveHl5UVhYyKuvvsrEiRM5cOAAMpms3bN6e7/9LXtb7rnnHs4//3xWrVrFzJkzXeeXL19OXl4eb7zxBgBffvklt99+O3fddRcvv/wyYrGY3NxcsrOze6ynefPmYbfbefHFF4mMjKS2tpbNmzfT2NjY98p24+ZMRnDj5iTy5JNPCoDw4osvtjt/++23C0qlUnA4HML69esFQHj88ce7Tae4uFiQSqXCXXfd1e58S0uLEBwcLFx22WWuc9ddd50ACK+//nq7a5977jkBEDZu3Njn/Lem9dVXX7U7P2/ePCExMdF1/MknnwiA8N///rfPadvtdsFqtQqffPKJIJFIhPr6etdvU6ZMEQBh1apVfU6vldY6//vf/97u/JYtWwRAeOWVV9qdLykpEVQqlfDQQw91mZ7D4RCsVqtQVFQkAMLSpUs7Paun99sVPZX9uuuuE6KiotpdGxsbK5x//vnt0pg7d64QFxfnesadd94peHt7d10px1izZo0ACGvWrBEEQRBqa2sFQHjttdd6vM+Nm7MZt+rezSlhwYIF7Y4zMjIwmUxUV1ezfPlyAO64445u7//tt9+w2Wxce+212Gw21z+lUsmUKVO6tKK+6qqr2h1feeWVAKxZs6ZfeReJRJx33nmd8l9UVOQ6Xr58OUqlslf1+p49e1iwYAF+fn5IJBJkMhnXXnstdrudI0eOtLvWx8eH6dOn9yuvbbn44ovbHf/000+IRCKuvvrqdnUYHBzM0KFD29VhdXU1t956KxEREUilUmQyGVFRUQDk5OR0elZP73cgZW+LWCzmzjvv5KeffqK4uBhwagd+/fVXbr/9dkQiEQCjR4+msbGRK664gqVLl3ZaZugKX19f4uLieOmll3j11VfZs2cPDoej1/vcuDmbcAt6N6cEPz+/dscKhQIAo9FITU0NEomE4ODgbu+vqqoCYNSoUchksnb/lixZ0qlTl0qlnZ7Zmn5dXV2/8q5Wq1EqlZ3ybzKZXMc1NTWEhob2qF4vLi5m0qRJlJWV8frrr7NhwwZ27NjB22+/DTjroi0hISH9ymdHOt5fVVWFIAgEBQV1qsOtW7e66tDhcDB79my+++47HnroIVatWsX27dvZunVrl/mEnt/vQMrekRtuuAGVSsW///1vwLner1Kp2g2srrnmGj744AOKioq4+OKLCQwMZMyYMaxYsaLbdEUiEatWrWLOnDm8+OKLZGZmEhAQwN13301LS0uPeXLj5mzBvUbv5rQTEBCA3W6nsrKyW+Hm7+8PwDfffOOaWfaEzWajrq6unQCqrKwEOgulwSAgIICNGzficDi6FfY//PADer2e7777rl0ZujP6ap2pDpSO9/v7+yMSidiwYYNLELel9dzBgwfZt28fH330Edddd53r99zc3AHnpb9l74iXlxfXXXcd7733Hg888AAffvghV155Jd7e3u2uW7RoEYsWLUKv17N+/XqefPJJ5s+fz5EjR7ptN1FRUbz//vsAHDlyhK+++oqnnnoKi8XiGli4cXM2457RuzntzJ07F3BaTHfHnDlzkEql5OXlMXLkyC7/deSzzz5rd/z5558DTov2wWbu3LmYTCY++uijbq9pFbxthawgCPz3v/8d9Px0xfz58xEEgbKysi7rLz09vdt8AixevHjAzx6Mst99993U1tZyySWX0NjYyJ133tnttRqNhrlz5/L4449jsVjIysrq0zOGDBnCE088QXp6Ort37+5z3ty4OZNxz+jdnHYmTZrENddcw7PPPktVVRXz589HoVCwZ88e1Go1d911F9HR0fzjH//g8ccfJz8/n3POOQcfHx+qqqrYvn07Go2Gp59+2pWmXC7nlVdeQafTMWrUKJfV/dy5c5k4ceKgl+GKK67gww8/5NZbb+Xw4cNMmzYNh8PBtm3bSE5OZuHChcyaNQu5XM4VV1zBQw89hMlk4t1336WhoWHQ89MVEyZM4Oabb2bRokXs3LmTyZMno9FoqKioYOPGjaSnp3PbbbeRlJREXFwcjzzyCIIg4Ovry7Jly3pUgffGYJR9yJAhnHPOOSxfvpyJEycydOjQdr/fdNNNqFQqJkyYQEhICJWVlfzzn//Ey8uLUaNGdZnm/v37ufPOO7n00ktJSEhALpezevVq9u/fzyOPPDLg8rpxcybhFvRuzgg+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\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 2 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# plot betwenness\\n\",\n    \"map_plot.plot(np.log10(betweenness + 1), \\\"Betweenness (log10)\\\")\\n\",\n    \"\\n\",\n    \"# add matplotlib.pyplot or cartopy commands to customize figure\\n\",\n    \"plt.set_cmap('plasma')\\n\",\n    \"# optionally save figure\\n\",\n    \"#plt.savefig('degree.png')\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"pyunicorn\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.13.1\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  },
  {
    "path": "docs/source/examples/tutorials/CoupledClimateNetworks.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"9b3f935f\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tutorial: Coupled Climate Networks\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"41e36ae2\",\n   \"metadata\": {},\n   \"source\": [\n    \"The objective of this tutorial is to introduce *coupled climate subnetwork analysis*, which uses *interacting networks* in order to study the statistical relationships between several fields of climatological observables, or between a climatolical obervable at different vertical levels.\\n\",\n    \"\\n\",\n    \"First, some theoretical background on *interacting networks* is given and the method of *coupled climate network analysis* is explained. Then, some methods provided by ``pyunicorn`` are illustrated by the example of the Earth's atmosphere’s vertical dynamical structure. An introduction to (single layer) *climate networks* and their application with the ``pyunicorn`` package can be found in  the tutorial [Climate Networks](https://github.com/pik-copan/pyunicorn/blob/master/notebooks/tutorial_ClimateNetworks.ipynb). For a detailed discussion and further references, please consult [Donges et al. (2015)](https://aip.scitation.org/doi/10.1063/1.4934554) and [Donges et al. (2011)](https://link.springer.com/article/10.1140/epjb/e2011-10795-8), on which this tutorial is based.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"122ca935\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Introduction\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"64969606\",\n   \"metadata\": {},\n   \"source\": [\n    \"*Coupled climate networks* are a very useful tool for representing and studying the statistical relationship between different climatological variables, or between a single variable at different physically separable levels. This can be useful for finding spatial as well as temporal patterns that account for a large fraction of the fields' variance. The method can also be applied to study the complex interactions between different domains of the Earth system, e.g., the atmosphere, hydrosphere, cryosphere and biosphere, which still remains a great challenge for modern science. The urge to make progress in this field is particularly pressing, as substantial and mutually interacting components of the Earth system (tipping elements) may soon pass a bifurcation point (tipping point) due to global climate change. Mapping the complex interdependency structure of subsystems, components or processes of the Earth system to a network of interacting networks provides a natural, simplified and condensed mathematical representation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"5d0b07ef\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Theory of Interacting Networks\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"6fd973d9\",\n   \"metadata\": {},\n   \"source\": [\n    \"The structure of many complex systems can be described as a *network of interacting, or interdependent, networks*. Notable examples are representations of the mammalian cortex, systems of interacting populations of heterogeneous oscillators, or mutually interdependent infrastructure networks. \\n\",\n    \"\\n\",\n    \"``pyunicorn`` provides the class `core.InteractingNetworks`for constructing and analysing all kinds of interacting networks. *Coupled climate networks* are the application of *interacting networks* to *climate networks*, and hence, the class `climate.CoupledClimateNetworks` inherits from `core.InteractingNetworks` and `climate.ClimateNetworks`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0eab5909\",\n   \"metadata\": {},\n   \"source\": [\n    \"*Interacting networks* can be represented by decomposing a network $G=(V,E)$ into a collection of $M$ *subnetworks* \\n\",\n    \"$G_i=(V_i,E_{ii})$. Here, $(V_i)_i$ denote the disjoint sets of nodes corresponding to each subnetwork, such that $\\\\bigcup^M_{i=1}V_i=V$. The internal link sets $(E_{ii})_i$ contain information on the connections within a subnetwork,\\n\",\n    \"and disjoint sets of cross-links $E_{ij}\\\\;(i\\\\neq j)$ connect nodes in different subnetworks, such that $\\\\bigcup^M_{i,j=1}E_{ij}=E$. \\n\",\n    \"Alternatively, a network of networks of this type can be represented by a standard adjacency matrix $A$ with   with block structure.\"\n   ]\n  },\n  {\n   \"attachments\": {\n    \"Systems-of-interacting-networks-or-networks-of-networks-are-a-natural-representation-of_W640.jpg\": {\n     \"image/jpeg\": \"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\"\n    }\n   },\n   \"cell_type\": \"markdown\",\n   \"id\": \"43bc2905\",\n   \"metadata\": {},\n   \"source\": [\n    \"![Systems-of-interacting-networks-or-networks-of-networks-are-a-natural-representation-of_W640.jpg](attachment:Systems-of-interacting-networks-or-networks-of-networks-are-a-natural-representation-of_W640.jpg)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"9a3e271c\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the following, we introduce some local and global measures for interacting networks. \\n\",\n    \"The indices $i,j,k,l$ always denote subnetworks, while $v,w,p,q$ designate single vertices, and we always assume $v\\\\in V_i$. The formulae explicitly account\\n\",\n    \"for the general case $i \\\\ne j$, but can be nevertheless easily modified to suit the special case $i = j$. Furthermore, the term *cross* refers to the interaction between subnetworks $G_i,G_j$, whereas *internal* refers to the structure within a single subnetwork.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"cc54fec3\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Local Measures\\n\",\n    \"\\n\",\n    \"The **cross-degree centrality** $k_v^{ij}$ gives the number of neighbours of the vertex $v$ within subnetwork $G_j$,\\n\",\n    \"$$k_v^{ij}=\\\\sum_{q\\\\in V_j}A_{vq}\\\\,,\\\\quad v \\\\in V_i.$$\\n\",\n    \"\\n\",\n    \"The **cross-closeness centrality** $c^{ij}_v$ measures the topological closeness of $v$ to subnetwork $G_j$ along shortest paths,\\n\",\n    \"$$ c^{ij}_v = \\\\frac{N_j}{\\\\sum_{q\\\\in V_j}d_{vq}}\\\\,,$$\\n\",\n    \"where $d_{vq}$ is the shortest path length between vertices $v$ and $q$,\\n\",\n    \"and $N_j$ denotes the number of vertices in the subnetwork $G_j$.\\n\",\n    \"\\n\",\n    \"For any vertex $w \\\\in V$, the **cross-betweenness centrality** $b^{ij}_w$ indicates its role for mediating interactions between two subnetworks $G_i$ and $G_j$,\\n\",\n    \"$$ b^{ij}_w= \\\\sum_{p\\\\in V_i,\\\\,q \\\\in V_j,\\\\,p,q\\\\ne w}\\\\frac{\\\\sigma_{pq}(w)}{\\\\sigma_{pq}}= b^{ji}_w\\\\,,$$\\n\",\n    \"where $\\\\sigma_{pq}(w)$ denotes the total number of shortest paths from $p \\\\in V_i$ to $q \\\\in V_j$ that include $w$.\\n\",\n    \"\\n\",\n    \"### Global Measures\\n\",\n    \"\\n\",\n    \"The **cross-edge density** $\\\\rho_{ij}$ measures the density of connections between distinct subnetworks $G_i$ and $G_j$,\\n\",\n    \"$$ \\\\rho_{ij}=\\\\frac{|E_{ij}|}{N_i N_j}= \\\\rho_{ji}\\\\,.$$\\n\",\n    \"\\n\",\n    \"The **cross-average path length** $\\\\mathcal{L}_{ij}$ measures the average length of existing shortest paths between two subnetworks $G_i$ and $G_j$,\\n\",\n    \"$$ \\\\mathcal{L}_{ij}= \\\\frac{1}{N_i N_j - M_{ij}}\\\\sum_{v\\\\in V_i,\\\\,q\\\\in V_j,\\\\,d_{vq}<\\\\infty}d_{vq}= \\\\mathcal{L}_{ji}\\\\,, $$\\n\",\n    \"where $M_{ij}$ is the number of pairs $(v,q)\\\\in V_i\\\\times V_j$ which are not mutually reachable.\\n\",\n    \"\\n\",\n    \"The **global cross-clustering coefficient** $\\\\mathcal{C}_{ij}$ is an estimate of the probability of vertices from subnetwork $G_i$ to have mutually connected neighbours within subnetwork $G_j$,\\n\",\n    \"$$ \\\\mathcal{C}_{ij} = \\\\langle \\\\mathcal{C}^{ij}_v \\\\rangle_{v\\\\in V_i} = \\\\frac{1}{N_i}\\\\sum_{v\\\\in V_i,\\\\, k_v^{ij}>1}\\\\frac{\\\\sum_{p\\\\ne q \\\\in V_j}A_{vp}A_{pq}A_{qv}}{\\\\sum_{p \\\\ne  q \\\\in V_j}A_{vp}A_{vq}}\\\\,.$$\\n\",\n    \"\\n\",\n    \"The **cross-transitivity** $\\\\mathcal{T}_{ij}$ is the conditional probability that two vertices in subnetwork $G_j$ are connected if they have a common neighbour in subnetwork $G_i$,\\n\",\n    \"$$ \\\\mathcal{T}_{ij}= \\\\frac{\\\\sum_{v\\\\in V_i,\\\\,p\\\\ne q \\\\in V_j}A_{vp}A_{pq}A_{qv}}{\\\\sum_{v\\\\in V_i,\\\\,p\\\\ne q \\\\in V_j}A_{vp}A_{vq}}\\\\,.$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"75c19d62\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Application: Vertical Dynamical Structure of the Earth’s Atmosphere\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"9a58a8a0-4c84-4377-bb78-2a54eeb5e47a\",\n   \"metadata\": {},\n   \"source\": [\n    \"In the following, coupled climate network analysis is illustrated by the example of the dynamical structure of the Earth's atmosphere. \\n\",\n    \"In order to treat a climate network as a network of networks, an *ab initio* physical separation of the climatological fields is necessary, i.e., a separation of processes into those responsible for internal coupling within a single field and those mediating interactions between fields.\\n\",\n    \"\\n\",\n    \"For the Earth system, there are distinct physical processes behind *quasi-horizontal* and *vertical* atmospheric dynamics: We have a stable isobaric quasi-horizontal stratification, while local heating of the Earth’s surface and atmosphere induces minor disturbances of the system. Therefore, we can treat the considered climatological field variables at different isobaric quasi-horizontal surfaces as separated subnetworks of an interconnected network.\\n\",\n    \"The small vertical disturbances of the system due to convection processes lead to vertical movement, resulting in pressure gradients that are balanced by quasi-horizontal geostrophic winds along isobares.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"61de5550\",\n   \"metadata\": {},\n   \"source\": [\n    \"We consider the discretised and vertically resolved geopotential height field $Z^i_v(t)$, sampled at predefined points $v$ on isobaric surfaces $i$, as the climatological field variable to construct coupled climate networks. It reflects global weather and climate dynamics to a good approximation, as it captures the dynamics both of the geostrophic wind field and of convection processes.\\n\",\n    \"We specifically focus on the interaction structure between near ground and upper level atmospheric dynamics, which is particularly interesting because a large portion of the solar forcing that drives atmospheric dynamics takes place on the Earth’s surface.\"\n   ]\n  },\n  {\n   \"attachments\": {\n    \"Illustration-of-a-coupled-climate-subnetwork-as-it-is-constructed-in-this-work-where-V1_W640.jpg\": {\n     \"image/jpeg\": \"/9j/4AAQSkZJRgABAQIAOAA4AAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCADZAe8DASIAAhEBAxEB/8QAHQABAQACAwEBAQAAAAAAAAAAAAcFBgQICQEDAv/EAFUQAAECBQEDBQwHBQQHBQkAAAECAwAEBQYRBwgSIRMxQWHSFBUXIlFWV3GBkZTRFhgjMlKVljhCYnahJHKCtDM1NkOSsrNTc3WisQklJidUY3TBw//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oADAMBAAIRAxEAPwDuXCEIBCEIBCEIBCEIBCEIBCEfnNPsSss5MzLzbDDSStxxxQSlCRxJJPAAeWA/SMdcddo1uUd+r1+pylMkGBlyYmXQhA6snnJ6AOJ6IjV1a/rrFUetrRigqvSsNnceqKiW6ZKcR4yneHKepJAPQTzRi6NozNXDV2rm1kuFy8qug77NP4opkn/ChrgF+tQGekE8YD9KlrPemor7tL0RoG5Twotu3VWWi3KoPDJYbIy4oZ/eB6044x/FH2fbUmXHanqDOVC+q/M4MxPVGYWlI5/FbQlXiJ6snHRgcIr0uyzLsIYl2kMstpCUNoSEpSBzAAcwj+4sEv8Aq+6O+ZEn8Q924fV90d8yJP4h7txUIw8zdVsSzymZi46Oy4n7yHJ5tKhz84Kuo+6A0f6vujvmRJ/EPduH1fdHfMiT+Ie7cUinz8jUJcTFPnJebZPAOMOhafeDiORAS/6vujvmRJ/EPduH1fdHfMiT+Ie7cVCEBL/q+6O+ZEn8Q924fV90d8yJP4h7txUIQEv+r7o75kSfxD3bh9X3R3zIk/iHu3FQhAS/6vujvmRJ/EPduH1fdHfMiT+Ie7cVCPzmX2JZhb8y82yygZW44oJSkdZPAQEz+r7o75kSfxD3bh9X3R3zIk/iHu3G6pu+01KCE3PRConAAn2sk8f4uo+6M02tDiErQpK0KAKVJOQR5RATD6vujvmRJ/EPduH1fdHfMiT+Ie7cVCEBL/q+6O+ZEn8Q924fV90d8yJP4h7txUIQEv8Aq+6O+ZEn8Q924fV90d8yJP4h7txUIQEv+r7o75kSfxD3bh9X3R3zIk/iHu3FQhAS/wCr7o75kSfxD3bh9X3R3zIk/iHu3FNfeaYZU8+6hptAypa1BKQOsmMQLutQr3Bc9EKs4x3e1nOcY+91GA0n6vujvmRJ/EPduH1fdHfMiT+Ie7cU5lxt5pLrLiHG1DKVJOQR1GP6gJf9X3R3zIk/iHu3D6vujvmRJ/EPduKhCAl/1fdHfMiT+Ie7cPq+6O+ZEn8Q924yeud+zmnloStZp9JaqszM1FmRbl3H+SGXN7B3sHpSPfGA+luuvoko/wCo2+zAcz6vujvmRJ/EPduH1fdHfMiT+Ie7cUiluTb1MlXZ+XTLTa2UKfZSvfDbhSN5IV0gHIz0xyICX/V90d8yJP4h7tw+r7o75kSfxD3bioRxKnVKbS2g9U6hKSLZ4Bcw8lsH2qIgJ19X3R3zIk/iHu3D6vujvmRJ/EPduN7krltydmUy0lX6VMvqOEttTja1E83AA5jKwEv+r7o75kSfxD3bh9X3R3zIk/iHu3FQhAS/6vujvmRJ/EPduH1fdHfMiT+Ie7cVCEBL/q+6O+ZEn8Q924fV90d8yJP4h7txUIQEv+r7o75kSfxD3bj+H9AtGGGHH37MkGmm0la1rmXkpSkDJJJXwAEfpfmtFAolX+jNsyc1eV1LJSilUn7QoI5+VcAIbA6ecjpA54x9N0dvrUl1upa1V/uOlFQcbtOjOlDIHQH3gcrV5QCepQ5oCXVyiaRVqsvWxpBpQxe1bb8V2bbmH006UJON5x7fAUP7pAPQrPCN50n2QrXpryqxqItitT7wJ72yW+zIy2QfFByFuY6CSnrB547GWxb9EtijM0e3qVKUuns/cYlmghIPSTjnJxxJ4npjJxAgRkEQhARPZprVakrlv7TO56xUKpUbdq3LSUzUJlbz7sg+N5rKlkqOAATxON8CPts1qt3ftXXCiUqtQbtezqW3JOSrT60S8zPvZUVLRndWUpK08RwKEkeU4XXmpMaV652tq2+haaPUpF+hVvk0nJISXWFHykqTjPkRGx7KFJepOkK7tr622andU2/cNRecO6Eh47yCSeZIbCVeQbx9cBYoR8SQpIUkggjII5jH2AQhCAQidarazWVp4tMhUZt2pV54YlqNTkcvNuqP3fEH3AfKrGejMTKbpGr2ryiq859Wn9ouHIodNd3p6ZRngH3v3QR0D1FHTAblqPr5bdBq6rXtGSmb2u05Smm0o76GlDh9s6MpQAecDJHSBGmK01vnUyZRUtabh3KcFBbNrUZwtSjfkDzgOXFeonHQrHCKVYdk2vY1IFLtajy1OYOOUUhOXHiP3lrPjLPrJx0RsMWDg0CjUqgUpmlUSnStOkWRhtiXaCEJ68DpPSecxzoQihCEIDzZ11vnUmt3rU6fek9UJJctMrSmlhSmmGBkhO6gHChjmXxKhxycxNY9U7us21btlu57lt+nVVITupVMMJUtAznxV/eT7CI0R/Zw0YeVvLspsH+CoTSR/RwRIPPGmVGoUyaRN02emZKYQoKS7LuqbWkjmIIIMd/dj66L6urTR2evQPPobmOSp08+jdcmmgkBRP4glQxv9Jzkkgxgr32bKRTp6XubS2Wp0hVZIFXeuqtd2SU2Pwnld4oUebOfVu/ejctM9Y6fWqx9D7vpjloXizhKqZNnDb/kUwvmWD0Dn8m8OMMFUhCEUIQhAIQj85p9iVl3JmZebYZaSVOOOKCUoA5ySeAEBp2uVZui39K63V7Nk+661LspLCQ1yhQkqAW4EfvFKSpWObhxBAwfNm5Lir9xT652v1ifqcyo8XJp9ThHUMngOoR30rmtztcqbtvaP2+7eVUR4r08SWqdKfxKcON/1AjPQTzRibf2cpCt1t+6tWp5i4a1N+M5KyDXcco2Tk87e6tw8fvHGenPPEHQyNksS8LxtasMP2lWalJzRWkJZl1qUl45GEKb4hYJx4pBzHfNOzfoulzlBZaM+Q1GaI93K4jb7N04sWz1Jctu1aXT30kkTCGQp8ZGCOVVleMdGccT5YQZOy5urT9oUier8kmRq0xJNOTsunIDTxQCtODxGDngebm4xl4R/LzrbLSnXnENtpGVKWrAA6yYo/qEaNcer+mNv7wql70VC0febYmA+4PWhveV/SNRVtE29UlFuzLRvK7Vk4SuQpagyfWpWCB/hiCzwiL/AEw19r3+otMKLbrKuCX65VOVPrLbW6oeoj3w+gWt9d/2j1dlqOyfvS1BpaR7nV7qx/WAszzrbLSnXnENtpGVKWrAA6yYkuuOs9t2tYVYcty7KBM3Khndk5ZEyh9QWVAElKSeKUkqAVwyBz8x4zOzjZc26l+7azdd3PA5UarVnFJz1BG6R7zG7W5pdp3b26aPZlDl3E/ddMolx0f41Aq/rAea1z3Rcdzz6564a3P1OYXzqmX1Lx1AE4A6hgCMPHp7d2lWnV1vcvXrQpU0+VFSn0tck6o/xLb3VK9pjTa3sx6Pz9PmGJW3XqZMOpIRNS8++VNHoIStakH1FJhB0Ss67LptaqMzlsVqoU+aSobol3DhfHO6UcygT+6QQY9L9MZ+4Kpp9RKhdUj3BW5iTQucYKd0pWekp/dJGCU/ukkdEQCzqWNnurBF42bTarQFPf2a8afIhUzK54APp4qQOjKT0/vE4HZWhVemV2ky9Vo0/Lz8jMJ32n2FhSFD1j/05xDBzYQhFES2zBMHTOjCULaZj6SSXJFwEpC/tMZxxxnGYyPe/aK84dO/gpn5xn9c7CnNQ7QlaNT6s1SpmWqLM83MOMcqMt72Bu5HSoe6MB9EtdfS3R/0432ogq0iJkSLAnVNKmg2kPKaBCCvHjFOeOM5xH7RK67c1Xt59yk1a455+oSdPoq5l6VkJdLa3JioKl1LSFcRv7u6pJ4JTgp8aKpAdettm8b+tS16Um0lzUhTZxbiahUpUHlWlDd5NvfH+jCvGO8Dk4xkcc9Gpybmp2YVMTky9MvLOVOOrK1E9ZPGPWeZZZmZdyXmGm3mXUFDjbiQpK0kYIIPAgjoidVvQjSSrza5qcsempdc+93MpyWT/wALSkge6A81+aLNswX5qPTtSKLQLdnahUqdNzaG5umuLU4wGSoco5g55MpSCrfGObjkZB7Zy+zloywcospo/wB+fml/8zhigWva9uWvJmUtyh06ksqCQtMpLpb393OCogZUeJ4nJ4mEGXhCEUIRreoF92pYlJNSumsS8g0QeSbUd514joQgeMo+ocM8cROZSf1h1fUE2xIvac2g4eNXqDealNIzzstf7vI6T6ws80QbhqbqvZ9hbsrU51c5WHcCWpMinlpt5R+6NwfdB6CrAPRmNUlbP1g1bPK3dOuacWi4eFJkV71SmkZ5nnOZsEdHsKOmKXpRo5ZGnSTNUinqnK04CZisT6uWnHlEYUd8/dB6QnAPTmKFEGr6cafWhp7RhS7SoktTmlAcq4kbzz5HS44fGUefnOBnhiNohCAQhCAQhCAwl72lbt60JVDuils1OnKcS6WHFKA3k8xykgg+2MVqupuh6KXYqQlZXk6fbk4WJd5lLrOG5Ze6hSFApUjgAUkEEcDG4Rx6nIydTps1TahLNTUnNsrYmGHU7yHW1ApUlQ6QQSCOuA/iiLLlGknCEgql2yQlIAGUjmA5hHLjEXNcFvWhQVVSv1SSpFMl0hPKzDgQgeRI8p4cEjJPREOn9XNQtTVrkNG6CaTRSd1y6620UII6e52SCVHyEg9YTzwFc1L1Hs7Tuk98LsrUvIhYJYl87z8wR0NtjxlevmGeJER2ZufWHV4lFty7+mlnOH/WM0nNVnEZ520f7kEY45B6QpXNGa0/0Zt23qsbkrszNXbdbp3navVlcqtKv/tIOQ2B0c5A4ZxwimRYNH0y0qs7T9tTtGkC/U3R/aKpOK5abfJ5yVnmz0hOAfJG8QjUtXL+pGm9kzNz1ht99ttaWmGGU+M86rO6jPMkcCSTzAHnOAQ22EdFrq2uNRKi8oUORpFElw4SjDJfd3ehKlLO6eHSEiNfTtP6xA5Nwyiuo01jswo9CYR00sDbBrrE6xL3tQJKckjhDkzTwpp9PEZWUKUUr4Z8UbnrEdg29eNInG0uJvqlgKAI3t9J4+UFOR6jAUiETnw66SefdK96vlDw66SefdK96vlAUaETnw66SefdK96vlDw66SefdK96vlAUaNV1K09tXUGjd7bmpyX9zjLzLZ3JiXV+JtY4j1cQekGMH4ddJPPule9Xyh4ddJPPule9XygNHRXtR9E1CXu8TV72IggN1phGZ2nI5gH0/vpH4s/4uZMWi0rkod10RmtW7U5eoyDw8V1lWcHpSoc6VDpBwRE9ufaF0npdBm55q5ZaruNo8WSlElTr5PDdAUAPWScYzHTSc1gqtMv+cunTqntWSibJ5aRlHC8w7x51trG5n+6lIHQBxJD0jj4ohKSpRAAGST0R57jaf1jCsm4ZQjyGmsdmOHWddbovKdlZTUGcn563UDEzTqS8mR7p/vqCTvDyp5vJu88KO3N3640pusLtjT2lTF83LkpMvIHEsweIy6/90AEdHDoJEYqU0juy/Jpuqa0XIqclQrlGrapa1MyTXHIDiwd5wj3/AMRESu1NeVUykoo+n9q2JZVNA8RdUqpeKv4lhoBZV/eyfXGW+nFUrv8AtHtMUCjsn70tQaaR7nVhKx/WA7P0imUa3KM3IUuTk6XTpZOEttIS22geXye0xq1x6v6Y2/vCqXvRULR95tiYD7g9aG95X9IhjNG2cJt1L926qVW7ngcqNVrDyk56ggJI95jdrcuTZgt7dNHfs6XcT910yvKOj/GpJV/WA56tom3qkot2ZaN5XasnCVyFLUGT61KwQP8ADHz6Ya+17/UWmFFt1lXBL9cqnKn1ltrdUPUR742FOuekSUhKb5pIAGAAVcP6R98Ouknn3Sver5QGu/QLW+u/7R6uy1HZP3pag0tI9zq91Y/rH9s7ONlzbqX7trN13c8DlRqtWcUnPUEbpHvMZ/w66SefdK96vlGlasbUNkW1SmxabzN0VR8K3ENKUhhjA4KcURk8eZKeJwclPDIUy3NLtO7e3TR7Mocu4n7rplEuOj/GoFX9Y25ICUhKQAAMADojoPW9q7Vaemi7JP0ilNYwGpeSCx6yXCo59w6o4kptSavsPIcdrFPmUpIJbdpzQSvqO6AfcRCj0EhHV7SHa1p1YqKaXqDTpWiFzPJ1GVKzLg4GErQd5Sc8fGBI4jIAyYrfh10k8+6V71fKAo0InPh10k8+6V71fKHh10k8+6V71fKAo0InPh10k8+6V71fKHh10k8+6V71fKAocwyzMMOMTDSHmXElK21pCkqB5wQecRFa5pRcNj1WYujRSfbkFOK5SdtqaUTIznHjyeT9kvoHEDoBSOB2fw66SefdK96vlDw66SefdK96vlAfNL9XaJd885b9SlX7bu2Wymaos/4roI5y2TgOJ6eHHHHGOJo8dJdqfWuyrtmhSbct9iozcir+z3EpxTTjSuf7HdwogHHFRwSPu8xjSKdtKawyUg1JouhLyWkhKXH5JlxwgfiUU5Ues5J6YUeiMI6D0Pav1VkJnlJ5yj1ZojBamJIIA6wWik59eR1R2j2e9aaXqxTptCKe5S6vIJQqalivlEFKsgLQrhkZHEEAjI5+eAz94afM3FXJ2qLqbkuqbl6awUBkKCe451U0DnPHeKt3q5+PNG7QhFCEIQCEfnNTEvKSzkzNPtMMNJK3HXFhKUJHOSTwAiP1bWOpXPVH7d0Xtt27qi2dx6quZbpkofKpw43z/CCM9BVzRBU7jrtHt2kPVau1KVpsiyPHfmHAhI8g485PQBxPREmRqHqBqhMLp+jdA7jpG8UO3XWWi3LgdPINEZcPWQetI54z9o6AN1Crs3RrDXF3vXEEqak1gppkmSfuts4AWP7wAPSnPGLfLMMy0u3LyzLbLLaQhtttISlCRzAAcAIUSfTTQW2baqwua5puavS7VYUurVb7TkyOYMtnKUAdB4kdBA4RXIQiBCEIBCEIBCEIBCBIAJJwBEZv/X+iSFXXa2n1MmL8uo+L3LTlZlpc5xl5/wC6kDpxnyEp54Cvz85KU+SenZ+aYlJVlJW6884EIbSOcqUeAHWYhdxa+T9zVF+3NEbdXdM82rk361MgtUuUOOcrOC4R5BjPON7mOJa0su7UKeaq+ttyGfl0KDkvbNLWpmQYPOOUI4uqGefOf4iOEV6j0ynUems02kyMtIyTCd1piXbCEIHUBwiwSy39FU1StN3TqzXX74r6TvNMv+LT5TjndaY5iPWMH8OYrjTbbLSGmkJbbQkJQhIwEgcwA6BH9QgEIQihGCv20aDe9sTNu3HJJmpGYwefC21j7q0K50qHl9YOQSDnYQHUW6tjV3llOWvebZbU4d1ioypBQjo+0QTvH/AI15OxzfOfGua3APKC8f8A+cd24RIOsWn+yBb1NnWJ277gfrfJ4UqSlme52VKyOClZKlJ5+bcMdg27RtRttLbds0VCEgJSlMg0AAOYAbsZqEBh/opa/m3RvgW+zD6KWv5t0b4FvsxmIRRh/opa/m3RvgW+zD6KWv5t0b4FvsxmIQGH+ilr+bdG+Bb7MPopa/m3RvgW+zGYhAarcunVk3DQ5qj1K2aYZWZRurLUulpaekFK0gFJB45Bjrlduxrl5btqXkEtqc8SXqUtxQj/AL1B4kf3BHbeEQdJBsc31vcbmtsDyhT2f+nG8WFse0WSmpecvG5XqqEeM5JSbPINqOeYuElSk+oJPHnEdo4QgwctZ1pS8u3LsWxRkNNICEJEi3wSBgDmj9Popa/m3RvgW+zGYhFGH+ilr+bdG+Bb7MPopa/m3RvgW+zGYhAYf6KWv5t0b4Fvsw+ilr+bdG+Bb7MZiEBh/opa/m3RvgW+zGlasaHWJqBSW5eYprVInWAruaep7KGloyOZQAwtOcHB4+QjJzTYRB0zrexrcLc2RRbypczL4yFTcu4ysHyYTvj259kcWT2OLyU+gTd10BpoqG+ppLzigOkgFKcnqyI7rQhBDNIdmWzLHqaavVZhdz1FvPImbl0ol2sjG8Gsqyrn4qJxngARmK39FLX826N8C32YzEIDD/RS1/NujfAt9mH0Utfzbo3wLfZjMQijD/RS1/NujfAt9mH0Utfzbo3wLfZjMQgMP9FLX826N8C32YfRS1/NujfAt9mMxCAg2rWy/Zt51VysUacdtioPHL4l2Euy7h/FyWU7qubO6oA+TJzEfmNji9kuKDF0284jPilfLJJHqCDj3x3ZhEg6a0LY1rrkye/l502WYAyDJyq3lKOebxtwDh08fVHY/RzSm1tLqQ9J2+2+7MzW6ZudmV7zrxTnA4ABKRk4AHTxyeMb3CAQhGgal6uWnZEwilvOzFXuB/CZai0xvl5p1R+6N0fdz18fIDFG/wASq89a6NJ1k2tY9Nmr4utRKUyFL8Zpkg4Jee4pQkdOM46d3njHytg6satfbah1JyxLUc5qBS3gqcmUHofe5kgjnTjqKQeMWuwbHtSxKMmk2nQ5SlyoA3+STlx0jpWs5Us9aiYlEdpWid23/MtVfW+4lOym8HGrVpDqmpJvByA6sHLhHUcjoURF1oFGpNApTNKodNlKbIMJ3WpeWaDaE+wdPX0xz4RAhCEAhCEAhCEAhCEAhCEB1P1et3aXv+uvSU7QWJW0A6od6aZXWZYzTWeAdeOVKB6RgDjzA8Yzll0zVyzaQmk2xoTblMlBxUlq42t5Z8q1Ebyz1qJMdlIQEH7+bQHohov6la+UO/m0B6IaL+pWvlF4hAQfv5tAeiGi/qVr5Q7+bQHohov6la+UXiEBB+/m0B6IaL+pWvlDv5tAeiGi/qVr5ReIQEH7+bQHohov6la+UO/m0B6IaL+pWvlF4hAQfv5tAeiGi/qVr5Q7+bQHohov6la+UXiEBB+/m0B6IaL+pWvlDv5tAeiGi/qVr5ReIQEH7+bQHohov6la+UO/m0B6IaL+pWvlF4hAQfv5tAeiGi/qVr5Q7+bQHohov6la+UXiEBB+/m0B6IaL+pWvlDv5tAeiGi/qVr5ReIQEH7+bQHohov6la+Ua7Z+qGsF1z9ckqHpXSZlyhTyqfPKNfQlCH0/eQlRThWMcSOEdgr3r0va9m1m5JvHI0yRem1g/vbiCrHrOMe2J1sf0GYo2hNInZ4lVQrzjtam1kYLi5hW8lXtbDcBodO1O1hqF9VSypXSqkqrVKl2pmbZNwICUNuAFJCinB5xwEfzaeqWr9z1qvUWlaV0pVRoE0Jaoy7tfQ2ppZzukbyfGSrdOFDIOI2iwv2ztR/8AwKn/APKiOPqGfBvtPWze6ByVEvRoUGrqBwlM2nBlnFZ4ZOEpznglCj6w/vv5tAeiGi/qVr5Q7+bQHohov6la+UXiEBB+/m0B6IaL+pWvlDv5tAeiGi/qVr5ReIQEH7+bQHohov6la+UO/m0B6IaL+pWvlF4hAQfv5tAeiGi/qVr5Q7+bQHohov6la+UXiEBB+/m0B6IaL+pWvlDv5tAeiGi/qVr5ReIQEH7+bQHohov6la+UO/m0B6IaL+pWvlF4hAQfv5tAeiGi/qVr5Q7+bQHohov6la+UXiEBB+/m0B6IaL+pWvlGCf1I1lZvuXspzSmkitTMgqoNs/SBG6WEr3Cre3cA73RnMdlYjNY/bPoX8lTH+aEBje/m0B6IaL+pWvlDv5tAeiGi/qVr5ReIQHXmvXjrjQ6HPVqqaUUSXkJCXcmZl03I2dxtCSpRwE5PAHhH4WlfWt90W1IXDSNJKUun1BkPyy3bgQ2pSDzK3VJyMjj6jGybZFUmm9I0WpTFf+9LtqkrRZUDiftF5UcdI3U7p/viK5QaZK0WhyFHkUbkrISzcswnyIQkJSPcBARTv5tAeiGi/qVr5Q7+bQHohov6la+UXiEB16nLf1/v2ZTSqkaZprRN3+1TMhNicnX+P3W1JwG+HTwI6+aKTpTpJZGm8ss29TC5UXsmZqk4rlpuYJJJKnCOGc8yQB1ZjfIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQES2yJ2YmNN6ZY1PcUmfvGtSlJb3BlSWy4FrV6hupB6lesiy0ySl6dTZanSbfJy0qyhllH4UJACR7gIiVwkXhtkUCkcXJGyKG7UngfuiamCEISesIKFj1H23WAiFkMlvbK1BWSCHbfp6x1fdT/wDqNx2hLJVf+klbt+WGKlyXdVNWDhSJpo77eD0ZI3c+RRjVLQ/bFvn+W5D/AJotMBoegF7jUHSWh3I6cTy2eQqCOYomWzuOZHRkjeA8ihG+RBNNf/l1tNXVYKxyVFu9r6Q0ZI+4iYGRMtpHQThSsdCUJi9wCEIQCEIQCEIQCEIQCEIQCEIQCIzWP2z6F/JUx/mhFmiM1j9s+hfyVMf5oQFmhCEBCr2zd+13Z1uAKckbQpL9cmgB4vLukNtA9Y8RQ9Z64usQrZfBua89TdT3BvorNdNOp7iuJMpKJ3EKT5ArIz1o9sXWAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQhCAQJABJOAIRPNpG6fododdVbQ6GpgSKpeWOePLPHkkEeUgrB9hgNN2Ts3HP6g6oOjP0mr62pJZOSZOWHJs8faRw/D6sXWNN0OtY2ZpFbFtLRuPSdPb7oTjGHl+O7/AOdSo3KAh1prWNte82grxFWrKKI8pDiMf+pi4xDLU/bbvH+U5X/qNxc4CK7XFGnmrQpOpFCZ5StWPUEVRsAcXJbIEw2fIkpCVHqQYrVtViRuG3qfXaY6HZKoSzcywsdKFpCh7eMcmoyctUKfM0+dZS/KzLSmXm1cy0KBCknqIJERPZQm5q3fpVo7V5hbs7Z9QV3Cpw+M7T3yXGVdeMnPk3kjyQFzhCEAhCEAhCEAhCEAhCEAhCEAiM1j9s+hfyVMf5oRZojNY/bPoX8lTH+aEBZo0fXy6foZo1dNxJXuPS1PWiXVnGHnPs2j/wAa0xvEQrapH0mr+nOlzfji4K8mbnkAZzJyqd90HyA72f8AB64DeNne1jZ2idq0FxrkphqQQ9Mp3cEPO/aOA9YUsj2RvbziGWVvOqCW0JKlKPMAOcx/UcKv/wCoah/+K5/ymAn31gdGvSDR/wDiX2Y2yxr5tK+JWZmrTrspV2ZVYbfWwThCiMgHIHRHVrZp1Q0dt3RKgUe6qZy9Yl+6e6F/R9cznemXVJ+0DZCvFUnp4c3RHZXSO5bLuu35mq2PJplpFE0Zd4d7jKFTqUJV90pSTwWnj8oDcoQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIhW0vm59QdMNMmlFTdSrRqtRQn/AOmlElRCupWVe1Ii6xCdPt28NrW+boP2slalOYoEmongHlkuPFI6ClQWk9SvcF2hCEBDLU/bbvH+U5X/AKjcXOIZan7bd4/ynK/9RuLnAIgmuw8HutVlaus/Y02bX9HbiUOCeQdJUy4rqSoEk/wIHki9xqurtnS1+6a120pncHfCVUhlauZt4eM0v2LCT7IDaoRL9l28Jq7tIaeatvprlGWukVZDhG+mYYwklXWU7qj1kxUIBCEIBCEIBCEIBCEIBCEIBEZrH7Z9C/kqY/zQizRGax+2fQv5KmP80ICzRCrT/wDjDbDumtkqckbLozFJlzjCRMvkuLUPKQOUQfZ1ZtdYqEtSqROVSdXycrJsLmHl/hQhJUo+4GI9sayEw5pbOXnUG92o3fWJusP55wFOFKB6sJKh/egLXHDriVLok+hCSpSpZwAAZJO6Y5kIDqts3arS+n+i1BtGvWHqCqoyHdPLGWt9xbf2ky64nBJGfFWOjnzFus3VS3rhodVrU1JVm2KfSyjul+4ZTuFGF5wQVnBGRj1kDpje4QGs0C9aZXreoFeo8rPTchXH+Sl3EtpHJJ3XFco4CoYR9njhk5UnhzkbNESti3K6xYOkUm9SZxuYpdwl+ebU0QqXb7mnk76x+6MuIGT+IeWLbAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAIQhAY+5KtK0G3alXJ5W7K06UdmnjnGENoKlf0BiU7G9JmJbRtFx1FI753TUJmtzauckurwnjznKUpP+Ix82yKtMy2jirbpqh3zuupS1ElE9JLq8q4eQpSpP+IdUVm3aVK0O36dRJFO7K0+ValWBjGENoCU/wBAIDnQhCAilAYQztqXK4kqJfs2WcVnoPdATw9iRFriM0b9s+vfyVL/AOaMWaAQhCAglN3dNdrObp5IZoOo8oZpjI3UIqbGeUSOjK0kqPlU4keSL3Ej2sLXna3pY5X6Gki4LUmW63THEg7wUyd5aRjicoCjgc5SmN+06uiRvSxaNdVOI7nqcoh8Jznk1EeOg9aVBST1gwGehCEAhCEAhCEAhCEAhCEAiM1j9s+hfyVMf5oRZojNY/bPoX8lTH+aEB+u2HXJil6H1ClU/JqVxzLNEk0A431vqwpPtbS4PbFNtCiS1t2pSbek8dz0ySZlGyBjKW0BIPtxmI9qkfpbtTad2aghyUt6WfuWfSOOFA8mwT5CHAD6l9Yi6wCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEIQCEYm7LloFqUV2s3JV5OlSDX3n5lwIBPQkdKlHHBIyT0CIZP6tah6nOLkNHKH3noZJQ5ddaa3QocOMuyeKjz4JCh5QmArmpepFm6d0rvhdlbl5LeGWZcHfmHz5G2x4yuPDOMDpIiVyOpOuV6urqdj2VbVu0DA7mcuxUx3TND8YQycoGOggjyKMc7T7Rq3bbqxuStTM1dl1uK33axVTyjgV5W0EkNjyYyRzZxFLiwTLvrtPfg0e91R+cO+u09+DR73VH5xTYQg6vXdUNcbu17tq355OnTtZtWVXXGkMCcEgkrIbTyxUSsuAhKkhOB42STxxVO+u09+DR73VH5xgtnQfSO99R9RnBvt1Ksd7ZBZ6ZaVTugp6lZTnrTFqhBMu+u09+DR73VH5w767T34NHvdUfnFNhCDrBJT+uI2qZ59tOnP0sNpBLgUJ3uDuTulHNx5Tld/H8OM9MVLvrtPfg0e91R+cYSn/trVH+Rh/m24tEBMu+u09+DR73VH5w767T34NHvdUfnFNhCCYrqe04tCkLa0dUlQwQU1Egj3xKtFqlrhY1yVnR+heDxD0gTVWW6l3YposvEEpllIIJbSo8QoZBUeJjtHET2j23LTuW0dX5NteKHOCRrG4Mlcg+d0kjp3VE4619XBBn++u09+DR73VH5w767T34NHvdUfnFLZdbeZQ8ytLjbiQpCknIUDxBEf1CCZd9dp78Gj3uqPzh312nvwaPe6o/OKbCEEy767T34NHvdUfnDvrtPfg0e91R+cU2NVuLUew7eqrlKrt20emzzYSpcvMTSULSFDIJBPSDmEGud9dp78Gj3uqPzh312nvwaPe6o/ONjt3Uew7iqrdKoV20epTzgUpEvLzSVrUAMkgA9ABMbVCCZd9dp78Gj3uqPzh312nvwaPe6o/OKbCEEy767T34NHvdUfnE2qNQ12O0pSnnk6bfSYWy8lgJE73F3Ly43t7jv8pvc2PFx1x2Wjr7rZcabS1yeuMrCFyNgTjjJPS6ZjDY9qyke2EGB0hqGuNx6h3rqNQ06duzz82KI+5P92iXxLAA9yhB3uTV4qiVnJPQOIip99dp78Gj3uqPzjk7NtuKtjRO25B5JE0/KidmSr7xcfJdO91gKCfZFEhBMu+u09+DR73VH5w767T34NHvdUfnFNhCCZd9dp78Gj3uqPzh312nvwaPe6o/OKbCEEy767T34NHvdUfnDvrtPfg0e91R+cU2EIJl312nvwaPe6o/OHfXae/Bo97qj84psIQTLvrtPfg0e91R+cO+u09+DR73VH5xTYQgmXfXae/Bo97qj84d9dp78Gj3uqPzimwhBMu+u09+DR73VH5w767T34NHvdUfnFNhCCZd9dp78Gj3uqPzh312nvwaPe6o/OKbCEEy767T34NHvdUfnDvrtPfg0e91R+cUicmZaTlXZucmGpeXaSVuOurCEISOckngBEgqesVTumrPW5otbi7sn21cm/Vnst0yUPlU4cb+PICM9BVzQH7XJee0JblJdqteqOidNkWvvPzK6ghOegDJ4k44AcT0RrWmGr20hqJOvG2rWsN+kNKUkVl+VnZeTdIH7hW4HFeTgjh04jebQ2f2p+rs3RrBXF3xXUeM1KuAppsocnxW2eAWOP7wAPSnPGLfLssy8u3Ly7SGWWkhDbaEhKUJAwAAOAAHREH9wOcHHPCEBoujOosvqJR6tMd7F0moUiqPUyfkXHuUU063jJzgZBz5Ogjoj69qKydbWNMZOluTT4pJqk7OpeARKI3ilKCnHFRO70jgoGJ9TNzT7a/qUmtXIUfUGlCcaKjhAn5UHfAJ5st7yz1rEftsrNruerX1q7MpKvpPV1S9NUocRIy2W28eTJBB60QF0hCEAhCEAhAkAEk4AiL37tAUaUqzlrac0x6/bp4p7np6h3LLnj4zz/3QAecA9RKYCw1Gdk6dIvT9Rm5eTlGElbz77gbbbSOcqUSAB1mIVcGvVSuipP27ojbxuacbVyb9bnApqmSp8u8cFw9QxnnG9GLY0quvUCfarWt1x98m0L5SXtumKUzT5fmI3yPGcI6/+IiK9SKbT6RTmadSpGWkZJhO61Ly7QbbQPIEjgIsErt3RVuo1tu6tV649fNwDxkNzA3ZCV6d1pj7pA6xg8+6DFdbQhtCUISlCEgBKUjAAHQI+wgEIRhrwuq3bQpCqtc1YlKXJpOAt9eCs/hSkeMtXUkExR121S2uKfSKtNUmyqCmqql3C2qfnHShlRSSDuIT4yk8OCiU+qJbWdrLVCfadaZYoEghxJT/AGeUXvAEEZBU4ePHn6hH6Tui8xqnec3WNLaBP0S15hSnUztdXyTDiiSTyCUpKyg9H3sdJTzR8qGyTqlLv7ku/b84g/vtTi0gesLQDEH4aN7S1a09tinWsLXpM9SZIr4tuONTDm+tS1KKyVJzlR/d5sCO4OjWp1v6oWyqsUMPMOMLDU5KPgcow4RnHDgUnjhQ58dBBA6QXVoXcVjVmQF/vmm29MrSl6tU6XVOsy5PQtPiqB9nHo3o7Daa6O3XaNE75aQas02Zp1SCXlpmqU26zMEDAVyqSpQxxGBzcenMMHZCERf6Wa/2/wD6903oNzsN8Fv0KpFlRHlCHcqJ6gB7I+t7RNs05aWb0ti7rQdyAtVRpay0PUpGSof4YD5T/wBtao/yMP8ANtxaI662bfFo1/a7m61Sbhp8xT37OEs0+XQ2lb3dTZ5Mb2DvY44547FAgjIORDAhCEUYS+rpo1mWpPXLXphTFPkkBThSneUokgJSkdKlKIA9fEgZMdPtWNqqauui1O3KVZ0g1SJ+XclnFVB1TrqgrICwEFIQocCBlWCAcx3Bvq1qNedqT1tV6XU/T51AS4Eq3VJIIKVpPQpKgCPVxyMiOqV17G9bbnFKtW7adMyyslKKk2tlaOPAFTYWFcOnCfVEGhWftOal21Q6fRpY0edlJCXRLsiblVKUUIGE7ykrSTwwPZFJsjbHmDOJZvO1GO51qGZmlOKCmx/3bhO90fvj2xo7eyXqqqa5FS6AhGccsqeVuevAQVf0jeLI2OJgTiXr0utgy6FAmWpTaipwdP2jgG70fuH2QHa+hVWn1yiydYpUyiakZ1lL8u8nmWhQyDx4j1HiOmObHCoVKp9DosnRqVLIlZGSZSxLsp5kISMAceJ9Z4npjmxQjrBctz6c2ztUXnMajGQEo9S5JEr3VTlTY5QIQTgJQvdOOnhHZ+OulSvCRsLahvKr1um1p6TnqXJMMOSUgt8KUlCSeI4dEQbnpnfmh1w3W1TrF7zmtFpa2+56I5LLCAPGwtTSQOHRnjFYia2lrValzXFKUKQp1yNTM2opbXM0pxpsEJKvGUeA4CKOHWi+pgOoLqEpWpAUN5KSSASOgEpVj1HyQH9xibwuKlWnbE/cVbfLFPkGuUeWElRxnAAA5ySQB1mMo2624pxCHEKU2rdWEqyUnAOD5Dgg+oiMXeFu0q67Yn7drbBfp8+1yTyAopOM5BBHMQQCOsRR1Qu7bIqqpxaLTtKSZlkkhLtTdU4tfHgShspCeHRvK9cRLU3Vm6NQa2KpXmqclfcaZJTMs0pDa2Q8Ht05USfGSOnmHti23dsb1ZE6pdpXbIvSqiSluptrbWjjwG82FBXDp3U+qNQGyXqqZvkSugBvOOWM8rc9eNze/pEG42VtizzUy3L3ZaEmZPKU8pSlqbU0npIbcKgrhzDeT647ZWxXKZclvSNeo8ymZkJ5lLzDg6UnoI6COYjoIIjqfZmxxUDPIcvC7JREqkgqZpbalrcGeI33AkI4dO6r1R2wtih0y27ekaDR5ZMtISLKWWGx0JHST0k85PSSTDBkYQhFCEcSp1Om0tjuip1CUkWf+0mHktp96iBE+uHXzSWi5S9eUjOO53Ut09K5oqPkBbBT7ziApkIjHh0qFXyLK0nvWup5kTExLCTl1nqcVvcPWB6oCo7R9fwJa37Ms9k8Sqemlzj4HVyeUZ9YiDZdcNWrf0poctO1diZnZydUtElJsYCnSkAqJUeCUjKcnifGGAeMdZa5tiXw++73ntugSLClfZh8OvuIHWoLQCevd9kVa7tnm6tQUMP6iapPVGZl0r7lblaQ001LlWM4wQVDxU9AJx7YlNd2PL5l3njR7ioFQYSfsy+XWHFjrSEKSD1b3tgMdTtrrU6XWTMyNuTqT0OSjiSPUUuD+uYruje1VSLrrkjbt1UU0WoTjiWGJth3lJZx1RwkKB8ZvJIA4qGTxIER+mbJGqE06UzMzb0igfvOzi1Z9QQg/wBcRYNGtlWk2rW5G4rqrRrNQk3EvsSku1ycs26k5SVE+M5ggEcEjPOCIDshCEIoQhE+1J1etSy5lNJLj1auJ47ktRaYjlppxZ5gQPue3jjmBgKDEpvHWukS9ZNrWFTZi+bpVkJkqYd5lnn8Z17ilIHTjOOnEcGU0+1V1ZxMaj1NVkWq4cpt2lu5m5hGc4mHuYZHQPalJi12FZFq2LRU0i06JKUqVwN/kk+O6RzKcWfGWetRJiUR2k6JXXfs21WNcLiE1LBQcZtakuKakWscQHVg7zhHHp4dCyOEXWg0elUGlM0qiU6Up0gwndal5ZoNtoHUBwjnQiBCEIBCEICU7S+llQ1OtamsUCpsUmvUuc5eUnXSoBKFIUh1GUgkBQKTw6UiNz0/ttiyNOqRbNPbMwmkyCGEhJALy0p8Y5OACpWTxwPGjY4QGl6SXVWbrka8/XaS3SZmn1p6QTKJeDpbQ2hsjeWngpRKicjhxx0ZO6RrtkW2u3XbgWubTMd9qy9Uk4Ru8mHEoTuHjxI3OfrjG6oapWTpxIpfuisNszLozLyDI5SamOOBuNDiRnhk4T5TAbpEw1T1ws2xp0URDj9w3M6dxiiUpPLTBX0BeODfRz8ccQDE9mqjrPrAClvlNL7NeHR49Xm2yPZyQP8AhI/jEb1pvptZ9gSamrcpSGph0f2ieePKTL5zk77h4njxwMDqgNCmbV1U1cw9qXVjaNsOeMm2qO79s8nnAmHunrSMjqSYqVm2nbln0dFJtmkStMlE4yllGFLI/eWo+MtXWokxmo+LWlCFLWoJQkZUonAA8pij7CJZdG0LpLQHnWH7rZnZhpW6puQaXMZPUtI3D/xRrTW1hpQtwJUuuNgn7ypHgPcomAvEcGv1mlUGlPVWt1GVp0iwMuPzDoQhPVk9J6BzmIhVdouVuSty9qaRUxFfrc4jLc1UF9ySrPDiSle6twp6UjHUVRmKDoius1Vq49Xa+7edWQreakjlFNlf4UM4AV6yAD0pJ4wHEmdWruv6ZcpmjFtKmJTfLblzVZCmpFvBwS2gjecI946UkRlbO0OpLFXRc2oFUmb5ubO93RURmWYPPhpj7qQOjOfKAmKvKsMSsu3LSzLbDLaQltttISlIHMABwAj9ID4kBKQlIAAGAB0R9hCKPym5aXnJV2Vm2GpiXeSUONOoCkLSecEHgQfIYiNZ0qufT6qP3LonPJZacVyk7a04smTmvKWiT9mrmxxH94DxTc4RBOdK9XqBe005RJph+37qlcpm6JPjceQoc5QSByifUAccSBwiiuIQ4hSFpSpChhSSMgjyGNH1W0utbUCTQ5VWVyVVlRvSdWlFcnMyqhxBCxzgHjg8OfGDxiK29tBu6d3I7Z1+12RvKnsACWuCjuJcd3ehL6AcKUBzkEkfxHJAZy49N7GuDarcoNUtmnuU12x+7Fy7KCwC/wB3bnKZbKSFbvDOc4jYDs+02lfaWPfV5Wosfdalqip2Xx0Atq4qA8hVEwRtCafK2ihfBVVUUg2p3p3jKfaB/uvlfuhX3d3p8vRF5snWTTS8ZxuRoV2STs65gIlnwqXcWo8N1KXAneVnoTmA1TvDtD26M0u9bXu9hvmaq1PVKurT1Frp9avfzQ8KmptB8W8dF6wttPFU1QZpE6COkhscR7VRaIQElo20VpdOzJlKjVpy35wDJl6tJOMKHrOCke0xRbfuW3bga5Wg12l1VAGSZObQ9j17pOI5FYpFJrEuJar0uSqLIzhual0up9ygRE5r2z7pRVXhMt2ymlTSTlD9MfcllIPUlJ3P/LAVOERfwOXrQuNj6zXNJNo4tytYQioND+Eb2N1PqBgZ3aOt0lL9Gs69JdPELlZhUlMKHkO/hA9gPrgLRCIv4eX6P4t86X3nbuOd9uVE3LDy/ap3f6AxsNB100mrMvy0tfFKYwkqKJ1ZlVDHOMOhOT6s56MwFHhEZrm05pDTFhDVdmqkrpEnJOED2rCR7iY4lN2qdJJuZSy9P1WRSSBysxIKKR69wqP9IC4xNbCpLFM1pv5lmZnnu6KbSXlrmZpbqwpSp0YSVElKQAMAcBGftzUqwbgpa6lSbuo78q2cOKVMpbLf95K8KT7QI1au636M0CemJxV0UqZqD6UNOLprJmXXwje3ElbSSCBvKxk4G8cc8Bz9E5BFMnb+kW5icmENXSsByamFvuqzIyZ8ZayVHnwMngMDmEUWIhK60OTjk0vT/R27qsZp3lXZpckmRYmHd1Kd9Tpzk7qUjeUM4SBzARyBUdo+v4Etb9mWeyeJVPTS5x8Dq5PKM+sQFnjiVOp02lsd0VOoSkiz/wBpMPJbT71ECJF4J9SK2M3hrZXihz/SS9DlkSAA/CFp4ketPHpzHLpezlpfLzHddUptQuCbxjuiq1B15R9YBSk+0QGRuHXzSWi5S9eUjOO53Ut09K5oqPkBbBT7ziMJ4dKhV8iytJ71rqeZExMSwk5dZ6nFb3D1geqKZb1oWrbwT3htukUspGAqVk22le0pAJjNwEYFR2j6/gS1v2ZZ7J4lU9NLnHwOrk8oz6xHzwT6kVsZvDWyvFDn+kl6HLIkAB+ELTxI9aePTmKJfF+2dZUuh66bhkaXvjKG3V5dWOPFLacqUOB4gRMahtVaSysyplmdq06lJwHWJBQSrrG+Un+kBlaXs5aXy8x3XVKbULgm8Y7oqtQdeUfWAUpPtEUK3rQtW3gnvDbdIpZSMBUrJttK9pSATE2oO01pDVFbjlfmKYvoE7JOJB/xJCkj2kRWaRU6dWKe1UaTPytQk3RluYlnkuNr44OFJJB4wHLhCEUIQhAIQjEXbc9v2pSF1a46vKUySR/vH143j5EjnUrqAJgMvGp6jajWfYEgJm5qwzLOLGWZVHjzD/HA3Gx4x48M8w6SIn8veWp+rKjLaV0T6N26vgu6a00QXE+WWZ/ePPgnI8u4YoOl+hloWZUDX57ui57qcVyj1bqx5V7fznLaTkN46CPG6zEo0GUl9ZtYEhUqh3TCznRkPup36tOII/dTw5IHy8COgqHCKxpXpPZOnEqpNuUpPd7oPdNSmTys3ME8SVOHjxPHCcDqjeYRAhCEAhCEAhCEAhCOJWapTaNTH6nV5+Vp8jLp3npiZdS222PKVKIAgOXGCve8bYsqiLrF1VqUpUknOFvrwpwj91CR4y1fwpBMRuta43Je887RNDbdFUShfJzFy1RCmqfLniDuJOFOHm7KhxhaOikgKym6tR6tMX3dBwruioJBlpc8PFaY+6ADzZHWAmA4s3qXqhqtvSultJNpW054qrmrDX27yeYmXZ/9FHPrSYz2nGjtq2fPrrbwmLguV5W+/WqqvlphS+kpzwR7OOOBJiigADAGAIRQhCEUIm20pZlw33pRPUC2Z1MvPKdbeLSl7iZpCckslXMMnBGeGUjOOcUmEB5Y3RY142xNGWr9s1WnLyQC9LKCF4ODuqxuqHWCRGCRLTC1lCGHVLHOkIJIj1rhEg8z9ONItRrxqMqaFb8/LsKWCKjMIUww1gjxuUIGSOfCcnyCPSShSszI0SRkpycXOzMvLNtPTKx4zy0pAUs8TxJBPtjmQgEIQihCEIBCEIDQ9frVr956U1i3raqCZOoTKUlO8rdS+lKgpTRV+6FAYz7DwJjzwuuwb0tWaMvcFsVWnqCilK3JZXJrI591YBSodYJj1LhEHkomXfU4Www4VjnSEHI9kblYelOoV5TbKKBbNRUyte73Y80WZdBHEkuKAHAccDJ5sAkiPTmEIMXaEhPUq06RTKpPGfnpSSZYmZokkvOIQEqXk8TkgnJ48YykIRQhCEAhCEAjrFtmaP3Pd03T7mtCnMzwlWFtzkkwhKH1qKs8qP8AtDjhj73AYzk47OwiDyhq1ArlJm1ylUo1RkZhs4W1MSy21p9YUAY4ktJzcyQJaVfeJ4Dk2yrPuj1phCDoNs+6A3fcd402p3Pbr1OtuWeS9Nd8mi2ZlA48mhs4UQrgN7gAMnJPA93retC1beCe8Nt0illIwFSsm20r2lIBMZuEAhCEUIQhAIQhAdDtpzSDUpvUqu3Qmlz9wUyoTTkwxNSiVPqZa5w2tIypAQnCRw3cJ4HnxBpiVmpckTEs81g4O+gp4+2PWqESDyjo9u1+sziJOkUSpVCZX91qWlVuKPsSDHdTYu01vexqXV5+6iuny1SDZlqUte8tJGSXVAHCCQQnHPwOcYGexEIQIQj4tSUIK1qCUpGSScACKPscapz8jS5B6oVKcl5KTYTvOvvuBttseUqPARLbo1rlZitOWtphRZi+7jHBSZJWJOVPEbzr/wB3APkOOjeBj9aFoTW7wqDNe1xuLv662rlJe3qepTVNlTwxnGFOEdfqJUIlGOmtWrjvmovULRG3O/a21cnMXBUEqZpsqeOcE4U4Rz4HrAUI2Oxtn6mIq7d06n1h6/blHjJVOoxJSp4HdaY+7gHyjHSEgxYqTTqfSacxTaXJS0jJS6dxmXl2g222PIlKQAB6o5UQfEJShAQhISlIwABgAR9hCAQhCAQhCAQhCAQhCA6/as7UFq2/VnLXswyVw3DvlkuvziJWnyywcHlH1qCVY8iTjo3gY0SRkLOvKqM3DrZrNadyTTauUl6JKVthqmSh8gSFguHrOM8x3o6d3v8A7aVz/wARmP8AqKjDwHp3IaiaU0+SakpC+bKlJVlIQ0yxVpVCEJHQlIXgDqEfv4UNNPSHaP51L9uPL2EWj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUeoXhQ009Ido/nUv24eFDTT0h2j+dS/bjy9hCj1C8KGmnpDtH86l+3DwoaaekO0fzqX7ceXsIUej94a52TSnGKdbc19NK7N+LJ02hLE0pxWceMtGUoHrycccGMdJaWalapKTO6t1v6OW+vCkWtRncKcT5Jl7pPNlIyPJuGJL/7Nb/bS6f8Aw5H/AFEx3kiDDWbaluWfRW6PbFGk6TIo/wB1Lt7u8fxKPOpX8SiT1xmYQgEIQgEIQgEIQgEIQgEIQgEIQgP/2Q==\"\n    }\n   },\n   \"cell_type\": \"markdown\",\n   \"id\": \"58970dbf\",\n   \"metadata\": {},\n   \"source\": [\n    \"![Illustration-of-a-coupled-climate-subnetwork-as-it-is-constructed-in-this-work-where-V1_W640.jpg](attachment:Illustration-of-a-coupled-climate-subnetwork-as-it-is-constructed-in-this-work-where-V1_W640.jpg)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"668d5926\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Computing a Coupled Climate Network\\n\",\n    \"### Loading the Climate Data\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0fe0dac8\",\n   \"metadata\": {},\n   \"source\": [\n    \"For this tutorial, we download [Reanalysis 1 data](https://psl.noaa.gov/data/gridded/data.ncep.reanalysis.html) provided by the *National Center for Environmental Prediction / National Center for Atmospheric Research* (NCEP-NCAR). This data set contains the monthly averaged geographical height potential for 17 isobaric surfaces $P_i$ of the atmosphere, on an equally spaced spherical grid with a latitude and longitude resolution of $2.5° \\\\!\\\\times\\\\! 2.5°$.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"id\": \"d5602280-eeae-4de7-9d9f-20f08471b3e3\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"./data/hgt.mon.mean 100%[===================>] 296.75M  5.21MB/s    in 28s     \\n\",\n      \"2024-02-05 03:21:41 URL:https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis/Monthlies/pressure/hgt.mon.mean.nc [311163603/311163603] -> \\\"./data/hgt.mon.mean.nc\\\" [1]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"DATA_NAME = \\\"hgt.mon.mean.nc\\\"\\n\",\n    \"DATA_URL = f\\\"https://downloads.psl.noaa.gov/Datasets/ncep.reanalysis/Monthlies/pressure/{DATA_NAME}\\\"\\n\",\n    \"DATA_FILE = f\\\"./data/{DATA_NAME}\\\"\\n\",\n    \"![ -f {DATA_FILE} ] || wget -O {DATA_FILE} -nv --show-progress \\\"{DATA_URL}\\\"\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0ddc28ac-3014-4295-afd8-f451ff6cd641\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we will start with some imports and some specifications regarding the data set.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"id\": \"695c5769\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"from pyunicorn import climate\\n\",\n    \"from matplotlib import pyplot as plt\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"id\": \"2bd80f13-10bd-4865-8f65-55ec8c2b4f3f\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"#  Indicate data source (optional)\\n\",\n    \"DATA_SOURCE = \\\"NCEP-NCAR Reanalysis 1\\\"\\n\",\n    \"#  Type of data file (\\\"NetCDF\\\" indicates a NetCDF file with data on a regular\\n\",\n    \"#  lat-lon grid, \\\"iNetCDF\\\" allows for arbitrary grids - > see documentation).\\n\",\n    \"FILE_TYPE = \\\"NetCDF\\\"\\n\",\n    \"#  Name of observable in NetCDF file (\\\"hgt\\\" indicates the monthly mean of the geopotential height\\n\",\n    \"#  in the NCEP/NCAR reanalysis data)\\n\",\n    \"OBSERVABLE_NAME = \\\"hgt\\\"\\n\",\n    \"#  Select a region in time and space from the data.\\n\",\n    \"#  If the boundaries are equal, the data's full range is selected.\\n\",\n    \"#  For this tutorial, we choose a window for latitude and longitude corresponding to North America.\\n\",\n    \"WINDOW = {\\\"time_min\\\": 0., \\\"time_max\\\": 0., \\\"lat_min\\\": 45, \\\"lon_min\\\": 80,\\n\",\n    \"          \\\"lat_max\\\": 60, \\\"lon_max\\\": 120} \\n\",\n    \"#  Indicate the length of the annual cycle in the data (e.g., 12 for monthly\\n\",\n    \"#  data). This is used for calculating climatological anomaly values.\\n\",\n    \"TIME_CYCLE = 12\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"67822736\",\n   \"metadata\": {},\n   \"source\": [\n    \"We will first generate a separate `pyunicorn.climate.ClimateData` instance from our data file for each of the 17 vertical levels, which will then be coupled to the near ground level in the following steps. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"id\": \"33aead33-118a-4e55-a96a-e69c5f3036ba\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Reading NetCDF File and converting data to NumPy array...\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\",\n      \"Reading NetCDF File and converting data to NumPy array...\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"# number of total vertical levels in the data file\\n\",\n    \"VERTICAL_LEVELS = 17\\n\",\n    \"# loop over all levels to create a `ClimateData` object for each level\\n\",\n    \"data = np.array([climate.ClimateData.Load(\\n\",\n    \"    file_name=DATA_FILE, observable_name=OBSERVABLE_NAME,\\n\",\n    \"    data_source=DATA_SOURCE, file_type=FILE_TYPE,\\n\",\n    \"    window=WINDOW, time_cycle=TIME_CYCLE,\\n\",\n    \"    #  The `vertical_level` argument indicates the vertical level to be extracted from the data file,\\n\",\n    \"    #  and is ignored for horizontal data sets. If `None`, the first level in the data file is chosen.\\n\",\n    \"    vertical_level=l) for l in range(VERTICAL_LEVELS)])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"a7b51a1a\",\n   \"metadata\": {},\n   \"source\": [\n    \"One can use the `print()` function on a `ClimateData` object in order to show some information about the data.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"id\": \"0afb1744\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Global attributes:\\n\",\n      \"description:  Data from NCEP initialized reanalysis (4x/day).  These are interpolated to pressure surfaces from model (sigma) surfaces.\\n\",\n      \"platform: Model\\n\",\n      \"Conventions: COARDS\\n\",\n      \"NCO: 20121012\\n\",\n      \"history: Created by NOAA-CIRES Climate Diagnostics Center (SAC) from the NCEP\\n\",\n      \"reanalysis data set on 07/07/97 by calc.mon.mean.year.f using\\n\",\n      \"/Datasets/nmc.reanalysis.derived/pressure/hgt.mon.mean.nc\\n\",\n      \"from /Datasets/nmc.reanalysis/pressure/hgt.79.nc to hgt.95.nc\\n\",\n      \"Converted to chunked, deflated non-packed NetCDF4 2014/09\\n\",\n      \"title: monthly mean hgt from the NCEP Reanalysis\\n\",\n      \"dataset_title: NCEP-NCAR Reanalysis 1\\n\",\n      \"References: http://www.psl.noaa.gov/data/gridded/data.ncep.reanalysis.derived.html\\n\",\n      \"Variables (size):\\n\",\n      \"level (17)\\n\",\n      \"lat (73)\\n\",\n      \"lon (144)\\n\",\n      \"time (913)\\n\",\n      \"hgt (913)\\n\",\n      \"ClimateData:\\n\",\n      \"Data: 119 grid points, 108647 measurements.\\n\",\n      \"Geographical boundaries:\\n\",\n      \"         time     lat     lon\\n\",\n      \"   min 1297320.0   45.00   80.00\\n\",\n      \"   max 1963536.0   60.00  120.00\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(data[0])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"9eea2cec\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Constructing the Network\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"fb13be4b\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `pyunicorn.climate.CoupledClimateNetwork` class provides the functionality to generate a complex network from a similarity measure matrix of two time series, e.g., arising from two different observables or from one observable at two vertical levels. The idea of coupled climate networks is based on the concept of coupled patterns, for a review refer to [Bretherton et al. (1992)](https://journals.ametsoc.org/view/journals/clim/5/6/1520-0442_1992_005_0541_aiomff_2_0_co_2.xml). The two observables (layers) need to have the same time grid (temporal sampling points). More information on the construction of a `ClimateNetwork` based on various similarity measures is provided in the tutorial on [Climate Networks](https://github.com/pik-copan/pyunicorn/blob/master/examples/tutorials/ClimateNetworks.ipynb).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"e5e230be\",\n   \"metadata\": {},\n   \"source\": [\n    \"For our example, we construct 17 coupled climate networks from the data by coupling the lowest level with each other level, based on Pearson correlation without lag and with a fixed threshold. For the construction of a coupled climate network, one needs to set either the threshold $\\\\beta$ or the link denisty. In this example, we set the threshold $\\\\beta = 0.5$.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"id\": \"8872d035\",\n   \"metadata\": {\n    \"scrolled\": true\n   },\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\"\n     ]\n    },\n    {\n     \"name\": \"stderr\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"/Users/fritz/Desktop/23_H2_PIK/pyunicorn/src/pyunicorn/core/interacting_networks.py:955: RuntimeWarning: invalid value encountered in scalar divide\\n\",\n      \"  average_path_length = path_lengths.sum() / norm\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\",\n      \"Calculating daily (monthly) anomaly values...\\n\",\n      \"Calculating correlation matrix at zero lag from anomaly values...\\n\",\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Calculating path lengths...\\n\",\n      \"Calculating all shortest path lengths...\\n\",\n      \"Calculating n.s.i. betweenness...\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"#  for setting a fixed threshold\\n\",\n    \"THRESHOLD = 0.5\\n\",\n    \"\\n\",\n    \"cross_link_density = []\\n\",\n    \"cross_average_path_length = []\\n\",\n    \"cross_global_clustering = []\\n\",\n    \"cross_transitivity = []\\n\",\n    \"cross_degree = []\\n\",\n    \"cross_closeness = []\\n\",\n    \"cross_betweenness = []\\n\",\n    \"\\n\",\n    \"for l in range(VERTICAL_LEVELS):\\n\",\n    \"    # generate a coupled climate network between the ground level and the level l\\n\",\n    \"    coupled_network = climate.CoupledTsonisClimateNetwork(data[0], data[l], threshold=THRESHOLD)\\n\",\n    \"\\n\",\n    \"    # calculate global measures\\n\",\n    \"    cross_link_density.append(coupled_network.cross_link_density())\\n\",\n    \"    cross_average_path_length.append(coupled_network.cross_average_path_length())\\n\",\n    \"    cross_global_clustering.append(coupled_network.cross_global_clustering())\\n\",\n    \"    cross_transitivity.append(coupled_network.cross_transitivity())\\n\",\n    \"\\n\",\n    \"    # calculate local measures\\n\",\n    \"    cross_degree.append(coupled_network.cross_degree())\\n\",\n    \"    cross_closeness.append(coupled_network.cross_closeness())\\n\",\n    \"    cross_betweenness.append(coupled_network.cross_betweenness())\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"583b18dd\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Plotting some Coupled Network Measures\\n\",\n    \"### Global Measures\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"3b27db00\",\n   \"metadata\": {},\n   \"source\": [\n    \"We first determine the average geopotential height for each vertical level (in *km*),\\n\",\n    \"which we will use as an independent variable to plot the global measures that we calculated for the 17 coupled climate networks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"id\": \"c1ead3e6\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# read out the observable hgt (geopotentential height) and average it for each level\\n\",\n    \"hgt_averaged = np.array([\\n\",\n    \"    np.round(data[l].observable().flatten().mean() / 1000, 1)\\n\",\n    \"    for l in range(VERTICAL_LEVELS)])\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"id\": \"6cd75bf5-8c14-4705-920e-8adcbfaeee15\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def plot_global_coupling(\\n\",\n    \"    measure: np.ndarray, title: str, xlabel: str, xindex: str,\\n\",\n    \"    set_ylabel=True, ax=None):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Plot the geopotential height over a coupling network measure.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    ax_ = plt if ax is None else ax\\n\",\n    \"    ax_p = lambda p: getattr(*((plt, p) if ax is None else (ax, f\\\"set_{p}\\\")))\\n\",\n    \"    ax_.plot(measure, hgt_averaged, 'o', color='blue')\\n\",\n    \"    ax_p(\\\"xlabel\\\")(r\\\"${}\\\".format(xlabel) + xindex + r\\\"$\\\")\\n\",\n    \"    if set_ylabel:\\n\",\n    \"        ax_p(\\\"ylabel\\\")(r\\\"$Z_{\\\\,l}$ (km)\\\")\\n\",\n    \"    ax_p(\\\"title\\\")(title)\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"c8006820-d57b-41a2-ace7-f5355836ef5f\",\n   \"metadata\": {},\n   \"source\": [\n    \"Note that the cross-link density and cross-average path length are symmetrical ($\\\\rho_{1l}=\\\\rho_{l1}$, $\\\\mathcal{L}_{1l} = \\\\mathcal{L}_{l1}$), but the global cross-clustering coefficient and cross-transitivity are not ($\\\\mathcal{C}_{1l} \\\\neq \\\\mathcal{C}_{l1}$, $\\\\mathcal{T}_{1l} \\\\neq \\\\mathcal{T}_{l1}$). When computing asymmetric measures for two coupled climate subnetworks $G_i$ and $G_j$, the methods in `climate.CoupledClimateNetwork` return tuples such as $(\\\\mathcal{C}_{ij},\\\\mathcal{C}_{ji})$ or $(\\\\mathcal{T}_{ij},\\\\mathcal{T}_{ji})$.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"id\": \"67126dbc-54e4-4b20-a227-9569b1c2d609\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def plot_global_symmetric_coupling(measure, title, xlabel):\\n\",\n    \"    plot_global_coupling(measure, title, xlabel, r\\\"_{\\\\,1\\\\,l}\\\")\\n\",\n    \"\\n\",\n    \"def plot_global_asymmetric_coupling(measure, title, xlabel):\\n\",\n    \"    fig, axes = plt.subplots(1, 2, layout=\\\"constrained\\\")\\n\",\n    \"    fig.suptitle(title)\\n\",\n    \"    # plot both vertical directions of coupling\\n\",\n    \"    for vert in range(2):\\n\",\n    \"        plot_global_coupling(\\n\",\n    \"            measure[:, vert],\\n\",\n    \"            f\\\"pointing {['up', 'down'][vert]}wards\\\", xlabel,\\n\",\n    \"            [r\\\"_{\\\\,1\\\\,l}\\\", r\\\"_{\\\\,l\\\\,1}\\\"][vert],\\n\",\n    \"            set_ylabel=(vert == 0), ax=axes[vert])\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"05c2ddbb\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Cross-Link Density\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"id\": \"2a017cc2-9fee-4447-8cd6-2cd055f9bad2\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAjkAAAHGCAYAAACWx5o8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA5k0lEQVR4nO3de3hU1b3/8c8wQAiSBLnlwoSAiCggiIBcNBJAUEQFYxRLFfh5KRbURKoCtpVgW6jYclEuokfBqojKGZVTEaEHEqNCBYUi4N3QBkigUEjCxSDD+v0xJ2OGCZqZTOay8349zzzprL1m57sSaT7P3nutZTPGGAEAAFhMg3AXAAAAUBcIOQAAwJIIOQAAwJIIOQAAwJIIOQAAwJIIOQAAwJIIOQAAwJIIOQAAwJIIOQAAwJIIOQDCwmazKTc31/M+Ly9PNptNeXl5fp9r9+7dstls+tOf/hS0+irPuWzZsqCdM1Bn/qx27dql3Nxc7d69O2w1AdGgYbgLAABJuvTSS7Vx40Z16dIl3KVEnI0bN8rhcHje79q1SzNmzFBGRobat28fvsKACEfIAeqJEydOqEmTJrLZbOEupVrx8fHq169fuMuISPxcgMBwuwqIQp9//rl+9rOfKTExUTExMWrXrp3Gjh2riooKSdKyZctks9m0du1a3XHHHWrdurWaNm2qiooKnT59WrNnz9aFF16omJgYtWnTRmPHjtWePXu8vsfWrVt13XXXqU2bNoqJiVFKSopGjBjh1e/1119X3759lZCQoKZNm+q8887THXfcEdCYqrtdNX78eDVr1kxff/21rr32WjVr1kypqan61a9+5Rnr2Xz//fcaN26cmjVrpr/+9a8/2nffvn265ZZbFBcXp4SEBI0ePVolJSXV9t2yZYtuuOEGtWjRQk2aNFHPnj312muvefWp/Plv2LBBv/zlL9WqVSu1bNlSmZmZ2rdvn1ff9evXKyMjQy1btlRsbKzatWunm266ScePH/f0qXq7atmyZbr55pslSYMGDZLNZvPcVvvd736nhg0bqqioyKfuO+64Qy1bttR33333oz8LwEoIOUCU+cc//qE+ffpo06ZNeuyxx/TOO+9o1qxZqqio0MmTJ7363nHHHWrUqJFefPFFrVy5Uo0aNdIvf/lLTZkyRUOHDtWqVav0u9/9TmvWrNGAAQN08OBBSdKxY8c0dOhQ7d+/XwsXLtS6des0b948tWvXTuXl5ZLct1BGjx6t8847TytWrNDbb7+tRx99VKdOnQrqeL///nvdcMMNGjJkiN566y3dcccdmjt3rh5//PGzfubIkSO6+uqrtXbtWuXn5+u66647a98TJ07oqquu0tq1azVr1iy9/vrrSkpK0ujRo336btiwQZdffrmOHDmip59+Wm+99ZYuueQSjR49utpnd+666y41atRIy5cv1+zZs5WXl6fbbrvNc3z37t0aMWKEGjdurOeff15r1qzRH//4R51zzjk+v8tKI0aM0MyZMyVJCxcu1MaNG7Vx40aNGDFCEyZMUMOGDbVkyRKvz/znP//RihUrdOedd6pJkyZn/VkAlmMARJXBgweb5s2bmwMHDpy1z9KlS40kM3bsWK/2zz77zEgyEydO9Gr/+9//biSZRx55xBhjzJYtW4wk8+abb571e/zpT38yksyRI0cCGockM336dM/7DRs2GElmw4YNnrZx48YZSea1117z+uy1115rOnfu7HlfWFhoJJknnnjCFBYWmi5dupguXbqY3bt3/2QdixcvNpLMW2+95dV+9913G0lm6dKlnrYLL7zQ9OzZ03z//fdefa+77jqTnJxsXC6XMeaHn/+ZP+fZs2cbSaa4uNgYY8zKlSuNJLNt27YfrfHMn9Xrr7/u87OqNG7cONOmTRtTUVHhaXv88cdNgwYNTGFh4Y9+H8BquJIDRJHjx48rPz9ft9xyi1q3bv2T/W+66Sav9xs2bJDkvg1U1WWXXaaLLrpI//u//ytJOv/883XuuedqypQpevrpp7Vr1y6fc/fp00eSdMstt+i1117T3r17ffq4XC6dOnXK8zp9+nSNxlmVzWbT9ddf79XWvXt3/fOf//Tp+8knn6hfv35KTEzUBx98oLS0tJ88/4YNGxQXF6cbbrjBq33MmDFe77/++mt9/vnn+vnPfy5JXuO69tprVVxcrC+++MLrM2ees3v37pLkqf2SSy5R48aN9Ytf/EIvvPCCvv3225+s96dkZ2frwIEDev311yVJp0+f1uLFizVixAgeUka9Q8gBosjhw4flcrm8Ztr8mOTkZK/3hw4dqrZdklJSUjzHExISlJ+fr0suuUSPPPKIunbtqpSUFE2fPl3ff/+9JOnKK6/Um2++qVOnTmns2LFyOBzq1q2bXnnlFc85O3bsqEaNGnlejz32mN9jbtq0qc8tlpiYmGqfLVm3bp3279+vu+66S82bN6/R+Q8dOqTExESf9qSkJK/3+/fvlyQ9+OCDXmNq1KiRJk6cKEme232VWrZs6VO35L5FJrl/Pn/729/Upk0bTZo0SR07dlTHjh01f/78GtVenZ49eyo9PV0LFy6UJP31r3/V7t27de+99wZ8TiBaMbsKiCItWrSQ3W73eUj4bM6cSVX5R7e4uNgnKO3bt0+tWrXyvL/44ou1YsUKGWO0fft2LVu2TI899phiY2M1depUSdLIkSM1cuRIVVRUaNOmTZo1a5bGjBmj9u3bq3///vqf//kfrweEU1JSAhp3TT300EP65ptvNHbsWE/4+iktW7bURx995NN+5oPHlT+badOmKTMzs9pzde7c2e+a09PTlZ6eLpfLpS1btuipp55STk6OEhMTdeutt/p9Pkm6//77dfPNN+uTTz7RggULdMEFF2jo0KEBnQuIZlzJAaJIbGysBg4cqNdff93nqkFNDB48WJL00ksvebVv3rxZn332mYYMGeLzGZvNph49emju3Llq3ry5PvnkE58+MTExGjhwoOdh4K1bt0pyB6XevXt7XnUdcho0aKAlS5YoOztb48eP1+LFi3/yM4MGDVJ5eblWrVrl1b58+XKv9507d1anTp30j3/8w2tMVV9xcXEB126329W3b1/PFZjqfs6VzrwidKYbb7xR7dq1069+9Sv97W9/08SJEyN26QCgLnElB4gyc+bM0RVXXKG+fftq6tSpOv/887V//36tWrVKS5Ys+dE/tJ07d9YvfvELPfXUU2rQoIGGDx+u3bt367e//a1SU1P1wAMPSHLf4li0aJFGjRql8847T8YYOZ1OHTlyxHNF4NFHH9WePXs0ZMgQORwOHTlyRPPnz1ejRo00cODAkPwszubPf/6z4uLiNHHiRB09elQPPfTQWfuOHTtWc+fO1dixY/WHP/xBnTp10urVq/Xuu+/69F2yZImGDx+uq6++WuPHj1fbtm31n//8R5999pk++eQTz3MwNfX0009r/fr1GjFihNq1a6fvvvtOzz//vCTpqquuOuvnunXrJkl65plnFBcXpyZNmqhDhw6eK3V2u12TJk3SlClTdM455/g8gwXUF4QcIMr06NFDH330kaZPn65p06apvLxcSUlJGjx4sBo3bvyTn1+8eLE6duyo5557TgsXLlRCQoKuueYazZo1y/NHslOnTmrevLlmz56tffv2qXHjxurcubOWLVumcePGSZL69u2rLVu2aMqUKfr3v/+t5s2bq3fv3lq/fr26du1apz+DmsjNzVWzZs300EMP6ejRo5oxY0a1/Zo2bar169crOztbU6dOlc1m07Bhw7RixQoNGDDAq++gQYP00Ucf6Q9/+INycnJ0+PBhtWzZUl26dNEtt9zid42XXHKJ1q5dq+nTp6ukpETNmjVTt27dtGrVKg0bNuysn+vQoYPmzZun+fPnKyMjQy6XS0uXLvUKM6NHj9aUKVN0++23KyEhwe/aACuwGWNMuIsAAATXU089pfvvv187duyIiNAJhAMhBwAsZOvWrSosLNSECRN0+eWX68033wx3SUDYEHIAwELat2+vkpISpaen68UXX/SZCg/UJ4QcAABgSUwhBwAAlkTIAQAAlkTIAQAAllSv1sk5ffq09u3bp7i4OFb/BAAgShhjVF5erpSUFDVoUPPrM/Uq5Ozbt0+pqanhLgMAAASgqKioxhsUS/Us5FQud19UVKT4+PgwVwMAAGqirKxMqampfu8PV69CTuUtqvj4eEIOAABRxt9HTXjwGAAAWBIhBwAAWBIhBwAAWBIhBwAAWBIhBwAAWBIhBwAAWBIhBwAAWBIhBwAAWBIhBwAAWFK9WvG4rrhcUkGBVFwsJSdL6emS3R7uqgAAqN8IObXkdErZ2dKePT+0ORzS/PlSZmb46gIAoL7jdlUtOJ1SVpZ3wJGkvXvd7U5neOoCAACEnIC5XO4rOMb4Hqtsy8lx9wMAAKFHyAlQQYHvFZyqjJGKitz9AABA6BFyAlRcHNx+AAAguAg5AUpODm4/AAAQXIScAKWnu2dR2WzVH7fZpNRUdz8AABB6hJwA2e3uaeKSb9CpfD9vHuvlAAAQLoScWsjMlFaulNq29W53ONztrJMDAED4sBhgLWVmSiNHsuIxAACRhpATBHa7lJER7ioAAEBVEXO7avHixerevbvi4+MVHx+v/v3765133vEcN8YoNzdXKSkpio2NVUZGhnbu3BnGigEAQCSLmJDjcDj0xz/+UVu2bNGWLVs0ePBgjRw50hNkZs+erTlz5mjBggXavHmzkpKSNHToUJWXl4e5cgAAEIlsxlS3MUFkaNGihZ544gndcccdSklJUU5OjqZMmSJJqqioUGJioh5//HFNmDChRucrKytTQkKCSktLFR8fX5elAwCAIAn073fEXMmpyuVyacWKFTp27Jj69++vwsJClZSUaNiwYZ4+MTExGjhwoD788MOznqeiokJlZWVeLwAAUD9EVMj59NNP1axZM8XExOiee+7RG2+8oS5duqikpESSlJiY6NU/MTHRc6w6s2bNUkJCgueVmppap/UDAIDIEVEhp3Pnztq2bZs2bdqkX/7ylxo3bpx27drlOW47Y9U9Y4xPW1XTpk1TaWmp51VUVFRntQMAgMgSUVPIGzdurPPPP1+S1Lt3b23evFnz58/3PIdTUlKi5CqbQR04cMDn6k5VMTExiomJqduiAQBARIqoKzlnMsaooqJCHTp0UFJSktatW+c5dvLkSeXn52vAgAFhrBAAAESqiLmS88gjj2j48OFKTU1VeXm5VqxYoby8PK1Zs0Y2m005OTmaOXOmOnXqpE6dOmnmzJlq2rSpxowZE+7SAQBABIqYkLN//37dfvvtKi4uVkJCgrp37641a9Zo6NChkqSHH35YJ06c0MSJE3X48GH17dtXa9euVVxcXJgrBwAAkSii18kJNtbJAQAg+lhqnRwAAIDaIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLIuQAAABLahjuAqzA5ZIKCqTiYik5WUpPl+z2cFcFAED9RsipJadTys6W9uz5oc3hkObPlzIzw1cXAAD1HberasHplLKyvAOOJO3d6253OsNTFwAAIOQEzOVyX8ExxvdYZVtOjrsfAAAIPUJOgAoKfK/gVGWMVFTk7gcAAEKPkBOg4uLg9gMAAMFFyAlQcnJw+wEAgOAi5AQoPd09i8pmq/64zSalprr7AQCA0CPkBMhud08Tl3yDTuX7efNYLwcAgHAh5NRCZqa0cqXUtq13u8PhbmedHAAAwofFAGspM1MaOZIVjwEAiDSEnCCw26WMjHBXAQAAquJ2FQAAsCRCDgAAsCRCDgAAsCRCDgAAsKSICTmzZs1Snz59FBcX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EDR+hZzXXntNgwcPPmvQMcawPxQAAIgIfi8G2KNHDw0aNEg7d+70OXbgwAGde+65QSksmrhcUl6e9Mor7q8uV7grAgAAfoUcm82mZcuWafDgwRo0aJB27Njh0ydCt8KqM06n1L69NGiQNGaM+2v79u52AAAQPn6FHGOM7Ha7Xn75ZQ0ZMkSDBw/2CTo2my2oBUYyp1PKypL27PFu37vX3U7QAQAgfALau6pBgwZ6+eWXddVVV2nw4MH69NNPg11XxHO5pOxsqboLV5VtOTncugIAIFz8vl3l+WCDBnrppZc8QWf79u1BLy6SFRT4XsGpyhipqMjdDwAAhJ7ft6u8Pvx/QWfo0KEaMmSItm3bFszaIlpxcXD7AQCA4PIr5Lz99ttKSEjwPsH/BZ1hw4bppptuCmpxkSw5Obj9AABAcPkVcoYPH17tJpwNGjTQiy++qJEjRwatsEiXni45HNLZnrO22aTUVHc/AAAQegE9eFztif7vis7GjRuDdcqIZrdL8+e7//eZQafy/bx57n4AACD0ghZyJPeDyZdddlkwTxnRMjOllSultm292x0Od3tmZnjqAgAAQd6gsz7KzJRGjnTPoioudj+Dk57OFRwAAMKNkBMEdruUkRHuKgAAQFVBvV0FAAAQKQg5AADAkgg5AADAkgg5AADAkgg5AADAkgg5AADAkgg5AADAkgg5AADAklgMMAhcLlY8BgAg0hByasnplLKzpT17fmhzONybd7J3FQAA4cPtqlpwOqWsLO+AI0l797rbnc7w1AUAAAg5AXO53FdwjPE9VtmWk+PuBwAAQo+QE6CCAt8rOFUZIxUVufsBAIDQI+QEqLg4uP0AAEBwEXIClJwc3H4AACC4CDkBSk93z6Ky2ao/brNJqanufgAAIPQIOQGy293TxCXfoFP5ft481ssBACBcCDm1kJkprVwptW3r3e5wuNtZJwcAgPBhMcBaysyURo5kxWMAACINIScI7HYpIyPcVQAAgKq4XQUAACyJkAMAACyJkAMAACyJZ3KCyOXiAWQAACIFISdInE73hp1V97NyONxr6TCVHACA0ON2VRA4nVJWlu+GnXv3utudzvDUBQBAfRZRIee9997T9ddfr5SUFNlsNr355ptex40xys3NVUpKimJjY5WRkaGdO3eGp9j/43K5r+AY43ussi0nx90PAACETkSFnGPH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\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_global_symmetric_coupling(cross_link_density, \\\"cross-link density\\\", r\\\"\\\\rho\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"a20a0dc7\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Cross-Average Path Length\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"id\": \"4ea4c9b0-f483-4646-b61a-52ce1ddd8ba4\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAjsAAAHHCAYAAABZbpmkAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2MUlEQVR4nO3deXhU9b3H8c9kSEJAGPYsJAIqgqylIIgQCKAoogZjoEJbFm9dEQn0VsC2KlaNWGRpqyAuYAXccKAKinAlifGCGgREQNFeEQMmpSIkLBKT4Xf/mGZgmCRkmWRmTt6v55nHZ37nO2e+czgyH87yG5sxxggAAMCiwgLdAAAAQG0i7AAAAEsj7AAAAEsj7AAAAEsj7AAAAEsj7AAAAEsj7AAAAEsj7AAAAEsj7AAAAEsj7ABALVm5cqUWLFjgM/7NN9/IZrNp7ty51VpvZmambDabMjMza9agn+zZs0cPPfSQvvnmG59lSUlJ6tatW903BZyFsAMAtaS8sGM1e/bs0ezZs8sMO0AwIOwAteDHH38UPztXtpMnTwa6BQD1DGEHOI8vvvhCY8eOVXR0tCIjI3XhhRdq/PjxKioqkiQtW7ZMNptNGzZs0K233qrWrVurUaNGKioq0unTp/XEE0+oc+fOioyMVJs2bTR+/HgdOHDA6z22b9+u66+/Xm3atFFkZKTi4uI0cuRIr7rXX39d/fr1k8PhUKNGjXTRRRfp1ltvrdRnmD17tvr166cWLVqoadOm+vnPf67nn3/eK5CNGjVK7dq10+nTp31e369fP/385z/3PDfG6Omnn9bPfvYzRUVFqXnz5kpNTdXXX3/t9brSUxjvv/++rrzySjVq1MjT86uvvqrhw4crNjZWUVFRuuyyyzRz5kydOHHC5/2fffZZXXrppYqMjFSXLl20cuVKTZw4Ue3bt/eq++mnn/TII494tnfr1q01adIk/fvf/z7vNpo4caIuuOAC7d69W8OGDVPjxo3VunVr3XPPPT4B7amnntKgQYPUpk0bNW7cWN27d9cTTzyh4uJir8++bt067d+/XzabzfM417x589ShQwddcMEF6t+/vz788MPz9lqerVu36sYbb1SLFi3UsGFD9erVS6+99ppXTen+mpGRobvuukutWrVSy5YtlZKSou+++86rtqioSL/97W8VExOjRo0aadCgQfrkk0/Uvn17TZw40bO+0aNHS5KGDBni+ZzLli3zWldOTo4SExM9++7jjz9e5r4G1AoDoFw7duwwF1xwgWnfvr1ZvHixee+998zy5cvNmDFjTGFhoTHGmKVLlxpJpm3btub2228377zzjlm1apUpKSkxt99+u5Fk7rnnHrN+/XqzePFi07p1a5OQkGD+/e9/G2OMOX78uGnZsqXp06ePee2110xWVpZ59dVXzZ133mn27NljjDFm8+bNxmazmVtuucW8/fbbZtOmTWbp0qXm17/+daU+x8SJE83zzz9vNm7caDZu3Gj+9Kc/maioKDN79mxPzT/+8Q8jyWzcuNHrtZ9//rmRZP7yl794xm677TYTHh5ufvvb35r169eblStXms6dO5vo6GiTn5/vqRs8eLBp0aKFSUhIMH/9619NRkaGycrKMsYY86c//cnMnz/frFu3zmRmZprFixebDh06mCFDhni9/zPPPGMkmZtvvtmsXbvWrFixwlx66aWmXbt2pl27dp46l8tlrr32WtO4cWMze/Zss3HjRvPcc8+Ztm3bmi5dupiTJ09WuI0mTJhgIiIizIUXXmgeffRRs2HDBvPQQw+ZBg0amOuvv96rdtq0aWbRokVm/fr1ZtOmTWb+/PmmVatWZtKkSZ6a3bt3mwEDBpiYmBizZcsWz8MYY/bt22ckmfbt25trr73WrFmzxqxZs8Z0797dNG/e3Bw9erTCXjMyMowkk5GR4RnbtGmTiYiIMImJiebVV18169evNxMnTjSSzNKlSz11pfvrRRddZKZMmWLeffdd89xzz5nmzZv7bPuxY8easLAwM3PmTLNhwwazYMECk5CQYBwOh5kwYYIxxphDhw6Zxx57zEgyTz31lOdzHjp0yBjj3gdatmxpOnbsaBYvXmw2btxo7r77biPJvPjiixV+TsBfCDtABYYOHWqaNWvm+Yu7LKVfHuPHj/caLw0Jd999t9f4Rx99ZCSZ+++/3xhjzNatW40ks2bNmnLfY+7cuUbSeb8EK8Plcpni4mLz8MMPm5YtW5rTp08bY4wpLi420dHRZty4cV719913n4mIiDDff/+9McaYLVu2GEnmySef9KrLzc01UVFR5r777vOMDR482Egy7733XoU9nT592hQXF5usrCwjyXz66aeeXmNiYky/fv286vfv32/Cw8O9ws7LL79sJJk33njDqzYnJ8dIMk8//XSFPUyYMMFIMgsXLvQaf/TRR40k88EHH5T5utLt+fe//93Y7Xbzww8/eJaNHDnSq8dSpWGne/fupqSkxDP+8ccfG0nm5ZdfrrDXssJO586dTa9evUxxcbFX7fXXX29iY2ONy+UyxpzZX8/dL5944gkjyeTl5Rlj3GFNkpkxY4ZXXel2Lg07xhjz+uuv+/RTqnQf+Oijj7zGu3TpYq655poKPyfgL5zGAspx8uRJZWVlacyYMWrduvV562+++Wav5xkZGZLkOdxfqm/fvrrsssv03nvvSZIuueQSNW/eXDNmzNDixYu1Z88en3VffvnlkqQxY8botdde08GDB31qXC6XSkpKPI+zTxFs2rRJV111lRwOh+x2u8LDw/XAAw/o8OHDOnTokCSpQYMG+tWvfiWn06mCggLPOl966SUlJyerZcuWkqS1a9fKZrPpV7/6ldf7xcTEqGfPnj53CDVv3lxDhw716ffrr7/WuHHjFBMT4+lp8ODBkqTPP/9ckrR3717l5+drzJgxXq+98MILNWDAAK+xtWvXqlmzZrrhhhu8+vrZz36mmJiYSt+59Mtf/tLr+bhx4ySd+fOU3Kcdb7zxRrVs2dLT+/jx4+VyufTll19W6n0kaeTIkbLb7Z7nPXr0kCTt37+/0uuQpH/+85/64osvPL2f/fmvu+465eXlae/evV6vufHGG72en/veWVlZkuSz7VNTU9WgQYMq9RcTE6O+ffv6vF9VPydQXYQdoBxHjhyRy+VSfHx8pepjY2O9nh8+fLjMcUmKi4vzLHc4HMrKytLPfvYz3X///eratavi4uL04IMPeq4BGTRokNasWaOSkhKNHz9e8fHx6tatm15++WXPOi+++GKFh4d7Hg8//LAk6eOPP9bw4cMlua99+d///V/l5OTo97//vST3xdSlbr31Vp06dUqvvPKKJOndd99VXl6eJk2a5Kn517/+JWOMoqOjvd4vPDxcH374ob7//vsKt4skHT9+XImJifroo4/0yCOPKDMzUzk5OXI6nV49lW6j6Ohon3WcO/avf/1LR48eVUREhE9f+fn5Pn2VpUGDBp5QVyomJsarl2+//VaJiYk6ePCgFi5cqOzsbOXk5Oipp57y6r0yzn2vyMjIKq9Dcn92Sfrv//5vn89+9913S5LP5z/fe5e37cvaRudTVn1kZGSVPydQXVWL50A90qJFC9ntdp+Lictz7sWnpX/B5+Xl+QSm7777Tq1atfI87969u1555RUZY7Rz504tW7ZMDz/8sKKiojRz5kxJUnJyspKTk1VUVKQPP/xQ6enpGjdunNq3b6/+/fvrrbfe8lw0LbkDlSS98sorCg8P19q1a9WwYUPP8jVr1vh8hi5duqhv375aunSp7rjjDi1dulRxcXGesCRJrVq1ks1mU3Z2tucL8mznjpV1Ue6mTZv03XffKTMz03M0R5KOHj1a5jYs/TI/W35+vtfz0gtt169f71MrSU2aNClz/GwlJSU6fPiw15dz6fuUjq1Zs0YnTpyQ0+lUu3btPHU7duw47/prS+m+NGvWLKWkpJRZ06lTpyqt8+xt37ZtW8946TYCQglHdoByREVFafDgwXr99dcrdVTgXKWnbpYvX+41npOTo88//1zDhg3zeY3NZlPPnj01f/58NWvWTNu2bfOpiYyM1ODBgzVnzhxJ7lMqkjsw9enTx/MoDTs2m00NGjTwOl3y448/6qWXXiqz70mTJumjjz7SBx98oLfeeksTJkzweu31118vY4wOHjzo9X6lj+7du59325QGoHOD0TPPPOP1vFOnToqJifG5o+jbb7/V5s2bvcauv/56HT58WC6Xq8y+Kvtlv2LFCq/nK1eulOS+u6q83o0xevbZZ33WVVdHLzp16qSOHTvq008/LfOz9+nTp1Jh72yDBg2S5L5r7myrVq1SSUmJ11h1j0gBdYUjO0AF5s2bp4EDB6pfv36aOXOmLrnkEv3rX//Sm2++qWeeeabCL5BOnTrp9ttv11//+leFhYVpxIgR+uabb/THP/5RCQkJmjZtmiT3tSZPP/20Ro0apYsuukjGGDmdTh09elRXX321JOmBBx7QgQMHNGzYMMXHx+vo0aNauHCh13Uu5Rk5cqTmzZuncePG6fbbb9fhw4c1d+7cMo/KSNLYsWM1ffp0jR07VkVFRT7XHA0YMEC33367Jk2apK1bt2rQoEFq3Lix8vLy9MEHH6h79+666667KuzpyiuvVPPmzXXnnXfqwQcfVHh4uFasWKFPP/3Uqy4sLEyzZ8/WHXfcodTUVN166606evSoZs+erdjYWIWFnfn32i233KIVK1bouuuu09SpU9W3b1+Fh4frwIEDysjIUHJysm666aYK+4qIiNCTTz6p48eP6/LLL9fmzZv1yCOPaMSIERo4cKAk6eqrr1ZERITGjh2r++67T6dOndKiRYt05MgRn/V1795dTqdTixYtUu/evRUWFqY+ffpU2EN1PfPMMxoxYoSuueYaTZw4UW3bttUPP/ygzz//XNu2bdPrr79epfV17dpVY8eO1ZNPPim73a6hQ4dq9+7devLJJ+VwOLy2fekMyUuWLFGTJk3UsGFDdejQocqnu4BaE9DLo4EQsGfPHjN69GjTsmVLz63JEydONKdOnTLGnLm7JScnx+e1LpfLzJkzx1x66aUmPDzctGrVyvzqV78yubm5npovvvjCjB071lx88cUmKirKOBwO07dvX7Ns2TJPzdq1a82IESNM27ZtTUREhGnTpo257rrrTHZ2dqU+wwsvvGA6depkIiMjzUUXXWTS09PN888/bySZffv2+dSPGzfOSDIDBgyocJ39+vUzjRs3NlFRUebiiy8248ePN1u3bvXUDB482HTt2rXM12/evNn079/fNGrUyLRu3dr85je/Mdu2bfO5VdoYY5YsWWIuueQSExERYS699FLzwgsvmOTkZNOrVy+vuuLiYjN37lzTs2dP07BhQ3PBBReYzp07mzvuuMN89dVXFW6jCRMmmMaNG5udO3eapKQkExUVZVq0aGHuuusuc/z4ca/at956y/Mebdu2Nb/73e/MO++843NH0g8//GBSU1NNs2bNjM1mM6V/5ZbejfXnP//Zpw9J5sEHH6yw17LuxjLGmE8//dSMGTPGtGnTxoSHh5uYmBgzdOhQs3jxYk9NeftrWes8deqUmT59umnTpo1p2LChueKKK8yWLVuMw+Ew06ZN83r9ggULTIcOHYzdbvf6MyxvH5gwYUKZd6oBtcFmDNO8AggtR48e1aWXXqpRo0ZpyZIlflnnxIkTtWrVKh0/ftwv67OqzZs3a8CAAVqxYoXnTjUg2HEaC0BQy8/P16OPPqohQ4aoZcuW2r9/v+bPn69jx45p6tSpgW7P0jZu3KgtW7aod+/eioqK0qeffqrHH39cHTt2LPdCaCAYEXYABLXIyEh98803uvvuu/XDDz+oUaNGuuKKK7R48WJ17do10O1ZWtOmTbVhwwYtWLBAx44dU6tWrTRixAilp6d73dkHBDtOYwEAAEvj1nMAAGBphB0AAGBphB0AAGBp9eoC5dOnT+u7775TkyZNypzCHgAABB9j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\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_global_symmetric_coupling(cross_average_path_length, \\\"cross-average path length\\\", r\\\"\\\\mathcal{L}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"f87b8bdf-6188-4896-b258-d08409b209c8\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Global Cross-Clustering Coefficient\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"id\": \"24355550-7635-4f2f-a301-804369555685\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAosAAAHrCAYAAACn9tfQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRyElEQVR4nO3deVyU5f7/8feAOKACucROuOTaUfPkkpZHXLBMDSNPiy3a3rFFsr1OqS1aWqbndKyzVJ5OWno8o5VaqaXISS01/Vpux0oNDDJNAc1Qx+v3x/yYGOBWloFZeD0fDx4211xz87kHePeZuee+bpsxxggAAACoQIivCwAAAID/olkEAACAJZpFAAAAWKJZBAAAgCWaRQAAAFiiWQQAAIAlmkUAAABYolkEAACAJZpFAAAAWKJZBIJIy5YtNWbMmCo/bs+ePbLZbHrhhRe8VkvJNmfPnu21bQa6MWPGqGXLlrW2/blz52rGjBm1tv3q/n4BCGwNfF0AAMA75s6dq6+++kqZmZm1sv2FCxcqKiqqVrYNwH/RLAIISE6nUydPnpTdbvd1KUHv2LFjioiIULdu3XxdCgAf4DA0EADeffdddenSRXa7Xa1bt9bMmTM1ceJE2Wy2Mz72u+++0/XXX6+YmBjZ7XZ17NhRL774ok6dOlVu7qlTp/Tss8/qnHPOUXh4uLp3766PP/7YY87XX3+tm266SW3btlWjRo2UmJio4cOH68svv6z2/h0+fFj333+/WrduLbvdrpiYGF122WXasWOHpF8PaU+dOlXPPPOMWrVqJbvdrpUrV0qS3nvvPfXu3VuNGjVSZGSk0tLStHbtWo/v8eOPP+r2229XcnKy7Ha7zj77bF100UVasWKFe86mTZs0bNgw93OVkJCgoUOHKjc3t1L7MXfuXPXu3VtNmjRRkyZNdP755+u1116znH+6Q/U2m00TJ06sdP2pqalasmSJ9u7dK5vN5v4qcfz4cT3zzDPq0KGD+/E33XSTfvzxR4/v27JlSw0bNkwOh0PdunVTeHi4Jk2a5L6v9GHoVatWyWaz6e2339bjjz+uhIQERUVFadCgQdq5c6fHdo0xmjx5slJSUty/W8uXL1dqaqpSU1Mr9fwC8A3eWQT83IcffqiMjAz97ne/07x583Ty5Em98MIL+uGHH8742B9//FF9+vTR8ePH9fTTT6tly5ZavHixHnjgAX3zzTeaNWuWx/yXX35ZKSkpmjFjhk6dOqWpU6dqyJAhysrKUu/evSVJ33//vZo3b67nnntOZ599tn766Sf985//VK9evbRp0ya1b9++SvtXVFSkiy++WHv27NHDDz+sXr166ciRI1q9erXy8vLUoUMH99w//elPateunV544QVFRUWpbdu2mjt3rq677joNHjxYb7/9toqLizV16lSlpqbq448/1sUXXyxJuuGGG/TFF1/o2WefVbt27XT48GF98cUXOnjwoCTp6NGjSktLU6tWrfSXv/xFsbGxys/P18qVK1VUVHTG/XjyySf19NNPKyMjQ/fff7+io6P11Vdfae/evVV6Pqycqf5Zs2bp9ttv1zfffKOFCxd6PPbUqVNKT09Xdna2HnroIfXp00d79+7VhAkTlJqaqg0bNigiIsI9/4svvtD27dv1xz/+Ua1atVLjxo1PW9tjjz2miy66SP/4xz9UWFiohx9+WMOHD9f27dsVGhoqSXr88cc1ZcoU3X777crIyFBOTo5uvfVWnThxQu3atfPKcwSglhgAfq1Hjx4mOTnZFBcXu8eKiopM8+bNTdk/4ZSUFDN69Gj37UceecRIMp999pnHvD/84Q/GZrOZnTt3GmOM2b17t5FkEhISzLFjx9zzCgsLTbNmzcygQYMs6zt58qQ5fvy4adu2rbnvvvvc4yXbfOONN067f0899ZSRZJYvX245p2Rbbdq0McePH3ePO51Ok5CQYDp37mycTqd7vKioyMTExJg+ffq4x5o0aWIyMzMtv8eGDRuMJLNo0aLT1luRb7/91oSGhprrrrvutPNGjx5tUlJSyu1XRc+RJDNhwgT37TPVb4wxQ4cO9dh+ibfffttIMv/5z388xtevX28kmVmzZrnHUlJSTGhoqPt3o7Syv18rV640ksxll13mMW/+/PlGklm7dq0xxpiffvrJ2O12c/XVV3vMW7t2rZFk+vXrd9r9AuBbHIYG/NjRo0e1YcMGjRgxQg0bNnSPN2nSRMOHDz/j4z/55BN16tRJPXv29BgfM2aMjDH65JNPPMYzMjIUHh7uvh0ZGanhw4dr9erVcjqdkqSTJ09q8uTJ6tSpkxo2bKgGDRqoYcOG2rVrl7Zv317lffzggw/Url07DRo06IxzL7/8coWFhblv79y5U99//71uuOEGhYT8GmdNmjTRlVdeqXXr1unnn3+WJPXs2VOzZ8/WM888o3Xr1unEiRMe2z733HPVtGlTPfzww3r11Ve1bdu2ct//1KlTOnnypPur5DlZvny5nE6n7rrrrirvf2Wdqf7TWbx4sc466ywNHz7co/7zzz9fcXFxWrVqlcf8Ll26VOndvssvv7zc4yW531Vdt26diouLddVVV3nMu/DCC2v17HAA3kGzCPixQ4cOyRij2NjYcvdVNFbWwYMHFR8fX248ISHBfX9pcXFx5ebGxcXp+PHjOnLkiCRp/PjxeuKJJzRixAi9//77+uyzz7R+/Xp17dpVx44dq9R+lfbjjz8qKSmpUnPL7ktJ/Vb7eOrUKR06dEiSNG/ePI0ePVr/+Mc/1Lt3bzVr1kw33nij8vPzJUnR0dHKysrS+eefr8cee0znnXeeEhISNGHCBHdjdvPNNyssLMz9NXDgQPc+SKr0flTHmeo/nR9++EGHDx9Ww4YNPeoPCwtTfn6+Dhw44DG/oufzdJo3b+5xu+Sko5Lfh5KfU3V/jwH4Fp9ZBPxY06ZNZbPZKvx8YmWahObNmysvL6/c+Pfffy9JatGixRm3mZ+fr4YNG6pJkyaSpLfeeks33nijJk+e7DHvwIEDOuuss85YU1lnn312pU8gKXtCT0mTYrWPISEhatq0qSTXvs6YMUMzZszQd999p/fee0+PPPKI9u/frw8//FCS1LlzZ73zzjsyxmjLli2aPXu2nnrqKUVEROiRRx7RxIkTdffdd7u/R2RkpHsfJCk3N1fJycmV3veSd3GLi4s9xss28ZWt30qLFi3UvHlzy3kl+1GiMidOVUXJz8nq95h3FwH/xjuLgB9r3LixunfvrkWLFun48ePu8SNHjmjx4sVnfPzAgQO1bds2ffHFFx7jb775pmw2m/r37+8x7nA49Msvv7hvFxUV6f3331ffvn3dJyrYbLZyy9UsWbJE+/btq/L+SdKQIUP0v//9r9wh8cpo3769EhMTNXfuXBlj3ONHjx7Vf/7zH/cZ0mWdc845uvvuu5WWllbuuZFc+9i1a1e99NJLOuuss9xzWrZsqe7du7u/Sk7mGTx4sEJDQ/XKK69Uqf7Y2FiFh4dry5YtHuPvvvvuaR9nVb/dbq/w3d1hw4bp4MGDcjqdHvWX3Y/a0qtXL9ntds2bN89jfN26dV47AQhA7eGdRcDPPfXUUxo6dKguueQSjRs3Tk6nU9OmTVOTJk30008/nfax9913n958800NHTpUTz31lFJSUrRkyRLNmjVLf/jDH8p9Li00NFRpaWkaP368Tp06peeff16FhYXupVMkV+Mxe/ZsdejQQV26dNHGjRs1bdq0ah+CzczM1Lx585Senq5HHnlEPXv21LFjx5SVlaVhw4aVa2hLCwkJ0dSpU3Xddddp2LBhuuOOO1RcXKxp06bp8OHDeu655yRJBQUF6t+/v0aNGqUOHTooMjJS69evd59pLrk+1zdr1iyNGDFCrVu3ljFGDodDhw8fVlpa2mn3oWXLlnrsscf09NNP69ixY7r22msVHR2tbdu26cCBAx7PX2k2m03XX3+9Xn/9dbVp00Zdu3bV559/rrlz53rMq0z9kuudUYfDoVdeeUUXXHCBQkJC1L17d11zzTWaM2eOLrvsMo0bN049e/ZUWFiYcnNztXLlSqWnp+uKK66o1M+rOpo1a6bx48drypQpatq0qa644grl5uZq0qRJio+P9/i8KQA/5NPTawBUysKFC03nzp1Nw4YNzTnnnGOee+45c++995qmTZt6zCt7tqoxxuzdu9eMGjXKNG/e3ISFhZn27dubadOmeZw9XHJW7vPPP28mTZpkkpKSTMOGDU23bt3MRx995LG9Q4cOmVtuucXExMSYRo0amYsvvthkZ2ebfv36eZzVWtmzoUu2OW7cOHPOOeeYsLAwExMTY4YOHWp27Njhsa1p06ZV+PhFixaZXr16mfDwcNO4cWMzcOBA8+mnn7rv/+WXX8ydd95punTpYqKiokxERIRp3769mTBhgjl69KgxxpgdO3aYa6+91rRp08ZERESY6Oho07NnTzN79uwz1l/izTffND169DDh4eGmSZMmplu3bh77X/ZsaGOMKSgoMLfeequJjY01jRs3NsOHDzd79uzxOBu6MvUb4zrreOTIkeass84yNpvN42z5EydOmBdeeMF07drVXV+HDh3MHXfcYXbt2uWel5KSYoYOHVrh/lmdDf3vf//bY15FP/tTp06ZZ555xv271aVLF7N48WLTtWtXc8UVV1TyGQbgCzZjSh27ARAQTpw4ofPPP1+JiYlatmyZr8sBqmX37t3q0KGDJkyYoMcee8zX5QCwwGFoIADccsstSktLU3x8vPLz8/Xqq69q+/btmjlzpq9LAyrl//7v//T222+rT58+ioqK0s6dOzV16lRFRUXplltu8XV5AE6DZhEIAEVFRXrggQf0448/KiwsTL/97W+1dOnSSq1NCPiDxo0ba8OGDXrttdd0+PBhRUdHKzU1Vc8++yzL5wB+jsPQAAAAsMQpaAAAALBEswgAAABLNIsAAACwRLMIAAAASzSLAAAAsESzCAAAAEs0iwAAALBEs4gaGzNmjFq2bFmtx65Zs0YTJ07U4cOHy92Xmpqq1NTUGtUGa6tWrZLNZtOqVat8XQrgdfUpl1q2bKkxY8b4uoyAUJPfi/qMZhE19sQTT2jhwoXVeuyaNWs0adKkCkN51qxZmjVrVg2rA1AfkUuA93C5P9RYmzZtamW7nTp1qpXt1ifHjh1TRESEr8sA6hy5VD+dOHFCNptNDRrQ3ngT7yzWMxMnTpTNZtOmTZuUkZGhqKgoRUdH6/rrr9ePP/7oMffUqVOaOnWqOnToILvdrpiYGN14443Kzc31mFfR2/o2m0133323/vWvf6ljx45q1KiRunbtqsWLF3vU8uCDD0qSWrVqJZvN5nFYtOzhnj179shms+mFF17Q9OnT1apVKzVp0kS9e/fWunXryu3r3//+d7Vr1052u12dOnXS3LlzK30IwmazaeLEieXGyx7umT17tmw2m5YvX66bbrpJzZo1U+PGjTV8+HB9++237nl/+ctfFBISov3797vHXnzxRdlsNt11113usVOnTqlp06a6//773WOTJk1Sr1691KxZM0VFRem3v/2tXnvtNZW9UmfLli01bNgwORwOdevWTeHh4Zo0aZIkaceOHbr00kvVqFEjtWjRQnfeeaeKiorK7d+mTZs0bNgwxcTEyG63KyEhQUOHDi33Mwe8iVyqXC6dOHFCDz30kOLi4tSoUSNdfPHF+vzzzyuc+9VXXyk9PV1NmzZVeHi4zj//fP3zn/9032+MUWxsrEf+OJ1ONW3aVCEhIfrhhx/c49OnT1eDBg3c77SOGTNGTZo00ddff63LLrtMTZo0UXJysu6//34VFxe7H9ejRw8NHTrUo67OnTvLZrNp/fr17jGHwyGbzaYvv/xSkvT111/rpptuUtu2bdWoUSMlJiZq+PDh7vtLlHyU5l//+pfuv/9+JSYmym636+uvv5bkyuf27dvLbrerY8eOevPNNyt8rl555RV17dpVTZo0UWRkpDp06KDHHnvM8udQLxnUKxMmTDCSTEpKinnwwQfNRx99ZKZPn24aN25sunXrZo4fP+6ee/vttxtJ5u677zYffvihefXVV83ZZ59tkpOTzY8//uieN3r0aJOSkuLxfSSZli1bmp49e5r58+ebpUuXmtTUVNOgQQPzzTffGGOMycnJMffcc4+RZBwOh1m7dq1Zu3atKSgoMMYY069fP9OvXz/3Nnfv3u3e7qWXXmoWLVpkFi1aZDp37myaNm1qDh8+7J7717/+1UgyV155pVm8eLGZM2eOadeunUlJSSlXa0UkmQkTJpQbT0lJMaNHj3bffuONN4wkk5ycbG6++WbzwQcfmL/97W8mJibGJCcnm0OHDhljjNmxY4eRZObOnet+7KWXXmoiIiJM27Zt3WOfffaZkWSWLl3qHhszZox57bXXzPLly83y5cvN008/bSIiIsykSZPK1RYfH29at25tXn/9dbNy5Urz+eefm/z8fBMTE2MSExPNG2+8YZYuXWquu+46c8455xhJZuXKlcYYY44cOWKaN29uunfvbubPn2+ysrLMvHnzzJ133mm2bdt2xucMqC5yqXK5NHr0aGOz2cyDDz5oli1bZqZPn24SExNNVFSURy7t2LHDREZGmjZt2pg333zTLFmyxFx77bVGknn++efd86655hrTrl079+1169YZSSYiIsLMmTPHPT5kyBDTs2dPjzoaNmxoOnbsaF544QWzYsUK8+STTxqbzeaRS4888ohp0qSJ++eXn5/v3v6zzz7rnveHP/zBxMbGum9nZWWZ+++/3yxYsMBkZWWZhQsXmhEjRpiIiAizY8cO97yVK1caSSYxMdGMHDnSvPfee2bx4sXm4MGD7mxOT08377//vnnrrbfMueeea5KTkz2e67fffttIMvfcc49ZtmyZWbFihXn11VfNvffee8afR31Cs1jPlITyfffd5zE+Z84cI8m89dZbxhhjtm/fbiSZsWPHeswraWYee+wx95hVKMfGxprCwkL3WH5+vgkJCTFTpkxxj02bNs1IMrt37y5Xq1Uod+7c2Zw8edI9/vnnnxtJ5u233zbGGON0Ok1cXJzp1auXx/b27t1rwsLCaqVZvOKKKzzmffrpp0aSeeaZZ9xjSUlJ5uabbzbGGFNcXGwaN25sHn74YSPJ7N271xhjzLPPPmvCwsLMkSNHKqzL6XSaEydOmKee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\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 2 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_global_asymmetric_coupling(np.array(cross_global_clustering), \\\"global cross-clustering\\\", r\\\"\\\\mathcal{C}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"1e334508-8705-489b-bdfa-a7f190850486\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Cross-Transitivity\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"id\": \"a660fabf-8672-48e4-8488-6a6b3d6a071b\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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rrM6Ro0ape3bt2vZsmWSpNdff10VFRUeTbsvKr8L+cwzz0iSFi1apK1bt+rWW2/1R8kAQhhnQwMRrmnTpoqOjvY4IcWbqmc+VzZPJSUlHs3mjh071Lx5c9f9M888U/PmzZMxRl9++aVmz56thx56SPHx8br33nslSXl5ecrLy1NFRYU+/fRTTZkyRcOHD1fLli117rnn6l//+pcqKipcz5menl7t/axae1lZmRYtWqQJEya4fr4kVVRU6D//+U+1n7eqnJwc5eTkyOFwaO3atXrqqac0duxYpaSk6Iorrqjx8x7rggsuUHp6umbNmqULLrhAs2bNUvfu3XX66afX6nlvv/12XXbZZfriiy/09NNPq127durXr59fagYQuvhkEYhw8fHx6tmzp958802vJ3UcT+/evSVJr732mtv4mjVr9M0336hPnz4ej7HZbOrUqZOefPJJnXTSSfriiy885tjtdvXs2VOPPfaYJOeZ1JKz4ezSpYvrVtksVv2ErzpsNpuMMa7HVvrnP/8ph8NR7eexEh0dre7du7s+qfO2n5V8rT86OlpXX321Fi5cqKKiIq1du/aEZ41X5+dccsklOvnkk3XnnXdq+fLlGj16dEgujQTAv/hkEYCmTZum888/X927d9e9996rU045RTt37tQ777zjcYbssdq3b68bb7xRTz31lKKiojRw4EBt3bpV48ePV1ZWlu644w5JzkOazz77rIYMGaLWrVvLGKOCggLt3bvX9cnVgw8+qG3btqlPnz7KzMzU3r17NWPGDMXGxqpnz57HrT8hIUHZ2dl6++231adPHzVt2lTNmzc/7nftEhMT9cc//lGPP/64a25hYaFefPFFnXTSST6/hpI0c+ZMffjhhxo0aJBOPvlk/frrr3rppZckSX379rV83BlnnCFJev7555WQkKC4uDi1atXK47D3sUaNGqXHHntMw4cPV3x8vC6//PIT1neinxMdHa1bbrlF99xzjxo1alSrw9oAwkiAT7ABECQ2bdpkLrvsMtOsWTPToEEDc/LJJ5uRI0eaX3/91XU28Jo1azwe53A4zGOPPWbatWtnYmNjTfPmzc1VV11liouLXXO+/fZbc+WVV5o2bdqY+Ph4k5SUZLp162Zmz57tmrNo0SIzcOBAk5GRYRo0aGCSk5PNhRdeaIqKiqpV//Lly03nzp2N3W43ksyIESOMMb+fDf3zzz97PGbbtm3m0ksvNU2aNDEJCQlmwIAB5uuvvzbZ2dmuxxtjLPd/xYoVbmcXr1692lxyySUmOzvb2O1206xZM9OzZ0/zzjvvuD1OXs7cnj59umnVqpWJjo42ksysWbOMMZ5nQx+rR48eRpL505/+5HW7Lz+n0tatW40kc/PNN3t9TgCRx2aMMQHqUwEAQeapp57S7bffrq+//lodOnQIdDkAggDNIgBA69ev15YtW3TTTTfpvPPO08KFCwNdEoAgQbMIAFDLli1VWlqqnJwcvfrqq0pNTQ10SQCCBM0iAAAALLF0DgAAACzRLAIAAMASzSIAAAAs0SwCAADAEs0iAAAALNEsAgAAwBLNIgAAACzRLMJvRo4cqZYtW9bosatWrdLEiRO1d+9ej225ubnKzc2tVW2wtnLlStlsNq1cuTLQpQB1JpLyqWXLlho5cmSgywgJtfnvIpLQLMJvxo8fr7feeqtGj121apUmTZrkNYyfffZZPfvss7WsDkAkI5+AmosJdAEIH23atKmT5z399NPr5HkjyaFDhxQfHx/oMoCAIZ8i02+//SabzaaYGNqd2uCTxQg1ceJE2Ww2rV+/Xvn5+UpMTFRSUpKuuuoq/fzzz25zjx49qqlTp+rUU0+V3W5XcnKyrrnmGm3bts1tnreP8202m2699Va9+uqrOu2009SwYUN16tRJixYtcqvlrrvukiS1atVKNpvN7bBo1cM8W7dulc1m0xNPPKFp06apVatWaty4sc4991x9+umnHvv6wgsvqF27drLb7Tr99NM1d+7cah96sNlsmjhxosd41cM8s2fPls1m07Jly3TttdeqadOmatSokQYPHqwffvjBNe+ZZ55RVFSUdu3a5Rr729/+JpvNpltuucU1dvToUTVp0kR33nmna2zSpEnq3r27mjZtqsTERP3hD3/Qiy++qKpX7GzZsqUuuugiFRQUqHPnzoqLi9OkSZMkSd9++60GDBighg0bqnnz5rr55pu1b98+j/1bv369LrroIiUnJ8tutys9PV2DBg3y+J0DdYF8ql4+/fbbb7r77ruVmpqqhg0b6vzzz9fnn3/ude7XX3+tvLw8NWnSRHFxcTrrrLP08ssvu7YbY5SSkuKWQw6HQ02aNFFUVJR27tzpGp82bZpiYmJcn7SOHDlSjRs31vfff68LL7xQjRs3VlZWlu68805VVFS4Hte1a1cNGjTIra4zzzxTNptNa9ascY0VFBTIZrPpq6++kiR9//33uvbaa9W2bVs1bNhQGRkZGjx4sGt7pcqv1Lz66qu68847lZGRIbvdru+//16SM6fbt28vu92u0047Ta+88orX1+q5555Tp06d1LhxYyUkJOjUU0/V/fffb/l7iAgGEWnChAlGksnOzjZ33XWXef/99820adNMo0aNTOfOnc3hw4ddc2+88UYjydx6663mvffeMzNnzjQtWrQwWVlZ5ueff3bNGzFihMnOznb7OZJMy5YtTbdu3cz8+fPNkiVLTG5uromJiTH//ve/jTHGFBcXm9tuu81IMgUFBWb16tVm9erVpqyszBhjTM+ePU3Pnj1dz7llyxbX8w4YMMAsXLjQLFy40Jx55pmmSZMmZu/eva65//jHP4wkc+mll5pFixaZOXPmmHbt2pns7GyPWr2RZCZMmOAxnp2dbUaMGOG6P2vWLCPJZGVlmVGjRpl3333XPP/88yY5OdlkZWWZX375xRhjzLfffmskmblz57oeO2DAABMfH2/atm3rGvvss8+MJLNkyRLX2MiRI82LL75oli1bZpYtW2YefvhhEx8fbyZNmuRRW1pammndurV56aWXzIoVK8znn39uSktLTXJyssnIyDCzZs0yS5YsMX/605/MySefbCSZFStWGGOM2b9/v2nWrJnp0qWLmT9/viksLDRvvPGGufnmm82mTZtO+JoBtUU+VS+fRowYYWw2m7nrrrvM0qVLzbRp00xGRoZJTEx0y6dvv/3WJCQkmDZt2phXXnnFLF682Fx55ZVGknnsscdc86644grTrl071/1PP/3USDLx8fFmzpw5rvGBAweabt26udXRoEEDc9ppp5knnnjCLF++3Dz44IPGZrO55dO9995rGjdu7Pr9lZaWup7/0Ucfdc3785//bFJSUlz3CwsLzZ133mkWLFhgCgsLzVtvvWWGDBli4uPjzbfffuuat2LFCiPJZGRkmKFDh5p33nnHLFq0yOzZs8eV0Xl5eeZf//qXee2118wpp5xisrKy3F7r119/3Ugyt912m1m6dKlZvny5mTlzprn99ttP+PsIZzSLEaoyjO+44w638Tlz5hhJ5rXXXjPGGPPNN98YSWb06NFu8yqbmfvvv981ZhXGKSkppry83DVWWlpqoqKizJQpU1xjjz/+uJFktmzZ4lGrVRifeeaZ5siRI67xzz//3Egyr7/+ujHGGIfDYVJTU0337t3dnu/HH380sbGxddIsXnLJJW7zPvnkEyPJPPLII66xzMxMM2rUKGOMMRUVFaZRo0bmnnvuMZLMjz/+aIwx5tFHHzWxsbFm//79XutyOBzmt99+Mw899JBp1qyZOXr0qFtt0dHR5rvvvnN7zD333GNsNpvZsGGD23i/fv3cmsW1a9caSWbhwoXHf3GAOkI+nTifKvfd6jU6Np+uuOIKY7fbzU8//eQ2d+DAgaZhw4auBvaf//ynkeSa98gjj5hTTz3VXHzxxebaa681xhhz+PBh06hRI4/XVpKZP3++2/NfeOGFpn379q77y5cvN5LMRx99ZIwx5rXXXjMJCQlm9OjRplevXq55bdu2NcOHD7fc9yNHjpjDhw+btm3buu1/ZbP4xz/+0W2+w+Ew6enp5g9/+INbVm7dutXjtb711lvNSSedZPmzIxWHoSPcn/70J7f7w4YNU0xMjFasWCFJrn+rnlnXrVs3nXbaafrggw9O+DN69eqlhIQE1/2UlBQlJyfrxx9/rFXtgwYNUnR0tOt+x44dJcn1vN99951KS0s1bNgwt8edfPLJOu+882r1s61UfT179Oih7Oxs1+soSX369NHy5cslOb84f/DgQY0bN07NmzfXsmXLJEnLly/Xueeeq0aNGrke9+GHH6pv375KSkpSdHS0YmNj9eCDD2rPnj1uh7Ul52vRrl07t7EVK1aoQ4cO6tSpk9v48OHD3e6fcsopatKkie655x7NnDlTmzZtquGrAdQO+WStct+tXqNjffjhh+rTp4+ysrLcxkeOHKmDBw9q9erVkqS+fftKkiufli1bpn79+qlv376ubFq9erUOHDjgmlvJZrNp8ODBbmMdO3Z0ex3PO+88xcXFuT1/bm6uBgwY4MrC4uJibd682e35jxw5osmTJ+v0009XgwYNFBMTowYNGmjz5s365ptvPF6bSy+91O3+d999px07dmj48OGy2Wyu8ezsbPXo0cNtbrdu3bR3715deeWVevvtt7V7926P549ENIsRLjU11e1+TEyMmjVrpj179kiS69+0tDSPx6anp7u2H0+zZs08xux2uw4dOlSTki2f1263S5LreStrS0lJ8XistzF/qPp6Vo4d+zr17dtXP/30kzZv3qzly5erc+fOSk5OVu/evbV8+XIdOnRIq1atcgvLzz//XP3795fk/I7TJ598ojVr1uiBBx6QJI/X0tvva8+ePZb1HSspKUmFhYU666yzdP/996tDhw5KT0/XhAkT9Ntvv/nwagC1Qz5Zq3y81WtUda7Va3Tsc2VnZ6tNmzZavny5q4msbBa3bdum7777TsuXL1d8fLxHk9WwYUPFxcV57POvv/7quh8XF6fzzjvP1Sx+8MEH6tevn3Jzc+VwOFRUVORqSo/Nv3Hjxmn8+PEaMmSI/vWvf+mzzz7TmjVr1KlTJ6+/p6r7avVaeRu7+uqr9dJLL+nHH3/UpZdequTkZHXv3t1VV6SiWYxwpaWlbvePHDmiPXv2uMKm8t+SkhKPx+7YsUPNmzev+yJrqLL2Y7+YXanqflux2+1uX9CuZPV/Qt6et7S01C28+/TpI8n57r3ynXvl+AcffKCPPvpIFRUVbmE5b948xcbGatGiRRo2bJh69OihLl26WNZ97LvnSs2aNbOsr6ozzzxT8+bN0549e7RhwwZdfvnleuihh/S3v/3N8mcC/kY+nfjxVq9R1blWr5Ekt9epMocKCwt19OhR5ebm6rTTTlN6erqWLVum5cuXKycnx9X8+qpPnz76/PPP9fnnn2vbtm3q16+fEhIS1LVrV9fzt2vXzu1T0Ndee03XXHONJk+erAsuuEDdunVTly5dLD/1q5p/Vq+V1di1116rVatWqaysTIsXL5YxRhdddFGtP20OZTSLEW7OnDlu9+fPn68jR464zu7r3bu3JOcf67HWrFmjb775xtX41FbVd93+0L59e6Wmpmr+/Plu4z/99JNWrVpVredo2bKlvvzyS7exDz/8UPv37/c6v+rruWrVKv34449uZ0umpaXp9NNP13//939r3bp1rmaxX79++vnnnzVt2jQlJiaqa9eursdULv1w7GGtQ4cO6dVXX63WfkjOw20bN27U//zP/7iNz5071/IxNptNnTp10pNPPqmTTjpJX3zxRbV/HlBb5JO1ytfA6jU6Vp8+ffThhx+6msNKr7zyiho2bKhzzjnHNda3b1/t3LlT06dP1znnnOM6RN+nTx+99dZbWrNmjcchaF/07dtXR44c0fjx45WZmalTTz3VNb58+XLX122OZbPZPJrTxYsXa/v27dX6me3bt1daWppef/11t9Uj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FRUdd35hYaHOPvtsxcXFqXXr1po5c2Y9VWrNl30oKChQv3791KJFCyUmJurcc8/V+++/X4/VWvP1d1Hpk08+UUxMjM4666y6LbAafN2HiooKPfDAA8rOzpbdblebNm300ksv1VO11nzdjzlz5qhTp05q2LCh0tLSdO2112rPnj31VK2njz76SIMHD1Z6erpsNpsWLlx4wscE49+2r8Ihz6TwyLRwyDMpPDIt1PNMCnCmmQg3b948Exsba1544QWzadMmM2bMGNOoUSPz448/ep3/ww8/mIYNG5oxY8aYTZs2mRdeeMHExsaaBQsW1HPlv/N1H8aMGWMee+wx8/nnn5v//d//Nffdd5+JjY01X3zxRT1X7s7X/ai0d+9e07p1a9O/f3/TqVOn+inWQk324eKLLzbdu3c3y5YtM1u2bDGfffaZ+eSTT+qxak++7kdRUZGJiooyM2bMMD/88IMpKioyHTp0MEOGDKnnyn+3ZMkS88ADD5j//u//NpLMW2+9ddz5wfi37atwyDNjwiPTwiHPjAmPTAuHPDMmsJkW8c1it27dzM033+w2duqpp5p7773X6/y7777bnHrqqW5jN910kznnnHPqrMYT8XUfvDn99NPNpEmT/F2aT2q6H5dffrn5r//6LzNhwoSAh6uv+/Duu++apKQks2fPnvoor9p83Y/HH3/ctG7d2m3s73//u8nMzKyzGn1RnWANxr9tX4VDnhkTHpkWDnlmTHhkWrjlmTH1n2kRfRj68OHDWrdunfr37+823r9/f61atcrrY1avXu0x/4ILLtDatWv122+/1VmtVmqyD1UdPXpU+/btU9OmTeuixGqp6X7MmjVL//73vzVhwoS6LvGEarIP77zzjrp06aKpU6cqIyND7dq101/+8hcdOnSoPkr2qib70aNHD23btk1LliyRMUY7d+7UggULNGjQoPoo2S+C7W/bV+GQZ1J4ZFo45JkUHpkWqXkm+ffvO8afhYWa3bt3y+FwKCUlxW08JSVFpaWlXh9TWlrqdf6RI0e0e/dupaWl1Vm93tRkH6r629/+pgMHDmjYsGF1UWK11GQ/Nm/erHvvvVdFRUWKiQn8f8o12YcffvhBH3/8seLi4vTWW29p9+7dGj16tP7zn/8E7Ds+NdmPHj16aM6cObr88sv166+/6siRI7r44ov11FNP1UfJfhFsf9u+Coc8k8Ij08Ihz6TwyLRIzTPJv3/fEf3JYiWbzeZ23xjjMXai+d7G65Ov+1Dp9ddf18SJE/XGG28oOTm5rsqrturuh8Ph0PDhwzVp0iS1a9euvsqrFl9+F0ePHpXNZtOcOXPUrVs3XXjhhZo2bZpmz54d0E8XJd/2Y9OmTbr99tv14IMPat26dXrvvfe0ZcsW3XzzzfVRqt8E49+2r8Ihz7z9/FDMtHDIMyk8Mi0S80zy3993cLx9CZDmzZsrOjra493Frl27PLrxSqmpqV7nx8TEqFmzZnVWq5Wa7EOlN954Q9ddd53efPNN9e3bty7LPCFf92Pfvn1au3at1q9fr1tvvVWSM6SMMYqJidHSpUvVu3fveqm9Uk1+F2lpacrIyFBSUpJr7LTTTpMxRtu2bVPbtm3rtGZvarIfU6ZM0Xnnnae77rpLktSxY0c1atRIOTk5euSRR4L+Uzkp+P62fRUOeSaFR6aFQ55J4ZFpkZpnkn//viP6k8UGDRro7LPP1rJly9zGly1bph49enh9zLnnnusxf+nSperSpYtiY2PrrFYrNdkHyfnue+TIkZo7d25QfA/D1/1ITEzUV199pQ0bNrhuN998s9q3b68NGzaoe/fu9VW6S01+F+edd5527Nih/fv3u8b+93//V1FRUcrMzKzTeq3UZD8OHjyoqCj3OImOjpb0+zvZYBdsf9u+Coc8k8Ij08Ihz6TwyLRIzTPJz3/fPp8SE2YqT6l/8cUXzaZNm8zYsWNNo0aNzNatW40xxtx7773m6quvds2vPBX9jjvuMJs2bTIvvvhiwJea8HUf5s6da2JiYswzzzxjSkpKXLe9e/cGaheMMb7vR1XBcPagr/uwb98+k5mZaYYOHWo2btxoCgsLTdu2bc31118fqF0wxvi+H7NmzTIxMTHm2WefNf/+97/Nxx9/bLp06WK6desWqF0w+/btM+vXrzfr1683ksy0adPM+vXrXctlhMLftq/CIc+MCY9MC4c8MyY8Mi0c8syYwGZaxDeLxhjzzDPPmOzsbNOgQQPzhz/8wRQWFrq2jRgxwvTs2dNt/sqVK03nzp1NgwYNTMuWLc1zzz1XzxV78mUfevbsaSR53EaMGFH/hVfh6+/iWMESrr7uwzfffGP69u1r4uPjTWZmphk3bpw5ePBgPVftydf9+Pvf/25OP/10Ex8fb9LS0syf/vQns23btnqu+ncrVqw47n/nofK37atwyDNjwiPTwiHPjAmPTAv1PDMmsJlmMyaEPlMFAABAvYro7ywCAADg+GgWAQAAYIlmEQAAAJZoFgEAAGCJZhEAAACWaBYBAABgiWYRAAAAlmgWAQAAYIlmEQAAAJZoFhGxKioqVFpaql27dqmsrEwbN27Uk08+qSNHjgS6NADwGZmGuhIT6AKA+nTgwAE99dRT2rFjh9544w3t2rVLknTSSSdp2LBheuSRRxQTw58FgNBApqE+8F8QIkZZWZleeOEFjR49WomJidq9e7c+//xzrVy5Uunp6YqK4oN2AKGDTEN9sRljTKCLAOrD7t271bRpU0VFRckYo7S0NA0bNkx///vfA10aAPiMTEN94W0HIkbz5s1d77TXrl2rnTt36sILL3Sbc8kll6hJkyYaOnSo1+dYuHChxo4dW9elAsAJVSfTvGXWiXIOqIpmERFp8eLFio+PV25urtv47bffrldeecXycV9++aU6duxYx9UBgG+sMs1bZp0o54CqaBYRkRYvXqxevXopLi7ObbxXr15KSEiwfBzNIoBgZJVp3jLrRDkHVEWziIizc+dOrVu3ThdddJHPj924caM6dOhQB1UBQM0cL9PILPgDzSIizvz58xUXF+fz93UOHjyoqKgoxcfH11FlAOA7q0wjs+AvNIuIKB988IGef/55vfjii2rRooVPj/366695hw4gqBwv08gs+AvrLCKi9OnTR1999VWNHsv3FQEEm+NlGpkFf+GTReAYF1xwgS677DItWbJEmZmZWrNmjWvbV199RfACCBlWmXW8nAO8YVFuAAAAWOKTRQAAAFiiWQQAAIAlmkUAAABYolkEAACAJZpFAAAAWKJZBAAAgCWaRQAAAFiiWQQAAIAlmkUAAABYolkEAACAJZpFAAAAWPo/OxAGyVw+FwsAAAAASUVORK5CYII=\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 2 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_global_asymmetric_coupling(np.array(cross_transitivity), \\\"cross-transitivity\\\", r\\\"\\\\mathcal{T}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"711d6aef\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Local Measures\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"401c42a2-7077-4ce4-8654-4aa22a10132b\",\n   \"metadata\": {},\n   \"source\": [\n    \"For visualising the three-dimensional fields of local cross-network measures $m^{ij}_{v(\\\\vartheta,\\\\phi)}$, where $\\\\vartheta$ and $\\\\phi$ denote latitude and longitude, we choose to focus on their variation with height and latitude, and therefore consider zonal averages along circles of constant latitude,\\n\",\n    \"$$ m^{ij}(\\\\vartheta)=\\\\langle m^{ij}_{v(\\\\vartheta,\\\\phi)} \\\\rangle _\\\\phi \\\\,. $$\\n\",\n    \"\\n\",\n    \"When computing local asymmetric cross-network measures for two subnetworks $G_i$ and $G_j$, `climate.CoupledClimateNetwork` returns values for all vertices $v$ of the coupled network in form of a pair of Numpy arrays, i.e., tuples $(m_{\\\\,\\\\cdot}^{ij},m_{\\\\,\\\\cdot}^{ji})$ where $m_{\\\\,\\\\cdot}^{ij}$ is a 1-D Numpy array ordered by latitude *and* longitude. In order to select the measures of the nodes by latitude and longitude, we need to reshape the output array into a $N_{\\\\vartheta} \\\\times N_{\\\\phi}$ matrix, with $N_{\\\\vartheta}$/$N_{\\\\phi}$ being the number of latitude/longitude values. In our example, these numbers are the same for all 17 generated coupled climate networks.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"id\": \"aac4fd1e-1fae-48c7-9d26-692bf5a7a05c\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from typing import List, Tuple, Callable, Optional\\n\",\n    \"\\n\",\n    \"lat, lon = [\\n\",\n    \"    np.unique(coupled_network.grid_1.__getattribute__(f\\\"{coo}_sequence\\\")())\\n\",\n    \"    for coo in [\\\"lat\\\", \\\"lon\\\"]]\\n\",\n    \"X, Y = np.meshgrid(lat, hgt_averaged)\\n\",\n    \"\\n\",\n    \"def plot_zonal_coupling(\\n\",\n    \"    measure: List[Tuple[np.ndarray,...]], title: str, clabel: str,\\n\",\n    \"    vert_labels: Tuple[str, str] = tuple(\\n\",\n    \"        [f\\\"pointing {v}wards\\\" for v in ['up', 'down']]),\\n\",\n    \"    vert_indices: Tuple[str, str] = (r\\\"^{\\\\,1l}\\\", r\\\"^{\\\\,l1}\\\"),\\n\",\n    \"    transform: Optional[Callable[[np.ndarray], np.ndarray]] = None):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Zonal heat plot of a coupling network measure.\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    fig, axes = plt.subplots(1, 2, layout=\\\"constrained\\\")\\n\",\n    \"    fig.suptitle(title)\\n\",\n    \"    Z = np.zeros((VERTICAL_LEVELS, len(lat)))\\n\",\n    \"    \\n\",\n    \"    # plot both vertical directions of coupling\\n\",\n    \"    for vert in range(2):\\n\",\n    \"        # average over lon with same lat\\n\",\n    \"        for l in range(VERTICAL_LEVELS):\\n\",\n    \"            Z[l] = measure[l][vert].reshape(len(lat), len(lon)).mean(axis=1)\\n\",\n    \"        Z = Z if transform is None else transform(Z)\\n\",\n    \"        ax = axes[vert]\\n\",\n    \"        pcm = ax.pcolormesh(X, Y, Z)\\n\",\n    \"        ax.set_title(vert_labels[vert])\\n\",\n    \"        ax.set_xlabel(r\\\"Latitude $\\\\vartheta$ (°N)\\\")\\n\",\n    \"        if vert == 0:\\n\",\n    \"            ax.set_ylabel(r\\\"$Z_{\\\\,l}$ (km)\\\")\\n\",\n    \"        fig.colorbar(\\n\",\n    \"            pcm, ax=ax,\\n\",\n    \"            label=r\\\"${}\\\".format(clabel) + vert_indices[vert] + r\\\"(\\\\vartheta)$\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"6bc0c10e\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Cross-Degree\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"id\": \"4d00102f-8f4b-4788-8cd6-99ec9f87ba6f\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAosAAAHrCAYAAACn9tfQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABjuUlEQVR4nO3de1wU5f4H8M9wW0AuisouKCEaeMMLv7znCbxAkpqmpaamdjFLrdTKMo+KHoWjFdnR0rRSS8nspN00FVPRQhMt09DMChRNpAhBFEF2n98fHiZXdhXYnb3N5/16zat29tmZZ2fj03fmmYskhBAgIiIiIjLBzd4dICIiIiLHxWKRiIiIiMxisUhEREREZrFYJCIiIiKzWCwSERERkVksFomIiIjILBaLRERERGQWi0UiIiIiMovFIhERERGZxWKRiMiM3NxcSJKE1atX27srRER2w2KRiIiIiMxisUhEdlFWVgY+mt68srIye3eBiAgAi0UispKffvoJDz74ILRaLTQaDW677TaMGTMG5eXlWL16NSRJwvbt2/HII4+gcePG8PX1RXl5OQwGAxYtWoRWrVpBo9EgODgYY8aMwZkzZ4yW//3332PAgAEIDg6GRqNBaGgo+vfvb9Tuo48+QteuXREYGAhfX180b94cjzzySI36//vvv2PYsGHw9/dHYGAghg8fjvz8fJNtDx48iHvvvRdBQUHw9vZGTEwMNmzYUK3d119/je7du8Pb2xtNmjTBrFmz8Pbbb0OSJOTm5srtmjVrhgEDBmDjxo2IiYmBt7c35s6dCwDIz8/HhAkT0LRpU3h5eSEiIgJz585FZWWl0boqKiowf/58eTs2btwYDz/8MP74448afX8iInM87N0BInJ+P/zwA3r27IlGjRph3rx5iIyMxLlz5/DZZ5+hoqJCbvfII4+gf//+eP/993Hp0iV4enriySefxIoVKzB58mQMGDAAubm5mDVrFnbv3o3vvvsOjRo1wqVLlxAfH4+IiAi88cYb0Gq1yM/Px65du3Dx4kUAwL59+zB8+HAMHz4cSUlJ8Pb2xqlTp7Bz585b9r+srAx9+/bF77//jpSUFERFRWHz5s0YPnx4tba7du1Cv3790LVrVyxfvhyBgYFYv349hg8fjsuXL2PcuHEAgCNHjiA+Ph5RUVFYs2YNfH19sXz5cqxdu9ZkH7777jscP34c//znPxEREYF69eohPz8fXbp0gZubG2bPno0WLVpg3759mD9/PnJzc7Fq1SoAgMFgwKBBg7B3715Mnz4dPXr0wKlTpzBnzhzExcXh4MGD8PHxqe3PSkR0jSAislDv3r1F/fr1RUFBgcn3V61aJQCIMWPGGM0/fvy4ACAmTpxoNP/bb78VAMRLL70khBDi4MGDAoD45JNPzPbhlVdeEQDEhQsXat3/ZcuWCQDi008/NZo/fvx4AUCsWrVKnteqVSsRExMjrl69atR2wIABIiQkROj1eiGEEA888ICoV6+e+OOPP+Q2er1etGnTRgAQOTk58vzw8HDh7u4uTpw4YbTMCRMmCD8/P3Hq1CmT3zU7O1sIIcQHH3wgAIiPP/7YqF1WVpYAIN58883abRAioutwGJqILHL58mVkZGRg2LBhaNy48U3bDh061Oj1rl27AEA+GlelS5cuaN26Nb766isAwO23344GDRrghRdewPLly3Hs2LFqy+7cuTMAYNiwYdiwYQPOnj1brY1er0dlZaU8GQwGuR/+/v649957jdqPHDnS6PUvv/yCn376CaNGjQIAo2Xdc889OHfuHE6cOAEAyMjIQO/evdGoUSP5825ubhg2bJjJbdO+fXtERUUZzfviiy/Qq1cvhIaGGq0rMTFRXkdVu/r162PgwIFG7Tp27AidTofdu3ebXCcRUU2wWCQiixQVFUGv16Np06a3bBsSEmL0urCw0OR8AAgNDZXfDwwMREZGBjp27IiXXnoJbdu2RWhoKObMmYOrV68CAO666y588sknqKysxJgxY9C0aVNER0fjgw8+kJfZokULeHp6ytO8efPkfmi12mp90Ol0Rq/Pnz8PAHjuueeMluPp6YmJEycCAP7888+bLtPUPHPb4Pz58/j888+rratt27ZG6zp//jwuXLgALy+vam3z8/PldkREdcFzFonIIkFBQXB3d692QYopkiQZvW7YsCEA4Ny5c9WKzd9//93oqFy7du2wfv16CCFw5MgRrF69GvPmzYOPjw9efPFFAMCgQYMwaNAglJeXY//+/UhJScHIkSPRrFkzdO/eHZ9//jnKy8vlZYaGhsr9OHDgQLX+3niBS1V/ZsyYgSFDhpj8ji1btpSXWVVc3myZVW7cNlXra9++PRYsWGDyM1X9b9SoERo2bIitW7eabOfv729yPhFRTbBY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\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 4 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_zonal_coupling(cross_degree, \\\"cross-degree\\\", \\\"k\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"a9035fe5\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Cross-Closeness\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"id\": \"31c0412b-736e-472f-b77a-f71e228728f3\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAAosAAAHrCAYAAACn9tfQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABgLElEQVR4nO3dd3wUdf7H8fembQIp1DQIISJV6tEEVGqQCAg2QFSK5eQQPcCK/JRySk5UDk8F1EMQRdG7AxuoBKkKKKIcCIioQFAJSKSXhGS/vz8wK0uymGQnu5vN6/l4zONuZ2fm+51Z8vaz852ZtRljjAAAAIAiBPm6AwAAAPBfFIsAAABwi2IRAAAAblEsAgAAwC2KRQAAALhFsQgAAAC3KBYBAADgFsUiAAAA3KJYBAAAgFsUiwAqrLp162rYsGG+7gYA+DWKRQAAALhFsQjAEqdOnRI/NQ8AgYdiEUCRvvnmG914442Ki4uT3W5XnTp1NGTIEOXk5Gju3Lmy2WxaunSpbr31VtWsWVOVKlVSTk6OHA6Hpk6dqkaNGslutys2NlZDhgzRjz/+6LL9r776Sn369FFsbKzsdrsSExPVu3dvl+X+/e9/q3379oqJiVGlSpV00UUX6dZbby1W/3NycjR58mQ1btxY4eHhql69urp27aq1a9decL3MzEzdfPPNzn41btxYTz/9tBwOh8tyM2fOVIsWLRQZGamoqCg1atRIDz/8sMsyWVlZuvPOO1W7dm2FhYUpJSVFkyZNUl5ennOZ3bt3y2az6amnntK0adOUkpKiyMhIdejQQevXry/Uvy+++EJXX321qlWrpvDwcLVq1UpvvfWWyzInT57Ufffdp5SUFIWHh6tatWpq06aN3njjDecyP/zwgwYNGqTExETZ7XbFxcWpe/fu2rRpU7GOL4CKI8TXHQDgf/73v//psssuU40aNTR58mTVr19f+/bt07vvvqvc3Fzncrfeeqt69+6tV199VSdOnFBoaKj+8pe/6MUXX9SoUaPUp08f7d69W4888ohWrlypL7/8UjVq1NCJEyeUmpqqlJQUPf/884qLi1NWVpZWrFihY8eOSZLWrVungQMHauDAgZo4caLCw8O1Z88eLV++/A/7n5eXp7S0NK1Zs0ajR49Wt27dlJeXp/Xr1yszM1MdO3Yscr1ffvlFHTt2VG5urv72t7+pbt26ev/993Xffffp+++/14wZMyRJCxYs0MiRI3X33XfrqaeeUlBQkL777jtt27bNua2srCy1a9dOQUFBevTRR1WvXj2tW7dOjz32mHbv3q05c+a4tP3888+rUaNGmj59uiTpkUce0VVXXaVdu3YpJiZGkrRixQr16tVL7du316xZsxQTE6MFCxZo4MCBOnnypPP6y7Fjx+rVV1/VY489platWunEiRP6+uuvlZ2d7WzvqquuUn5+vqZOnao6dero4MGDWrt2rQ4fPvyHxxdABWMA4DzdunUzVapUMQcOHCjy/Tlz5hhJZsiQIS7zt2/fbiSZkSNHusz/7LPPjCTz8MMPG2OM+eKLL4wk8/bbb7vtw1NPPWUkmcOHD5e4//PmzTOSzEsvvXTB5ZKTk83QoUOdrx966CEjyXz22Wcuy/3lL38xNpvN7NixwxhjzKhRo0yVKlUuuO0777zTREZGmj179rjML9ivrVu3GmOM2bVrl5FkmjVrZvLy8pzLff7550aSeeONN5zzGjVqZFq1amXOnDnjss0+ffqYhIQEk5+fb4wxpmnTpqZ///5u+3bw4EEjyUyfPv2C+wAAxhjDMDQAFydPntSqVas0YMAA1axZ84LLXnfddS6vV6xYIUmF7jBu166dGjdurI8//liSdPHFF6tq1ap68MEHNWvWLJczcgXatm0rSRowYIDeeust/fTTT4WWyc/PV15ennMqGCr+4IMPFB4eXuwh6wLLly9XkyZN1K5dO5f5w4YNkzHGeVazXbt2Onz4sG688Ua98847OnjwYKFtvf/+++ratasSExNd+piWliZJWrVqlcvyvXv3VnBwsPN18+bNJUl79uyRJH333Xf65ptvdNNNN0mSyzavuuoq7du3Tzt27HD274MPPtBDDz2klStX6tSpUy5tVatWTfXq1dOTTz6padOm6auvvio0zA4ABSgWAbg4dOiQ8vPzVbt27T9cNiEhweV1wTDn+fMlKTEx0fl+TEyMVq1apZYtW+rhhx/WJZdcosTERE2YMEFnzpyRJF1xxRV6++23lZeXpyFDhqh27dpq2rSpy3V39erVU2hoqHOaPHmypLPDyYmJiQoKKlnEZWdnu+37uft3yy236OWXX9aePXt03XXXKTY2Vu3bt1dGRoZznf379+u9995z6V9oaKguueQSSSpUYFavXt3ltd1ulyRnobd/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hI4dO1Zo/7766iv16dNHsbGxstvtSkxMVO/evQt95kBZIaOKl1FnzpzRAw88oPj4eFWqVEmXXXaZPv/88yKX/frrr9WvXz9VrVpV4eHhatmypV555RXn+8YYxcXFuWRRfn6+qlatqqCgIO3fv985f9q0aQoJCXGeaR02bJgiIyP13Xff6aqrrlJkZKSSkpJ07733Kicnx7le27Zt1bt3b5d+NWvWTDabTRs2bHDOW7hwoWw2m7Zs2SJJ+u677zR8+HDVr19flSpVUq1atdS3b1/n+wUKLqt59dVXde+996pWrVqy2+367rvvJJ3N6oYNG8put6tx48aaN29ekcdq5syZatGihSIjIxUVFaVGjRrp4Ycfdvs5wI8YWGbChAlGkklOTjb333+/+eijj8y0adNM5cqVTatWrUxubq5z2T//+c9Gkhk1apT58MMPzaxZs0zNmjVNUlKS+eWXX5zLDR061CQnJ7u0I8nUrVvXtGvXzrz11ltmyZIlpkuXLiYkJMR8//33xhhj9u7da+6++24jySxcuNCsW7fOrFu3zhw5csQYY0znzp1N586dndvctWuXc7u9evUyb7/9tnn77bdNs2bNTNWqVc3hw4edy77wwgtGkrnuuuvM+++/b+bPn28aNGhgkpOTC/W1KJLMhAkTCs1PTk42Q4cOdb6eM2eOkWSSkpLMrbfeaj744APz4osvmtjYWJOUlGQOHTpkjDHmm2++MZLM66+/7ly3V69eJiIiwtSvX98577PPPjOSzJIlS5zzhg0bZmbPnm0yMjJMRkaG+dvf/mYiIiLMpEmTCvUtISHBXHTRRebll182K1asMJ9//rnJysoysbGxplatWmbOnDlmyZIl5qabbjJ16tQxksyKFSuMMcYcP37cVK9e3bRp08a89dZbZtWqVebNN980I0aMMNu2bfvDYwZYgYwqXkYNHTrU2Gw2c//995ulS5eaadOmmVq1apno6GiXjPrmm29MVFSUqVevnpk3b55ZvHixufHGG40k88QTTziXGzRokGnQoIHz9fr1640kExERYebPn++cn5aWZtq1a+fSj7CwMNO4cWPz1FNPmWXLlplHH33U2Gw2l4x66KGHTGRkpPPzy8rKcm7/8ccfdy73l7/8xcTFxTlfr1q1ytx7773mP//5j1m1apVZtGiR6d+/v4mIiDDffPONc7kVK1YY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QEa5V3AM3B2jc3Xv3l3Lly93FocF5s2bp0qVKunSSy91zuvRo4f279+v6dOn69JLL3UO0Xfv3l2LFi3Shg0bCg1Bl0SPHj2Ul5enRx55RLVr11ajRo2c85ctW+a85OZcNputUHG6ePFi/fTTT8Vqs2HDhkpISNAbb7zh8gSJPXv2XPBYV65cWWlpaRo/frxyc3O1devW4u4mfIQHJJWBhQsXKiQkRKmpqdq6daseeeQRtWjRwnkNTcOGDfXnP/9Zzz77rIKCgpSWlqbdu3frkUceUVJSksaMGWNJP5o1ayZJeuaZZzR06FCFhoaqYcOGLtcRlVRQUJAmTZqkO++8U9dff71uvfVWHT58WJMmTVJCQoKCgv74+8ctt9yiRx55RI8++qg6d+6sbdu26bnnnlNMTEyRy3/xxRe6/fbbdcMNN2jv3r0aP368atWqpZEjR7os1717dz377LOKiIhwXpuUkpKilJQULV26VFdffbXLNUe9e/fWtGnTNHjwYP35z39Wdna2nnrqqRJ9sx89erRefvll9e7dW4899pji4uI0f/58ffPNNy7Lvf/++5oxY4b69++viy66SMYYLVy4UIcPH3YWtoC3kFHuNW7cWDfffLOmT5+u0NBQ9ejRQ19//bWeeuopRUdHuyw7YcIEvf/+++rataseffRRVatWTfPnz9fixYs1depUl0zr1q2bbDabli5d6nzslnS2mBs6dKjz/5dW69atVbVqVS1dulTDhw932f7f/va3Irffp08fzZ07V40aNVLz5s21ceNGPfnkk6pdu3ax2gwKCtLf/vY33X777brmmmt0xx136PDhw5o4cWKhYeg77rjDmc0JCQnKyspSenq6YmJiXL7Ew0/5+AabgFJwp+HGjRtN3759TWRkpImKijI33nij2b9/v8uy+fn55oknnjANGjQwoaGhpkaNGubmm282e/fudVnO3Z2Gd911V6H2z7+b2Bhjxo0bZxITE01QUJDL3bnu7jR88sknC21XRdy9/OKLL5qLL77YhIWFmQYNGpiXX37Z9OvXz7Rq1erCB8mcvVv5gQceMElJSSYiIsJ07tzZbNq0ye3d0EuXLjW33HKLqVKliomIiDBXXXWV2blzZ6HtvvPOO0aSSU1NdZl/xx13GEnmn//8Z6F1Xn75ZdOwYUNjt9vNRRddZNLT083s2bML3aGZnJxs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0jR//nwtX75cTz/9tDZs2KBu3bq5vbkmPT1dMTExzikpKanM+gaUa8aiqZyZMmWK1qxZox49emjz5s2SpNOnT+uJJ55Q8+bNy7TtkuaZRKYBxVYBM60s86zEN7i0aNFCXbt21datWwu9d+DAAVWtWtWjDl3IwIED1bt3bzVt2lR9+/bVBx98oG+//VaLFy8ucvlx48bpyJEjzmnv3r1l1jcA5U+NGjW0bt06hYWFqWXLloqIiFBUVJTee+89Pfnkk2XadknzTCLTALhXlnlWomLRZrNp7ty56tatm7p27aqvv/660DLGeK8UT0hIUHJysnbu3Fnk+3a7XdHR0S4TgCL48Fv4jBkzlJKSovDwcLVu3Vpr1qwp1nqffvqpQkJC1LJly9I1/Jvk5GQtWbJEe/bs0Ztvvql3331X3377rTp06ODRdkvqj/JMItOAYvNRpgVqnpXoBhdjjIKDgzV//nzddNNN6tatm5YvX66mTZs6l7HZvPfE8+zsbO3du1cJCQleaxMIRL76HdU333xTo0eP1owZM9SpUye98MILSktL07Zt21SnTh236x05ckRDhgxR9+7dtX//fg96/bukpCSfDuuSZ4B1fJFpgZxnpXrOYlBQkObPn68ePXqoW7du2rJliyWdOX78uDZt2qRNmzZJknbt2qVNmzYpMzNTx48f13333ad169Zp9+7dWrlypfr27asaNWrommuusaR9AN41bdo03Xbbbbr99tvVuHFjTZ8+XUlJSZo5c+YF17vzzjs1ePBgr5/9KwnyDKhYAjnPSjwM7VwxKEivvfaas2AsuJjSE1988YVatWqlVq1aSZLGjh2rVq1a6dFHH1VwcLC2bNmifv36qUGDBho6dKgaNGigdevWKSoqyuO2AVjj/Lt13d2wkZubq40bN6pnz54u83v27Km1a9e63f6cOXP0/fffa8KECZb222rkGRAYipNpgZ5nJR6GPldBwXjzzTere/fueu211zzqTJcuXS54zeNHH33k0fYBuGHhA2zPH/qYMGGCJk6cWGjxgwcPKj8/X3FxcS7z4+LilJWVVWQTO3fu1EMPPaQ1a9YoJMS/f9qePAN8yMuZFuh5VqLeLV68WDExMS7zCgrGW265xe2vFACoOPbu3ety44Xdbr/g8udf52yMKfLa5/z8fA0ePFiTJk1SgwYNrOksAPyBkmRaoOZZ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yxZz4403moSEhHK7T+X1czLGmM8//9yEhISYxx9/3OzcudPMnz/fVKpUybz22mvOZcrj5wX/QJ75r0DMNPIssFAsXsC54Xry5EnTs2dPU7NmTRMaGmrq1Kljhg4dajIzM33byT8wcOBAk5CQYEJDQ01iYqK59tprzdatW53vOxwOM2HCBBMfH2/sdru54oorzJYtW3zY4z92oX0qr59Tgffee880bdrU2O1206hRI/Piiy+6vF8ePy/4B/LMfwVqppFngcNmjDG+PrsJAAAA/8Q1iwAAAHCLYhEAAABuUSwCAADALYpFAAAAuEWxCAAAALcoFgEAAOAWxSIAAADcolgEAACAWxSLAAAAcItiEQAAAG5RLFZAXbp00ejRo/1+299995169eqlqKgotWvXTpmZmRdcPjs7W7Gxsdq9e7cl7Re4/vrrNW3aNEu3CcA6ZFrJkGkoKYpFPzds2DD179+/1OsXFXQLFy7U3/72twsu42vHjh1TamqqmjZtqi+//FJVq1b9wz6mp6erb9++qlu3rnPe8ePHNWjQICUkJGjQoEE6ceKEpLPH1Waz6e9//7vLNt5++23ZbDaXeY8++qgef/xxHT161JJ9AyoyMo1MQ/lDsVgBVatWTVFRUb7uxgUtWrRINptNTz75pOrXr68RI0YoIyPD7fKnTp3S7Nmzdfvtt7vMnz59uiIjI7V06VJVqlRJ06dPd74XHh6uJ554QocOHbpgX5o3b666detq/vz5Hu0TgLJBpp1FpqGsUCyWYx9++KEuu+wyValSRdWrV1efPn30/fffO98fNmyYVq1apWeeeUY2m002m027d+92+dbtbpm6deu6hJAktWzZUhMnTnS+PnHihIYMGaLIyEglJCTo6aefLtRHY4ymTp2qiy66SBEREWrRooX+85///OG+ffvtt4qJiXF+I65cubJOnjzpdvkPPvhAISEh6tChg8v8w4cPq0GDBmrWrJkaNWqkI0eOON/r0aOH4uPjlZ6e/of9ufrqq/XGG2/84XIASo9M+x2ZBn9CsViOnThxQmPHjtWGDRv08ccfKygoSNdcc40cDock6ZlnnlGHDh10xx13aN++fdq3b5+SkpJctlGcZdy5//77tWLFCi1atEhLly7VypUrtXHjRpdl/u///k9z5szRzJkztXXrVo0ZM0Y333yzVq1adcFtX3zxxdq0aZP++9//6syZM9qzZ49iY2PdLr969Wq1adOm0PxRo0bphRdeUGhoqObMmaO//vWvzveCg4M1ZcoUPfvss/rxxx8v2J927drp888/V05OzgWXA1B6ZNrvyDT4kxBfdwCld91117m8nj17tmJjY7Vt2zY1bdpUMTExCgsLU6VKlRQfH1/kNoqzTFGOHz+u2bNna968eUpNTZUkvfLKK6pdu7ZzmRMnTmjatGlavny589vxRRddpE8++UQvvPCCOnfuXGi7W7duVfv27bV582bddtttuummm3TmzBkFBwera9eubvuze/duJSYmFppft25d7dy5UwcOHFBcXFyha3euueYatWzZUhMmTNDs2bPdbr9WrVrKyclRVlaWkpOTL3xwAJQKmfY7Mg3+hDOL5dj333+vwYMH66KLLlJ0dLRSUlIk6Q/vsLOq7dzcXJchkmrVqqlhw4bO19u2bdPp06eVmpqqyMhI5zRv3jyXoaVzbd26VZUrV9ZFF12kf/3rXzp+/LgyMzPVuHFjdenSxW1/Tp06pfDw8CLfCwoKUnx8fKFQLfDEE0/olVde0bZt29xuPyIiQpIuOGwEwDNk2u/INPgTziyWY3379lVSUpJeeuklJSYmyuFwqGnTpsrNzfV420FBQTLGuMw7c+aM8/+f/15RCoaOFi9erFq1arm8Z7fbi1wnOztbcXFxztchISEKDw/Xtm3bCp11OFeNGjX+8KJud6644gpdeeWVevjhhzVs2LAil/n1118lSTVr1ixVGwD+GJn2OzIN/oRisZzKzs7W9u3b9cILL+jyyy+XJH3yySeFlgsLC1N+fv4Ft1XUMjVr1tS+ffucr48ePapdu3Y5X1988cUKDQ3V+vXrVadOHUnSoUOH9O233zqHYpo0aSK73a7MzMwih2eKEhUVpf3797vMmzRpknr37q0GDRq4Xa9Vq1Z67bXXitVGUf7+97+rZcuWbtv4+uuvVbt2bdWoUaPUbQBwj0xzRabBn1AslgNHjhzRpk2bXOZVq1ZN1atX14svvqiEhARlZmbqoYceKrRu3bp19dlnn2n37t2KjIxUtWrVirVMt27dNHfuXPXt21dVq1bVI488ouDgYOc6kZGRuu2223T//ferevXqiouL0/jx4xUU9PuVDVFRUbrvvvs0ZswYORwOXXbZZTp69KjWrl2ryMhIDR06tFBfunbtqsOHD2vKlCm69dZbNX/+fP3nP//RZ599dsFjdOWVV2rcuHE6dOiQqlat+keHtJBmzZrppptu0rPPPlvk+2vWrFHPnj1LvF0AhZFpZBrKGQO/NnToUCOp0DR06FCTkZFhGjdubOx2u2nevLlZuXKlkWQWLVrkXH/Hjh3m0ksvNREREUaS2bVrl+ncubP561//esFljhw5YgYMGGCio6NNUlKSmTt3rmnRooWZMGGCc71jx46Zm2++2VSqVMnExcWZqVOnFtq2w+EwzzzzjGnYsKEJDQ01NWvWNFdeeaVZtWqV232eP3++qV27tomIiDC9e/c23333XbGO1aWXXmpmzZpV7OPar18/l3m7d+82drvdnP9ncerUKRMdHW3WrVtXrG0DcI9MI9NQ/tiMKcaFGkA5sGTJEt133336+uuvXc4GeOr555/XO++8o6VLl1q2TQD4I2Qa/AXD0AgYV111lXbu3Kmffvqp2M9VK47Q0FC3QzkAUFbINPgLziwCAADALZ6zCAAAALcoFgEAAOAWxSIAAADcolgEAACAWxSLAAAAcItiEQAAAG5RLAIAAMAtikUAAAC4RbEIAAAAt/4f7iClqEw7tVYAAAAASUVORK5CYII=\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 4 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_zonal_coupling(cross_closeness, \\\"cross-closeness\\\", \\\"c\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"c72290fc\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Cross-Betweenness\\n\",\n    \"\\n\",\n    \"In contrast to the previous two local measures, cross-betweenness $b^{ij}_w$ is defined for $w\\\\in V_i \\\\cup V_j$ and is *symmetric* w.r.t. exchanging the involved subnetworks. Therefore, in the following we analyse the zonally averaged fields of cross-betweenness\\n\",\n    \"for vertices taken from a specific isobaric subnetwork $i$,\\n\",\n    \"$$ b^{ij}_i(\\\\vartheta)=\\\\langle b^{ij}_{w(\\\\vartheta,\\\\phi)}\\\\rangle_{\\\\phi,w\\\\in V_i}\\\\,.$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"id\": \"80f0b4a6-4505-4e15-b3c3-63208e3f93e6\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 4 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"def clip_log(Z):\\n\",\n    \"    neg = Z <= 1\\n\",\n    \"    return np.where(neg, 0, np.log10(Z, where=np.logical_not(neg)))\\n\",\n    \"\\n\",\n    \"plot_zonal_coupling(\\n\",\n    \"    cross_betweenness, \\\"cross-betweenness\\\", \\\"log_{10}b\\\",\\n\",\n    \"    vert_labels=(\\\"near ground\\\", \\\"upper level\\\"),\\n\",\n    \"    vert_indices=(r\\\"_{\\\\,1}^{\\\\,1l}\\\", r\\\"_{\\\\,l}^{\\\\,1l}\\\"),\\n\",\n    \"    transform=clip_log)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"pyunicorn312\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.12.2\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  },
  {
    "path": "docs/source/examples/tutorials/EventSeriesAnalysis.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"12877375\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tutorial: Event Series Analysis \"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"efc240da\",\n   \"metadata\": {},\n   \"source\": [\n    \"*Originally written as part of a PhD thesis in Physics by Jonathan F. Donges (donges@pik-potsdam.de) at the Potsdam Institute of Climate Impact Research (PIK) and Humboldt University Berlin.*\\n\",\n    \"\\n\",\n    \"---\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"f2f2eb59\",\n   \"metadata\": {},\n   \"source\": [\n    \"synchronization measures of time series have been attracting attention in several research areas, including climatology and neuroscience.\\n\",\n    \"synchronization can be understood as a measure of interdependence or strong correlation between time series. \\n\",\n    \"The main use cases of synchronization are:\\n\",\n    \"- Quantification of similarities in phase space between two time series\\n\",\n    \"- Quantification of differences in phase space between two time series.\\n\",\n    \"\\n\",\n    \"A research example of synchronization phenomena is the analysis of electroencephalographic (EEG) signals as a major influencing factor to understand the communication within the brain, see [Quiroga et al. (2001)](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.65.041903).\\n\",\n    \"\\n\",\n    \"Two widely accepted measurement methods of synchronization are **Event Synchronization (ES)** and **Event Coincidence Analysis (ECA)**. The non-linear nature of these two methods makes them widely applicable for a wide range of utilizations. \\n\",\n    \"While ES does not include the difference in timescales when measuring synchrony, when using ECA a certain timescale has to be selected for analysis purposes.\\n\",\n    \"For more background information consult [Odenweller et al. (2020)](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.101.052213) and [Quiroga et al. (2001)](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.66.041904).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"5424b801\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Event Synchronization (ES)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"a0721685\",\n   \"metadata\": {},\n   \"source\": [\n    \"As mentioned before, the parameter-free method ES offers a fast and reliable way to measure synchronization between time series.\\n\",\n    \"The fundamental idea is illustrated by the picture below ([Odenweller et al., 2020](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.101.052213)):\\n\",\n    \"\\n\",\n    \"![Event synchronization](./images/EventSynchronisation.png)\\n\",\n    \"\\n\",\n    \"Two events $l$ and $m$ from timeseries $i$ and $j$, respectively, are considered synchronous if they occur within a certain time interval $\\\\tau$ which is determined from the data properties. The time interval $\\\\tau$ is defined as:\\n\",\n    \"\\n\",\n    \"$$\\\\tau_{lm}^{ij}=\\\\frac{1}{2}\\\\min\\\\left\\\\{t_{l+1}^{i}-t_{l}^{i}, \\\\; t_{l}^{i}-t_{l-1}^{i}, \\\\; t_{m+1}^{j}-t_{m}^{j}, \\\\; t_{m}^{j}-t_{m-1}^{j}\\\\right\\\\}$$\\n\",\n    \"\\n\",\n    \"Thus, given an event in timeseries $j$, the occurrences of synchronized events in $i$ can be counted as\\n\",\n    \"\\n\",\n    \"$$c(i|j)=\\\\sum_{l=2}^{s_i-1}\\\\sum_{m=2}^{s_j-1}J_{lm}^{ij} \\\\,,$$\\n\",\n    \"\\n\",\n    \"where $J_{lm}^{ij}$ counts the events that match the synchronization condition.\\n\",\n    \"Finally, we can define the strength of event synchronization between the timeseries $i$ and $j$ by\\n\",\n    \"\\n\",\n    \"$$Q_{ij}^{ES}=\\\\frac{c(i|j)+c(j|i)}{\\\\sqrt{(s_i-2)(s_j-2)}}\\\\,.$$\\n\",\n    \"\\n\",\n    \"In the usual case, when the timeseries are not fully synchronized, $0 \\\\le Q_{ij}^{ES} \\\\le 1$, and total or absent synchronization correspond to $Q_{ij}^{ES} = 1$ or $Q_{ij}^{ES} = 0$, respectively.\\n\",\n    \"To generate an undirected network from a set of timeseries, we can consider the values $Q_{ij}^{ES}$ as the coefficients of a square symmetric matrix $Q^{ES}$. It should be noted that fully synchronized time series will adapt a value of $Q_{ii}^{ES} = Q_{jj}^{ES} = 1$.\\n\",\n    \"\\n\",\n    \"The advantage of ES is that no parameters, such as a delay specification between the two timeseries, has to selected *a priori*.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"1efab43e\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Event Coincidence Analysis (ECA)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"fae1001e\",\n   \"metadata\": {},\n   \"source\": [\n    \"In contrast, ECA incorporates *static (global) coincidence intervals*. For a chosen tolerance interval $\\\\Delta T$, an *instantaneous event coincidence* between two events $t_{m}^{j} < t_{l}^{i}$ is defined by the condition\\n\",\n    \"$0 \\\\leq t_{l}^{i} -  t_{m}^{j} \\\\leq \\\\Delta T$, and is generalized to a *lagged event coincidence* via a *time lag* $\\\\tau \\\\ge 0$ on timeseries $i$. The fundamental idea is illustrated by the picture below ([Odenweller et al., 2020](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.101.052213)):\\n\",\n    \"\\n\",\n    \"![ECA](images/ECA.png)\\n\",\n    \"\\n\",\n    \"When computing the coincidence rate with ECA, the *precursor* and *trigger* event coincidence rates should be distinguished. The former refers to events in $i$ that precede all events in $j$, and the latter referes to events in $j$ that precede at least one event in $i$. More precisely, the precursor event coincidence rate is defined as\\n\",\n    \"\\n\",\n    \"$$r_p(i|j;\\\\Delta T,\\\\tau) = \\\\frac{1}{s_i-s_{i}'}\\\\sum_{l=1+s_i'}^{s_i} \\\\Theta \\\\left[\\\\sum_{m=1}^{s_j} 1_{[0,\\\\Delta T]}\\\\left[(t_l^i-\\\\tau)-t_m^j\\\\right]\\\\right] \\\\,,$$\\n\",\n    \"\\n\",\n    \"and the trigger event coincidence rate as\\n\",\n    \"\\n\",\n    \"$$r_p(i|j;\\\\Delta T,\\\\tau)=\\\\frac{1}{s_j-s_j''}\\\\sum_{m=1}^{s_j-s_j''}\\\\Theta\\\\left[\\\\sum_{l=1}^{s_i} 1_{[0,\\\\Delta T]} \\\\left[(t_l^i-\\\\tau)-t_m^j\\\\right]\\\\right] \\\\,.$$\\n\",\n    \"\\n\",\n    \"For details on the calculation of $s_i', s_j''$, consult [Odenweller et al. (2020)](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.101.052213).\\n\",\n    \"By changing the indices in the precursor or trigger rate, one obtains the opposite rates, e.g., $r_t(j|i; \\\\Delta T, \\\\tau)$. Therefore, the ECA yields a total of four coincidence rates.\\n\",\n    \"\\n\",\n    \"By computing the mean or the maximum of the two directed trigger coincidence rates $r_t(i|j; \\\\Delta T,\\\\tau)$ and $r_t(j|i;\\\\Delta;T,\\\\tau)$,\\n\",\n    \"one arrives at the *degree of event synchrony* $Q_{ij}^{ECA, mean}$ or $Q_{ij}^{ECA, max}$,\\n\",\n    \"which can be used as a statistical measure of uni- or bidirectional dependency.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"8a82f258\",\n   \"metadata\": {},\n   \"source\": [\n    \"## ES/ECA for Simple Random Event Series\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"6e06f934-ec77-4034-a57b-8da719b5bb1a\",\n   \"metadata\": {},\n   \"source\": [\n    \"`pyunicorn` provides a class for ES and ECA. In addition, a method is included for the generation of binary event series from continuous timeseries data. First, we import the necessary packages.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"id\": \"82ab6709\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"from pyunicorn.eventseries import EventSeries\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"1274c566-566b-41a0-a7b5-5a925ce824ea\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Input: Event Matrix\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"1c7c6d9c-4348-4588-af02-55b630044382\",\n   \"metadata\": {},\n   \"source\": [\n    \"Next, we initialize the `EventSeries` class with a toy event matrix, in which the first axis represents the timesteps and the second axis covers the variables. Each variable at a specific timestep is either `1` if an event occurred or `0` if it did not.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"id\": \"1be1ea26-cdb7-44c5-9a7f-00d1adf7dcff\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"EventSeries: 2 variables, 10 timesteps, taumax: 1.0, lag: 0.0\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"series = np.array([[0, 0],\\n\",\n    \"                   [1, 1],\\n\",\n    \"                   [0, 0],\\n\",\n    \"                   [1, 1],\\n\",\n    \"                   [0, 0],\\n\",\n    \"                   [0, 0],\\n\",\n    \"                   [1, 0],\\n\",\n    \"                   [0, 1],\\n\",\n    \"                   [0, 0],\\n\",\n    \"                   [0, 0]])\\n\",\n    \"\\n\",\n    \"ev = EventSeries(series, taumax=1)\\n\",\n    \"print(ev)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"c350db9f\",\n   \"metadata\": {},\n   \"source\": [\n    \"**Caution:** The argument `taumax` represents the maximum time difference $\\\\Delta T$ between two events that are to be considered synchronous. For ES, using the default `taumax=np.inf` is sensible because of its dynamic coincidence interval, whereas for ECA, a finite `taumax` needs to be specified.\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"59b6d71d-4852-4441-8174-f57e8c500cb8\",\n   \"metadata\": {},\n   \"source\": [\n    \"For variables $X,Y$, the return values of the synchronization analysis methods are:\\n\",\n    \"\\n\",\n    \"- ES: $\\\\left( Q^{ES}_{XY},\\\\, Q^{ES}_{YX} \\\\right)$\\n\",\n    \"- ECA: $\\\\left( r_p(Y|X),\\\\, r_t(Y|X),\\\\, r_p(X|Y),\\\\, r_t(X|Y) \\\\right)$.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"id\": \"9295b844\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"(0.5, 0.5)\\n\",\n      \"(0.5, 1.0, 1.0, 1.0)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(ev.event_synchronization(*series.T))\\n\",\n    \"print(ev.event_coincidence_analysis(*series.T, taumax=1))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"43a272de-8ee9-4734-925a-a45965c70c18\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Input: Timeseries\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"80260d7e\",\n   \"metadata\": {},\n   \"source\": [\n    \"If the input data is not provided as an event matrix, the constructor tries to generate one from continuous time series data using the `make_event_matrix()` method. Therefore, the argument `threshold_method` needs to be specified along with the argument `threshold_values`. `threshold_method` can be `'quantile'`,  `'value'`, or a 1D Numpy array with entries `'quantile'` or `'value'` for each variable. If `'value'` is selected, one has to specify a number lying in the range of the array; for `'quantile'`, a number between 0 and 1 has to be selected since it specifies the fraction of the array's values which should be included in the event matrix. Additionally, one can specify the argument `threshold_type`, if the threshold should be applied `'above'` or `'below'` the specified `threshold_method`.\\n\",\n    \"\\n\",\n    \"Here is a simple example for finding the synchrony between two continuous time series variables:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"id\": \"aca1e9f0-1892-42e0-ae31-13321c30589b\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"[[8 7]\\n\",\n      \" [0 3]\\n\",\n      \" [2 5]\\n\",\n      \" [9 7]\\n\",\n      \" [3 6]\\n\",\n      \" [9 9]\\n\",\n      \" [8 1]\\n\",\n      \" [9 2]\\n\",\n      \" [8 8]\\n\",\n      \" [3 5]]\\n\",\n      \"EventSeries: 2 variables, 10 timesteps, taumax: 1.0, lag: 0.0\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"series = (10 * np.random.rand(10, 2)).astype(int)\\n\",\n    \"ev = EventSeries(series, threshold_method='quantile',\\n\",\n    \"                 threshold_values=0.5, threshold_types='below', taumax=1)\\n\",\n    \"print(series); print(ev)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"id\": \"c92101e6-85e5-4dad-84c1-55a3d9331a62\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"ES: (0.46770717334674267, 0.46770717334674267)\\n\",\n      \"ECA: (1.0, 1.0, 1.0, 1.0)\\n\",\n      \"ECA[p]: (1.0, 1.0)\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"ES:\\\", ev.event_synchronization(*series.T))\\n\",\n    \"print(\\\"ECA:\\\", ev.event_coincidence_analysis(*series.T, taumax=1))\\n\",\n    \"# only compute the precursor event coincidence rates\\n\",\n    \"print(\\\"ECA[p]:\\\", ev._eca_coincidence_rate(*series.T, window_type='advanced'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"3ad4d332-4909-4fa9-9ed7-8539decd7ff9\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Output: Event Series Measure / Functional Network\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"8b13dcec-2393-439e-94c9-c261d489760a\",\n   \"metadata\": {},\n   \"source\": [\n    \"The `event_series_analysis()` method, with its argument `method` set to `ES` or `ECA`, can be used to construct a measure of dependence (*functional network*) as described in the introduction. Such matrices can then be subjected to complex network theory methods as a part of non-linear timeseries analysis, see **Tutorial: Recurrence Networks**.\\n\",\n    \"\\n\",\n    \"The return value is a $N\\\\!\\\\times\\\\! N$ matrix, where $N$ is the number of variables. For detailed information on the calculation of the matrix and the required arguments, please consult the API documentation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"id\": \"0f5cf4b9\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"ES:\\n\",\n      \"[[0.         0.20412415]\\n\",\n      \" [0.20412415 0.        ]]\\n\",\n      \"ECA:\\n\",\n      \"[[0.         0.41666667]\\n\",\n      \" [0.41666667 0.        ]]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"matrix_ES = ev.event_series_analysis(method='ES')\\n\",\n    \"print(\\\"ES:\\\"); print(matrix_ES)\\n\",\n    \"matrix_ECA = ev.event_series_analysis(method='ECA', symmetrization='mean', window_type='advanced')\\n\",\n    \"print(\\\"ECA:\\\"); print(matrix_ECA)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"6376d465\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Significance Level Calculations\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"d28b190a\",\n   \"metadata\": {},\n   \"source\": [\n    \"The signifcance levels of event synchronization can also be calculated using `pyunicorn`. The methods `_empirical_percentiles()` and `event_analysis_significance()` respectively estimate the $p$-values via a Monte Carlo approach and the signifcance levels ($1 - p$) via a Poisson process. For detailed information please consult the API documentation.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"id\": \"4e4dc503-53c9-4aad-9f32-c5b05569642c\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"MC[ES]:\\n\",\n      \"[[0.     0.2726]\\n\",\n      \" [0.271  0.    ]]\\n\",\n      \"MC[ECA]:\\n\",\n      \"[[0.     0.0519]\\n\",\n      \" [0.0519 0.    ]]\\n\",\n      \"Poisson[ES]:\\n\",\n      \"[[0.     0.2782]\\n\",\n      \" [0.2785 0.    ]]\\n\",\n      \"Poisson[ECA]:\\n\",\n      \"[[0.     0.0516]\\n\",\n      \" [0.0516 0.    ]]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(\\\"MC[ES]:\\\")\\n\",\n    \"print(ev._empirical_percentiles(method='ES', n_surr=int(1e4)))\\n\",\n    \"print(\\\"MC[ECA]:\\\")\\n\",\n    \"print(ev._empirical_percentiles(method='ECA', n_surr=int(1e4),\\n\",\n    \"                                symmetrization='mean', window_type='advanced'))\\n\",\n    \"print(\\\"Poisson[ES]:\\\")\\n\",\n    \"print(ev.event_analysis_significance(method='ES', n_surr=int(1e4)))\\n\",\n    \"print(\\\"Poisson[ECA]:\\\")\\n\",\n    \"print(ev.event_analysis_significance(method='ECA', n_surr=int(1e4),\\n\",\n    \"                                     symmetrization='mean', window_type='advanced'))\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"cb3c47de\",\n   \"metadata\": {},\n   \"source\": [\n    \"## ES/ECA for Generating a Climate Network\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"7211ee7d-e2b3-4e6d-bf72-3b8c2dbe50fa\",\n   \"metadata\": {},\n   \"source\": [\n    \"A possible further application of ES and ECA is the generation of climate networks from the event series measures above, and is implemented in the `EventSeriesClimateNetwork` class.\\n\",\n    \"\\n\",\n    \"**Note:** If more general applications of event series networks are desired, use the `EventSeries` class together with the `Network` class.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"id\": \"ea03f3ea\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from pyunicorn.core import Data\\n\",\n    \"from pyunicorn.climate.eventseries_climatenetwork import EventSeriesClimateNetwork\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"c33df5f1\",\n   \"metadata\": {},\n   \"source\": [\n    \"We shall use the small test climate dataset provided by `Data`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"id\": \"9b8c2e94\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Data: 6 grid points, 60 measurements.\\n\",\n      \"Geographical boundaries:\\n\",\n      \"         time     lat     lon\\n\",\n      \"   min    0.0    0.00    2.50\\n\",\n      \"   max    9.0   25.00   15.00\\n\",\n      \"\\n\",\n      \"[[ 0.00000000e+00  1.00000000e+00  1.22464680e-16 -1.00000000e+00\\n\",\n      \"  -2.44929360e-16  1.00000000e+00]\\n\",\n      \" [ 3.09016994e-01  9.51056516e-01 -3.09016994e-01 -9.51056516e-01\\n\",\n      \"   3.09016994e-01  9.51056516e-01]\\n\",\n      \" [ 5.87785252e-01  8.09016994e-01 -5.87785252e-01 -8.09016994e-01\\n\",\n      \"   5.87785252e-01  8.09016994e-01]\\n\",\n      \" [ 8.09016994e-01  5.87785252e-01 -8.09016994e-01 -5.87785252e-01\\n\",\n      \"   8.09016994e-01  5.87785252e-01]\\n\",\n      \" [ 9.51056516e-01  3.09016994e-01 -9.51056516e-01 -3.09016994e-01\\n\",\n      \"   9.51056516e-01  3.09016994e-01]\\n\",\n      \" [ 1.00000000e+00  1.22464680e-16 -1.00000000e+00 -2.44929360e-16\\n\",\n      \"   1.00000000e+00  3.67394040e-16]\\n\",\n      \" [ 9.51056516e-01 -3.09016994e-01 -9.51056516e-01  3.09016994e-01\\n\",\n      \"   9.51056516e-01 -3.09016994e-01]\\n\",\n      \" [ 8.09016994e-01 -5.87785252e-01 -8.09016994e-01  5.87785252e-01\\n\",\n      \"   8.09016994e-01 -5.87785252e-01]\\n\",\n      \" [ 5.87785252e-01 -8.09016994e-01 -5.87785252e-01  8.09016994e-01\\n\",\n      \"   5.87785252e-01 -8.09016994e-01]\\n\",\n      \" [ 3.09016994e-01 -9.51056516e-01 -3.09016994e-01  9.51056516e-01\\n\",\n      \"   3.09016994e-01 -9.51056516e-01]]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"data = Data.SmallTestData()\\n\",\n    \"print(data); print()\\n\",\n    \"print(data.observable())\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"id\": \"e591bcf2\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"EventSeriesClimateNetwork:\\n\",\n      \"EventSeries: 6 variables, 10 timesteps, taumax: 16.0, lag: 0.0\\n\",\n      \"ClimateNetwork:\\n\",\n      \"GeoNetwork:\\n\",\n      \"SpatialNetwork:\\n\",\n      \"Network: directed, 6 nodes, 0 links, link density 0.000.\\n\",\n      \"Geographical boundaries:\\n\",\n      \"         time     lat     lon\\n\",\n      \"   min    0.0    0.00    2.50\\n\",\n      \"   max    9.0   25.00   15.00\\n\",\n      \"Threshold: 0\\n\",\n      \"Local connections filtered out: False\\n\",\n      \"Type of event series measure to construct the network: directedES\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"climate_ES = EventSeriesClimateNetwork(\\n\",\n    \"    data, method='ES', taumax=16.0,\\n\",\n    \"    threshold_method='quantile', threshold_values=0.8, threshold_types='above')\\n\",\n    \"print(climate_ES)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"id\": \"bbb03017\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Extracting network adjacency matrix by thresholding...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"Setting area weights according to type surface ...\\n\",\n      \"EventSeriesClimateNetwork:\\n\",\n      \"EventSeries: 6 variables, 10 timesteps, taumax: 16.0, lag: 0.0\\n\",\n      \"ClimateNetwork:\\n\",\n      \"GeoNetwork:\\n\",\n      \"SpatialNetwork:\\n\",\n      \"Network: directed, 6 nodes, 0 links, link density 0.000.\\n\",\n      \"Geographical boundaries:\\n\",\n      \"         time     lat     lon\\n\",\n      \"   min    0.0    0.00    2.50\\n\",\n      \"   max    9.0   25.00   15.00\\n\",\n      \"Threshold: 0\\n\",\n      \"Local connections filtered out: False\\n\",\n      \"Type of event series measure to construct the network: directedECA\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"climate_ECA = EventSeriesClimateNetwork(\\n\",\n    \"    data, method='ECA', taumax=16.0,\\n\",\n    \"    threshold_method='quantile', threshold_values=0.8, threshold_types='above')\\n\",\n    \"print(climate_ECA)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"pyunicorn\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.10.13\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  },
  {
    "path": "docs/source/examples/tutorials/RecurrenceNetworks.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"d35172b4\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tutorial: Recurrence Networks\\n\",\n    \"\\n\",\n    \"This tutorial introduces the analysis of non-linear timeseries via a complex network approach. The implementation of this methodology in the `pyunicorn` package is illustrated with two examples, showcasing the basic use of the classes `timeseries.Recurrence{Plot,Network}`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"5fb6ee17-1bb9-401a-a574-6e05565640ef\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Introduction\\n\",\n    \"\\n\",\n    \"### Recurrence Plots for the Analysis of Complex Systems\\n\",\n    \"\\n\",\n    \"So far, the analysis of complex networks in different scientific fields has been performed by studying the adjacency matrix $A_{i,j}$. Recent work has been focussing on studying time series using a similar approach, by transforming the time series into a complex network and then analyzing the phase space and its properties using the **recurrence plot (RP)**.\\n\",\n    \"\\n\",\n    \"The **recurrence matrix** can be considered as the adjacency matrix of an undirected, unweighted network. With this approach, it is possible to characterise the local and global properties of a network. \\n\",\n    \"In particular, it can be applied to *(i)* both univariate and multivariate time series (phase space trajectories), *(ii)* with and without pronounced oscillatory components, and *(iii)* with or without embedding. Moreover, similar to traditional **recurrence quantification analysis (RQA)**, studying network properties for sliding windows in time also allows for coping with non-stationary time series. Consequently, unlike for most of the existing techniques, there are no fundamental restrictions w.r.t. its practical applicability to arbitrary time series.\\n\",\n    \"\\n\",\n    \"For more detailed background information, please consult [Marwan et al. (2009)](https://www.sciencedirect.com/science/article/abs/pii/S0375960109011852).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"ba9af2d3-8273-485e-9fa3-a0848b74ce9b\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Visualization of a Timeseries and its Recurrence Network\\n\",\n    \"\\n\",\n    \"Before we get started, we shall visualize a timeseries based on a three dimensional chaotic oscillator example described by the Lorenz system:\\n\",\n    \"\\n\",\n    \"$$\\\\frac{d}{dt}(x,y,z)=\\\\left( 10(y-x),x(28-z)-y,xy-\\\\frac{8}{3}z \\\\right) \\\\,.$$\\n\",\n    \"\\n\",\n    \"The following figures represent the timeseries in phase space and its RP.\\n\",\n    \"\\n\",\n    \"![Recurrence Plot](images/REcurrencePlot_v2.png)\\n\",\n    \"\\n\",\n    \"__(A)__ A state at time *i* (red dot) is recurrent at another time *j* (black dot) when the phase space trajectory visits its close neighbourhood (gray circle). This is marked by value 1 in the recurrence matrix at *(i, j)*. States outside of this neighbourhood (small red circle) are marked with 0 in the recurrence matrix.\\n\",\n    \"\\n\",\n    \"__(B)__ Graphical representation of the corresponding recurrence matrix (recurrence plot).\\n\",\n    \"\\n\",\n    \"For literature review and background information, see [Donner et al. (2010b)](https://www.worldscientific.com/doi/abs/10.1142/S0218127411029021).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"17927a78-ff98-42c6-8d8f-ee7c81554df2\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Correspondence Between Recurrence Networks and Phase Space Measurements\\n\",\n    \"\\n\",\n    \"The following table shows how some of the characteristics measured from a recurrence network translate into corresponding phase space features of the time series. For more background information, consult [Donges et al. (2012)](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.85.046105).\\n\",\n    \"\\n\",\n    \"\\n\",\n    \"| Scale | Recurrence Network | Phase space interpretation |\\n\",\n    \"| :--- | :--- | :--- |\\n\",\n    \"| Local | Continuous local $\\\\epsilon$-clustering coefficient | Local dimension | \\n\",\n    \"| Local | Continuous $\\\\epsilon$-matching index | Local density gradient | \\n\",\n    \"| Global | Continuous $\\\\epsilon$-transitivity | Global dimension  | \\n\",\n    \"| Global | Continuous global $\\\\epsilon$-clustering | Average local dimension | \"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"ec852748\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example: Logistic Map\\n\",\n    \"\\n\",\n    \"First, we import the necessary packages:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"id\": \"111c44d0-ab2b-4aca-8c96-44eb7be9fa10\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import numpy as np\\n\",\n    \"import matplotlib.pyplot as plt\\n\",\n    \"from tqdm.auto import tqdm\\n\",\n    \"\\n\",\n    \"from pyunicorn.timeseries import RecurrenceNetwork, RecurrencePlot\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"e4994e9a\",\n   \"metadata\": {},\n   \"source\": [\n    \"We create a function to calculate a logistic map timeseries:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"id\": \"39494417\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def logistic_map(x0: float, r: float, T: int, spinup: int = 100):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Returns a time series of length T using the logistic map\\n\",\n    \"    x_(n+1) = r*x_n(1-x_n)\\n\",\n    \"    at parameter r and using the initial condition x0.\\n\",\n    \"    \\n\",\n    \"    INPUT: x0 - Initial condition, 0 <= x0 <= 1\\n\",\n    \"            r - Bifurcation parameter, 0 <= r <= 4\\n\",\n    \"            T - length of the desired time series\\n\",\n    \"            spinup - number of spinup-timesteps before storing results to output\\n\",\n    \"    OUTPUT: numpy array of timeseries under given parameters\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    # spinup\\n\",\n    \"    for n in range(spinup):\\n\",\n    \"        x0 = r * x0 * (1 - x0)\\n\",\n    \"    \\n\",\n    \"    timeseries = np.zeros(T + 1)\\n\",\n    \"    timeseries[0] = x0\\n\",\n    \"    for n in range(T):\\n\",\n    \"        # get current timestep value\\n\",\n    \"        xn = timeseries[n]\\n\",\n    \"        # calculate next timestep value\\n\",\n    \"        xstep = r * xn * (1 - xn)\\n\",\n    \"        timeseries[n + 1] = xstep\\n\",\n    \"    return timeseries\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"9c841c22\",\n   \"metadata\": {},\n   \"source\": [\n    \"After choosing the bifurcation parameter $r$, the initial value $x_0$ and the length of the timeseries $T$, we can now generate a timeseries. Play around with the parameters if you like! For an interesting regime, we should stick with $r >3.6$.\\n\",\n    \"**Note:** Our `logistic_map()` function includes a spinup of 100 timesteps by default, so the resulting timeseries will not start at $x_0$.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"id\": \"4e4391fc\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAA50AAAEmCAYAAADhvvTVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAAxOAAAMTgF/d4wjAAC/KklEQVR4nO29ebxdVXk+/pw7ZyaQAUJyuSIkYU5UIiIyKRYooDVOVObkC/0WFb9UsA51qMXSauMPrdooQ604gEILqAVHBNqgQggBAhJIQnJRkjBkHu50fn8s3ux11lnTHtZea5+s5/O5n3PvPefsvfbea3jf93ned9Xq9XodEREREREREREREREREREO0Oa7ARERERERERERERERERGti+h0RkRERERERERERERERDhDdDojIiIiIiIiIiIiIiIinCE6nRERERERERERERERERHOEJ3OiIiIiIiIiIiIiIiICGeITmdERERERERERERERESEM3T4bkBR6O7uxuTJk303IyIiIiIiIiIiIiIiYq/Dxo0bsXv3bul7LeN0Tp48Gf39/b6bERERERERERERERERsddh+vTpyveivDYiIiIiIiIiIiIiIiLCGaLTGREREREREREREREREeEM0emMiIiIiIiIiIiIiIiIcIbodEZEREREREREREREREQ4Q3Q6IyIiIiIiIiIiIiIiIpwhOp0RERERERERERERERERzhCdzoiIiIiIiIiIiIiIiAhniE5nREREREREREREREREhDNEpzMiIiKiRVGvA8PDvlsREZEOu3cDQ0O+WxERUR288grw8su+W+EGQ0PA1q2+WxFRBKLTGREM7r0XuOYa362IiCgWTz8N7Nrl59z/8i/AtGn+zt/K+OMfgeee83PuHTuA885jfasVcfjhwMc+5rsV2TA8zJxmHxgcBN70JuA73/Fz/gh/ePe7gXe9y3cr3OCf/xno6wN27vTdkvTYsAE4+mjgd7/z3ZIwEJ3OFsOVVwK33uq7Fdnwb/8GfOpT0UCOaB386U/AEUewvu0DK1awRW/zZj/nb2VcdBHwjnf4OffDDwPf/S5w111+zu8SQ0PAqlXAypW+W5INn/kMcMghfhQGL74IPPgg8MAD5Z/bBl/5CvD61/tTXwwMACMjfs7tGmvXAs8/77sVbvDMM4zFreI6tnw58NhjwJIlvlsSBqLTWTLu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dPjLn2rlubLKBibAxlx7e7I/ctnnBsLtF93drZt36Bs+5f6uEXq/1sG3DeAbcai3MNrbgUcf9d2K7PC5BUFEhAtQvTNfdc+qbsCHjJ4ef3NVKxsyVTYwAeD1rwdeecXPuUMf7x/5CHDKKSxHP6JYRKYzTLRygNAG0emMCBbEHLT4Vq0RexGOPhr43veA00/3c/5Wdk5844tf9MNmAdU2wkyo+rX9wz8An/+8n3OHPt5PPJH9RBSPvYHprOL1VbntRSA6nRHB4qKLgKOO8t2KiIjiUKsB557r7/x7e5TVJc46y9+5jzgCmD2bFUZpNbSCkeaLyaNx7mpv2ohw4XMLJ9eo8jo2Zkzj696G6HRGBIv3vpf9REREFIM3vAF48kl3ewNH+EFfH3uurYgxY4ADDgBmzfLdkuqhrw/48peBc87x3ZKIsjF+PCu614o48EBg332ruY6dfDJw441775is1ev1uu9GFIHp06ejv7/fdzMiIiIigka9HnOoIqqFgQHGeMZ+GxFhh4cfBkaPBg47zHdLisfQELBlC3M8I8KDzh+LTGdERETEXoRouEdUDa0qE4yIcIXXv953C9yhoyM6nFVFLNESERERERERERERERER4QzR6YyIiIiIiIiIiIiIiIhwhuh0RkRERERERERERERERDhDdDojIiIiIiIiIiIiIiIinCE6nRERERERERERERERERHOEJ3OiIiIiIiIiIiIiIiICGeITmdERERERERERERERESEM0SnMyIiIiIiIiIiIiIiIsIZotMZERERERERERERERER4Qy1er1e992IItDd3Y3Jkyf7boYU27Ztw9ixY303IwLxWYSC+BzCQXwW4SA+izAQn0M4iM8iHMRnEQZCfw4bN27E7t27pe+1jNMZMqZPn47+/n7fzYhAfBahID6HcBCfRTiIzyIMxOcQDuKzCAfxWYSBKj+HKK+NiIiIiIiIiIiIiIiIcIbodEZEREREREREREREREQ4Q3Q6S8CVV17puwkRryI+izAQn0M4iM8iHMRnEQbicwgH8VmEg/gswkCVn0PM6YyIiIiIiIiIiIiIiIhwhsh0RkRERERERERERERERDhDdDojIiIiIiIiIiIiIiIinCE6nQ6xcuVKHH/88Zg5cybmzZuHFStW+G7SXoNdu3bhne98J2bOnIk5c+bg9NNPx5o1awAAJ598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Z4hOZ0RERERERERERERERIQzRKczIiIiIiIiIiIiIiIiwhmi0xkRERERERERERERERHhDB2+GxAREREREbE34+qrr8bmzZuxfv16LFu2DH19ffjpT3+K0aNH+25aREREREREIYhMZ0REREREhEcsXboUGzZswPe//32sXr0a27dvx4MPPui7WREREREREYUhMp0REREREREe8cgjj+DBBx/EqFGjAAADAwOYPHmy51ZFREREREQUh8h0RkREREREeMKaNWvQ1dWFQw89FACwa9curF69GocddpjnlkVERERERBSH6HRGRERERER4wtKlS3Hsscfu+fvRRx/FEUccgY6OKESKiIiIiGgdRKczIiIiIiLCEx555BG84Q1v2PP3ww8/jNe97nUeWxQREREREVE8avV6ve67ERERERERERERERERERGtich0RkRERERERERERERERDhDdDojIiIiIiIiIiIiIiIinCE6nRERERERERERERERERHOEJ3OiIiIiIiIiIiIiIiICGeITmdERERERERERERERESEM0SnMyIiIiIiIiIiIiIiIsIZotMZERERERERERERERER4QzR6YyIiIiIiIiIiIiIiIhwhv8fFUXIzs2VAYwAAAAASUVORK5CYII=\",\n      \"text/plain\": [\n       \"<Figure size 1120x320 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"#  Parameters of logistic map\\n\",\n    \"r = 3.679  # Bifurcation parameter\\n\",\n    \"x0 = 0.7   # Initial value\\n\",\n    \"#  Length of the time series\\n\",\n    \"T = 200\\n\",\n    \"#  Generate the timeseries\\n\",\n    \"time_series = logistic_map(x0, r, T)\\n\",\n    \"#  Plot the time series\\n\",\n    \"plt.figure(figsize=(14, 4), dpi=80)\\n\",\n    \"plt.plot(time_series, \\\"b\\\")\\n\",\n    \"plt.xlabel(\\\"$n$\\\")\\n\",\n    \"plt.ylabel(\\\"$x_n$\\\");\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"ca7ab08c\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Recurrence Properties Under Fixed Recurrence Threshold $\\\\epsilon$\\n\",\n    \"\\n\",\n    \"Now we can create a RP from our time series using the `timeseries.RecurrenePlot` class. Following [Marwan et al. (2009)](https://www.sciencedirect.com/science/article/abs/pii/S0375960109011852), we choose a fixed recurrence threshold $\\\\epsilon$ that is 5% of the time series' standard deviation. For that purpose, we set the parameter `threshold_std`. **Note:** For a one-dimensional timeseries we do not use embedding.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"id\": \"ad52fdac\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating recurrence plot at fixed threshold in units of time series STD...\\n\",\n      \"Calculating recurrence plot at fixed threshold...\\n\",\n      \"Calculating the supremum distance matrix...\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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y18OvvGNbwRBEARbt24NJAW//e1vs7b5oz/6o+Af/uEf+t3fJ598EnR0dGReb7/9dqBPm0pevHjx4uXB6/DhwxG2Up8yGmEGQaD7779fmzZt0rZt21RfX5/19/r6elVVVampqUlXXXWVJKm7u1vNzc1atWqVJGnGjBkaNmyYmpqadNttt0mSWltb9dZbb2n16tX97re8vFzl5eWZ/1944YV6++23deWVV+rw4cORh/HoK30ZnPpODnWeLOo7eek6f/vtt7OG8aJitMG87777tGHDBv3kJz/RyJEj1dbWJkkaPXq0RowYobKyMjU2NmrFihWaOHGiJk6cqBUrVuj888/X1772tcy2d955px588EFddNFFqqio0NKlSzV16lR98YtfDJWP8847T5deeqkkadSoUZzcCaK+k0edJ4v6Tt6ll16q886Lfk6r0QbzySeflCTdcMMNWe8/88wzuv322yVJDz30kE6dOqV77703s3DBK6+8opEjR2a2/8EPfqChQ4fqtttuyyxc8Oyzz2rIkCFJFQUA4DlrZsmalr4XM46ZVeiL+k4edZ4s6jt5cde5VfdhmlReXq5HH300a2wT8aG+k0edJ4v6Tl7cdU6ECQBACESYAACEQIMJAEAINJgAAIRAgwkAQAg0mAAAhECDCQBACDSYgOfeffddlZWV6eWXX9aNN96o888/X5dffrn++7//23TWAKfQYAKe27t3r8rKyvT9739ff/d3f6e9e/dq/Pjxevjhh01nDXAKDSbgub1792r06NF68cUXNWfOHE2cOFELFizQBx98YDprgFNoMAHP7d27VzfffLPGjh2bee/AgQP63Oc+ZzBXgHtoMAHP7d27V7Nmzcp6b/fu3Zo+fbqZDAGOosEEPNbR0aFDhw5lHsCetmfPHhpMIE80mIDH9u7dqyFDhmjatGmZ9w4dOqT29nYaTCBPNJiAx/bu3asrrrhCI0aMyLy3e/du/cEf/IEuu+wycxkDHMTjvQAACIEIEwCAEGgwAQAIgQYTAIAQaDABAAiBBhMAgBBoMAEACIEGEwCAEGgwAQAIgQYTAIAQaDABAAiBBhMAgBBoMAEACOH/AaHhLmiJfCZHAAAAAElFTkSuQmCC\",\n      \"text/plain\": [\n       \"<Figure size 480x480 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# Fixed recurrence threshold in units of the time series' standard deviation\\n\",\n    \"EPS_std = 0.05\\n\",\n    \"# Default distance metric in phase space: \\\"supremum\\\"\\n\",\n    \"# Can also be set to \\\"euclidean\\\" or \\\"manhattan\\\".\\n\",\n    \"METRIC = \\\"supremum\\\"\\n\",\n    \"rp = RecurrencePlot(time_series, metric=METRIC,\\n\",\n    \"                    normalize=False, threshold_std=EPS_std)\\n\",\n    \"plt.matshow(rp.recurrence_matrix())\\n\",\n    \"plt.xlabel(\\\"$n$\\\"); plt.ylabel(\\\"$n$\\\");\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"61d57bf6\",\n   \"metadata\": {},\n   \"source\": [\n    \"Some of the main properties of a RP can be easily extracted with the `rqa_summary()` method:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"id\": \"4d22a95e\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"{'RR': 0.05061755897131259,\\n\",\n       \" 'DET': 0.7494577006466949,\\n\",\n       \" 'L': 3.971264367701975,\\n\",\n       \" 'LAM': 0.10953545232220277}\"\n      ]\n     },\n     \"execution_count\": 5,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"rp.rqa_summary()\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"8ef17b28\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Network Calculation\\n\",\n    \"\\n\",\n    \"Now we can use the recurrence properties, which mimic the phase space properties of the original time series, to calculate quantitative characteristics of the time series implicitly. We shall distinghuish here between *local*, *intermediate* and *global* properties. In order to construct the complex network we use the `timeseries.RecurrenceNetwork` class, which combines the `timeseries.RecurrencePlot` and `core.Network` charactistics. For more information on the individual properties, see [Donner et al. (2010a)](https://iopscience.iop.org/article/10.1088/1367-2630/12/3/033025/meta). \\n\",\n    \"\\n\",\n    \"Our main focus will lie on determining the local and global clustering coefficient as well as the network transitivity. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"id\": \"6b5a9d37\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating recurrence plot at fixed threshold in units of time series STD...\\n\",\n      \"Calculating recurrence plot at fixed threshold...\\n\",\n      \"Calculating the supremum distance matrix...\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"rn = RecurrenceNetwork(time_series, metric=METRIC,\\n\",\n    \"                       normalize=False, threshold_std=EPS_std)\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"8c74cd38\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Local Clustering Coefficient\\n\",\n    \"\\n\",\n    \"The local scale network properties consider only the direct neighbourhood within a defined $\\\\epsilon$-ball of a vertex $v$.\\n\",\n    \"A __local clustering coefficient__ $C_v$ characterizes the density of connections in the direct neighbourhood of $v$ in terms of the density of connections between all vertices that are incident with $v$. In particular, we consider the clustering coefficient by Watts and Strogatz,\\n\",\n    \"\\n\",\n    \"$$C_v=\\\\frac{2}{k_v(k_v-1)}N^\\\\Delta_v \\\\,,$$\\n\",\n    \"\\n\",\n    \"where $N^\\\\Delta_v$ represents the number of closed triangles including vertex $v$, and $k_v$ stands for the local recurrence rate around $v$.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"id\": \"72890ded\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating local clustering coefficients...\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<Figure size 1120x320 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"C_v = rn.local_clustering()\\n\",\n    \"\\n\",\n    \"plt.figure(figsize=(14, 4), dpi=80)\\n\",\n    \"plt.plot(C_v, \\\"r\\\")\\n\",\n    \"plt.xlabel(\\\"$n$\\\"); plt.ylabel(\\\"$C_v$\\\");\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"2e0821fe\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Global Clustering Coefficient and Network Transitivity\\n\",\n    \"\\n\",\n    \"In contrast, global scale network properties take all vertices into account.\\n\",\n    \"The __global clustering coefficient__ is defined as the average value of the clustering coefficient taken over all vertices of a network,\\n\",\n    \"\\n\",\n    \"$$C=\\\\frac{1}{N}\\\\sum_{v=1}^{N}C_v \\\\,.$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"id\": \"85ed81cf\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating the global clustering coefficient (C_2)...\\n\",\n      \"C = 0.7532331807249787\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(f\\\"C = {rn.global_clustering()}\\\")\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"6c9458f8\",\n   \"metadata\": {},\n   \"source\": [\n    \"The __transitivity__ of a network measures the probability that two neighbours (i.e., recurrences) of any state are also neighbours. It can be calculated from the link matrix $A_{i,j}$ of the network as\\n\",\n    \"\\n\",\n    \"$$T = \\\\frac{\\\\sum_{i,j,k=1}^N A_{i,j}A_{j,k}A_{k,i}}{\\\\sum_{i,j,k=1}^N A_{i,j}A_{k,i}}\\\\,,$$\\n\",\n    \"\\n\",\n    \"where $A_{i,j} = R_{i,j} - \\\\delta_{i,j}$ with the recurrence matrix $R_{i,j}$ and the Kronecker-delta $\\\\delta_{i,j}$.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"id\": \"02a5687e\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating transitivity coefficient (C_1)...\\n\",\n      \"T = 0.8021460350693536\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"print(f\\\"T = {rn.transitivity()}\\\")\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"d88f8295\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Recurrence Properties Under Fixed Recurrence Rate $RR$\\n\",\n    \"\\n\",\n    \"For comparison, we now calculate the same recurrence properties using a fixed recurrence rate.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"id\": \"e5b29970\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating recurrence plot at fixed recurrence rate...\\n\",\n      \"Calculating the supremum distance matrix...\\n\",\n      \"Calculating recurrence plot at fixed recurrence rate...\\n\",\n      \"Calculating the supremum distance matrix...\\n\",\n      \"Calculating local clustering coefficients...\\n\",\n      \"Calculating the global clustering coefficient (C_2)...\\n\",\n      \"C = 0.7544336150477271\\n\",\n      \"Calculating transitivity coefficient (C_1)...\\n\",\n      \"T = 0.8005944339367739\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<Figure size 480x480 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<Figure size 1120x320 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# choose fixed recurrence rate\\n\",\n    \"RR = 0.05\\n\",\n    \"METRIC = \\\"supremum\\\"\\n\",\n    \"rp = RecurrencePlot(time_series, metric=METRIC,\\n\",\n    \"                    normalize=False, recurrence_rate=RR)\\n\",\n    \"plt.matshow(rp.recurrence_matrix())\\n\",\n    \"plt.xlabel(\\\"$n$\\\"); plt.ylabel(\\\"$n$\\\");\\n\",\n    \"\\n\",\n    \"rn = RecurrenceNetwork(time_series, metric=METRIC,\\n\",\n    \"                       normalize=False, recurrence_rate=RR)\\n\",\n    \"# Local measures: \\n\",\n    \"# - Local Clustering Coefficients\\n\",\n    \"C_v = rn.local_clustering()\\n\",\n    \"plt.figure(figsize=(14, 4), dpi=80)\\n\",\n    \"plt.plot(C_v, \\\"r\\\")\\n\",\n    \"plt.xlabel(\\\"$n$\\\"); plt.ylabel(\\\"$C_v$\\\");\\n\",\n    \"\\n\",\n    \"# Global measures:\\n\",\n    \"# - Global Clustering Coefficient\\n\",\n    \"print(f\\\"C = {rn.global_clustering()}\\\")\\n\",\n    \"# - Transitivity\\n\",\n    \"print(f\\\"T = {rn.transitivity()}\\\")\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"479d003e\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Example: Lorenz Attractor\\n\",\n    \"\\n\",\n    \"In this example, we will be using the chaotic Lorenz system as defined in the introduction.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"id\": \"6178bd02\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def Lorenz_timeseries(dt=0.01, num_steps=10000, x0=0., y0=1., z0=1.05,\\n\",\n    \"                      s=10., r=28., b=2.667, spinup=1000):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Given:\\n\",\n    \"      dt: length of timestep\\n\",\n    \"      num_steps: number of timesteps\\n\",\n    \"      x0, y0, z0: initial values for timeseries\\n\",\n    \"      s, r, b: parameters defining the lorenz attractor\\n\",\n    \"      spinup: number of spinup-timesteps before storing results to output\\n\",\n    \"    Returns:\\n\",\n    \"      timeseries: numpy array of three dimensional timeseries on Lorenz attractor\\n\",\n    \"                  with length num_steps\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    # define integrator\\n\",\n    \"    def step(x):\\n\",\n    \"        v = np.array([s*(x[1] - x[0]),\\n\",\n    \"                      r*x[0] - x[1] - x[0]*x[2],\\n\",\n    \"                      x[0]*x[1] - b*x[2]])\\n\",\n    \"        return x + v * dt\\n\",\n    \"    # initialize\\n\",\n    \"    X = np.array([x0, y0, z0], dtype=np.float64)\\n\",\n    \"    # spinup\\n\",\n    \"    for n in range(spinup):\\n\",\n    \"        X = step(X)\\n\",\n    \"    # observe timeseries\\n\",\n    \"    timeseries = np.zeros((num_steps, len(X)))\\n\",\n    \"    timeseries[0] = X\\n\",\n    \"    for n in range(num_steps-1):\\n\",\n    \"        timeseries[n + 1] = step(timeseries[n])\\n\",\n    \"    return timeseries\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"cdb6dfe6\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we calculate a timeseries on the Lorenz attractor with the defined function. Try different timesteps, initial values and Lorenz parameters, or just use the default ones defined above.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"id\": \"05eb6b57\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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hUwmO+EsNU9PT4A+v7PjfV8iIieL6AoTOSZOTk5MmDCBX375xXpHDea776+++oqgoCBiYmKOuY8FCxYgl8spKChg7Nixvf4bKC0tLZx77rlIJBLWr1/f7zvub775Bo1GwzPPPMOff/7Z45+Xl5eNO8zOzs7mfXd9HOj1ub6wLOCW11p4//33bf52cHBgxowZ/Pjjj71mix3vHCZNmoSDgwNfffWVzePl5eVs2bJFzPoSOeWIFosIAFu2bOm10G7hwoW88MILzJs3j1mzZnHvvfeiVCp55513SE9P59tvvz3uHW9YWBhPP/00jzzyCIWFhZxzzjl4eHhQU1PDvn37cHJyGnAm0uWXX05mZiYffPABZWVllJWVWZ8LCgrq04308ccf4+Hhwb333tvD3QZw9dVX89prr5GSksKIESNISkriu+++4/vvvyciIgJ7e3uSkpKIjIzEwcGBr7/+mvj4eJydnQkICLC6B3sjLi6OyMhIHnzwQQRBQKVSsXbt2h6uKYDXXnuNqVOnMmHCBB588EGioqKoqalhzZo1vP/++7i4uJCYmAjABx98gIuLC/b29oSHh+Pp6cljjz3Gww8/zNVXX81ll11GQ0MDTz31FPb29jzxxBMD+qxFRAbMmc4eEDmzWDK5+vpXVFQkCIIgbN++XZg9e7bg5OQkODg4CBMnThTWrl3b6776yjBbtWqVMGvWLMHV1VWws7MTQkNDhYsuukj4448/rNtcc801gpOTU4/XWrK2LISGhvZ5zk888USvx09JSREA4c477+zz88jOzhYAawZbcXGxMH/+fMHFxUUAhNDQUOu23377rRAXFycoFAqb4/b1HgRBEDIzM4V58+YJLi4ugoeHh7B8+XKhtLS01/POzMwUli9fLnh6egpKpVIICQkRrr32WkGr1Vq3eeONN4Tw8HBBJpP1yFL76KOPhOHDhwtKpVJwc3MTli5dKmRkZNgc41jnKiJyokgE4SwtixYRERERGZKIMRYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERERkUFFFBYRERER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\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"lorenz = Lorenz_timeseries()\\n\",\n    \"\\n\",\n    \"ax = plt.figure().add_subplot(projection='3d')\\n\",\n    \"ax.plot(*lorenz.T, lw=0.5)\\n\",\n    \"ax.set_xlabel(\\\"X Axis\\\"); ax.set_ylabel(\\\"Y Axis\\\"); ax.set_zlabel(\\\"Z Axis\\\")\\n\",\n    \"ax.set_title(\\\"Lorenz Attractor\\\");\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"4bea44c2\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Recurrence Properties\\n\",\n    \"\\n\",\n    \"We first calculate the RP of this three-dimensional timeseries for a fixed recurrence rate.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"id\": \"07feab8f-6bdf-4c24-98a2-65f4dec2764a\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating recurrence plot at fixed recurrence rate...\\n\",\n      \"Calculating the supremum distance matrix...\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"RR = 0.05\\n\",\n    \"lorenz_rp = RecurrencePlot(lorenz, recurrence_rate=RR, metric=METRIC)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"id\": \"db9d16c4-5154-4371-ae3c-54e88f79e092\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<Figure size 480x480 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plt.matshow(lorenz_rp.recurrence_matrix())\\n\",\n    \"plt.xlabel(\\\"$n$\\\"); plt.ylabel(\\\"$n$\\\")\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"68cbfc9c-f3f7-4d28-b69f-e9e77969ebe4\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Local Clustering Coefficient\\n\",\n    \"\\n\",\n    \"From the local clustering coefficient we can calculate the local clustering dimension:\\n\",\n    \"$$CD_v=\\\\frac{log(C_v)}{log(\\\\frac{3}{4})}\\\\,.$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"id\": \"f24dfd26-1259-4c5b-bd92-88ff5b35df94\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating recurrence plot at fixed recurrence rate...\\n\",\n      \"Calculating the supremum distance matrix...\\n\",\n      \"Calculating local clustering coefficients...\\n\",\n      \"C_v = [0.81391066 0.81240007 0.81127381 ... 0.53332127 0.53707695 0.53951554]\\n\",\n      \"CD_v = [0.7157369  0.72219436 0.72701667 ... 2.1851597  2.16076691 2.14501963]\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"lorenz_rn = RecurrenceNetwork(lorenz, recurrence_rate=RR, metric=METRIC)\\n\",\n    \"lorenz_C_v = lorenz_rn.local_clustering()\\n\",\n    \"print(f\\\"C_v = {lorenz_C_v}\\\")\\n\",\n    \"CD_v = np.log(lorenz_C_v) / np.log(3/4)\\n\",\n    \"print(f\\\"CD_v = {CD_v}\\\")\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"id\": \"12015724\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<Figure size 640x480 with 2 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# plot trajectory on Lorenz attractor\\n\",\n    \"ax = plt.figure().add_subplot(projection='3d')\\n\",\n    \"ax.plot(*lorenz.T, lw=0.5, color=\\\"grey\\\")\\n\",\n    \"# plot local clustering dimension\\n\",\n    \"scat_plot = ax.scatter(*lorenz.T, lw=0.5, c=CD_v, s=1, cmap=plt.colormaps[\\\"jet\\\"])\\n\",\n    \"cb = plt.colorbar(scat_plot, pad=0.2)\\n\",\n    \"ax.set_xlabel(\\\"X\\\"); ax.set_ylabel(\\\"Y\\\"); ax.set_zlabel(\\\"Z\\\")\\n\",\n    \"ax.set_title(f\\\"$CD_v$ for fixed $RR = {RR}$\\\");\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"e3d9bb11\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Global clustering coefficient\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"74a04d72-2177-4734-a38d-f4276dd8f9d4\",\n   \"metadata\": {},\n   \"source\": [\n    \"Similarly to the local case, we can calculate the global clustering coefficient of the Lorenz timeseries and obtain its global clustering dimension as:\\n\",\n    \"$$CD=\\\\frac{log(C)}{log(\\\\frac{3}{4})}\\\\,.$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"id\": \"24aee056-ec76-4f2c-a21b-2459812a5ce8\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating the global clustering coefficient (C_2)...\\n\",\n      \"C = 0.6420799584495237\\n\",\n      \"CD = 1.5400418712226018\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"C = lorenz_rn.global_clustering()\\n\",\n    \"print(f\\\"C = {C}\\\")\\n\",\n    \"CD = np.log(C) / np.log(3/4)\\n\",\n    \"print(f\\\"CD = {CD}\\\")\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"c192e4cc\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Transitivity\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"0a7c3def\",\n   \"metadata\": {},\n   \"source\": [\n    \"Lastly, we can calculate the transitivity $T$ and its corresponding dimension $TD$ analogously.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 18,\n   \"id\": \"807bc13e-1c35-485e-84ea-11d820bc9dd9\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating transitivity coefficient (C_1)...\\n\",\n      \"T = 0.7217193610758386\\n\",\n      \"TD = 1.1336087419104863\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"lorenz_T = lorenz_rn.transitivity() \\n\",\n    \"print(f\\\"T = {lorenz_T}\\\")\\n\",\n    \"TD = np.log(lorenz_T) / np.log(3/4)\\n\",\n    \"print(f\\\"TD = {TD}\\\")\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"2fea4b6b\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Bonus Exercise: Transitivity Dimension as a Function of Recurrence Rate\\n\",\n    \"\\n\",\n    \"We can also calculate the transitivity dimension for an array of different recurrence rates. **Note:** This might take a while to finish.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 19,\n   \"id\": \"11ee1348-8720-4632-a64f-3552b017e998\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"application/vnd.jupyter.widget-view+json\": {\n       \"model_id\": \"3a0ffc57aa0c46bda8f6e4ac8ec9ec07\",\n       \"version_major\": 2,\n       \"version_minor\": 0\n      },\n      \"text/plain\": [\n       \"  0%|          | 0/10 [00:00<?, ?it/s]\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"CPU times: user 8min 47s, sys: 18.6 s, total: 9min 6s\\n\",\n      \"Wall time: 9min 2s\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"%%time\\n\",\n    \"\\n\",\n    \"# define grid of recurrence rates\\n\",\n    \"# rr = np.arange(0.02, .22, 0.04) # for a quick test (ca. 2 min)\\n\",\n    \"rr = np.arange(0.02, .42, 0.04) # for a more extensive calculation (ca. 10 min)\\n\",\n    \"\\n\",\n    \"# calculate transitivity dimensions (with progressbar)\\n\",\n    \"TD = []\\n\",\n    \"for r in tqdm(rr):\\n\",\n    \"    T_r = RecurrenceNetwork(lorenz, recurrence_rate=r, metric=METRIC,\\n\",\n    \"                            silence_level=2).transitivity()\\n\",\n    \"    TD.append(np.log(T_r) / np.log(3/4))\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 20,\n   \"id\": \"0a009840\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAAA58AAAEoCAYAAADfQUWYAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAAxOAAAMTgF/d4wjAABTy0lEQVR4nO3dd3iV9f3/8efJJntDSAghZACBLKZs1ArK0K+iouKoqCAiWm219mdr7dBaW2yrRdy2ilpBQUBrW5W9IeyRMBIghJC99zn374/AqZSVkHNyMl6P68olOfd97vsdPh7OeeWzTIZhGIiIiIiIiIjYkZOjCxAREREREZGOT+FTRERERERE7E7hU0REREREROxO4VNERERERETsTuFTRERERERE7E7hU0REREREROzOxdEF2Jq7uzshISGOLkNERERERKTTyc/Pp7a29oLHOlz4DAkJITs729FliIiIiIiIdDoREREXPaZhtyIiIiIiImJ3Cp8iIiIiIiJidwqfIiIiIiIiYncKnyIiIiIiImJ3rR4+586dS1RUFCaTiZ07d17wnFWrVtGlSxeSk5OtX9XV1a1bqIiIiIiIiNhMq692O3XqVJ566ilGjhx5yfPi4+MvGk5FRERERESkfWn18Dl69OjWvqWIiIiIiIg4WJud83nkyBFSU1MZPHgw8+fPv+h58+bNIyIiwvpVUVHRilWKiIiIiIhIU7R6z2dTpKamkp2djZ+fH9nZ2dxwww0EBwdz2223nXfuE088wRNPPGH9/lKbmoqItDX1Zgu7TpRQZ7ZYHzNh+u+fTWcf43uPnX/8/HO+fxfTZc41XeTx759//jW4zLnnPW66zHE71e/XxRV/T7cLFy4iIiKtpk2GT19fX+ufIyIiuOOOO1i7du0Fw6eISHtUU2/m020neGP1UU6WaEE1e4sN9WZQVCBDegUwOCqQiABPR5ckIiLS6bTJ8Hnq1Cm6du2Kk5MT5eXlrFixghkzZji6LBGRFiurqeeDjcd4b30mBRV1BHq58ejVMYT6ejSeYBjWc8/+6XsPYVzg+PfPOfex7393gWt97+xzH2/6uRes6wqvZVzgwQv9jN+/xgWf/z+PnyqtZmtmER9vOc7HW44D0N3Pg8G9AhsDaVQgsaHeODldpFtXREREbKLVw+fMmTP58ssvyc3NZfz48fj4+HD48GEeeOABpkyZwpQpU/jss894/fXXcXFxoaGhgVtvvZUf/vCHrV2qiIjNFFTU8u66TD7YeIzy2ga6+3nwy8n9uH1wJF3cnB1dXqeQXVzF1qwitmQWsy2riC925vDFzhwA/D1dGdSzsVd0cK9A+nf3w82lzS6LICIi0i6ZjAv9arwdi4iIIDs729FliIgAjYHnrTVH+WTrCWobLPQO8WLWmN7cmByucONgRZV1bMsqagykWcXsO1lKg6XxLdHD1YnkHv4MORNGUyMD8HJvk4OFRERE2pRL5TGFTxEROzicV87rq47yxc6TNFgMBoT78ci43lzXr5uGd7ZRVXUN7DxewpYzgTTtWAnV9WYAnJ1MJHT3bewZjQpgUFQgwd7uDq5YRESk7VH4FBFpJbuzS5i/8gj/2p+LYcCw6EBmj41hVGzwOauySttXb7awL6eMrZlFbMkqYltWEcVV9dbj0SFejT2jUYEM6RVIREAXtbGIiHR6Cp8iInZkGAYbjxYyf+UR1h0uAODavqE8PDaGgT0DHFyd2IphGBzJr2BLZvGZuaNF56xU3NXX3RpEB0cFEt/VR73cIiLS6Sh8iojYgcVi8M2B08xfdYSdJ0pwMsGUpO7MGtubPt18L38BafdySqrZemaY7tbMYtJPl1uP+Xq4MCgqkEFRAQyJCmRAhB/uLlpcSkREOjaFTxERG2owW1i+O4fXVx0h43QFbi5O3DowgpmjexMZpP0jO7OSqjq2ZRVbA+mek6XUmxvfZt1dnEg6ZxEjf3w8XB1csYiIiG0pfIqI2EBNvZlF27N5c80RThRV4+XmzPRhPZkxstd/9+kU+Z7qOjM7T5RYw2jasWIq6xoXMXIyQd8w33OG6ob4aBEjERFp3xQ+RURaoLymnoWbj/POukzyy2sJ8HTlhyN6ce9VUfh5qudKmq7BbOHAqfLGFXUzGwNpYWWd9XivYC/rarpDogLpGeSpRYxERKRdUfgUEbkChRW1vL8hi79tyKKspoFuvh48ODqaO4b0wNNNez5KyxmGwdGCyjNBtHG47vGiKuvxEB/3MyvqBjC4VyB9uvnirEWMRESkDVP4FBFphpySat5ae5SPtxynpt5Cr2AvHh7Tm5tSwnFzcXJ0edLB5ZbW/HcRo6xiDuaWcfad2sfdhdSeAdZhuokRfni4ahEjERFpOxQ+RUSa4Eh+BQtWHWHpzpPUmw36hfnyyLgYJvTvpt4mcZjS6nrSjhVbh+ruzi6lzmwBwM3ZiaQeftZhugOjAvDVIkYiIuJACp8iIpew92Qp81cd5p97czEMGNIrkNljezMmLkTz7aTNqak3szu71LrX6PZjxVTUNgBgMkGfbr4MOTNMd3BUIF21GJaIiLQihU8Rkf9hGAZbMov466ojrMnIB+DqPqHMHtubQVGBDq5OpOnMFoMDp8qsQ3W3ZBZTUFFrPR4Z6HlmRd0ABkcF0ivYS79UERERu1H4FBE5wzAMvjuYx/xVR9h+rBgnE0xM7M7DY3rTr7uvo8sTaTHDMDhWWHXOirpZhf9dxCjY241BPRv3Gh0SFUjfMB9cnDWXWUREbEPhU0Q6vQazhS/3nOL1VUc4mFuOm7MTtwwMZ+bo3kQFezm6PBG7yiuvYVtWMVvOhNEDp8qwnHn393JzblzEKKoxkCb38NciRiIicsUUPkWk06ptMPPZ9pMsWH2E40VVeLo5c+eQSB4YFU03P82Fk86pvKae7ceKrSvq7jxRQl1D4yJGrs4mBoT7WXtGB/UM1H62IiLSZAqfItLpVNY28NHm47y19ih55bX4dXHlhyOiuPeqKAK83BxdnkibUttgZk92qXWo7rZjxZTX/HcRo/iuPgyKCjgzdzSQML8uDq5YRETaKoVPEek0iivreH9DFu9vyKK0up5QH3ceGh3NHUMi8XJ3cXR5Iu2CxWKQfrrcuqLu1qwiTpf9dxGjiIAujb2iUYGMiAmiZ5CGrouISCOFTxHp8HJLa3hr7VE+3nKcqjozPYM8mTWmNzenhuPuovlrIi1hGAYniqrZklXEtqwitmQVcTS/0nq8V7AXY+JCGBMfwrBeQXRx02tORKSzUvgUkQ4rs6CSN1Yf4bO0bOrNBn26+TB7XAw39O+mFTxF7KigopatmUWsOVTA6vQ8ckprAHB3cWJodBBj4kIYGx9CtLZ2ERHpVBQ+RaTD2ZdTyuurjvDVnlNYDBjUM4DZ43ozLj5UH3RFWplhGBzOq2B1Rj6r0vPZkllEnblxAaOIgC5ngmgow3sHafi7iEgHp/ApIh3G1qwi5q88zMr0fADGxIXwyLgYhvQKdHBlInJWVV0DG48UWsPo8aLGfUZdnU0Mjgq0htG4rt76ZZGISAej8Cki7ZphGKzKyOf1lUfYklWEyQQ39A/j4bG96R/u5+jyROQSDMMgq7CKVel5rM7IZ+ORQmrPbOsS5ufROFc0LoQRscH4emhLFxGR9k7hU0TaJbPF4J97TzF/5RH2nyrD1dnEzSkRzBwTTXSIt6PLE5ErUFNvZnNmkTWMnl24yNnJxMDIAMbEN4bRhO6+6hUVEWmHFD5FpF2pa7CwZEc2C1YfJbOgki6uztwxJJIHRvWiu7/2FxTpSI4XVrH6UD6r0/PYcKSQqjozACE+7oyObVy0aFRsMP6e2p9XRKQ9UPgUkXahqq6BjzYf5+21meSW1eDr4cJ9w6O4b0QvAr30wVOko6ttMLMtq/jMXNE8Mk5XAOBkguQe/oyJC2VsfAgDwv1wclKvqIhIW6TwKSJtWklVHX/bcIz3N2RSXFVPiI87D4zsxZ1DI/HRHDCRTiunpJrVGfmsTs9n/eECymsbAAj0cmN0bDBj4kMYHRtCkLe7gysVEZGzFD5FpE3KK6vh7XWZLNx0jMo6Mz0CuzBzdG+mDozAw1Wb1IvIf9WbLaQdK2bVmTC6/1QZACYTDAj3Y2xcCGPiQ0iK8NcevyIiDqTwKSJtyvHCKhasOcLibdnUmS3Ed/Vh9rjeTBwQpg+NItIkeWU1jcNzM/JZm5FPWU1jr6hfF1dGxgY3htG4EEJ9PRxcqYhI56LwKSJtwsHcMl5fdYTlu3KwGJAS6c/ssTFc0ydU87dE5Io1mC3syi5hdXpjGN2dXWo91i/MlzHxIYyNCyG1ZwCu+gWXiIhdKXyKiENtP1bM/JWH+fZgHgCjYoOZPTaGYdGB2kpBRGyuoKKWtYcah+euOVRAUWUdAD7uLoyICbZu56LVs0VEbE/hU0RanWEYrD1UwF9XHmZzZhEmE0xI6MbDY3uTGOHv6PJEpJOwWAz2nCy1rqC780QJljOffOK6ejMmLoSx8aEMigrA3UVzzUVEWkrhU0RajcVi8K99ucxfdYQ9J0txcTJxU0o4s8b0JibU29HliUgnV1JVx9pDBY2r6Gbkk19eC4CnmzPDewdZw2iPQE8HVyoi0j4pfIqI3dU1WFi68yQLVh/haH4l7i5O3DEkkgdHRxOuoW0i0gZZLAYHcstYld4YRLcfK8Z8pls0OtjLOjx3WHSQVuAWEWkihU8RsZvqOjOfbD3OW2uOklNag4+HC/dc1ZMfjuhFsPbeE5F2pKymng2HC6xh9FRpDQDuLk4Miw5i7Jkw2ivYS/PVRUQuQuFTRGyutLqeDzZm8e76LIoq6wj2duP+kb2YPqwnvh6uji5PRKRFDMMg43QFqzPyWJWez9asIurNjR+ZIgM9zwzPDeGq3kF4urk4uFoRkbZD4VNEbCa/vJZ31mXy4aZjVNQ2EO7fhVljorl1UA8NSxORDquytoENRwqtYTS7uBoAN2cnhvQKZExcCGPiQ4gN9VavqIh0agqfItJiJ4qqeHPNUf6x7QR1DRZiQr2ZPbY3k5O6a988EelUDMPgaEGldXjupqOF1DVYAOju53FmrmgoI2KC8NFIEBHpZBQ+ReSKNZgt/PyLvXy6LRuzxSCphz+zx/bmB3274uSk3+6LiFTXmdmUWcjqM2E0s6ASABcnEwN7BjAmPoSxcaH0DfNRr6iIdHgKnyJyxX775X7eWpvJkKhAHrs2luG9g/ThSUTkEo4VVjZu5ZKez4YjhVTXmwEI9XG3Ds8dFROCn6d6RUWk41H4FJEr8uXuUzzyURqDegbw0YPDcHPR8FoRkeaoqTezLauYVel5rM7I51BeBQBOJkiJDGDsmTDav7ufRpOISIeg8CkizXY4r5wpr63H082FL+eOpKuvh6NLEhFp97KLq1iTUcCq9DzWHy6gsq6xVzTIy43RZ1bQHRUbQqCXm4MrFRG5Mi0OnzU1Nfz4xz9m0aJFFBcXEx8fzz333MPjjz+Oq2vbGjKi8CnScuU19dz41/UcK6zioweGMjQ6yNEliYh0OHUNFrYfK2Z1Rj6r0vM4mFsOgMkEiRH+jUN044JJivDHRQu7iUg70eLw+fzzz7N582Z+8YtfEBgYSEZGBq+//joVFRV88803bSqAKnyKtIxhGMxemMY/9+by7MS+PDAq2tEliYh0CqfLaqyLFq05lE95TQMAvh4ujIgJZnRcCKPjQgj37+LgSkVELq7F4TMlJYVVq1bh5+d3zuOzZ88mJiaGJ554osnFzJ07l2XLlnHs2DF27NhBcnLyRc81DINrrrmGtLQ0SkpKmnR9hU+RlnlzzRFe+OogExPDeO2OFC0uJCLiAA1mCztPlLAmI5/VhwrYnV3C2U9svUO8rEF0WK8gurhpj2URaTtsEj537Nhx3uMlJSVMmjSJdevWNbmYNWvWEB0dzciRI1m6dOklw+e8efM4cOAAixYtUvgUaQUbjhQw/e3NRId488UjI/Byd3F0SSIiAhRX1rHucAFrzvSKni6rBcDNxYkhUYGMjgtmVGwIfbppOxcRcaxL5bEmfbK82D9i/v7+1NbWNquY0aNHN+m8ffv2sXTpUt577z0WLVrUrHuISPOdKq3m0Y924OnmwoLpAxU8RUTakAAvNyYndWdyUncMw+BQXkVjr2hGPpszi1h3uAA4SKiPO6NiQ6xhVAsXiUhb0qRPlxkZGdxxxx2kpKSQnJxMSkoKISEhAFgsFpsXVV9fz4MPPsg777yDs/Olh5LMmzePefPmWb+vqKiweT0iHV1tg5nZC9MorKxjwfRUYkK9HV2SiIhchMlkIq6rD3FdfXhgVDQ19WY2ZxY19opm5PNZWjafpWVjMsGAcD9GxzYO0U2J9MdVCxeJiAM1adjtpk2b2L59O2lpaWzfvp39+/cTGhpKSkoKmzdvJi8vr9k3joqKuuiw22effRZ/f39+/OMfk5WVRXJysobditjRz5fu5YNNx5g5Jppnru/r6HJERKQFckqqWXsonzUZBaw7XEBpdT0APu4uXNU7iNFxIYyJC6FHoKeDKxWRjqjFw26PHTvGI488Yv2+traW3bt3k5aWRlhYmG2q/J7Vq1dz/PhxXnvtNRoaGigrKyMqKoqtW7dae1xFxDY+257NB5uOMbx3ED+5Lt7R5YiISAt19+/C7YMjuX1wJGaLwa7sEmuv6DcHTvPv/acB6BXsxejYxlV0h0UHabqFiNhdk3o+U1NTSUtLs+mNL9Xz+X3q+RSxn305pdw8fwOBXm4sf3Qkwd7uji5JRETsqLSqnvVHCqxhNKe0BgBXZxODegYyKi6Y0bEh9AvzxclJCxeJSPO1uOezCfm0yWbOnMmXX35Jbm4u48ePx8fHh8OHD/PAAw8wZcoUpkyZYrN7icjFlVbV8/CHaVgMg/l3pSp4ioh0An6ertwwIIwbBoRhGAZH8iutK+huOlrIxqOF/P7rdIK93RkVG2xduEjvESJiC03q+ezRowd//etfSU5OJjIysjXqumLq+RS5PIvF4IG/b+O7g3n85qb+TB/W09EliYiIg9XUm9mWVcyaQ429ogdzy63HErr7Nu4tGhvCwJ4BuLlo4SIRubAW7/MZEBBAXFwce/bswdPTk5SUFFJTU63/jYuLs3nRV0rhU+Ty/vLtIeb9J4NbUiP4w62J2hNORETOc7qs5kyvaAHrDuVTXNW4cJGXm7N14aLRsSFEBXs5uFIRaUtaHD5TUlLYsWMHZrOZAwcOkJaWxo4dO0hLS2P37t0UFxfbvOgrpfApcmmr0vP44ftb6dvNl89nD8fD9dLbGYmIiJgtBntPlrImI5+1hwrYfrwYs6XxI2RkoCejz8wVvap3ED4erg6uVkQcyWbhsz1Q+BS5uBNFVUx6dR2GYbDi0VFEBmmZfRERab7ymno2HCm0zhc9UVQNgIuTidTIgMYwGhdC/+5+WrhIpJNp8YJDTz/9tE0LEpHWV1Nv5uGF2ymtrue9+wYreIqIyBXz8XBlfEI3xid0wzAMsgqrrCvobjxayJasIv7w7wwCvdwYGRN8ZohuMKG+Ho4uXUQcqEk9n+2Jej5FzmcYBk8t3s2i7dk8dk0sP/pB25mnLSIiHUttg5ntx4pZk9G4pcv+U2XWY326+TAmLoTRcSEMigrA3UVTP0Q6mhYPu21PFD5FzvfR5uP8bMkexsaH8O69gzUESkREWk1+eS1rDzXOFV17KJ+CijoAurg6Myw6sLFXNC6E6GAvLYAn0gEofIp0YjtPlHDbgo109XNn+ZyR+Hu6ObokERHppCwWg/2nyqzbuWw/Vky9ufGjaLh/F0bHhTAmLpjhMcH4auEikXZJ4VOkkyqsqGXyq+sorKzjs4eH0z/cz9EliYiIWFXUNrDpSKE1jGYVVgHg7GQiuYc/o2NDGB0XTGKEP84atSPSLtg0fFosFnJzc2loaLA+FhkZ2bIKbUjhU6SR2WJwz7ubWX+4kD/cmsTUgRGOLklEROSSjhdWsfpMEN14pJCK2sbPm/6eroyICWZMbOMQ3W5+WrhIpK2yWfh8//33mTt3Lq6urjg5OTVewGQiLy/PNpXagMKnSKPff32Q+auOcNfQSH77fwMcXY6IiEiz1Jst7DheYt3OZc/JUs5+ao3r6n2mVzSEIb0CtWe1SBtis/DZu3dvvvrqK+Lj421WnK0pfIrAv/blMvOD7ST18OfTmcO0mqCIiLR7hRW1rDtc0LiK7qF88strAXB3cWJodBCjYxu3dIkN9dbCRSIOZLPwOXToUDZv3myzwuxB4VM6u6P5Fdz42npcXZxY8ehIuvt3cXRJIiIiNmUYBgdzy629olszi6kzWwAI8/Ng1JkgOjImWAvtibQym4XPF198kS5dunDnnXfi4fHfsfa+vr4tr9JGFD6lM6uqa+Cmv67ncF4FH8wYyoiYYEeXJCIiYndVdQ1sPlrE6jNh9Gh+JQBOJkiM8LeuopsU4Y+Ls5ODqxXp2GwWPs/O8zznAiYTZrP5yquzMYVP6awMw+CxT3aybFcOT0/ow8Njezu6JBEREYfILq5qHJ6bkc/6IwWU1zQuXOTr4cKImGDr3qLhGh0kYnM232rl5MmTAISHh7esMjtQ+JTO6t11mfxqxX7GJ3RlwfSBmu8iIiICNJgt7MouYfWZMLoru8S6cFF8Vx/G9glhXHwoA3sG4KpeUZEWs1n4PHjwIFOnTiUnJwdoDJ+LFy9uUwsQKXxKZ7Qls4g739pEZKAnS+eM0MbcIiIiF1FSVce6wwWsTs9nZXo+BRWNCxf5uLswKi6YsfGhjI0PIdRH27mIXAmbhc9x48bx4IMPcueddwLwySef8MYbb7By5UrbVGoDCp/S2eSV1TDx1XVU1jaw9JERxHX1cXRJIiIi7YLFYrAvp4yV6XmsTM9j54n/9ooOCPdjXHwIY/uEkhThj7OTRhSJNIXNwmdycjI7d+687GOOpPApnUm92cKdb21ia1Yxr96RwuSk7o4uSUREpN0qqqxjTUY+K9PzWJ2RT0lVPQABnq6MiQthXJ9QRseGEOClFXRFLuZSecylORdydnZm//799OvXD4D9+/fj7Kz9A0Uc5cWvDrI1q5gZI3speIqIiLRQoJcbN6WEc1NKOGaLwc4TJaw60yu6dGcOS3fm4GSC5B7+jIsPZVyfUPqF+eKkXlGRJmlWz+e//vUv7rrrLhITEwHYs2cPCxcu5LrrrrNbgc2lnk/pLJbtymHuxzsYEhXIwgeHapEEEREROzpdVnNmnmgeaw8VUFHbuIJuiI87Y+NCuLpPKCNig7XugnR6Nl3tNj8/n82bNwMwbNgwgoPb1j6CCp/SGWScLufG19bj4+HCirkjtSiCiIhIK6prsLD9WLG1VzTjdAUALk4mBkUFWHtFY0O9tfq8dDo232qlLVP4lI6urKaem15bz/GiKj5+aBiDowIdXZKIiEinll1cxar0fFYezGP9kQJq6i0AhPt3YWx841Yuw2OC8HRr1ow3kXapxeGzsrISLy8vysrKLnjc19e3ZRXakMKndGSGYTDzg+38e/9pnpvcjx+O6OXokkREROR7aurNbM4sYuXBxl7RY4VVALi5ODEsOohxZ8JoVLCXgysVsY8Wh8/U1FTS0tJwcnLCZDLx/aeYTCbMZrPtqm0hhU/pyF5fdYSXvj7IlKTu/HlasobyiIiItHGZBZXWILr5aBF15sZe0V7BXtZe0SG9AvFw1SKe0jHYZdhtSUkJJ06cYMCAAS0qztYUPqWjWn+4gLvf2UxsqA9LHhmuoTsiIiLtTGVtAxuPFDbuK3owj5zSGgC6uDozIiaIsWfmiob7d3FwpSJXzmbhc8KECXzyySe4uLjQv39/AO655x5+9atf2aZSG1D4lI7oZEk1k19dR32DhS/mjCA6xNvRJYmIiEgLGIZBxukKaxDddqwYs6XxY3lcV2/rokUDewZoRXtpV2wWPlNSUtixYweffvop69ev5+WXX2bgwIHs2bPHZsW2lMKndDS1DWZuW7CRXdmlvHn3QK5L6ObokkRERMTGSqvrWX+44MwQ3XwKKmoB8HF3YVRcMGPjQxkbF0Kor1a4l7btUnmsWeP26uvrAVizZg0TJkzAzc0NFxcN/ROxp+eX72dXdimPjOut4CkiItJB+XVx5YYBYdwwIAyLxWD/qTJWHszju/Q8/rk3l6/25ALQP9yXcfGhjI0PJbmHP85OWv9B2o9m9XxOmzaN0tJSDhw4wP79+wEYMWIEO3bssFuBzaWeT+lIPt12gqcW72ZkTDB/u3+I3mBEREQ6oaLKOtZk5LMyPY/VGfmUVDV2CAV4ujI6LoSr+4QyOjaEAC83B1cqYsNhtzU1NXz99dckJSXRq1cvTp48yZ49e5gwYYLNim0phU/pKPaeLOXm1zcQ4u3O8kdHEqg3FBERkU7PbDHYeaKEVemNK+juPdm4FaLJBCk9/K1zRfuF+eKkX1qLA9h0tVuLxUJubi4NDQ3WxyIjI1tWoQ0pfEpHUFJVx6RX15FXVsuiWVeR1MPf0SWJiIhIG5RXVsOqjHxWHsxj7aECKmobP6OH+LgzNi6EcX1CGRkbjK+Hq4Mrlc7CZuHz/fffZ+7cubi6uuLk1LjqlslkIi8vzzaV2oDCp7R3FovBD9/fyuqMfF68eQB3DGk7v9wRERGRtqvebGFbVrG1VzTjdAUALk4mBvYMYFyfUK7uE0psqLf2Che7sVn47N27N1999RXx8fE2K87WFD6lvXvlPxn8+dtD3DYogpduSdSbg4iIiFyR7OIqVqXnsyo9j/WHC6muNwMQ7t+FsfEhjIsPZXhMkPYOF5uyWfgcOnQomzdvtllh9qDwKe3ZdwdPc//72+gf7sviWcPxcHV2dEkiIiLSAdTUm9mcWXRmK5c8jhVWAeDm7MTQ6EDrXNFewV4OrlTaO5uFzxdffJEuXbpw55134uHx3z2GfH19W16ljSh8Snt1rLCSya+uw8nJxPI5I+kR6OnokkRERKSDyiyotAbRzUeLqDNbAIgK8mTsmSA6tFegfhEuzWaz8Hl2nic0zvU0DAOTyYTZbG55lTai8CntUXWdmZtf38DB3DLeu28wY+NDHV2SiIiIdBJVdQ1sOFzIyvQ8Vh7MI6e0BoAurs6MiAlibHwoY+NDiAjQL8bl8i6Vx5o1wNtisdikIBH5L8Mw+H9L9nDgVBlP/CBOwVNERERalaebC9f268q1/bpiGAaH8ir47mDemZ7RfL450Li4aFxXb8bFhzI2PpRBUQG4Ojtd5soi52r2ViunTp0iPT2dsWPH0tDQgMViwc2t7ew/qJ5PaW8+2HSMny/dyzV9QnnrnkHak0tERETajLKaetYdKrAG0YKKWgB83F0YGRt8JoyGEOrrcZkrSWdhs2G3ixcv5sknn8RkMpGVlcWuXbt45pln+Oqrr2xWbEspfEp7kna8mNvf2Eh3/y4smzMSvy7ag0tERETaJovFYP+pMutc0R0nSjibJPqH+1p7RZN7+OOsX6Z3WjYLnwMHDuTf//431157LTt27AAgISGBffv22aZSG1D4lPaioKKWSX9ZR0l1HZ8/PIJ+3dvOwl0iIiIil1NUWceajHxWpuexOiOfkqp6APw9XbmmT1cmJ4UxIiZYw3M7GZvN+XR2diYoKOicx9rSkFuR9qLBbOHRj3aQW1bDK7cnKXiKiIhIuxPo5cZNKeHclBKO2WKw80QJq9Lz+PZAHp+lZfNZWjYBnq5M6B/G5KQwhvYKUo9oJ9es8Onj48Pp06etm95/++23BAYG2qUwkY7s5X+ns/FoIfdc1ZP/S4lwdDkiIiIiLeLsZGJgzwAG9gzgyeviySqoZMXuHJbvOsXHW47z8ZbjhPi4M3FAGJMSw0iNDNA6F51Qs4bdbtu2jYceeoijR4/Sv39/MjMz+fLLL0lOTm7yDefOncuyZcs4duwYO3bsuOBzN27cyMMPPwxAfX09I0eO5C9/+Qvu7u6Xvb6G3Upb9889p3h4YRopkf7846GrcHPRUBQRERHpuDJOl7NiVw7Ld58is6ASgO5+HkxMDGNyUncGhPtZO7ek/bPZnE+A0tJSNmzYgGEYDB8+HH9//2YVs2bNGqKjoxk5ciRLly69YPisqqrC1dUVV1dXLBYLt9xyC6NHj+ZHP/rRZa+v8Clt2eG8Cm7663o8XJ1Y/uhIwvy6OLokERERkVZhGAb7cspYvjuHFbtOcbKkGoCeQZ5MOhNE47v6KIi2czab8wng5+fH9ddff8XFjB49+rLneHr+dwPburo6qqur9T+htHsVtQ3M+nA71fVm3rpnkIKniIiIdComk4n+4X70D/fjpxP6sONECSt2nWLF7hz+uvIIf115hJhQbyYndmdSUhi9Q7wdXbLYWLPG+61Zs4YhQ4YQGBiIr68vPj4++PraZ6GUrKwskpKSCA4Oxs/Pj9mzZ9vlPiKtwTAMnl68m8N5FTw9IZ6regdd/kkiIiIiHZTJZCI1MoBfTO7Hxmeu4ZOHhjF9WCRFlXW88k0G1/xxNTf8eS2vrzrCiaIqR5crNtKsYbfx8fH89re/ZciQITg7O1sfDw8Pb/aNo6KiLjrs9vsqKiqYPn0606ZNY9q0aecdnzdvHvPmzTvn/JKSkmbXI2JPb689ym++PMD1/bsx/65U9eSLiIiIXECD2cLGo4Us35XD13tzKatpACC5hz+TEsOYlNidbn4eDq5SLsVmcz4HDx7M1q1bbVJUU8MnwCeffMLChQtZvnz5Zc/VnE9pazYdLeSutzcTFeTJF3NG4u3e7NHuIiIiIp1OXYOFtYfyWb4rh//sP01lnRmTCQZHBTI5MYzrB4QR7H35BUmlddlszuctt9zCBx98wO23327X/T0PHz5Mz549cXV1pa6ujiVLlpCYmGi3+4nYS25pDXM+SsPDxYk37h6o4CkiIiLSRG4uTlzTtyvX9O1KTb2ZlQfzWLH7FN8ePM2WzCKeW7aP4b2DmZwUxviEbvh72i+fiG00q+fziy++YPr06VRVNY67NgwDk8mE2Wxu8g1nzpzJl19+SW5uLkFBQfj4+HD48GEeeOABpkyZwpQpU3jzzTf5y1/+grOzMw0NDVxzzTX8/ve/x8Pj8l3s6vmUtqKuwcIdb21i+7Fi5t+Vyg0DwhxdkoiIiEi7V1nbwDcHTrN81ylWZ+RRbzZwdTYxKjaEyUlhXNu3Kz4ero4us9Oy2bDb6Oho3n77bQYNGnTOnE8vL6+WV2kjCp/SVvxy2T7e35DFQ6Oj+dkNfR1djoiIiEiHU1pdz7/35bJ89ynWHy7AbDFwc3Hi6vhQJiWFcU2frnRxc778hcRmbBY+hw0bxqZNm2xWmD0ofEpbsHTHSR7/x06GRQfy4YyhuDg3a2FpEREREWmmwopavt6Xy/JdOWzOLMIwwNPNmWv6dmVyYhhj4kNwd1EQtTebhc8XXngBX19fbrvttnOGwNpru5UrofApjnbgVBn/N389fl1cWfHoKEJ8NBFeREREpDWdLqvhqz2nWLH7FNuPFQPg4+HCdf26MTkpjBExwbiqc8AubBY+nZz+20Amk+mK5nzam8KnOFJpdT03vraOkyXVfPLQVQzsGeDokkREREQ6tZMl1Xy5O4flu06x52QpAAGerkzoH8bkpDCG9grC2Unb4NmKzcJne6DwKY5isRg89ME2vjmQx69uTOCeq6IcXZKIiIiIfE9WQSUrzgTR9NPlAIT4uDNxQBiTEsNIjQzASUG0RVocPisrK/Hy8qKsrOyCxzXsVgRe++4Qf/h3Bv+XEs6825IwmfQPl4iIiEhblXG6nBW7cli++xSZBZUAdPfzYGJiGJOTujMg3E+f565Ai8NnamoqaWlpODk5WYfbWi+gYbcirMnI5973thDf1Ycls0doVTURERGRdsIwDPbllLF8dw4rdp3iZEk1AD2DPJl0JojGd/VREG0iDbsVsaMTRVVMfm0dZovB8jkjiQpuO1sPiYiIiEjTGYbBjhMlrNh1ihW7c8grrwUgJtSbyYndmZQURu8QbwdX2ba1OHweP378kscjIyOvrDI7UPiU1lRTb+bWBRvZc7KUd+4dxDV9uzq6JBERERGxAbPFYGtWESt25/DVnlyKKusA6Bfmy+Sk7kxKDKNHoKeDq2x7Whw+Q0JCrN3MhYWFuLq6AlBfX09QUBB5eXk2LLdlFD6lNf30s918svUEc6+O4Ynr4h1djoiIiIjYQYPZwsajhSzflcPXe3Mpq2kAILmHP5MSw5iU2J1ufh6XuUrnYLNht08//TQxMTHMmDEDgHfffZcjR47w4osv2qZSG1D4lNbyyZbj/PTzPYyOC+G9+wZriW4RERGRTqCuwcLaQ/ks35XDf/afprLOjMkEg3sGMjkpjOsHhBHs3Xn3ebdZ+ExOTmbnzp3nPJaSksKOHTtaVKAtKXxKa9idXcLUBRsJ8XZnxaMjCfByc3RJIiIiItLKaurNrDyYx4rdp/jmwGlqGyw4mWB472AmJ4UxPqEb/p6d63PipfKYS3MuVFdXR3p6OvHxjcMLMzIyqK2tbXmFIu1IUWUdD3+YBsCC6QMVPEVEREQ6KQ9XZ64f0NjbWVHbwLcHTrN81ylWZ+Sx7nABzy7dy6jYECYnhXFt3674eLg6umSHalb4/N3vfseIESNISkoCYPfu3bz77rt2KUykLTJbDB77ZAcnS6r5/S2JDIjwc3RJIiIiItIGeLu7cGNyODcmh1NaXc+/9+WyfPcpVmfk893BPNxcnLg6PpRJSWFc06drp9yar9lbreTn57Np0yYArrrqKoKDg+1S2JXSsFuxpz/8K53XVh7mjiE9ePHmREeXIyIiIiJtXGFFLV/vy2X5rhw2ZxZhGODp5sw1fbsyOTGMMfEhuLt0nCCqfT5FbOA/+0/z4N+3kRjhx6czr8LDteP8IyEiIiIi9ne6rIav9pxixe5TbD9WDICPhwvX9evG5KQwRsQE4+rs5OAqW0bhU6SFMgsqmfLqOlycTSx/dCQRAdrTSURERESu3MmSar7cncPyXafYc7IUgABPVyb0D2NyYhhDo4Pa5W4KCp8iLVBV18DN8zeQcbqcv90/hFGxIY4uSUREREQ6kKyCSlacCaLpp8sBCPFxZ+KAMCYlhpEaGYBTOwmiNgufJSUl+Pv726ouu1D4FFsyDIPH/7GTL3bm8JPx8TwyLsbRJYmIiIhIB5ZxupwVu3JYvvsUmQWVAHT382BiYhiTk7ozINwPk6ntBlGbhc+QkBBuuukm5syZY13xtq1R+BRb+tuGLJ5bto8f9OvKG9MHtpvfOImIiIhI+2YYBvtyyli+O4cVu05xsqQagJ5Bnvx8Yj+u7dfVwRVe2KXyWLNmsx4+fJiEhARuu+02Ro0axaefforZbLZJkSJtzfZjRfx6xX6igjz5421JCp4iIiIi0mpMJhP9w/145vq+rHt6HJ/PHs79I3pRXWfGz7N97hd6xXM+v/76ax566CHMZjOzZ8/m8ccfx8vLy9b1NZt6PsUW8sprmPzqOsqqG1jyyHD6dPN1dEkiIiIiIlgsjfGtrXaM2KznE6CsrIw//elPPPbYYyQkJPDqq6+Sm5vL+PHjW1yoSFtQb7Yw56MdnC6r5Xe3DFDwFBEREZE2w8nJ1GaD5+W4NOfkmTNn8sUXXzB16lSWLVtGfHw8ADfffDN9+/a1S4Eire33Xx9kS2YR9w2P4sbkcEeXIyIiIiLSITQrfMbFxZGeno6fn995x7777jubFSXiKCt25/DW2kwG9QzgZzfoFyoiIiIiIrbSrGG3995773nBs6CgAICwsDDbVSXiAIdOl/PU4t0Ee7vz17tScXNp9qh0ERERERG5iGZ9ur7uuuua9JhIe1NeU8/MD7dT22Dhr3em0NXXw9EliYiIiIh0KE0adltXV0dNTQ1ms5ny8nLOLpBbWlpKZWWlXQsUsTfDMPjJot0cza/k2Yl9GRod5OiSREREREQ6nCb1fL744ov4+/uzd+9e/Pz88Pf3x9/fnwEDBjB9+nR71yhiV2+uOcrX+3KZlBjGjJG9HF2OiIiIiEiH1Kx9Ph9++GFef/11e9bTYtrnU5pjw+ECpr+zmd4h3ix9ZARe7s1ag0tERERERL7nUnmsSZ+0Kysr8fLy4qWXXqKsrOy8476+2gdR2p9TpdU8+vEOPN1cWHD3QAVPERERERE7atKn7VGjRpGWloa/v/95x0wmE2az2dZ1idhVbYOZhz9Mo7CyjgXTB9I7xNvRJYmIiIiIdGhNmvOZlpYGQF5eHhaL5ZwvBU9pj36z4gA7T5Qwa0xvJvTv5uhyREREREQ6vGZttRIfH8+tt97KP//5TywWi71qErGrz7Zn88GmYwzvHcSPr4tzdDkiIiIiIp1Cs8Ln8ePHmThxIi+99BI9e/bkmWeeISMjw161idjcvpxSfrZkD2F+HvzljhRcnJv1EhARERERkSvUrE/eXl5e3HfffaxatYo1a9ZQWFhI37597VWbiE2VVtUz68PtWAyD+XelEuzt7uiSREREREQ6jWYv71lfX8+yZct499132bp1Kw8//LA96hKxKYvF4PF/7OBEUTW/uak/KZEBji5JRERERKRTaVb4fPTRR1m0aBEpKSn88Ic/ZMmSJbi5udmrNhGbefW7w6xMz+eW1AjuGhrp6HJERERERDqdZoXPsLAwtm3bRkREhL3qEbG5lel5/OnbDPqF+fLb/+uPyWRydEkiIiIiIp1Ok8JnZWUlXl5ezJkzB4CysrJzjvv6+tq+MhEbOFFUxeOf7MTXw5UF0wfi4ers6JJERERERDqlJoXPUaNGkZaWhr+/PyaTCcMwzvmv9vqUtqim3sysD7dTVlPPu/cNJjLI09EliYiIiIh0Wk0Kn2lpaQDa21PaDcMweHbpXvbllPH4tbGMiw91dEkiIiIiIp1as7ZaKSgoaNJjIo728ZYTLN6ezbj4EOZeHevockREREREOr1mhc/rrruuSY+JONLOEyX8ctk+egR24ZXbk3Fy0gJDIiIiIiKO1qTwWVdXR1lZGWazmfLycsrKyigrK+PEiRNUVlY264Zz584lKioKk8nEzp07L3jOd999x5AhQ+jXrx8JCQk89dRTGvIrTVJYUcvsD7djMsHrdw3E31NbAYmIiIiItAVNCp8vvvgi/v7+7N27Fz8/P/z9/fH392fAgAFMnz69WTecOnUq69ato2fPnhc9JyAggE8++YT9+/ezfft2NmzYwN///vdm3Uc6nwazhUc/3kFOaQ2//b8B9A/3c3RJIiIiIiJyRpPC53PPPYfFYuGhhx7CYrFYv0pKSvj5z3/erBuOHj36svuEpqSkEB0dDYCHhwfJyclkZWU16z7S+fzxPxlsOFLIXUMjmTpQe9GKiIiIiLQlzdrn86WXXjpvj0+w7z6fubm5LF68mBUrVtjtHtL+fbXnFK+vOkJSD39+Mbmfo8sREREREZH/ccX7fJ5lz30+y8rKmDx5Mk899RSDBg264Dnz5s1j3rx51u8rKirsUou0TYZh8Maao/z+64MEebnx+l2puLs4O7osERERERH5Hybj+0myFUVFRbF06VKSk5MveLy8vJzx48dzww038Oyzzzb5uhEREWRnZ9uoSmnLquoaeGrxblbsPkVcV2/evHsQUcFeji5LRERERKTTulQea1LP54WUlpZy4sQJ+vfvf8WFXUxFRQUTJkxgwoQJzQqe0nmcKKriwb9v42BuORMSuvGH25Lwdr/i/51FRERERMTOmrXP54QJEygpKaGiooKkpCQmTZrEL37xi2bdcObMmdY0PH78eGJiYgB44IEHWLZsGQB//vOf2bJlC59//jnJyckkJyfz29/+tln3kY5r3aECJr+2jvTT5fz4ujhen56q4CkiIiIi0sY1a9htSkoKO3bs4NNPP2X9+vX84Q9/IDU1lT179tizxmbRsNuOyzAM3lp7lN/98yBe7i78eVoyV/fp6uiyRERERETkDJsNu62vrwdgzZo1TJgwAVdXV1xc1OMk9lddZ+bpz3azbFcOMaHe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eP3m3tNkMvHCCy8wZMgQevXqxXvvvXfZei51vcv9/HfddReDBg0iMTGRiRMnkpubC8CsWbMAGDVqFMnJyeTl5TXrPmlpaSQkJFi/j4mJwd3d/bLHREREADBERETaOcB4/vnnDcMwjOLiYiM5OdnIyckxDMMw8vPzjR49ehjZ2dlGYWGhERoaaqxZs8YwDMMwm81GYWGh9RrFxcXWawYFBRmZmZnnXb+59zx77h/+8AfDMAzjwIEDhre3t1FfX3/Rei53vUv9/IZhGHl5edY/v/jii8bMmTPPOffsz9nc+yQmJhofffSRYRiGcfjwYWPs2LHG8ePHL3tMRETEMAzDxYG5V0RExGbuv/9+ADZs2MDRo0e5/vrrzzmenp5OdXU18fHxjBo1CgAnJycCAwObdf3m3jM8PByAu+66C4A+ffrg4uJCbm4uu3btumA9X3311WWvd6n6PvroIz744ANqamqoqakhODj4gs9pSt1n1dTUsH//fn71q1/x3HPPkZWVxZIlS+jRo8clj4mIiJyl8CkiIh2Ct7c3AIZhkJCQwIYNG84758svv7zo852dnTGbzdbv/3de5NnrN/eeZ3l4eJxzr0vNzWzK9S5Wy7p16/jLX/7Cxo0bCQ0NZdmyZfziF79o8X12796Nl5cX+/fvx2Qy8eyzz/LMM88wceLESx4TERE5S3M+RUSkQzm7yuo333xjfWznzp3U1dUxfPhwDh06xNq1awGwWCwUFRUBjXMUN2/eDMDnn39OZWWlTe55ueddqJ4rvR5AcXExPj4+BAUFUVdXxxtvvHHOcR8fH0pLS5tdd1paGoMHD8ZkMgHw5JNPcvDgQTIyMi55TERE5CyFTxER6VACAgL48ssveeGFF0hKSqJfv3789Kc/xWKxEBAQwJIlS/jpT39KYmIiqamprF+/HoBXXnmFxx57jNTUVHbs2EFQUJBN7nm5512oniu9HsCECROIj4+3DudNTk4+5/iTTz7JD37wA5KTk6mvr2/yfbZv386wYcPOqf26665jyZIllzwmIiJylskwDMPRRYiIiIiIiEjHpp5PERERERERsTuFTxEREREREbE7hU8RERERERGxO4VPERERERERsTuFTxEREREREbE7hU8RERERERGxO4VPERERERERsTuFTxEREREREbG7/w8gXETDGH+sAwAAAABJRU5ErkJggg==\",\n      \"text/plain\": [\n       \"<Figure size 1120x320 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plt.figure(figsize=(14, 4), dpi=80)\\n\",\n    \"plt.plot(rr, TD, label= \\\"Lorenz attractor (10000 timesteps)\\\") \\n\",\n    \"plt.xlabel('recurrence rate $RR$')\\n\",\n    \"plt.ylabel('transitivity dimension $TD$')\\n\",\n    \"plt.legend(loc = \\\"lower right\\\");\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"pyunicorn\",\n   \"language\": \"python\",\n   \"name\": \"pyunicorn\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.11.7\"\n  },\n  \"vscode\": {\n   \"interpreter\": {\n    \"hash\": \"45ca354fb3f6330470f28203103c66b355f6bc9fd4170de504cc6983f9e7e887\"\n   }\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  },
  {
    "path": "docs/source/examples/tutorials/VisibilityGraphs.ipynb",
    "content": "{\n \"cells\": [\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"6154b988\",\n   \"metadata\": {},\n   \"source\": [\n    \"# Tutorial: Visibility Graphs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"86362e1e\",\n   \"metadata\": {},\n   \"source\": [\n    \"The objective of this tutorial is to introduce the network-based method of visibility graphs for nonlinear time series analysis, and to illustrate its implementation in the `pyunicorn` package. First some theoretical background for understanding visibility graphs will be given, and then some of the methods in `timeseries.VisibilityGraph` will be highlighted. For a detailed discussion and further references, please consult __[Donges et al. (2015)](https://aip.scitation.org/doi/10.1063/1.4934554)__, on which this tutorial is based.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"f5ecd3c6\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Introduction\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"82630840\",\n   \"metadata\": {},\n   \"source\": [\n    \"_Visibility Graphs (VG)_ encode visibility relations between data points in the one-dimensional time domain, by drawing upon analogies between height profiles in physical space and the profile of a time series graph. More precisely, VGs are based on the existence or non-existence of lines of sight between well-defined objects (__[Donges et al., 2015](https://aip.scitation.org/doi/10.1063/1.4934554)__).\\n\",\n    \"They can be applied to investigate purely temporal features such as long-range correlations (__[Lacasa et al., 2009](https://iopscience.iop.org/article/10.1209/0295-5075/86/30001)__) or time reversal asymmetry (__[Donges et al., 2013](https://iopscience.iop.org/article/10.1209/0295-5075/102/10004)__).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"e02236af\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Theory of Time Series Visibility Graphs (VGs)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"7083e755\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Standard VG\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"4d45f2a5\",\n   \"metadata\": {},\n   \"source\": [\n    \"In a time series context, well-defined objects between which lines of sight can be established are the sampling points of a (univariate) time series graph. These sampling points are uniquely characterised by pairs $(t_v, x_v)$ with $x_v = x(t_v)$. From a practical perspective, we can identify each node $v$ of a standard visibility graph with a given time point $t_v$. For $t_v < t_p$ (and, hence, $v < p$) a link between the nodes $v$ and $p$ exists iff\\n\",\n    \"\\n\",\n    \"$$\\\\forall\\\\; q \\\\in (v,p):\\\\quad x_q < x_v + \\\\frac{x_p-x_v}{t_p-t_v}(t_q - t_v)\\\\,.$$\\n\",\n    \"\\n\",\n    \"Put differently, the topological properties of VGs take into account the time-ordering of observations explicitly and are thus closely related to the roughness of the underlying time series profile. An illustration of a timeseries with respective visibility relations (grey lines) can be seen in the figure below, taken from __[Donner and Donges (2012)](https://link.springer.com/article/10.2478/s11600-012-0032-x)__. The VG of a time series stays invariant under arbitrary affine transformations.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"dbec9eef\",\n   \"metadata\": {},\n   \"source\": [\n    \"![visibilitygraph](images/SimpleVG.png)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"a0c4fc91\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Horizontal VG\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"1b60e2a4\",\n   \"metadata\": {},\n   \"source\": [\n    \"A notable algorithmic variant are _horizontal visibility graphs (HVGs)_ that facilitate analytical investigations of graph profiles (__[Luque et al., 2009](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.80.046103)__). For HVGs, the more restrictive condition\\n\",\n    \"\\n\",\n    \"$$\\\\forall\\\\;q\\\\in(v,p):\\\\quad x_q<\\\\text{min}\\\\{x_v,x_p\\\\}$$\\n\",\n    \"\\n\",\n    \"is used and the linkset of a HVG is a subset of that of a standard VG. A HVG remains invariant only for uniform translations and rescaling of the original data.\\n\",\n    \"An illustrative example of a HVG can be seen in the figure below, taken from __[Luque et al. (2009)](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.80.046103)__. In the upper part a time series is plotted with the respective horizontal visibility relations (arrowed lines), and in the lower part the resulting mapping to a HVG can be seen.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"c5ba3df8\",\n   \"metadata\": {},\n   \"source\": [\n    \"![horizontalvisibilitygraph](images/HVG.png)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"ddda7dcd\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Testing Time Series Irreversibility\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"40135bf0\",\n   \"metadata\": {},\n   \"source\": [\n    \"By decomposing degrees and local clustering coefficients for VGs and HVGs into contributions from past and future observations, statistical properties under time-reversal of time series can be analysed. Statistically significant deviations are often found between the distributions of time-directed vertex properties for non-linear systems that are known to be time-irreversible, but not for linear systems (__[Donges et al., 2013](https://iopscience.iop.org/article/10.1209/0295-5075/102/10004)__).\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"de11a1f8\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Time-Directed Vertex Properties\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"fe181077\",\n   \"metadata\": {},\n   \"source\": [\n    \"To account for the fact that the time-ordering of data is intrinsically interwoven with the resulting network structure of VGs and HVGs, a set of statistical network quantifiers can be defined, based on two simple vertex (node) characteristics:\\n\",\n    \"\\n\",\n    \"- Decomposing the degree $k_v$ of a vertex $v$, i.e., the number of edges incident to it, into contributions due to other vertices in the past and future of $t_v$, one obtains the time-retarded ($k_v^r$) and the time-advanced ($k_v^a$) degree:\\n\",\n    \"$$k_v^r = \\\\sum_{p\\\\in V:\\\\,p<v}A_{vp} \\\\,,\\\\qquad k_v^a = \\\\sum_{p\\\\in V:\\\\,p>v}A_{vp}\\\\,.$$\\n\",\n    \"\\n\",\n    \"- In a similar manner, the local clustering coefficient $C_v$, which characterises the likelihood that the neighbours of $v$ are also connected, can be expressed in terms of past and future contributions:\\n\",\n    \"$$C_v^r = \\\\left( _{2}^{k_v^r} \\\\right)^{-1}\\\\!\\\\! \\\\sum_{p,q\\\\in V:p,q<v}A_{vp}A_{pq}A_{qv} \\\\,,\\\\qquad C_v^a = \\\\left( _{2}^{k_v^a} \\\\right)^{-1} \\\\!\\\\!\\\\sum_{p,q\\\\in V:p,q>v}A_{vp}A_{pq}A_{qv} \\\\,.$$\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"71ebb8e0\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Irreversibility Test via Kolmogorov-Smirnov (KS)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"d82fb93b\",\n   \"metadata\": {},\n   \"source\": [\n    \"Looking at the frequency distributions of the retarded and advanced sequences for one vertex characteristic,\\n\",\n    \"in case of time reversibility it is expected that they should be drawn from the same probability distributions, e.g., $p(k_v^r) \\\\approx p(k_v^a)$. Thus, rejecting the null hypothesis that  $\\\\{k_v^r\\\\}_v$ and $\\\\{k_v^a\\\\}_v$ (or $\\\\{C_v^r\\\\}_v$ and $\\\\{C_v^a\\\\}_v$) are drawn from the same probability distribution, respectively, is equivalent to rejecting the null hypothesis that the time series is reversible.\\n\",\n    \"\\n\",\n    \"For sufficiently long time series, the samples of individual vertex properties approximate the underlying distributions sufficiently well, and the Kolmogorov-Smirnov (KS) test can be used to check this hypothesis. Specifically, a small $p$-value of the KS test statistic (e.g., $p<0.05$) implies that the time series has likely been generated by an irreversible process.\\n\",\n    \"For illustration purposes, the distributions of time-directed vertex properties of a linear and a non-linear timeseries will be analysed in the following.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"41f104c7\",\n   \"metadata\": {},\n   \"source\": [\n    \"## Application of VGs\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0ddeee77\",\n   \"metadata\": {},\n   \"source\": [\n    \"As an example for the application of VGs and HVGs and of the class `VisibilityGraph`, a linear and a non-linear time series will be tested first visually, and then with the KS test for irreversibility.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"90a819f1\",\n   \"metadata\": {},\n   \"source\": [\n    \"### First Steps\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 1,\n   \"id\": \"745b1e50\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"import math\\n\",\n    \"\\n\",\n    \"import numpy as np\\n\",\n    \"from matplotlib import pyplot as plt\\n\",\n    \"from pyunicorn.timeseries import VisibilityGraph\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"b9b4e18e-2d3d-4405-9119-91637e15702d\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Synthetic Data\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"757844b5\",\n   \"metadata\": {},\n   \"source\": [\n    \"First, we create and plot a linear time series, based on a linear-stochastic first-order autoregressive model (*AR(1)*) with an additive Gaussian noise term:\\n\",\n    \"$$x_t = \\\\alpha x_{t-1} + \\\\xi_t \\\\,,$$ \\n\",\n    \"where $\\\\alpha = 0.5$.\\n\",\n    \"For more background on the construction of time series, consult __[Shumway and Stoffer (2017)](https://link.springer.com/book/10.1007/978-3-319-52452-8)__. \"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 2,\n   \"id\": \"5a01c592-ba8c-4f87-addd-7e2513b0ac4f\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"# we set a seed to reproduce results later\\n\",\n    \"np.random.seed(42)\\n\",\n    \"# process parameters\\n\",\n    \"a = 0.5\\n\",\n    \"mu, sigma = 0, 1\\n\",\n    \"# sample size\\n\",\n    \"N = 5000\\n\",\n    \"# Gaussian noise\\n\",\n    \"x_t = np.random.normal(mu, sigma, N)\\n\",\n    \"# AR(1)\\n\",\n    \"w_t = np.zeros(N)\\n\",\n    \"t = np.arange(0, N, 1)\\n\",\n    \"for i in t[1:]:\\n\",\n    \"    w_t[i] = a*w_t[i-1] + x_t[i]\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 3,\n   \"id\": \"3eb4edb9-9707-4787-b94e-a334d4f2f995\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAABW4AAAGGCAYAAADrbBjiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd3wcxdnHfyfJlrsNNphimunYgCGAQw8lEEJLCB1CCSQhAQIhIYS89GZ6xxhM6DbYBgMx4I57773LvciWZTWr6/b9Q77T7N7M7Mzu7O2e7vl+PuDT7uzM7OzUZ555nphlWRYIgiAIgiAIgiAIgiAIgiCIyJATdgYIgiAIgiAIgiAIgiAIgiAIOyS4JQiCIAiCIAiCIAiCIAiCiBgkuCUIgiAIgiAIgiAIgiAIgogYJLglCIIgCIIgCIIgCIIgCIKIGCS4JQiCIAiCIAiCIAiCIAiCiBgkuCUIgiAIgiAIgiAIgiAIgogYJLglCIIgCIIgCIIgCIIgCIKIGCS4JQiCIAiCIAiCIAiCIAiCiBgkuCUIgiAIgiAIgiAIgiAIgogYJLglCIIgCIIgPDN+/HjEYjGMHz8+7Kyklb/+9a/45S9/6enZf//73+jdu7fvPGRr2QNALBbDE088EXY2CIIgCIIgAoUEtwRBEARBEAHx8ccfIxaLCf+bPn162Fls9vzrX/9CLBbDddddx72/bt062zfJycnB3nvvjUsuuQTTpk3jPrN27Vp88MEH+M9//mO7/u677+Kaa67BwQcfjFgshttuu437/P33348FCxbgf//7n9I79O3bFx9//LFSWIIgCIIgCKL5kBd2BgiCIAiCIJo7Tz31FA477LCU60cccUQIuckeLMvCF198gUMPPRTDhg1DeXk52rdvzw17ww034Ne//jUaGhqwcuVK9O3bF+eddx5mzZqF448/3hb2jTfewGGHHYbzzjvPdv2FF15AeXk5TjvtNGzdulWYr/322w9XXnklXn75ZVxxxRWu79G3b1906dIlRRB8zjnnoKqqCi1btnSNo7lRVVWFvDxayhAEQRAE0byh2Q5BEARBEETAXHLJJTjllFPCzkZGsHv3brRt29ZIXOPHj8emTZvw008/4eKLL8bQoUNx6623csOefPLJuPnmm5N/n3322bjkkkvw7rvvom/fvsnrdXV1GDBgAO66666UOCZMmJDUtm3Xrp00b9deey2uueYaFBQUoHv37p7eLycnB61atfL0bCYSj8dRW1uLVq1aZdV7EwRBEASRvZCpBIIgCIIgiJB5/PHHkZOTg7Fjx9qu/+lPf0LLli2xYMECAEBtbS0ee+wx/OxnP0PHjh3Rtm1bnH322Rg3bpztucTx/5dffhnvvPMOunfvjjZt2uCiiy7Cxo0bYVkWnn76aXTr1g2tW7fGlVdeieLiYlschx56KC677DKMGjUKvXr1QqtWrXDcccdh6NChru8zadKkpMmA/Px8HHTQQfj73/+OqqoqW7jbbrsN7dq1w5o1a/DrX/8a7du3x0033YTHH38cLVq0wI4dO1Li/tOf/oROnTqhurraNR8DBgzAcccdh/POOw8XXnghBgwY4PpMgrPPPhsAsGbNGtv1yZMno6ioCBdeeGHKM4cccghisZhS/Innv/vuO2m4Qw89FEuWLMGECROS5hx+8YtfAODbuP3FL36Bnj17YuHChTj33HPRpk0bHHHEEfjqq68ANAqXe/fujdatW+Poo4/GmDFjUtLcvHkz/vCHP6Br167Iz89Hjx498OGHHyq91+jRo3HWWWehU6dOaNeuHY4++ugUkxI1NTV4/PHHccQRRyTrx7/+9S/U1NTYwsViMdxzzz0YMGAAevTogfz8fIwYMSJ5z2njVjXfb731Fnr06IE2bdpgr732wimnnIKBAwcqvR9BEARBEEQ6IY1bgiAIgiCIgCktLUVRUZHtWiwWQ+fOnQEAjzzyCIYNG4Y77rgDixYtQvv27TFy5Ej0798fTz/9NE488UQAQFlZGT744APccMMN+OMf/4jy8nL897//xcUXX4yZM2eiV69etjQGDBiA2tpa3HvvvSguLsaLL76Ia6+9Fueffz7Gjx+Phx56CKtXr8Zbb72Ff/7znylCrlWrVuG6667DXXfdhVtvvRUfffQRrrnmGowYMULqmGvIkCGorKzEX/7yF3Tu3BkzZ87EW2+9hU2bNmHIkCG2sPX19bj44otx1lln4eWXX0abNm1w+umn46mnnsKgQYNwzz33JMPW1tbiq6++wu9+9ztXjcuamhp8/fXX+Mc//gGg0RTC7bffjm3btmG//faTPgs0Cr8BYK+99rJdnzp1KmKxGE466STXOGR07NgRhx9+OKZMmYK///3vwnCvv/467r33XrRr1w7/93//BwDo2rWrNO5du3bhsssuw/XXX49rrrkG7777Lq6//noMGDAA999/P+666y7ceOONeOmll3D11Vdj48aNSRMShYWF+PnPf54Umu6zzz4YPnw47rjjDpSVleH+++8XprtkyRJcdtllOOGEE/DUU08hPz8fq1evxpQpU5Jh4vE4rrjiCkyePBl/+tOfcOyxx2LRokV47bXXsHLlSnz77be2OH/66ScMHjwY99xzD7p06YJDDz2Um7Zqvvv374+//e1vuPrqq3HfffehuroaCxcuxIwZM3DjjTdKy5UgCIIgCCLtWARBEARBEEQgfPTRRxYA7n/5+fm2sIsWLbJatmxp3XnnndauXbusAw880DrllFOsurq6ZJj6+nqrpqbG9tyuXbusrl27Wn/4wx+S19auXWsBsPbZZx+rpKQkef3hhx+2AFgnnniiLd4bbrjBatmypVVdXZ28dsghh1gArK+//jp5rbS01Np///2tk046KXlt3LhxFgBr3LhxyWuVlZUpZdGnTx8rFotZ69evT1679dZbLQDWv//975Twp59+utW7d2/btaFDh6akJeKrr76yAFirVq2yLMuyysrKrFatWlmvvfaaLVyirJ588klrx44d1rZt26xJkyZZp556qgXAGjJkiC38zTffbHXu3Nk1/bZt21q33nqrNMxFF11kHXvssa5x9ejRwzr33HNTrvPK/txzz7UAWAMHDkxeW758uQXAysnJsaZPn568PnLkSAuA9dFHHyWv3XHHHdb+++9vFRUV2dK6/vrrrY4dO3K/bYLXXnvNAmDt2LFDGOazzz6zcnJyrEmTJtmu9+vXzwJgTZkyJXktkeclS5akxAPAevzxx7XzfeWVV1o9evQQ5o8gCIIgCCJKkKkEgiAIgiCIgHnnnXcwevRo23/Dhw+3henZsyeefPJJfPDBB7j44otRVFSETz75xOaAKTc3N+mIKh6Po7i4GPX19TjllFMwd+7clHSvueYadOzYMfl37969AQA333yzLd7evXujtrYWmzdvtj1/wAEH4Le//W3y7w4dOuCWW27BvHnzsG3bNuH7tm7dOvl79+7dKCoqwhlnnAHLsjBv3ryU8H/5y19Srt1yyy2YMWOGzVTBgAEDcNBBB+Hcc88Vps2GPeWUU5IO4Nq3b49LL71UaC7h8ccfxz777IP99tsPZ599NpYtW4ZXXnkFV199tS3czp07U7RwvbLXXnulaGKboF27drj++uuTfx999NHo1KkTjj322GQdAJrqQ0FBAYBGZ25ff/01Lr/8cliWhaKiouR/F198MUpLS7n1LEGnTp0ANJp/iMfj3DBDhgzBsccei2OOOcYW//nnnw8AKWY/zj33XBx33HHS99XJd6dOnbBp0ybMmjVLGidBEARBEEQUIMEtQRAEQRBEwJx22mm48MILbf+dd955KeEefPBBnHjiiZg5cyYef/xxrsDqk08+wQknnIBWrVqhc+fO2GefffDDDz+gtLQ0JezBBx9s+zshxD3ooIO413ft2mW7fsQRR6TYbD3qqKMANJkS4LFhwwbcdttt2HvvvdGuXTvss88+SWGrM595eXno1q1bShzXXXcd8vPzk4LW0tJSfP/997jppptc7ciWlJTgxx9/xLnnnovVq1cn/zvzzDMxe/ZsrFy5MuWZP/3pTxg9ejSGDRuWtMfb0NDAjd+yLGn6qliWpWwTV4du3bqlxNuxY0fX775jxw6UlJTg/fffxz777GP77/bbbwcAbN++XZjuddddhzPPPBN33nknunbtiuuvvx6DBw+2CXFXrVqFJUuWpMSfqFfO+A877DDX99XJ90MPPYR27drhtNNOw5FHHom7777bZsqBIAiCIAgiSpCNW4IgCIIgiIhQUFCAVatWAQAWLVqUcv/zzz/Hbbfdht/85jd48MEHse+++yI3Nxd9+vRJcaIFNGro8hBdNyGQbGhowC9/+UsUFxfjoYcewjHHHIO2bdti8+bNuO2221I0MfPz85GTk6pLsNdee+Gyyy7DgAED8Nhjj+Grr75CTU0Nbr75Ztc8DBkyBDU1NXjllVfwyiuvpNwfMGAAnnzySdu1I488Mukw7LLLLkNubi7+/e9/47zzzsMpp5ySDNe5c+cUAbdXdu3ahS5duhiJi8Xrd098m5tvvhm33norN+wJJ5wgTLd169aYOHEixo0bhx9++AEjRozAoEGDcP7552PUqFHIzc1FPB7H8ccfj1dffZUbh1O4zGpvi9DJ97HHHosVK1bg+++/x4gRI/D111+jb9++eOyxx1LqBEEQBEEQRNiQ4JYgCIIgCCICxONx3HbbbejQoQPuv/9+PPfcc7j66qtx1VVXJcN89dVX6N69O4YOHWrTqHz88ccDydPq1atTtEIT2qoiJ1GLFi3CypUr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aNEi+vvf/25I8/7779PatWupvLycKisr6aSTTqKPP/7YkObZZ5+l2bNnU2FhIbW2ttI111zj960BkPVs3bqVpkyZQmVlZVRfX0+HH3447dy505Dms88+o02bNlFNTQ2VlpbSkUceSW+//bYhzauvvkrLly+n4uJiqq+vpwsvvJAOHDhgSPPAAw/QpEmTKBaL0fDhw2nbtm1+3x4AWc1NN91EEyZMoPLyciovL6fp06fT7373u8TvaLsAZAZXX301aZpG5557buI7tF8AwssVV1xBmqYZ/o0aNSrxO9qvM6C4zVJ++tOf0vnnn0+XX345/fnPf6bu7m5asmQJvfPOO0GLBkDOsGfPHuru7qYbb7yR+/s111xD119/Pd188830+OOPU0lJCS1ZsoQ+++yzRJq1a9fS888/T9u3b6c777yTHnroITr11FMTv+/atYsWL15MQ4cOpaeeeoquvfZauuKKK+jWW2/1/f4AyGYefPBB2rRpEz322GO0fft22r9/Py1evJj27NmTSHPeeefRb37zG7rjjjvowQcfpDfeeINWrVqV+P3gwYO0fPly2rdvH/3xj3+kH/zgB7Rt2za67LLLEmleeeUVWr58Oc2fP5927NhB5557Lp188sl09913p/V+AcgmWlpa6Oqrr6annnqK/vSnP9GCBQto5cqV9PzzzxMR2i4AmcCTTz5Jt9xyC02YMMHwPdovAOFm7Nix9Oabbyb+Pfzww4nf0H4dooOsZOrUqfqmTZsSfx88eFBvamrSt27dGqBUAOQuRKT/4he/SPzd39+vNzY26tdee23iuw8//FCPxWL6T37yE13Xdf2FF17QiUh/8sknE2l+97vf6Zqm6a+//rqu67r+3e9+V6+qqtL37t2bSPOFL3xB7+rq8vmOAMgt3nnnHZ2I9AcffFDX9YH2WlBQoN9xxx2JNH/96191ItIfffRRXdd1/be//a0eiUT0t956K5Hmpptu0svLyxNt9qKLLtLHjh1rKGv16tX6kiVL/L4lAHKKqqoq/bbbbkPbBSAD2L17tz5ixAh9+/bt+ty5c/VzzjlH13WMvQCEncsvv1zv7u7m/ob26xxY3GYh+/bto6eeeooWLVqU+C4SidCiRYvo0UcfDVAyAECcV155hd566y1DO62oqKC+vr5EO3300UepsrKSJk+enEizaNEiikQi9PjjjyfSzJkzh6LRaCLNkiVLaOfOnfTBBx+k6W4AyH4++ugjIiKqrq4mIqKnnnqK9u/fb2jDo0aNora2NkMbHj9+PDU0NCTSLFmyhHbt2pWw/Hv00UcNecTTYLwGwBsOHjxIt99+O+3Zs4emT5+OtgtABrBp0yZavnx5ShtD+wUg/Pz973+npqYm6ujooLVr19Krr75KRGi/boDiNgt599136eDBg4bKTkTU0NBAb731VkBSAQBY4m1R1k7feustqq+vN/yen59P1dXVhjS8PNgyAADu6O/vp3PPPZdmzpxJ48aNI6KB9hWNRqmystKQ1tyGrdqnKM2uXbvo008/9eN2AMgJnnvuOSotLaVYLEYbN26kX/ziFzRmzBi0XQBCzu23305//vOfaevWrSm/of0CEG76+vpo27ZtdNddd9FNN91Er7zyCs2ePZt2796N9uuC/KAFAAAAAAAIM5s2baK//OUvBh9dAIBw09XVRTt27KCPPvqI/uu//ovWrVtHDz74YNBiAQAkvPbaa3TOOefQ9u3bqbCwMGhxAAA2WbZsWeLzhAkTqK+vj4YOHUo/+9nPqKioKEDJMhtY3GYhtbW1lJeXlxKd7+2336bGxsaApAIAsMTboqydNjY2pgQUPHDgAL3//vuGNLw82DIAAM4588wz6c4776T777+fWlpaEt83NjbSvn376MMPPzSkN7dhq/YpSlNeXo4JLgAuiEajNHz4cOrt7aWtW7dSd3c3ffvb30bbBSDEPPXUU/TOO+/QpEmTKD8/n/Lz8+nBBx+k66+/nvLz86mhoQHtF4AMorKykkaOHEkvvfQSxl8XQHGbhUSjUert7aV777038V1/fz/de++9NH369AAlAwDEGTZsGDU2Nhra6a5du+jxxx9PtNPp06fThx9+SE899VQizX333Uf9/f3U19eXSPPQQw/R/v37E2m2b99OXV1dVFVVlaa7ASD70HWdzjzzTPrFL35B9913Hw0bNszwe29vLxUUFBja8M6dO+nVV181tOHnnnvOsAGzfft2Ki8vpzFjxiTSsHnE02C8BsBb+vv7ae/evWi7AISYhQsX0nPPPUc7duxI/Js8eTKtXbs28RntF4DM4eOPP6aXX36ZhgwZgvHXDUFHRwP+cPvtt+uxWEzftm2b/sILL+innnqqXllZaYjOBwDwl927d+tPP/20/vTTT+tEpH/jG9/Qn376af1///d/dV3X9auvvlqvrKzUf/WrX+nPPvusvnLlSn3YsGH6p59+mshj6dKl+sSJE/XHH39cf/jhh/URI0boa9asSfz+4Ycf6g0NDfrxxx+v/+Uvf9Fvv/12vbi4WL/lllvSfr8AZBOnn366XlFRoT/wwAP6m2++mfj3ySefJNJs3LhRb2tr0++77z79T3/6kz59+nR9+vTpid8PHDigjxs3Tl+8eLG+Y8cO/a677tLr6ur0iy++OJHmH//4h15cXKxfeOGF+l//+lf9xhtv1PPy8vS77rorrfcLQDaxZcsW/cEHH9RfeeUV/dlnn9W3bNmia5qm33PPPbquo+0CkEnMnTtXP+eccxJ/o/0CEF42b96sP/DAA/orr7yiP/LII/qiRYv02tpa/Z133tF1He3XKVDcZjE33HCD3tbWpkejUX3q1Kn6Y489FrRIAOQU999/v05EKf/WrVun67qu9/f361/60pf0hoYGPRaL6QsXLtR37txpyOO9997T16xZo5eWlurl5eX6hg0b9N27dxvSPPPMM/qsWbP0WCymNzc361dffXW6bhGArIXXdolI//73v59I8+mnn+pnnHGGXlVVpRcXF+tHHHGE/uabbxry+ec//6kvW7ZMLyoq0mtra/XNmzfr+/fvN6S5//779Z6eHj0ajeodHR2GMgAA9jnxxBP1oUOH6tFoVK+rq9MXLlyYUNrqOtouAJmEWXGL9gtAeFm9erU+ZMgQPRqN6s3Nzfrq1av1l156KfE72q8zNF3X9WBsfQEAAAAAAAAAAAAAAADwgI9bAAAAAAAAAAAAAAAACBlQ3AIAAAAAAAAAAAAAAEDIgOIWAAAAAAAAAAAAAAAAQgYUtwAAAAAAAAAAAAAAABAyoLgFAAAAAAAAAAAAAACAkAHFLQAAAAAAAAAAAAAAAIQMKG4BAAAAAAAAAAAAAAAgZEBxCwAAAAAAAAAAAAAAACEDilsAAAAAAAAAAAAAAAAIGVDcAgAAAAAAoMh5551Hq1atCloMAAAAAACQA0BxCwAAAAAAgCJPPPEETZ48OWgxAAAAAABADqDpuq4HLQQAAAAAAABhZt++fVRSUkIHDhxIfNfX10ePPfZYgFIBAAAAAIBsJj9oAQAAAAAAAAg7+fn59Mgjj1BfXx/t2LGDGhoaqLCwMGixAAAAAABAFgPFLQAAAAAAABZEIhF64403qKamhrq7u4MWBwAAAAAA5ADwcQsAAAAAAIACTz/9NJS2AAAAAAAgbUBxCwAAAAAAgAI7duyA4hYAAAAAAKQNKG4BAAAAAABQ4LnnnqOenp6gxQAAAAAAADkCFLcAAAAAAAAo0N/fTzt37qQ33niDPvroo6DFAQAAAAAAWQ4UtwAAAAAAAChw1VVX0bZt26i5uZmuuuqqoMUBAAAAAABZjqbruh60EAAAAAAAAAAAAAAAAACSwOIWAAAAAAAAAAAAAAAAQgYUtwAAAAAAAAAAAAAAABAyoLgFAAAAAAAAAAAAAACAkAHFLQAAAAAAAAAAAAAAAIQMKG4BAAAAAAAAAAAAAAAgZEBxCwAAAAAAAAAAAAAAACEDilsAAAAAAAAAAAAAAAAIGVDcAgAAAAAAAAAAAAAAQMiA4hYAAAAAAAAAAAAAAABCBhS3AAAAAAAAAAAAAAAAEDKguAUAAAAAAAAAAAAAAICQAcUtAAAAAAAAAAAAAAAAhIz/D2OVJ3o4IA6zAAAAAElFTkSuQmCC\",\n      \"text/plain\": [\n       \"<Figure size 1400x400 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plt.figure(figsize=(14, 4), tight_layout=True)\\n\",\n    \"plt.plot(t, w_t)\\n\",\n    \"plt.xlabel(\\\"$t$\\\"); plt.ylabel(\\\"$w_t$\\\")\\n\",\n    \"plt.title(\\\"Examplary AR(1) time series\\\");\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"441eac8f-7b1a-4fdb-a2b5-3d9504caf03f\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Visibility Relations\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"b0970273\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we construct a `VisibilityGraph` instance. Note the keyword `horizontal`, which is `False` by default.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 4,\n   \"id\": \"d481e772\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating visibility relations...\\n\",\n      \"VisibilityGraph: time series shape (5000,).\\n\",\n      \"InteractingNetworks:\\n\",\n      \"Network: undirected, 5000 nodes, 16703 links, link density 0.001.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"VG1 = VisibilityGraph(w_t, horizontal=False)\\n\",\n    \"print(VG1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 5,\n   \"id\": \"367aaa50\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating horizontal visibility relations...\\n\"\n     ]\n    },\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"VisibilityGraph: time series shape (5000,).\\n\",\n      \"InteractingNetworks:\\n\",\n      \"Network: undirected, 5000 nodes, 9986 links, link density 0.001.\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"HVG1 = VisibilityGraph(w_t, horizontal=True)\\n\",\n    \"print(HVG1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"0a3d1527\",\n   \"metadata\": {},\n   \"source\": [\n    \"It can be illustrative to plot the visibility relations via the method `VisibilityGraph.visibility_relations()`. Note that here we zoom in along the time axis.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 6,\n   \"id\": \"8d8b5cdb\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating visibility relations...\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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GL/9278NQRDw+te/HolEAu95z3vw7Gc/G9/97nfhcrmafrcZ73nPe/BLv/RL8Hq9+I3f+A0AQH9/P6ampvD0pz8dDz/8MP7rf/2vuu88/PDD8Pl8eP7zn99y+W9729tgt9vxute9DuVyGXa7HV/+8pfxwAMP4O6778ab3vQmiKKIj3zkI3jWs56Fr3/96/iBH/iBhsv76Ec/Cq/Xi9e85jXwer348pe/jDe+8Y3IZDJ417veBQD4jd/4DRwdHWFra4uLzl6vt+Ey/+Ef/gEPPPAApqam8OY3vxnFYhHve9/78PSnPx3f+c536o7Ni1/8YkxOTuId73gHvvOd7+BDH/oQYrEY3vnOdwKoXXs/8iM/gic+8Yl461vfCofDgeXl5bZEaYIgCIIgCB0qQRAEQRDE45xf+IVfUBs1ix588EF1fHycv15dXVUBqNFoVE2n0/z9X//1X1cBqN/3fd+nVioV/v5LX/pS1W63q6VSSVVVVc1ms2owGFRf9apX6X5nd3dXDQQCde8b+b7v+z71ec97XtPP3H///eoTnvAE/puqqqqKoqhPe9rT1JmZGf7eRz7yERWAes8996iyLOuWwf62urra0XqnUikVgPqud72r6TqaceXKFfXFL34xf/3kJz9ZfdGLXqQCUK9fv66qqqp+5jOfUQGo3/ve9/jnxsfH1QcffJC//tSnPqUCUB955JG63xgfH1cBqF/72tf4e4lEQnU4HOprX/vapuv3hS98QQWgfv7zn9e9/8M//MPq1NQUf83OkY985COqqra/T575zGeqz3zmM/nrRx55RAWgDg8Pq5lMhr//yU9+UgWg/uEf/iF/z3ieqqqqAlDf9KY38dfGY6qqtX2u/U3GBz/4Qd1+V1VVlSRJjUQiun1tBlvvqakptVAo8PcVRVFnZmbU5z73uaqiKPz9QqGgTk5Oqs95znOarqt2WYyf//mfV91ut+5cf97znle3L1S1/rioqqreddddaiwWUw8ODvh73/ve91RRFNWXvexl/L03velNKgD1P//n/6xb5gte8AI1HA7z1+9+97tVAOr+/n6DvUMQBEEQBNEeFI9AEARBEATRBS960YsQCAT466c85SkAanm5VqtV974kSdje3gZQmzqdTqfx0pe+FMlkkv+zWCx4ylOegkceeaTp7waDQVy7dg03b940/fvh4SG+/OUv48UvfjGy2Sxf/sHBAZ773Ofi5s2bfF0Yr3rVq1pmnba73i6XC3a7HV/5yleQSqWaLtPIvffei69//esAgGw2i+9973v4uZ/7OUQiEf7+17/+dQSDQczPz3e0bC2XL1/Gvffey19Ho1FcunQJKysrTb/3rGc9C5FIBJ/4xCf4e6lUCl/60pd0cQ1GjrNPAOBlL3sZfD4ff/3CF74Qg4OD+N//+393vKx2efGLXwyn04mHH36Yv/eFL3wByWSy7eznBx98UOcE/u53v4ubN2/ip37qp3BwcMDPoXw+j/vvvx9f+9rXmhZT0y6Lndv33nsvCoUCFhcXO97GnZ0dfPe738XLX/5yhEIh/v4Tn/hEPOc5zzHdv//lv/wX3et7770XBwcHPPohGAwCqEU5PB4LGBIEQRAE0TtItCUIgiAIguiCsbEx3Wsm4I6Ojpq+z8Q6JrY+61nPQjQa1f374he/iEQi0fR33/rWtyKdTuPixYt4whOegF/7tV/T5cAuLy9DVVX81m/9Vt3y3/SmNwFA3W9MTk623N5219vhcOCd73wn/u7v/g79/f14xjOegd/7vd/D7u5uy9+49957sbOzg+XlZZ6d+tSnPlUn5n7961/H05/+9GMVtDIeOwDo6+trKaharVb8xE/8BD772c+iXC4DAD7zmc+gUqk0FW2Ps08AYGZmRvdaEARcuHChaUbwcQkGg/jRH/1RfPzjH+fvPfzwwxgeHsaznvWstpZhPK/YOfTggw/WnUMf+tCHUC6XcXR01HB5165dwwte8AIEAgH4/X5Eo1EuIDf7XiPW19cBAJcuXar729zcHBeUtRjPnb6+PgC3r++f/MmfxNOf/nS88pWvRH9/P17ykpfgk5/8JAm4BEEQBEF0DGXaEgRBEARBdEEjZ2qj91VVBQAu3nzsYx/DwMBA3ee0Ll0znvGMZ+DWrVv47Gc/iy9+8Yv40Ic+hHe/+934kz/5E7zyla/ky3/d616H5z73uabLuHDhgu51O7monaz3r/7qr+JHf/RH8Td/8zf4whe+gN/6rd/CO97xDnz5y1/Gk570pIa/cc899wAAvva1r2FlZQVPfvKT4fF4cO+99+K9730vcrkc/vVf/xW//du/3XJ9m9HqGDXjJS95CT74wQ/i7/7u7/DjP/7j+OQnP4nZ2Vl83/d9X9PvdbtPzpKXvexl+NSnPoV//ud/xhOe8AR87nOfw6tf/eq2BXPjecXOoXe961246667TL/TKH82nU7jmc98Jvx+P9761rdienoaTqcT3/nOd/D617/+1ETRVueOy+XC1772NTzyyCP427/9W/z93/89PvGJT+BZz3oWvvjFL7Z0tBMEQRAEQTBItCUIgiAIgjhFpqenAQCxWAzPfvazu1pGKBTCQw89hIceegi5XA7PeMYz8OY3vxmvfOUrMTU1BaBWOKvb5fdivaenp/Ha174Wr33ta3Hz5k3cdddd+IM/+AP8z//5Pxt+Z2xsDGNjY/j617+OlZUVHmHwjGc8A695zWvwqU99CtVqFc94xjOa/rYgCB1sWWc84xnPwODgID7xiU/gnnvuwZe//GVexKsV3ewTAHVRGKqqYnl5mRdsOw7N9tUP/dAPIRqN4uGHH8ZTnvIUFAoF/OzP/mzXv8XOIb/f3/G5+ZWvfAUHBwf4zGc+ozv+q6urdZ9t9/iPj48DAG7cuFH3t8XFRUQiEXg8no7WEwBEUcT999+P+++/H//9v/93/M7v/A5+4zd+A4888khPr0mCIAiCIB7bUDwCQRAEQRDEKfLc5z4Xfr8fv/M7v4NKpVL39/39/abfPzg40L32er24cOECn64fi8Vw33334YMf/CB2dnY6Xv5x17tQKKBUKun+Nj09DZ/Px9exGffeey++/OUv4//9v//HRdu77roLPp8Pv/u7vwuXy4W777676TKY0JZOp9vZtI4QRREvfOEL8fnPfx4f+9jHIMty02gE4Pj75M///M+RzWb5609/+tPY2dnBAw880N1GaPB4PA33k9VqxUtf+lJ88pOfxEc/+lE84QlPOJZQfPfdd2N6ehq///u/j1wuV/f3Zucmc6hq3dCSJOH9739/3Wc9Hk9bcQmDg4O466678Gd/9me6fXD16lV88YtfxA//8A+3XIaRw8PDuveYq7idY00QBEEQBMEgpy1BEARBEMQp4vf78YEPfAA/+7M/iyc/+cl4yUtegmg0io2NDfzt3/4tnv70p+OP/uiPGn7/8uXLuO+++3D33XcjFArh29/+Nj796U/jF3/xF/ln/viP/xj33HMPnvCEJ+BVr3oVpqamsLe3h2984xvY2trC9773vRNb76WlJdx///148YtfjMuXL8NqteKv//qvsbe3h5e85CUtf+fee+/Fww8/DEEQeFyCxWLB0572NHzhC1/AfffdB7vd3nQZd911FywWC975znfi6OgIDocDz3rWsxCLxTrebjN+8id/Eu973/vwpje9CU94whMwNzfX9PPH3SehUAj33HMPHnroIezt7eE973kPLly4gFe96lXH3pa7774bH/jAB/D2t78dFy5cQCwW02XWvuxlL8N73/tePPLII3jnO995rN8SRREf+tCH8MADD+DKlSt46KGHMDw8jO3tbTzyyCPw+/34/Oc/b/rdpz3taejr68ODDz6IX/7lX4YgCPjYxz5mGmlx99134xOf+ARe85rX4D/8h/8Ar9eLH/3RHzVd7rve9S488MADeOpTn4pXvOIVKBaLeN/73odAIIA3v/nNHW/jW9/6Vnzta1/D8573PIyPjyORSOD9738/RkZG+PlMEARBEATRDiTaEgRBEARBnDI/9VM/haGhIfzu7/4u3vWud6FcLmN4eBj33nsvHnrooabf/eVf/mV87nOfwxe/+EWUy2WMj4/j7W9/O37t136Nf+by5cv49re/jbe85S346Ec/ioODA8RiMTzpSU/CG9/4xhNd79HRUbz0pS/FP/7jP+JjH/sYrFYrZmdn8clPfhI/8RM/0fI3mLt2dnYW4XBY9/4XvvAF/vdmDAwM4E/+5E/wjne8A694xStQrVbxyCOP9Ey0fdrTnobR0VFsbm62dNkCx98nb3jDG/Bv//ZveMc73oFsNov7778f73//++F2u4+9LW984xuxvr6O3/u930M2m8Uzn/lMnWh7991348qVK7h+/Tp++qd/+ti/d9999+Eb3/gG3va2t+GP/uiPkMvlMDAwgKc85Sn4+Z//+YbfC4fD+F//63/hta99LX7zN38TfX19+Jmf+Rncf//9ddnNr371q/Hd734XH/nIR/Dud78b4+PjDUXbZz/72fj7v/97vOlNb8Ib3/hG2Gw2PPOZz8Q73/nOtgr0GfmxH/sxrK2t4cMf/jCSySQikQie+cxn4i1veQsvSkgQBEEQBNEOgtpOxQWCIAiCIAiCIB6XPOlJT0IoFMI//uM/nvWqEARBEARBPG6gTFuCIAiCIAiCIEz59re/je9+97t42ctedtarQhAEQRAE8biCnLYEQRAEQRAEQei4evUq/uVf/gV/8Ad/gGQyiZWVFTidzrNeLYIgCIIgiMcN5LQlCIIgCIIgCELHpz/9aTz00EOo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\",\n      \"text/plain\": [\n       \"<Figure size 1400x400 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"# obtain the visibilty relations as a Boolean mask\\n\",\n    \"visibility_relations = VG1.visibility_relations()\\n\",\n    \"# zoom\\n\",\n    \"cutoff = int(N/10)\\n\",\n    \"\\n\",\n    \"# plotting the visibilty relations as grey arrows\\n\",\n    \"plt.figure(figsize=(14, 4), tight_layout=True)\\n\",\n    \"plt.plot(t[:cutoff], w_t[:cutoff])\\n\",\n    \"plt.xlabel(\\\"$t$\\\"); plt.ylabel(\\\"$w_t$\\\")\\n\",\n    \"plt.title(\\\"Time series with visibility relations\\\")\\n\",\n    \"for i in range(cutoff):\\n\",\n    \"    for k in range(cutoff):\\n\",\n    \"        if visibility_relations[i][k]:\\n\",\n    \"            plt.arrow(i, w_t[i], (k-i), (w_t[k]-w_t[i]), color='lightgrey')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"e24eb9d5\",\n   \"metadata\": {},\n   \"source\": [\n    \"Of course, we can also plot the visibility relations for the HVG using `VisibilityGraph.visibility_relations_horizontal()`. In this case, only the visibility lines for one specific node are plotted as an example, albeit not horizontally.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 7,\n   \"id\": \"3c3f7f27\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating horizontal visibility relations...\\n\"\n     ]\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAABW0AAAGGCAYAAAAAW6PhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOydd5gb1bnG31GXtlf3blNtaujGdiBUh5YYQholCUluIIQL4SaQhBJICCGFhACBFCCE3jvGYBsbTDPGBmyKe1tvb1ppVWfuH9I5c2Y0kkba0Uqr/X7Pw2NWqx2NpJlT3vOe95MURVFAEARBEARBEARBEARBEARBlAS2Yp8AQRAEQRAEQRAEQRAEQRAEoUKiLUEQBEEQBEEQBEEQBEEQRAlBoi1BEARBEARBEARBEARBEEQJQaItQRAEQRAEQRAEQRAEQRBECUGiLUEQBEEQBEEQBEEQBEEQRAlBoi1BEARBEARBEARBEARBEEQJQaItQRAEQRAEQRAEQRAEQRBECUGiLUEQBEEQBEEQBEEQBEEQRAlBoi1BEARBEARBEARBEARBEEQJQaItQRAEQZQgF1xwAaZOnVrs0xh27r33XkiShG3bthX7VLIydepUXHDBBaaf++Uvfzmv19m2bRskScIf/vCHvP4+V6677jpIkjQsr1VocvmOssG+h3vvvTenv1uwYAEWLFjAf16+fDkkScLjjz+e9W+N2gFJknDdddfxn0fSPVOIc833exkuYrEY/u///g+TJk2CzWbDmWeeWexTsgR2HS9fvrzYp0IQBEEQZQuJtgRBEAQxTEiSZOo/mgSPTDZs2IDrrrtuRIhnI4EXX3xRI04S5rnjjjtKVsTMlwcffBC33nprsU8jZ/7973/jlltuwaJFi3Dffffhf//3f4t9SiXJzp07cf311+Pwww9HXV0dGhsbsWDBArz66quGz+/t7cX3v/99NDU1oaKiAl/84hexZs2alOcNDAzgsssuw8SJE+F2u7HvvvvizjvvLPTbIQiCIAhLcBT7BAiCIAhitHD//fdrfv7Pf/6DJUuWpDy+77774h//+AdkWR7O0ysJvv3tb+Pcc8+F2+0u9qlk5bPPPoPNpq5/b9iwAddffz0WLFgwol3Sv/zlL/Hzn/+82KeBF198EbfffnvJCLdTpkzB4OAgnE5nTn/3yiuv5P2aZtoBo3vmjjvuQGNjo2Uu41LgwQcfxMcff4zLLrtM83i+38twsXTpUkyYMAF//vOfi30qJc0zzzyDm2++GWeeeSbOP/98xGIx/Oc//8EJJ5yAf//737jwwgv5c2VZxsKFC7Fu3TpceeWVaGxsxB133IEFCxbg/fffx6xZswAA8XgcJ510ElavXo2LL74Ys2bNwuLFi/GjH/0IPT09uPrqq4v1dgmCIAjCFCTaEgRBEMQw8a1vfUvz89tvv40lS5akPD4aCQQCqKiogN1uh91uL/bpmGIkCMu5wL4Dh8MBh4OGiHokSYLH48n571wuV96vaUaILOY9EwqF4HK5NIsXw02+38tw0d7ejtraWsuOJ8syIpFISb/nfPjiF7+IHTt2oLGxkT/2wx/+EAcddBCuueYajWj7+OOPY9WqVXjsscewaNEiAMA555yDvfbaC9deey0efPBBAMCTTz6JVatW4V//+he+853vAAD+53/+B4sWLcINN9yA733ve2hubh7Gd0kQBEEQuUHxCARBEARRguizLMVc09tvvx3Tp0+Hz+fDiSeeiJ07d0JRFNxwww2YOHEivF4vzjjjDHR3d6cc96WXXsKxxx6LiooKVFVVYeHChVi/fn3W84lGo7j++usxa9YseDweNDQ0YO7cuViyZInmeZ9++ikWLVqE+vp6eDwefOELX8Czzz6reQ7LtXz99dfxox/9CM3NzZg4caLmd/qIATPn3draigsvvJBvgx03bhzOOOOMjHEFzz77LCRJwocffsgfe+KJJyBJEr7yla9onrvvvvvia1/7Gv9ZzEu99957cfbZZwNIiA/poi7eeOMNHH744fB4PJg+fTr+85//pD03I+6++27MmDEDbrcbhx12GN57772U5yxdupR/VrW1tTjjjDPwySefaJ7Dcms3bNiAb3zjG6irq8PcuXM1v2NccMEFaaM8RBdse3s7vvvd72LMmDHweDw48MADcd9992leV7yOM72XCy64ALfffjsAbawI4w9/+AOOPvpoNDQ0wOv14tBDDzWVEasnGo2ivr5eIwgx+vv74fF48NOf/lRz7mLsgJlrTp9py4jH47j66qsxduxYVFRU4PTTT8fOnTs1zzGTba2/Z6ZOnYr169fj9ddf55/bggULsGXLFkiSZOj4XLVqFSRJwkMPPZT2dViG6cMPP4xf/vKXmDBhAnw+H/r7+wEA77zzDk4++WTU1NTA5/Nh/vz5ePPNNzOeO5BwWC5cuBDjx4+H2+3GjBkzcMMNNyAej/PnLFiwAC+88AK2b9/O3xP7XNJl2uZyH2zatAkXXHABamtrUVNTgwsvvBDBYFDz3CVLlmDu3Lmora1FZWUl9t5774xOTXZey5Ytw/r161PahEAggCuuuAKTJk2C2+3G3nvvjT/84Q9QFEVzHEmScMkll+CBBx7A/vvvD7fbjZdffjnt67L8bDNtzZYtW3D22Wejvr4ePp8PRx55JF544YWU5+3atQtnnnkmKioq0NzcjP/93/9FOBw2fP18r4P9999fI9gCiYWxU089Fbt27YLf7+ePP/744xgzZoymjW5qasI555yDZ555hp/bypUrAQDnnnuu5rjnnnsuQqEQnnnmmaznRRAEQRDFhGwUBEEQBDGCeOCBBxCJRPDjH/8Y3d3d+P3vf49zzjkHxx13HJYvX46f/exn2LRpE2677Tb89Kc/xb///W/+t/fffz/OP/98nHTSSbj55psRDAZx5513Yu7cufjggw8yikPXXXcdbrrpJnzve9/D4Ycfjv7+fqxevRpr1qzBCSecAABYv349jjnmGEyYMAE///nPUVFRgUcffRRnnnkmnnjiCZx11lmaY/7oRz9CU1MTrrnmGgQCgbSvbfa8v/rVr2L9+vX48Y9/jKlTp6K9vR1LlizBjh070r63uXPnQpIkrFixAgcccACAxETfZrPhjTfe4M/r6OjAp59+iksuucTwOPPmzcOll16Kv/71r7j66qux7777AgD/FwA2bdqERYsW4bvf/S7OP/98/Pvf/8YFF1yAQw89FPvvv3/a98948MEH4ff78YMf/ACSJOH3v/89vvKVr2DLli3ckfnqq6/ilFNOwfTp03HddddhcHAQt912G4455hisWbMm5XM4++yzMWvWLPz2t79NEYsYP/jBD/ClL31J89jLL7+MBx54gLvUBgcHsWDBAmzatAmXXHIJpk2bhsceewwXXHABent78ZOf/CSn9/KDH/wALS0thvEhAPCXv/wFp59+Or75zW8iEong4Ycfxtlnn43nn38eCxcuzPpZMpxOJ8466yw8+eSTuOuuuzSu2KeffhrhcDhF8BHJ55pj/OY3v4EkSfjZz36G9vZ23HrrrfjSl76EtWvXwuv1mn4Pem699Vb8+Mc/RmVlJX7xi18AAMaMGYPp06fjmGOOwQMPPJCSq/rAAw+gqqoKZ5xxRtbj33DDDXC5XPjpT3+KcDgMl8uFpUuX4pRTTsGhhx6Ka6+9FjabDffccw+OO+44rFy5Eocffnja4917772orKzE5ZdfjsrKSixduhTXXHMN+vv7ccsttwAAfvGLX6Cvrw+7du3ionNlZWXaY+Z6H5xzzjmYNm0abrrpJqxZswb//Oc/0dzcjJtvvhlAom378pe/jAMOOAC//vWv4Xa7sWnTpoxiZFNTE+6//3785je/wcDAAG666SYAiTZBURScfvrpWLZsGb773e/ioIMOwuLFi3HllVdi9+7dKcL60qVL8eijj+KSSy5BY2Nj1mvLTFvT1taGo48+GsFgEJdeeikaGhpw33334fTTT8fjjz/O2+vBwUEcf/zx2LFjBy699FKMHz8e999/P5YuXZryukO5DtLR2toKn88Hn8/HH/vggw9wyCGHpDi8Dz/8cNx99934/PPPMWfOHITDYdjt9hS3OzvW+++/j4suuijncyIIgiCIYUMhCIIgCKIoXHzxxUq6rvj8889XpkyZwn/eunWrAkBpampSent7+eNXXXWVAkA58MADlWg0yh//+te/rrhcLiUUCimKoih+v1+pra1VLrroIs3rtLa2KjU1NSmP6znwwAOVhQsXZnzO8ccfr8yZM4e/pqIoiizLytFHH63MmjWLP3bPPfcoAJS5c+cqsVhMcwz2u61bt+Z03j09PQoA5ZZbbsl4jkbsv//+yjnnnMN/PuSQQ5Szzz5bAaB88skniqIoypNPPqkAUNatW8efN2XKFOX888/nPz/22GMKAGXZsmUprzFlyhQFgLJixQr+WHt7u+J2u5Urrrgi4/mx776hoUHp7u7mjz/zzDMKAOW5557jjx100EFKc3Oz0tXVxR9bt26dYrPZlPPOO48/du211yoAlK9//espr8d+l46NGzcqNTU1ygknnMC/v1tvvVUBoPz3v//lz4tEIspRRx2lVFZWKv39/Tm/l0z3RzAY1PwciUSU2bNnK8cdd5zmcf13ZMTixYtTXltRFOXUU09Vpk+fzn9m537PPfcoimL+mps/f74yf/58/vOyZcsUAMqECRP456IoivLoo48qAJS//OUv/DF9O6AoigJAufbaa/nP+ntGURLXtPiajLvuuktzXStK4rNrbGzM+jmx854+fbrm85dlWZk1a5Zy0kknKbIs88eDwaAybdo05YQTTsh4rvrvUlEU5Qc/+IHi8/k0bcnChQtTPgtFSf1eFCX3++A73/mO5phnnXWW0tDQwH/+85//rABQOjo60nw66Zk/f76y//77ax57+umnFQDKjTfeqHl80aJFiiRJyqZNm/hjABSbzaasX7/e1OuZbWsuu+wyBYCycuVK/pjf71emTZumTJ06VYnH44qiqPf2o48+yp8XCASUmTNnatq7XK4Ds2zcuFHxeDzKt7/9bc3jFRUVKd+ZoijKCy+8oABQXn75ZUVRFOWPf/xjyntUFEX5+c9/rgBQvvzlL+d8TgRBEAQxnFA8AkEQBEGMIM4++2zU1NTwn4844ggAibxcMYf0iCOOQCQSwe7duwEktvb29vbi61//Ojo7O/l/drsdRxxxBJYtW5bxdWtra7F+/Xps3LjR8Pfd3d1YunQpzjnnHPj9fn78rq4unHTSSdi4cSM/F8ZFF12UNYvT7Hl7vV64XC4sX74cPT09GY+p59hjj+XbaP1+P9atW4fvf//7aGxs5I+vXLkStbW1mD17dk7HFtlvv/1w7LHH8p+bmpqw9957Y8uWLab+/mtf+xrq6uo05w2A//2ePXuwdu1aXHDBBaivr+fPO+CAA3DCCSfgxRdfTDnmD3/4w5zeQyAQwFlnnYW6ujo89NBD/Pt78cUXMXbsWHz961/nz3U6nbj00ksxMDCA119/Paf3kg3RidrT04O+vj4ce+yxhtXjs3HcccehsbERjzzyiOaYS5Ys0cRhGJ1DvtccAJx33nmoqqriPy9atAjjxo0z/J6s4pxzzoHH48EDDzzAH1u8eDE6OztNZ2uff/75ms9/7dq12LhxI77xjW+gq6uL36OBQADHH388VqxYkbGYmngs1nYce+yxCAaD+PTTT3N+j1bcB8ceeyy6urp49APLpH3mmWcsKRD54osvwm6349JLL9U8fsUVV0BRFLz00kuax+fPn4/99tvP9PHNtDUvvvgiDj/8cB6LAiTcy9///vexbds2bNiwgT9v3LhxPDsWSDhVv//972tec6jXgZ5gMIizzz4bXq8Xv/vd7zS/GxwcNMwUZzm/g4ODAIBvfOMbqKmpwXe+8x0sWbIE27Ztw91334077rhD8zyCIAiCKFVItCUIgiCIEcTkyZM1PzMBd9KkSYaPMzGJia3HHXccmpqaNP+98soraG9vz/i6v/71r9Hb24u99toLc+bMwZVXXqnJgd20aRMURcGvfvWrlONfe+21AJDyGtOmTcv6fs2et9vtxs0334yXXnoJY8aMwbx58/D73/8era2tWV/j2GOPxZ49e7Bp0yae7XnUUUdpxNyVK1fimGOOGVLBJf13BwB1dXWmBT/93zPRk/399u3bAQB77713yt/uu+++XEARMfMdiFx00UXYvHkznnrqKTQ0NPDHt2/fjlmzZqV8Piwegp2b2feSjeeffx5HHnkkPB4P6uvr0dTUhDvvvBN9fX05vR8AcDgc+OpXv6rJwnzyyScRjUYzirZDueYA8Ar3DEmSMHPmzIwZzEOltrYWp512Gi/UBCSiESZMmIDjjjvO1DH01wy7R88///yUe/Sf//wnwuFwxu9l/fr1OOuss1BTU4Pq6mo0NTVxATmf7zOf+yDb9fi1r30NxxxzDL73ve9hzJgxOPfcc/Hoo4/mLeBu374d48eP14j27PzE98DI9T4109Zs37497WcknsP27dsxc+ZMTaY0kPr5DvU6EInH4zj33HOxYcMGPP744xg/frzm916v1zBTNxQK8d8DwNixY/Hss88iHA7jxBNPxLRp03DllVfitttuA5A5YoMgCIIgSgHKtCUIgiCIEUQ6Z2q6x5VkTikTF+6//36MHTs25XmiS9eIefPmYfPmzXjmmWfwyiuv4J///Cf+/Oc/4+9//zu+973v8eP/9Kc/xUknnWR4jJkzZ2p+NpPbmct5X3bZZTjttNPw9NNPY/HixfjVr36Fm266CUuXLsXBBx+c9jWY02zFihXYsmULDjnkEFRUVODYY4/FX//6VwwMDOCDDz7Ab37zm6znm4ls31Gh/96IXLJT//KXv+Chhx7Cf//7Xxx00EF5vyYwtPeycuVKnH766Zg3bx7uuOMOjBs3Dk6nE/fcc49GjMyFc889F3fddRdeeuklnHnmmXj00Uexzz774MADD8z4d/lec8XkvPPOw2OPPYZVq1Zhzpw5ePbZZ/GjH/3I9IKE/pph9+gtt9yS9rpIJ4719vZi/vz5qK6uxq9//WvMmDEDHo8Ha9aswc9+9jNLXK1myHY9er1erFixAsuWLcMLL7yAl19+GY888giOO+44vPLKK1l3DAyVXDOOC9FWZGMo14Geiy66CM8//zweeOABw8WEcePGYc+ePSmPs8dEkXfevHnYsmULPvroIwQCARx44IFoaWkBAOy1116mzocgCIIgigWJtgRBEAQxCpgxYwYAoLm5OaWolFnq6+tx4YUX4sILL8TAwADmzZuH6667Dt/73vcwffp0AIkt8fke34rznjFjBq644gpcccUV2LhxIw466CD88Y9/xH//+9+0fzN58mRMnjwZK1euxJYtW/i24nnz5uHyyy/HY489hng8jnnz5mV8bb0TbbiZMmUKAOCzzz5L+d2nn36KxsZGVFRU5HXslStX4qc//Skuu+wyfPOb3zR87Q8//BCyLGvEP7a9nZ1bLqT7PJ944gl4PB4sXrxYs0X6nnvuyfk1GPPmzcO4cePwyCOPYO7cuVi6dCkv4pWNfK45AClRI4qiYNOmTbwg3lDIdC2efPLJaGpqwgMPPIAjjjgCwWAQ3/72t/N+LXaPVldX53zvL1++HF1dXXjyySc199fWrVtTnmv2/irUfWCz2XD88cfj+OOPx5/+9Cf89re/xS9+8QssW7Ys5/c9ZcoUvPrqq/D7/Rq37VDul1yZMmVK2s9IPIcpU6bg448/hqIomu9A/7dDuQ5ErrzyStxzzz249dZbNXErIgcddBBWrlyZ0t6888478Pl8KWKs3W7XCMmvvvoqAFjaVxEEQRBEIaB4BIIgCIIYBZx00kmorq7Gb3/7W0Sj0ZTfd3R0ZPz7rq4uzc+VlZWYOXMm36La3NyMBQsW4K677jJ0QGU7/lDPOxgM8q2xjBkzZqCqqspwG62eY489FkuXLsW7777LRduDDjoIVVVV+N3vfgev14tDDz004zGYENTb22vmrVnOuHHjcNBBB+G+++7TnMPHH3+MV155Baeeempex92zZw/OOecczJ07F7fccovhc0499VS0trZqcmFjsRhuu+02VFZWYv78+Tm/brrP0263Q5IkxONx/ti2bdvw9NNP5/waDJvNhkWLFuG5557D/fffj1gsljEaARj6Nfef//wHfr+f//z4449jz549OOWUU/J7EwIVFRVpr0OHw4Gvf/3rePTRR3Hvvfdizpw5QxKKDz30UMyYMQN/+MMfMDAwkPL7TPc+c4SKDtBIJMIzR0UqKipMba8vxH3Q3d2d8hgTAc1813pOPfVUxONx/O1vf9M8/uc//xmSJFlyDZg5h3fffRdvvfUWfywQCODuu+/G1KlTeYbuqaeeipaWFjz++OP8ecFgEHfffbfmeEO5Dhi33HIL/vCHP+Dqq6/GT37yk7TPW7RoEdra2vDkk0/yxzo7O/HYY4/htNNOM8y7Fc/j5ptvxgEHHECiLUEQBFHykNOWIAiCIEYB1dXVuPPOO/Htb38bhxxyCM4991w0NTVhx44deOGFF3DMMcekCAgi++23HxYsWIBDDz0U9fX1WL16NR5//HFccskl/Dm333475s6dizlz5uCiiy7C9OnT0dbWhrfeegu7du3CunXrCnben3/+OY4//nicc8452G+//eBwOPDUU0+hra0N5557btbXOfbYY/HAAw9AkiQel2C323H00Udj8eLFWLBgAVwuV8ZjHHTQQbDb7bj55pvR19cHt9uN4447Ds3NzTm/73y55ZZbcMopp+Coo47Cd7/7XQwODuK2225DTU0NrrvuuryOeemll6KjowP/93//h4cffljzuwMOOAAHHHAAvv/97+Ouu+7CBRdcgPfffx9Tp07F448/jjfffBO33nprSnanGZhIfumll+Kkk06C3W7Hueeei4ULF+JPf/oTTj75ZHzjG99Ae3s7br/9dsycOVOTs5wrX/va13Dbbbfh2muvxZw5c3i2ZzqGes3V19dj7ty5uPDCC9HW1oZbb70VM2fOxEUXXZT3e2AceuihuPPOO3HjjTdi5syZaG5u1mwzP++88/DXv/4Vy5Ytw8033zyk17LZbPjnP/+JU045Bfvvvz8uvPBCTJgwAbt378ayZctQXV2N5557zvBvjz76aNTV1eH888/HpZdeCkmScP/99xtu4z/00EPxyCOP4PLLL8dhhx2GyspKnHbaaYbHtfo++PWvf40VK1Zg4cKFmDJlCtrb23HHHXdg4sSJmkJeZjnttNPwxS9+Eb/4xS+wbds2HHjggXjllVfwzDPP4LLLLuOu1ULy85//HA899BBOOeUUXHrppaivr8d9992HrVu34oknnuAO1osuugh/+9vfcN555+H999/HuHHjcP/998Pn82mON5TrAACeeuop/N///R9mzZqFfffdN8WpfsIJJ2DMmDEAEqLtkUceiQsvvBAbNmxAY2Mj7rjjDsTjcVx//fWav5s/fz6OOuoozJw5E62trbj77rsxMDCA559/fkgZ5QRBEAQxHJBoSxAEQRCjhG984xsYP348fve73+GWW25BOBzGhAkTcOyxx+LCCy/M+LeXXnopnn32WbzyyisIh8OYMmUKbrzxRlx55ZX8Ofvttx9Wr16N66+/Hvfeey+6urrQ3NyMgw8+GNdcc01Bz3vSpEn4+te/jtdeew33338/HA4H9tlnHzz66KP46le/mvU1mLt2n3320RTYOvbYY7F48WJNJfZ0jB07Fn//+99x00034bvf/S7i8TiWLVs2rKLtl770Jbz88su49tprcc0118DpdGL+/Pm4+eabcy5mxOjo6EA8Hsfll1+e8rtrr70WBxxwALxeL5YvX46f//znuO+++9Df34+9994b99xzDy644IK8XvcrX/kKfvzjH+Phhx/Gf//7XyiKgnPPPRfHHXcc/vWvf+F3v/sdLrvsMkybNg0333wztm3bNiTR9uijj8akSZOwc+fOrC5bYOjX3NVXX40PP/wQN910E/x+P44//njccccdKWJYPlxzzTXYvn07fv/738Pv92P+/Pka0fbQQw/F/vvvj08++cQw7iJXFixYgLfeegs33HAD/va3v2FgYABjx47FEUccgR/84Adp/66hoQHPP/88rrjiCvzyl79EXV0dvvWtb+H4449Pycb+0Y9+hLVr1+Kee+7Bn//8Z0yZMiWtaGv1fXD66adj27Zt+Pe//43Ozk40NjZi/vz5uP7663nRx1yw2Wx49tlncc011+CRRx7BPffcg6lTp+KWW27BFVdckfPx8mHMmDFYtWoVfvazn+G2225DKBTCAQccgOeeew4LFy7kz/P5fHjttdfw4x//GLfddht8Ph+++c1v4pRTTsHJJ5+sOWa+1wEAvqi3ceNGw7iOZcuWcdHWbrfjxRdfxJVXXom//vWvGBwcxGGHHYZ77703pUDaoYceisceewy7d+9GdXU1TjjhBNxwww080ocgCIIgShlJKWQiPUEQBEEQBEEQJcfBBx+M+vp6vPbaa8U+FYIgCIIgCMIA2hNCEARBEARBEKOI1atXY+3atTjvvPOKfSoEQRAEQRBEGshpSxAEQRAEQRCjgI8//hjvv/8+/vjHP6KzsxNbtmyBx+Mp9mkRBEEQBEEQBpDTliAIgiAIgiBGAY8//jguvPBCRKNRPPTQQyTYEgRBEARBlDDktCUIgiAIgiAIgiAIgiAIgighyGlLEARBEARBEARBEARBEARRQpBoSxAEQRAEQRAEQRAE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\",\n      \"text/plain\": [\n       \"<Figure size 1400x400 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"visibility_relations_horizontal = HVG1.visibility_relations_horizontal()\\n\",\n    \"\\n\",\n    \"i = 209 # only plot the nodes visible from here\\n\",\n    \"plt.figure(figsize=(14, 4), tight_layout=True)\\n\",\n    \"plt.plot(t[:cutoff], w_t[:cutoff]) # zooming in a bit\\n\",\n    \"plt.xlabel(\\\"$t$\\\"); plt.ylabel(\\\"$w_t$\\\")\\n\",\n    \"plt.title(f\\\"Time series with horizontal visibility relations for node {i}\\\")\\n\",\n    \"for k in range(cutoff):\\n\",\n    \"    if visibility_relations_horizontal[i][k]:\\n\",\n    \"        ax = plt.arrow(i, w_t[i], k-i, w_t[k]-w_t[i], color='darkgray')\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"445f785f\",\n   \"metadata\": {},\n   \"source\": [\n    \"### Irreversibility Test\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"eaea9cb7\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Linear Time Series\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"fd5fd60a\",\n   \"metadata\": {},\n   \"source\": [\n    \"We start by analysing the linear time series via its time directed degrees:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 8,\n   \"id\": \"c8abc84c\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"k_r1 = VG1.retarded_degree()\\n\",\n    \"k_a1 = VG1.advanced_degree()\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"8b81f887\",\n   \"metadata\": {},\n   \"source\": [\n    \"Applied to a VG, both methods return an array with the corresponding degree for each node. For such an array, we can obtain the probability for each degree with a kernel-density estimate using Gaussian kernels. [Kernel density estimation](https://en.wikipedia.org/wiki/Kernel_density_estimation) is a way to estimate the probability density function (PDF) of a random variable in a non-parametric way. We use `scipy.stats.gaussian_kde` for that.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 9,\n   \"id\": \"ab06fcb7\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"from scipy.stats import gaussian_kde \\n\",\n    \"gkde_r1 = gaussian_kde(k_r1)\\n\",\n    \"gkde_a1 = gaussian_kde(k_a1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"19cb5e7a\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we plot $p(k_v^r)$ against $k_v^r$ in red, and $p(k_v^a)$ against $k_v^a$ in black, and compare both visually. The y-scale is linear in the first figure and logartihmic in the second. Both plots are cut off at a degree of 12, at which the empirical frequencies become too low to be comparable.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 10,\n   \"id\": \"20c8f530-2060-4c78-a467-39321a0ae403\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def plot_time_directed(r, a, ylog=False):\\n\",\n    \"    plt.figure(figsize=(14, 3), tight_layout=True)\\n\",\n    \"    x = np.linspace(0, 12, 1000)\\n\",\n    \"    plt.plot(x, r.evaluate(x), color=\\\"red\\\", label=\\\"retarded\\\")\\n\",\n    \"    plt.plot(x, a.evaluate(x), color=\\\"black\\\", label=\\\"advanced\\\")\\n\",\n    \"    plt.xlabel(\\\"$k$\\\"); plt.ylabel(\\\"$p(k)$\\\")\\n\",\n    \"    if ylog:\\n\",\n    \"        plt.yscale(\\\"log\\\")\\n\",\n    \"    plt.legend()\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 11,\n   \"id\": \"cedb7d7c-e784-4451-81b2-da08de0d493a\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAABW0AAAEhCAYAAAAEQoK3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABt/klEQVR4nO3deXhMZ+PG8e/MZJXVmoWQ2Hexl2qp5ie6aFUXVKvVXVWrXl1olS6Koq9aSmlVN0Xf7pulsdS+x76LXYSQXbaZ+f0xDKnQIHJGcn+u67lm5pwzZ+4j77zl9niOyW632xERERERERERERERl2A2OoCIiIiIiIiIiIiInKfSVkRERERERERERMSFqLQVERERERERERERcSEqbUVERERERERERERciEpbERERERERERERERei0lZERERERERERETEhai0FREREREREREREXEhbkYHuBHYbDaOHj2Kn58fJpPJ6DgiIiIiIiIiIiJyA7Lb7aSmphIaGorZfOn5tCptC+Do0aOEhYUZHUNERERERERERESKgUOHDlGpUqVL7ldpWwB+fn6A4xfT39/f4DQiIiIiIiIiIiJyI0pJSSEsLMzZN16KStsCOLckgr+/v0pbERERERERERERuSb/tgSrbkQmIiIiIiIiIiIi4kJU2oqIiIiIiIiIiIi4EJW2IiIiIiIiIiIiIi5Ea9qKiIiIiIiIiIgYzGq1kpOTY3QMuUbu7u5YLJZrPo9KWxEREREREREREYPY7Xbi4+NJSkoyOooUksDAQIKDg//1ZmOXo9JWRERERERERETEIOcK2woVKlCqVKlrKvrEWHa7nYyMDBISEgAICQm56nOptBUpjlJTYeNG2LQJDhyAw4exnjxJTkYGtuxsvEuVwuTjA+XKQaVKUKUK1K/vGH5+RqcXERERERERKRGsVquzsC1btqzRcaQQeHt7A5CQkECFChWueqkElbYixYHNBkuXYv/9d7b98gsrduxgE7AFOAQcA9IvONwM+ALBQDhQDWgENAYaN2iAe/v20K4dtG0LpUsX5ZWIiIiIiIiIlBjn1rAtVaqUwUmkMJ37eebk5Ki0FSmR4uLI+fhj/po+nVknTzIXiC/A22xAytmx6x/7fDdvpu3mzUR99BEdLRZqR0VB167QubMKXBEREREREZHrQEsiFC+F8fNUaStyI1q9moNDhzLx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SHJysnMcOnTo6i9K5Kzcv/+ma8+erAPKeXnx54oVlC9f3uhYhjo36/aXX36hfPnybAKaAuNmz8beqBEsWWJ0RBERERERERGRIudSpe21GjFiBDNnzuTHH3/Ms15Et27duOeee2jQoAGdO3fmt99+Y82aNSxatCjf83h6euLv759niFyTgwfpGx3NHzYb3mYzv86fT/UaNYxO5TI6derEpk2buOOOO8gCXgLuOHSIY23bwpAhkJtrdEQRERERERERkSLjUqVtuXLlsFgsHD9+PM/248ePExwcfNn3jh49mhEjRjBv3jwaNmx42WOrVq1KuXLl2LNnzzVnFvlXmZlMvfVWJmdmYgJmfPMNN7VpY3QqlxMcHMzvv//OhAkT8PLyYi7QwG7np3fegVtvhbg4oyOKiIiIiIiIiBQJlyptPTw8aNq0aZ6biJ27qVirVq0u+b4PPviAd999lzlz5tCsWbN//ZzDhw+TmJhISEhIoeQWuSS7nVUPPMALBw4AMOyVV+jcrZvBoVyXyWSiT58+rFu3jsjISBKB+4DeK1ZwplEj+PZboyOKiIiIiIiIiFx3LlXaAvTv35+pU6fyxRdfsH37dnr37k16ejq9evUCoGfPngwcONB5/MiRIxk8eDDTpk0jPDyc+Ph44uPjSUtLAyAtLY1XXnmFlStXsn//fmJiYrj33nupXr060dHRhlyjlBzHR47k/t9/Jxu47+abeX3kSKMj3RDq1q3LypUreeWVVwCYDLRITWXbww/DY49BaqqxAUVEREREREREriOXK227du3K6NGjeeutt4iMjCQ2NpY5c+Y4b0528OBBjh075jx+0qRJZGdn88ADDxASEuIco0ePBsBisbBp0ybuueceatasyZNPPknTpk1ZsmQJnp6ehlyjlAy5S5bQdeBAjgC1K1Rg+h9/YDKZjI51w/D09OSDDz5g7ty5VKhQgS1AM+CzL7/EHhkJa9YYnFBERERERERE5Pow2e12u9EhXF1KSgoBAQEkJyfrpmRSMElJDKxShREpKfi5ubF60yZq16ljdKobVnx8PD179mT+/PkAdAMmWywEjBgB/fuD2eX+/klERERERETkX2VmZhIXF0dERAReXl5Gx7mu9u/fT0REBBs2bCAyMtLoONdk6NCh/PTTT8TGxua7/3I/14L2jGo6RAqb3c6Czp0ZmZICwGeffqrC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QICHB6+8+67RiaSE6Ny5M9u2bXPOuh0DNAKWTpkCdevC99+D3W5wShERERERERExisluVzPwb1JSUggICCA5OVk3JStGcmbNom63buwB3n3tNd4cMcLoSFIC/f777zzzzDMcPXoUE9AXeB/wuecemDgRKlUyOKGIiIiIiIiIFJaC9owuN9NWpEjk5vJFv37sAcqXKsVLb7xhdCIpoe666y62bt3Kk08+iR0YBzQAFv7yi2PW7cSJYLMZnFJEREREREREipJKWymRMqdN4+34eAAGvfkmfn5+BieSkiwwMJBPP/2UuXPnUrlyZeKA9kDv1FRSXngB2rSBs2svi4iIiIiIiEjxp9JWSp6sLCa/9hqHgUoBATz38stGJxIBoEOHDmzevJnnnnsOgMlAXZOJn1asgCZNYPBgyMw0NqSIiIiIiIiIXHcqbaXESRs3jveTkgB4a9gw3ZBOXIq/vz+TJk1iwYIFVK9enSN2O/cB9+XkcPi996BRI5g/3+iYIiIiIiIiInIdqbSVkiUjg3HvvMMJoHr58jz+zDNGJxLJ12233camTZsYNGgQbm5u/IRj1u3EXbuwdugADz0Ehw8bHVNERERERERErgOVtlKipIwdy+i0NACGjhqFu7u7wYlELs3b25thw4axYcMGbrrpJlLtdl4AbgY2ffcd1K4No0dDTo7RUUVERERERESkEKm0lZIjPZ3x77/PaaB2cDDdHnnE6EQiBVK/fn2WLVvGxIkT8ff3ZxXQ1GRiYHo6Z155BSIjYdEig1OKiIiIiIiISGFRaSslRvKHHzImPR2Atz74AIvFYnAikYIzm808//zzbNu2jS5dupBrtzMCqGs288u2bdhvuw0eeQSOHTM6qoiIiIiIiIhcI5W2UjKkpTF+xAjHLNuQEB56+GGjE4lclYoVK/L999/z888/ExYWxn6bjXuBTsDeb745v2RCdrbRUUVERERERETkKqm0lRIhecwYPszIADTLVoqHe+65h+3btzNw4EDc3d35HahnMjEkJcWxZEK9evDzz2C3Gx1VRERERERERK6QSlsp/lJTGT9y5PlZtt27G51IpFD4+Pjw/vvvs3nzZjp06ECW3c47QF2LhV/27MHeuTP83//B5s1GRxURERERERGRK6DSVoq95FGj+PDMGUCzbKV4qlWrFnPmzOH77793LJlgtXIvcLfZzJ6Y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YrfzDNAOMHXsCM8/71hCwWIxMq6IiIiIiIhIgRW0Z7yi0vaVV14hNjaWjRs3cvLkSUqXLk2jRo3YuHEj999/P3369KFu3bq4u7sXykW4CpW2riOxVy/Cp08nDfjhhx+47777jI4kItdJamoqM2fOZMqUKaxdu9a5vQbwNPA4UD48HJ57Dp58EsqVMyaoiIiIiIiISAFdl9L2QueWIrhw7Nu3Dzc3N2rXrs3GjRuvOryrUWnrIg4e5I2ICN632YisXp31u3ZhMpmMTiUiRWD9+vVMnTqVb775htTUVADccax9+wzQzsMDc7du0KcPtGhhZFQRERERERGRS7rupW1+0tLSnDNx+/TpU1inNZxKW9dw8rHHiPjyS9KAn376iXvvvdfoSCJSxNLS0pyzb9esWePcXh3H7NueQHCzZo6lE7p1A29vo6KKiIiIiIiIXMSQ0ra4UmnrAg4cYGDVqoyw2Whcowbrdu7ULFuREm7Dhg1MnTqVr7/+2jn71gLcCTwB3FW6NO5PPgm9e0PVqkZGFREREREREQEK3jNe0R2cDh48eEUhjhw5ckXHi1zKycGDGW+zATB09GgVtiJC48aN+fjjjzl69CifffYZN910E1bgV+A+oNLp0/xn9Gi2VKsGd90Fv/8OVqvBqUVERERERET+3RWVts2bN+fZZ5/N809S/yk5OZmpU6dSv359vv/++2sOKEJcHKO//pp0oGmtWnTq1MnoRCLiQnx9fXniiSdYsWIF27Zt45VXXiEoKIgE4EOgAdDijz+YfPfdJFWtCqNGQWKiwalFRERERERELu2KlkdITExk2LBhTJs2DS8vL5o2bUpoaCheXl6cPn2abdu2sXXrVpo0acLgwYO58847r2f2IqPlEYx1okcPImbMIB349ddfufvuu42OJCIuLicnhzlz5vD555/z66+/kpubC4AXjpuXPeHuzm3du2N+/nnHjcs0e19ERERERESKwHVd0/bMmTP8/vvvLF26lAMHDnDmzBnKlStH48aNiY6Opn79+tcU3tWotDXQ7t28VqsWH9jtNKtdm9XbtmlpBBG5IgkJCXz99ddM+/RTtm7f7txeBXgceLxOHcJffBF69AA/P6NiioiIiIiISAlQZDciO7dubcWKFa/lNC5Npa1xEu6/n4gffiAD+O2337jrrruMjiQiNyi73c7atWv5fNo0Znz9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FBERERERERERETGKS8209fDwoGnTpsTExNC5c2fAcSOymJgYXnjhhXzf06pVK2JiYujXr59z2/z582nVqhUAERERBAcHExMTQ2RkJOBY8HfVqlX07t27QLnO3astJSXl6i5MRERERERERERESrxz/eK5vvGS7C5m5syZdk9PT/v06dPt27Ztsz/zzDP2wMBAe3x8vN1ut9sfffRR++uvv+48ftmyZXY3Nzf76NGj7du3b7cPGTLE7u7ubt+8ebPzmBEjRtgDAwPtP//8s33Tpk32e++91x4REWE/c+ZMgTIdOnTIDmhoaGhoaGhoaGhoaGhoaGhoaGhoXPM4dOjQZftIl5ppC9C1a1dOnDjBW2+9RXx8PJGRkcyZM8d5I7GDBw9iNp9f1aF169bMmDGDN998k0GDBlGjRg1++ukn6tev7zzm1VdfJT09nWeeeYakpCTatGnDnDlz8PLyKlCm0NBQDh06hJ+fHyaTqXAv2MWkpKQQFhbGoUOH8Pf3NzqOiEvQ90LkYvpeiFxM3wuRi+l7IXIxfS9ELlaSvhd2u53U1FRCQ0Mve5zJbv+3ubhSkqSkpBAQEEBycnKx/5KIFJS+FyIX0/dC5GL6XohcTN8LkYvpeyFyMX0vLuZSNyITERERERERERERKelU2oqIiIiIiIiIiIi4EJW2koenpydDhgzB09PT6CgiLkPfC5GL6XshcjF9L0Qupu+FyMX0vRC5mL4XF9OatiIiIiIiIiIiIiIuRDNtRURERERERERERFyISlsRERERERERERERF6LSVkRERERERERERMSFqLQVERERERERERERcSEqbSWPiRMnEh4ejpeXFy1btmT16tVGRxIxzPDhw2nevDl+fn5UqFCBzp07s3PnTqNjibiMESNGYDKZ6Nevn9FRRAx35MgRHnnkEcqWLYu3tzcNGjRg7dq1RscSMYTVamXw4MFERETg7e1NtWrVePfdd9E9sKWk+fvvv+nUqROhoaGYTCZ++umnPPvtdjtvvfUWISEheHt7ExUVxe7du40JK1IELvedyMnJ4bXXXqNBgwb4+PgQGhpKz549OXr0qHGBDabSVpxmzZpF//79GTJkCOvXr6dRo0ZER0eTkJBgdDQRQyxevJg+ffqwcuVK5s+fT05ODh06dCA9Pd3oaCKGW7NmDZ988gkNGzY0OoqI4U6fPs3NN9+M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\",\n      \"text/plain\": [\n       \"<Figure size 1400x300 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"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\",\n      \"text/plain\": [\n       \"<Figure size 1400x300 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_time_directed(gkde_r1, gkde_a1)\\n\",\n    \"plot_time_directed(gkde_r1, gkde_a1, ylog=True)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"adebe395\",\n   \"metadata\": {},\n   \"source\": [\n    \"By visual investigation we already find strong similarities between the distributions. Now we also apply the KS test for this time series, using `scipy.stats.ks_2samp` to obtain the $p$-value of the two input data sets.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 12,\n   \"id\": \"0c5cead0\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"KstestResult(statistic=0.0072, pvalue=0.9994903068538411, statistic_location=3.0, statistic_sign=1)\"\n      ]\n     },\n     \"execution_count\": 12,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"from scipy.stats import ks_2samp\\n\",\n    \"ks_2samp(k_r1, k_a1)\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"ec953d2d\",\n   \"metadata\": {},\n   \"source\": [\n    \"The result of `pvalue=0.999... > 0.05` indicates that the time series has likely been generated by a reversible process.\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"da798677\",\n   \"metadata\": {},\n   \"source\": [\n    \"#### Non-Linear Time Series\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"daa011e0\",\n   \"metadata\": {},\n   \"source\": [\n    \"Now we will perform the same procedure for a non-linear time series. We can construct one using the logistic map for instance, which we take from the tutorial on recurrence networks. We only change the bifurcation parameter ($r = 4$) to find ourselves deeply in the chaotic regime.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 13,\n   \"id\": \"76ce744f-94b4-494c-99b6-6fcecbcc0eee\",\n   \"metadata\": {},\n   \"outputs\": [],\n   \"source\": [\n    \"def logistic_map(x0: float, r: float, T: int, spinup: int = 100):\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    Returns a time series of length T using the logistic map\\n\",\n    \"    x_(n+1) = r*x_n(1-x_n)\\n\",\n    \"    at parameter r and using the initial condition x0.\\n\",\n    \"\\n\",\n    \"    INPUT: x0 - Initial condition, 0 <= x0 <= 1\\n\",\n    \"            r - Bifurcation parameter, 0 <= r <= 4\\n\",\n    \"            T - length of the desired time series\\n\",\n    \"            spinup - number of spinup-timesteps before storing results to output\\n\",\n    \"    OUTPUT: numpy array of timeseries under given parameters\\n\",\n    \"    \\\"\\\"\\\"\\n\",\n    \"    # spinup\\n\",\n    \"    for n in range(spinup):\\n\",\n    \"        x0 = r * x0 * (1 - x0)\\n\",\n    \"\\n\",\n    \"    timeseries = np.zeros(T + 1)\\n\",\n    \"    timeseries[0] = x0\\n\",\n    \"    for n in range(T):\\n\",\n    \"        # get current timestep value\\n\",\n    \"        xn = timeseries[n]\\n\",\n    \"        # calculate next timestep value\\n\",\n    \"        xstep = r * xn * (1 - xn)\\n\",\n    \"        timeseries[n + 1] = xstep\\n\",\n    \"    return timeseries\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 14,\n   \"id\": \"7051fb29-c0f0-4d8d-b0e2-2a5b8e7bd353\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAABIQAAAFzCAYAAABPfdIwAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOz9ebhtWVkeir+r22vvffZpqupUnVMFBVWg0guIAStgItdS7PBnbn4RYx5Rot7EC7mGiuZaiUI0EZL8rmhuHpQrETXeRFBDRAKCWFIoUqakoOiriq76On2zu9Wv+ftjrjHmN8Yc/RhzNfvM73nqgbP3XmuNNeeYY3zj/d73/RpZlmWoo4466qijjjrqqKOOOuqoo4466qjjionmogdQRx111FFHHXXUUUcdddRRRx111FHHfKMGhOqoo4466qijjjrqqKOOOuqoo446rrCoAaE66qijjjrqqKOOOuqoo4466qijjissakCojjrqqKOOOuqoo4466qijjjrqqOMKixoQqqOOOuqoo4466qijjjrqqKOOOuq4wqIGhOqoo4466qijjjrqqKOOOuqoo446rrCoAaE66qijjjrqqKOOOuqoo4466qijjissakCojjrqqKOOOuqoo4466qijjjrqqOMKi/aiB7CImE6nePzxx3H48GE0Go1FD6eOOuqoo4466qijjjrqqKOOOuqoI0lkWYadnR3ccMMNaDb1PKArEhB6/PHHceONNy56GHXUUUcdddRRRx111FFHHXXUUUcdlcQjjzyCJz/5ydrfX5GA0OHDhwHkF+fIkSMLHk0dddRRRx111FFHHXXUUUcdddRRR5rY3t7GjTfeyLEPXVyRgBCTiR05cqQGhOqoo4466qijjjrqqKOOOuqoo44DFzaLnNpUuo466qijjjrqqKOOOuqoo4466qjjCosaEKqjjjrqqKOOOuqoo4466qijjjrquMKiBoTqqKOOOuqoo4466qijjjrqqKOOOq6wqAGhOuqoo4466qijjjrqqKOOOuqoo44rLGpAqI466qijjjrqqKOOOuqoo4466qjjCosaEKqjjjrqqKOOOuqoo4466qijjjrquMJi4YDQn//5n+OVr3wlbrjhBjQaDfzhH/6h9TV33nknvuEbvgHdbhdf8zVfg9/6rd+qfJx11FFHHXXUUUcdddRRRx111FFHHQclFg4I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+CkIUYLOd6VSwUc+8hFs2LABc+fOxfLly/GOd7wDe/bscbyH15hw6623JvxJCBHC7u93vvOdLefywgsvdPwO3d/tQ9j59nqWG4aBT3/609bv0P3dHoisvUTm47t27cLFF1+MOXPmYPHixfjwhz+MarWa5EeJBBWE2ox77rkH27Ztw80334zHH38cp512GrZu3YoDBw6kfWhERH74wx/i+uuvx89+9jM88MADqFQquOCCCzA5Oen4veuuuw579+61/rvttttSOmIiKqeccorjXP7kJz+x/u1DH/oQ/vu//xv33nsvfvjDH2LPnj24/PLLUzxaIgo///nPHef6gQceAAD80R/9kfU7dG+3L5OTkzjttNNwxx13eP77bbfdhn/5l3/BnXfeiUceeQRz587F1q1bMTMzY/3O1VdfjV//+td44IEH8K1vfQs/+tGP8Gd/9mdJfQRCgqDzPTU1hccffxyf+MQn8Pjjj+Mb3/gGduzYgUsvvbTld//mb/7Gcc+/733vS+LwCUnC7m8AuPDCCx3n8j/+4z8c/073d/sQdr7587x3717cddddMAwDV1xxheP36P7OPiJrr7D5eK1Ww8UXX4xyuYyf/vSn+PKXv4wvfelLuOmmm9L4SGqYRFtx9tlnm9dff731/9dqNXP58uXmLbfckuJREXFw4MABE4D5wx/+0PrZa17zGvMDH/hAegdFaOPmm282TzvtNM9/GxkZMYvFonnvvfdaP/vtb39rAjC3b9+e0BEScfKBD3zAXLt2rVmv103TpHu7kwBgfvOb37T+/3q9bi5dutT89Kc/bf1sZGTE7OnpMf/jP/7DNE3T/M1vfmMCMH/+859bv/Pd737XNAzD3L17d2LHTsjjPt9ePProoyYA88UXX7R+tnr1avOf/umf4j04Qjte5/uaa64xL7vsMt/X0P3dvojc35dddpn5h3/4h46f0f3dnrjXXiLz8e985ztmLpcz9+3bZ/3O5z73OXNgYMCcnZ1N9gMoQgqhNqJcLuOxxx7Dli1brJ/lcjls2bIF27dvT/HIiDgYHR0FAAwPDzt+/tWvfhULFy7EqaeeihtvvBFTU1NpHB6hgWeffRbLly/Hcccdh6uvvhq7du0CADz22GOoVCqOe33dunVYtWoV3esdQLlcxle+8hX86Z/+KQzDsH5O93Zn8sILL2Dfvn2O+3lwcBCb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\",\n      \"text/plain\": [\n       \"<Figure size 1400x400 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"r = 4\\n\",\n    \"x0 = 0.8\\n\",\n    \"T = 5000\\n\",\n    \"time_series = logistic_map(x0, r, T)\\n\",\n    \"\\n\",\n    \"cutoff = 200\\n\",\n    \"plt.figure(figsize=(14, 4))\\n\",\n    \"plt.plot(time_series[:cutoff])\\n\",\n    \"plt.xlabel(\\\"$n$\\\"); plt.ylabel(\\\"$x_n$\\\");\"\n   ]\n  },\n  {\n   \"cell_type\": \"markdown\",\n   \"id\": \"3fa8ae3b\",\n   \"metadata\": {},\n   \"source\": [\n    \"We again compare the time-directed degree distributions visually:\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 15,\n   \"id\": \"b72858bd-3bf4-4aa7-91c7-8acc95a864f9\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"name\": \"stdout\",\n     \"output_type\": \"stream\",\n     \"text\": [\n      \"Calculating visibility relations...\\n\"\n     ]\n    }\n   ],\n   \"source\": [\n    \"VG2 = VisibilityGraph(time_series)\\n\",\n    \"k_r2 = VG2.retarded_degree()\\n\",\n    \"k_a2 = VG2.advanced_degree()\\n\",\n    \"gkde_r2 = gaussian_kde(k_r2)\\n\",\n    \"gkde_a2 = gaussian_kde(k_a2)\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 16,\n   \"id\": \"95c9298a-1147-4fb2-b650-0decaf64a2a0\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAABW0AAAEhCAYAAAAEQoK3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACK8klEQVR4nOzdd1jVZR/H8fdhL8GNqBiKMxfulStxm+nj1lKxrLRlNq1Me/TJHJWllmU50sxVmprhHqW4Z+6FuBBxgIAyzjnPH79AyQUIHNDP67ru6/zOb53vgST9cJ/vbbJarVZEREREREREREREJEews3UBIiIiIiIiIiIiInKTQlsRERERERERERGRHEShrYiIiIiIiIiIiEgOotBWREREREREREREJAdRaCsiIiIiIiIiIiKSgyi0FREREREREREREclBFNqKiIiIiIiIiIiI5CAOti4gN7BYLJw7d448efJgMplsXY6IiIiIiIiIiIjkQlarlWvXrlG0aFHs7O4+n1ahbRqcO3cOX19fW5chIiIiIiIiIiIiD4HTp09TvHjxux5XaJsGefLkAYwvpqenp42rERERERERERERkdwoOjoaX1/flLzxbhTapkFySwRPT0+FtiIiIiIiIiIiIvJA7teCVQuRiYiIiIiIiIiIiOQgCm1FREREREREREREchCFtiIiIiIiIiIiIiI5iHraioiIiIiIiIiI2JjZbCYxMdHWZcgDcnR0xN7e/oHvo9BWRERERERERETERqxWK+Hh4Vy9etXWpUgmyZs3L0WKFLnvYmP3otBWRERERERERETERpID28KFC+Pm5vZAQZ/YltVqJS4ujoiICAB8fHwyfC+FtiI51blzsG4dHDnCxatXCb5yhb9NJg5dvkz0tWs4Ojri7u5OxYoVCQgIoHHjxhQqVMjWVYuIiIiIiIhIGpnN5pTAtkCBArYuRzKBq6srABERERQuXDjDrRIU2orkNLt3w9ChWH//nV+tVr4F1gDmu5y+aNEiAOzt7QkMDOTZZ5+la9euODo6Zk+9IiIiIiIiIpIhyT1s3dzcbFyJZKbk72diYmKGQ1u7zCxIRB5AYiIMGQLVq7Nq6VJqWa10BlZiBLbVPT15xcGBicAcYFaJEnw1ZAjPP/88VapUwWw2s3z5cp555hnKli3Ld999pwbmIiIiIiIiIrmAWiI8XDLj+5kj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oHLlygwaNIi8efOmhKBvvfUW9vb2PP744xQqVIiwsDBefPFF/vOf/9CtWzfq1KnDpUuXUs26vRsPDw+WLFnCvn37qFatGh988MFtbRDSUtPYsWNp2LAhTz31FIGBgTzxxBOpevXaismqKXX3FR0djZeXF1FRUZm7aJQ8Eo4ePUrlChWIN5v5vmpVntu9O/tefMoUeOEF8PKCo0eNEPcevv/+e/r37w/Al19+yWuvvZYdVYqIiIiIiIg8km7cuMHJkycpWbJkqgW1JHe71/c1rTmjZtqKZCGr1corzz1HvNlMC6Df5MnZW0C/fhAQAFFR8NFH9z39+eef55NPPgFg0KBBLFiwIIsLFBERERERERGRf1NoK5KFFixYwIo//8QZmFS/Pqa6dbO3AHt7+PJLY/u77+DAgfte8t577zFw4ECsVivPPPMMGzZsyOIiRURERERERETkVgptRbLItWvXGPRPe4H3gNL/zGDNdo0aQceOYLGkabatyWTiq6++okOHDsTHx/P000+zf//+bChURERERERERERAoa1Ilvnf//7HufBw/IH36tY1wlNbGTECTCb45RfYvv2+p9vb2zN79mzq16/P1atXad26NWfPns2GQkVERERERERERKGtSBYICwtj/PjxAHwBuAwebISmtlKxIjz7rLH9wQdpusTV1ZXFixdTvnx5Tp8+TevWrYmKisrCIkVEREREREREBBTaimSJDz74gPj4eJoA7YoVgw4dbFwRMHw4ODrCihWwbl2aLilQoADBwcH4+Piwb98+OnbsSHx8fJaWKSIiIiIiIiLyqFNoK5LJduzYwaxZswAYB5gGDjTCUlsrWRL69ze2338frNY0XfbYY4+xbNky8uTJw9q1awkKCsJisWRhoSIiIiIiIiIijzaFtiKZ7J133gHgGaCGs/PNoDQn+PBDcHWFkBBYujTNlwUEBPDLL7/g4ODAzz//zJAhQ7KwSBERERERERGRR5tCW5FMtHbtWtasWYOTnR0jAXr0gEKFbF3WTT4+8NprxvawYWmebQvQvHlzpk6dCsCYMWOYOHFiVlQoIiIiIiIiIg+h0NBQTCYTu3fvtnUpD2z48OEEBARk6WsotBXJJFarlY8++giA/iYTjwEMGGDTmu7orbfA3R127YJly9J16bPPPsv//vc/AF577TUWLlyYFRWKiIiIiIiIiDzS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Fi9ezNKlS1O1UrC3t+fJJ5+kc+fOdOjQgcKFC6ftphYLTJoE775rtE7w9IRRo4xZuPb2WfRORERERERE0kehbSZSaJs5fvjhB55//nny5cvHsWPHyJ8///0vslohIMBYbOaTT2DIkCyvU0REso/FYmHr1q0sXryYJUuW8Pfff6ccs7Ozo3HjxnTu3Jn//Oc/FClS5P43PHIEeveGLVuM59WrG2Fu3bpZ9A5ERERERETSTqFtJlJo++Cio6MpV64c4eHhfP7557zxxhtpu/D336FdO/DwMD7+mpagV0REcq3jx4+zYMECFixYwPbt21P2m0wmGjZsmBLgFitW7O43MZth8mT44AOIijL29e0Lw4aBn1+W1i8iIiIiInIvCm0zkULbB/fGG28wfvx4Spcuzd9//42zs/P9L7JaoUEDCAmBt982FpcREZFHRmhoKL/88gsLFixg8+bNqY7Vr1+fzp0706lTJ0qUKHHnG0REGO0Spk83njs6wvPPG2HuvULfnMxqhRs3IDERnJyMoUXXRERERERyDYW2mUih7YPZvXs3NWrUwGKxsHz5clq0aJG2C9etg6ZNwdkZTp4EH58srVNERHKusLAwfv31VxYsWMDGjRtTHatRowb/+c9/6NixIxUqVLj94i1b4MMPYdUq47mzM/TqBS+/bLRPyCksFuNTJX//bYwTJ+DcOTh/3hjXrkFcnBHc3srBAQoUMHq/+/hA8eLw+ONQubIxChWyzfsREREREZHbKLTNRAptM85isdCgQQM2b95Mly5dmDdvXtovbtECVq6EAQPg66+zrkgREclVzp49y8KFC5k/fz5//vknt/5Vply5cnTs2JGOHTtSq1YtTCbTzQvXrYOhQ+Gvv27uq1fPWKysQwfw8sqeN2C1GiFscjibPA4cgNjYzH89X19o3BiaNDGGv3/mv4aIiIiIiKSJQttMpNA246ZMmcILL7yAh4cHhw4duncPwltt3mz8Q9reHo4ehZIls7ZQERHJlS5cuMDixYtZuHAhq1atIjExMeVYsWLF6NChAx07dqRRo0Y4OjoagenGjcbiZAsWQFKScbKTEzRvDq1aQbNmUL483Br4ZoTVCuHhcPiwEcjeGtBeuXLna5ycoEIFqFQJypQx2jgkz6D18gI3N3B3N1o9JCZCfLzRLiEy0giCz52D0FDjNfbtM2br/vuveuXKGSF1hw5Qu7baK4iIiIiIZCOFtplIoW3GXLx4kXLlynHlypX0LT4GEBgIq1cbC8dMm5ZlNYqIyMMjOjqaZcuWsXDhQpYtW0ZMTEzKMS8vL5o3b06rVq1o2bIlxYsXNwLV77+H2bPh4MHUN8uXD6pVgypVjF8cPvaYsS9PHmNxTEdHIyy9ccNoWRARYQSm584ZLQ4OHzZGdPSdi7WzM0LZSpVSj9KljXYHmSUmxvhF6Pr1xkzjLVuMsDdZsWLwzDPQp48RFouIiIiISJZSaJuJFNpmzLPPPsusWbOoWrUq27dvxyGt/whduxaefNL4B/GRI1rpW0RE0u3GjRusWrWKhQsXsnjxYiIjI1Mdr1SpEq1atSIwMJAGDRrgERYGv/1m/MJw40YjjM0MdnbG/8cqVDD6y1asaISz5cuDi0vmvEZ6REfDH3/AokXw++9Gn9xktWpB//7Qs6cxm1dERERERDKdQttMpNA2/RYtWkTHjh2xs7Nj48aN1K1bN20XWq3wxBOwaRMMHGh8fFVEROQBmM1mtm/fTnBwMMHBwWzZsiVVH1x7e3tq1KhBo0aNaNy4MU/UqkXec+dg506jrcGpUxAWBlFRxszVa9eM2aqursZwcTEW+/LxMVoZFCtmtCAoX96YOevsbMN3fw/x8bB0KcyYYQS5ya0i8uaFoCDj/8OlS9u0RBERERGRh41C20yk0DZ9IiMjqVixIhEREbz77rt8+umnab942TJo29b4B/Dx48Y/fkVERDLRpUuXWLVqFcHBwaxbt47Q0NBUx00mExUrVqRmzZopo2rVqrjYYmZsdomIgJkzjYU/T5y4ub9lS3j9deNRvW9FRERERB6YQttMpNA27axWK127dmXBggVUrFiRHTt24JzWGUZJSRAQAPv3w5tvwrhxWVqriIgIQFhYGBs2bGD9+vVs2LCBI0eO3HaOg4MDlStXpkqVKjz++OM8/vjjVKhQAT8/P+zt7W1QdRaxWGD5cuOTLsuW3VzErFw5I7zt3VutE0REREREHoBC20yk0Dbt5syZQ48ePbC3t2fLli3UqFEj7RdPngwDBkD+/HDsmLHgi4iISDYLDw9n27ZtbN++ne3bt7Nt2zYuXrx4x3NdXFwoX748pUuXxs/Pj5IlS6aMxx57DFdX12yuPhMdP27MvP3++5sLquXNCy+8AC+/DCVK2LQ8EREREZHcSKFtJlJomzZnz56lSpUqXL58mWHDhjF8+PC0XxwVZayiffEifPUVvPpqltUpIiKSHlarlTNnzrB9+3b279/PgQMHOHDgAIcOHSI+Pv6e1xYpUoTixYvj4+OTahQtWjRl29vbO+2LddrCtWswfTp8+aUR5ALY20OnTjBoENStCyaTLSsUEREREck1FNpmIoW295eUlETTpk3566+/qF69Ops3b8bR0THtN3j3XRgzxli0Ze9eSM+1IiIiNmA2mzl58iQHDx7kxIkTnDx5ktDQUE6ePMnJkye5du1amu5jMpkoVKgQRYoUwcfHJ9Xjv/d5eHhgslVAajYbLRPGj4c1a27ur13bCG87d9b/v0VERERE7iNXh7aTJk1i7NixhIeHU7VqVSZMmEDt2rXvev78+fMZOnQooaGhlClThtGjR9OmTZuU43379mXGjBmprmnZsiXBwcFpqkeh7f299957jB49mjx58rBz505Kp2e16YMHoWpVYyXupUuNhchERERyMavVypUrVzh58iRnz57l/Pnzdxzh4eGYzeY039fNze2OoW7x4sXx8/Pjscceo3jx4lk/c3fvXmPm7U8/QfJs46JF4ZVXjPYJBQpk7euLiIiIiORSuTa0nTt3Lr1792by5MnUqVOH8ePHM3/+fA4fPkzhwoVvO3/Tpk00atSIUaNG0a5dO2bPns3o0aPZuXMnlSpVAozQ9sKFC0ybNi3lOmdnZ/KlsWeqQtt7W7p0KU899RRgBOidO3dO+8VWKzRtCuvXG2HtkiX6iKWIiDwyzGYzkZGRKQFu8rj1efJ2Wmfu2tvbU6xYsZQQ18/Pj1KlSlG2bFnKli1LwYIFM+8NRETAt98aC5dduGDsc3ExFix77TWoWDHzXktERERE5CGQa0PbOnXqUKtWLSZOnAiAxWLB19eXV199lffee++287t160ZsbCxLly5N2Ve3bl0CAgKYPHkyYIS2V69eZdGiRWmqIT4+PlWPuujoaHx9fRXa3sGpU6eoVq0aV65c4dVXX+Wrr75K3w2mT4egIHB1hQMHwM8vK8oUERHJ9WJjY+8a6oaFhXHq1ClOnTpFQkLCPe+TP3/+lAC3XLlyqR6dnZ0zVlx8PMybB198Abt23dzfvLnROqFVK7Czy9i9RUREREQeIrkytE1ISMDNzY0FCxbQoUOHlP19+vTh6tWr/Pbbb7ddU6JECQYPHsygQYNS9g0bNoxFixaxZ88ewAhtFy1ahJOTE/ny5ePJJ59k5MiRFLjLR/eGDx/Oxx9/fNt+hbapxcXF0bhxY7Zv306tWrX4888/0/ePvchIo4ftpUswejS8807WFSsiIvIIsFgsXLhwgdDQUE6dOkVoaCihoaEcP36cI0eOEBYWdtdr7e3tKVu2LJUqVUo1/P39sbe3T1sBViv89ZfR93bRIrBYjP2lS0OvXtCjB5Qr98DvU0REREQkt8qVoe25c+coVqwYmzZtol69ein733nnHdavX8+WLVtuu8bJyYkZM2bQo0ePlH1ff/01H3/8MRf++ZjenDlzcHNzo2TJkhw/fpz3338fDw8PQkJC7viPEM20vT+r1UqPHj2YO3cuBQoUYPv27filZ5as1QpdusAvv0DlyrBjhxYvERERyWJxcXEcO3aMI0eOcPjw4ZTHQ4cOERUVdcdrXFxcqFChwm1hrq+v770XRTt5EiZOhO+/h+jom/urVYNOnYy2SFWr5p62SGaz8T6uXjUezWZjWCzGo50duLmBu7sx8ucHJydbVy0iIiIiOUxaQ9ssXqUiZ+jevXvKduXKlalSpQr+/v6sW7eOZs2a3Xa+s7Nzxj8e+IgYMWIEc+fOxdHRkV9//TV9gS3A7NlGYOvgANOmKbAVERHJBm5ublSpUoUqVaqk2m+1Wjl37hx///13qrF//36uX7/Orl272HVr2wPA09OTihUrUrFixZQgt2LFinh7exthbsmS8NlnMHy4Mev2559hxQqjfcKuXfDhh1CsGLRuDY0aQYMGxjXZHeKazRAeDmfOGOP06dTbZ8/C5cuQxp7CqeTLB97e4ONjzDYuU8YYZcuCvz/o75siIiIichc5KrQtWLAg9vb2KTNkk124cIEiRYrc8ZoiRYqk63yAUqVKUbBgQY4dO3bH0FbubcaMGQwbNgyAb775hkaNGqXvBmfOwMsvG9sffQQ1amRyhSIiIpIeJpOJYsWKUaxYMVq2bJmy32w2ExoaeluYe+jQIaKjowkJCSEkJCTVvQoUKJAS4KaEuW3bkv/ZZ43WSL/+CkuXwurVRiD6/ffGAChSBGrVMhYwq1gRKlSAEiWgQIGM9cSNi4Nz54zXOXfu5vbZszfD2XPnjOA2rVxdwdPT+IWznZ0x7O2Ne8TFQWysMQCuXDHGoUOwdm3q+zg4GJ82qlnTGDVqQJUq+kW2iIiIiAA5rD0CGAuR1a5dmwkTJgBGb7YSJUrwyiuv3HUhsri4OJYsWZKyr379+lSpUiVlIbJ/O3PmDCVKlGDRokW0b9/+vjWlddryo+D333/n6aefxmw28/bbbzNmzJj03SApyViUZN06qF0bNm40/tEiIiIiuUZCQgJHjx5l//79qWblHjt2DEtyH9t/KVKkCGXLlqV06dKUKVOG0iVKUCYqCv+DB/HYts1olZSYeOcXdHIyZqsWKmS0HvDwMFoRgNGewGKBGzcgKsoYV68ajzExaXtD9vbGrN/ixY3h63tzu1gx43W9vIyRlpYHFosxO/fCBWOcPQtHj94cR47ceeaumxvUrw9NmkDjxkaArdm4IiIiIg+VXNnTFmDu3Ln06dOHb7/9ltq1azN+/HjmzZvHoUOH8Pb2pnfv3hQrVoxRo0YBsGnTJho3bsynn35K27ZtmTNnDp988gk7d+6kUqVKxMTE8PHHH9OpUyeKFCnC8ePHeeedd7h27Rr79u1LUxsEhbaGTZs2ERgYyPXr1+nduzfTpk3DLr2zXj74AD75xPgH144dWoxERETkIXL9+nUOHz6cKsj9+++/CQ0Nved1Pj4+lC5VCj8PD3ytVnxv3MD30iV8z5/H9/Jl8gIZbprg5mYEr0WL3nz8dzjr7W0Et9nFaoWwMOPvQtu33xxXrqQ+z9XVaB3RurUxypTJPT2ARUREROSOcm1oCzBx4kTGjh1LeHg4AQEBfPXVV9SpUweAJk2a4Ofnx/Tp01POnz9/Ph9++CGhoaGUKVOGMWPG0KZNG8D4x0OHDh3YtWsXV69epWjRorRo0YIRI0bg7e2dpnoU2sLmzZtp0aIF165do3Xr1vz22284pvfje7//Du3aGds//wy39BoWERGRh1dMTAyHDh3i6NGjHD16lGPHjqVsX7p06b7Xu7u54ZM/P4U8PCjs4UEhV1cKu7oaz728yO/hgVeePHgVLoyntzdeRYvi4eODqXBho5VBbgg6LRY4eND4NNL69cbjxYupzylZ0ghvW7WCpk2NGcciIiIikqvk6tA2p3nUQ9utW7fSvHlzoqOjadq0KUuXLsUt+SOJaXX0KNSpY8wgefllYzVpEREReeRduXKFY8eOcezYMcLCwjh9+nSqERkZmaH72tnZkSdPHry8vPD09MTNzQ1XV1fc3Nzuun3rvuTh7u6Ou7t7qm13d3dcXV2NBdeyitUKBw5AcLAxNmyAhISbx52coGFDaNPGCHLLl88d4bSIiIjII06hbSZ6lEPb9evX89RTT3Ht2jUaN27M77//jru7e/pucukS1Kt3M7hdv1792URERCRN4uLiOHPmDBEREURERHDx4sVUjxEREVy5coWoqCiio6OJiooiKSkpW2r7d5CbPLy8vMiXLx958+ZN9Xjrdv78+SlYsCAOae3tHxNjLGYWHAx//AEnT6Y+7udnhLdt2hizcNP79zURERERyRYKbTPRoxraLl68mK5duxIfH0+TJk1YsmQJHun9GF5CgrHw2IYN8NhjsGWL0TdOREREJAtYrVauX7+eKsSNjo7m+vXrxMXF3fZ4r+3Y2FhiY2NTbd+4cSNT6y1QoACFCxdO0/Dy8jJm91qtxmJmf/xhjHXrUs/CdXY2FjJLnoWrXrgiIiIiOYZC20z0KIa2kydP5pVXXsFsNvP0008zZ84cXFxc0neTpCSjb+0vvxj95DZuhEqVsqZgERERkWxgNptTQtxbw9xbR1RUFFeuXOHKlStcvXr1jo9XrlwhvX8Nd3JyonDhwnh7e6ce+fJROCIC76NH8d6+He9z5ygApCwXW6qUMfu2cWNjYbPHHsvsL4uIiIiIpJFC20z0KIW2SUlJvPnmm3z11VcABAUF8d1336X9o3vJLBbo0wdmzTJ6ri1dasy4FRERERHMZjOXLl26rdXD3UZ0dHS67m9vZ0chBwe8ExLwBgoD3skjf368q1WjcL165KtXj7w1a+JZsCB2dnb3vqmIiIiIPDCFtpnoUQltLRYL7du35/fffwfgk08+4b333kv/IhtmM7zwAkydCvb2xkzbp5/OgopFREREHg03btwgIiKCCxcu3HNERERw6dKldN/fBHg6OZHXw4O8efPiVbAgeb29yZsvH3ny5LnjYm237nN1dcXR0RF7e3scHBzuOm49bm9vf9tI0987k5IgNtbo85v8eP268fdOB4fUw8nJ+MSXlxc4Oqb/Cy8iIiKSydKaM6Zz+qQ8zOzs7GjYsCFr1qxh5syZdOrUKf03iY+HZ56BBQvAzs6YaavAVkREROSBuLi4UKJECUqUKHHfcxMTE7l48eKdg92zZ4k4epQLZ84QcfUqUQkJXAesQFRCAlGXL3Pq8mU4cSLL39OdmAAHOzvswRgmE/ZWq7FtteKQvH2H4QC4AK7/DLd/bzs44OrigrurK1558uBVsCBeRYrgVawYXr6+eJUsiVeZMriUL6+F3ERERMTmNNM2DR6VmbZgLN5x8uRJSpUqlf6Lo6KgSxdYudKY1TB7NmQk+BURERGR7GG1En/oEFGbNnF161auHjjA1VOnuHruHFfNZq4AsUAccP0ej9eBpDSOnM4J8LKzw8vJifweHhTIl4+C3t4UKF6cgv7+xmPBghQoUCDlsUCBAjg7O9u6dBEREckF1B4hEz1KoW2GHTkC7dvD4cPGzIRFiyAw0NZViYiIiEhGmM0QFmb8He/sWQgPTz2uXTPaEiS3KIiNheR/ViQ/2tmBqyu4uKR6tLi4kOjujtnVFXPyo6srZjc3zC4uxvY/j0nOzpj/PZycjGFnh9liwWw2YzabSUpK4saNG1y/fp3r168TFxdnPMbEcP3qVa5HRxMXFUVMVBTRV68SdfUqUdeuERUXR1R8PNFJDxYpe3h4pApxCxYsSP78+cmfPz8FChS443bevHmxt7d/wG+WiIiI5CZqjyDZZ/Fi6N3bmGlbvLgR2NaoYeuqRERERCSj7O2hZEljZDI7ICfOSbVYLFy7do2oU6eI2r+fqMOHuXzsGJGhoVw6d47IiAguxcYSCVyClMdLgAWIiYkhJiaG0NDQNL+myWQib968KSHuraGul5cXefLkue/w8PBQ8CsiIvIQ0kzbNNBM27uIi4O33oJvvjGeN2hgLDrm7W3bukREREREssK1a3D0qDED+Z9hOXyYqMOHibx2LVWYGwlc+Wf7sp0dl11dueTgwGWrlcsJCVy7cSPTynJ0dMTFxSVlODs7p3r+7/1OTk44Ozvj5OT0wNt3O+bo6Jj+BY1FREQeAWqPkIkU2t7BunXw0ktGOwSAN9+E//0P1MtLRERERB41VitERKQKczl82Hg8dgwSE2+7JAEj1L3s6cnl4sW5VLAgl11duezoyCWTiWiTiWvAtaQkrt24wbW4OK5du5ZqJD1gS4es5mRnZwx7e5zt7XGyt8fJwQFnBwecHB1xd3Ulj4cHnp6e5MmbF898+chToACehQqRp2BBPP+Zbezp6Ymnpyd58+YlX758uLu7KxAWEZFcS6FtJlJoe4tz52DIEPjxR+O5jw/MmAHNm9u2LhERERGRnCgp6WZ/4OQgN3mEhaX9PnZ2kCcPeHqCpydWV1fi7e2JsbPjhsnEDTs7btjZEW+xcCMhgRuJiSkjPjGRG0lJxvP4eBLi40lITCQ+IYEEjAA5/p/HjG7HA9n1D0tHe3vyeXqSP39+8hUsSP6CBcmXLx/58uUz9t3hMXlowTgREbE1hbaZSKEtcPUqjB0LX3wB16+DyQQDBhiza/PmtXV1IiIiIiK5T1ycMRP3yBE4eRIuXDBGePjNx0uXwGLJ+lqcnMDNzVhUOPnR1fXew8XFGPb2YGeH2Wol3mIhwWwmwWolPimJhBs3SLh+nfi4OGP7xg3ir18n/sYN4q5dIzo6muhr17gWG0v09etcu3GDaIuFa0D0P+MaEAVcBR50brGbmxv58uVLmbWbN2/eVNv32pcnTx7s7OwesAIREXnUKbTNRI90aHv+PIwfb/StvXbN2Fe/Pnz+OdSpY9PSREREREQeelarEe5GRxt/H4+ONkZcnDGLNynJaL+QvG2xgKOjMRwcUg8np9Sh7K2PDjlkjWqr1ZgkEhlphNa3BNjW8HBiz57lytmzXD5/nisREVxOTOQK/7Sa+NfjrdtXefCZwHZ2dnh5eaWEuh4eHinD3d091fM77XN3d0/VW/jW3sNOTk5q+SAi8ohQaJuJHrnQNikJgoPhhx9g6VLjOUDFijByJDz9tDHTVkRERERExFasVoiKMlq43WmcPWs8nj+PJTGRKG6GuVf/GVf+/WgycdXJiasODsa2xcKV+HjizeYsfzvOzs63Bbq3Pjo7O+Po6Jiy0Fvy4m8Z2pe8nYF7ODg4KGAWEXkAac0Zc8ivUyXHGDHCmFV7/vzNfU88Ae++C23aGL20REREREREbM1kMlq15c0Ljz9+9/MsFuwuXSLfuXPku1vAe+6cMavXYoH4eGPc4gapw96rQAwQ+89jzK3PTSZi/uk3HAvEWK0pI/6fccNqJfUrQHx8PPHx8URHRz/wlyarOf6zqJyTgwOODg43w11nZ5ycnY0w2NU1JRTOcLicwX12dnaYTKaUAaR6npFxt3vca7+IyINQaCupHTliBLYFC0Lv3tCvnzHDVkREREREJDeys4NChYxRterdzzObISIi9Uzd8HC4ehWXqCh8rl7FJyrKWO8jKsoYN24Y7Rxu7Ttstd78tOI9WDEWcruBsZDb/R6TF35LvMN2Vu670ztJNJtJNJuJjf939Cz/dteg9w7HuEdgnBxE29nZ5Yjtex2/NbT+94e77/U8Pec+yLUP8jpgfC8cHR3TNRwcHNJ9bnoeHRwcsLe31y8MHjI5sj3CpEmTGDt2LOHh4VStWpUJEyZQu3btu54/f/58hg4dSmhoKGXKlGH06NG0adMm5bjVamXYsGFMmTKFq1ev0qBBA7755hvKlCmTpnoeqfYIu3cbiyG0b2/0vBIREREREZF7S0oyAtx/j6QkI8QF4/Fuw2QywuV/grs7Pn+QfXc6J3lW8Y0bN2cXJ2/f8miNiSExKorE6GgSoqJIiI4m8do1EmJiSIyJMR5jY0mIjSXh+nUS4+JISEzM3nDZZDK2rVYSAAtGKJ4cdlj/NUQeVmkNepND9lvHreF7Zh5PS9Cf/FilShX69u1r6y9jlsu1PW3nzp1L7969mTx5MnXq1GH8+PHMnz+fw4cPU7hw4dvO37RpE40aNWLUqFG0a9eO2bNnM3r0aHbu3EmlSpUAGD16NKNGjWLGjBmULFmSoUOHsm/fPg4cOICLi8t9a3qkQlsRERERERGRB5GUBDExqce1axl7nhwoJyQYIzExU0r8d5B7r3G38wGsdnZYTaZUg1ufQ6ptbt1vNqcMkpLu+dq3BtGWW57nlO1/7zP981755zF5JjEAFgum5F9YJJ97i5z+3IzxC4M7jaRbn9vZkWgy3T4g5THplu1EqzXl+iSr9eZj8n6LJeW5OWdFeZmmY4kS/HrqlK3LyHK5NrStU6cOtWrVYuLEiQBYLBZ8fX159dVXee+99247v1u3bsTGxrJ06dKUfXXr1iUgIIDJkydjtVopWrQob775Jm+99RYAUVFReHt7M336dLp3737fmhTaioiIiIiIiOQAFosR3CYHubcGuveazXzrALC3Tz3s7G7fd7/9mf1RdIvFCLz/CXFTRvLz5Pd9p1nRd5kpfd9jyUF48tfw38/vtG0rdnY3vx/JX//MmqGe/PU3m42Rlm0bsmIEvikh7x0e73YskdQh+91GWs651/lm7v6Lhrs9VqxRg2e3b8/ML1WOlCsXIktISGDHjh0MGTIkZZ+dnR2BgYGEhITc8ZqQkBAGDx6cal/Lli1ZtGgRACdPniQ8PJzAwMCU415eXtSpU4eQkJA7hrbJDeCT5YZG8CIiIiIiIiIPPTs7cHY2xsPGzi7ntylM7tmcmGiMW8Nwi+XO2/9+fmvwfeu4176c2KvVar0Z4CaPf4fu/953v8c0nmtKSsLRbMYxKQnXW49ZLDe/dncKqO8Udv87wE7r9+ZuI63n3um8PHls/V3NUXJUaBsZGYnZbMbb2zvVfm9vbw4dOnTHa8LDw+94fnh4eMrx5H13O+ffRo0axccff5yh9yAiIiIiIiIi8lAymcDR0RiPOpMJHByMIZIF7GxdQE40ZMgQoqKiUsbp06dtXZKIiIiIiIiIiIg8InJUaFuwYEHs7e25cOFCqv0XLlygSJEid7ymSJEi9zw/+TE993R2dsbT0zPVEBEREREREREREckOOSq0dXJyokaNGqxevTpln8ViYfXq1dSrV++O19SrVy/V+QArV65MOb9kyZIUKVIk1TnR0dFs2bLlrvcUERERERERERERsZUc13hj8ODB9OnTh5o1a1K7dm3Gjx9PbGwsQUFBAPTu3ZtixYoxatQoAF5//XUaN/5/e/cXU3X9x3H8dQD5M4bHwPHnJORZo0wkwEAmsLTFcs1ozMx0VlRb3WAFZEouoC3U1NkYoRCt5UUx6yKs0XIjJMr+CIKHySqk5dRyiG7BQRyTnXN+Fz/lN37HzF/85PNFno+NCz5fLl5cvAefFx8+32XavXu3Vq5cqf379+vo0aOqr6+XJNlsNhUVFamyslKJiYlyOp0qKyuTw+FQfn6+qW8TAAAAAAAAAK7JcqXtE088ofPnz6u8vFz9/f1KTU3VwYMHx18kdvr0aQUE/OeAcFZWlhoaGvT6669ry5YtSkxM1IEDB7Ro0aLxr9m0aZNGRkb0wgsvaHBwUDk5OTp48KBCQ0On/PsDAAAAAAAAgOux+Xw+n+kQVud2u2W32zU0NMT9tgAAAAAAAAD+kRvtGS11py0AAAAAAAAAzHSWux7Biq4eRna73YaTAAAAAAAAAJiurvaLf3f5AaXtDRgeHpYkxcfHG04CAAAAAAAAYLobHh6W3W7/y+fcaXsDvF6vzp49q4iICNlsNtNxbiq32634+HidOXOG+3uBK5gLwB9zAfhjLgB/zAXgj7kA/M2kufD5fBoeHpbD4VBAwF/fXMtJ2xsQEBCgefPmmY4xpWbPnn3LDwnwv2IuAH/MBeCPuQD8MReAP+YC8DdT5uJ6J2yv4kVkAAAAAAAAAGAhlLYAAAAAAAAAYCGUtpggJCREFRUVCgkJMR0FsAzmAvDHXAD+mAvAH3MB+GMuAH/MhT9eRAYAAAAAAAAAFsJJWwAAAAAAAACwEEpbAAAAAAAAALAQSlsAAAAAAAAAsBBKWwAAAAAAAACwEEpbTLBnzx7Nnz9foaGhyszMVHt7u+lIgDHbt29XRkaGIiIiFB0drfz8fPX29pqOBVjGW2+9JZvNpqKiItNRAOP++OMPPfnkk4qKilJYWJiSk5N19OhR07EAIzwej8rKyuR0OhUWFqY777xTb775pngHNmaab775Rnl5eXI4HLLZbDpw4MCE5z6fT+Xl5YqLi1NYWJhyc3PV19dnJiwwBa43E2NjY9q8ebOSk5MVHh4uh8Ohp59+WmfPnjUX2DBKW4z7+OOPVVJSooqKCnV1dSklJUUrVqzQwMCA6WiAEW1tbSosLNSPP/6o5uZmjY2N6aGHHtLIyIjpaIBxHR0devfdd3XvvfeajgIY9+effyo7O1uzZs3Sl19+qZ9++km7d+/WbbfdZjoaYMSOHTtUW1urmpoa/fzzz9qxY4d27typd955x3Q0YEqNjIwoJSVFe/bsuebznTt3qrq6WnV1dTpy5IjCw8O1YsUKjY6OTnFSYGpcbyYuXbqkrq4ulZWVqaurS59++ql6e3v16KOPGkhqDTYff+7EFZmZmcrIyFBNTY0kyev1Kj4+Xi+++KJKS0sNpwPMO3/+vKKjo9XW1qb777/fdBzAmIsXL2rx4sXau3evKisrlZqaqqqqKtOxAGNKS0v13Xff6dtvvzUdBbCERx55RDExMXr//ffH1x577DGFhYXpww8/NJgMMMdms6mxsVH5+fmS/n3K1uFw6JVXXtHGjRslSUNDQ4qJidG+ffu0du1ag2mBm++/Z+JaOjo6tGTJEp06dUoJCQlTF84iOGkLSdLly5fV2dmp3Nzc8bWAgADl5ubqhx9+MJgMsI6hoSFJUmRkpOEkgFmFhYVauXLlhJ8ZwEz2+eefKz09XY8//riio6OVlpam9957z3QswJisrCy1tLToxIkTkqTu7m4dPnxYDz/8sOFkgHWcPHlS/f39E36fstvtyszMZA8OXDE0NCSbzaY5c+aYjmJEkOkAsIYLFy7I4/EoJiZmwnpMTIx++eUXQ6kA6/B6vSoqKlJ2drYWLVpkOg5gzP79+9XV1aWOjg7TUQDL+O2331RbW6uSkhJt2bJFHR0deumllxQcHKyCggLT8YApV1paKrfbrQULFigwMFAej0dbt27V+vXrTUcDLKO/v1+SrrkHv/oMmMlGR0e1efNmrVu3TrNnzzYdxwhKWwC4AYWFherp6dHhw4dNRwGMOXPmjF5++WU1NzcrNDTUdBzAMrxer9LT07Vt2zZJUlpamnp6elRXV0dpixnpk08+0UcffaSGhgYlJSXJ5XKpqKhIDoeDmQAA/K2xsTGtWbNGPp9PtbW1puMYw/UIkCTNnTtXgYGBOnfu3IT1c+fOKTY21lAqwBo2bNigpqYmtba2at68eabjAMZ0dnZqYGBAixcvVlBQkIKCgtTW1qbq6moFBQXJ4/GYjggYERcXp4ULF05Yu+eee3T69GlDiQCzXn31VZWWlmrt2rVKTk7WU089peLiYm3fvt10NMAyru6z2YMDE10tbE+dOqXm5uYZe8pWorTFFcHBwbrvvvvU0tIyvub1etXS0qKlS5caTAaY4/P5tGHDBjU2NurQoUNyOp2mIwFGPfjggzp+/LhcLtf4R3p6utavXy+Xy6XAwEDTEQEjsrOz1dvbO2HtxIkTuuOOOwwlAsy6dOmSAgImbjUDAwPl9XoNJQKsx+l0KjY2dsIe3O1268iRI+zBMWNdLWz7+vr01VdfKSoqynQko7geAeNKSkpUUFCg9PR0LVmyRFVVVRoZGdGzzz5rOhpgRGFhoRoaGvTZZ58pIiJi/G4pu92usLAww+mAqRcREeF3p3N4eLiioqK46xkzWnFxsbKysrRt2zatWbNG7e3tqq+vV319velogBF5eXnaunWrEhISlJSUpGPHjuntt9/Wc889ZzoaMKUuXryoX3/9dfzzkydPyuVyKTIyUgkJCSoqKlJlZaUSExPldDpVVlYmh8Oh/Px8c6GBm+h6MxEXF6fVq1erq6tLTU1N8ng843vwyMhIBQcHm4ptjM3n8/lMh4B11NTUaNeuXerv71dqaqqqq6uVmZlpOhZghM1mu+b6Bx98oGeeeWZqwwAWtXz5cqWmpqqqqsp0FMCopqYmvfbaa+rr65PT6VRJSYmef/5507EAI4aHh1VWVqbGxkYNDAzI4XBo3bp1Ki8vn5GbbsxcX3/9tR544AG/9YKCAu3bt08+n08VFRWqr6/X4OCgcnJytHfvXt11110G0gI33/Vm4o033vjL/25tbW3V8uXLb3I666G0BQAAAAAAAAAL4U5bAAAAAAAAALAQSlsAAAAAAAAAsBBKWwAAAAAAAACwEEpbAAAAAAAAALAQSlsAAAAAAAAAsBBKWwAAAAAAAACwEEpbAAAAAAAAALAQSlsAAAAAAAAAsBBKWwAAAAAAAACwEEpbAAAAYJI2btyo/Px80zEAAABwi6C0BQAAACbJ5XIpNTXVdAwAAADcIihtAQAAgEnq7u6mtAUAAMD/DaUtAAAAMAm///67Lly4MF7aDg4OKi8vTzk5Oerv7zcbDgAAANMSpS0AAAAwCS6XS3PmzNH8+fN1/PhxZWRk6Pbbb1dra6tiY2NNxwMAAMA0RGkLAAAATILL5VJKSooaGhq0bNkybdq0SXV1dZo1a5bpaAAAAJimbD6fz2c6BAAAADBdrV69WocOHZIkffHFF1q6dKnhRAAAAJjuOGkLAAAATILL5dKqVas0OjqqwcFB03EAAABwC+CkLQAAAPAPDQ8Py263q7OzU8eOHVNxcbG+//57JSUlmY4GAACAaSzIdAAAAABguuru7lZgYKAWLlyotLQ09fT0KC8vT+3t7Zo7d67peAAAAJimuB4BAAAA+IdcLpcWLFigkJAQSdKuXbt09913a9WqVbp8+bLhdAAAAJiuuB4BAAAAAAAAACyEk7YAAAAAAAAAYCGUtgAAAAAAAABgIZS2AAAAAAAAAGAhlLYAAAAAAAAAYCGUtgAAAAAAAABgIZS2AAAAAAAAAGAhlLYAAAAAAAAAYCGUtgAAAAAAAABgIZS2AAAAAAAAAGAhlLYAAAAAAAAAYCGUtgAAAAAAAABgIf8CK2hVVUpYE3YAAAAASUVORK5CYII=\",\n      \"text/plain\": [\n       \"<Figure size 1400x300 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    },\n    {\n     \"data\": {\n      \"image/png\": \"iVBORw0KGgoAAAANSUhEUgAABW0AAAEhCAYAAAAEQoK3AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAACCSklEQVR4nOzdd1SU19rG4d9QBFQUwQYKgh0rqEjsGo3RRKOpJ4mJpvfey0k96e0ziaT33qNRk9grKFawgwU7CDaK9GG+P3YYJaCCMgzlvtbaa2beNs+LC5WbPc+22Gw2GyIiIiIiIiIiIiJSLbg4uwAREREREREREREROU6hrYiIiIiIiIiIiEg1otBWREREREREREREpBpRaCsiIiIiIiIiIiJSjSi0FREREREREREREalGFNqKiIiIiIiIiIiIVCMKbUVERERERERERESqETdnF1CTFBUVsX//fry9vbFYLM4uR0RERERERERERGoQm81GZmYmAQEBuLicfD6tQtsK2L9/P4GBgc4uQ0RERERERERERGqwPXv20Lp165PuV2hbAd7e3oD5ojZq1MjJ1YiIiIiIiIiIiEhNkpGRQWBgoD1nPBmFthVQ3BKhUaNGCm1FRERERERERETkjJyu9aoWIhMRERERERERERGpRhTaioiIiIiIiIiIiFQjCm1FREREREREREREqhH1tC2HqKgooqKisFqtzi5FRERERERERERqIavVSkFBgbPLkLPk7u6Oq6vrWV/HYrPZbJVQT52QkZFB48aNSU9P10JkIiIiIiIiIiJy1mw2GykpKRw9etTZpUgl8fHxoWXLlmUuNlbefFEzbUVERERERERERJykOLBt3rw59evXLzPok5rBZrORnZ1NamoqAP7+/md8LYW2ItVNSgq2jRs5sGIFSVu2sGf3bnanpbH/2DHS8/NJLyoi3WYjz8UFm4cHtnr1sHh6Ur9ZMxo0akSDBg1o0qQJ/v7+JUZISAje3t7OvjsRERERERER+YfVarUHtn5+fs4uRyqBl5cXAKmpqTRv3vyMWyUotBVxMtvevez86iuW/PEHKzduZH1WFhuAQw54L39/fzp27EinTp3o1KkTYWFhhIeH06RJEwe8m4iIiIiIiIicSnEP2/r16zu5EqlMxX+eBQUFCm1FapJDW7bw1wsv8Odff7H48GH2lXGMCxDo7U2gry+B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g31T48aN8ff3JzAwsMyWDD7FPW3btjWB9omOHIHoaNNaYu5cWLvWPF+82CxQN3QoXH89XHppjfrtqYiIiIiIiMip3HnnnXz88cdcddVVPPLII/j6+rJt2zZ++OEHPvnkE1xdXQkODiY2NpadO3fSsGFDfH196dChA1999RWzZs0iJCSEr7/+mpUrVxISEnLK97v66qt58sknufnmm3n88cfZuXMnb7zxRoVqatiwITfeeCMPP/wwfn5+NG/enCeffLJaLJKu0FbkX2w2G++//z733XcfBQUFBAQE8NVXXzG8USMYPtz0Ou3c2QS2//wWps4JCzNB7YYN8OKL8OOPMH++Gc2bw3XXwRVXmP6uDlxAzFJURNNdu2g6bx495s2DpUtN24ITtWlD0bnncjAiguSOHUkuKCA5OfmkIzc3l/T0dNLT09myZUuZ79ukSRM6dOhAt27d7KNr1674+/tjadIExowxA2D3bhN0//67ac1QPO68EyZOhHvvNe0URERERERERGqwgIAAoqOjefTRRxk5ciR5eXm0adOGUaNG2UPQhx56iEmTJtGlSxdycnJISkri1ltvZe3atfznP//BYrFw1VVXcccdd/DXX3+d8v0aNmzI9OnTue222wgPD6dLly68+uqrXHrppRWq6fXXX7e3UfD29ubBBx8kPT3dcV+ocrLYbDabs4uoKcq7upvUXDk5Odx222189dVXAIwbN45PP/0Uv507TWCbng6RkTBzJvj5ObfY6mTXLtMK4JNP4J++v4BpBXDZZaava//+ptXA2cjJgRUrTDi7ZInpJZuZWfKY5s2PL6Q2fLiZDVtONpuN9PR0e4C7a9cueyuG4pGamnrS85s0aULPnj3p27cvERERREREEBQUhKU4uN692/QE/uILOPGjHhdeCPffb2p2YMgtIiIiIiIi1Utubi5JSUmEhISUWFBLarZT/bmWN19UaFsBCm1rt6SkJC655BLi4uJwcXHh1Vdf5cEHH8QSH2/CtCNHTG/Sv/4yH42X0goKYPp0+OEHE2yfOOu1Xj3o3dvM0u3eHUJCIDDQhN8NG5r9hYWQm2t6xaakmLFt2/H2BYmJ5pgTNWoEQ4YcD2m7dXNo8JmVlcWOHTtISEhgw4YN9kXTtm7dSlEZi5o1a9aMvn370q9fP4YMGUJERAQe9erBggUweTLMmAHFfw336AGP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ycklrvvZZ5/RtWtXPDw88Pf356677rLvO3r0KDfddBPNmjWjUaNGnHvuucTHx5c4/5VXXqFFixZ4e3tz4403kpube/ZfwNNQe4QKUHuEmqOgoIBLL72U6dOn4+3tzfz58+nTp0/Jg2bPhvPPN89/+cXMxBOpTXJzTUD5xx9YZ84k9sgRZgHzgOXAv5cA6+TjQ/9WrRgQGEh/X186WSy4pKdDSgps3Qrp6WW/T3g4DB9uZtIOHFizZqvm5JhFCN94w7R2ANP39skn4ZZbwMPDufWJiIiIiEit9u+P0dtsNrKzs51SS/369bFUYKLNr7/+isVioUePHmRlZfH000+zc+dO4uLiyM7Opm3btpx33nk88cQTJCUlce+997Jjxw57e4SHH36Y5cuXs2TJEvs1H3roIWJjY+3bJk+eTM+ePQkJCWHHjh3ccccdnHvuubz33nuACW1vueUWhgwZwssvv4yLiwvXXHMN4eHhfPvttwC8//77PPDAA7zyyiuMHj2a9PR0oqOjue+++wA477zz8PLy4umnn6Zx48Z8+OGHfPHFFyQmJuLr68tPP/3ExIkTiYqKYuDAgXz99de88847tG3bVj1tqwuFtjVDUVERkyZN4ptvvsHT05O///6bIUOGlDwoJQV69oTUVLj9dvjnm12k1iosNDNf582D5cvJWL6cxRkZzAPmAhvKOKUJ0BcIB8L+Ge2DgnDt3h0iI83o0wd8favqLhzHaoXvv4dnnoEdO8y24GB48024+GLnzhAWEREREZFa69/h3rFjx2jYsKFTasnKyqLBWUzCOXjwIM2aNWP9+vXExMTwxBNPsHfvXnto+cEHH3D77bfbQ9u4uDh69erFzp07CQoKoqioiKCgIP773/9y2223lfkev/zyC7fddpv906JffPEF119/Pdu2baNdu3YAvPfeezz//POkpKQA0KpVK66//npeeOGFUtdbunQpF154IampqXicMGmnffv2PPLII9xyyy3079+f8PBwoqKi7PvPOecccnNz1dNWpLxsNhv33Xcf33zzDW5ubvz888+lA9uiIrN6fGoq9OhhQhmR2s7NzbQtGDwYgEY2G2NSUhizZQvs3cuhpCSWb9xIzO7dxOzdS2xKCkcKC5kFzDrhMvUPHqTHoUP02LuXTg0a0KmggE6dOhEcHIxbTV7My9UVrrnGLEr22Wfwv//Bzp1mBv6558LkydC9u7OrFBERERERqTa2bt3K008/TWxsLAcPHqSoqAiA3bt3s3nzZnr06FEisOzXr1+J88PCwggNDeW7777jscceY9GiRaSmpnL55Zfbj5k7dy4vv/wyW7ZsISMjg8LCQnJzc8nOzqZ+/fqAmSFcHNgC+Pv7k5qaCkBqair79+9n+PDhZd5DfHw8WVlZ+Pn5ldiek5Njb/WwefPmUiFyv379WLBgQYW+XhVVg3/CFintjTfe4N1338VisfDll18yZsyY0ge99ppZ2b5+ffjhB/DyqvpCRZzNYgF/fzMAP+DCfwaYFiNxcXGsXr2auLg44uLiWLduHdnZ2Sxfvpzly5eXuJy7uzvt27enffv2tGnThjZt2hAcHGx/3qxZswp9zMZp6tWD224zv9h59VXz98X8+RAWZmblP/987ZhZLCIiIiIi1VL9+vVL9Gyt6veuiLFjx9KmTRs+/vhjAgICKCoqolu3buTn55f7GhMmTLCHtt999x2jRo2yB6g7d+5kzJgx3H777bz44ov4+vqydOlSbrzxRvLz8+31uru7l7imxWKhuLGA12kyn6ysLPz9/Vm4cGGpfT4+PuW+D0dQaCu1xk8//cQjjzwCmEbVV199demD4uLg6afN83ffhdDQqitQpAZxd3cnIiKCiIgI+zar1crWrVtZu3YtmzZtIiEhgYSEBBITE8nNzWXz5s1s3ry5zOt5eXnZA9ygoKBSo3Xr1tSrV6+qbu/0GjQwAe0NN8BDD8Gvv0JUFPz4I7z1lpmVWxNCaBERERERqVEsFstZtSioKocOHSIhIYGPP/6YQYMGAabVQLHQ0FC+/vprcnNz7bNt/z35B+Dqq6/mv//9L6tXr+aXX37hgw8+sO9bvXo1RUVFvPnmm7i4uAAm+6kIb29vgoODmTdvHsOGDSu1v1evXqSkpODm5kZwcHCZ1wgNDSU2NpaJEyfat5V1L5VNoa3UCkuXLrV/89xzzz32ZtIl5OXBpElQUGB6VF5/fdUWKVLDubq60rlzZzp37lxie1FREXv27CEhIYGkpCR27tzJrl277GP//v3k5OSwZcsWtmzZUua1LRYLLVu2LDPQLR5+fn5VP1s3ONgsVLhgAdx9N2zcCBMnwhdfwPvvQ8eOVVuPiIiIiIhINdCkSRP8/Pz46KOP8Pf3Z/fu3Tz22GP2/VdffTVPPvkkN998M48//jg7d+7kjTfeKHWd4OBg+vfvz4033ojVauWiiy6y72vfvj0FBQW8++67jB07lujo6BKhbnk9++yz3HbbbTRv3pzRo0eTmZlJdHQ0d999NyNGjKBfv36MHz+e1157jY4dO7J//35mzpzJxRdfTJ8+fbj33nu57rrr6NOnDwMGDODbb79l48aNtG3b9sy+eOWk0FZqvMTERMaNG0deXh7jx4/nrbfeKvvA55+HdeugaVP44APNkhOpJC4uLvZZtGXJz89nz5499hB39+7dpUZubi7JyckkJycTGxtb5nW8vLxo3769PTguHh07dnR8o/5hw2DNGjPL9rnnTMuEHj3gySfhkUfghIb1IiIiIiIitZ2Liws//PAD99xzD926daNTp0688847DB06FICGDRsyffp0brvtNsLDw+nSpQuvvvoql156aalrTZgwgTvuuIOJEyeWaGfQs2dP3nrrLV599VUef/xxBg8ezMsvv1xixmt5TJo0idzcXP7v//6Phx56iKZNm3LZZZcBZgLRn3/+yZNPPsn1119PWloaLVu2ZPDgwbRo0QKA//znP2zfvp1HHnmE3NxcLr30Um6//XZmzZp1qrc9axZbcZMHOa3yru4mVefo0aNERkaSmJhI3759WbBgQdk9WGJjoX9/swjZr7/CJZdUfbEiUiabzcbBgwfLDHOLR/GqnyfTunVrunfvTnh4OL169aJXr14EBwc7Zmbujh1wxx1Q/A90p07w4Yfw70UPRURERERETiM3N5ekpCRCQkJKLNolNdup/lzLmy8qtK0AhbbVS/G0+T///JPAwEBWrlxp/y1ICdnZEB4OiYkwYQJ8803VFysiZyUvL4/du3eTmJhIQkKCvdXCli1bSEtLK/McHx8fwsPD6du3LwMGDKB///6lVgQ9Yzab6W97331w4IDZdv318PrrUFnvISIiIiIitZ5C29pJoW0VU2hbvTz++OO88soreHp6Eh0dTa9evco+8LHHzCrwAQGwYQM0aVK1hYqIQx06dIgtW7YQHx/P2rVrWbNmDevXr6egoKDUsaGhoQwYMIABAwYwdOjQkzaaL7ejR83fMR9+aF77+cErr5gFzP5plC8iIiIiInIyCm1rJ4W2VUyhbfXx448/cuWVVwLw3XffcdVVV5V9YHw89O4NVitMmwYnNLQWkdorPz+fTZs2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b99O69atz+xCgwbB0qVmAY2nnqrcIkVERESqoczMTHbu3EliYiIJCQn2x4SEBI4cOVLmOQ0bNrQHuREREURGRtKpU6fyBbnTppnFyfbsMa8vuQQmTza/NBcRERERp3N4aAuwfv16hg4dyl9//cWRI0f4z3/+w4033sjrr79e8dkBNUBdDW2HDRvGwoULueOOO0rNrC63DRuge3czu3b3bjiT9goiIiIitcjBgwfZvHkz8fHxxMfHExcXx/r168tsvdC4cWN7gFs8Trq+RFYWPPecaZtgtUKDBvDMM3DffeDu7tibEhEREZFTckhoe8kllxAWFmYfQUFBfP/999x9993k5uby7rvvcv3111fKDVRHdTG0Xbx4MUOGDMHd3Z1t27YRFBR0Zhe6+26YMsXM9vj118otUkRERKSWKCwsJDExkbi4ONasWcOKFStYtWpVmYulBQcHExkZyTnnnMM555xDeHg4Hh4exw9Ytw7uuAOio83rLl3MQmVDhlTR3YiIiIjIvzkktH344YeJi4sjPj6egwcP0qRJE3r27El8fDyXXnopd955J126dMG9lv4Gvy6GtiNGjGDevHnceuutfPDBB2d2kWPHzMzajAyYPRvOO69yixQRERGpxQoLC9mwYQOxsbH2sXnzZv793/h69eoRHh7OOeecYw9zg4OCsHz9NTzyCKSlmQMnTIA33oCWLZ1wNyIiIiJ1m8PbI+zbt4+4uLgSY8eOHbi5udG5c2fi4+PPuPjqJioqiqioKKxWK4mJiXUmtI2OjmbgwIG4u7uzdetW2rRpc2YX+vxzuOEGaNcOEhOhFrbOEBEREalK6enprFy50h7iLl++nLTiUPYEzZs3NzNxe/bknPh4+vzxB94AjRrB//4Ht9+ulgkiIiIiVahKetr+W1ZWln0m7p133llZl6026tpM25EjRzJnzhxuvvlmPvroozO/0MCB5mN5L70Ejz9eeQWKiIiICAA2m42kpCSWL19uD3HXrl1LQUFBieNcXFzo6uFB35wcwoAerVvT4+WX8ZkwASwWp9QuIiIiUpc4JbSt7epSaLts2TL69++Pm5sbW7duJTg4+MwulJAAnTub2bV79mgBMhEREZEqkpuby9q1a1m+fLl97N69u8xj23h40LNPH3qeey7du3enY8eOtG/fngYNGlRx1SIiIiK1W3nzRbeKXHT37t0V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hg41/adEREREREQcpbAQfvsNXnnFLJIGJox+5BG47z7w9GTbtm388ssv/Pzzz6xZs8Z+aqNGjbjsssuYOHEigwYNwqUq2j2IiIichEJbB1Boe4Jevcx/lj74AG691dnViIiIiIhIXWCzmfD2qadg82azLSTEtGwbN87e3mHLli188803fPPNN+zatct+elBQENdccw3XXnstnTt3dsYdiIhIHafQ1gEU2v4jIQE6dzaLHKSkgJ+fsysSEREREZG6xGqFb7+FJ56AffvMtpEj4e23zc8q/ygqKmLp0qV8/fXX/Pzzz6Snp9v3RUREMGnSJK688kr89DONiIhUkfLmi/pciFTc99+bx5EjFdiKiIiIiEjVc3WFiRNhyxZ4/HGoVw9mz4bu3U3LhH8WL3NxcWHw4MF8/PHHpKSk8NNPPzF27Fjc3NxYuXIld911F/7+/lx88cVMnTqV/Px8J9+YiIiIoZm2FaCZtpiPI3XuDImJ8PXXcM01zq5IRERERETqum3bzOJkM2aY123bwiefwLBhZR6emprKDz/8wJdfflmi/62fnx9XXnklkyZNok+fPlj+abcgIiJSWdQewQEU2gJr1kDv3uDpCamp4O3t7IpERERERESMGTPg9tth717z+uab4fXXoXHjk56yYcMGvvrqK7755huSk5Pt20NDQ5k4cSITJkwgMDDQ0ZWLiEgdofYI4hjFrRHGjFFgKyIiIiIi1cuYMbBxowluAT7+GLp0genTT3pKt27deO2119izZw9///03V199NV5eXmzevJnHH3+cNm3aMGLECL7++muysrKq6EZERKSu00zbCqjzM22LiiA4GPbsgV9/hUsucXZFIiIiIiIiZVu8GG66CbZuNa+vvBLeeQeaNTvtqRkZGfzyyy98+eWXLF682L69QYMGXHrppVxzzTUMGzYMNzc3R1UvIiK1lNojOECdD22XLoVBg6BRIzhwwLRIEBERERERqa5ycuDZZ+GNN8wklGbN4L334LLLyn2JpKQkvv76a7766iu2b99u3+7n58f48eO5/PLLOffcc3F3d3fADYiISG2j9ggnsWfPHoYOHUqXLl3o0aMHP//8s7NLqjl++ME8XnyxAlsREREREan+vLzg1VchNha6dYO0NLj8cjNSU8t1iZCQEJ5++mm2bt1KdHQ0t956K02bNuXQoUN8+umnjBo1ihYtWnDDDTfwxx9/cOzYMQfflIiI1AV1bqZtcnIyBw4cICwsjJSUFHr37k1iYiINGjQ47bl1eqat1QqtWpkZtjNnwgUXOLsiERERERGR8svLgxdegJdfNj/f+PlBVBRccQVYLBW6VGFhIYsXL+bnn3/mt99+I/WEANjDw4OhQ4dy4YUXcsEFF9CuXbvKvhMREanB1B6hnHr27MmMGTPKtRponQ5tFy2CoUPBx8cEt/XqObsiERERERGRilu7Fq6/HuLjzeuLLzYtE1q2PKPLWa1Wli5dyi+//MKMGTPYuXNnif2dOnVi5MiRDBs2jMGDB+Pn53eWNyAiIjVZjW2PsHjxYsaOHUtAQAAWi4WpU6eWOiYqKorg4GA8PT2JjIxkxYoVZ/Req1evxmq1liuwrfOK20iMH6/AVkREREREaq7wcFixwvS6dXOD33+Hrl3h22/hDOY0ubq6MmTIEN5991127NjBxo0bef311xk6dChubm4kJCTw7rvvcskll9CsWTPCwsK47777mDZtGmlpaZV/fyIiUitUu5m2f/31F9HR0fTu3ZtLLrmE33//nfHjx9v3//jjj0ycOJEPPviAyMhIJk+ezM8//0xCQgLNmzcHICwsjMLCwlLXnj17NgEBAQAcPnyYQYMG8fHHH9O/f/9y1VZnZ9pardC6NaSkqDWCiIiIiIjUHvHxZtbt2rXm9UUXwQcfgL9/pVw+PT2dOXPmsGDBAhYuXMimTZtKHRMSEkJkZCSRkZH07duX8PBwvLy8KuX9RUSk+qkV7REsFkup0DYyMpKIiAimTJkCQFFREYGBgdx999089thj5bpuXl4e5513HjfffDPXXnvtKY/Ly8uzv87IyCAwMLDuhbaLF8OQIWqNICIiIiIitU9BgVms7PnnzXMfH3j9dbjhBnCp3A+nHjhwgEWLFrFw4UIWLlzI5s2bSx3j5uZGaGgoPXv2pGfPnvTo0YOePXvSokWLSq1FRESco1aGtvn5+dSvX59ffvmlRJA7adIkjh49yrRp0057TZvNxtVXX02nTp149tlnT3nss88+y3PPPVdqe50Lbe++G6ZMgUmT4IsvnF2NiIiIiIhI5Vu/3sy6Xb3avI6IMD8H9e3rsLdMT09n5cqVxMbGsmLFCmJjYzlw4ECZx7Zo0YIePXrQo0cPunXrRrdu3QgNDS3XotoiIlJ91MrQdv/+/bRq1YqYmBj69etnP+6RRx5h0aJFxMbGnvaaS5cuZfDgwfTo0cO+7euvv6Z79+6ljtVMW6CoyLRGSE6GGTPgwgudXZGIiIiIiIhjFBbCu++afrcZGWbb9dfDc89BFayFYrPZ2LNnD/Hx8axbt474+Hji4+PZunUrZf3obrFYaNu2rT3ELR4dO3aknj4hKSJSLZU3tHWrwpqqhYEDB1JUVFSuYz08PPDw8HBwRdVcdLQJbBs3hvPOc3Y1IiIiIiIijuPmBvffD1ddBY89Bl9+CZ9/Dt99B7ffDo8/Dv+speIIFouFoKAggoKCGDt2rH17dnY2GzZsID4+ng0bNthHamoq27dvZ/v27SU+eerm5kanTp1KhbkhISG4uro6rH4REak8NSq0bdq0Ka6urqU+LnLgwAFatmzppKpquZ9/No/jxqmXrYiIiIiI1A0tW5rWcLfeasLbxYth8mT4+GMT3t51F7RpU2Xl1K9fn759+9L3X60aUlNT2bhxY4kgd8OGDWRkZLBx40Y2btzIjz/+aD/ey8uLLl26lApzW7VqhcViqbL7ERGR06tR7REA+4qa7777LmAWIgsKCuKuu+4q90JkFRUVFUVUVBRWq5XExMS60x6hqMh8BGj/fpg+HcaMcXZFIiIiIiIiVctmgzlz4MknYdUqs83FBcaPh3vugcGDoRoFnjabjb1799oD3OJQd+PGjeTm5pZ5TuPGjUuEuL169SI8PBwvL68qrl5EpParsT1ts7Ky2LZtGwDh4eG89dZbDBs2DF9fX4KCgvjxxx+ZNGkSH374IX379mXy5Mn89NNPbNmyxeGraZb3i1prLF0KgwZBo0aQmgp1vVWEiIiIiIjUXTYb/PmnmXE7d+7x7cHBpp3C+PHQuzdUVfuBvDxISTGTbPbvN23tMjLM9vx8KCgwn5b09ARPT6ze3iRZLGzIzGRDaiobdu9mw8aNJCQkUFhYWOrybm5u9OjRg8jISPvkqU6dOuHi4lI19yciUkvV2NB24cKFDBs2rNT2SZMm8cUXXwAwZcoUXn/9dVJSUggLC+Odd94hMjLS4bXVudD23nvhnXfg2mvhq6+cXY2IiIiIiEj1sGmT+Vnp228hK+v4dj8/OPdciIyEPn0gNBSaNavYTNz8fBPGJicfD2SLQ9kTXx86dHb3UL8+hIaS36kTif7+bPDxYcOxY6zbuJEVK1aUaksI0KhRIyIiIujXrx8DBw6kX79+deNnYxGRSlRjQ9vqrE6Ftie2RvjjDzihCb6IiIiIiIgAOTkwcyb8+CPMnm1muv5bo0YQEABNmoCvr3lts4HVan7uysw0AWzxyMws//vXqwf+/ub6/v7g42M+IenhYRZVy8+H3Fwzjh41wW9xIFzG7Frq14dzzsF2/vnsiYwkNjWV2NhYYmNjWb16NTk5OSUOd3FxoWfPngwaNIiBAwcyaNAgrTcjInIaCm0doE6FttHRMHCgWiOIiIiIiIiUR0EBxMaaNnMrVsCaNbB7twloK8rd/XgYWxzIFj8/8bWv75n10y0shB07YONGM1auNHUfPlzyuC5d4OKLYdIkCkNC2LBhA7GxsURHR7N06VKSkpJKXbp9+/b2AHfgwIF06NBBi5yJiJxAoW0lqpMLkX3+Odx5J1x6KXz9tbOrERERERERqXlycyEpyUyEOXwYjhwxs3FdXI6PBg1MW4UTR5MmZl9VKiqCzZth4ULzacv580vOxh00CG64AS6/3NQM7N27l6VLl7J06VKWLFnC+vXr+XfE0Lx5cwYMGGAfvXr1ol69elV4YyIi1YtCWweoUzNtwfRmysgwv8EVERERERGRuuPoUdP64bvv4O+/TagLJlC+7Ta4665SPysePXqUmJgYe4i7YsUK8vPzSxzj6elJRESEPcTt378/vr6+VXRTIiLOp9DWAepcaCsiIiIiIiKyb59ZnPqTT0xbBTAtHK6+Gp54Ajp2LPO03NxcVq1aRXR0NNHR0cTExHCojAXUQkND7SFuREQEnTp1ws3NzZF3JCLiNAptHUChrYiIiIiIiNRZVqtpnfDmm2YdFABXV5g4EZ5+GoKDT3m6zWYjISGBmJgYe5CbkJBQ6jgvLy969uxJ79696dWrF7169aJz5854eno64KZERKqWQlsHUGgrIiIiIiIigll07YUXYMYM89rdHW66CZ58Elq1KvdlDh48SExMDDExMSxbtow1a9aQlZVV6jiLxUJISAihoaH20blzZ4KDg2nZsiUuVd0DWETkDCm0rUR1ciEyERERERERkdNZvhyeegrmzjWvvbzg4YfhkUfsC5ZVRFFREdu2bWP16tWsWbOG1atXExcXx5EjR056jru7O61btyYoKIg2bdrQunVrmjZtip+fX4nHJk2aUL9+fTw8PLBYLGd6xyIiZ0WhrQNopq2IiIiIiIhIGRYuhP/+93jbhIAAeOUVmDABznIWrM1mIzU1lc2bN9vHpk2bSExMZP/+/Vit1gpdz2KxUL9+ffvw9PTE1dUVFxcXXF1dS4zibS4uLvZhsVgq9LpevXol3u/E4e3tja+vL02aNMHX1xdfX18aN26smcMitZhCWwdQaCsiIiIiIiJyEjYb/PqrmWm7c6fZFhEBb78N/fo55C0LCwvZv38/u3fvto+9e/dy6NChEuPgwYMcO3bMITVUNovFgo+PD02bNsXf35+AgAD8/f1LjOJtjRs31qxhkRpGoa0DKLQVEREREREROY3cXJg8GV58EYr70157rZl5GxDgtLIKCgrIyckhOzub7Oxsjh07RnZ2Nrm5uVitVoqKirBarfZx4mubzUZRUZF9lPe11WolPz+f7OzsEu9d/P6ZmZkcPnyYw4cPc+TIkQoHy/Xr16dVq1a0bt2aVq1a2ceJr1u2bImrq6uDvqpVq6CggCNHjti/ZsUjKyvL/jUu/jrn5ORQVFRUYvZz8WPxLOeGDRvi7e1N48aNad68OS1atKBly5Y0atRIYbg4jEJbB1BoKyIiIiIiIlJOKSlmYbLPPzezcBs2NC0U7rsPPDycXV21lJeXZw8l09LSSE5OJjk5mf3799ufF4+jR4+W65ouLi74+/uXCHXLCnobnEEP4rNhs9k4evQoaWlppx3F4WxmZmaV1Obh4UFAQABt27alXbt2tGvXjrZt29KpUyc6depEvXr1qqQOqZ0U2jqAQlsRERERERGRClq5Eu65xyxaBtC+vZmJe+GFTi2rpsvJyWHfvn0lxt69e0s8T05OLnfPXx8fH1q1aoWfnx+NGzcuNTw9PXF3d6devXq4u7vbh9VqpaCgoMTIz88nKyuLjIwM0tPTycjIsI/09HQOHjzIwYMHKSwsPKN79/Hxwc/Pz94P2Nvbm/r16+Pl5VViuLi4YLPZ7DOfbTYbVquVnJwcMjMz7SM9PZ0DBw5w4MABMjIyTvne7u7udO7cme7du9O9e3f69OlDREQEjRs3PqN7kbpHoW0lioqKIioqCqvVSmJiokJbERERERERkYooKoJvvoFHHzUzcAEuuAD+7/+gY0fn1laLWa1WUlNTSwW6J77eu3evU/v9NmzYkGbNmtG8eXOaNWtW5igOaH19ffHx8XFou4ecnBwOHDjAnj172LFjB9u3b2fHjh1s27aNzZs3lxnqWiwWunTpQmRkJOeccw7nnHMOXbt21YJyUiaFtg6gmbYiIiIiIiIiZyEjA154wcy0LSgAd3fTLuG//wX9nO0UNpuNjIwMe5h7+PBh0tPT7TNki5/n5eXZZ9GeOKvW1dW1xMzb4uHt7U2jRo3KHH5+fvZA1tPT09lfgnKz2Wzs2bOHdevWsX79euLj41mxYgVJSUmljvX19WXo0KGce+65nHvuuXTu3Fl9cgVQaOsQCm1FREREREREKkFiItx/P/z5p3ndsiW8+ipccw1odqLUMAcOHCA2NpbY2FiWL1/OihUryCpehO8fLVu2tAe45513HkFBQU6qVpxNoa0DKLQVERERERERqUQzZ5qZttu2mdfnnAPvvAMREU4tS+RsFBQUsHr1aubPn8/8+fOJjo4mNze3xDFdunRh9OjRjB49moEDB+KhxfnqDIW2DqDQVkRERERERKSS5eXB22/D//4HWVlgscC118JTT5lFy0RquNzcXJYvX878+fOZO3cusbGxFBUV2fc3aNCA4cOH20PcNm3aOLFacTSFtg6g0FZERERERETEQfbvh8ceg6+/Nq9dXU14++STNTe8LSgwobTNZhZjs1igYUO1gKjjDh8+zJw5c/jrr7/4+++/OXDgQIn9oaGh9gB30KBBmoVbyyi0dQCFtiIiIiIiIiIOtnIlPPvs8X63rq4wfjzcfTcMHmyCz+qgqAh27IB168zjzp2waxfs3QuHD5vxr76mgKm/USPw8YEWLaBdOzPat4fwcOjSBdzcqvpuxEmKioqIi4vjr7/+4q+//mLZsmWlZuEOHTqUkSNHMnLkSDp16qQFzWo4hbYOoNBWREREREREpIqsWAHPPXc8vAXo3h1uuw0uvdQEnlXl6FFYv94EtPHx5nH9esjOrvz3ql8feveG/v1h1CgYMADc3Sv/faRaOnLkSIlZuCkpKSX2BwYG2gPc4cOH4+fn56RK5UwptK1EUVFRREVFYbVaSUxMVGgrIiIiIiIiUlXWr4eoKNM2oTgkdXExs24vuwzOP9/MVK2M2YcFBZCYCBs2lAxpd+8u+3hPT+jaFTp2hOBgaNMGWreGpk3B1xeaNAEvL1Ovi4uZnZuRYULgI0dMS4jt281ISIDVqyEzs+R7eHvDiBEmqB43zrRXkDrBZrMRHx/PnDlzmD17NkuWLCEvL8++32Kx0KdPH0aMGMGgQYMYMGCA8qoaQKGtA2imrYiIiIiIiIiTHD0KX3wB339vZuGeqFUr6NfPzMTt2hWCgsw2b28TrBa3G8jOhvR0M/btO97SYNs22LgRtmwxwW1ZgoKgZ0/o0eP46NDBtG+oLEVFJryNjYX58+HvvyEt7fj++vVNq4hrroGRIyv3vaXay87OZsmSJcyePZvZs2ezYcOGEvtdXFwICwtj8ODBDBo0iP79+9OyZUsnVSsno9DWARTaioiIiIiIiFQDu3bBL7/A1Kkm4DxZ0FrMYjHjhF6hJ9WwIXTrZkbPnmZ072560Fa1oiIz+3b6dBNWb9t2fF9ICNxxB9xwg5nVK3XO/v37mTNnDosWLWLx4sVs37691DGtWrUiIiKCPn362IdaKjiXQlsHUGgrIiIiIiIiUs1kZ5vgds0a09JgyxazGFhyctkhrYuLWQjM3/94S4OQEDNDt1s3M6O2Oi70ZLOZGcbffGPG0aNmu6cnTJoEjzwCbds6tURxrv3797NkyRIWL17MkiVL2LhxY4lFzYq1atWKrl270qVLlxKjSZMmTqi67lFo6wAKbUVERERERERqiKIiyMuD3FzzWFRkwtoGDapnKFsR2dlm5u2UKRAXZ7a5usKECfD449C5s1PLk+ohKyuLuLg4Vq5cyapVq1i1ahWJiYknPd7Pz4/g4GBCQkJKjODgYAIDA2nQoEEVVl97KbR1AIW2IiIiIiIiIlJt2GywdCm89JLpfwsmkL7sMnjmGTN7WOQE6enpbNq0iU2bNrFx40b78z179pz2XG9vb/z9/QkICMDf37/EKN4WEBCAt7c3lpr+ixEHUmjrAAptRURERERERKRaWrUKXnzR9PkF0wZi0iR47jkIDHRqaVL9ZWZmkpSUVGLs3LnT/jwrK6vc16pfv36pILescLdx48Z1MtxVaOsACm1FREREREREpFpbv97Msv39d/PawwPuuQcee0wLlskZsdlsZGZmkpycXObYv3+//Xl6enq5r+vp6UlAQABBQUG0adOG7t278+CDDzrwTqoHhbYOoNBWRERERERERGqE5cvh0Udh8WLz2sfHBLf33ANeXk4tTWqv7OzsUmHuvx+Tk5M5cuRIqXP79OnDypUrnVB11VJoW4mioqKIiorCarWSmJio0FZEREREREREqj+bDf76y4S169ebba1awfPPm9YJrq7OrU/qrJycHFJSUti7dy+7du1i165d+Pn5cdtttzm7NIdTaOsAmmkrIiIiIiIiIjWO1QrffgtPPQW7d5ttXbrAK6/AmDFm8TIRqRLlzRddqrAmERERERERERGpaq6uMHEiJCTAG29AkyawaRNcdBEMGWJaKYhItaLQVkRERERERESkLvD0hAcfhO3b4ZFHzCJlS5ZAv35w2WWQmOjsCkXkH2qPUAFqjyAiIiIiIiIitcaePfDMM/Dll1BUZGbk3nyz2daypbOrO3s2G6SmQkoKpKebkZFx/F5dXExw7ecHzZqZ4eendhHiUOpp6wAKbUVERERERESk1tmwAR5/HGbMMK89PU14+9BDEBTk3NrKIyfHtHtYt86MjRth507Tvzcvr2LXatAAOnWCzp0hNBT69oXISGjc2CGlS92j0NYBFNqKiIiIiIiISK21aBE89tjxHrdubnDNNXD//dCjh3NrK2azwdatEB0NMTFmbNliZs+WxWIxM2h9fEzw2qiRmWVrtZqRmwsHD0JampmJe7JrdO1q+v9ecAEMGwZeXg67RandFNo6gEJbEREREREREanVbDaYPx9eesk8FuvXD267DS6/vGoDy9xcWL26ZEibllb6uKZNTbDcvbsZ7dubWcKtW4O7e/neKz8fkpJMCJyQYGbtLlsGO3aUPM7LC4YPN32AL77YBMEi5aTQ1gEU2oqIiIiIiIhInREbC2++Cb//DoWFZlujRjBmDFxyCYwaZdoJVKbUVBPMFoe0q1aZMPVEHh4QEQH9+8OAAeZ5y5aO60WbkmJqmT0bZs6EvXuP7/P0NF+Pa66BCy80s5NFTkGhrQMotBURERERERGROiclBT77DD76CHbtOr7d09OEpoMGwTnnmBYCrVqVLzzNzTU9ZxMSID4e4uLM2L699LHNmpn3KR69epng1hlsNli/HqZOhe++M/UXCwgwvYBvusnM8BUpg0JbB1BoKyIiIiIiIiJ1VlGR6Xf7++/w22+l2wYAeHubwNLf3/SQ9fQ0IW5WFhw7BhkZZqZqcvLJ36dLl5Ihbbt2jptFezZsNhM0f/cdfPnl8bYNLi4wdizceSeMGFE9axenUWjrAAptRUREREREREQwgeWmTbB4MSxZAmvXmgXCrNbyX6NBAxPI9ugBYWHQs6eZRevr67CyHSYvz4TZH3xgFnQr1qMHPPggXHkl1KvnvPqcoajIBPRbt8K2bWYW9cGDcPgwHDkC2dlmUTg3NzNCQ+H9951dtcMptK1EUVFRREVFYbVaSUxMVGgrIiIiIiIiIvJveXlm9m1yshlZWaYNQlERNGxoQtqGDU0bgeBg8POrnbNQN2+G996Dzz83s4vB3PM998Ctt4KPj1PLc5jDh01gvWKFGatWmZnV5dW3r+mjXMsptHUAzbQVEREREREREZFyOXIEPvwQ3nnneDuIBg1Mz9t774WQEOfWd7by82HZMrNA25w5JqT9d8zo5gZt20KHDtC+PbRoAU2amNnU9eubQL+w0MzQ9vGB885zyq1UJYW2DqDQVkREREREREREKiQ/H77/Ht54AzZsMNtcXODii+H++6F//5oz4zgrC/76C379FWbONK9PVNyPOCLCzJzt0gXc3Z1TazWl0NYBFNqKiIiIiIiIiMgZsdnMjNQ33zSzU4tFRJjw9rLLqmfAeeQITJ9uFp+bNcu0vCjWrJmZHTtypFl0rVUr59VZQyi0dQCFtiIiIiIiIiIictY2bIDJk+Gbb0wvYIDWreH22+G660wPXGdKSYFp00xQO3++aWFQrG1buPRSMyIizKxhKTeFtg6g0FZERERERERERCpNaip88AFERZnnAK6ucMEFcOONMHo01KtXNbUkJcHvv5ugNiamZH/abt3gkktMUNu9e81p51ANKbR1AIW2IiIiIiIiIiJS6fLy4Icf4JNPYOnS49sbN4axY01Yev754OVVee+Zm2vea84c0/YgPr7k/ogI03f30kuhY8fKe986TqGtAyi0FRERERERERERh9qyBT791LROSEk5vr1ePROkDh4MgwZBz57g71++Wa+FhbBrF6xaBStXmrFiRcn+tC4uMGSICWrHj4fAwEq/NVFo6xAKbUVEREREREREpEoUFZk2Bb/+aloW7N5d+phGjUyP2ZYtoWlT8PAwi5nl5kJWlmm5sHMn7NsHVmvp8wMCzEJixYuJNWvm8Nuq6xTaOoBCWxERERERERERqXI2G2zfDkuWwOLFJszdts0Eu+Xl4WH60UZEmHHOOdC5s/rTVrHy5otuVViTiIiIiIiIiIiIVJTFAu3bm3H99WZbbi5s3Qp795o2CocOQX4+FBSApyc0aAB+fhAcbEaLFqYFgtQICm1FRERERERERERqGk9PM3O2e3dnVyIOoHhdREREREREREREpBpRaCsiIiIiIiIiIiJSjSi0FREREREREREREalGFNqKiIiIiIiIiIiIVCMKbcshKiqKLl26EBER4exSREREREREREREpJaz2Gw2m7OLqCkyMjJo3Lgx6enpNGrUyNnliIiIiIiIiIiISA1S3nxRM21FREREREREREREqhE3ZxdQkxRPSs7IyHByJSIiIiIiIiIiIlLTFOeKp2t+oNC2AjIzMwEIDAx0ciUiIiIiIiIiIiJSU2VmZtK4ceOT7ldP2wooKipi//79eHt7Y7FYnF2Ow2VkZBAYGMiePXvUw1cEfU+IlEXfFyIl6XtCpDR9X4iUpO8JkdLq0veFzWYjMzOTgIAAXFxO3rlWM20rwMXFhdatWzu7jCrXqFGjWv8NI1IR+p4QKU3fFyIl6XtCpDR9X4iUpO8JkdLqyvfFqWbYFtNCZCIiIiIiIiIiIiLViEJbERERERERERERkWpEoa2clIeHB8888wweHh7OLkWkWtD3hEhp+r4QKUnfEyKl6ftCpCR9T4iUpu+L0rQQmYiIiIiIiIiIiEg1opm2IiIiIiIiIiIiItWIQlsRERERERERERGRakShrYiIiIiIiIiIiEg1otBWREREREREREREpBpRaCtlioqKIjg4GE9PTyIjI1mxYoWzSxJxmpdffpmIiAi8vb1p3rw548ePJyEhwdlliVQbr7zyChaLhfvuu8/ZpYg41b59+7jmmmvw8/PDy8uL7t27s2rVKmeXJeIUVquVp556ipCQELy8vGjXrh3/+9//0DrYUpcsXryYsWPHEhAQgMViYerUqSX222w2nn76afz9/fHy8mLEiBFs3brVOcWKVIFTfU8UFBTw6KOP0r17dxo0aEBAQAATJ05k//79zivYyRTaSik//vgjDzzwAM888wxr1qyhZ8+enH/++aSmpjq7NBGnWLRoEXfeeSfLly9nzpw5FBQUMHLkSI4dO+bs0kScbuXKlXz44Yf06NHD2aWIONWRI0cYMGAA7u7u/PXXX2zatIk333yTJk2aOLs0Ead49dVXef/995kyZQqbN2/m1Vdf5bXXXuPdd991dmkiVebYsWP07NmTqKioMve/9tprvPPOO3zwwQfExsbSoEEDzj//fHJzc6u4UpGqcarviezsbNasWcNTTz3FmjVr+O2330hISOCiiy5yQqXVg8WmX3XKv0RGRhIREcGUKVMAKCoqIjAwkLvvvpvHHnvMydWJOF9aWhrNmzdn0aJFDB482NnliDhNVlYWvXr14r333uOFF14gLCyMyZMnO7ssEad47LHHiI6OZsmSJc4uRaRaGDNmDC1atODTTz+1b7v00kvx8vLim2++cWJlIs5hsVj4/fffGT9+PGBm2QYEBPDggw/y0EMPAZCenk6LFi344osvuPLKK51YrYjj/ft7oiwrV66kb9++7Nq1i6CgoKorrprQTFspIT8/n9WrVzNixAj7NhcXF0aMGMGyZcucWJlI9ZGeng6Ar6+vkysRca4777yTCy+8sMS/GSJ11R9//EGfPn24/PLLad68OeHh4Xz88cfOLkvEafr378+8efNITEwEID4+nqVLlzJ69GgnVyZSPSQlJZGSklLi/1GNGzcmMjJSP3uL/CM9PR2LxYKPj4+zS3EKN2cXINXLwYMHsVqttGjRosT2Fi1asGXLFidVJVJ9FBUVcd999zFgwAC6devm7HJEnOaHH35gzZo1rFy50tmliFQLO3bs4P333+eBBx7giSeeYOXKldxzzz3Uq1ePSZMmObs8kSr32GOPkZGRQefOnXF1dcVqtfLiiy8yYcIEZ5cmUi2kpKQAlPmzd/E+kbosNzeXRx99lKuuuopGjRo5uxynUGgrIlIBd955Jxs2bGDp0qXOLkXEafbs2cO9997LnDlz8PT0dHY5ItVCUVERffr04aWXXgIgPDycDRs28MEHHyi0lTrpp59+4ttvv+W7776ja9euxMXFcd999xEQEKDvCREROaWCggKuuOIKbDYb77//vrPLcRq1R5ASmjZtiqurKwcOHCix/cCBA7Rs2dJJVYlUD3fddRczZsxgwYIFtG7d2tnliDjN6tWrSU1NpVevXri5ueHm5saiRYt45513cHNzw2q1OrtEkSrn7+9Ply5dSmwLDQ1l9+7dTqpIxLkefvhhHnvsMa688kq6d+/Otddey/3338/LL7/s7NJEqoXin6/1s7dIScWB7a5du5gzZ06dnWULCm3lX+rVq0fv3r2ZN2+efVtRURHz5s2jX79+TqxMxHlsNht33XUXv//+O/PnzyckJMTZJYk41fDhw1m/fj1xcXH20adPHyZMmEBcXByurq7OLlGkyg0YMICEhIQS2xITE2nTpo2TKhJxruzsbFxcSv646erqSlFRkZMqEqleQkJCaNmyZYmfvTMyMoiNjdXP3lJnFQe2W7duZe7cufj5+Tm7JKdSewQp5YEHHmDSpEn06dOHvn37MnnyZI4dO8b111/v7NJEnOLOO+/ku+++Y9q0aXh7e9t7TDVu3BgvLy8nVydS9by9vUv1dG7QoAF+fn7q9Sx11v3330///v156aWXuOKKK1ixYgUfffQRH330kbNLE3GKsWPH8uKLLxIUFETXrl1Zu3Ytb731FjfccIOzSxOpMllZWWzbts3+Oikpibi4OHx9fQkKCuK+++7jhRdeoEOHDoSEhPDUU08REBDA+PHjnVe0iAOd6nvC39+fyy67jDVr1jBjxgysVqv9Z29fX1/q1avnrLKdxmKz2WzOLkKqnylTpvD666+TkpJCWFgY77zzDpGRkc4uS8QpLBZLmds///xzrrvuuqotRqSaGjp0KGFhYUyePNnZpYg4zYwZM3j88cfZunUrISEhPPDAA9x8883OLkvEKTIzM3nqqaf4/fffSU1NJSAggKuuuoqnn366Tv7gLXXTwoULGTZsWKntkyZN4osvvsBms/HMM8/w0UcfcfToUQYOHMh7771Hx44dnVCtiOOd6nvi2WefPemnWhcsWMDQoUMdXF31o9BWREREREREREREpBpRT1sRERERERERERGRakShrYiIiIiIiIiIiEg1otBWREREREREREREpBpRaCvy/+3csUmrYRiG4efgEUtTpBBs7Ayx0BQWgpAJAiG4iBBcIgs4gRvYms5CEL+gI1hYpAjYSJqc7iyQwP/9cl0TPPXNywsAAAAAFRFtAQAAAAAqItoCAAAAAFREtAUAAAAAqIhoCwAAAABQEdEWAAAAAKAioi0AAOzAdDrNeDxuegYAAL+AaAsAADtQSsnFxUXTMwAA+AVEWwAA2IHFYiHaAgCwE6ItAABs6fPzM8vl8n+0Xa1WGY1Gub6+ztfXV7PjAABoHdEWAAC2VEpJp9PJyclJ3t/fc3l5mePj48zn8xwdHTU9DwCAlhFtAQBgS6WUnJ+f5+HhIcPhMHd3d7m/v8/+/n7T0wAAaKE/m81m0/QIAABos5ubmzw9PSVJHh8fc3V11fAiAADazKUtAABsqZSSyWSSn5+frFarpucAANByLm0BAGAL39/fOTw8zOvra97e3nJ7e5vn5+ecnZ01PQ0AgJb62/QAAABos8Vikb29vfT7/QwGg3x8fGQ0GuXl5SXdbrfpeQAAtJD3CAAAsIVSSnq9Xg4ODpIks9ksp6enmUwmWa/XDa8DAKCNvEcAAAAAAKiIS1sAAAAAgIqItgAAAAAAFRFtAQAAAAAqItoCAAAAAFREtAUAAAAAqIhoCwAAAABQEdEWAAAAAKAioi0AAAAAQEVEWwAAAACAioi2AAAAAAAVEW0BAAAAACryD8m+sMY14fqEAAAAAElFTkSuQmCC\",\n      \"text/plain\": [\n       \"<Figure size 1400x300 with 1 Axes>\"\n      ]\n     },\n     \"metadata\": {},\n     \"output_type\": \"display_data\"\n    }\n   ],\n   \"source\": [\n    \"plot_time_directed(gkde_r2, gkde_a2)\\n\",\n    \"plot_time_directed(gkde_r2, gkde_a2, ylog=True)\"\n   ]\n  },\n  {\n   \"attachments\": {},\n   \"cell_type\": \"markdown\",\n   \"id\": \"bdf697a7-6733-481c-b907-bb40c6064161\",\n   \"metadata\": {},\n   \"source\": [\n    \"Here we find a stronger divergence between the retarded and advanced degree distributions, suggesting irreversibility of the underlying time series. And indeed, the KS test clearly yields `pvalue < 0.050`.\"\n   ]\n  },\n  {\n   \"cell_type\": \"code\",\n   \"execution_count\": 17,\n   \"id\": \"12f6159a\",\n   \"metadata\": {},\n   \"outputs\": [\n    {\n     \"data\": {\n      \"text/plain\": [\n       \"KstestResult(statistic=0.0593881223755249, pvalue=4.3359432807261227e-08, statistic_location=1.0, statistic_sign=-1)\"\n      ]\n     },\n     \"execution_count\": 17,\n     \"metadata\": {},\n     \"output_type\": \"execute_result\"\n    }\n   ],\n   \"source\": [\n    \"ks_2samp(k_r2, k_a2)\"\n   ]\n  }\n ],\n \"metadata\": {\n  \"kernelspec\": {\n   \"display_name\": \"pyunicorn\",\n   \"language\": \"python\",\n   \"name\": \"python3\"\n  },\n  \"language_info\": {\n   \"codemirror_mode\": {\n    \"name\": \"ipython\",\n    \"version\": 3\n   },\n   \"file_extension\": \".py\",\n   \"mimetype\": \"text/x-python\",\n   \"name\": \"python\",\n   \"nbconvert_exporter\": \"python\",\n   \"pygments_lexer\": \"ipython3\",\n   \"version\": \"3.10.13\"\n  }\n },\n \"nbformat\": 4,\n \"nbformat_minor\": 5\n}\n"
  },
  {
    "path": "docs/source/index.rst",
    "content": "\n============\nIntroduction\n============\n\n.. include:: ../../README.rst\n    :start-after:   :target: https://zenodo.org/badge/latestdoi/33720178\n    :end-before: For information about individual releases,\n\nExample\n=======\n\nTo generate a recurrence network with 1000 nodes from a sinusoidal\nsignal and to compute its network transitivity, you can simply run:\n\n.. literalinclude:: examples/modules/timeseries/recurrence_network.py"
  },
  {
    "path": "docs/source/license.rst",
    "content": "\nLicense\n=======\n\n.. literalinclude:: ../../LICENSE.txt"
  },
  {
    "path": "docs/source/methods.rst",
    "content": "\nPackage Overview\n================\n\nA brief introduction to the methods, measures and algorithms provided by\n``pyunicorn``.\n\nGeneral complex networks\n------------------------\nMany standard complex network measures, network models and algorithms are\nsupported, most of them inherited from the ``igraph`` package, e.g., degree,\ncloseness and betweenness centralities, clustering coefficient and\ntransitivity or commmunity detection algorithms and network models such as\nErdos-Renyi or Barabasi-Albert. Moreover, a number of less common network\nstatistics like Newman's or Arenas' random walk betweenness can be computed.\nReading and saving network data from and to many common data formats is\npossible.\n\n* :doc:`api/core/network`\n\nSpatially embedded networks\n---------------------------\n``pyunicorn`` includes measures and models specifically designed for spatially\nembedded networks (or simply spatial networks) via the ``GeoNetwork`` and ``Grid``\nclasses.\n\n* :doc:`api/core/geo_network`\n* :doc:`api/core/grid`\n\nInteracting/multiplex networks (networks of networks)\n-----------------------------------------------------\nThe ``InteractingNetworks`` class provides a rich collection of network measures and models specifically designed for investigating the structure of networks of\nnetworks (also called interacting networks, interdependent networks or\nmultiplex networks in different contexts). Examples include the cross-link\ndensity of connections between different subnetworks or the cross-shortest\npath betweenness quantifying the importance of nodes for mediating interactions\nbetween different subnetworks. Models of interacting networks allow to assess\nthe degree of organization of the cross-connectivity between subnetworks.\n\n* :doc:`api/core/interacting_networks`\n\nNode-weighted (node-splitting invariant) network measures\n---------------------------------------------------------\nNode-weighted networks measures derived following the node-splitting invariance\napproach are useful for studying systems with nodes representing subsystems of\nheterogeneous size, weight, area, volume or importance, e.g., nodes\nrepresenting grid cells of widely different area in climate networks or voxels\nof differing volume in functional brain networks. ``pyunicorn`` provides\nnode-weighted variants of most standard and non-standard measures for networks\nas well as interacting networks.\n\n* :doc:`api/core/network`\n* :doc:`api/core/interacting_networks`\n\n(Coupled) Climate networks\n--------------------------\n``pyunicorn`` provides classes for the easy construction and analysis of the\nstatistical interdependency structure within and between fields of time series (functional networks) using various similarity measures such as Pearson and Spearman correlation, lagged linear correlation, mutual information and event\nsynchronization. Climate networks allow the analysis of single fields of time series, whereas coupled climate networks focus on studying the\ninterrelationships between two fields of time series. While there is a\nhistorical focus on applications to climate data, those methods can also be\napplied to other sources of time series data such as neuroscientific (e.g.,\nFMRI and EEG data) or financial data (e.g., stock market indices).\n\n* :doc:`api/climate/climate_network`\n* :doc:`api/climate/coupled_climate_network`\n* :doc:`api/climate/climate_data`\n\nRecurrence quantification/network analysis\n------------------------------------------\nRecurrence analysis is a powerful method for studying nonlinear systems,\nparticularly based on univariate and multivariate time series data. Recurrence\nquantification analysis (RQA) and recurrence network analysis (RNA) allow to\nclassify different dynamical regimes in time series and to detect regime\nshifts, dynamical transitions or tipping points, among many other applications.\nBivariate methods such as joint recurrence plots/networks, cross recurrence\nplots or inter system recurrence networks allow to investigate the coupling\nstructure between two dynamical systems based on time series, including methods\nto detect the directionality of coupling. Recurrence analysis is applicable to\ngeneral time series data from many fields such as climatology,\npaleoclimatology, medicine, neuroscience or economics.\n\n* :doc:`api/timeseries/recurrence_plot`\n* :doc:`api/timeseries/recurrence_network`\n* :doc:`api/timeseries/joint_recurrence_plot`\n* :doc:`api/timeseries/joint_recurrence_network`\n* :doc:`api/timeseries/cross_recurrence_plot`\n* :doc:`api/timeseries/inter_system_recurrence_network`\n\nVisibility graph analysis\n-------------------------\nVisibility graph analysis is an alternative approach to nonlinear time series\nanalysis, allowing to study among others fractal properties and long-term memory in time series. As a special feature, ``pyunicorn`` provides\ntime-directed measures such as advanced and retarded degree/clustering that can\nbe used for designing tests for time-irreversibility (time-reversal\nasymmetry) of processes.\n\n* :doc:`api/timeseries/visibility_graph`\n\nSurrogate time series\n---------------------\nSurrogate time series are useful for testing hypothesis on observed time series\nproperties, e.g., on what features of a time series are expected to arise with\nhigh probability for randomized time series with the same autocorrelation\nstructure. ``pyunicorn`` can be used to generate various types of time series\nsurrogates, including white noise surrogates, Fourier surrogates, amplitude adjusted Fourier (AAFT) surrogates or twin surrogates (conserving the recurrence structure of the underlying time series).\n\n* :doc:`api/timeseries/surrogates`\n"
  },
  {
    "path": "docs/source/publications.rst",
    "content": "\nPublications\n############\n\nReferences to peer-reviewed publications, theses and reports describing in\ndetail and applying the methods implemented in the ``pyunicorn`` package.\n\nGeneral complex networks\n========================\n- Review papers: [Newman2003]_, [Boccaletti2006]_, [Costa2007]_.\n- Further network papers: [Watts1998]_, [Newman2001]_, [Newman2002]_,\n  [Arenas2003]_, [Newman2005]_, [Soffer2005]_, [Holme2007]_, [Tsonis2008a]_,\n  [Ueoka2008]_.\n\n....\n\n.. [Newman2003] M.E.J. Newman.\n    \"The structure and function of complex networks\".\n    In *SIAM Review*, vol. 45 (no. 2), p167-256 (2003)\n    `doi:10.1137/S003614450342480\n    <http://dx.doi.org/10.1137/S003614450342480>`__\n\n.. [Boccaletti2006] S. Boccaletti, V. Latora, Y. Moreno, M. Chavez, D.U. Hwang.\n    \"Complex networks: structure and dynamics\".\n    In *Physics Reports*, vol. 424 (no. 4-5), p175-308 (2006)\n    `doi:10.1016/j.physrep.2005.10.009\n    <http://dx.doi.org/10.1016/j.physrep.2005.10.009>`__\n\n.. [Costa2007] L.D.F. Costa, F.A. Rodrigues, G. Travieso, P.R. Villas Boas.\n    \"Characterization of complex networks: A survey of measurements\".\n    In *Advances in Physics*, vol. 56(1), 167-242 (2007)\n    `doi:10.1080/00018730601170527\n    <http://dx.doi.org/10.1080/00018730601170527>`__\n\n.. [Watts1998] D.J. Watts and S.H. Strogatz.\n    \"Collective dynamics of small-world networks\".\n    In *Nature* vol. 393, 440–442 (1998)\n    `doi:10.1038/30918 <http://dx.doi.org/10.1038/30918>`__\n\n.. [Newman2001] M.E.J. Newman.\n    \"Scientific collaboration networks. II. Shortest paths, weighted\n    networks, and centrality\".\n    In *Physical Review E* vol. 64.1, 016132 (2001)\n    `doi:10.1103/PhysRevE.64.016132\n    <http://dx.doi.org/10.1103/PhysRevE.64.016132>`__\n\n.. [Newman2002] M.E.J. Newman.\n    \"Assortative mixing in networks\".\n    In *Physical Review Letters*, vol. 89.20, 208701 (2002)\n    `doi:10.1103/PhysRevLett.112.068103\n    <http://dx.doi.org/10.1103/PhysRevLett.112.068103>`__\n\n.. [Arenas2003]  A. Arenas, A. Cabrales, A. Díaz-Guilera, R. Guimerà, F. Vega-Redondo.\n    \"Search and Congestion in Complex Networks\".\n    In \"Statistical Mechanics of Complex Networks\",\n    In *Lecture Notes in Physics*, vol. 625, p175-194 (2003)\n    `doi:10.1007/978-3-540-44943-0_11\n    <http://dx.doi.org/10.1007/978-3-540-44943-0_11>`__\n\n.. [Newman2005] M.E.J. Newman.\n    \"A measure of betweenness centrality based on random walks\".\n    In *Social Networks*, vol 27 (no. 1), p39–54 (2005)\n    `doi:10.1016/j.socnet.2004.11.009\n    <http://dx.doi.org/10.1016/j.socnet.2004.11.009>`__\n\n.. [Soffer2005] S.N. Soffer and A. Vázquez\n    \"Network clustering coefficient without degree-correlation biases\".\n    In *Physical Review E*, vol. 71, 057101 (2005)\n    `doi:10.1103/PhysRevE.71.057101\n    <http://dx.doi.org/10.1103/PhysRevE.71.057101>`__\n\n.. [Holme2007] P. Holme, S.M. Park, B.J. Kim, C.R. Edling.\n    \"Korean university life in a network perspective: Dynamics of a large\n    affiliation network\".\n    In *Physica A: Statistical Mechanics and its Applications*,\n    vol. 373, p821-830 (2007)\n    `doi:10.1016/j.physa.2006.04.066\n    <http://dx.doi.org/10.1016/j.physa.2006.04.066>`__\n\n.. [Tsonis2008a] A.A. Tsonis, K.L. Swanson, G. Wang.\n    \"Estimating the clustering coefficient in scale-free networks on lattices\n    with local spatial correlation structure\".\n    In *Physica A: Statistical Mechanics and its Applications*,\n    vol. 387 (no. 21) p5287-5294 (2008)\n    `doi:10.1016/j.physa.2008.05.048\n    <http://dx.doi.org/10.1016/j.physa.2008.05.048>`__\n\n.. [Ueoka2008] Y. Ueoka, T. Suzuki, T. Ikeguchi, Y. Horio.\n    \"Efficiency of Statistical Measures to Estimate Network Structure of Chaos\n    Coupled Systems\".\n    Proceedings of NOLTA (2008)\n    http://tsuzuki.ise.ibaraki.ac.jp/MyPaper/Meeting/08NOLTA.pdf\n\n\nSpatially embedded networks\n===========================\n- [Bartelemy2011]_.\n\n....\n\n.. [Bartelemy2011] M. Barthelemy.\n    \"Spatial networks\".\n    In *Physics Reports*, vol. 499 (no. 1-3), p1-101 (2011)\n    `doi:10.1016/j.physrep.2010.11.002\n    <http://dx.doi.org/10.1016/j.physrep.2010.11.002>`__\n\n\nInteracting/interdependent networks (networks of networks)\n==========================================================\n- Introduction to structural analysis of interacting networks: [Donges2011a]_.\n- Random graph models & network surrogates for interacting networks: [Schultz2010]_.\n\n....\n\n.. [Donges2011a] J.F. Donges, H.C.H. Schultz, N. Marwan, Y. Zou, J. Kurths.\n    \"Investigating the topology of interacting networks - Theory and\n    application to coupled climate subnetworks\".\n    In *European Physical Journal B: Condensed Matter and Complex Systems*,\n    vol. 84 (no. 4) p635-652 (2011)\n    `doi:10.1140/epjb/e2011-10795-8\n    <http://dx.doi.org/10.1140/epjb/e2011-10795-8>`__\n\n.. [Schultz2010] H.C.H. Schultz.\n    \"Coupled climate networks: Investigating the terrestrial atmosphere's\n    dynamical structure\".\n    Diploma thesis, Free University, Berlin (2010)\n\n\nNode-weighted (node-splitting invariant) network measures\n=========================================================\n- Introduction: [Heitzig2012]_.\n- Analysis of node-weighted interacting networks: [Wiedermann2011]_, [Wiedermann2013]_.\n\n....\n\n.. [Heitzig2012] J. Heitzig, J. F. Donges, Y. Zou, N. Marwan, J. Kurths.\n    \"Node-weighted measures for complex networks with spatially embedded,\n    sampled, or differently sized nodes\".\n    In *European Physical Journal B: Condensed Matter and Complex Systems*,\n    vol. 85 p38 (2012)\n    `doi:10.1140/epjb/e2011-20678-7\n    <http://dx.doi.org/10.1140/epjb/e2011-20678-7>`__\n\n.. [Wiedermann2011] M. Wiedermann.\n    \"Coupled climate network analysis of multidecadal dynamics in the Arctic\".\n    Bachelor's thesis, Humboldt University, Berlin (2011)\n\n.. [Wiedermann2013] M. Wiedermann, J.F. Donges, J. Heitzig, J. Kurths.\n    \"Node-weighted interacting network measures improve the representation\n    of real-world complex systems\".\n    In *Europhysics Letters*, vol. 102.2, 28007 (2013)\n    `doi:10.1209/0295-5075/102/28007\n    <http://dx.doi.org/10.1209/0295-5075/102/28007>`__\n\n.. [Zemp2014] D.C. Zemp,  M. Wiedermann, J. Kurths, A. Rammig, J.F. Donges.\n    \"Node-weighted measures for complex networks with directed and weighted\n    edges for studying continental moisture recycling\".\n    In *Europhysics Letters*, vol. 107.5, p58005 (2014)\n    `doi:10.1209/0295-5075/107/58005\n    <http://dx.doi.org/10.1209/0295-5075/107/58005>`__\n\n\nClimate data analysis (general)\n===============================\n- [Bretherton1992]_.\n\n....\n\n.. [Bretherton1992] C.S. Bretherton, C. Smith, J.M. Wallace.\n    \"An intercomparison of methods for finding coupled patterns in climate\n    data\".\n    In *Journal of Climate*, vol. 5, p541-560 (1992)\n    `doi:10.1175/1520-0442(1992)005<0541:AIOMFF>2.0.CO;2\n    <http://dx.doi.org/10.1175/1520-0442(1992)005%3C0541%3AAIOMFF%3E2.0.CO%3B2>`__\n\n\n(Coupled) Climate networks\n==========================\n- Comparing linear & nonlinear construction of climate networks: [Donges2009a]_.\n- Studying the dynamical structure of the surface air temperature field:\n  [Donges2009b]_, [Radebach2010]_.\n- Introduction to coupled climate networks & applications:\n  [Schultz2010]_, [Donges2011a]_, [Wiedermann2011]_.\n- Review of climate network analysis (in Chinese!): [Zou2011]_.\n- Visualization of climate networks: [Tominski2011]_.\n- Evolving climate networks: [Radebach2013]_.\n- General: [Tsonis2004]_, [Tsonis2006]_, [Gozolchiani2008]_, [Tsonis2008b]_,\n  [Tsonis2008c]_, [Yamasaki2008]_, [Donges2009c]_, [Yamasaki2009]_.\n\n....\n\n.. [Donges2009a] J.F. Donges, Y. Zou, N. Marwan, J. Kurths.\n    \"Complex networks in climate dynamics\".\n    In *European Physical Journal Special Topics*, vol. 174 (no. 1), p157-179\n    (2009)\n    `doi:10.1140/epjst/e2009-01098-2\n    <http://dx.doi.org/10.1140/epjst/e2009-01098-2>`__\n\n.. [Donges2009b] J.F. Donges, Y. Zou, N. Marwan, J. Kurths.\n    \"The backbone of the climate network\".\n    In *Europhysics Letters*, vol. 87 (no. 4), 48007 (2009)\n    `doi:10.1209/0295-5075/87/48007\n    <http://dx.doi.org/10.1209/0295-5075/87/48007>`__\n\n.. [Radebach2010] A. Radebach.\n    \"Evolving climate networks: Investigating the evolution of correlation\n    structure of the Earth's climate system\".\n    Diploma thesis, Humboldt University, Berlin (2010)\n\n.. [Zou2011] Y. Zou, J.F. Donges, J. Kurths.\n    \"Recent advances in complex climate network analysis\".\n    In *Complex Systems and Complexity Science*, vol. 8 (no. 1), p27-38 (2011)\n\n.. [Tominski2011] C. Tominski, J.F. Donges, T. Nocke.\n    \"Information Visualization in Climate Research\".\n    In *Proceedings of the International Conference on Information\n    Visualisation (IV), London*, p298-305 (2011)\n    `doi:10.1109/IV.2011.12 <http://dx.doi.org/10.1109/IV.2011.12>`__\n\n.. [Radebach2013] A. Radebach, R.V. Donner, J. Runge, J.F. Donges, J. Kurths.\n    \"Disentangling different types of El Nino episodes by evolving climate\n    network analysis\".\n    In *Physical Review E*, vol. 88, 052807 (2013)\n    `doi:10.1103/PhysRevE.88.052807\n    <http://dx.doi.org/10.1103/PhysRevE.88.052807>`__\n\n.. [Tsonis2004] A.A. Tsonis and P.J. Roebber.\n    \"The architecture of the climate network\".\n    In *Physica A: Statistical Mechanics and its Applications*,\n    vol. 333, p497-504 (2004)\n    `doi:10.1016/j.physa.2003.10.045\n    <http://dx.doi.org/10.1016/j.physa.2003.10.045>`__\n\n.. [Tsonis2006] A.A. Tsonis, K.L. Swanson, P.J. Roebber.\n    \"What do networks have to do with climate?\".\n    In *Bull. Amer. Meteor. Soc.* vol. 87 p585-595 (2006)\n    `doi:10.1175/BAMS-87-5-585 <http://dx.doi.org/10.1175/BAMS-87-5-585>`__\n\n.. [Gozolchiani2008] A. Gozolchiani, K. Yamasaki, O. Gazit, S. Havlin.\n    \"Pattern of climate network blinking links follows El Niño events\".\n    In *Europhysics Letters*, vol. 83 (no. 2), 28005 (2008)\n    `doi:10.1209/0295-5075/83/28005\n    <http://dx.doi.org/10.1209/0295-5075/83/28005>`__\n\n.. [Tsonis2008b] A. A. Tsonis and K. L. Swanson.\n    \"Topology and Predictability of El Niño and La Niña Networks\".\n    In *Physical Review Letters* vol 100, 228502 (2008)\n    `doi:10.1103/PhysRevLett.100.228502\n    <http://dx.doi.org/10.1103/PhysRevLett.100.228502>`__\n\n.. [Tsonis2008c] A. A. Tsonis, K. L. Swanson, G. Wang.\n    \"On the role of atmospheric teleconnections in climate\".\n    In *Journal of Climate* vol. 21, p2990-3001 (2008)\n    `doi:10.1175/2007JCLI1907.1 <http://dx.doi.org/10.1175/2007JCLI1907.1>`__\n\n.. [Yamasaki2008] K. Yamasaki, A. Gozolchiani, S. Havlin.\n    \"Climate Networks around the Globe are Significantly Affected by El Niño\".\n    In *Physical Review Letters*, vol. 100, 228501 (2008)\n    `doi:10.1103/PhysRevLett.100.228501\n    <http://dx.doi.org/10.1103/PhysRevLett.100.228501>`__\n\n.. [Donges2009c] J.F. Donges\n    \"Complex networks in the climate system\".\n    Diploma thesis, University of Potsdam (2009)\n    Advisor: Prof. Dr. Dr. h.c. Juergen Kurths.\n    URN: ``urn:nbn:de:kobv:517-opus-49775``.\n\n.. [Yamasaki2009] K. Yamasaki, A. Gozolchiani, S. Havlin.\n    \"Climate Networks Based on Phase Synchronization Analysis Track El-Niño\".\n    In *Progress Of Theoretical Physics Supplement*, vol. 179, p178-188 (2009)\n    `doi:10.1143/PTPS.179.178 <http://dx.doi.org/10.1143/PTPS.179.178>`__\n\n\nPower grids & Power networks\n============================\n- Resistance based networks: [Schultz2014]_, [Schultz2014a]_.\n\n....\n\n.. [Schultz2014] P. Schultz \"Stability Analysis of Power Grid Networks\".\n    *M.Sc. Thesis*, Humboldt-Universität zu Berlin (2014)\n\n.. [Schultz2014a] P. Schultz, J. Heitzig, J. Kurths\n    A Random Growth Model for Power Grids and Other\n    Spatially Embedded Infrastructure Networks\".\n    In *Eur. Phys. J. Special Topics: Resilient Power Grids and Extreme Events* (2014)\n\n\nTime series analysis & Synchronization\n======================================\n- General: [Pecora1998]_, [Schreiber2000]_, [Bandt2002]_, [Kraskov2004]_,\n  [Kantz2006]_, [Thiel2006]_, [Bergner2008]_, [Pompe2011]_, [Ribeiro2011]_, [Runge2012b]_.\n- Event synchronization: [Quiroga2002]_, [Boers2014]_.\n- Event coincidence analysis: [Odenweller2020]_.\n\n....\n\n.. [Pecora1998] L.M. Pecora and T.L. Carroll.\n    \"Master Stability Functions for Synchronized Coupled Systems\".\n    In *Physical Review Letters*, vol. 80, 2109 (1998)\n    `doi:10.1103/PhysRevLett.80.2109\n    <http://dx.doi.org/10.1103/PhysRevLett.80.2109>`__\n\n.. [Schreiber2000] T. Schreiber and A. Schmitz.\n    \"Surrogate time series\".\n    In *Physica D* vol. 142 (no. 3-4), p346-382 (2000)\n    `doi:10.1016/S0167-2789(00)00043-9\n    <http://dx.doi.org/10.1016/S0167-2789(00)00043-9>`__\n\n.. [Bandt2002] C. Bandt, B. Pompe\n    \"Permutation Entropy: A Natural Complexity Measure for Time Series\".\n    In *Phys. Rev. Lett.*, vol. 88(17), 174102 (2002)\n    `doi:10.1103/PhysRevLett.88.174102\n    <http://dx.doi.org/10.1103/PhysRevLett.88.174102>`__\n\n.. [Kraskov2004] A. Kraskov, H. Stögbauer, P. Grassberger.\n    \"Estimating mutual information\".\n    In *Physical Review E*, vol. 69(6), 066138 (2004)\n    `doi:10.1103/PhysRevE.69.066138\n    <http://dx.doi.org/10.1103/PhysRevE.69.066138>`__\n\n.. [Kantz2006] H. Kantz and T. Schreiber.\n    \"Nonlinear Time Series Analysis\".\n    Cambridge University Press, Cambridge, 2nd edition (2006)\n\n.. [Thiel2006] M. Thiel, M.C. Romano, J. Kurths, M. Rolfs, R. Kliegl.\n    \"Twin surrogates to test for complex synchronization\".\n    In *Europhysics Letters*, vol. 75, p535-541 (2006)\n    `doi:10.1209/epl/i2006-10147-0\n    <http://dx.doi.org/10.1209/epl/i2006-10147-0>`__\n\n.. [Bergner2008] A. Bergner, R. Meucci, K. Al Naimee, M.C. Romano, M. Thiel,\n    J. Kurths, and F. T. Arecchi.\n    \"Continuous wavelet transform in the analysis of burst synchronization in a\n    coupled laser system\".\n    In *Physical Review E*, vol. 78, 016211 (2008)\n    `doi:10.1103/PhysRevE.78.016211\n    <http://dx.doi.org/10.1103/PhysRevE.78.016211>`__\n\n.. [Pompe2011] B. Pompe, J. Runge.\n    \"Momentary information transfer as a coupling measure of time series\".\n    In *Physical Review E* vol. 83, 051122 (2011)\n    `doi:10.1103/PhysRevE.83.051122\n    <http://dx.doi.org/10.1103/PhysRevE.83.051122>`__\n\n.. [Ribeiro2011] H.V. Ribeiro, L. Zunino, R.S. Mendes and E.K. Lenzi\n    \"Complexity–entropy causality plane: A useful approach for\n    distinguishing songs\",\n    In *Physica A: Statistical Mechanics and its Applications*,\n    vol. 391, p2421-2428 (2011)\n    `doi:10.1016/j.physa.2011.12.009\n    <http://dx.doi.org/10.1016/j.physa.2011.12.009>`__\n\n.. [Runge2012b] J. Runge, J. Heitzig, N. Marwan, J. Kurths.\n    \"Quantifying causal coupling strength: A lag-specific measure for\n    multivariate time series related to transfer entropy\".\n    In *Physical Review E*, vol. 86(6), 1-15 (2012)\n    `doi:10.1103/PhysRevE.86.061121\n    <http://dx.doi.org/10.1103/PhysRevE.86.061121>`__\n\n.. [Quiroga2002] R.Q. Quiroga, T. Kreuz, P. Grassberger.\n    \"Event synchronization: a simple and fast method to measure synchronicity\n    and time delay patterns.\"\n    In *Physical Review E*, vol. 66(4), 041904 (2002)\n    `doi:10.1103/PhysRevE.66.041904\n    <http://dx.doi.org/10.1103/PhysRevE.66.041904>`__\n\n.. [Boers2014] N. Boers, B. Bookhagen, H.M.J. Barbosa, N. Marwan, J. Kurths.\n    J.A. Marengo.\n    \"Prediction of extreme floods in the eastern Central Andes based on a\n    complex networks approach\".\n    In *Nature communications*, vol. 5, 1--7 (2014)\n    `doi:10.1038/ncomms6199\n    <http://dx.doi.org/10.1038/ncomms6199>`__\n\n.. [Odenweller2020] A. Odenweller, R.V. Donner.\n    \"Disentangling synchrony from serial dependency in paired-event time series\".\n    In *Pyhsical Review E*, vol. 101, 052213 (2020)\n    `doi:10.1103/PhysRevE.101.052213\n    <https://doi.org/10.1103/PhysRevE.101.052213>`__\n\n\nRecurrence quantification/network analysis\n==========================================\n- Review of recurrence plots & RQA: [Marwan2007]_.\n- Introduction & application of recurrence networks in the context of RQA: [Marwan2009]_.\n- Thorough introduction to recurrence network analysis: [Donner2010b]_.\n- Discussion of choosing an appropriate recurrence threshold: [Donner2010a]_, [Zou2010]_.\n- Review of various methods for network-based time series analysis: [Donner2011a]_.\n- Introduction to measures of (fractal) transitivity dimensions: [Donner2011b]_.\n- Applications of recurrence network analysis to paleoclimate data: [Donges2011b]_,\n  [Donges2011c]_, [Feldhoff2012]_.\n- Theory of recurrence networks: [Donges2012]_, [Zou2012]_.\n- Multivariate extensions of recurrence network analysis: [Feldhoff2012]_, [Feldhoff2013]_.\n- General: [Ngamga2007]_, [Xu2008]_, [Schinkel2009]_.\n\n....\n\n.. [Marwan2007] N. Marwan, M.C. Romano, M. Thiel, J. Kurths.\n    \"Recurrence plots for the analysis of complex systems\".\n    In *Physics Reports*, vol. 438 (no. 5–6), p237-329 (2007)\n    `doi:10.1016/j.physrep.2006.11.001\n    <http://dx.doi.org/10.1016/j.physrep.2006.11.001>`__\n\n.. [Marwan2009] N. Marwan, J.F. Donges, Y. Zou, R.V. Donner, J. Kurths.\n    \"Complex network approach for recurrence analysis of time series\".\n    In *Physics Letters A*, vol. 373 (no. 46), p4246-4254 (2009)\n    `doi:10.1016/j.physleta.2009.09.042\n    <http://dx.doi.org/10.1016/j.physleta.2009.09.042>`__\n\n.. [Donner2010b] R.V. Donner, Y. Zou, J.F. Donges, N. Marwan, J. Kurths.\n    \"Recurrence networks -- A novel paradigm for nonlinear time series\n    analysis\".\n    In *New Journal of Physics*, vol. 12 (no. 3), 033205 (2010)\n    `doi:10.1088/1367-2630/12/3/033025\n    <http://dx.doi.org/10.1088/1367-2630/12/3/033025>`__\n\n.. [Donner2010a] R.V. Donner, Y. Zou, J.F. Donges, N. Marwan, J. Kurths.\n    \"Ambiguities in recurrence-based complex network representations of time\n    series\".\n    In *Physical Review E*,\n    vol. 81 (no. 1), 015101(R) (2010)\n    `doi:10.1103/PhysRevE.81.015101\n    <http://dx.doi.org/10.1103/PhysRevE.81.015101>`__\n\n.. [Zou2010] Y. Zou, R.V. Donner, J.F. Donges, N. Marwan, J. Kurths.\n    \"Identifying complex periodic windows in continuous-time dynamical systems\n    using recurrence-based methods\".\n    In *Chaos*, vol. 20 (no. 4), 043130 (2010)\n    `doi:10.1063/1.3523304 <http://dx.doi.org/10.1063/1.3523304>`__\n\n.. [Donner2011a] R.V. Donner, M. Small, J.F. Donges, N. Marwan, Y. Zou, R.\n    Xiang, J. Kurths.\n    \"Recurrence-based time series analysis by means of complex network\n    methods\".\n    In *International Journal of Bifurcation and Chaos*, vol. 21 (no. 4),\n    p1019-1046 (2011)\n    `doi:10.1142/S0218127411029021\n    <http://dx.doi.org/10.1142/S0218127411029021>`__\n\n.. [Donner2011b] R.V. Donner, J. Heitzig, J.F. Donges, Y. Zou, J. Kurths.\n    \"The geometry of chaotic dynamics -- A complex network perspective\".\n    In *European Physical Journal B: Condensed Matter and Complex Systems*,\n    vol. 84 (no. 4), p653-672 (2011)\n    `doi:10.1140/epjb/e2011-10899-1\n    <http://dx.doi.org/10.1140/epjb/e2011-10899-1>`__\n\n.. [Donges2011b] J.F. Donges, R.V. Donner, K. Rehfeld, N. Marwan, M.H.\n    Trauth, J. Kurths.\n    \"Identification of dynamical transitions in marine palaeoclimate records\n    by recurrence network analysis\".\n    In *Nonlinear Processes in Geophysics*, vol. 18 (no. 5), p545-562 (2011)\n    `doi:10.5194/npg-18-545-2011\n    <http://dx.doi.org/10.5194/npg-18-545-2011>`__\n\n.. [Donges2011c] J.F. Donges, R.V. Donner, M.H. Trauth, N. Marwan, H.J.\n    Schellnhuber, J. Kurths.\n    \"Nonlinear detection of paleoclimate-variability transitions possibly\n    related to human evolution\".\n    In *Proceedings of the National Academy of Sciences of the United States of\n    America*, vol. 108 (no. 51), p20422-20427 (2011)\n    `doi:10.1073/pnas.1117052108\n    <http://dx.doi.org/10.1073/pnas.1117052108>`__\n\n.. [Donges2012] J.F. Donges, J. Heitzig, R.V. Donner, J. Kurths.\n    \"Analytical framework for recurrence network analysis of time series\".\n    In *Physical Review E: Statistical, Nonlinear, and Soft Matter Physics*,\n    vol. 85, 046105 (2012)\n    `doi:10.1103/PhysRevE.85.046105\n    <http://dx.doi.org/10.1103/PhysRevE.85.046105>`__\n\n.. [Zou2012] Y. Zou, J. Heitzig, R.V. Donner, J.F. Donges, J.D. Farmer, R.\n    Meucci, S. Euzzor, N. Marwan, J. Kurths.\n    \"Power-laws in recurrence networks from dynamical systems\".\n    In *Europhysics Letters*, vol. 98, 48001 (2012)\n    `doi:10.1209/0295-5075/98/48001\n    <http://dx.doi.org/10.1209/0295-5075/98/48001>`__\n\n.. [Feldhoff2012] J.H. Feldhoff, R.V. Donner, J.F. Donges, N. Marwan,\n    J. Kurths.\n    \"Geometric detection of coupling directions by means of inter-system\n    recurrence networks\".\n    In *Physics Letters A*, vol. 376, 3504-3513 (2012),\n    `doi:10.1016/j.physleta.2012.10.008\n    <http://dx.doi.org/10.1016/j.physleta.2012.10.008>`__\n\n.. [Feldhoff2013] J.H. Feldhoff, R.V. Donner, J.F. Donges, N. Marwan,\n    J. Kurths.\n    \"Geometric signature of complex synchronisation scenarios\".\n    In *Europhysics Letters* vol. 102, 30007 (2013),\n    `doi:10.1209/0295-5075/102/30007\n    <http://dx.doi.org/10.1209/0295-5075/102/30007>`__\n\n.. [Ngamga2007] E.J. Ngamga, A. Nandi, R. Ramaswamy, M.C. Romano, M. Thiel, J. Kurths.\n    \"Recurrence analysis of strange nonchaotic dynamics\".\n    In *Physical Review E*, vol. 75, 036222 (2007)\n    `doi:10.1103/PhysRevE.75.036222\n    <http://dx.doi.org/10.1103/PhysRevE.75.036222>`__\n\n.. [Xu2008] X. Xu, J. Zhang, M. Small.\n    \"Superfamily phenomena and motifs of networks induced from time series\".\n    In *Proceedings of the National Academy of Sciences of the United States of\n    America*, vol. 105 (no. 50) p19601-19605 (2008)\n    `doi:10.1073/pnas.0806082105\n    <http://dx.doi.org/10.1073/pnas.0806082105>`__\n\n.. [Schinkel2009] S. Schinkel, N. Marwan, O. Dimigen, J. Kurths.\n    \"Confidence bounds of recurrence-based complexity measures\".\n    In *Physics Letters A*, vol. 373 (no. 26) p2245–2250 (2009)\n    `doi:10.1016/j.physleta.2009.04.045\n    <http://dx.doi.org/10.1016/j.physleta.2009.04.045>`__\n\n\nVisibility graph analysis\n=========================\n- Introduction: [Lacasa2008]_.\n- Application to geophysical time series: [Donner2012]_.\n- Tests for time series irreversibility: [Donges2013]_.\n\n....\n\n.. [Lacasa2008] L. Lacasa, B. Luque, F. Ballesteros, J. Luque, J.C. Nuno.\n    \"From time series to complex networks: The visibility graph\".\n    In *Proceedings of the National Academy of Sciences of the United States of\n    America*, vol. 105 (no. 13), p4972-4975 (2008)\n    `doi:10.1073/pnas.0709247105 <http://dx.doi.org/10.1073/pnas.0709247105>`__\n\n.. [Donner2012] R.V. Donner and J.F. Donges.\n    \"Visibility graph analysis of geophysical time series: Potentials and\n    possible pitfalls\".\n    In *Acta Geophysica*, vol. 60 p589-623 (2012)\n    `doi:10.2478/s11600-012-0032-x\n    <http://dx.doi.org/10.2478/s11600-012-0032-x>`__\n\n.. [Donges2013] J.F. Donges, R.V. Donner, J. Kurths.\n    \"Testing time series irreversibility using complex network methods\".\n    In *Europhysics Letters*, vol. 102.1, 10004 (2013)\n    `doi:10.1209/0295-5075/102/10004\n    <http://dx.doi.org/10.1209/0295-5075/102/10004>`__\n"
  },
  {
    "path": "docs/source/sitemap.rst",
    "content": "\nSitemap\n=======\n\n.. toctree::\n    :maxdepth: 3\n\n    index\n    download\n    methods\n    tutorials\n    api_doc\n    publications\n    changelog\n    development\n    license\n    contact\n"
  },
  {
    "path": "docs/source/tutorials.rst",
    "content": "\nTutorials\n=========\n\nThe tutorials are designed to be self-explanatory, and are set up as Jupyter\nnotebooks that can be accessed read-only through the links below. The original,\nexecutable notebook files can be found in the folder ``pyunicorn/docs/source/examples``.\nFor further details on the used classes and methods, please refer to the\n:doc:`api_doc` documentation.\n\n.. toctree::\n    :maxdepth: 2\n    :glob:\n\n    examples/tutorials/*"
  },
  {
    "path": "pyproject.toml",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n\n# package ======================================================================\n\n[build-system]\nrequires = [\n  \"setuptools>=65\",\n  \"wheel\",\n  \"Cython>=3.0\",\n  \"numpy>=1.24\"\n]\nbuild-backend = \"setuptools.build_meta\"\n\n[project]\nname = \"pyunicorn\"\nversion = \"0.9.0\"\ndescription = \"Unified complex network and recurrence analysis toolbox\"\nkeywords = [\n  \"complex network\", \"nonlinear time series analysis\",\n  \"climate network\", \"recurrence plot\", \"surrogate model\"\n]\nreadme = \"README.rst\"\nauthors = [\n  { name = \"Jonathan F. Donges\", email = \"donges@pik-potsdam.de\" }\n]\nmaintainers = [\n  { name = \"Fritz Kühlein\", email = \"fritzku@pik-potsdam.de\" },\n  { name = \"Boyan Beronov\", email = \"beronov@cs.ubc.ca\" },\n]\nlicense = \"BSD-3-Clause\"\nlicense-files = [\"LICENSE.txt\"]\nclassifiers = [\n  \"Development Status :: 5 - Production/Stable\",\n  \"Environment :: Console\",\n  \"Intended Audience :: Developers\",\n  \"Intended Audience :: Science/Research\",\n  \"Topic :: Scientific/Engineering :: GIS\",\n  \"Topic :: Scientific/Engineering :: Information Analysis\",\n  \"Topic :: Scientific/Engineering :: Mathematics\",\n  \"Topic :: Scientific/Engineering :: Physics\",\n  \"Natural Language :: English\",\n  \"Operating System :: OS Independent\",\n  \"Programming Language :: Python :: 3 :: Only\",\n  \"Programming Language :: Python :: 3.10\",\n  \"Programming Language :: Python :: 3.11\",\n  \"Programming Language :: Python :: 3.12\",\n  \"Programming Language :: Python :: 3.13\",\n  \"Programming Language :: Python :: 3.14\",\n  \"Framework :: Pytest\",\n]\nrequires-python = \">=3.10\"\ndependencies = [\n  \"numpy >= 1.24\",\n  \"scipy >= 1.10\",\n  \"igraph >= 0.11\",\n  \"h5netcdf[h5py] >= 1.8\",\n  \"tqdm >= 4.66\",\n]\n\n[dependency-groups]\ndev = [\n  \"Cython >= 3.0\",\n]\ntests = [\n  \"tox >= 4.11\",\n  \"flake8 >= 7.0\",\n  \"Flake8-pyproject >= 1.2\",\n  \"pylint >= 3.0\",\n  \"pytest >= 8.0\",\n  \"pytest-xdist >= 3.5\",\n  \"pytest-cov >= 4.1\",\n  \"networkx >= 3.1\",\n  \"matplotlib >= 3.6\",\n  \"cartopy >= 0.21\",\n  \"requests\",\n  \"psutil\",\n]\ndocs = [\n  \"sphinx >= 7.0\",\n  \"nbsphinx >= 0.9.3\",\n  \"ipython >= 8.4\",\n  \"pandoc >= 2.3\",\n  \"matplotlib >= 3.6\",\n]\n\n[tool.uv]\ndefault-groups = [\"dev\", \"tests\", \"docs\"]\n\n[project.urls]\nHomepage = \"https://www.pik-potsdam.de/members/donges/software-2/software\"\nDocumentation = \"http://www.pik-potsdam.de/~donges/pyunicorn/\"\nRepository = \"https://github.com/pik-copan/pyunicorn\"\nChangelog = \"https://github.com/pik-copan/pyunicorn/blob/master/CHANGELOG.rst\"\nIssues = \"https://github.com/pik-copan/pyunicorn/issues\"\n\n[tool.setuptools]\ninclude-package-data = true\n\n[tool.setuptools.packages.find]\nwhere = [ \"src\" ]\ninclude = [ \"pyunicorn*\" ]\n\n# testing ======================================================================\n\n[tool.tox]\nenv_list = [\"style\", \"lint\", \"test\", \"docs\"]\nskipsdist = true\n\n[tool.tox.env_run_base]\nsitepackages = true\nset_env = { PYTHONPATH = \"{tox_root}/src\" }\npass_env = [\"WINDIR\", \"LC_ALL\"]\nallowlist_externals = [\"flake8\", \"pylint\", \"pytest\", \"sphinx-build\", \"pandoc\"]\n\n[tool.tox.env.style]\npackage = \"skip\"\ncommands = [[\n  \"flake8\", \"-j{env:TOX_JOBS:auto}\", \"setup.py\", \"src/pyunicorn\", \"tests\"\n]]\n\n[tool.tox.env.lint]\npackage = \"skip\"\ncommands = [[\n  \"pylint\", \"-j\", \"{env:TOX_JOBS:0}\", \"setup.py\", \"src/pyunicorn\", \"tests\"\n]]\n\n[tool.tox.env.test]\npackage = \"sdist\"\ncommands = [[\"pytest\", \"-n\", \"{env:TOX_JOBS:auto}\", \"--cov\"]]\n\n[tool.tox.env.docs]\npackage = \"sdist\"\ncommands = [[\n  \"sphinx-build\", \"-v\", \"-j\", \"{env:TOX_JOBS:8}\", \"-W\", \"-b\", \"html\",\n  \"-d\", \"{envtmpdir}/doctrees\", \"docs/source\", \"{envtmpdir}/html\"\n]]\n\n[tool.pytest.ini_options]\nminversion = 7.3\naddopts = \"-v -r a -n auto\"\ntestpaths = [\"tests\"]\npython_files = [\"test*.py\", \"Test*.py\"]\nnorecursedirs = [\".git\", \".cache\", \".tox\", \".ropeproject\", \"build\"]\nfilterwarnings = [\n  \"ignore:datetime.datetime.utcfromtimestamp():DeprecationWarning:dateutil|tqdm\",\n]\n\n[tool.coverage.run]\nparallel = true\nconcurrency = [\"multiprocessing\"]\nsource = [\"src/pyunicorn\"]\n\n# static analysis ==============================================================\n\n[tool.flake8]\nextend-exclude = [\n  \".git\", \".cache\", \".tox\", \".ropeproject\", \"build\", \"docs/source/conf.py\"\n]\nper-file-ignores = [\n  \"*/__init__.py:F401,F403\",\n]\nmax-line-length = 100\n\n[tool.pylint.main]\nignore = [\n  \".cache\", \"__pycache__\", \".pytest_cache\", \".tox\", \".venv\", \".ropeproject\",\n  \"build\", \"mpi.py\"\n]\nignore-patterns = [\"navigator\", \"numerics\"]\npersistent = false\njobs = 0\n\n[tool.pylint.\"messages control\"]\ndisable = [\n  \"duplicate-code\", \"invalid-name\", \"fixme\",\n  \"missing-docstring\", \"no-else-return\",\n  \"arguments-differ\", \"no-name-in-module\"\n]\n\n[tool.pylint.format]\nmax-module-lines = 6000\n\n[tool.pylint.refactoring]\nmax-nested-blocks = 6\n\n[tool.pylint.design]\nmax-args = 12\nmax-locals = 95\nmax-branches = 50\nmax-statements = 230\nmax-attributes = 23\nmax-public-methods = 120\n\n[tool.pylint.reports]\noutput-format = \"colorized\"\n"
  },
  {
    "path": "setup.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\n# pylint: disable=import-error\nfrom platform import system\nimport os\n\nfrom setuptools import setup, Extension\nfrom Cython.Build import cythonize\nimport numpy as np\n\n\n# =============================================================================\n\n\nwin = system() == 'Windows'\nc_args = {\n    'include_dirs': [np.get_include()],\n    'extra_compile_args': ['/O2'] if win else ['-O3', '-std=c99', '-Wall'],\n    'define_macros': [('_GNU_SOURCE', None),\n                      ('NPY_NO_DEPRECATED_API', 'NPY_1_7_API_VERSION')]}\ncy_args = {\n    'language_level': '3', 'embedsignature': True,\n    'boundscheck': True, 'wraparound': False,\n    'initializedcheck': True, 'nonecheck': True,\n    'warn.unused': True, 'warn.unused_arg': False, 'warn.unused_result': False}\n\n\n# =============================================================================\n\n\nextensions = [\n    Extension(\n        f'pyunicorn.{pkg}._ext.numerics',\n        sources=[f'src/pyunicorn/{pkg}/_ext/numerics.pyx'],\n        **c_args)\n    for pkg in ['climate', 'core', 'funcnet', 'timeseries']]\n\nsetup(ext_modules=cythonize(\n    extensions,\n    compiler_directives=cy_args,\n    nthreads=int(os.environ.get(\"TOX_JOBS\", len(extensions)))))\n"
  },
  {
    "path": "src/pyunicorn/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\npyunicorn\n=========\n\nSubpackages\n-----------\ncore\n    Spatially embedded complex networks and multivariate data\nclimate\n    Climate networks\nfuncnet\n    Functional networks\ntimeseries\n    Time series surrogates\n\"\"\"\n\nfrom .version import __version__\nfrom .utils import mpi\nfrom .core import *\n"
  },
  {
    "path": "src/pyunicorn/climate/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nclimate\n=======\n\nProvides classes for generating and analyzing complex climate networks.\n\nRelated Publications\n~~~~~~~~~~~~~~~~~~~~\n[Donges2009c]_, [Donges2009a]_, [Donges2009b]_, [Donges2011a]_, [Zou2011]_,\n[Tominski2011]_, [Heitzig2012]_\n\"\"\"\n\nfrom ..core import GeoNetwork, GeoGrid, Network\n\nfrom .climate_data import ClimateData\nfrom .climate_network import ClimateNetwork\nfrom .coupled_climate_network import CoupledClimateNetwork\nfrom .coupled_tsonis import CoupledTsonisClimateNetwork\nfrom .havlin import HavlinClimateNetwork\nfrom .hilbert import HilbertClimateNetwork\nfrom .map_plot import MapPlot\nfrom .mutual_info import MutualInfoClimateNetwork\nfrom .partial_correlation import PartialCorrelationClimateNetwork\nfrom .rainfall import RainfallClimateNetwork\nfrom .spearman import SpearmanClimateNetwork\nfrom .tsonis import TsonisClimateNetwork\nfrom .eventseries_climatenetwork import \\\n    EventSeriesClimateNetwork\n\n\n#\n#  Set global constants\n#\n\n#  Mean earth radius in kilometers\nfrom ..core import EARTH_RADIUS\n"
  },
  {
    "path": "src/pyunicorn/climate/_ext/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n"
  },
  {
    "path": "src/pyunicorn/climate/_ext/numerics.pyx",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\ncimport cython\n\nimport numpy as np\ncimport numpy as cnp\nfrom numpy cimport ndarray\n\nfrom ...core._ext.types import FIELD, INT64TYPE\nfrom ...core._ext.types cimport MASK_t, FIELD_t, INT64TYPE_t\n\ncdef extern from \"src_numerics.c\":\n    void _mutual_information(\n            float *anomaly, int n_samples, int N, int n_bins, double scaling,\n            double range_min, long *symbolic, long *hist, long *hist2d,\n            float *mi)\n    void _spearman_corr(int m, int tmax, bint *final_mask,\n            float *time_series_ranked, float *spearman_rho)\n\n\n# mutual_info =================================================================\n\n\ndef mutual_information(\n    ndarray[FIELD_t, ndim=2, mode='c'] anomaly not None,\n    int n_samples, int N, int n_bins, float scaling, float range_min):\n\n    cdef:\n        ndarray[INT64TYPE_t, ndim=2, mode='c'] symbolic = np.zeros(\n            (N, n_samples), dtype=INT64TYPE)\n        ndarray[INT64TYPE_t, ndim=2, mode='c'] hist = np.zeros(\n            (N, n_bins), dtype=INT64TYPE)\n        ndarray[INT64TYPE_t, ndim=2, mode='c'] hist2d = np.zeros(\n            (n_bins, n_bins), dtype=INT64TYPE)\n        ndarray[FIELD_t, ndim=2, mode='c'] mi = np.zeros(\n            (N, N), dtype=FIELD)\n\n    _mutual_information(\n        <FIELD_t*> cnp.PyArray_DATA(anomaly), n_samples, N, n_bins, scaling,\n        range_min, <long*> cnp.PyArray_DATA(symbolic),\n        <long*> cnp.PyArray_DATA(hist), <long*> cnp.PyArray_DATA(hist2d),\n        <FIELD_t*> cnp.PyArray_DATA(mi))\n\n    return mi\n\n\n# rainfall ====================================================================\n\n\ndef spearman_corr(int m, int tmax,\n    ndarray[MASK_t, ndim=2, mode='c'] final_mask not None,\n    ndarray[FIELD_t, ndim=2, mode='c'] time_series_ranked not None):\n\n    cdef ndarray[FIELD_t, ndim=2, mode='c'] spearman_rho = np.zeros(\n        (m, m), dtype=FIELD)\n\n    _spearman_corr(m, tmax,\n            <bint*> cnp.PyArray_DATA(final_mask),\n            <FIELD_t*> cnp.PyArray_DATA(time_series_ranked),\n            <FIELD_t*> cnp.PyArray_DATA(spearman_rho))\n\n    return spearman_rho\n"
  },
  {
    "path": "src/pyunicorn/climate/climate_data.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex climate networks.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable\n\nimport numpy as np\nfrom numpy import random\n\nfrom ..core import Data\nfrom ..core.cache import Cached\n\n\nclass ClimateData(Data, Cached):\n\n    \"\"\"\n    Encapsulates spatio-temporal climate data.\n\n    Provides methods to manipulate this data, i.e. calculate daily (monthly)\n    mean values and anomaly values.\n\n    @ivar data_source: (string) - The name of the data source\n                                  (model, reanalysis, station)\n    \"\"\"\n\n    #\n    #  Defines internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, observable, grid, time_cycle, anomalies=False,\n                 observable_name=\"\", observable_long_name=None, window=None,\n                 silence_level=0):\n        \"\"\"\n        Initialize an instance of ClimateData.\n\n        The spatio-temporal window is described by the following\n        dictionary::\n\n            window = {\"time_min\": 0., \"time_max\": 0., \"lat_min\": 0.,\n                      \"lat_max\": 0., \"lon_min\": 0., \"lon_max\": 0.}\n\n        :type observable: 2D array [time, index]\n        :arg observable: The array of time series to be represented by the\n            :class:`.Data` instance.\n        :type grid: :class:`.Grid2D` instance\n        :arg grid: The Grid representing the spatial coordinates associated to\n            the time series and their temporal sampling.\n        :arg int time_cycle: The annual cycle length of the data (units of\n            samples).\n        :arg bool anomalies: Indicates whether the data are climatological\n            anomaly values.\n        :arg str observable_name: A short name for the observable.\n        :arg str observable_long_name: A long name for the observable.\n        :arg dict window: Spatio-temporal window to select a view on the data.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        self._mut_window = 0\n        \"\"\"mutation count\"\"\"\n\n        Data.__init__(self, observable=observable, grid=grid,\n                      observable_name=observable_name,\n                      observable_long_name=observable_long_name,\n                      window=window, silence_level=silence_level)\n\n        #  Set class variables\n        self.time_cycle = time_cycle\n        \"\"\"(number (int)) - The annual cycle length of the data\n                            (units of samples).\"\"\"\n\n        self.data_source = \"\"\n\n        # If data are anomalies skip automatic calculation of anomalies\n        self.anomalies = anomalies\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        # The following attributes are assumed immutable:\n        #   (_full_observable)\n        return (self._mut_window,)\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation.\n        \"\"\"\n        return 'ClimateData:\\n' + Data.__str__(self)\n\n    #\n    #  Define alternative constructors\n    #\n\n    @classmethod\n    # pylint: disable=too-many-positional-arguments\n    def Load(cls, file_name, observable_name, file_type=\"NetCDF\",\n             dimension_names=None, window=None, vertical_level=None,\n             silence_level=0, time_cycle=None, data_source=None):\n        \"\"\"\n        Initialize an instance of ClimateData.\n\n        Supported file types ``file_type`` are:\n          - \"NetCDF\" for regular (rectangular) grids\n          - \"iNetCDF\" for irregular (e.g. geodesic) grids or station data.\n\n        The :index:`spatio-temporal window` is described by the following\n        dictionary::\n\n            window = {\"time_min\": 0., \"time_max\": 0., \"lat_min\": 0.,\n                      \"lat_max\": 0., \"lon_min\": 0., \"lon_max\": 0.}\n\n        :arg str file_name: The name of the data file.\n        :arg str observable_name: The short name of the observable within data\n            file (particularly relevant for NetCDF).\n        :arg str file_type: The format of the data file.\n        :arg dict dimension_names: The names of the dimensions as used in the\n            NetCDF file. Default: {\"lat\": \"lat\", \"lon\": \"lon\", \"time\": \"time\"}\n        :arg dict window: Spatio-temporal window to select a view on the data.\n        :arg int vertical_level: The vertical level to be extracted from the\n            data file. Is ignored for horizontal data sets. If None, the first\n            level in the data file is chosen.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        :arg int time_cycle: The annual cycle length of the data (units of\n            samples). NOTE: This is a required argument!\n        :arg str data_source: The name of the data source (model, reanalysis,\n            station).\n        \"\"\"\n        if time_cycle is None:\n            raise TypeError(\"ClimateData.Load() is missing required \"\n                            \"keyword argument: 'time_cycle'\")\n\n        if dimension_names is None:\n            dimension_names = {\"lat\": \"lat\", \"lon\": \"lon\", \"time\": \"time\"}\n\n        #  Load data using _load_data method from parent class\n        res = cls._load_data(file_name=file_name, file_type=file_type,\n                             dimension_names=dimension_names,\n                             observable_name=observable_name,\n                             vertical_level=vertical_level)\n\n        #  Create instance of ClimateData\n        data = cls(observable=res[\"observable\"], grid=res[\"grid\"],\n                   time_cycle=time_cycle,\n                   observable_name=res[\"observable_name\"],\n                   observable_long_name=res[\"observable_long_name\"],\n                   window=window, silence_level=silence_level)\n\n        #  Set class variables\n        data.file_name = file_name\n        data.file_type = file_type\n        data.vertical_level = vertical_level\n        data.data_source = data_source\n\n        return data\n\n    @staticmethod\n    def SmallTestData():\n        \"\"\"\n        Return test data set of 6 time series with 10 sampling points each.\n\n        **Example:**\n\n        >>> r(Data.SmallTestData().observable())\n        array([[ 0.    ,  1.    ,  0.    , -1.    , -0.    ,  1.    ],\n               [ 0.309 ,  0.9511, -0.309 , -0.9511,  0.309 ,  0.9511],\n               [ 0.5878,  0.809 , -0.5878, -0.809 ,  0.5878,  0.809 ],\n               [ 0.809 ,  0.5878, -0.809 , -0.5878,  0.809 ,  0.5878],\n               [ 0.9511,  0.309 , -0.9511, -0.309 ,  0.9511,  0.309 ],\n               [ 1.    ,  0.    , -1.    , -0.    ,  1.    ,  0.    ],\n               [ 0.9511, -0.309 , -0.9511,  0.309 ,  0.9511, -0.309 ],\n               [ 0.809 , -0.5878, -0.809 ,  0.5878,  0.809 , -0.5878],\n               [ 0.5878, -0.809 , -0.5878,  0.809 ,  0.5878, -0.809 ],\n               [ 0.309 , -0.9511, -0.309 ,  0.9511,  0.309 , -0.9511]])\n\n        :rtype: ClimateData instance\n        :return: a ClimateData instance for testing purposes.\n        \"\"\"\n        data = Data.SmallTestData()\n\n        return ClimateData(observable=data.observable(), grid=data.grid,\n                           time_cycle=5, silence_level=2)\n\n    #\n    #  Define methods to work with (climatological) anomaly data\n    #\n\n    def phase_indices(self):\n        \"\"\"\n        Return time indices associated to all phases in the annual cycle.\n\n        In other words, provides all time indices falling into a particular\n        day, month etc. of the year.\n\n        Just includes measurements from years for which complete data exists.\n\n        .. note::\n           Only the currently selected spatio-temporal window is considered.\n\n        .. note::\n           Only the currently selected spatio-temporal window is considered.\n\n        **Example:**\n\n        >>> ClimateData.SmallTestData().phase_indices()\n        array([[0, 5], [1, 6], [2, 7], [3, 8], [4, 9]])\n\n        :rtype: 2D Numpy array (int) [phase index, year]\n        :return: the time indices associated to all phases of the annual cycle.\n        \"\"\"\n        range_years = int(self.grid.grid_size()[\"time\"]\n                          / self.time_cycle)\n\n        phase_indices = np.zeros((self.time_cycle, range_years), dtype=int)\n\n        for i in range(self.time_cycle):\n            phase_indices[i, :] = np.arange(i, range_years * self.time_cycle,\n                                            self.time_cycle)\n\n        return phase_indices\n\n    def indices_selected_phases(self, selected_phases):\n        \"\"\"\n        Return sorted time indices associated to certain phase indices.\n\n        .. note::\n           Only the currently selected spatio-temporal window is considered.\n\n        **Example:**\n\n        >>> ClimateData.SmallTestData().indices_selected_phases([0,1,4])\n        array([0, 1, 4, 5, 6, 9])\n\n        :arg [int] selected_phases: The selected phase indices.\n        :rtype: 1D array (int)\n        :return: the sorted time indices corresponding to chosen phase indices.\n        \"\"\"\n        #  Get all\n        phase_indices = self.phase_indices()\n\n        #  Select time indices corresponding to chosen phase indices\n        selected_indices = phase_indices[selected_phases, :]\n\n        #  Flatten and sort selected time indices\n        selected_indices = selected_indices.flatten()\n        selected_indices.sort()\n\n        return selected_indices\n\n    def indices_selected_months(self, selected_months):\n        \"\"\"\n        Return sorted time indices associated to certain months.\n\n        Currently, only cycle lengths of 12 (monthly data) and 360\n        (standardized daily data) are supported.\n\n        .. note::\n           Only the currently selected spatio-temporal window is considered.\n\n        :arg [number] selected_months: The selected months.\n        :rtype: 1D array (int)\n        :return: the sorted time indices corresponding to chosen months.\n        \"\"\"\n        if self.time_cycle == 12:\n            return self.indices_selected_phases(selected_months)\n        elif self.time_cycle == 360:\n            selected_days = []\n            for month in selected_months:\n                for day in range(30):\n                    selected_days.append(month * 30 + day)\n\n            return self.indices_selected_phases(selected_days)\n        else:\n            raise NotImplementedError(\"Currently only time cycles 12 and 360 \\\n                                      are supported\")\n\n    @Cached.method(name=\"climatological mean values\")\n    def phase_mean(self):\n        \"\"\"\n        Calculate mean values of observable for each phase of the annual cycle.\n\n        This is also commonly referred to as climatological mean, e.g., the\n        mean temperature for all Januaries in the data set for monthly time\n        resolution (time_cycle=12).\n\n        .. note::\n           Only the currently selected spatio-temporal window is considered.\n\n        :rtype: 2D Numpy array [cycle index, node index]\n        :return: the mean values of observable for each phase of the annual\n                 cycle.\n\n        **Example:**\n\n        >>> r(ClimateData.SmallTestData().phase_mean())\n        array([[ 0.5   ,  0.5   , -0.5   , -0.5   ,  0.5   ,  0.5   ],\n               [ 0.63  ,  0.321 , -0.63  , -0.321 ,  0.63  ,  0.321 ],\n               [ 0.6984,  0.1106, -0.6984, -0.1106,  0.6984,  0.1106],\n               [ 0.6984, -0.1106, -0.6984,  0.1106,  0.6984, -0.1106],\n               [ 0.63  , -0.321 , -0.63  ,  0.321 ,  0.63  , -0.321 ]])\n        \"\"\"\n        observable = self.observable()\n        time_cycle = self.time_cycle\n        N = observable.shape[1]\n        phase_mean = np.zeros((time_cycle, N))\n\n        #  Calculate mean value for each day (month) on each node\n        for i in range(time_cycle):\n            phase_mean[i, :] = observable[i::time_cycle, :].mean(axis=0)\n        return phase_mean\n\n    @Cached.method(name=\"daily (monthly) anomaly values\")\n    def anomaly(self):\n        \"\"\"\n        Calculate anomaly time series from observable.\n\n        To obtain climatological anomaly time series, the climatological means\n        are subtracted from each sample in the original time series. This\n        procedure is also known as phase averaging.\n\n        .. note::\n           Only the currently selected spatio-temporal window is considered.\n\n        :rtype: 2D Numpy array [time, node index]\n        :return: the anomalized time series.\n\n        **Example:**\n\n        >>> r(ClimateData.SmallTestData().anomaly()[:,0])\n        array([-0.5 , -0.321 , -0.1106,  0.1106,  0.321 ,\n                0.5 ,  0.321 ,  0.1106, -0.1106, -0.321 ])\n        \"\"\"\n        # If data are anomalies skip automatic calculation of anomalies\n        if self.anomalies:\n            return self._full_observable\n\n        observable = self.observable()\n        time_cycle = self.time_cycle\n        anomaly = np.zeros(observable.shape)\n\n        #  Thanks to Jakob Runge\n        for i in range(time_cycle):\n            sample = observable[i::time_cycle, :]\n            anomaly[i::time_cycle, :] = sample - sample.mean(axis=0)\n        return anomaly\n\n    def anomaly_selected_months(self, selected_months):\n        \"\"\"\n        Return anomaly time series from observable for selected months.\n\n        For further comments, see :meth:`anomaly`.\n\n        .. note::\n           Only the currently selected spatio-temporal window is considered.\n\n        :arg [number] selected_months: The selected months.\n        :rtype:  2D array [time, node index]\n        :return: the anomalized time series for selected months.\n        \"\"\"\n        selected_indices = self.indices_selected_months(selected_months)\n        print(selected_indices)\n        return self.anomaly()[selected_indices, :]\n\n    def shuffled_anomaly(self):\n        \"\"\"\n        Return the randomly shuffled anomaly time series.\n\n        Each anomaly time series is shuffled individually.\n\n        .. note::\n           Only the currently selected spatio-temporal window is considered.\n\n        **Example** (Anomaly with and without temporal shuffling should have\n        the same standard deviation along time axis):\n\n        >>> r(ClimateData.SmallTestData().anomaly().std(axis=0))\n        array([ 0.31 , 0.6355, 0.31 , 0.6355, 0.31 , 0.6355])\n        >>> r(ClimateData.SmallTestData().shuffled_anomaly().std(axis=0))\n        array([ 0.31 , 0.6355, 0.31 , 0.6355, 0.31 , 0.6355])\n\n        :rtype: 2D Numpy array [time, node index]\n        :return: the anomalized and shuffled time series.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Shuffling anomaly time series for significance tests...\")\n\n        N = self.grid.grid_size()[\"space\"]\n        shuffled_anomaly = np.empty(self.anomaly().shape)\n\n        for i in range(N):\n            temp = self.anomaly()[:, i].copy()\n            random.shuffle(temp)\n            shuffled_anomaly[:, i] = temp\n\n        return shuffled_anomaly\n\n    def set_window(self, window):\n        \"\"\"\n        Set spatio-temporal window.\n\n        Calls set_window method of parent class Data and additionally sets\n        flags, so that measures derived from data (mean, anomaly) will be\n        recalculated for new window.\n\n        The spatio-temporal window is described by the following dictionary::\n\n           window = {\"time_min\": 0., \"time_max\": 0., \"lat_min\": 0.,\n                     \"lat_max\": 0., \"lon_min\": 0., \"lon_max\": 0.}\n\n        If the temporal boundaries are equal, the data's full time range is\n        selected. If any of the two corresponding spatial boundaries are\n        equal, the data's full spatial extension is included.\n\n        For more information see :meth:`pyunicorn.Data.set_window`.\n\n        **Example:**\n\n        >>> data = ClimateData.SmallTestData()\n        >>> data.set_window(window={\"time_min\": 0., \"time_max\": 0.,\n        ...                 \"lat_min\": 10., \"lat_max\": 20.,\n        ...                 \"lon_min\": 5.,  \"lon_max\": 10.})\n        >>> r(data.anomaly())\n        array([[ 0.5   , -0.5   ], [ 0.321 , -0.63  ], [ 0.1106, -0.6984],\n               [-0.1106, -0.6984], [-0.321 , -0.63  ], [-0.5   ,  0.5   ],\n               [-0.321 ,  0.63  ], [-0.1106,  0.6984], [ 0.1106,  0.6984],\n               [ 0.321 ,  0.63  ]])\n\n        :type window: dictionary\n        :arg window: The spatio-temporal window to select a view on the data.\n        \"\"\"\n        Data.set_window(self, window)\n        # invalidate cache\n        self._mut_window += 1\n\n    def set_global_window(self):\n        \"\"\"\n        Set the view on the whole data set.\n\n        Select the full data set and creates a data array as well as\n        a corresponding Grid2D object to access this window from outside.\n\n        **Example** (Set smaller window and subsequently restore global\n        window):\n\n        >>> data = ClimateData.SmallTestData()\n        >>> data.set_window(window={\"time_min\": 0., \"time_max\": 4.,\n        ...                 \"lat_min\": 10., \"lat_max\": 20.,\n        ...                 \"lon_min\": 5.,  \"lon_max\": 10.})\n        >>> data.grid.grid()[\"lat\"]\n        array([ 10.,  15.], dtype=float32)\n        >>> data.set_global_window()\n        >>> data.grid.grid()[\"lat\"]\n        array([  0.,   5.,  10.,  15.,  20.,  25.], dtype=float32)\n        \"\"\"\n        Data.set_global_window(self)\n        # invalidate cache\n        self._mut_window += 1\n"
  },
  {
    "path": "src/pyunicorn/climate/climate_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex climate networks.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable, Callable\n\nimport numpy as np\nimport igraph\n\nfrom ..core.cache import Cached\nfrom ..core import GeoNetwork, GeoGrid\n\n\nclass ClimateNetwork(GeoNetwork):\n\n    \"\"\"\n    Encapsulates a similarity network embedded on a spherical surface.\n\n    Particularly provides functionality to generate a complex network from the\n    matrix of a similarity measure of time series.\n\n    The analysis of climate time series based on similarity networks was first\n    introduced in [Tsonis2004]_.\n    \"\"\"\n    #\n    #  Definitions of internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, grid: GeoGrid, similarity_measure: np.ndarray,\n                 threshold=None, link_density=None, non_local=False,\n                 directed=False, node_weight_type=\"surface\", silence_level=0):\n        \"\"\"\n        Initialize an instance of :class:`ClimateNetwork`.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos**2 lat)\n\n        :type grid: :class:`.GeoGrid`\n        :arg  grid: The GeoGrid object describing the network's spatial\n            embedding.\n        :type similarity_measure: 2D array [index, index]\n        :arg similarity_measure: The similarity measure for all pairs of nodes.\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg bool directed: Determines, whether the network is treated as\n            directed.\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        #  Initialize\n        assert isinstance(grid, GeoGrid)\n        self.grid: GeoGrid = grid\n        self.directed = directed\n        self.silence_level = silence_level\n\n        # mutation count\n        if not hasattr(self, \"_mut_clim\"):\n            self._mut_clim: int = 0\n        else:\n            self._mut_clim += 1\n\n        #  FIXME: Is taking the absolute value by default OK?\n        self._similarity_measure = np.abs(similarity_measure.astype(\"float32\"))\n        self._non_local = non_local\n        self.N = grid.N\n        self.node_weight_type = node_weight_type\n\n        #  Sets the threshold and generates the network by thresholding and\n        #  calling the \"constructor\" of parent class GeoNetwork.\n        if threshold is not None:\n            self.set_threshold(threshold)\n        elif link_density is not None:\n            self.set_link_density(link_density)\n        else:\n            print(\"Either threshold or link_density have to be prescribed \"\n                  \"for network construction!\")\n        GeoNetwork.__init__(self, adjacency=self.adjacency, grid=self.grid,\n                            directed=self.directed,\n                            node_weight_type=self.node_weight_type,\n                            silence_level=self.silence_level)\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        return GeoNetwork.__cache_state__(self) + (self._mut_clim,)\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of the ClimateNetwork object.\n\n        **Example:**\n\n        >>> print(ClimateNetwork.SmallTestNetwork())\n        ClimateNetwork:\n        GeoNetwork:\n        Network: undirected, 6 nodes, 7 links, link density 0.467.\n        Geographical boundaries:\n                 time     lat     lon\n           min    0.0    0.00    2.50\n           max    9.0   25.00   15.00\n        Threshold: 0.5\n        Local connections filtered out: False\n        \"\"\"\n        return (f'ClimateNetwork:\\n{GeoNetwork.__str__(self)}\\n' +\n                f'Threshold: {self.threshold()}\\n' +\n                f'Local connections filtered out: {self.non_local()}')\n\n    def _regenerate_network(self):\n        \"\"\"\n        Regenerate the current climate network according to a new similarity\n        measure.\n        \"\"\"\n        ClimateNetwork.__init__(self, grid=self.grid,\n                                similarity_measure=self._similarity_measure,\n                                threshold=self._threshold,\n                                link_density=self.link_density,\n                                non_local=self._non_local,\n                                directed=self.directed,\n                                node_weight_type=self.node_weight_type,\n                                silence_level=self.silence_level)\n\n    #\n    #  Load and save ClimateNetwork object\n    #\n\n    # pylint: disable=keyword-arg-before-vararg\n    def save(self, filename, fileformat=None, *args, **kwds):\n        \"\"\"\n        Save the ClimateNetwork object to files.\n\n        Unified writing function for graphs. Relies on and partially extends\n        the corresponding igraph function. Refer to igraph documentation for\n        further details on the various writer methods for different formats.\n\n        This method tries to identify the format of the graph given in\n        the first parameter (based on extension) and calls the corresponding\n        writer method.\n\n        Existing node and link attributes/weights are also stored depending\n        on the chosen file format. E.g., the formats GraphML and gzipped\n        GraphML are able to store both node and link weights.\n\n        .. note::\n           The similarity measure matrix and grid are not stored if\n           the corresponding filenames are None.\n\n        The remaining arguments are passed to the writer method without\n        any changes.\n\n        :arg tuple/list filename: Tuple or list of three strings, namely\n            the paths to the files where the Network object, the\n            GeoGrid object and the similarity measure matrix are to be stored.\n        :arg str fileformat: the format of the file (if one wants to override\n            the format determined from the filename extension, or the filename\n            itself is a stream). ``None`` means auto-detection.  Possible\n            values are: ``\"ncol\"`` (NCOL format), ``\"lgl\"`` (LGL format),\n            ``\"graphml\"``, ``\"graphmlz\"`` (GraphML and gzipped GraphML format),\n            ``\"gml\"`` (GML format), ``\"dot\"``, ``\"graphviz\"`` (DOT format, used\n            by GraphViz), ``\"net\"``, ``\"pajek\"`` (Pajek format), ``\"dimacs\"``\n            (DIMACS format), ``\"edgelist\"``, ``\"edges\"`` or ``\"edge\"`` (edge\n            list), ``\"adjacency\"`` (adjacency matrix), ``\"pickle\"`` (Python\n            pickled format), ``\"svg\"`` (Scalable Vector Graphics).\n        :arg str filename_similarity_measure:  The name of the file where the\n            similarity measure matrix is to be stored.\n        \"\"\"\n        try:\n            (filename_network, filename_grid,\n             filename_similarity_measure) = filename\n        except ValueError as e:\n            raise ValueError(\"'filename' must be a tuple or list of three \"\n                             \"items: filename_network, filename_grid, \"\n                             \"filename_similarity_measure\") from e\n\n        #  Store GeoNetwork\n        GeoNetwork.save(self, filename=(filename_network, filename_grid),\n                        fileformat=fileformat,\n                        *args, **kwds)\n\n        #  Store similarity measure\n        if filename_similarity_measure is not None:\n            similarity_measure = self.similarity_measure()\n            similarity_measure.dump(filename_similarity_measure)\n\n    # pylint: disable=keyword-arg-before-vararg\n    @staticmethod\n    def Load(filename, fileformat=None, silence_level=0, *args, **kwds):\n        \"\"\"\n        Return a ClimateNetwork object stored in files.\n\n        Unified reading function for graphs. Relies on and partially extends\n        the corresponding igraph function. Refer to igraph documentation for\n        further details on the various reader methods for different formats.\n\n        This method tries to identify the format of the graph given in\n        the first parameter and calls the corresponding reader method.\n\n        Existing node and link attributes/weights are also restored depending\n        on the chosen file format. E.g., the formats GraphML and gzipped\n        GraphML are able to store both node and link weights.\n\n        The remaining arguments are passed to the reader method without\n        any changes.\n\n        :arg tuple/list filename: Tuple or list of three strings, namely\n            the paths to the files containing the Network object, the\n            GeoGrid object and the similarity measure matrix.\n            (filename_network, filename_grid, filename_similarity_measure)\n        :arg str fileformat: the format of the file (if known in advance)\n            ``None`` means auto-detection. Possible values are: ``\"ncol\"``\n            (NCOL format), ``\"lgl\"`` (LGL format), ``\"graphml\"``,\n            ``\"graphmlz\"`` (GraphML and gzipped GraphML format), ``\"gml\"`` (GML\n            format), ``\"net\"``, ``\"pajek\"`` (Pajek format), ``\"dimacs\"``\n            (DIMACS format), ``\"edgelist\"``, ``\"edges\"`` or ``\"edge\"`` (edge\n            list), ``\"adjacency\"`` (adjacency matrix), ``\"pickle\"`` (Python\n            pickled format).\n        :return: :class:`ClimateNetwork` instance.\n        \"\"\"\n        try:\n            (filename_network, filename_grid,\n             filename_similarity_measure) = filename\n        except ValueError as e:\n            raise ValueError(\"'filename' must be a tuple or list of three \"\n                             \"items: filename_network, filename_grid, \"\n                             \"filename_similarity_measure\") from e\n\n        #  Load GeoGrid object\n        grid = GeoGrid.Load(filename_grid)\n\n        #  Load similarity measure\n        similarity_measure = np.load(filename_similarity_measure)\n\n        #  Load to igraph Graph object\n        graph = igraph.Graph.Read(f=filename_network, format=fileformat,\n                                  *args, **kwds)\n\n        #  Extract adjacency matrix\n        A = np.array(graph.get_adjacency(type=2).data)\n\n        #  Extract node weights\n        if \"node_weight_nsi\" in graph.vs.attribute_names():\n            node_weights = np.array(\n                graph.vs.get_attribute_values(\"node_weight_nsi\"))\n        else:\n            node_weights = None\n\n        #  Create ClimateNetwork instance\n        net = ClimateNetwork(grid=grid, similarity_measure=similarity_measure,\n                             directed=graph.is_directed(),\n                             silence_level=silence_level)\n        net.adjacency = A\n        net.node_weights = node_weights\n\n        #  Overwrite igraph Graph object in Network instance to restore link\n        #  attributes/weights\n        net.graph = graph\n        #  invalidate cache\n        net._mut_la += 1\n        return net\n\n    #\n    #  Methods for testing purposes\n    #\n\n    @staticmethod\n    def SmallTestNetwork():\n        \"\"\"\n        Return a 6-node undirected test climate network from a similarity\n        matrix.\n\n        The network looks like this::\n\n                3 - 1\n                |   | \\\\\n            5 - 0 - 4 - 2\n\n        **Example:**\n\n        >>> r(ClimateNetwork.SmallTestNetwork().adjacency)\n        array([[0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 1, 0], [0, 1, 0, 0, 1, 0],\n               [1, 1, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0]])\n\n        :rtype: :class:`.Network` instance\n        \"\"\"\n        return ClimateNetwork(grid=GeoGrid.SmallTestGrid(),\n                              similarity_measure=np.array(\n                                  [[1.0, 0.1, 0.2, 0.6, 0.7, 0.55],\n                                   [0.1, 1.0, 0.55, 0.9, 1.0, 0.3],\n                                   [0.2, 0.55, 1.0, 0.2, 0.8, 0.1],\n                                   [0.6, 0.9, 0.1, 1.0, 0.1, 0.3],\n                                   [0.7, 1.0, 0.8, 0.1, 1.0, 0.4],\n                                   [0.55, 0.3, 0.1, 0.3, 0.4, 1.0]]),\n                              threshold=0.5,\n                              directed=False,\n                              silence_level=2)\n\n    #\n    #  Methods related to fixing link density\n    #\n\n    def link_density_function(self, n_bins):\n        \"\"\"\n        Return the network's link density as a function of the threshold.\n\n        **Example:**\n\n        >>> r(ClimateNetwork.SmallTestNetwork().\\\n                link_density_function(3)[0])\n        array([ 0. , 0.3889, 0.6667])\n        >>> r(ClimateNetwork.SmallTestNetwork().\\\n                link_density_function(3)[1])\n        array([ 0.1, 0.4, 0.7, 1. ])\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of bins.\n\n        :rtype: tuple of two 1D Numpy arrays [bin]\n        :return: the network's link density in dependence on threshold.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculate the link density function...\")\n\n        #  Get the histogram of the correlation measure\n        (hist, threshold) = np.histogram(self.similarity_measure(),\n                                         bins=n_bins)\n\n        #  Normalize histogram\n        hist = hist.astype(\"float64\")\n        hist /= hist.sum()\n\n        link_density_function = np.empty(n_bins)\n\n        #  Calculate the link density function\n        for i in range(n_bins):\n            link_density_function[i] = hist[:i].sum()\n\n        return (link_density_function, threshold)\n\n    def threshold_from_link_density(self, link_density):\n        \"\"\"\n        Return the threshold for network construction given link density.\n\n        **Example:**\n\n        >>> r(ClimateNetwork.SmallTestNetwork().\\\n                threshold_from_link_density(link_density=0.5))\n        0.4\n\n        :type link_density: number (float)\n        :arg link_density: The networks's desired link density.\n\n        :rtype: number (float)\n        :return: The threshold of similarity measure, above which\n                 two nodes are linked in the network.\n        \"\"\"\n        #  Flatten and sort correlation measure matrix\n        flat_corr = self.similarity_measure().copy()\n        flat_corr = flat_corr.flatten()\n        flat_corr.sort()\n\n        #  Get threshold, exclude the entries on the main diagonal here,\n        #  since they will not be included in the network anyways!\n        threshold = flat_corr[int((1-link_density) * (len(flat_corr)-self.N))]\n\n        #  Clean up\n        del flat_corr\n\n        return threshold\n\n    #\n    #  Generate adjacency matrix from correlation measure\n    #\n\n    def _calculate_threshold_adjacency(self, similarity_measure, threshold):\n        \"\"\"\n        Extract the network's adjacency matrix by thresholding.\n\n        The resulting network is a simple graph, i.e., self-loops and\n        multiple links are not allowed.\n\n        **Example** (Threshold zero should yield a fully connected network\n        given the test similarity matrix):\n\n        >>> net = ClimateNetwork.SmallTestNetwork()\n        >>> net._calculate_threshold_adjacency(\n        ...     similarity_measure=net.similarity_measure(), threshold=0.0)\n        array([[0, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1],\n               [1, 1, 0, 1, 1, 1], [1, 1, 1, 0, 1, 1],\n               [1, 1, 1, 1, 0, 1], [1, 1, 1, 1, 1, 0]], dtype=int8)\n\n        :type similarity_measure: 2D Numpy array [index, index]\n        :arg  similarity_measure: The similarity measure for all pairs of\n                                  nodes.\n\n        :type threshold: number (float)\n        :arg  threshold: The threshold of similarity measure, above which\n                         two nodes are linked in the network.\n\n        :rtype:  2D Numpy array (int8) [index, index]\n        :return: the network's adjacency matrix.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Extracting network adjacency matrix by thresholding...\")\n\n        N = similarity_measure.shape[0]\n        A = np.zeros((N, N), dtype=\"int8\")\n        A[similarity_measure > threshold] = 1\n\n        #  Set the diagonal of the adjacency matrix to zero -> no self loops\n        #  allowed.\n        A.flat[::N+1] = 0\n\n        return A\n\n    def _calculate_non_local_adjacency(self, similarity_measure, threshold,\n                                       a=20, d_min=0.05):\n        \"\"\"\n        Return the adjacency matrix with suppressed spatially local links.\n\n        Physically trivial links between geographically close nodes\n        are removed.\n\n        For large a, :math:`d_min` corresponds to the minimum distance for\n        which links are allowed to exist.\n\n        **Example:**\n\n        >>> net = ClimateNetwork.SmallTestNetwork()\n        >>> net._calculate_non_local_adjacency(\n        ...     similarity_measure=net.similarity_measure(),\n        ...     threshold=0.5, a=30, d_min=0.20)\n        array([[0, 0, 0, 1, 1, 1], [0, 0, 0, 0, 1, 0],\n               [0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0],\n               [1, 1, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0]], dtype=int8)\n\n        :type similarity_measure: 2D Numpy array [index, index]\n        :arg  similarity_measure: The similarity measure for all pairs of\n                                  nodes.\n\n        :type threshold: number (float)\n        :arg  threshold: The threshold of similarity measure, above which\n                        two nodes are linked in the network.\n\n        :type a: number (float)\n        :arg  a: The steepness parameter of the distance weighting function\n                 in the transition region from not including any links\n                 (weight=0) to including all links (weight=1).\n\n        :type d_min: number (float)\n        :arg  d_min: The parameter controlling the minimum distance, above\n                     which links can be included in the network\n                     (unit radians).\n\n        :rtype:  2D Numpy array (int8) [index, index]\n        :return: the network's adjacency matrix.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Extracting network adjacency matrix removing local \"\n                  \"connections...\")\n\n        weighted_similarity = similarity_measure * \\\n            (0.5 * (np.tanh(a * (self.grid.angular_distance() - d_min)) + 1))\n        # The above line is a function that provides a smooth\n        # transition of distance weight, centered around distance d_min.\n        # Other sigmoidal type functions could be used as well.\n\n        return self._calculate_threshold_adjacency(weighted_similarity,\n                                                   threshold)\n\n    def similarity_measure(self):\n        \"\"\"\n        Return the similarity measure used for network construction.\n\n        **Example:**\n\n        >>> r(ClimateNetwork.SmallTestNetwork().similarity_measure()[0,:])\n        array([ 1. , 0.1 , 0.2 , 0.6 , 0.7 , 0.55])\n\n        :rtype: 2D Numpy array [index, index]\n        :return: The similarity measure for all pairs of nodes.\n        \"\"\"\n        try:\n            return self._similarity_measure\n        except AttributeError as e:\n            raise AttributeError(\"Similarity matrix was deleted \"\n                                 \"earlier and cannot be retrieved.\") from e\n\n    def non_local(self):\n        \"\"\"\n        Indicate if links between spatially close nodes were suppressed.\n\n        **Example:**\n\n        >>> ClimateNetwork.SmallTestNetwork().non_local()\n        False\n\n        :return bool: Determines, whether links between spatially close nodes\n            should be suppressed.\n        \"\"\"\n        return self._non_local\n\n    def set_non_local(self, non_local):\n        \"\"\"\n        Toggle suppression of links between spatially close nodes.\n\n        **Example:**\n\n        >>> net = ClimateNetwork.SmallTestNetwork()\n        >>> net.set_non_local(non_local=True)\n        >>> r(net.adjacency)\n        array([[0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 1, 0],\n               [1, 1, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0]])\n\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        \"\"\"\n        #  Only change the network if there is a real change in non_local\n        if self.non_local() != non_local:\n            self._non_local = non_local\n            #  Regenerate the climate network using the new setting\n            self.set_threshold(self.threshold())\n\n    def threshold(self):\n        \"\"\"\n        Return the threshold used to generate the current climate network.\n\n        **Example:**\n\n        >>> ClimateNetwork.SmallTestNetwork().threshold()\n        0.5\n\n        :rtype: number (float)\n        :return: the threshold used to generate the current climate network.\n        \"\"\"\n        return self._threshold\n\n    def set_threshold(self, threshold):\n        \"\"\"\n        Generate climate network by thresholding similarity matrix.\n\n        **Example** (Number of links decreases as threshold increases):\n\n        >>> net = ClimateNetwork.SmallTestNetwork()\n        >>> net.n_links\n        7\n        >>> net.set_threshold(threshold=0.7)\n        >>> net.n_links\n        3\n\n        :type threshold: number (float)\n        :arg threshold: the threshold used to generate the current climate\n                          network.\n        \"\"\"\n        #  Set class variable _threshold\n        self._threshold = threshold\n\n        similarity = self.similarity_measure()\n\n        if self.non_local():\n            A = self._calculate_non_local_adjacency(similarity, threshold)\n        else:\n            A = self._calculate_threshold_adjacency(similarity, threshold)\n\n        #  Call constructor of parent class GeoNetwork\n        GeoNetwork.__init__(self, adjacency=A, grid=self.grid,\n                            directed=self.directed,\n                            node_weight_type=self.node_weight_type,\n                            silence_level=self.silence_level)\n\n    def set_link_density(self, link_density):\n        \"\"\"\n        Generate climate network by thresholding with prescribed link density.\n\n        .. note::\n           The desired link density can only be achieved approximately in most\n           cases.\n\n        **Example:**\n\n        >>> net = ClimateNetwork.SmallTestNetwork()\n        >>> r(net.link_density)\n        0.4667\n        >>> net.set_link_density(link_density=0.7)\n        >>> r(net.link_density)\n        0.6667\n\n        :type link_density: number (float)\n        :arg link_density: The networks's desired link density.\n        \"\"\"\n        threshold = self.threshold_from_link_density(link_density)\n        self.set_threshold(threshold)\n\n    @Cached.method()\n    def correlation_distance(self):\n        \"\"\"\n        Return correlation weighted distances between nodes.\n\n        Defined as the elementwise product of the correlation measure and\n        angular great circle distance matrices.\n\n        This is a useful measure of the relative importance of links,\n        since links with high geographical distance and high correlation\n        (teleconnections) get the highest weight. Trivial correlations with\n        small geographical distance and high correlation get a lower weight.\n\n        Correlation distance appears to be the simplest functional form of\n        combining geographical distance and correlation measure that yields\n        meaningful results.\n\n        **Example:**\n\n        >>> r(ClimateNetwork.SmallTestNetwork().correlation_distance(), 2)\n        array([[ 0.  , 0.01, 0.04, 0.18, 0.27, 0.27],\n               [ 0.01, 0.  , 0.05, 0.18, 0.29, 0.12],\n               [ 0.04, 0.05, 0.  , 0.02, 0.16, 0.03],\n               [ 0.18, 0.18, 0.01, 0.  , 0.01, 0.06],\n               [ 0.27, 0.29, 0.16, 0.01, 0.  , 0.04],\n               [ 0.27, 0.12, 0.03, 0.06, 0.04, 0.  ]])\n\n        :rtype: 2D matrix [index, index]\n        :return: the correlation distance matrix.\n        \"\"\"\n        return self.similarity_measure() * self.grid.angular_distance()\n\n    @Cached.method()\n    def inv_correlation_distance(self):\n        \"\"\"\n        Return correlation weighted distances between nodes.\n\n        :rtype: 2D matrix [index, index]\n        \"\"\"\n        m = self.correlation_distance()\n        np.fill_diagonal(m, np.inf)\n        self.set_link_attribute('inv_correlation_distance', 1 / m)\n        return 1 / m\n\n    #\n    #  Link weighted network measures\n    #\n\n    def correlation_distance_weighted_closeness(self):\n        \"\"\"\n        Return correlation distance weighted closeness.\n\n        Calculates the sequence of closeness centralities link-weighted by the\n        inverse of correlation distance between nodes. For closeness\n        centrality calculation, the inverse of correlation distance is used,\n        because high values of this measure should correspond to short\n        distances in the graph and vice versa when weighted shortest paths are\n        calculated.\n\n        **Example:**\n\n        >>> r(ClimateNetwork.SmallTestNetwork().\\\n                correlation_distance_weighted_closeness())\n        array([ 0.1646, 0.1351, 0.0894, 0.1096, 0.1659, 0.1102])\n\n        :rtype: 1D Numpy array [index]\n        :return: the correlation distance weighted closeness sequence.\n        \"\"\"\n        self.inv_correlation_distance()\n        return self.closeness('inv_correlation_distance')\n\n    def local_correlation_distance_weighted_vulnerability(self):\n        \"\"\"\n        Return local correlation distance weighted vulnerability.\n\n        Calculates the sequence of vulnerabilities link-weighted by the\n        inverse of correlation distance between nodes. For vulnerability\n        calculation, the inverse of correlation distance is used, because\n        high values of this measure should correspond to short distances in\n        the graph and vice versa when weighted shortest paths are calculated.\n\n        **Example:**\n\n        >>> r(ClimateNetwork.SmallTestNetwork().\\\n                local_correlation_distance_weighted_vulnerability())\n        array([ 0.4037, 0.035 , -0.1731, -0.081 , 0.3121, -0.0533])\n\n        :rtype: 1D Numpy array\n        :return: the local correlation distance weighted vulnerability\n                 sequence.\n        \"\"\"\n        self.inv_correlation_distance()\n        return self.local_vulnerability('inv_correlation_distance')\n\n    def _weighted_metric(self, attr: str, calc: Callable, metric: str):\n        if not self.find_link_attribute(attr):\n            self.set_link_attribute(attr, calc())\n        return getattr(self, metric)(attr)\n"
  },
  {
    "path": "src/pyunicorn/climate/coupled_climate_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex coupled climate networks.\n\"\"\"\n\nimport numpy as np\n\nfrom ..core import InteractingNetworks, GeoNetwork, GeoGrid\nfrom .climate_network import ClimateNetwork\n\n\nclass CoupledClimateNetwork(InteractingNetworks, ClimateNetwork):\n    \"\"\"\n    Encapsulates a coupled similarity network embedded on a spherical surface.\n\n    Particularly provides functionality to generate a complex network from the\n    matrix of a similarity measure of time series from two different\n    observables (temperature, pressure), vertical levels etc.\n\n    So far, most methods only give meaningful results for undirected networks!\n\n    The idea of coupled climate networks is based on the concept of coupled\n    patterns, for a review refer to [Bretherton1992]_.\n\n    .. note::\n       The two observables (layers) need to have the same time grid \\\n       (temporal sampling points).\n    \"\"\"\n    #\n    #  Definitions of internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, grid_1, grid_2, similarity_measure, threshold=None,\n                 link_density=None, non_local=False, directed=False,\n                 node_weight_type=\"surface\", silence_level=0):\n        \"\"\"\n        Initialize an instance of CoupledClimateNetwork.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos**2 lat)\n\n        :type grid_1: :class:`.GeoGrid`\n        :arg  grid_1: The GeoGrid object describing the first layer's spatial\n            embedding.\n        :type grid_2: :class:`.GeoGrid`\n        :arg  grid_2: The GeoGrid object describing the second layer's spatial\n            embedding.\n        :type similarity_measure: 2D array [index, index]\n        :arg similarity_measure: The similarity measure for all pairs of nodes.\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg bool directed: Determines, whether the network is treated as\n            directed.\n        :arg strnode_weight_type: The type of geographical node weight to be\n            used.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        #  Store single grids\n        self.grid_1 = grid_1\n        \"\"\"(Grid) - The GeoGrid object describing the first layer's spatial\n                    embedding.\"\"\"\n        self.grid_2 = grid_2\n        \"\"\"(Grid) - The GeoGrid object describing the second layer's spatial\n                    embedding.\"\"\"\n\n        #  Construct grid object describing both layers\n        time_1 = grid_1.grid()[\"time\"]\n        lat_1 = grid_1.grid()[\"lat\"]\n        lon_1 = grid_1.grid()[\"lon\"]\n\n        time_2 = grid_2.grid()[\"time\"]\n        lat_2 = grid_2.grid()[\"lat\"]\n        lon_2 = grid_2.grid()[\"lon\"]\n\n        if len(time_1) == len(time_2):\n            grid = GeoGrid(time_1, np.concatenate((lat_1, lat_2)),\n                           np.concatenate((lon_1, lon_2)))\n            #  Set total number of nodes\n            self.N = grid.N\n            \"\"\"(number (int)) - The total number of nodes in both layers.\"\"\"\n\n            #  Set number of nodes for both layers\n            self.N_1 = len(lat_1)\n            \"\"\"(number (int)) - The number of nodes in the first layer.\"\"\"\n            self.N_2 = len(lat_2)\n            \"\"\"(number (int)) - The number of nodes in the second layer.\"\"\"\n\n            #  Create lists of node indices for both layers\n            self.nodes_1 = list(range(self.N_1))\n            \"\"\"(list (int)) - List of node indices for first layer\"\"\"\n            self.nodes_2 = list(range(self.N_1, self.N))\n            \"\"\"(list (int)) - List of node indices for second layer\"\"\"\n\n            #  Call the constructor of the parent class ClimateNetwork\n            ClimateNetwork.__init__(self, grid=grid,\n                                    similarity_measure=similarity_measure,\n                                    threshold=threshold,\n                                    link_density=link_density,\n                                    non_local=non_local,\n                                    directed=directed,\n                                    node_weight_type=node_weight_type,\n                                    silence_level=silence_level)\n            InteractingNetworks.__init__(self, self.adjacency)\n        else:\n            print(\"The two observables (layers) have to have the same number \"\n                  \"of temporal sampling points!\")\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of CoupledClimateNetwork object.\n        \"\"\"\n        return (f'CoupledClimateNetwork:\\n{ClimateNetwork.__str__(self)}\\n'\n                f'N1: {self.N_1}\\nN2: self.N_2')\n\n    #\n    #  Define methods for handling the coupled network\n    #\n\n    def network_1(self):\n        \"\"\"\n        Return network consisting of layer 1 nodes and their internal links.\n\n        This can be used to conveniently analyze the layer 1 separately, e.g.,\n        for calculation network measures solely for layer 1.\n\n        :rtype: GeoNetwork\n        :return: the network consisting of layer 1 nodes and their internal\n                 links.\n        \"\"\"\n        return GeoNetwork(adjacency=self.adjacency_1(), grid=self.grid_1,\n                          directed=self.directed,\n                          node_weight_type=self.node_weight_type,\n                          silence_level=self.silence_level)\n\n    def network_2(self):\n        \"\"\"\n        Return network consisting of layer 2 nodes and their internal links.\n\n        This can be used to conveniently analyze the layer 2 separately, e.g.,\n        for calculation network measures solely for layer 2.\n\n        :rtype: GeoNetwork\n        :return: the network consisting of layer 2 nodes and their internal\n                 links.\n        \"\"\"\n        return GeoNetwork(adjacency=self.adjacency_2(), grid=self.grid_2,\n                          directed=self.directed,\n                          node_weight_type=self.node_weight_type,\n                          silence_level=self.silence_level)\n\n    def similarity_measure_1(self):\n        \"\"\"\n        Return internal similarity measure matrix of first layer.\n\n        :rtype: 2D Numpy array [index_1, index_1]\n        :return: the internal similarity measure matrix of first layer.\n        \"\"\"\n        return self.similarity_measure()[:self.N_1, :self.N_1]\n\n    def similarity_measure_2(self):\n        \"\"\"\n        Return internal similarity measure matrix of second layer.\n\n        :rtype: 2D Numpy array [index_2, index_2]\n        :return: the internal similarity measure matrix of first layer.\n        \"\"\"\n        return self.similarity_measure()[self.N_1:, self.N_1:]\n\n    def cross_similarity_measure(self):\n        \"\"\"\n        Return cross similarity measure matrix.\n\n        .. note::\n           Cross similarity measure matrix is NEITHER square NOR \\\n           symmetric in general!\n\n        :rtype: 2D Numpy array [index_1, index_2]\n        :return: the cross similarity measure matrix.\n        \"\"\"\n        return self.similarity_measure()[:self.N_1, self.N_1:]\n\n    def adjacency_1(self):\n        \"\"\"\n        Return internal adjacency matrix of first layer.\n\n        :rtype: 2D Numpy array [index_1, index_1]\n        :return: the internal adjacency matrix of first layer.\n        \"\"\"\n        return self.internal_adjacency(self.nodes_1)\n\n    def adjacency_2(self):\n        \"\"\"\n        Return internal adjacency matrix of second layer.\n\n        :rtype: 2D Numpy array [index_2, index_2]\n        :return: the internal adjacency matrix of second layer.\n        \"\"\"\n        return self.internal_adjacency(self.nodes_2)\n\n    def cross_layer_adjacency(self):\n        \"\"\"\n        Return cross adjacency matrix of the coupled network.\n\n        The cross adjacency matrix entry :math:`CA_{ij} = 1` describes that\n        node :math:`i` in the first layer is linked to node :math:`j` in the\n        second layer.  Vice versa, :math:`CA_{ji} = 1` indicates that node\n        :math:`j` in the first layer is linked to node :math:`i` in the second\n        layer.\n\n        .. note::\n           Cross adjacency matrix is **NEITHER** square **NOR** symmetric in\n           general!\n\n        :rtype: 2D Numpy array [index_1, index_2]\n        :return: the cross adjacency matrix.\n        \"\"\"\n        return self.cross_adjacency(node_list1=self.nodes_1,\n                                    node_list2=self.nodes_2)\n\n    def path_lengths_1(self, link_attribute=None):\n        \"\"\"\n        Return internal path length matrix of first layer.\n\n        Contains the paths length between all pairs of nodes within layer 1.\n        However, the paths themselves will generally contain nodes from both\n        layers. To avoid this and only consider paths lying within layer 1,\n        do the following::\n\n            net_1 = coupled_network.network_1()\n            path_lengths_1 = net_1.path_lengths(link_attribute)\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 2D array [index_1, index_1]\n        :return: the internal path length matrix of first layer.\n        \"\"\"\n        return self.internal_path_lengths(node_list=self.nodes_1,\n                                          link_attribute=link_attribute)\n\n    def path_lengths_2(self, link_attribute=None):\n        \"\"\"\n        Return internal path length matrix of second layer.\n\n        Contains the path lengths between all pairs of nodes within layer 2.\n        However, the paths themselves will generally contain nodes from both\n        layers. To avoid this and only consider paths lying within layer 2,\n        do the following::\n\n            net_2 = coupled_network.network_2()\n            path_lengths_2 = net_2.path_lengths(link_attribute)\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 2D array [index_2, index_2]\n        :return: the internal path length matrix of second layer.\n        \"\"\"\n        return self.internal_path_lengths(node_list=self.nodes_2,\n                                          link_attribute=link_attribute)\n\n    def cross_path_lengths(self, link_attribute=None):\n        \"\"\"\n        Return cross path length matrix.\n\n        Contains the path length between nodes from different layers. The paths\n        contain nodes from both layers.\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 2D array [index_1, index_2]\n        :return: the cross path length matrix.\n        \"\"\"\n        return InteractingNetworks.\\\n            cross_path_lengths(self, node_list1=self.nodes_1,\n                               node_list2=self.nodes_2,\n                               link_attribute=link_attribute)\n\n    def cross_link_distance(self):\n        \"\"\"\n        Return cross link distance matrix.\n\n        Contains the distance between nodes from different layers.\n\n        :rtype: 2D array [index_1, index_2]\n        :return: the cross link distance matrix.\n        \"\"\"\n        return self.distance()[self.nodes_1, :][:, self.nodes_2]\n\n    #\n    #  Define scalar coupled network statistics\n    #\n\n    def number_cross_layer_links(self):\n        \"\"\"\n        Return the number of links between the two layers.\n\n        :return int: the number of links between nodes from different layers.\n        \"\"\"\n        return self.number_cross_links(node_list1=self.nodes_1,\n                                       node_list2=self.nodes_2)\n\n    def number_internal_links(self):\n        \"\"\"\n        Return the number of links within each layer.\n\n        :rtype: (int, int)\n        :return: the number of links within each layer.\n        \"\"\"\n        n_links_1 = InteractingNetworks.number_internal_links(\n            self, self.nodes_1)\n        n_links_2 = InteractingNetworks.number_internal_links(\n            self, self.nodes_2)\n\n        return (n_links_1, n_links_2)\n\n    def cross_link_density(self):\n        \"\"\"\n        Return the density of links between the two layers.\n\n        :return float: the density of links between the two layers.\n        \"\"\"\n        return InteractingNetworks.cross_link_density(\n            self, node_list1=self.nodes_1, node_list2=self.nodes_2)\n\n    def internal_link_density(self):\n        \"\"\"\n        Return the density of links within the two layers.\n\n        :rtype: (float, float)\n        :return: the density of links within the two layers.\n        \"\"\"\n        density_1 = InteractingNetworks.\\\n            internal_link_density(self, self.nodes_1)\n        density_2 = InteractingNetworks.\\\n            internal_link_density(self, self.nodes_2)\n\n        return (density_1, density_2)\n\n    def internal_global_clustering(self):\n        \"\"\"\n        Return global clustering coefficients for each layer separately.\n\n        Internal global clustering coefficients are calculated as mean values\n        from the local clustering sequence of the whole coupled network. This\n        implies that triangles spanning both layers will generally contribute\n        to the internal clustering coefficients.\n\n        To avoid this and consider only triangles lying within each layer::\n\n            net_1 = coupled_network.network_1()\n            clustering_1 = net_1.global_clustering()\n            net_2 = coupled_network.network_2()\n            clustering_2 = net_2.global_clustering()\n\n        :rtype: (float, float)\n        :return: the internal global clustering coefficients.\n        \"\"\"\n        clustering_1 = InteractingNetworks.\\\n            internal_global_clustering(self, self.nodes_1)\n        clustering_2 = InteractingNetworks.\\\n            internal_global_clustering(self, self.nodes_2)\n\n        return (clustering_1, clustering_2)\n\n    def cross_global_clustering(self):\n        \"\"\"\n        Return global cross clustering for coupled network.\n\n        The global cross clustering coefficient C_v gives the average\n        probability, that two randomly drawn neighbors in layer 2 of node v in\n        layer 1 are also neighbors and vice versa. It counts triangles having\n        one vertex in layer 1 and two vertices in layer 2 and vice versa.\n\n        :rtype: (float, float)\n        :return: the cross global clustering coefficients.\n        \"\"\"\n        cc_12 = InteractingNetworks.cross_global_clustering(\n            self, node_list1=self.nodes_1, node_list2=self.nodes_2)\n        cc_21 = InteractingNetworks.cross_global_clustering(\n            self, node_list1=self.nodes_2, node_list2=self.nodes_1)\n\n        return (cc_12, cc_21)\n\n    def cross_transitivity(self):\n        \"\"\"\n        Return cross transitivity for coupled network.\n\n        The cross transitivity is the probability, that\n        two randomly drawn neighbors in layer 2 of node v in layer 1 are also\n        neighbors and vice versa. It counts triangles having one vertex in\n        layer 1 and two vertices in layer 2 and vice versa. Cross transitivity\n        tends to weight low cross degree vertices less strongly when compared\n        to the global cross clustering coefficient (see [Newman2003]_).\n\n        :rtype: (float, float)\n        :return: the cross transitivities.\n        \"\"\"\n        ct_12 = InteractingNetworks.cross_transitivity(\n            self, node_list1=self.nodes_1, node_list2=self.nodes_2)\n        ct_21 = InteractingNetworks.cross_transitivity(\n            self, node_list1=self.nodes_2, node_list2=self.nodes_1)\n        return (ct_12, ct_21)\n\n    def cross_average_link_distance(self, reverse=False):\n        \"\"\"\n        Return the cross average link distance\n\n        The cross average link distance is the average link distance of each\n        node of the first subnetwork to the nodes of the second subnetwork\n        it is connected to. If reverse is set to True, the method calculates\n        the average link distance of each node of the second subnetwork to the\n        nodes of the first subnetwork.\n\n        :arg bool reverse: Replace the subnetworks.\n\n        :rtype: 1D Numpy array\n        :return: the cross average link distances\n        \"\"\"\n        if reverse:\n            ax = 0\n        else:\n            ax = 1\n\n        adj = self.cross_layer_adjacency()\n        cld = self.cross_link_distance()\n        return np.sum(adj*cld, axis=ax) / np.sum(adj, axis=ax)\n\n    def cross_average_path_length(self, link_attribute=None):\n        \"\"\"\n        Return cross average path length.\n\n        Return the average (weighted) shortest path length between all pairs\n        of nodes from different layers only.\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :return float: the cross average path length.\n        \"\"\"\n        return InteractingNetworks.cross_average_path_length(\n            self, node_list1=self.nodes_1, node_list2=self.nodes_2,\n            link_attribute=link_attribute)\n\n    def internal_average_path_length(self, link_attribute=None):\n        \"\"\"\n        Return internal average path length.\n\n        Return the average (weighted) shortest path length between all pairs\n        of nodes within each layer separately for which a path exists. Paths\n        between nodes from different layers are not included in the averages!\n\n        However, even if the end points lie within the same layer, the paths\n        themselves will generally contain nodes from both layers. To avoid\n        this and only consider paths lying within layer i, do the following::\n\n            net_i = coupled_network.network_i()\n            path_lengths_i = net_i.path_lengths(link_attribute)\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: (float, float)\n        :return: the internal average path length.\n        \"\"\"\n        apl_1 = InteractingNetworks.internal_average_path_length(\n            self, node_list=self.nodes_1, link_attribute=link_attribute)\n        apl_2 = InteractingNetworks.internal_average_path_length(\n            self, node_list=self.nodes_2, link_attribute=link_attribute)\n\n        return (apl_1, apl_2)\n\n    #\n    #  Define local coupled network measures\n    #\n\n    def cross_degree(self):\n        \"\"\"\n        Return the cross degree sequences.\n\n        Gives the number of links from a specific node in one layer to the\n        other layer.\n\n        :rtype: tuple of two 1D arrays [index]\n        :return: the cross degree sequences.\n        \"\"\"\n        cross_degree_1 = InteractingNetworks.cross_degree(\n            self, node_list1=self.nodes_1, node_list2=self.nodes_2)\n        cross_degree_2 = InteractingNetworks.cross_degree(\n            self, node_list1=self.nodes_2, node_list2=self.nodes_1)\n        return (cross_degree_1, cross_degree_2)\n\n    def internal_degree(self):\n        \"\"\"\n        Return the internal degree sequences.\n\n        Gives the number of links from a specific node to other nodes within\n        the same layer.\n\n        :rtype: tuple of two 1D arrays [index]\n        :return: the internal degree sequences.\n        \"\"\"\n        degree_1 = InteractingNetworks.internal_degree(\n            self, node_list=self.nodes_1)\n        degree_2 = InteractingNetworks.internal_degree(\n            self, node_list=self.nodes_2)\n        return (degree_1, degree_2)\n\n    def cross_local_clustering(self):\n        \"\"\"\n        Return local cross clustering for coupled network.\n\n        The local cross clustering coefficient C_v gives the probability, that\n        two randomly drawn neighbors in layer 2 of node v in layer 1 are also\n        neighbors and vice versa. It counts triangles having one vertex in\n        layer 1 and two vertices in layer 2 and vice versa.\n\n        :rtype: tuple of two 1D arrays [index]\n        :return: the cross local clustering coefficients.\n        \"\"\"\n        cc_12 = InteractingNetworks.cross_local_clustering(\n            self, node_list1=self.nodes_1, node_list2=self.nodes_2)\n        cc_21 = InteractingNetworks.cross_local_clustering(\n            self, node_list1=self.nodes_2, node_list2=self.nodes_1)\n        return (cc_12, cc_21)\n\n    def cross_closeness(self, link_attribute=None):\n        \"\"\"\n        Return cross closeness sequence.\n\n        Gives the inverse average geodesic distance from a node in one layer\n        to all nodes in the other layer.\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: tuple of two 1D arrays [index]\n        :return: the cross closeness sequence.\n        \"\"\"\n        cc_12 = InteractingNetworks.cross_closeness(\n            self, node_list1=self.nodes_1, node_list2=self.nodes_2,\n            link_attribute=link_attribute)\n        cc_21 = InteractingNetworks.cross_closeness(\n            self, node_list1=self.nodes_2, node_list2=self.nodes_1,\n            link_attribute=link_attribute)\n        return (cc_12, cc_21)\n\n    def internal_closeness(self, link_attribute=None):\n        \"\"\"\n        Return internal closeness sequence.\n\n        Gives the inverse average geodesic distance from a node to all other\n        nodes in the same layer.\n\n        However, the included paths will generally contain nodes from both\n        layers. To avoid this, do the following::\n\n            net_i = coupled_network.network_i()\n            closeness_i = net_i.closeness(link_attribute)\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: tuple of two 1D arrays [index]\n        :return: the internal closeness sequence.\n        \"\"\"\n        closeness_1 = InteractingNetworks.internal_closeness(\n            self, node_list=self.nodes_1, link_attribute=link_attribute)\n        closeness_2 = InteractingNetworks.internal_closeness(\n            self, node_list=self.nodes_2, link_attribute=link_attribute)\n        return (closeness_1, closeness_2)\n\n    def cross_betweenness(self):\n        \"\"\"\n        Return the cross betweenness sequence.\n\n        Gives the normalized number of shortest paths only between nodes from\n        **different** layers, in which a node :math:`i` is contained. This is\n        equivalent to the inter-regional / inter-group betweenness with respect\n        to layer 1 and layer 2.\n\n        :rtype: tuple of two 1D arrays [index]\n        :return: the cross betweenness sequence.\n        \"\"\"\n        cb = InteractingNetworks.cross_betweenness(\n            self, node_list1=self.nodes_1, node_list2=self.nodes_2)\n        return (cb[self.nodes_1], cb[self.nodes_2])\n\n    def internal_betweenness_1(self):\n        \"\"\"\n        Return the internal betweenness sequences for layer 1.\n\n        Gives the normalized number of shortest paths only between nodes from\n        layer 1, in which a node :math:`i` is contained. :math:`i` can be\n        member of any of the two layers. This is equivalent to the\n        inter-regional / inter-group betweenness with respect to layer 1 and\n        layer 1.\n\n        :rtype: tuple of two 1D arrays [index]\n        :return: the internal betweenness sequence for layer 1.\n        \"\"\"\n        ib = self.internal_betweenness(self.nodes_1)\n\n        return (ib[self.nodes_1], ib[self.nodes_2])\n\n    def internal_betweenness_2(self):\n        \"\"\"\n        Return the internal betweenness sequences for layer 2.\n\n        Gives the normalized number of shortest paths only between nodes from\n        layer 2, in which a node :math:`i` is contained. :math:`i` can be\n        member of any of the two layers. This is equivalent to the\n        inter-regional / inter-group betweenness with respect to layer 2 and\n        layer 2.\n\n        :rtype: tuple of two 1D arrays [index]\n        :return: the internal betweenness sequence for layer 2.\n        \"\"\"\n        ib = self.internal_betweenness(self.nodes_2)\n\n        return (ib[self.nodes_1], ib[self.nodes_2])\n"
  },
  {
    "path": "src/pyunicorn/climate/coupled_tsonis.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex coupled climate networks.\n\"\"\"\n\nimport numpy as np\n\nfrom .coupled_climate_network import CoupledClimateNetwork\n\n\n# pylint: disable=too-many-ancestors\nclass CoupledTsonisClimateNetwork(CoupledClimateNetwork):\n\n    \"\"\"\n    Encapsulates a coupled similarity network embedded on a spherical surface.\n\n    Particularly provides functionality to generate a complex network from the\n    Pearson correlation matrix of time series from two different\n    observables (temperature, pressure), vertical levels etc.\n\n    Construct a static climate network following Tsonis et al. from the\n    Pearson correlation matrix at zero lag [Tsonis2004]_.\n\n    Hence, coupled Tsonis climate networks are undirected due to the symmetry\n    of the correlation matrix.\n\n    The idea of coupled climate networks is based on the concept of coupled\n    patterns, for a review refer to [Bretherton1992]_.\n\n    .. note::\n       The two observables (layers) need to have the same time grid \\\n       (temporal sampling points).\n    \"\"\"\n    #\n    #  Definitions of internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, data_1, data_2, threshold=None, link_density=None,\n                 non_local=False, node_weight_type=\"surface\",\n                 selected_months=None, silence_level=0):\n        \"\"\"\n        Initialize an instance of :class:`CoupledTsonisClimateNetwork`.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - ``None`` (constant unit weights)\n          - ``\"surface\"`` (cos lat)\n          - ``\"irrigation\"`` (cos**2 lat)\n\n        :type data_1: :class:`.ClimateData`\n        :arg data_1: The climate data for the first layer.\n        :type data_2: :class:`.ClimateData`\n        :arg data_2: The climate data for the second layer.\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        :arg [int ]selected_months: The months for which to calculate the\n            correlation matrix. The full time series are used for default value\n            None.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        self.silence_level = silence_level\n        \"\"\"(string) - The inverse level of verbosity of the object.\"\"\"\n\n        n_time_1 = data_1.grid.grid_size()[\"time\"]\n        n_time_2 = data_2.grid.grid_size()[\"time\"]\n\n        #  The time series from both observables have to have the same length\n        if n_time_1 == n_time_2:\n            #  Prepare\n            if selected_months is None:\n                anomaly_1 = data_1.anomaly()\n                anomaly_2 = data_2.anomaly()\n            else:\n                anomaly_1 = data_1.anomaly_selected_months(selected_months)\n                anomaly_2 = data_2.anomaly_selected_months(selected_months)\n\n            correlation = self._calculate_correlation(anomaly_1=anomaly_1,\n                                                      anomaly_2=anomaly_2)\n\n            #  Call the constructor of the parent class ClimateNetwork\n            CoupledClimateNetwork.__init__(self, grid_1=data_1.grid,\n                                           grid_2=data_2.grid,\n                                           similarity_measure=correlation,\n                                           threshold=threshold,\n                                           link_density=link_density,\n                                           non_local=non_local,\n                                           directed=False,\n                                           node_weight_type=node_weight_type,\n                                           silence_level=silence_level)\n        else:\n            print(\"\\nThe two observables (layers) have to have the same \"\n                  \"number of temporal sampling points!\\n\")\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of CoupledClimateNetwork object.\n        \"\"\"\n        return ('CoupledTsonisClimateNetwork:\\n'\n                f'{CoupledClimateNetwork.__str__(self)}')\n\n    #\n    #  Defines methods to calculate the correlation matrix\n    #\n\n    def _calculate_correlation(self, anomaly_1, anomaly_2):\n        \"\"\"\n        Return the correlation matrix at zero lag.\n\n        :type anomaly_1: 2D Numpy array (time, index_1)\n        :arg anomaly_1: the first set of anomaly time series from which to\n                        calculate the correlation matrix at zero lag.\n\n        :type anomaly_2: 2D Numpy array (time, index_2)\n        :arg anomaly_2: the second set of anomaly time series from which to\n                        calculate the correlation matrix at zero lag.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the correlation matrix at zero lag.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating correlation matrix at zero lag from anomaly \"\n                  \"values...\")\n\n        anomaly = np.concatenate((anomaly_1, anomaly_2), axis=1)\n\n        #  Cast to float32 type to save memory since correlation coefficients\n        #  are not needed in high floating point precision.\n        correlation = np.corrcoef(anomaly.transpose()).astype(\"float32\")\n\n        return correlation\n\n    def calculate_similarity_measure(self, anomaly_1, anomaly_2):\n        \"\"\"\n        Encapsulate the calculation of the correlation matrix at zero lag.\n\n        :type anomaly_1: 2D Numpy array (time, index_1)\n        :arg anomaly_1: the first set of anomaly time series from which to\n                        calculate the correlation matrix at zero lag.\n\n        :type anomaly_2: 2D Numpy array (time, index_2)\n        :arg anomaly_2: the second set of anomaly time series from which to\n                        calculate the correlation matrix at zero lag.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the correlation matrix at zero lag.\n        \"\"\"\n        return self._calculate_correlation(anomaly_1, anomaly_2)\n\n    def correlation(self):\n        \"\"\"\n        Return the coupled correlation matrix at zero lag.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the correlation matrix at zero lag.\n        \"\"\"\n        return self.similarity_measure()\n"
  },
  {
    "path": "src/pyunicorn/climate/eventseries_climatenetwork.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides class for the analysis of dynamical systems and time series based\non event synchronization and event coincidence analysis\n\"\"\"\n\n# array object and fast numerics\nimport numpy as np\n\nfrom ..eventseries import EventSeries\nfrom .climate_network import ClimateNetwork\nfrom .climate_data import ClimateData\nfrom ..core import Data\n\n#\n#  Class definitions\n#\n\n\nclass EventSeriesClimateNetwork(EventSeries, ClimateNetwork):\n    \"\"\"\n    Class EventSeriesClimateNetwork for generating and quantitatively\n    analyzing event synchronisation and event coincidence analysis networks\n\n    References: [Boers2014]_.\n    \"\"\"\n\n    #\n    #  Internal methods\n\n    def __init__(self, data, method='ES', p_value=None, **kwargs):\n        r\"\"\"\n        Initialize an instance of EventSeriesClimateNetwork.\n\n        For other applications of event series networks please use\n        the EventSeries class together with the Network class.\n\n        :type data: :class:`..climate.ClimateData`\n        :arg data: The climate data used for network construction.\n        :type method: ``str {'ES', 'ECA', 'ES_pval', 'ECA_pval'}``\n        :arg method: determines if ES, ECA, or the p-values of one of the\n                     methods should be used for network reconstruction.\n        :type p_value: ``float in [0,1]``\n        :arg p_value: determines the p-value threshold for network\n                      reconstruction. ES/ECA scores of event time series pairs\n                      with p-value higher than threshold are set to zero\n                      leading to missing link in climate network.\n                      Default: None. No p-value thresholding.\n        :arg \\**kwargs:\n            optional keyword arguments to specify parent classes' behavior,\n            see below for all options.\n\n        :Keyword Arguments:\n            * *taumax* (``float``) --\n              maximum time difference between two events to be\n              considered synchronous. Caution: For ES, the default is\n              np.inf because of the intrinsic dynamic coincidence\n              interval in ES. For ECA, taumax is a parameter of the\n              method that needs to be defined.\n            * *lag* (``float``) --\n              extra time lag between the event series.\n            * *symmetrization* (\n              ``str {'directed', 'symmetric', 'antisym',\n              'mean', 'max', 'min'}`` for ES,\n              str {'directed', 'mean', 'max', 'min'}`` for ECA\n              ) --\n              determines if and if true, which symmetrization\n              should be used for the ES/ECA score matrix.\n            * *window_type* (\n              ``str {'retarded', 'advanced', 'symmetric'}``\n              ) --\n              Only for ECA. Determines if precursor coincidence\n              rate ('advanced'), trigger coincidence rate\n              ('retarded') or a general coincidence rate with the\n              symmetric interval [-taumax, taumax] are computed\n              ('symmetric'). Default: 'symmetric'.\n            * *threshold_method* (\n              ``str 'quantile' or 'value' or\n              1D numpy array of 'quantile' or 'value'``\n              ) --\n              specifies the method for generating a binary\n              event matrix from an array of continuous time\n              series. Default: None.\n            * *threshold_values* (``1D Numpy array or float``) --\n              quantile or real number determining threshold\n              for each variable. Default: None.\n            * *threshold_types* (\n              ``str 'above' or 'below' or 1D list\n              of strings of 'above' or 'below'``\n              ) --\n              determines for each variable if event is below\n              or above threshold.\n            * *non_local* (``bool``) --\n              determines whether links between spatially close\n              nodes should be suppressed.\n            * *node_weight_type* (``str``) --\n              The type of geographical node weight to be\n              used.\n            * *arg silence_level* (``int``) --\n              The inverse level of verbosity of the object.\n        \"\"\"\n\n        # extract ES and CN related optional keyword arguments from **kwargs\n        ES_kwargs = {\n            \"taumax\": kwargs.get(\"taumax\", np.inf),\n            \"lag\": kwargs.get(\"lag\", 0.0),\n            \"threshold_method\": kwargs.get(\"threshold_method\", None),\n            \"threshold_values\": kwargs.get(\"threshold_values\", None),\n            \"threshold_types\": kwargs.get(\"threshold_types\", None)\n        }\n\n        ES_analysis_kwargs = {\n            \"symmetrization\": kwargs.get(\"symmetrization\", 'directed'),\n            \"window_type\": kwargs.get(\"window_type\", 'symmetric')\n        }\n\n        ES_significance_kwargs = {\n            \"surrogate\": kwargs.get(\"surrogate\", 'shuffle'),\n            \"n_surr\": kwargs.get(\"n_surr\", 1000),\n            \"symmetrization\": kwargs.get(\"symmetrization\", 'directed'),\n            \"window_type\": kwargs.get(\"window_type\", 'symmetric')\n        }\n\n        CN_kwargs = {\n            \"non_local\": kwargs.get(\"non_local\", False),\n            \"node_weight_type\": kwargs.get(\"node_weight_type\", \"surface\"),\n            \"silence_level\": kwargs.get(\"silence_level\", 0)\n        }\n\n        method_types = ['ES', 'ECA', 'ES_pval', 'ECA_pval']\n        if method not in method_types:\n            raise IOError(f\"Method input must be: \"\n                          f\"{method_types[0]}, {method_types[1]},\"\n                          f\"{method_types[2]}, or {method_types[3]}!\")\n\n        self.__method = method\n        self.__p_value = p_value\n\n        self.__symmetry = kwargs.get(\"symmetrization\", 'directed')\n        self.directed = self.__symmetry == \"directed\"\n\n        # Construct an EventSeries object with the chosen parameters\n        EventSeries.__init__(self, data.observable(), **ES_kwargs)\n\n        # Compute matrix for link weights of ClimateNetwork from event\n        # synchronization or event coincidence analysis with chosen symmetry\n        # option\n        measure_matrix = []\n\n        # If standard ES/ECA measure is chosen, calculate pairwise ES/ECA\n        # scores\n        if self.__method in ['ES', 'ECA']:\n            measure_matrix = \\\n                self.event_series_analysis(method=self.__method,\n                                           **ES_analysis_kwargs)\n\n            # Check if a p-value is chosen, then:\n            # Set all coupling strengths in the measure matrix with\n            # higher p-value to zero, leading to a missing edge in the climate\n            # network\n            if self.__p_value is not None:\n\n                if self.__p_value > 1.0 or self.__p_value < 0.0:\n                    raise IOError(\"'p_value' must lie in the unit interval!\")\n\n                significance_matrix = \\\n                    self.event_analysis_significance(\n                        method=self.__method, **ES_significance_kwargs)\n\n                for i in range(self.__N):\n                    for j in range(self.__N):\n                        if significance_matrix[i][j] < 1.0 - p_value:\n                            measure_matrix[i][j] = 0.0\n\n        elif self.__method in ['ES_pval', 'ECA_pval']:\n            measure_matrix = \\\n                self.event_analysis_significance(\n                    method=self.__method, **ES_significance_kwargs)\n\n        ClimateNetwork.__init__(self, grid=data.grid,\n                                similarity_measure=measure_matrix,\n                                threshold=0, directed=self.directed,\n                                **CN_kwargs)\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of EventSeriesClimateNetwork.\n\n        **Example:**\n\n        >>> data = EventSeriesClimateNetwork.SmallTestData()\n        >>> print(EventSeriesClimateNetwork(data, taumax=16.0,\n        >>>       threshold_method='quantile', threshold_value=0.8,\n        >>>       threshold_types='above'))\n        Extracting network adjacency matrix by thresholding...\n        Setting area weights according to type surface ...\n        Setting area weights according to type surface ...\n        EventSeriesClimateNetwork:\n        EventSeries: 6 variables, 10 timesteps, __taumax: 16.0, lag: 0.0\n        ClimateNetwork:\n        GeoNetwork:\n        Network: directed, 6 nodes, 0 links, link density 0.000.\n        Geographical boundaries:\n                 time     lat     lon\n           min    0.0    0.00    2.50\n           max    9.0   25.00   15.00\n        Threshold: 0\n        Local connections filtered out: False\n        Type of event series measure to construct\n        the network: directedES\n        \"\"\"\n        text = (\"EventSeriesClimateNetwork:\\n%s\\n%s\\n\"\n                \"Type of event series measure to construct the network: \"\n                \"%s%s\")\n        return text % (EventSeries.__str__(self),\n                       ClimateNetwork.__str__(self), self.__symmetry,\n                       self.__method)\n\n    @staticmethod\n    def SmallTestData():\n        \"\"\"\n        Return test data set of 6 time series with 10 sampling points each.\n\n        **Example:**\n\n        >>> r(Data.SmallTestData().observable())\n        array([[ 0.    ,  1.    ,  0.    , -1.    , -0.    ,  1.    ],\n               [ 0.309 ,  0.9511, -0.309 , -0.9511,  0.309 ,  0.9511],\n               [ 0.5878,  0.809 , -0.5878, -0.809 ,  0.5878,  0.809 ],\n               [ 0.809 ,  0.5878, -0.809 , -0.5878,  0.809 ,  0.5878],\n               [ 0.9511,  0.309 , -0.9511, -0.309 ,  0.9511,  0.309 ],\n               [ 1.    ,  0.    , -1.    , -0.    ,  1.    ,  0.    ],\n               [ 0.9511, -0.309 , -0.9511,  0.309 ,  0.9511, -0.309 ],\n               [ 0.809 , -0.5878, -0.809 ,  0.5878,  0.809 , -0.5878],\n               [ 0.5878, -0.809 , -0.5878,  0.809 ,  0.5878, -0.809 ],\n               [ 0.309 , -0.9511, -0.309 ,  0.9511,  0.309 , -0.9511]])\n\n        :rtype: ClimateData instance\n        :return: a ClimateData instance for testing purposes.\n        \"\"\"\n        data = Data.SmallTestData()\n\n        return ClimateData(observable=data.observable(), grid=data.grid,\n                           time_cycle=5, silence_level=2)\n"
  },
  {
    "path": "src/pyunicorn/climate/havlin.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex climate networks.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable\n\nimport numpy as np\nfrom tqdm import trange\n\nfrom .climate_data import ClimateData\nfrom .climate_network import ClimateNetwork\n\n\nclass HavlinClimateNetwork(ClimateNetwork):\n\n    \"\"\"\n    Encapsulates a Havlin climate network.\n\n    The similarity matrix associated with a Havlin climate network is the\n    maximum-lag correlation matrix with each entry normalized by the\n    cross-correlation function's standard deviation.\n\n    Havlin climate networks are undirected so far.\n\n    Havlin climate networks were studied for daily data in [Yamasaki2008]_,\n    [Gozolchiani2008]_, [Yamasaki2009]_.\n\n    .. note::\n       So far, the cross-correlation functions are estimated using \\\n       convolution in Fourier space (FFT). This may not be reliable \\\n       for larger delays.\n    \"\"\"\n\n    #\n    #  Defines internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, data, max_delay, threshold=None, link_density=None,\n                 non_local=False, node_weight_type=\"surface\", silence_level=0):\n        \"\"\"\n        Initialize an instance of HavlinClimateNetwork.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos**2 lat)\n\n        :type data: :class:`.ClimateData`\n        :arg data: The climate data used for network construction.\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :param int max_delay: Maximum delay for cross-correlation functions.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if silence_level <= 1:\n            print(\"Generating a Havlin climate network...\")\n        self.silence_level = silence_level\n\n        #  Set instance variables\n        self._max_delay = 0\n        self._correlation_lag = None\n        assert isinstance(data, ClimateData)\n        self.data: ClimateData = data\n        \"\"\"The climate data used for network construction.\"\"\"\n        self.N = data.grid.N\n        self._prescribed_link_density = link_density\n\n        self._mut_clim: int = 0\n        self._set_max_delay(max_delay)\n        ClimateNetwork.__init__(self, grid=self.data.grid,\n                                similarity_measure=self._similarity_measure,\n                                threshold=threshold,\n                                link_density=link_density,\n                                non_local=non_local,\n                                directed=False,\n                                node_weight_type=node_weight_type,\n                                silence_level=silence_level)\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        return ClimateNetwork.__cache_state__(self) + (self.data,)\n\n    def __str__(self):\n        \"\"\"\n        Return a string version of the instance of HavlinClimateNetwork.\n        \"\"\"\n        return f'HavlinClimateNetwork:\\n \\\n                {ClimateNetwork.__str__(self)}\\n \\\n                Maximum delay used for correlation strength estimation: \\\n                {self.get_max_delay()}'\n\n    def clear_cache(self):\n        \"\"\"\n        Clean up cache.\n        \"\"\"\n        try:\n            del self._correlation_lag\n        except AttributeError:\n            pass\n\n    #\n    #  Defines methods to calculate correlation strength and lags\n    #\n\n    #  TODO: Implement an algorithm, which is NOT based on FFT!\n    def _calculate_correlation_strength(self, anomaly, max_delay, gamma=0.2):\n        \"\"\"\n        Calculate correlation strength and maximum lag matrices.\n\n        Follows the method described in [Yamasaki2008]_.\n\n        Also returns the time lag at maximum correlation for each link.\n\n        :type anomaly: 2D array [time, index]\n        :arg anomaly: The anomaly data for network construction.\n        :arg int max_delay: The maximum delay for cross-correlation functions.\n        :arg float gamma: The width of decay region in cosine shaped window\n            used for FFT cross-correlation estimation.\n        :rtype: tuple of two 2D arrays [index, index]\n        :return: the correlation strength and maximum lag matrices.\n        \"\"\"\n        N = self.N\n        self.data.normalize_time_series_array(anomaly)\n        anomaly *= self.data.cos_window(anomaly, gamma)\n        #  Zero pad windowed data to set the length of each time series to\n        #  a power of two\n        anomaly = self.data.zero_pad_data(anomaly)\n        correlation_strength = np.empty((N, N))\n        max_lag_matrix = np.empty((N, N))\n\n        #  Calculate the inverse Fourier transform of all time series\n        ifft = np.fft.ifft(anomaly, axis=0)\n\n        for i in trange(N, disable=self.silence_level > 1):\n            #  Calculate the cross correlation function of node i to all other\n            #  nodes which is not normalized yet.\n            #  The real part has to be taken to get rid of small imaginary\n            #  parts due to rounding errors.\n            cc_one_to_all = np.conjugate(np.tile(ifft[:, i],\n                                                 (N, 1)).transpose()) * ifft\n            cc_one_to_all = np.real(np.fft.fft(cc_one_to_all, axis=0))\n\n            #  Consider only the cross correlations between -max_delay and\n            #  +max_delay.\n            #  Correlation values at negative lag are now stored left of the\n            #  correlation values at positive lag.\n            cc_one_to_all = np.concatenate((cc_one_to_all[-max_delay:-1, :],\n                                            cc_one_to_all[0:max_delay, :]))\n\n            #  Consider only absolute values\n            cc_one_to_all = np.abs(cc_one_to_all)\n\n            #  Store correlation strengths\n            correlation_strength[i, :] = \\\n                cc_one_to_all.max(axis=0) / cc_one_to_all.std(axis=0)\n\n            #  Store time delays at maximum cross correlation\n            max_lag_matrix[i, :] = cc_one_to_all.argmax(axis=0) - max_delay\n\n        return (correlation_strength, max_lag_matrix)\n\n    def get_max_delay(self):\n        \"\"\"\n        Return the maximum delay used for cross-correlation estimation.\n\n        :return float: the maximum delay used for cross-correlation estimation.\n        \"\"\"\n        return self._max_delay\n\n    def _set_max_delay(self, max_delay):\n        \"\"\"\n        Set the maximum lag time used for cross-correlation estimation.\n\n        :arg int max_delay: The maximum delay for cross-correlation functions.\n        \"\"\"\n        self._mut_clim += 1\n        self._max_delay = max_delay\n        results = self._calculate_correlation_strength(self.data.anomaly(),\n                                                       max_delay)\n        self._similarity_measure = results[0]\n        self._correlation_lag = results[1]\n\n    def set_max_delay(self, max_delay):\n        \"\"\"\n        Set the maximum lag time used for cross-correlation estimation.\n\n        (Re)generates the current Havlin climate network accordingly.\n\n        :arg int max_delay: The maximum delay for cross-correlation functions.\n        \"\"\"\n        self._set_max_delay(max_delay)\n        self._regenerate_network()\n\n    def correlation_strength(self):\n        \"\"\"\n        Return the correlation strength matrix.\n\n        :rtype: 2D array [index, index]\n        :return: the correlation strength matrix.\n        \"\"\"\n        return self._similarity_measure\n\n    def correlation_lag(self):\n        \"\"\"\n        Return the lag at maximum cross-correlation matrix.\n\n        :rtype: 2D array [index, index]\n        :return: the lag at maximum cross-correlation matrix.\n        \"\"\"\n        return self._correlation_lag\n\n    #\n    #  Methods to calculate weighted network measures\n    #\n\n    def correlation_strength_weighted_average_path_length(self):\n        \"\"\"\n        Return correlation strength weighted average path length.\n\n        :return float: the correlation strength weighted average path length.\n        \"\"\"\n        return self._weighted_metric(\n            \"correlation_strength\",\n            lambda: np.abs(self.correlation_strength()),\n            \"average_path_length\")\n\n    def correlation_strength_weighted_closeness(self):\n        \"\"\"\n        Return correlation strength weighted closeness.\n\n        :rtype: 1D array [index]\n        :return: the correlation strength weighted closeness sequence.\n        \"\"\"\n        return self._weighted_metric(\n            \"correlation_strength\",\n            lambda: np.abs(self.correlation_strength()),\n            \"closeness\")\n\n    def correlation_lag_weighted_average_path_length(self):\n        \"\"\"\n        Return correlation lag weighted average path length.\n\n        :return float: the correlation lag weighted average path length.\n        \"\"\"\n        return self._weighted_metric(\n            \"correlation_lag\",\n            lambda: np.abs(self.correlation_lag()),\n            \"average_path_length\")\n\n    def correlation_lag_weighted_closeness(self):\n        \"\"\"\n        Return correlation lag weighted closeness.\n\n        :rtype: 1D array [index]\n        :return: the correlation lag weighted closeness sequence.\n        \"\"\"\n        return self._weighted_metric(\n            \"correlation_lag\",\n            lambda: np.abs(self.correlation_lag()),\n            \"closeness\")\n\n    def local_correlation_strength_weighted_vulnerability(self):\n        \"\"\"\n        Return correlation strength weighted vulnerability.\n\n        :rtype: 1D array [index]\n        :return: the correlation strength weighted vulnerability sequence.\n        \"\"\"\n        return self._weighted_metric(\n            \"correlation_strength\",\n            lambda: np.abs(self.correlation_strength()),\n            \"local_vulnerability\")\n\n    def local_correlation_lag_weighted_vulnerability(self):\n        \"\"\"\n        Return correlation lag weighted vulnerability.\n\n        :rtype: 1D array [index]\n        :return: the correlation lag weighted vulnerability sequence.\n        \"\"\"\n        return self._weighted_metric(\n            \"correlation_lag\",\n            lambda: np.abs(self.correlation_lag()),\n            \"local_vulnerability\")\n"
  },
  {
    "path": "src/pyunicorn/climate/hilbert.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex climate networks.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable\n\nimport numpy as np\ntry:\n    import scipy.signal\nexcept ImportError:\n    print(\"climate: Package scipy.signal could not be loaded. Some \"\n          \"functionality in class HilbertClimateNetwork might not be \"\n          \"available!\")\n\nfrom .climate_data import ClimateData\nfrom .climate_network import ClimateNetwork\n\n\n#\n#  Define class HilbertClimateNetwork\n#\n\nclass HilbertClimateNetwork(ClimateNetwork):\n\n    \"\"\"\n    Encapsulates a Hilbert climate network.\n\n    The associated similarity matrix is based on Hilbert coherence between\n    time series.\n\n    Hilbert climate networks can be directed and undirected. Optional\n    directionality is based on the average phase difference between time\n    series.\n\n    A preliminary study of Hilbert climate networks is presented in\n    [Donges2009c]_.\n    \"\"\"\n\n    #\n    #  Defines internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, data, threshold=None, link_density=None,\n                 non_local=False, directed=True, node_weight_type=\"surface\",\n                 silence_level=0):\n        \"\"\"\n        Initialize an instance of HilbertClimateNetwork.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos**2 lat)\n\n        :type data: :class:`.ClimateData`\n        :arg data: The climate data used for network construction.\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg bool directed: Determines, whether the network is constructed as\n            directed.\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if silence_level <= 1:\n            print(\"Generating a Hilbert climate network...\")\n        self.silence_level = silence_level\n\n        #  Set instance variables\n        self._coherence_phase = None\n        assert isinstance(data, ClimateData)\n        self.data: ClimateData = data\n        \"\"\"The climate data used for network construction.\"\"\"\n        self.N = data.grid.N\n        self._threshold = threshold\n        self._prescribed_link_density = link_density\n\n        self._set_directed(directed, calculate_coherence=True)\n        ClimateNetwork.__init__(self, grid=self.data.grid,\n                                similarity_measure=self._similarity_measure,\n                                threshold=threshold,\n                                link_density=link_density,\n                                non_local=non_local,\n                                directed=directed,\n                                node_weight_type=node_weight_type,\n                                silence_level=silence_level)\n        self._set_directed(directed, calculate_coherence=False)\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        return ClimateNetwork.__cache_state__(self) + (self.data,)\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation.\n        \"\"\"\n        return 'HilbertClimateNetwork:\\n' + ClimateNetwork.__str__(self)\n\n    def clear_cache(self):\n        \"\"\"\n        Clean up cache.\n        \"\"\"\n        try:\n            del self._coherence_phase\n        except AttributeError:\n            pass\n\n    #\n    #  Defines methods to calculate Hilbert correlation measures\n    #\n\n    def _set_directed(self, directed, calculate_coherence=True):\n        \"\"\"\n        Switch between directed and undirected Hilbert climate network.\n\n        :arg bool directed: Determines whether the network is constructed as\n            directed.\n        :arg bool calculate_coherence: Determines whether coherence and phase\n            are calculated from data or the directed adjacency matrix is\n            constructed from coherence and phase information.\n        \"\"\"\n        if calculate_coherence:\n            results = self._calculate_hilbert_correlation(self.data.anomaly())\n            self._similarity_measure = results[0]\n            self._coherence_phase = results[1]\n            self.directed = directed\n        else:\n            # The phase is only used for directed Hilbert networks.\n            if directed:\n                self.adjacency = self.adjacency * (self.phase_shift() > 0)\n\n    def set_directed(self, directed):\n        \"\"\"\n        Switch between directed and undirected Hilbert climate network.\n\n        Also performs the complete network generation.\n\n        :arg bool directed: Determines whether the network is constructed as\n            directed.\n        \"\"\"\n        self._set_directed(directed, calculate_coherence=True)\n        self._regenerate_network()\n        self._set_directed(directed, calculate_coherence=False)\n\n    def _calculate_hilbert_correlation(self, anomaly):\n        \"\"\"\n        Calculate Hilbert coherence and phase matrices.\n\n        Output corresponds to modulus and argument of the complex correlation\n        coefficients between all pairs of analytic signals calculated from\n        anomaly data, as described in [Bergner2008]_.\n\n        :type anomaly: 2D Numpy array [time, index]\n        :arg anomaly: The anomaly data for network construction.\n\n        :rtype: tuple of two 2D Numpy matrices [index, index]\n        :return: the Hilbert coherence and phase matrices.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating Hilbert transform correlation measures \"\n                  \"following [Bergner2008]_...\")\n\n        #  Calculate the analytic signals associated with the anomaly time\n        #  series.\n        analytic_signals = np.apply_along_axis(scipy.signal.hilbert, 0,\n                                               anomaly)\n\n        #  Normalize analytic signal time series to zero mean and unit variance\n        self.data.normalize_time_series_array(analytic_signals)\n\n        #  Get length of time series\n        n_time = anomaly.shape[0]\n\n        #  Calculate matrix of complex correlation coefficients\n        complex_corr = np.dot(analytic_signals.transpose(),\n                              analytic_signals.conjugate()) / float(n_time - 1)\n\n        #  Clean up\n        del analytic_signals\n\n        #  Calculate the coherence, i.e. the modulus of the complex\n        #  correlation coefficient\n        coherence = np.abs(complex_corr)\n\n        #  Calculate the average phase between signals\n        phase = np.angle(complex_corr)\n\n        return (coherence, phase)\n\n    def coherence(self):\n        \"\"\"\n        Return the Hilbert coherence matrix.\n\n        :rtype: 2D Numpy array [index, index]\n        :return: the Hilbert coherence matrix.\n        \"\"\"\n        return self.similarity_measure()\n\n    def phase_shift(self):\n        \"\"\"\n        Return the average phase shift matrix.\n\n        :rtype: 2D Numpy array [index, index]\n        :return: the average phase shift matrix.\n        \"\"\"\n        return self._coherence_phase\n"
  },
  {
    "path": "src/pyunicorn/climate/map_plot.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for analyzing spatially embedded complex networks, handling\nmultivariate data and generating time series surrogates.\n\"\"\"\n\nimport numpy as np\nimport matplotlib.pyplot as plt\n\ntry:\n    import cartopy.crs as ccrs\n    import cartopy.feature as cf\nexcept ImportError:\n    print(\"climate: Package cartopy could not be loaded. Some functionality \"\n          \"in class MapPlot might not be available!\")\n\nfrom ..core import Grid\n\n#\n#  Define class MapPlot\n#\n\n\n# pylint: disable=too-few-public-methods\nclass MapPlot:\n    \"\"\"\n    Encapsulates map plotting functions via Cartopy and Matplotlib.\n    \"\"\"\n\n    def __init__(self, grid: Grid, title: str):\n        \"\"\"\n        :arg grid: The `Grid` object describing the map data to be plotted.\n        :arg str title: The title describing the map data.\n        \"\"\"\n        self.grid: Grid = grid\n        self.title: str = title\n\n        #\n        #  Adjust Cartopy settings, fine tuning can be done externally\n        #\n\n        # Specify Coordinate Refference System for Map Projection\n        # pylint: disable-next=abstract-class-instantiated\n        self.projection = ccrs.PlateCarree()\n\n        # Specify CRS (where data should be plotted)\n        # pylint: disable-next=abstract-class-instantiated\n        self.crs = ccrs.PlateCarree()\n\n        # get spatial dims\n        self.lon = self.grid.convert_lon_coordinates(self.grid.lon_sequence())\n        self.lat = self.grid.lat_sequence()\n        self.gridsize_lon = len(self.lon)\n        self.gridsize_lat = len(self.lat)\n        self.lon_min = self.grid.boundaries()[\"lon_min\"]\n        self.lon_max = self.grid.boundaries()[\"lon_max\"]\n        self.lat_min = self.grid.boundaries()[\"lat_min\"]\n        self.lat_max = self.grid.boundaries()[\"lat_max\"]\n\n        # extent of data will also give extent of world map\n        self.data_extent = [self.lon_min, self.lon_max,\n                            self.lat_min, self.lat_max]\n\n    def plot(self, data: np.ndarray, label: str):\n        \"\"\"\n        Plot dataset onto ``self.grid``. A simple setup to get a quick view of\n        your data.\n\n        The plot can be customized by calling additional Matplotlib or Cartopy\n        methods afterwards. It can then be saved via ``plt.savefig()``.\n\n        :arg ndarray data: The dataset to be plotted on the Grid.\n        :arg str label: A name for the dataset to print as label.\n        \"\"\"\n\n        #  Generate figure\n        plt.figure()\n\n        # create GeoAxes object\n        gax = plt.axes(projection=self.projection)\n\n        # create some standards of plotting that can be adjusted\n        # before calling ``generate_cartopy_plot()``\n        # adjust size and plot coastlines and borders\n        gax.set_extent(self.data_extent, crs=self.crs)\n        # ax.set_global()\n        gax.add_feature(cf.COASTLINE.with_scale(\"50m\"), lw=0.5)\n        gax.add_feature(cf.BORDERS.with_scale(\"50m\"), lw=0.2)\n\n        # Draw gridlines in degrees over map\n        gl = gax.gridlines(\n            crs=self.crs, draw_labels=True,\n            linewidth=.6, color='gray',\n            alpha=0.5, linestyle='-.'\n        )\n        gl.xlabel_style = {\"size\": 7}\n        gl.ylabel_style = {\"size\": 7}\n\n        # plot data upon map\n        plt.tricontourf(self.lon, self.lat, data,\n                        extent=self.data_extent, transform=self.crs)\n        cbar = plt.colorbar(shrink=0.5)\n        cbar.set_label(label, rotation=270)\n\n        # add title\n        plt.title(self.title)\n"
  },
  {
    "path": "src/pyunicorn/climate/mutual_info.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex climate networks.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable\n\nimport numpy as np\n\nfrom ..core._ext.types import to_cy, FIELD\nfrom ._ext.numerics import mutual_information\nfrom .climate_data import ClimateData\nfrom .climate_network import ClimateNetwork\n\n\nclass MutualInfoClimateNetwork(ClimateNetwork):\n    \"\"\"\n    Represents a mutual information climate network.\n\n    Constructs a static climate network based on mutual information at zero\n    lag, as in [Ueoka2008]_.\n\n    Mutual information climate networks are undirected, since mutual\n    information is a symmetrical measure. In contrast to Pearson correlation\n    used in :class:`.TsonisClimateNetwork`, mutual information has the\n    potential to detect nonlinear statistical interdependencies.\n    \"\"\"\n\n    #\n    #  Defines internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, data, threshold=None, link_density=None,\n                 non_local=False, node_weight_type=\"surface\", winter_only=True,\n                 silence_level=0):\n        \"\"\"\n        Initialize an instance of MutualInfoClimateNework.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos**2 lat)\n\n        :type data: :class:`.ClimateData`\n        :arg data: The climate data used for network construction.\n\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        :arg bool winter_only: Determines, whether only data points from the\n            winter months (December, January and February) should be used for\n            analysis. Possibly, this further suppresses the annual cycle in the\n            time series.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if silence_level <= 1:\n            print(\"Generating a mutual information climate network...\")\n        self.silence_level = silence_level\n\n        #  Set instance variables\n        assert isinstance(data, ClimateData)\n        self.data: ClimateData = data\n        \"\"\"The climate data used for network construction.\"\"\"\n        self.N = self.data.grid.N\n        self._prescribed_link_density = link_density\n        self._winter_only = winter_only\n\n        #  Class specific settings\n        self.mi_file = \"mutual_information_\" + data.data_source + \"_\" \\\n            + data.observable_name + \".data\"\n        \"\"\"(string) - The name of the file for storing the mutual information\n                      matrix.\"\"\"\n\n        self._set_winter_only(winter_only)\n        ClimateNetwork.__init__(self, grid=self.data.grid,\n                                similarity_measure=self._similarity_measure,\n                                threshold=threshold,\n                                non_local=non_local,\n                                directed=False,\n                                node_weight_type=node_weight_type,\n                                silence_level=silence_level)\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        return ClimateNetwork.__cache_state__(self) + (self.data,)\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of MutualInfoClimateNetwork.\n        \"\"\"\n        return 'MutualInfoClimateNetwork:\\n' + ClimateNetwork.__str__(self)\n\n    def _cython_calculate_mutual_information(self, anomaly, n_bins=32):\n        \"\"\"\n        Calculate the mutual information matrix at zero lag.\n\n        The cython code is adopted from the Tisean 3.0.1 mutual.c module.\n\n        :type anomaly: 2D Numpy array (time, index)\n        :arg anomaly: The anomaly time series.\n\n        :arg int n_bins: The number of bins for estimating probability\n            distributions.\n        :arg bool fast: Indicates, whether fast or slow algorithm should be\n            used.\n        :rtype: 2D array (index, index)\n        :return: the mutual information matrix at zero lag.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating mutual information matrix at zero lag from \"\n                  \"anomaly values using cython...\")\n\n        #  Normalize anomaly time series to zero mean and unit variance\n        self.data.normalize_time_series_array(anomaly)\n\n        #  Create local transposed copy of anomaly\n        anomaly = anomaly.T.copy()\n\n        (N, n_samples) = anomaly.shape\n\n        #  Get common range for all histograms\n        range_min = float(anomaly.min())\n        range_max = float(anomaly.max())\n\n        #  Rescale all time series to the interval [0,1],\n        #  using the maximum range of the whole dataset.\n        scaling = 1./(range_max - range_min)\n\n        mi = mutual_information(\n            to_cy(anomaly, FIELD), n_samples, N, n_bins, scaling, range_min)\n\n        if self.silence_level <= 1:\n            print(\"Done!\")\n\n        return mi\n\n    def calculate_similarity_measure(self, anomaly):\n        \"\"\"\n        Calculate the mutual information matrix.\n\n        Encapsulates calculation of mutual information with standard\n        parameters.\n\n        :type anomaly: 2D Numpy array (time, index)\n        :arg anomaly: The anomaly time series.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the mutual information matrix at zero lag.\n        \"\"\"\n        return self._cython_calculate_mutual_information(anomaly)\n\n    def mutual_information(self, anomaly=None, dump=True):\n        \"\"\"\n        Return mutual information matrix at zero lag.\n\n        Check if mutual information matrix (MI) was already calculated before:\n          - If yes, return MI from a data file.\n          - If not, return MI from calculation and store in file.\n\n        :type anomaly: 2D Numpy array (time, index)\n        :arg anomaly: The anomaly time series.\n        :arg bool dump: Store MI in data file.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the mutual information matrix at zero lag.\n        \"\"\"\n        try:\n            #  Try to load MI from file\n            if self.silence_level <= 1:\n                print(\"Loading mutual information matrix from \"\n                      f\"{self.mi_file}...\")\n\n            with open(self.mi_file, 'r', encoding=\"utf-8\") as f:\n                mi = np.load(f)\n                #  Check if the dimensions of mutual_information correspond to\n                #  the grid.\n                if mi.shape != (self.N, self.N):\n                    print(f\"{self.mi_file} in current directory has \"\n                          \"incorrect dimensions!\")\n                    raise RuntimeError\n\n        except (IOError, RuntimeError):\n            if self.silence_level <= 1:\n                print(\"An error occured while loading data from \"\n                      f\"{self.mi_file}.\")\n                print(\"Recalculating mutual information.\")\n\n            mi = self._cython_calculate_mutual_information(anomaly)\n            if dump:\n                with open(self.mi_file, 'w', encoding=\"utf-8\") as f:\n                    if self.silence_level <= 1:\n                        print(\"Storing in\", self.mi_file)\n                    mi.dump(f)\n\n        return mi\n\n    def winter_only(self):\n        \"\"\"\n        Indicate, if only winter months were used for network generation.\n\n        :return bool: whether only winter months were used for network\n            generation.\n        \"\"\"\n        return self._winter_only\n\n    def _set_winter_only(self, winter_only, dump=False):\n        \"\"\"\n        Toggle use of exclusively winter data points for network generation.\n\n        :arg bool winter_only: Indicates whether only winter months were used\n            for network generation.\n        :arg bool dump: Store MI in data file.\n        \"\"\"\n        self._winter_only = winter_only\n        if winter_only:\n            winter_anomaly = self.data.anomaly_selected_months([0, 1, 11])\n            mi = self.mutual_information(winter_anomaly, dump=dump)\n        else:\n            mi = self.mutual_information(self.data.anomaly(), dump=dump)\n        self._similarity_measure = mi\n\n    def set_winter_only(self, winter_only, dump=True):\n        \"\"\"\n        Toggle use of exclusively winter data points for network generation.\n\n        Also explicitly regenerates the instance of MutualInfoClimateNetwork.\n\n        :arg bool winter_only: Indicates whether only winter months were used\n            for network generation.\n        :arg bool dump: Store MI in data file.\n        \"\"\"\n        self._set_winter_only(winter_only, dump=dump)\n        self._regenerate_network()\n\n    #\n    #  Defines methods to calculate  weighted network measures\n    #\n\n    def mutual_information_weighted_average_path_length(self):\n        \"\"\"\n        Return mutual information weighted average path length.\n\n        :return float: the mutual information weighted average path length.\n        \"\"\"\n        return self._weighted_metric(\n            \"mutual_information\",\n            lambda: np.abs(self.mutual_information()),\n            \"average_path_length\")\n\n    def mutual_information_weighted_closeness(self):\n        \"\"\"\n        Return mutual information weighted closeness.\n\n        :rtype: 1D Numpy array [index]\n        :return: the mutual information weighted closeness sequence.\n        \"\"\"\n        return self._weighted_metric(\n            \"mutual_information\",\n            lambda: np.abs(self.mutual_information()),\n            \"closeness\")\n\n    def local_mutual_information_weighted_vulnerability(self):\n        \"\"\"\n        Return mutual information weighted vulnerability.\n\n        :rtype: 1D Numpy array [index]\n        :return: the mutual information weighted vulnerability sequence.\n        \"\"\"\n        return self._weighted_metric(\n            \"mutual_information\",\n            lambda: np.abs(self.mutual_information()),\n            \"local_vulnerability\")\n"
  },
  {
    "path": "src/pyunicorn/climate/partial_correlation.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex climate networks.\n\"\"\"\n\n#\n#  Import essential packages\n#\n\n#  Import NumPy for the array object and fast numerics\nimport numpy as np\n\nfrom .tsonis import TsonisClimateNetwork\n\n\n#\n#  Define class PartialCorrelationClimateNetwork\n#\n\nclass PartialCorrelationClimateNetwork(TsonisClimateNetwork):\n\n    \"\"\"\n    Encapsulates a partial correlation climate network.\n\n    Constructs a static climate network based on partial correlation, as in\n    [Ueoka2008]_.\n    \"\"\"\n\n    #\n    #  Defines internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, data, threshold=None, link_density=None,\n                 non_local=False, node_weight_type=\"surface\", winter_only=True,\n                 silence_level=0):\n        \"\"\"\n        Initialize an instance of PartialCorrelationClimateNetwork.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos**2 lat)\n\n        :type data: :class:`.ClimateData`\n        :arg data: The climate data used for network construction.\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        :arg bool winter_only: Determines, whether only data points from the\n            winter months (December, January and February) should be used for\n            analysis. Possibly, this further suppresses the annual cycle in the\n            time series.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if silence_level <= 1:\n            print(\"Generating a partial correlation climate network...\")\n\n        #  Call constructor of parent class TsonisClimateNetwork\n        TsonisClimateNetwork.__init__(self, data=data, threshold=threshold,\n                                      link_density=link_density,\n                                      non_local=non_local,\n                                      node_weight_type=node_weight_type,\n                                      winter_only=winter_only,\n                                      silence_level=silence_level)\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of PartialCorrelationClimateNetwork.\n        \"\"\"\n        return ('PartialCorrelationClimateNetwork:\\n'\n                f'{TsonisClimateNetwork.__str__(self)}')\n\n    #\n    #  Defines methods to calculate the correlation matrix\n    #\n\n    def _calculate_correlation(self, anomaly):\n        \"\"\"\n        Return the partial correlation matrix at zero lag.\n\n        :type anomaly: 2D Numpy array (time, index)\n        :arg anomaly: the anomaly time series from to calculate the partial\n                      correlation matrix at zero lag.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the partial correlation matrix at zero lag.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating partial correlation matrix at zero lag from \"\n                  \"anomaly values...\")\n\n        #  Calculate the correlation matrix, cast to float64 for precise\n        #  calculation of inverse matrix.\n        C = np.corrcoef(anomaly.transpose()).astype(\"float64\")\n\n        #  Calculate the inverse correlation matrix\n        if np.linalg.det(C) != 0.0:\n            C_inv = np.linalg.inv(C)\n        else:\n            C_inv = np.linalg.pinv(C)\n\n        #  Clean up\n        del C\n\n        #  Get the diagonal of the inverse correlation matrix\n        diag = C_inv.diagonal()[:]\n\n        #  Calculate matrix of normalizations\n        norm = np.sqrt(abs(np.outer(diag, diag)))\n\n        return - C_inv / norm\n"
  },
  {
    "path": "src/pyunicorn/climate/rainfall.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex climate networks.\n\"\"\"\n\n#\n#  Import essential packages\n#\n\n# import numpy as np\n\nfrom ..core._ext.types import to_cy, MASK, FIELD\nfrom ._ext.numerics import spearman_corr\n\n#  Import cnTsonisClimateNetwork for TsonisClimateNetwork class\nfrom .climate_network import ClimateNetwork\n\n#\n#  Define class RainfallClimateNetwork\n#\n\n\nclass RainfallClimateNetwork(ClimateNetwork):\n\n    \"\"\"\n    Encapsulate a Rainfall climate network.\n\n    The Rainfall climate network is constructed from the Spearman rank order\n    correlation matrix (Spearman's rho) but without considering \"zeros\" in the\n    dataset, which represent the time at which there is no rainfall.\n    Spearman's rho is more robust with respect to outliers and non-gaussian\n    data distributions than the Pearson correlation coefficient.\n\n    Rainfall climate networks are undirected due to the symmetry of the\n    Spearman's rho matrix.\n\n    Class RainfallClimateNetwork was created by `Marc Wiedermann\n    <marcw@physik.hu-berlin.de>`__ during an internship\n    at PIK in March 2010.\n    \"\"\"\n\n    #\n    # Defines internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, data, threshold=None, link_density=None,\n                 non_local=False, node_weight_type=\"surface\",\n                 event_threshold=(0, 1), scale_fac=37265, offset=10**(-7),\n                 silence_level=0):\n        \"\"\"\n        Initialize an instance of RainfallClimateNetwork.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos**2 lat)\n\n        :type data: :class:`.ClimateData`\n        :arg data: The climate data used for network construction.\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        :type event_threshold: list of two numbers between 0 and 1.\n        :arg event_threshold: The quantiles of the rainfall distribution at\n            each location between which rainfall events should be considered\n            for calculating correlations.\n        :arg float scale_fac: Scale factor for rescaling data.\n        :arg float offset: Offset for rescaling data.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if silence_level <= 1:\n            print(\"Generating a Rainfall climate network...\")\n\n        #  Set instance variables\n        self.data = data\n        \"\"\"(ClimateData) - The climate data used for network construction.\"\"\"\n\n        self.N = self.data.grid.N\n        self._threshold = threshold\n        self._prescribed_link_density = link_density\n        self._non_local = non_local\n        self.node_weight_type = node_weight_type\n        self.silence_level = silence_level\n\n        #  Calculate correlation measure\n        correlation = self._calculate_correlation(\n            event_threshold, scale_fac, offset)\n\n        ClimateNetwork.__init__(self, grid=self.data.grid,\n                                similarity_measure=correlation,\n                                threshold=self.threshold(),\n                                link_density=self._prescribed_link_density,\n                                non_local=self.non_local(),\n                                directed=False,\n                                node_weight_type=self.node_weight_type,\n                                silence_level=self.silence_level)\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation of RainfallClimateNetwork.\n        \"\"\"\n        return 'RainfallClimateNetwork:\\n' + ClimateNetwork.__str__(self)\n\n    #\n    # Defines methods to calculate the correlation matrix\n    #\n\n    def _calculate_correlation(self, event_threshold, scale_fac, offset):\n        \"\"\"\n        Returns the Spearman Rho correlation matrix.\n\n        An event_threshold can be given to extract a percentage of the given\n        dataset, i.e. [0.9,1] extracts the ten percent of heaviest rainfall\n        events. [0,1] selects the whole dataset.\n\n        :type event_threshold: list of two numbers between 0 and 1.\n        :arg event_threshold: The quantiles of the rainfall distribution at\n                              each location between which rainfall events\n                              should be considered for calculating\n                              correlations.\n\n        :type scale_fac: number (float)\n        :arg scale_fac: Scale factor for rescaling data.\n\n        :type offset: number (float)\n        :arg offset: Offset for rescaling data.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the Spearman's rho matrix at zero lag.\n        \"\"\"\n        # Calculate the real rainfall from observable\n        rainfall = self.calculate_rainfall(self.data.observable().T,\n                                           scale_fac, offset)\n\n        if self.silence_level <= 1:\n            print(\"Calculating Rainfall-Anomaly using Cython...\")\n\n        # Calculate the anomaly for the rainfall dataset\n        anomaly = self.calculate_rainfall(self.data.anomaly().T,\n                                          scale_fac, offset)\n\n        # Correct anomaly for offset due to rescaling\n        anomaly -= scale_fac * offset\n\n        # Create a mask, which filters out zeros and events outside the\n        # event_threshold\n        final_mask = self.calculate_top_events(rainfall, event_threshold)\n\n        if self.silence_level <= 1:\n            print(\"Calculating Spearman-Rho-Matrix using Cython...\")\n\n        # Return the correlation matrix\n        return self.spearman_corr(final_mask, anomaly)\n\n    @staticmethod\n    def calculate_rainfall(observable, scale_fac, offset):\n        \"\"\"\n        Returns the rainfall in mm on each measuring point.\n\n        :type observable: 2D Numpy array (time, index)\n        :arg observable: The observable time series from the data source.\n\n        :type scale_fac: number (float)\n        :arg scale_fac: Scale factor for rescaling data.\n\n        :type offset: number (float)\n        :arg offset: Offset for rescaling data.\n\n        :rtype: 2D Numpy array (time, index)\n        :return: the rainfall for each time and location\n        \"\"\"\n        # Multiply the observable with the scaling factor after adding the\n        # offset\n        rainfall = (observable + offset) * scale_fac\n\n        return rainfall\n\n    @staticmethod\n    def calculate_top_events(rainfall, event_threshold):\n        \"\"\"\n        Returns a mask with boolean values. The entries are false, when the\n        rainfall of one day is zero, or when the rainfall is not inside the\n        event_treshold\n\n        :type rainfall: 2D Numpy array (index, time)\n        :arg rainfall: the rainfall time series for each measuring point\n\n        :type event_threshold: list of two numbers between 0 and 1.\n        :arg event_threshold: The quantiles of the rainfall distribution at\n                              each location between which rainfall events\n                              should be considered for calculating\n                              correlations.\n\n        :rtype: 2D Numpy array (index, time)\n        :return: A bool array with False for every value in the rainfall\n                 data, which are zero or outside the top_event Interval.\n        \"\"\"\n        rainfall_copy = rainfall.copy()\n\n        m = len(rainfall) * len(rainfall.T)\n\n        onelist = rainfall.reshape(m)\n\n        onelist = onelist[onelist.sort()][0]\n\n        downlimit = m * event_threshold[0] // 1\n\n        uplimit = m * event_threshold[1] // 1\n\n        rainfall = rainfall_copy\n\n        down_mask = rainfall >= onelist[downlimit]\n\n        up_mask = rainfall <= onelist[uplimit-1]\n\n        no_rain_mask = rainfall != 0\n\n        final_mask = down_mask & up_mask & no_rain_mask\n\n        return final_mask\n\n    @staticmethod\n    def rank_time_series(anomaly):\n        \"\"\"\n        Return rank time series.\n\n        :type anomaly: 2D Numpy array (index, time)\n        :arg anomaly: the rainfall anomaly time series for each measuring point\n\n        :rtype: 2D Numpy array (index, time)\n        :return: The ranked time series for each gridpoint\n        \"\"\"\n        rank_time_series = anomaly.argsort(axis=1).argsort(axis=1) + 1.0\n        return rank_time_series\n\n    def spearman_corr(self, final_mask, anomaly):\n        \"\"\"\n        Return the Spearman Correlation Matrix at zero lag.\n\n        :type final_mask: 2D Numpy array (index, time)\n        :arg final_mask: A bool array with False for every value in the\n                         rainfall data, which are zero or outside the top_event\n                         interval.\n\n        :type anomaly: 2D Numpy array (index, time)\n        :arg anomaly: The rainfall anomaly time series for each measuring\n                      point.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the Spearman correlation matrix.\n        \"\"\"\n        # Get rank time series\n        time_series_ranked = self.rank_time_series(anomaly)\n        m, tmax = anomaly.shape\n        return spearman_corr(\n            m, tmax, to_cy(final_mask, MASK), to_cy(time_series_ranked, FIELD))\n"
  },
  {
    "path": "src/pyunicorn/climate/spearman.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex climate networks.\n\"\"\"\n\n#\n#  Import essential packages\n#\n\n#  Import NumPy for the array object and fast numerics\nimport numpy as np\n\n#  Import cnTsonisClimateNetwork for TsonisClimateNetwork class\nfrom .tsonis import TsonisClimateNetwork\n\n\n#\n#  Define class TsonisClimateNetwork\n#\n\nclass SpearmanClimateNetwork(TsonisClimateNetwork):\n\n    \"\"\"\n    Encapsulate a Spearman climate network.\n\n    The Spearman climate network is constructed from the Spearman rank order\n    correlation matrix (Spearman's rho). Spearman's rho is more robust with\n    respect to ouliers and non-gaussian data distributions than the Pearson\n    correlation coefficient used in :class:`TsonisClimateNetwork`.\n\n    Hence, Spearman climate networks are undirected due to the symmetry of the\n    Spearman's rho matrix.\n    \"\"\"\n\n    #\n    #  Defines internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, data, threshold=None, link_density=None,\n                 non_local=False, node_weight_type=\"surface\", winter_only=True,\n                 silence_level=0):\n        \"\"\"\n        Initialize an instance of :class:`SpearmanClimateNetwork`.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos**2 lat)\n\n        :type data: :class:`.ClimateData`\n        :arg data: The climate data used for network construction.\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        :arg bool winter_only: Determines, whether only data points from the\n            winter months (December, January and February) should be used for\n            analysis. Possibly, this further suppresses the annual cycle in the\n            time series.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n\n        if silence_level <= 1:\n            print(\"Generating a Spearman climate network...\")\n\n        #  Call constructor of parent class TsonisClimateNetwork\n        TsonisClimateNetwork.__init__(self, data=data, threshold=threshold,\n                                      link_density=link_density,\n                                      non_local=non_local,\n                                      node_weight_type=node_weight_type,\n                                      winter_only=winter_only,\n                                      silence_level=silence_level)\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation of SpearmanClimateNetwork.\n        \"\"\"\n        return ('SpearmanClimateNetwork:\\n'\n                f'{TsonisClimateNetwork.__str__(self)}')\n\n    #\n    #  Defines methods to calculate the correlation matrix\n    #\n\n    @staticmethod\n    def rank_time_series(anomaly):\n        \"\"\"\n        Return rank time series.\n\n        Ranks are generated individually for each time series.\n\n        :type anomaly: 2D Numpy array [time, index]\n        :arg anomaly: The anomaly time series to be converted into ranks.\n\n        :rtype: 2D Numpy array [time, index]\n        :return: the rank time series.\n        \"\"\"\n        #  Obtain rank time series\n        rank_time_series = anomaly.argsort(axis=0).argsort(axis=0)\n\n        return rank_time_series\n\n    def _calculate_correlation(self, anomaly):\n        \"\"\"\n        Return Spearman's rho matrix at zero lag.\n\n        :type anomaly: 2D Numpy array (time, index)\n        :arg anomaly: the anomaly time series from to calculate the correlation\n                     matrix at zero lag.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the Spearman's rho matrix at zero lag.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating Spearman Rho matrix at zero lag from anomaly \"\n                  \"values...\")\n\n        #  Convert anomaly time series to time series of ranks\n        ranks = self.rank_time_series(anomaly)\n\n        #  Cast to float32 type to save memory since correlation coefficients\n        #  are not needed in high floating point precision.\n        spearman_rho = np.corrcoef(ranks.transpose()).astype(\"float32\")\n\n        return spearman_rho\n"
  },
  {
    "path": "src/pyunicorn/climate/tsonis.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for generating and analyzing complex climate networks.\n\"\"\"\n\nimport numpy as np\n\nfrom .climate_network import ClimateNetwork\nfrom .climate_data import ClimateData\nfrom ..core.cache import Cached\n\n\n# TODO: Reconsider storage of correlation matrix without taking absolute value.\nclass TsonisClimateNetwork(ClimateNetwork):\n\n    \"\"\"\n    Encapsulates a Tsonis climate network.\n\n    Construct a static climate network following Tsonis et al. from the\n    Pearson correlation matrix at zero lag.\n\n    Hence, Tsonis climate networks are undirected due to the symmetry of the\n    correlation matrix.\n\n    References: [Tsonis2004]_, [Tsonis2006]_, [Tsonis2008b]_, [Tsonis2008c]_.\n    \"\"\"\n\n    #\n    #  Defines internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, data, threshold=None, link_density=None,\n                 non_local=False, node_weight_type=\"surface\", winter_only=True,\n                 silence_level=0):\n        \"\"\"\n        Initialize an instance of TsonisClimateNetwork.\n\n        .. note::\n           Either threshold **OR** link_density have to be given!\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos**2 lat)\n\n        :type data: :classL`.ClimateData`\n        :arg data: The climate data used for network construction.\n        :arg float threshold: The threshold of similarity measure, above which\n            two nodes are linked in the network.\n        :arg float link_density: The networks's desired link density.\n        :arg bool non_local: Determines, whether links between spatially close\n            nodes should be suppressed.\n        :arg str ode_weight_type: The type of geographical node weight to be\n            used.\n        :arg bool winter_only: Determines, whether only data points from the\n            winter months (December, January and February) should be used for\n            analysis. Possibly, this further suppresses the annual cycle in the\n            time series.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if silence_level <= 1:\n            print(\"Generating a Tsonis climate network...\")\n        self.silence_level = silence_level\n\n        #  Set instance variables\n        self.data = data\n        \"\"\"(ClimateData) - The climate data used for network construction.\"\"\"\n        self.N = self.data.grid.N\n\n        self._set_winter_only(winter_only)\n        ClimateNetwork.__init__(self, grid=self.data.grid,\n                                similarity_measure=self.similarity_measure(),\n                                threshold=threshold,\n                                link_density=link_density,\n                                non_local=non_local,\n                                directed=False,\n                                node_weight_type=node_weight_type,\n                                silence_level=silence_level)\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of TsonisClimateNetwork.\n\n        **Example:**\n\n        >>> print(TsonisClimateNetwork.SmallTestNetwork())\n        TsonisClimateNetwork:\n        ClimateNetwork:\n        GeoNetwork:\n        Network: undirected, 6 nodes, 6 links, link density 0.400.\n        Geographical boundaries:\n                 time     lat     lon\n           min    0.0    0.00    2.50\n           max    9.0   25.00   15.00\n        Threshold: 0.5\n        Local connections filtered out: False\n        Use only data points from winter months: False\n        \"\"\"\n        return (f'TsonisClimateNetwork:\\n{ClimateNetwork.__str__(self)}\\n'\n                f'Use only data points from winter months: '\n                f'{self.winter_only()}')\n\n    #\n    #  Methods for testing purposes\n    #\n\n    @staticmethod\n    def SmallTestNetwork():\n        \"\"\"\n        Return a 6-node undirected test climate network from a test data set.\n\n        **Example:**\n\n        >>> r(TsonisClimateNetwork.SmallTestNetwork().adjacency)\n        array([[0, 0, 1, 0, 1, 0], [0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 1, 0],\n               [0, 1, 0, 0, 0, 1], [1, 0, 1, 0, 0, 0], [0, 1, 0, 1, 0, 0]])\n\n        :rtype: Network instance\n        \"\"\"\n        return TsonisClimateNetwork(data=ClimateData.SmallTestData(),\n                                    threshold=0.5, winter_only=False,\n                                    silence_level=2)\n\n    #\n    #  Defines methods to calculate the correlation matrix\n    #\n\n    def _calculate_correlation(self, anomaly):\n        \"\"\"\n        Return the correlation matrix at zero lag.\n\n        :type anomaly: 2D Numpy array (time, index)\n        :arg anomaly: the anomaly time series from which to calculate the\n                      correlation matrix at zero lag.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the correlation matrix at zero lag.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating correlation matrix at zero lag from anomaly \"\n                  \"values...\")\n        #  Cast to float32 type to save memory since correlation coefficients\n        #  are not needed in high floating point precision.\n        correlation = np.corrcoef(anomaly.transpose()).astype(\"float32\")\n\n        return correlation\n\n    def calculate_similarity_measure(self, anomaly):\n        \"\"\"\n        Encapsulate the calculation of the correlation matrix at zero lag.\n\n        **Example:**\n\n        >>> TsonisClimateNetwork.SmallTestNetwork()._calculate_correlation(\n        ...     anomaly=ClimateData.SmallTestData().anomaly())\n        array([[ 1.        , -0.25377226, -1.        ,\n                 0.25377226,  1.        , -0.25377226],\n               [-0.25377226,  1.        ,  0.25377226,\n                -1.        , -0.25377226,  1.        ],\n               [-1.        ,  0.25377226,  1.        ,\n                -0.25377226, -1.        ,  0.25377226],\n               [ 0.25377226, -1.        , -0.25377226,\n                 1.        ,  0.25377226, -1.        ],\n               [ 1.        , -0.25377226, -1.        ,\n                 0.25377226,  1.        , -0.25377226],\n               [-0.25377226,  1.        ,  0.25377226,\n                -1.        , -0.25377226,  1.        ]], dtype=float32)\n\n        :type anomaly: 2D Numpy array (time, index)\n        :arg anomaly: the anomaly time series from which to calculate the\n                      correlation matrix at zero lag.\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the correlation matrix at zero lag.\n        \"\"\"\n        return self._calculate_correlation(anomaly)\n\n    @Cached.method()\n    def correlation(self):\n        \"\"\"\n        Return the correlation matrix at zero lag.\n\n        **Example:**\n\n        >>> TsonisClimateNetwork.SmallTestNetwork().correlation()\n        array([[ 1.        ,  0.25377226,  1.        ,\n                 0.25377226,  1.        ,  0.25377226],\n               [ 0.25377226,  1.        ,  0.25377226,\n                 1.        ,  0.25377226,  1.        ],\n               [ 1.        ,  0.25377226,  1.        ,\n                 0.25377226,  1.        ,  0.25377226],\n               [ 0.25377226,  1.        ,  0.25377226,\n                 1.        ,  0.25377226,  1.        ],\n               [ 1.        ,  0.25377226,  1.        ,\n                 0.25377226,  1.        ,  0.25377226],\n               [ 0.25377226,  1.        ,  0.25377226,\n                 1.        ,  0.25377226,  1.        ]], dtype=float32)\n\n        :rtype: 2D Numpy array (index, index)\n        :return: the correlation matrix at zero lag.\n        \"\"\"\n        corr = self.similarity_measure()\n        self.set_link_attribute('correlation', abs(corr))\n        return corr\n\n    def winter_only(self):\n        \"\"\"\n        Indicate, if only winter months were used for network generation.\n\n        **Example:**\n\n        >>> TsonisClimateNetwork.SmallTestNetwork().winter_only()\n        False\n\n        :return bool: whether only winter months were used for network\n            generation.\n        \"\"\"\n        return self._winter_only\n\n    def _set_winter_only(self, winter_only):\n        \"\"\"\n        Toggle use of exclusively winter data points for network generation.\n\n        :arg bool winter_only: Indicates, whether only winter months were used\n            for network generation.\n        \"\"\"\n        self._winter_only = winter_only\n        if winter_only:\n            winter_anomaly = self.data.anomaly_selected_months([0, 1, 11])\n            correlation = self._calculate_correlation(winter_anomaly)\n        else:\n            correlation = self._calculate_correlation(self.data.anomaly())\n        self._similarity_measure = correlation\n\n    def set_winter_only(self, winter_only):\n        \"\"\"\n        Toggle use of exclusively winter data points for network generation.\n\n        Also explicitly re(generates) the instance of TsonisClimateNetwork.\n\n        **Example:**\n\n        >>> net = TsonisClimateNetwork.SmallTestNetwork()\n        >>> net.set_winter_only(winter_only=False)\n        >>> net.n_links\n        6\n\n        :arg bool winter_only: Indicates, whether only winter months were used\n            for network generation.\n        \"\"\"\n        self._set_winter_only(winter_only)\n        self._regenerate_network()\n\n    #\n    #  Defines methods to calculate  weighted network measures\n    #\n\n    def correlation_weighted_average_path_length(self):\n        \"\"\"\n        Return correlation weighted average path length.\n\n        **Example:**\n\n        >>> TsonisClimateNetwork.SmallTestNetwork().\\\n                correlation_weighted_average_path_length()\n        1.0\n\n        :return float: the correlation weighted average path length.\n        \"\"\"\n        self.correlation()\n        return self.average_path_length('correlation')\n\n    def correlation_weighted_closeness(self):\n        \"\"\"\n        Return correlation weighted closeness.\n\n        **Example:**\n\n        >>> TsonisClimateNetwork.SmallTestNetwork().\\\n                correlation_weighted_closeness()\n        array([ 0.25, 0.25, 0.25, 0.25, 0.25, 0.25])\n\n        :rtype: 1D Numpy array [index]\n        :return: the correlation weighted closeness sequence.\n        \"\"\"\n        self.correlation()\n        return self.closeness('correlation')\n\n    def local_correlation_weighted_vulnerability(self):\n        \"\"\"\n        Return correlation weighted vulnerability.\n\n        **Example:**\n\n        >>> TsonisClimateNetwork.SmallTestNetwork().\\\n                local_correlation_weighted_vulnerability()\n        array([ 0., 0., 0., 0., 0., 0.])\n\n        :rtype: 1D Numpy array [index]\n        :return: the correlation weighted vulnerability sequence.\n        \"\"\"\n        self.correlation()\n        return self.local_vulnerability('correlation')\n"
  },
  {
    "path": "src/pyunicorn/core/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\ncore\n====\n\nProvides classes for analyzing spatially embedded complex networks, handling\nmultivariate data and generating time series surrogates.\n\nRelated Publications\n~~~~~~~~~~~~~~~~~~~~\n[Donges2011a]_, [Heitzig2012]_, [Donges2012]_\n\"\"\"\n\n#\n#  Import classes\n#\n\nfrom .network import Network, NetworkError, nz_coords\nfrom .spatial_network import SpatialNetwork\nfrom .geo_network import GeoNetwork\nfrom .grid import Grid\nfrom .geo_grid import GeoGrid\nfrom .data import Data\nfrom .interacting_networks import InteractingNetworks\nfrom .netcdf_dictionary import NetCDFDictionary\nfrom .resistive_network import ResNetwork\n\n#\n#  Set global constants\n#\n\n#  Mean earth radius in kilometers\nEARTH_RADIUS = 6367.5\n\"\"\"(float) - The earth's mean radius in kilometers.\"\"\"\n"
  },
  {
    "path": "src/pyunicorn/core/_ext/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n"
  },
  {
    "path": "src/pyunicorn/core/_ext/numerics.pyx",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\ncimport cython\n\nimport random\n\nimport numpy as np\ncimport numpy as cnp\nfrom numpy cimport ndarray, abs\nimport numpy.random as rd\nrandint = rd.randint\n\nfrom ...core._ext.types import NODE, DEGREE, FIELD, DFIELD\nfrom ...core._ext.types cimport \\\n    BOOLTYPE_t, ADJ_t, MASK_t, NODE_t, DEGREE_t, WEIGHT_t, DWEIGHT_t, FIELD_t, DFIELD_t\n\ncdef extern from \"src_numerics.c\":\n    double _vertex_current_flow_betweenness_fast(int N, double Is, double It,\n        float *admittance, float *R, int i)\n    void _edge_current_flow_betweenness_fast(int N, double Is, double It,\n        float *admittance, float *R, float *ECFB)\n\n\n# geo_network =================================================================\n\n\n# parameters for `_randomly_rewire_geomodel()`\nctypedef bint (*rewire_cond_len)(FIELD_t[:,:], float, int, int, int, int)\nctypedef bint (*rewire_cond_deg)(DEGREE_t[:], int, int, int, int)\n\ncdef:\n    # condition C1\n    inline bint cond_len_c1(\n        FIELD_t[:,:] D, float eps, int s, int t, int k, int l):\n        return (\n            (abs(D[s,t] - D[k,t]) < eps and abs(D[k,l] - D[s,l]) < eps) or\n            (abs(D[s,t] - D[s,l]) < eps and abs(D[k,l] - D[k,t]) < eps))\n    # condition C2\n    inline bint cond_len_c2(\n        FIELD_t[:,:] D, float eps, int s, int t, int k, int l):\n        return (\n            abs(D[s,t] - D[s,l]) < eps and abs(D[t,s] - D[t,k]) < eps and\n            abs(D[k,l] - D[k,t]) < eps and abs(D[l,k] - D[l,s]) < eps)\n    # invariance of degree-degree correlations\n    inline bint cond_deg_corr(DEGREE_t[:] degree, int s, int t, int k, int l):\n        return (degree[s] == degree[k] and degree[t] == degree[l])\n    # tautology\n    rewire_cond_deg cond_deg_true = NULL\n\n\ncdef void _randomly_rewire_geomodel(int iterations, float eps,\n    ndarray[ADJ_t, ndim=2] A, ndarray[FIELD_t, ndim=2] D, int E,\n    ndarray[NODE_t, ndim=2] edges, ndarray[DEGREE_t, ndim=1] degree,\n    rewire_cond_len cond_len, rewire_cond_deg cond_deg):\n\n    cdef int i = 0, s, t, k, l, edge1, edge2\n\n    while (i < iterations):\n        # Randomly choose 2 edges\n        edge1 = np.floor(rd.random() * E)\n        edge2 = np.floor(rd.random() * E)\n        s, t = edges[edge1,[0,1]]\n        k, l = edges[edge2,[0,1]]\n\n        # Proceed only if old links are disjoint\n        if ((s != k and s != l and t != k and t != l) and\n            # Proceed only if new links do NOT already exist\n            (A[s,l] == 0 and A[t,k] == 0) and\n            # Proceed only if link conditions are fulfilled\n            (cond_deg is NULL or cond_deg(degree, s, t, k, l)) and\n            cond_len(D, eps, s, t, k, l)):\n\n                # Now rewire the links symmetrically & increment i\n                A[s,t] = A[t,s] = 0\n                A[k,l] = A[l,k] = 0\n                A[s,l] = A[l,s] = 1\n                A[t,k] = A[k,t] = 1\n                edges[edge1,[0,1]] = s, l\n                edges[edge2,[0,1]] = k, t\n\n                i+=1\n\n\ndef _randomly_rewire_geomodel_I(int iterations, float eps,\n    ndarray[ADJ_t, ndim=2] A, ndarray[FIELD_t, ndim=2] D, int E,\n    ndarray[NODE_t, ndim=2] edges):\n    cdef:\n        ndarray[DEGREE_t, ndim=1] null = np.array([], dtype=DEGREE)\n    _randomly_rewire_geomodel(iterations, eps, A, D, E, edges, null,\n                              cond_len_c1, cond_deg_true)\n\ndef _randomly_rewire_geomodel_II(int iterations, float eps,\n    ndarray[ADJ_t, ndim=2] A, ndarray[FIELD_t, ndim=2] D, int E,\n    ndarray[NODE_t, ndim=2] edges):\n    cdef:\n        ndarray[DEGREE_t, ndim=1] null = np.array([], dtype=DEGREE)\n    _randomly_rewire_geomodel(iterations, eps, A, D, E, edges, null,\n                              cond_len_c2, cond_deg_true)\n\ndef _randomly_rewire_geomodel_III(int iterations, float eps,\n    ndarray[ADJ_t, ndim=2] A, ndarray[FIELD_t, ndim=2] D, int E,\n    ndarray[NODE_t, ndim=2] edges, ndarray[DEGREE_t, ndim=1] degree):\n    _randomly_rewire_geomodel(iterations, eps, A, D, E, edges, degree,\n                              cond_len_c2, cond_deg_corr)\n\n\n# interacting_networks ========================================================\n\n\ncdef void overwriteAdjacency(\n    ndarray[ADJ_t, ndim=2] A, ndarray[ADJ_t, ndim=2] cross_A,\n    ndarray[NODE_t, ndim=1] nodes1, ndarray[NODE_t, ndim=1] nodes2,\n    int m, int n):\n    \"\"\"\n    Overwrite the adjacency matrix of the full interacting network with the\n    randomly rewired cross edges of the two considered subnetworks.\n    \"\"\"\n    cdef:\n        int i, j\n        NODE_t n1, n2\n\n    for i in range(m):\n        for j in range(n):\n            n1, n2 = nodes1[i], nodes2[j]\n            A[n1, n2] = A[n2, n1] = cross_A[i, j]\n\n\ndef _randomlySetCrossLinks(\n    ndarray[ADJ_t, ndim=2] A, ndarray[ADJ_t, ndim=2] cross_A,\n    int number_cross_links,\n    ndarray[NODE_t, ndim=1] nodes1, ndarray[NODE_t, ndim=1] nodes2,\n    int m, int n):\n    \"\"\"\n    >>> A = np.eye(2, dtype=np.int)\n    >>> _randomlySetCrossLinks(A, np.array([[0]]), 1,\n    ...                        np.array([0]), np.array([1]), 1, 1)\n    >>> np.all(A == np.ones(2))\n    True\n    \"\"\"\n    cdef:\n        int i, j\n\n    # create random cross links\n    for _ in range(number_cross_links):\n        while True:\n            i, j = randint(m), randint(n)\n            if not cross_A[i, j]:\n                break\n        cross_A[i, j] = 1\n    overwriteAdjacency(A, cross_A, nodes1, nodes2, m, n)\n\n\ndef _randomlyRewireCrossLinks(\n    ndarray[ADJ_t, ndim=2] A,\n    ndarray[ADJ_t, ndim=2] cross_A,\n    ndarray[NODE_t, ndim=2] cross_links,\n    ndarray[NODE_t, ndim=1] nodes1,\n    ndarray[NODE_t, ndim=1] nodes2,\n    int number_cross_links, int number_swaps):\n\n    cdef:\n        int m = int(len(nodes1)), n = int(len(nodes2))\n        NODE_t e1, e2, a, b, c, d\n\n    # implement permutations\n    for _ in range(number_swaps):\n        while True:\n            # choose two random edges\n            e1, e2 = randint(number_cross_links), randint(number_cross_links)\n            a, b = cross_links[e1]\n            c, d = cross_links[e2]\n            # repeat the procedure in case there already exists a link between\n            # starting point of e1 and ending point of e2 or vice versa\n            if not (cross_A[a, d] or cross_A[c, b]):\n                break\n        # delete initial edges within the cross adjacency matrix\n        cross_A[a, b] = cross_A[c, d] = 0\n        # create new edges within the cross adjacency matrix by swapping the\n        # ending points of e1 and e2\n        cross_A[a, d] = cross_A[c, b] = 1\n        # likewise, adjust cross_links\n        b                  = cross_links[e1, 1]\n        cross_links[e1, 1] = cross_links[e2, 1]\n        cross_links[e2, 1] = b\n    overwriteAdjacency(A, cross_A, nodes1, nodes2, m, n)\n\n\ndef _cross_transitivity(\n    ndarray[ADJ_t, ndim=2] A,\n    ndarray[NODE_t, ndim=1] nodes1, ndarray[NODE_t, ndim=1] nodes2):\n\n    cdef:\n        int m = int(len(nodes1)), n = int(len(nodes2))\n        int i, j, k\n        NODE_t n1, n2, n3\n        long triangles = 0, triples = 0\n\n    for i in range(m):\n        n1 = nodes1[i]\n        # loop over unique pairs of nodes in subnetwork 2\n        for j in range(n):\n            n2 = nodes2[j]\n            if A[n1, n2]:\n                for k in range(j):\n                    n3 = nodes2[k]\n                    if A[n1, n3]:\n                        triples += 1\n                    if A[n2, n3] and A[n3, n1]:\n                        triangles += 1\n    if triples:\n        return triangles / float(triples)\n    else:\n        return 0.0\n\n\ndef _nsi_cross_transitivity(\n    ndarray[ADJ_t, ndim=2] A,\n    ndarray[NODE_t, ndim=1] nodes1,\n    ndarray[NODE_t, ndim=1] nodes2,\n    ndarray[DWEIGHT_t, ndim=1] node_weights):\n\n    cdef:\n        int m = int(len(nodes1)), n = int(len(nodes2))\n        int v, p, q\n        NODE_t node_v, node_p, node_q\n        DWEIGHT_t weight_v, weight_p, ppv, pqv, T1 = 0, T2 = 0\n\n    for v in range(m):\n        node_v = nodes1[v]\n        weight_v = node_weights[node_v]\n        for p in range(n):\n            node_p = nodes2[p]\n            if A[node_v, node_p]:\n                weight_p = node_weights[node_p]\n                ppv = weight_p * weight_p * weight_v\n                T1 += ppv\n                T2 += ppv\n                for q in range(p + 1, n):\n                    node_q = nodes2[q]\n                    if A[node_v, node_q]:\n                        pqv = 2 * weight_p * node_weights[node_q] * weight_v\n                        T2 += pqv\n                        if A[node_p, node_q]:\n                            T1 += pqv\n    return T1 / T2\n\n\ndef _cross_local_clustering(\n    ndarray[ADJ_t, ndim=2] A,\n    ndarray[DFIELD_t, ndim=1] norm,\n    ndarray[NODE_t, ndim=1] nodes1, ndarray[NODE_t, ndim=1] nodes2,\n    ndarray[DFIELD_t, ndim=1] cross_clustering):\n\n    cdef:\n        int m = int(len(nodes1)), n = int(len(nodes2))\n        int i, j, k\n        NODE_t n1, n2, n3\n        long counter\n\n    for i in range(m):\n        n1 = nodes1[i]\n        # check if node1[i] has cross degree larger than 1\n        if norm[i]:\n            counter = 0\n            # loop over unique pairs of nodes in subnetwork 2\n            for j in range(n):\n                n2 = nodes2[j]\n                if A[n1, n2]:\n                    for k in range(j):\n                        n3 = nodes2[k]\n                        if A[n2, n3] and A[n3, n1]:\n                            counter += 1\n            cross_clustering[i] = counter / norm[i]\n\n\ndef _nsi_cross_local_clustering(\n    ndarray[ADJ_t, ndim=2] A,\n    ndarray[DFIELD_t, ndim=1] nsi_cc,\n    ndarray[NODE_t, ndim=1] nodes1, ndarray[NODE_t, ndim=1] nodes2,\n    ndarray[DWEIGHT_t, ndim=1] node_weights):\n\n    cdef:\n        int m = int(len(nodes1)), n = int(len(nodes2))\n        int v, p, q\n        NODE_t node_v, node_p, node_q\n        DWEIGHT_t weight_p\n\n    for v in range(m):\n        node_v = nodes1[v]\n        for p in range(n):\n            node_p = nodes2[p]\n            if A[node_v, node_p]:\n                weight_p = node_weights[node_p]\n                nsi_cc[v] += weight_p * weight_p\n                for q in range(p + 1, n):\n                    node_q = nodes2[q]\n                    if A[node_p, node_q] and A[node_q, node_v]:\n                        nsi_cc[v] += <WEIGHT_t>2 * weight_p * node_weights[node_q]\n\n\n# network =====================================================================\n\n\ndef _local_cliquishness_4thorder(\n    int N, ndarray[ADJ_t, ndim=2] A, ndarray[DEGREE_t, ndim=1] degree):\n\n    cdef:\n        int i, j, k, l\n        int index\n        NODE_t node1, node2, node3, degree_i, order = 4\n        long counter\n        ndarray[NODE_t, ndim=1] neighbors = np.zeros(N, dtype=NODE)\n        ndarray[DFIELD_t, ndim=1] local_cliquishness = \\\n            np.zeros(N, dtype=DFIELD)\n\n    # Iterate over all nodes\n    for i in range(N):\n        # If degree is smaller than order - 1, set local cliquishness to 0\n        degree_i = degree[i]\n        if degree_i >= order - 1:\n            # Get neighbors of node i\n            index = 0\n            for j in range(N):\n                if A[i, j] == 1:\n                    neighbors[index] = j\n                    index += 1\n            counter = 0\n            # Iterate over possibly existing edges between 3 neighbors of i\n            for j in range(degree_i):\n                node1 = neighbors[j]\n                for k in range(degree_i):\n                    node2 = neighbors[k]\n                    if A[node1, node2] == 1:\n                        for l in range(degree_i):\n                            node3 = neighbors[l]\n                            if A[node2, node3] == 1 and A[node3, node1] == 1:\n                                counter += 1\n            local_cliquishness[i] = counter /\\\n                (degree_i * (degree_i - 1) * (degree_i - 2))\n    return local_cliquishness\n\n\ndef _local_cliquishness_5thorder(\n    int N, ndarray[ADJ_t, ndim=2] A, ndarray[DEGREE_t, ndim=1] degree):\n\n    cdef:\n        int i, index\n        NODE_t j, k, l, m, node1, node2, node3, node4, degree_i, order = 5\n        long counter\n        ndarray[NODE_t, ndim=1] neighbors = np.zeros(N, dtype=NODE)\n        ndarray[DFIELD_t, ndim=1] local_cliquishness = \\\n            np.zeros(N, dtype=DFIELD)\n\n    # Iterate over all nodes\n    for i in range(N):\n        # If degree is smaller than order - 1, set local cliquishness to 0\n        degree_i = degree[i]\n        if degree_i >= order - 1:\n            # Get neighbors of node i\n            index = 0\n            for j in range(N):\n                if A[i, j] == 1:\n                    neighbors[index] = j\n                    index += 1\n            counter = 0\n            # Iterate over possibly existing edges between 4 neighbors of i\n            for j in range(degree_i):\n                node1 = neighbors[j]\n                for k in range(degree_i):\n                    node2 = neighbors[k]\n                    if A[node1, node2] == 1:\n                        for l in range(degree_i):\n                            node3 = neighbors[l]\n                            if A[node1, node3] == 1 and A[node2, node3] == 1:\n                                for m in range(degree_i):\n                                    node4 = neighbors[m]\n                                    if (A[node1, node4] == 1 and\n                                        A[node2, node4] == 1 and\n                                        A[node3, node4] == 1):\n                                        counter += 1\n            local_cliquishness[i] = counter /\\\n                (degree_i * (degree_i - 1) * (degree_i - 2) * (degree_i -3))\n    return local_cliquishness\n\n\ndef _nsi_betweenness(\n    int N, ndarray[DWEIGHT_t, ndim=1] w,\n    ndarray[DEGREE_t, ndim=1] k_in,\n    ndarray[DEGREE_t, ndim=1] k_out,\n    BOOLTYPE_t directed,\n    ndarray[NODE_t, ndim=1] flat_neighbors,\n    ndarray[MASK_t, ndim=1] is_source,\n    ndarray[NODE_t, ndim=1] targets):\n    \"\"\"\n    Performs Newman's algorithm. [Newman2001]_\n    \"\"\"\n\n    cdef:\n        long int E = len(flat_neighbors)\n        int j, qi, oi, queue_len, l_index, ql\n        NODE_t l, i, next_d, dl, ol, fi\n        DFIELD_t base_factor\n        ndarray[NODE_t, ndim=1] neighbors_offsets = np.zeros(N, dtype=NODE)\n        ndarray[NODE_t, ndim=1] distances_to_j = np.ones(N, dtype=NODE)\n        ndarray[NODE_t, ndim=1] n_predecessors = np.zeros(N, dtype=NODE)\n        ndarray[NODE_t, ndim=1] flat_predecessors = np.zeros(E, dtype=NODE)\n        ndarray[NODE_t, ndim=1] predecessors_offsets = np.zeros(N, dtype=NODE)\n        ndarray[NODE_t, ndim=1] queue = np.zeros(N, dtype=NODE)\n        ndarray[DFIELD_t, ndim=1] multiplicity_to_j = np.zeros(N, dtype=DFIELD)\n        ndarray[DFIELD_t, ndim=1] betweenness_to_j = np.zeros(N, dtype=DFIELD)\n        ndarray[DFIELD_t, ndim=1] excess_to_j = np.zeros(N, dtype=DFIELD)\n        ndarray[DFIELD_t, ndim=1] betweenness_times_w = np.zeros(N, dtype=DFIELD)\n\n    # init node offsets\n    # NOTE: We don't use k.cumsum() since that uses too much memory!\n    for i in range(1, N):\n        # prepare indexation via IN-degree for calculation of paths TO j\n        neighbors_offsets[i] = neighbors_offsets[i-1] + k_in[i-1]\n\n    if directed:\n        for i in range(1, N):\n            # prepare indexation via OUT-degree for storing predecessors\n            predecessors_offsets[i] = predecessors_offsets[i-1] + k_out[i-1]\n    else:\n        # no need to differentiate on undirected networks\n        predecessors_offsets = neighbors_offsets\n\n    for j in targets:\n        # init distances to j and queue of nodes by distance from j\n        distances_to_j.fill(2 * N)\n        n_predecessors.fill(0)\n        flat_predecessors.fill(0)\n        queue.fill(0)\n        multiplicity_to_j.fill(0)\n\n        # init contribution of paths ending in j to the betweenness of l\n        for l in range(N):\n            excess_to_j[l] = betweenness_to_j[l] = is_source[l] * w[l]\n\n        distances_to_j[j] = 0\n        queue[0] = j\n        queue_len = 1\n        multiplicity_to_j[j] = w[j]\n\n        # process the queue forward and grow it on the way: (this is the\n        # standard breadth-first search giving all the shortest paths to j)\n        qi = 0\n        while qi < queue_len:\n            i = queue[qi]\n            if i == -1:\n                # this should never happen ...\n                print(\"Opps: %d,%d,%d\\n\" % qi, queue_len, i)\n                break\n            next_d = distances_to_j[i] + 1\n            # iterate through all neighbors l of i\n            oi = neighbors_offsets[i]\n            for l_index in range(oi, oi+k_in[i]):\n                # if on a shortest l-j-path, register i as predecessor of l\n                l = flat_neighbors[l_index]\n                dl = distances_to_j[l]\n                if dl >= next_d:\n                    fi = predecessors_offsets[l] + n_predecessors[l]\n                    n_predecessors[l] += 1\n                    flat_predecessors[fi] = i\n                    multiplicity_to_j[l] += w[l] * multiplicity_to_j[i]\n                    if dl > next_d:\n                        distances_to_j[l] = next_d\n                        queue[queue_len] = l\n                        queue_len += 1\n            qi += 1\n\n        # process the queue again backward: (this is Newman's 2nd part where the\n        # contribution of paths ending in j to the betweenness of all nodes is\n        # computed recursively by traversing the shortest paths backwards)\n        for ql in range(queue_len-1, -1, -1):\n            l = queue[ql]\n            if l == -1:\n                print(\"Opps: %d,%d,%d\\n\" % ql, queue_len, l)\n                break\n            if l == j:\n                # set betweenness and excess to zero\n                betweenness_to_j[l] = excess_to_j[l] = 0\n            else:\n                # otherwise, iterate through all predecessors i of l:\n                base_factor = w[l] / multiplicity_to_j[l]\n                ol = predecessors_offsets[l]\n                for fi in range(ol, ol+n_predecessors[l]):\n                    # add betweenness to predecessor\n                    i = flat_predecessors[fi]\n                    betweenness_to_j[i] += betweenness_to_j[l] * base_factor * \\\n                        multiplicity_to_j[i]\n\n        betweenness_times_w += w[j] * (betweenness_to_j - excess_to_j)\n    return betweenness_times_w\n\n\ndef _mpi_newman_betweenness(\n    ndarray[ADJ_t, ndim=2] this_A, ndarray[DFIELD_t, ndim=2] V,\n    int N, int start_i, int end_i):\n    \"\"\"\n    This function does the outer loop for a certain range start_i-end_i of\n    c's.  it gets the full V matrix but only the needed rows of the A matrix.\n    Each parallel job will consist of a call to this function:\n    \"\"\"\n\n    cdef:\n        int i_rel, j, s, t, i_abs\n        double sum_s, sum_j, Vis_minus_Vjs\n\n        int this_N = end_i - start_i\n        ndarray[DFIELD_t, ndim=1] this_betweenness = \\\n            np.zeros(this_N, dtype=DFIELD)\n\n    for i_rel in range(this_N):\n        # correct i index for V matrix\n        i_abs = i_rel + start_i\n        for j in range(N):\n             if this_A[i_rel, j]:\n                sum_j = 0.0\n                for s in range(N):\n                    if i_abs != s:\n                        Vis_minus_Vjs = V[i_abs, s] - V[j, s]\n                        sum_s = 0.0\n                        for t in range(s):\n                            if i_abs != t:\n                                sum_s += abs(Vis_minus_Vjs - V[i_abs, t] +\n                                             V[j, t])\n                        sum_j += sum_s\n                this_betweenness[i_rel] += sum_j\n\n    return this_betweenness, start_i, end_i\n\n\ndef _mpi_nsi_newman_betweenness(\n    ndarray[ADJ_t, ndim=2] this_A,\n    ndarray[DFIELD_t, ndim=2] V, int N, ndarray[DWEIGHT_t, ndim=1] w,\n    ndarray[MASK_t, ndim=2] this_not_adj_or_equal, int start_i, int end_i):\n\n    cdef:\n        int i_rel, j, s, t, i_abs\n        double sum_s, sum_j, Vis_minus_Vjs\n\n        int this_N = end_i - start_i\n        ndarray[DFIELD_t, ndim=1] this_betweenness =\\\n            np.zeros(this_N, dtype=DFIELD)\n\n    for i_rel in range(this_N):\n        i_abs = i_rel + start_i\n        for j in range(N):\n             if this_A[i_rel, j]:\n                sum_j = 0.0\n                for s in range(N):\n                    if this_not_adj_or_equal[i_rel, s]:\n                        Vis_minus_Vjs = V[i_abs, s] - V[j, s]\n                        sum_s = 0.0\n                        for t in range(s):\n                            if this_not_adj_or_equal[i_rel, t]:\n                                sum_s += w[t] *\\\n                                    abs(Vis_minus_Vjs - V[i_abs, t] + V[j, t])\n                        sum_j += w[s] * sum_s\n                this_betweenness[i_rel] += w[j] * sum_j\n\n    return this_betweenness, start_i, end_i\n\n\n# grid ========================================================================\n\n\ndef _calculate_angular_distance(\n    ndarray[FIELD_t, ndim=1] cos_lat,\n    ndarray[FIELD_t, ndim=1] sin_lat,\n    ndarray[FIELD_t, ndim=1] cos_lon,\n    ndarray[FIELD_t, ndim=1] sin_lon,\n    ndarray[FIELD_t, ndim=2] cosangdist, int N):\n\n    cdef:\n        FIELD_t expr\n        int i,j\n\n    for i in range(N):\n        for j in range(i+1):\n            expr = sin_lat[i]*sin_lat[j] + cos_lat[i]*cos_lat[j] * \\\n                (sin_lon[i]*sin_lon[j] + cos_lon[i]*cos_lon[j])\n\n            if expr > 1:\n                expr = 1\n            elif expr < -1:\n                expr = -1\n\n            cosangdist[i, j] = cosangdist[j, i] = expr\n\n\ndef _calculate_euclidean_distance(\n    ndarray[FIELD_t, ndim=2] x,\n    ndarray[FIELD_t, ndim=2] distance,\n    int N_dim, int N_nodes):\n\n    cdef:\n        int i,j,k\n        FIELD_t expr\n\n    for i in range(N_nodes):\n        for j in range(i+1):\n            expr = 0\n            for k in range(N_dim):\n                expr += (x[k, i]-x[k, j])**2\n            distance[i, j] = distance[j, i] = expr**(<FIELD_t> 0.5)\n\n\n# resistive_network ===========================================================\n\n\ndef _vertex_current_flow_betweenness(int N, double Is, double It,\n    ndarray[FIELD_t, ndim=2] admittance, ndarray[FIELD_t, ndim=2] R,\n    int i):\n\n    return _vertex_current_flow_betweenness_fast(N, Is, It,\n        <FIELD_t*> cnp.PyArray_DATA(admittance),\n        <FIELD_t*> cnp.PyArray_DATA(R), i)\n\n\ndef _edge_current_flow_betweenness(int N, double Is, double It,\n    ndarray[FIELD_t, ndim=2] admittance,\n    ndarray[FIELD_t, ndim=2] R,):\n\n    # alloc output\n    cdef ndarray[FIELD_t, ndim=2, mode='c'] ECFB = \\\n            np.zeros((N, N), dtype=FIELD)\n\n    _edge_current_flow_betweenness_fast(N, Is, It,\n        <FIELD_t*> cnp.PyArray_DATA(admittance),\n        <FIELD_t*> cnp.PyArray_DATA(R),\n        <FIELD_t*> cnp.PyArray_DATA(ECFB))\n\n    return ECFB\n"
  },
  {
    "path": "src/pyunicorn/core/_ext/types.pxd",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\ncimport cython\ncimport numpy as cnp\n\ncnp.import_array()\n\n\nctypedef cnp.int8_t BOOLTYPE_t\nctypedef cnp.int8_t INT8TYPE_t\nctypedef cnp.int16_t INT16TYPE_t\nctypedef cnp.int32_t INT32TYPE_t\nctypedef cnp.int64_t INT64TYPE_t\nctypedef cnp.float32_t FLOAT32TYPE_t\nctypedef cnp.float64_t FLOAT64TYPE_t\n\nctypedef BOOLTYPE_t ADJ_t\nctypedef BOOLTYPE_t MASK_t\nctypedef INT8TYPE_t LAG_t\nctypedef INT16TYPE_t DEGREE_t\nctypedef INT32TYPE_t NODE_t\nctypedef FLOAT32TYPE_t WEIGHT_t\nctypedef FLOAT64TYPE_t DWEIGHT_t\nctypedef FLOAT32TYPE_t FIELD_t\nctypedef FLOAT64TYPE_t DFIELD_t\n"
  },
  {
    "path": "src/pyunicorn/core/_ext/types.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\nimport numpy as np\n\n\nBOOLTYPE = np.int8\nINT8TYPE = np.int8\nINT16TYPE = np.int16\nINT32TYPE = np.int32\nINT64TYPE = np.int64\nFLOAT32TYPE = np.float32\nFLOAT64TYPE = np.float64\n\nADJ = BOOLTYPE\nMASK = BOOLTYPE\nLAG = INT8TYPE\nDEGREE = INT16TYPE\nNODE = INT32TYPE\nWEIGHT = FLOAT32TYPE\nDWEIGHT = FLOAT64TYPE\nFIELD = FLOAT32TYPE\nDFIELD = FLOAT64TYPE\n\n\ndef to_cy(arr, ty):\n    return arr.astype(dtype=ty, copy=True, order='c', casting='same_kind')\n"
  },
  {
    "path": "src/pyunicorn/core/cache.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nThis module provides the mix-in class `Cached`, which manages LRU caches for\nderived quantity methods, with declared dependencies on mutable instance\nattributes.\n\"\"\"\n\nfrom abc import ABC, abstractmethod\nfrom functools import lru_cache, _lru_cache_wrapper, wraps\nfrom weakref import ReferenceType, ref\nfrom inspect import getmembers, ismethod\nfrom typing import Any, Tuple, Optional\nfrom collections.abc import Hashable\n\n\nclass CacheRef:\n    \"\"\"\n    Internal coupling layer between the global (class level) and local\n    (instance level) LRU caches maintained by a `Cached` subclass, i.e., a\n    wrapper that weakly references a local cache and that is held as a value in\n    a global cache.\n\n    The purpose of this wrapper is:\n      - to avoid strong references from a global to its local caches, so that\n        the latter can be destroyed together with the `Cached` instances owning\n        them,\n      - and to delete local caches when the global cache is cleared.\n\n    Implementation details\n    ----------------------\n\n    Rationale:\n\n      Global cache:\n        - logically associated to a `Cached` subclass method\n        - owned (strongly referenced) by a `Cached` subclass method\n        - populated by `@lru_cache(cached_global)`\n        - holds as keys: weak references to `Cached` subclass instances\n        - holds as values: `CacheRef` instances\n\n      Local cache:\n        - logically associated to a `Cached` subclass instance and method\n        - owned (strongly referenced) by a `Cached` subclass instance\n        - populated by `@lru_cache(cached_local)`\n        - holds as keys: method cache keys, as defined by `cached_local()` args\n        - holds as values: cached method results\n\n    Network of strong (==>) and weak (-->) references:\n\n      {obj}                          : <Cached object>\n       ==> .__class__                : <Cached class>\n        ==> .{method}                : <Cached.{method} method>\n         ==> .<locals>.cached_global : _lru_cache_wrapper\n          ==> .<locals>.cache        : dict\n           ==> .keys()               : dict_keys[<weakref to Cached object>]\n            --> ()                   : <Cached object>\n           ==> .values()             : dict_values[<CacheRef object>]\n            ==> .obj                 : <weakref to Cached object>\n             --> ()                  : <Cached object>\n       ==> .__cached_{method}__      : _lru_cache_wrapper\n        ==> .<locals>.cache          : dict\n         ==> .keys()                 : dict_keys[Tuple[...]]\n         ==> .values()               : dict_values[Any]\n\n    Call stack (~>) and runtime trigger (#>) during global clearing:\n\n         <Cached.{method} method>.cache_clear()\n      ~> <Cached.{method} method>.<locals>.cached_global.<locals>.cache.clear()\n      #> <CacheRef object>.__del__()  # no references left\n      ~> delattr(<Cached object>, \"__cached_{method}__\")\n    \"\"\"\n\n    __slots__ = [\"obj\", \"attr\"]\n\n    def __init__(self, obj, attr: str):\n        assert isinstance(getattr(obj, attr), _lru_cache_wrapper)\n        self.obj: ReferenceType = ref(obj)\n        self.attr = attr\n\n    @property\n    def cache(self) -> _lru_cache_wrapper:\n        return getattr(self.obj(), self.attr)\n\n    def __del__(self):\n        obj = self.obj()\n        if obj is not None:\n            delattr(obj, self.attr)\n\n\nclass Cached(ABC):\n    \"\"\"\n    A mix-in class which manages, for each subclass method decorated with\n    `@Cached.method()`, one global (class level) and multiple local (instance\n    level) LRU caches that are implemented via `@functools.lru_cache()`. The\n    global cache essentially implements a single dispatch mechanism.\n\n    The caches are populated simply by calling the decorated instance methods\n    with new arguments, and cache entries are invalidated when designated\n    instance attributes are mutated.\n\n    `Cached` guarantees a bounded number of global slots (cached instance) per\n    method, and a bounded number of local slots (cached argument tuples) per\n    method and instance. A local cache is destroyed together with its instance.\n    Given an instance `x`, a method cache can also be cleared by calling\n    `x.{method}.cache_clear()`, which destroys all associated local caches. All\n    method caches can be cleared by calling `x.cache_clear()`. For\n    implementation details, see `CacheRef`.\n\n    To inherit these capabilities, a subclass needs to:\n\n      - decorate derived quantity methods with `@Cached.method()`,\n      - provide a method `Cached.__cache_state__() -> Tuple[Hashable,...]`,\n        which is used by `Cached` to define the `__eq__()` and `__hash__()`\n        methods required by `@functools.lru_cache()`.\n\n    These mix-in class attributes affect subsequently decorated methods:\n\n      - cache_enable:      toggles method caching\n      - lru_params_global: sets global `@functools.lru_cache()` parameters\n      - lru_params_local:  sets local `@functools.lru_cache()` parameters\n\n    NOTE:\n\n        The intended caching behaviour, including invalidation semantics, is\n        specified by `tests/test_core/test_cache.py`.\n    \"\"\"\n\n    cache_enable = True\n\n    lru_params_global = {\"maxsize\": 16, \"typed\": False}\n    lru_params_local = {\"maxsize\": 3, \"typed\": True}\n\n    @abstractmethod\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        \"\"\"\n        Hashable tuple of mutable object attributes, which will determine the\n        instance identity for ALL cached method lookups in this class,\n        *in addition* to the built-in object `id()`. Returning an empty tuple\n        amounts to declaring the object immutable in general. Mutable\n        dependencies that are specific to a method should instead be declared\n        via `@Cached.method(attrs=(...))`.\n\n        NOTE:\n\n            A subclass is responsible for the consistency and cost of this\n            state descriptor. For example, hashing a large array attribute may\n            be circumvented by declaring it as a property, with a custom setter\n            method that increments a dedicated mutation counter.\n        \"\"\"\n\n    def __eq__(self, other):\n        return (self is other) and (\n            self.__cache_state__() == other.__cache_state__())\n\n    def __hash__(self):\n        return hash((id(self),) + self.__cache_state__())\n\n    @classmethod\n    def method(cls, name: Optional[str] = None,\n               attrs: Optional[Tuple[str, ...]] = None):\n        \"\"\"\n        Caching decorator based on `@functools.lru_cache()`.\n\n        Cache entries for decorated methods are indexed by the combination of:\n\n          - the object `id()`,\n          - the object-level mutable instance attributes, as declared by the\n            subclass method `__cache_state__()`,\n          - the method-level mutable instance attributes, as declared by the\n            optional decorator argument `attrs`, and\n          - the argument pattern at the call site, including the ordering of\n            named arguments.\n\n        The decorated method provides several attributes of its own, as defined\n        by `@functools.lru_cache()`, including:\n\n          - `cache_clear()`: empty the method cache for ALL class instances\n          - `__wrapped__`: undecorated original method\n\n        :arg name: Optionally print a message at the first method invocation.\n        :arg attrs: Optionally declare attribute names as mutable dependencies.\n\n        NOTE:\n\n            The same reasoning about consistency and cost applies to the\n            `attrs` argument as to the `__cache_state__()` method.\n\n        Implementation detail\n        ---------------------\n        The local cache can be accssed at `obj.__cached_{method_name}__`.\n        \"\"\"\n        # Evaluated at decorator instantiation.\n        attrs = () if attrs is None else attrs\n        assert isinstance(attrs, tuple)\n        assert all(isinstance(a, str) for a in attrs)\n        assert name is None or isinstance(name, str)\n\n        def wrapper(f):\n            \"\"\" Evaluated at decorator application (method definition). \"\"\"\n\n            def uncached(self, name, *args, **kwargs) -> Any:\n                \"\"\" Evaluated at uncached method invocation. \"\"\"\n                if name is not None and getattr(self, \"silence_level\", 0) <= 1:\n                    print(f\"Calculating {name}...\")\n                return f(self, *args, **kwargs)\n\n            if cls.cache_enable:\n                def create_local_cache(_self) -> _lru_cache_wrapper:\n                    \"\"\" Evaluated at first global cache miss. \"\"\"\n                    # closure holding an instance weakref\n                    @lru_cache(**cls.lru_params_local)\n                    def cached_local(_h, name, _l, *args, **kwargs):\n                        \"\"\" Evaluated at every local cache miss. \"\"\"\n                        # dereference instance, ignore hash after cache lookup,\n                        # remove `attrs` from args\n                        return uncached(_self(), name, *args[_l:], **kwargs)\n                    return cached_local\n\n                @lru_cache(**cls.lru_params_global)\n                def cached_global(_self: ReferenceType) -> CacheRef:\n                    \"\"\" Evaluated at every global cache miss. \"\"\"\n                    # dereference instance\n                    self = _self()\n                    assert self is not None, \"encountered dead weakref\"\n                    # access or create local cache\n                    cache_attr = f\"__cached_{f.__name__}__\"\n                    cached_local = getattr(self, cache_attr, None)\n                    if cached_local is None:\n                        cached_local = create_local_cache(_self)\n                        # store local cache as instance attribute\n                        setattr(self, cache_attr, cached_local)\n                    # store reference to local cache as global cache result\n                    return CacheRef(self, cache_attr)\n\n                @wraps(cached_global, assigned=('cache_info', 'cache_clear'))\n                def wrapped(self, *args, **kwargs):\n                    \"\"\" Evaluated at every decorated method invocation. \"\"\"\n                    # pass instance weakref, obtain local cache\n                    cached_local = cached_global(ref(self)).cache\n                    # pass instance hash, prepend `attrs` to args\n                    return cached_local(\n                        hash(self.__cache_state__()), name,\n                        len(attrs), *(getattr(self, a) for a in attrs),\n                        *args, **kwargs)\n\n            else:\n                def wrapped(self, *args, **kwargs):\n                    return uncached(self, name, *args, **kwargs)\n\n            # fully decorated method\n            return wraps(f)(wrapped)\n        return wrapper\n\n    @staticmethod\n    def is_global_cache(attr) -> bool:\n        return ismethod(attr) and all(\n            hasattr(attr, p) for p in (\"cache_clear\", \"__wrapped__\"))\n\n    def cache_clear(self, prefix: Optional[str] = None) -> None:\n        \"\"\"\n        Delete all method caches for ALL instances of `self.__class__`, and\n        also recursively for any owned `Cached` instances listed in\n        `self.__cache_state__()`. This is simply a loop over the\n        `cache_clear()` methods for the individual cached methods.\n\n        When a SINGLE instance is destroyed, its local method caches are\n        deleted as well. Hence, this function is only useful in cases where the\n        instances should be kept alive.\n\n        :arg prefix: Optionally restrict the deleted caches by method name.\n\n        NOTE:\n\n            Instead, *invalidating* individual cache entries for a SINGLE\n            instance is achieved by modifying the declared mutable attributes\n            of that instance, see `@Cached.method()`.\n        \"\"\"\n        for n, m in getmembers(self, predicate=self.is_global_cache):\n            if prefix is None or n.startswith(prefix):\n                m.cache_clear()\n        for attr in self.__cache_state__():\n            if isinstance(attr, Cached):\n                attr.cache_clear(prefix=prefix)\n"
  },
  {
    "path": "src/pyunicorn/core/data.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for analyzing spatially embedded complex networks, handling\nmultivariate data and generating time series surrogates.\n\"\"\"\n\nfrom typing import Optional\n\nimport numpy as np\ntry:\n    from h5netcdf.legacyapi import Dataset\nexcept ImportError:\n    try:\n        from netCDF4 import Dataset\n    except ImportError:\n        print(\"pyunicorn: Packages netCDF4 or h5netcdf could not be loaded. \"\n              \"Some functionality in class Data might not be available!\")\n\nfrom .geo_grid import GeoGrid\n\n\nclass Data:\n\n    \"\"\"\n    Encapsulates general spatio-temporal data.\n\n    Also contains methods to load data from various file formats\n    (currently NetCDF and ASCII).\n\n    Mainly an abstract class.\n    \"\"\"\n\n    #\n    #  Define internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, observable: np.ndarray, grid: GeoGrid,\n                 observable_name: str = None, observable_long_name: str = None,\n                 window: Optional[dict] = None, silence_level: int = 0):\n        \"\"\"\n        Initialize an instance of Data.\n\n        The spatio-temporal window is described by the following dictionary::\n\n            window = {\"time_min\": 0., \"time_max\": 0., \"lat_min\": 0.,\n                      \"lat_max\": 0., \"lon_min\": 0., \"lon_max\": 0.}\n\n        :type observable: 2D array [time, index]\n        :arg observable: The array of time series to be represented by the\n            :class:`Data` instance.\n        :type grid: :class:`.GeoGrid` instance\n        :arg grid: The GeoGrid representing the spatial coordinates associated\n            to the time series and their temporal sampling.\n        :arg str observable_name: A short name for the observable.\n        :arg str observable_long_name: A long name for the observable.\n        :arg dict window: Spatio-temporal window to select a view on the data.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n\n        self.silence_level = silence_level\n        \"\"\"(int) - The inverse level of verbosity of the object.\"\"\"\n        self._full_observable = observable\n\n        assert isinstance(grid, GeoGrid)\n        self._full_grid = grid\n        self.grid = None\n        \"\"\"The :class:`.GeoGrid` object associated with the data.\"\"\"\n\n        self.observable_name = observable_name\n        \"\"\"(str) - The short name of the observable within\n                      data file (particularly relevant for NetCDF).\"\"\"\n\n        self.observable_long_name = observable_long_name\n        \"\"\"(str) - The long name of the observable within data file.\"\"\"\n\n        self._observable = None\n        \"\"\"Current spatio-temporal view on the data.\"\"\"\n\n        self.file_name = \"\"\n        self.file_type = \"\"\n        self.vertical_level = None\n\n        #  Select a spatio-temporal window to look at the data, can later be\n        #  changed in run time without having to reload data from a file.\n        #  Force the calling of the Data.setWindow method, since child classes\n        #  may overwrite this method.\n        if window is None:\n            Data.set_global_window(self)\n        else:\n            Data.set_window(self, window)\n\n    def __str__(self):\n        \"\"\"Return a string representation of the object.\"\"\"\n        if self.file_name:\n            self.print_data_info()\n\n        return (f\"Data: {self.grid.N} grid points, \"\n                f\"{self.grid.n_grid_points} measurements.\\n\"\n                f\"Geographical boundaries:\\n{self.grid.print_boundaries()}\")\n\n    def set_silence_level(self, silence_level):\n        \"\"\"\n        Set the silence level.\n\n        Includes dependent objects such as :attr:`grid`.\n\n        :type silence_level: number (int)\n        :arg silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        self.silence_level = silence_level\n        self.grid.silence_level = silence_level\n        self._full_grid.silence_level = silence_level\n\n    #\n    #  Methods for creating Data objects and alternative constructors\n    #\n\n    @classmethod\n    # pylint: disable=too-many-positional-arguments\n    def Load(cls, file_name, observable_name, file_type, dimension_names=None,\n             window=None, vertical_level=None, silence_level=0):\n        \"\"\"\n        Initialize an instance of Data.\n\n        Supported file types ``file_type`` are:\n          - \"NetCDF\" for regular (rectangular) grids\n          - \"iNetCDF\" for irregular (e.g. geodesic) grids or station data.\n\n        The :index:`spatio-temporal window` is described by the following\n        dictionary::\n\n            window = {\"time_min\": 0., \"time_max\": 0., \"lat_min\": 0.,\n                      \"lat_max\": 0., \"lon_min\": 0., \"lon_max\": 0.}\n\n        .. note::\n            It is assumed that the NetCDF file to be loaded uses the following\n            dimension names: lat, lon, time (e.g., as is the case for\n            `NCEP/NCAR reanalysis 1 data <http://www.esrl.noaa.\n            gov/psd/data/gridded/data.ncep.reanalysis.html>`_). These standard\n            dimension names can be modified using the dimension_names argument.\n            Alternatively, the standard class constructor :meth:`__init__`\n            needs to be used after loading the data manually, e.g., employing\n            netcdf4-python or scipy.io.netcdf functionality.\n\n        :arg str file_name: The name of the data file.\n        :arg str observable_name: The short name of the observable within data\n            file (particularly relevant for NetCDF).\n        :arg str file_type: The type of the data file.\n        :arg dict dimension_names: The names of the dimensions as used in the\n            NetCDF file. Default: {\"lat\": \"lat\", \"lon\": \"lon\", \"time\": \"time\"}\n        :arg dict window: Spatio-temporal window to select a view on the data.\n        :arg int vertical_level: The vertical level to be extracted from the\n            data file. Is ignored for horizontal data sets. If None, the first\n            level in the data file is chosen.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if dimension_names is None:\n            dimension_names = {\"lat\": \"lat\", \"lon\": \"lon\", \"time\": \"time\"}\n\n        # Import data from given file\n        res = cls._load_data(file_name, file_type, observable_name,\n                             dimension_names, vertical_level)\n\n        # Create instance of Data\n        data = cls(observable=res[\"observable\"], grid=res[\"grid\"],\n                   observable_name=res[\"observable_name\"],\n                   observable_long_name=res[\"observable_long_name\"],\n                   window=window, silence_level=silence_level)\n\n        # Set some variables\n        data.file_name = file_name\n        data.file_type = file_type\n        data.vertical_level = vertical_level\n\n        return data\n\n    @staticmethod\n    def SmallTestData():\n        \"\"\"\n        Return test data set of 6 time series with 10 sampling points each.\n\n        **Example:**\n\n        >>> Data.SmallTestData().observable()\n        array([[  0.00000000e+00,   1.00000000e+00,   1.22464680e-16,\n                 -1.00000000e+00,  -2.44929360e-16,   1.00000000e+00],\n               [  3.09016994e-01,   9.51056516e-01,  -3.09016994e-01,\n                 -9.51056516e-01,   3.09016994e-01,   9.51056516e-01],\n               [  5.87785252e-01,   8.09016994e-01,  -5.87785252e-01,\n                 -8.09016994e-01,   5.87785252e-01,   8.09016994e-01],\n               [  8.09016994e-01,   5.87785252e-01,  -8.09016994e-01,\n                 -5.87785252e-01,   8.09016994e-01,   5.87785252e-01],\n               [  9.51056516e-01,   3.09016994e-01,  -9.51056516e-01,\n                 -3.09016994e-01,   9.51056516e-01,   3.09016994e-01],\n               [  1.00000000e+00,   1.22464680e-16,  -1.00000000e+00,\n                 -2.44929360e-16,   1.00000000e+00,   3.67394040e-16],\n               [  9.51056516e-01,  -3.09016994e-01,  -9.51056516e-01,\n                  3.09016994e-01,   9.51056516e-01,  -3.09016994e-01],\n               [  8.09016994e-01,  -5.87785252e-01,  -8.09016994e-01,\n                  5.87785252e-01,   8.09016994e-01,  -5.87785252e-01],\n               [  5.87785252e-01,  -8.09016994e-01,  -5.87785252e-01,\n                  8.09016994e-01,   5.87785252e-01,  -8.09016994e-01],\n               [  3.09016994e-01,  -9.51056516e-01,  -3.09016994e-01,\n                  9.51056516e-01,   3.09016994e-01,  -9.51056516e-01]])\n\n        :rtype: Data instance\n        :return: a Data instance for testing purposes.\n        \"\"\"\n        #  Create time series\n        ts = np.zeros((10, 6))\n\n        for i in range(6):\n            ts[:, i] = np.sin(np.arange(10) * np.pi / 10. + i * np.pi / 2.)\n\n        return Data(observable=ts, grid=GeoGrid.SmallTestGrid(),\n                    silence_level=2)\n\n    #\n    #  Defines methods to load data from files and display related information\n    #\n\n    @classmethod\n    # pylint: disable=too-many-positional-arguments\n    def _get_netcdf_data(cls, file_name, file_type, observable_name,\n                         dimension_names, vertical_level=None,\n                         silence_level=0):\n        \"\"\"\n        Import data from a NetCDF file with a regular and rectangular grid.\n\n        Supported file types ``file_type`` are:\n          - \"NetCDF\" for regular (rectangular) grids\n          - \"iNetCDF\" for irregular (e.g. geodesic) grids or station data\n\n        :arg str file_name: The name of the data file.\n        :arg str file_type: The format of the data file.\n        :arg str observable_name: The short name of the observable within data\n            file (particularly relevant for NetCDF).\n        :arg dict dimension_names: The names of the dimensions as used in the\n            NetCDF file. E.g., dimension_names = {\"lat\": \"lat\", \"lon\": \"lon\",\n            \"time\": \"time\"}.\n        :arg int vertical_level: The vertical level to be extracted from the\n            data file. Is ignored for horizontal data sets. If None, the first\n            level in the data file is chosen.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if silence_level <= 1:\n            print(\"Reading NetCDF File and converting data to NumPy array...\")\n\n        # Initialize dictionary of results\n        res = {}\n\n        # Open netCDF4 file\n        f = Dataset(file_name, \"r\")\n\n        # Create reference to observable\n        observable = f.variables[observable_name][:].astype(\"float32\")\n\n        # Get time axis from NetCDF file\n        time = f.variables[dimension_names[\"time\"]][:].astype(\"float32\")\n\n        # Get number of dimensions of data\n        n_dim = observable.ndim\n\n        # Distinguish between regular and irregular grids\n        if file_type == \"NetCDF\":\n            # Create GeoGrid instance\n            lat_grid = f.variables[dimension_names[\"lat\"]][:].astype(\"float32\")\n            lon_grid = f.variables[dimension_names[\"lon\"]][:].astype(\"float32\")\n            res[\"grid\"] = GeoGrid.RegularGrid(time, (lat_grid, lon_grid),\n                                              silence_level)\n\n            # If 3D data set (time, lat, lon), select whole data set\n            if n_dim == 3:\n                res[\"observable\"] = observable.copy()\n            # If 4D data set (time, level, lat, lon), select certain vertical\n            # level.\n            elif n_dim == 4:\n                # Handle selected vertical level\n                if vertical_level is None:\n                    level = 0\n                else:\n                    level = vertical_level\n\n                res[\"observable\"] = observable[:, level, :, :].copy()\n            else:\n                print(\"Regular NetCDF data sets with dimensions other than \"\n                      \"3 (time, lat, lon) or 4 (time, level, lat, lon) are \"\n                      \"not supported by Data class!\")\n\n        elif file_type == \"iNetCDF\":\n            # Create GeoGrid instance\n            lat_seq = f.variables[\"grid_center_lat\"][:].astype(\"float32\")\n            lon_seq = f.variables[\"grid_center_lon\"][:].astype(\"float32\")\n            res[\"grid\"] = GeoGrid(time, lat_seq, lon_seq, silence_level)\n\n            # If 2D data set (time, index), select whole data set\n            if n_dim == 2:\n                res[\"observable\"] = observable.copy()\n            # If 3D data set (time, level, index), select certain vertical\n            # level.\n            elif n_dim == 3:\n                # Handle selected vertical level\n                if vertical_level is None:\n                    level = 0\n                else:\n                    level = vertical_level\n\n                res[\"observable\"] = observable[:, level, :].copy()\n            else:\n                print(\"Irregular NetCDF data sets with dimensions other than \"\n                      \"2 (time, index) or 3 (time, level, index) are not \"\n                      \"supported by Data class!\")\n\n        # Get length of raw data time axis\n        n_time = res[\"observable\"].shape[0]\n        # Reshape observable to comply with the standard shape (time, index)\n        res[\"observable\"].shape = (n_time, -1)\n\n        # Get long name of observable\n        res[\"observable_long_name\"] = f.variables[observable_name].long_name\n\n        # Store name of observable\n        res[\"observable_name\"] = observable_name\n\n        f.close()\n        return res\n\n    @classmethod\n    # pylint: disable=too-many-positional-arguments\n    def _load_data(cls, file_name, file_type, observable_name,\n                   dimension_names, vertical_level=None, silence_level=0):\n        \"\"\"\n        Load data into a Numpy array and create a corresponding GeoGrid object.\n\n        Supported file types ``file_type`` are:\n          - \"NetCDF\" for regular (rectangular) grids\n          - \"iNetCDF\" for irregular (e.g. geodesic) grids or station data\n\n        :arg str file_name: The name of the data file.\n        :arg str file_type: The format of the data file.\n        :arg str observable_name: The short name of the observable within data\n            file (particularly relevant for NetCDF).\n        :arg dict dimension_names: The names of the dimensions as used in the\n            NetCDF file. E.g., dimension_names = {\"lat\": \"lat\", \"lon\": \"lon\",\n            \"time\": \"time\"}.\n        :arg int vertical_level: The vertical level to be extracted from the\n            data file. Is ignored for horizontal data sets. If None, the first\n            level in the data file is chosen.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if file_type in [\"NetCDF\", \"iNetCDF\"]:\n            return cls._get_netcdf_data(file_name, file_type, observable_name,\n                                        dimension_names, vertical_level,\n                                        silence_level)\n        else:\n            if silence_level <= 1:\n                print(\"This file type can currently not be read \"\n                      \"by pyunicorn.\")\n            return None\n\n    def print_data_info(self):\n        \"\"\"Print information on the data encapsulated by the Data object.\"\"\"\n        # Open netCDF4 file\n        f = Dataset(self.file_name, \"r\")\n        print(\"Global attributes:\")\n        for name in f.ncattrs():\n            print(name + \":\", getattr(f, name))\n        print(\"Variables (size):\")\n        for name, obj in f.variables.items():\n            print(f\"{name} ({len(obj)})\")\n        f.close()\n\n    def observable(self):\n        \"\"\"\n        Return the current spatio-temporal view on the data.\n\n        **Example:**\n\n        >>> Data.SmallTestData().observable()[0,:]\n        array([  0.00000000e+00,   1.00000000e+00,   1.22464680e-16,\n                -1.00000000e+00,  -2.44929360e-16,   1.00000000e+00])\n\n        :rtype: 2D Numpy array [time, space]\n        :return: the current spatio-temporal view on the data.\n        \"\"\"\n        return self._observable\n\n    #\n    #  Defines methods for windowing the data\n    #\n\n    def window(self):\n        \"\"\"\n        Return the current spatio-temporal window.\n\n        **Examples:**\n\n        >>> Data.SmallTestData().window()[\"lon_min\"]\n        2.5\n\n        >>> Data.SmallTestData().window()[\"lon_max\"]\n        15.0\n\n        :rtype: dictionary\n        :return: the current spatio-temporal window.\n        \"\"\"\n        return self.grid.boundaries()\n\n    def set_window(self, window):\n        \"\"\"\n        Select a rectangular spatio-temporal region from the data set.\n\n        Create a data array as well as a corresponding GeoGrid object to access\n        this window.\n\n        The time axis of the underlying raw data is assumed to be ordered and\n        increasing. The latitude and longitude sequences can be arbitrarily\n        chosen, i.e., no ordering and no regular grid is required.\n\n        The spatio-temporal window is described by the following dictionary::\n\n           window = {\"time_min\": 0., \"time_max\": 0., \"lat_min\": 0.,\n                     \"lat_max\": 0., \"lon_min\": 0., \"lon_max\": 0.}\n\n        If the temporal boundaries are equal, the data's full time range is\n        selected. If any of the two corresponding spatial boundaries are\n        equal, the data's full spatial extension is included.\n\n        **Example:**\n\n        >>> data = Data.SmallTestData()\n        >>> data.set_window(window={\n        ...     \"time_min\": 0., \"time_max\": 4., \"lat_min\": 10.,\n        ...     \"lat_max\": 20., \"lon_min\": 5., \"lon_max\": 10.})\n        >>> data.observable()\n        array([[  1.22464680e-16,  -1.00000000e+00],\n               [ -3.09016994e-01,  -9.51056516e-01],\n               [ -5.87785252e-01,  -8.09016994e-01],\n               [ -8.09016994e-01,  -5.87785252e-01],\n               [ -9.51056516e-01,  -3.09016994e-01]])\n\n        :type window: dictionary\n        :arg window: A spatio-temporal window to select a view on the data.\n        \"\"\"\n        # Collect arrays\n        full_time = self._full_grid.grid()[\"time\"]\n        full_lat_seq = self._full_grid.grid()[\"lat\"]\n        full_lon_seq = self._full_grid.grid()[\"lon\"]\n\n        # Get time indices for temporal window boundaries\n        if window[\"time_min\"] == window[\"time_max\"]:\n            # If boundaries time are equal, use all available time points\n            time_indices = np.repeat(True,\n                                     self._full_grid.grid_size()[\"time\"])\n        else:\n            # Get indices for chosen time boundaries\n            time_indices = (full_time >= window[\"time_min\"]) & \\\n                           (full_time <= window[\"time_max\"])\n\n        # Get indices of nodes lying within the prescribed spatial\n        # window boundaries\n        if (window[\"lat_min\"] == window[\"lat_max\"]) \\\n           or (window[\"lon_min\"] == window[\"lon_max\"]):\n            # If boundaries in latitude or longitude are equal, use all nodes\n            # from the full spatial grid.\n            # space_indices is an array of bool indicating whether a node\n            # lies within the window or not.\n            space_indices = np.repeat(True,\n                                      self._full_grid.grid_size()[\"space\"])\n        else:\n            # space_indices is an array of bool indicating whether a node\n            # lies within the window or not.\n            space_indices = (full_lat_seq >= window[\"lat_min\"]) & \\\n                            (full_lat_seq <= window[\"lat_max\"]) & \\\n                            (full_lon_seq >= window[\"lon_min\"]) & \\\n                            (full_lon_seq <= window[\"lon_max\"])\n\n        # Set windowed observable and grid object\n        time = full_time[time_indices]\n        lat_seq = full_lat_seq[space_indices]\n        lon_seq = full_lon_seq[space_indices]\n\n        self._observable = \\\n            self._full_observable[time_indices, :][:, space_indices]\n        self.grid = GeoGrid(time, lat_seq, lon_seq, self.silence_level)\n\n    def set_global_window(self):\n        \"\"\"\n        Set the view on the whole data set.\n\n        Select the full data set and creates a data array as well as\n        a corresponding GeoGrid object to access this window from outside.\n\n        **Example** (Set smaller window and subsequently restore global\n        window):\n\n        >>> data = Data.SmallTestData()\n        >>> data.set_window(window={\"time_min\": 0., \"time_max\": 4.,\n        ...                 \"lat_min\": 10., \"lat_max\": 20., \"lon_min\": 5.,\n        ...                 \"lon_max\": 10.})\n        >>> data.grid.grid()[\"lat\"]\n        array([ 10.,  15.], dtype=float32)\n        >>> data.set_global_window()\n        >>> data.grid.grid()[\"lat\"]\n        array([  0.,   5.,  10.,  15.,  20.,  25.], dtype=float32)\n        \"\"\"\n        global_window = {\"time_min\": 0., \"time_max\": 0., \"lat_min\": 0.,\n                         \"lat_max\": 0., \"lon_min\": 0., \"lon_max\": 0.}\n\n        self.set_window(global_window)\n\n    #\n    # Define methods for reformatting data\n    #\n\n    # TODO: Documentation.\n    @staticmethod\n    def rescale(array, var_type):\n        \"\"\"\n        Rescale an array to a given data type.\n\n        Returns the tuple\n        (scaled_array, scale_factor, add_offset, actual_range).\n        Allows flexible handling of final amount of\n        used storage volume for the file.\n\n        :type array:\n        :arg array:\n\n        :arg str var_type: Determines the desired final data type of the array.\n        \"\"\"\n        # TODO: Add example\n\n        ar_max = array.max()\n        ar_min = array.min()\n        actual_range = np.array([ar_min, ar_max])\n\n        if var_type == 'float64':\n            scaled_array = array.astype('float64')\n            scale_factor = 1.\n            add_offset = 0.\n        elif var_type == 'float32':\n            scaled_array = array.astype('float32')\n            scale_factor = 1.\n            add_offset = 0.\n        elif var_type == 'int32':\n            scale_factor = (ar_max - ar_min) / (2. * 2. ** 31 - 2.)\n            add_offset = (ar_max + ar_min) / 2.\n            array -= add_offset\n            array /= scale_factor\n            scaled_array = array.astype(\"int32\")\n        elif var_type == 'int16':\n            scale_factor = (ar_max - ar_min) / (2. * 2. ** 15 - 2.)\n            add_offset = (ar_max + ar_min) / 2.\n            array -= add_offset\n            array /= scale_factor\n            scaled_array = array.astype('int16')\n        elif var_type == 'uint8':\n            scale_factor = (ar_max - ar_min) / (2. ** 8 - 1.)\n            add_offset = ar_min\n            array -= add_offset\n            array /= scale_factor\n            scaled_array = array.astype('uint8')\n        else:\n            raise ValueError(f\"Data type {var_type} not supported.\")\n\n        return (scaled_array, scale_factor, add_offset, actual_range)\n\n    #\n    #  Define methods to prepare data for similarity measure calculation\n    #\n\n    @staticmethod\n    def normalize_time_series_array(time_series_array):\n        \"\"\"\n        :index:`Normalize <pair: normalize; time series array>` an array of\n        time series to zero mean and unit variance individually for each\n        individual time series.\n\n        Works also for complex valued time series.\n\n        **Modifies the given array in place!**\n\n        **Example:**\n\n        >>> ts = np.arange(16).reshape(4,4).astype(\"float\")\n        >>> Data.normalize_time_series_array(ts)\n        >>> ts.mean(axis=0)\n        array([ 0.,  0.,  0.,  0.])\n        >>> ts.std(axis=0)\n        array([ 1.,  1.,  1.,  1.])\n        >>> ts[:,0]\n        array([-1.34164079, -0.4472136 ,  0.4472136 ,  1.34164079])\n\n        :type time_series_array: 2D Numpy array [time, index]\n        :arg time_series_array: The time series array to be normalized.\n        \"\"\"\n        #  Remove mean value from time series at each node (grid point)\n        time_series_array -= time_series_array.mean(axis=0)\n\n        #  Normalize the variance of anomalies to one\n        time_series_array /= np.sqrt(\n            (time_series_array * time_series_array.conjugate()).mean(axis=0))\n\n        #  Correct for grid points with zero variance in their time series\n        time_series_array[np.isnan(time_series_array)] = 0\n\n    @staticmethod\n    def next_power_2(i):\n        \"\"\"\n        Return the power of two 2^n, that is greater or equal than i.\n\n        **Example:**\n\n        >>> Data.next_power_2(253)\n        256\n\n        :type i: number (float)\n        :arg i: Some real number.\n\n        :rtype: number (float)\n        :return: the power of two greater of equal than a given value.\n        \"\"\"\n        n = 2\n        while n < i:\n            n = n * 2\n\n        return n\n\n    @staticmethod\n    def zero_pad_data(data):\n        \"\"\"\n        Return :index:`zero padded data`, such that the length of individual\n        time series is a power of 2.\n\n        **Example:**\n\n        >>> ts = np.arange(20).reshape(5,4)\n        >>> Data.zero_pad_data(ts)\n        array([[  0.,   0.,   0.,   0.], [  0.,   1.,   2.,   3.],\n               [  4.,   5.,   6.,   7.], [  8.,   9.,  10.,  11.],\n               [ 12.,  13.,  14.,  15.], [ 16.,  17.,  18.,  19.],\n               [  0.,   0.,   0.,   0.], [  0.,   0.,   0.,   0.]])\n\n        :type data: 2D Numpy array [time, index]\n        :arg data: The data array to be zero padded.\n\n        :rtype: 2D Numpy array [time, index]\n        :return: the zero padded data array.\n        \"\"\"\n        (n_time, n_nodes) = data.shape\n\n        #  Get the power of n that is larger or equal than the length of\n        #  individual time series.\n        n = Data.next_power_2(n_time)\n\n        zeros_before = (n - n_time) // 2\n        zeros_after = (n - n_time) - (n - n_time) // 2\n\n        before = np.zeros((zeros_before, n_nodes))\n        after = np.zeros((zeros_after, n_nodes))\n\n        return np.concatenate((before, data, after), axis=0)\n\n    @staticmethod\n    def cos_window(data, gamma):\n        \"\"\"\n        Return a cosine window fitting the shape of the data argument.\n\n        The window is one for most of the time and goes to zero at the\n        boundaries of each time series in the data array.\n\n        The width of the cosine shaped decay region is controlled by the shape\n        parameter gamma:\n\n          - Gamma=1 means, that each of the two decay regions extends over\n            half of the time series.\n          - Gamma=0 means, that the decay regions vanish and the window\n            transformation becomes the identity.\n\n        **Example:**\n\n        >>> ts = np.arange(24).reshape(12,2)\n        >>> Data.cos_window(data=ts, gamma=0.75)\n        array([[ 0.        ,  0.        ], [ 0.14644661,  0.14644661],\n               [ 0.5       ,  0.5       ], [ 0.85355339,  0.85355339],\n               [ 1.        ,  1.        ], [ 1.        ,  1.        ],\n               [ 1.        ,  1.        ], [ 1.        ,  1.        ],\n               [ 0.85355339,  0.85355339], [ 0.5       ,  0.5       ],\n               [ 0.14644661,  0.14644661], [ 0.        ,  0.        ]])\n\n        :type data: 2D Numpy array [time, index]\n        :arg data: The data array to be fitted by cosine window.\n\n        :type gamma: number (float)\n        :arg gamma: The cosine window shape parameter.\n\n        :rtype: 2D Numpy array [time, index]\n        :return: the cosine window fitting data array.\n        \"\"\"\n        (n_time, n_nodes) = data.shape\n\n        #  Calculate length of decay regions\n        decay_length = int(gamma * n_time / 2)\n\n        #  Calculate decay and growth regions\n        growth_region = 0.5 * (1 + np.cos(\n            np.arange(decay_length) * np.pi / float(decay_length) + np.pi))\n        growth_region = np.tile(growth_region, (n_nodes, 1))\n        growth_region = growth_region.transpose()\n\n        decay_region = growth_region[::-1, :].copy()\n\n        return np.concatenate((growth_region,\n                               np.ones((n_time - 2 * decay_length, n_nodes)),\n                               decay_region), axis=0)\n"
  },
  {
    "path": "src/pyunicorn/core/geo_grid.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides class for horizontal two-dimensional spatio-temporal grid.\n\"\"\"\n\nimport numpy as np\n# Import package to calculate points inside a polygon\ntry:\n    from matplotlib import path\nexcept ImportError:\n    print(\"An error occurred when importing matplotlib.path! \"\n          \"Some functionality in GeoGrid class might not be available.\")\n\nfrom ._ext.types import to_cy, FIELD\nfrom ._ext.numerics import _calculate_angular_distance\nfrom .cache import Cached\nfrom .grid import Grid\n\n\nclass GeoGrid(Grid):\n    \"\"\"\n    Encapsulates a horizontal two-dimensional spatio-temporal grid on the\n    sphere.\n\n    The spatial grid points can be arbitrarily distributed, which is useful\n    for representing station data or geodesic grids.\n    \"\"\"\n\n    #\n    #  Definitions of internal methods\n    #\n\n    def __init__(self, time_seq: np.ndarray,\n                 lat_seq: np.ndarray, lon_seq: np.ndarray,\n                 silence_level: int = 0):\n        \"\"\"\n        Initialize an instance of GeoGrid.\n\n        :type time_seq: 1D Numpy array [time]\n        :arg time_seq: The increasing sequence of temporal sampling points.\n\n        :type lat_seq: 1D Numpy array [index]\n        :arg lat_seq: The sequence of latitudinal sampling points.\n\n        :type lon_seq: 1D Numpy array [index]\n        :arg lon_seq: The sequence of longitudinal sampling points.\n\n        :type silence_level: number (int)\n        :arg silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        Grid.__init__(self, time_seq, np.vstack((lat_seq, lon_seq)),\n                      silence_level)\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of the GeoGrid object.\n        \"\"\"\n        return (f\"GeoGrid: {self._grid_size['space']} grid points, \"\n                f\"{self._grid_size['time']} timesteps.\")\n\n    #\n    #  Functions for loading and saving the Grid object\n    #\n\n    def save_txt(self, filename):\n        \"\"\"\n        Save the GeoGrid object to text files.\n\n        The latitude, longitude and time sequences are stored in three separate\n        text files.\n\n        :arg str filename: The name of the files where Grid object is stored\n            (excluding ending).\n        \"\"\"\n        #  Gather sequences\n        lat_seq = self.lat_sequence()\n        lon_seq = self.lon_sequence()\n        time_seq = self.grid()[\"time\"]\n\n        #  Store as text files\n        try:\n            np.savetxt(filename + \"_lat.txt\", lat_seq)\n            np.savetxt(filename + \"_lon.txt\", lon_seq)\n            np.savetxt(filename + \"_time.txt\", time_seq)\n        except IOError:\n            print(\"An error occurred while saving Grid instance to \"\n                  f\"text files {filename}\")\n\n    @staticmethod\n    def LoadTXT(filename):\n        \"\"\"\n        Return a GeoGrid object stored in text files.\n\n        The latitude, longitude and time sequences are loaded from three\n        separate text files.\n\n        :arg str filename: The name of the files where the GeoGrid object is\n            stored (excluding endings).\n        :rtype: Grid object\n        :return: :class:`GeoGrid` instance.\n        \"\"\"\n        try:\n            lat_seq = np.loadtxt(filename + \"_lat.txt\")\n            lon_seq = np.loadtxt(filename + \"_lon.txt\")\n            time_seq = np.loadtxt(filename + \"_time.txt\")\n        except IOError:\n            print(\"An error occurred while loading Grid instance from \"\n                  f\"text files {filename}\")\n\n        return GeoGrid(time_seq, lat_seq, lon_seq)\n\n    #\n    #  Alternative constructors and Grid generation methods\n    #\n\n    @staticmethod\n    def SmallTestGrid():\n        \"\"\"\n        Return test grid of 6 spatial grid points with 10 temporal sampling\n        points each.\n\n        :rtype: GeoGrid instance\n        :return: a GeoGrid instance for testing purposes.\n        \"\"\"\n        return GeoGrid(time_seq=np.arange(10),\n                       lat_seq=np.array([0, 5, 10, 15, 20, 25]),\n                       lon_seq=np.array([2.5, 5., 7.5, 10., 12.5, 15.]),\n                       silence_level=2)\n\n    @staticmethod\n    def RegularGrid(time_seq, space_grid, silence_level=0):\n        \"\"\"\n        Initialize an instance of a regular grid.\n\n        **Examples:**\n\n        >>> GeoGrid.RegularGrid(\n        ...      time_seq=np.arange(2),\n        ...      space_grid=(np.array([0.,5.]),\n        ...                  np.array([1.,2.])),\n        ...      silence_level=2).lat_sequence()\n        array([ 0.,  0.,  5.,  5.], dtype=float32)\n        >>> GeoGrid.RegularGrid(\n        ...      time_seq=np.arange(2),\n        ...      space_grid=(np.array([0.,5.]),\n        ...                  np.array([1.,2.])),\n        ...      silence_level=2).lon_sequence()\n        array([ 1.,  2.,  1.,  2.], dtype=float32)\n\n        :type time_seq: 1D Numpy array [time]\n        :arg time_seq: The increasing sequence of temporal sampling points.\n        :type space_grid: tuple or list of two 1D Numpy arrays\n            ([n_lat], [n_lon])\n        :arg space_grid: The spatial grid, consisting of the latitudinal\n            and the longitudinal grid.\n        :type silence_level: number (int)\n        :arg silence_level: The inverse level of verbosity of the object.\n\n        :rtype: GeoGrid object\n        :return: :class:`GeoGrid` instance.\n        \"\"\"\n        try:\n            (lat_grid, lon_grid) = space_grid\n        except ValueError as e:\n            raise ValueError(\"'space_grid' must be a tuple or list of two \"\n                             \"items: lat_grid, lon_grid\") from e\n\n        #  Generate sequence of latitudes and longitudes for all nodes\n        lat_seq, lon_seq = GeoGrid.coord_sequence_from_rect_grid(lat_grid,\n                                                                 lon_grid)\n\n        #  Return instance of Grid\n        return GeoGrid(time_seq, lat_seq, lon_seq, silence_level)\n\n    #\n    #  Definitions of grid related functions\n    #\n\n    @staticmethod\n    def coord_sequence_from_rect_grid(lat_grid, lon_grid):\n        \"\"\"\n        Return the sequences of latitude and longitude for a regular and\n        rectangular grid.\n\n        **Example:**\n\n        >>> GeoGrid.coord_sequence_from_rect_grid(\n        ...     lat_grid=np.array([0.,5.]), lon_grid=np.array([1.,2.]))\n        (array([ 0.,  0.,  5.,  5.]), array([ 1.,  2.,  1.,  2.]))\n\n        :type lat_grid: 1D Numpy array [lat]\n        :arg lat_grid: The grid's latitudinal sampling points.\n\n        :type lon_grid: 1D Numpy array [lon]\n        :arg lon_grid: The grid's longitudinal sampling points.\n\n        :rtype: tuple of two 1D Numpy arrays [index]\n        :return: the coordinates of all nodes in the grid.\n        \"\"\"\n        space_seq = Grid.coord_sequence_from_rect_grid([lat_grid, lon_grid])\n\n        #  Return results as a tuple\n        return (space_seq[0], space_seq[1])\n\n    def lat_sequence(self):\n        \"\"\"\n        Return the sequence of latitudes for all nodes.\n\n        **Example:**\n\n        >>> GeoGrid.SmallTestGrid().lat_sequence()\n        array([  0.,   5.,  10.,  15.,  20.,  25.], dtype=float32)\n\n        :rtype: 1D Numpy array [index]\n        :return: the sequence of latitudes for all nodes.\n        \"\"\"\n        return self.sequence(0)\n\n    def lon_sequence(self):\n        \"\"\"\n        Return the sequence of longitudes for all nodes.\n\n        **Example:**\n\n        >>> GeoGrid.SmallTestGrid().lon_sequence()\n        array([  2.5,   5. ,   7.5,  10. ,  12.5,  15. ], dtype=float32)\n\n        :rtype: 1D Numpy array [index]\n        :return: the sequence of longitudes for all nodes.\n        \"\"\"\n        return self.sequence(1)\n\n    def convert_lon_coordinates(self, lon_seq):\n        \"\"\"\n        Return longitude coordinates in the system\n        -180 deg W <= lon <= +180 deg O for all nodes.\n\n        Accepts longitude coordinates in the system 0 deg <= lon <= 360 deg.\n        0 deg corresponds to Greenwich, England.\n\n        **Example:**\n\n        >>> GeoGrid.SmallTestGrid().convert_lon_coordinates(\n        ...     np.array([10.,350.,20.,340.,170.,190.]))\n        array([  10.,  -10.,   20.,  -20.,  170., -170.])\n\n        :type lon_seq: 1D Numpy array [index]\n        :arg lon_seq: Sequence of longitude coordinates.\n\n        :rtype: 1D Numpy array [index]\n        :return: the converted longitude coordinates for all nodes.\n        \"\"\"\n        new_lon_grid = np.empty(self.N)\n\n        for i in range(self.N):\n            if lon_seq[i] > 180.:\n                new_lon_grid[i] = lon_seq[i] - 360.\n            else:\n                new_lon_grid[i] = lon_seq[i]\n\n        return new_lon_grid\n\n    def node_number(self, lat_node, lon_node):\n        \"\"\"\n        Return the index of the closest node given geographical coordinates.\n\n        **Example:**\n\n        >>> GeoGrid.SmallTestGrid().node_number(lat_node=14., lon_node=9.)\n        3\n\n        :type lat_node: number (float)\n        :arg lat_node: The latitude coordinate.\n\n        :type lon_node: number (float)\n        :arg lon_node: The longitude coordinate.\n\n        :rtype: number (int)\n        :return: the closest node's index.\n        \"\"\"\n        # Get sequences of cosLat, sinLat, cosLon and sinLon for all nodes\n        cos_lat = self.cos_lat()\n        sin_lat = self.sin_lat()\n        cos_lon = self.cos_lon()\n        sin_lon = self.sin_lon()\n\n        sin_lat_v = np.sin(lat_node * np.pi / 180)\n        cos_lat_v = np.cos(lat_node * np.pi / 180)\n        sin_lon_v = np.sin(lon_node * np.pi / 180)\n        cos_lon_v = np.cos(lon_node * np.pi / 180)\n\n        #  Calculate angular distance from the given coordinate to all\n        #  other nodes\n        expr = sin_lat*sin_lat_v + cos_lat*cos_lat_v * (sin_lon*sin_lon_v\n                                                        + cos_lon*cos_lon_v)\n\n        #  Correct for rounding errors\n        expr[expr < -1.] = -1.\n        expr[expr > 1.] = 1.\n\n        angdist = np.arccos(expr)\n\n        #  Get index of closest node\n        n_node = angdist.argmin()\n\n        return n_node\n\n    def cos_lat(self):\n        \"\"\"\n        Return the sequence of cosines of latitude for all nodes.\n\n        **Example:**\n\n        >>> r(GeoGrid.SmallTestGrid().cos_lat()[:2])\n        array([ 1. , 0.9962])\n\n        :rtype: 1D Numpy array [index]\n        :return: the cosine of latitudes for all nodes.\n        \"\"\"\n        return np.cos(self.lat_sequence() * np.pi / 180)\n\n    def sin_lat(self):\n        \"\"\"\n        Return the sequence of sines of latitude for all nodes.\n\n        **Example:**\n\n        >>> r(GeoGrid.SmallTestGrid().sin_lat()[:2])\n        array([ 0. , 0.0872])\n\n        :rtype: 1D Numpy array [index]\n        :return: the sine of latitudes for all nodes.\n        \"\"\"\n        return np.sin(self.lat_sequence() * np.pi / 180)\n\n    def cos_lon(self):\n        \"\"\"\n        Return the sequence of cosines of longitude for all nodes.\n\n        **Example:**\n\n        >>> r(GeoGrid.SmallTestGrid().cos_lon()[:2])\n        array([ 0.999 , 0.9962])\n\n        :rtype: 1D Numpy array [index]\n        :return: the cosine of longitudes for all nodes.\n        \"\"\"\n        return np.cos(self.lon_sequence() * np.pi / 180)\n\n    def sin_lon(self):\n        \"\"\"\n        Return the sequence of sines of longitude for all nodes.\n\n        **Example:**\n\n        >>> r(GeoGrid.SmallTestGrid().sin_lon()[:2])\n        array([ 0.0436, 0.0872])\n\n        :rtype: 1D Numpy array [index]\n        :return: the sine of longitudes for all nodes.\n        \"\"\"\n        return np.sin(self.lon_sequence() * np.pi / 180)\n\n    def distance(self):\n        \"\"\"\n        Calculate and return the standard distance matrix of the corresponding\n        grid type\n\n        :rtype: 2D Numpy array [index, index]\n        :return: the distance matrix.\n        \"\"\"\n        return self.angular_distance()\n\n    @Cached.method(name=\"angular great circle distance\")\n    def angular_distance(self):\n        \"\"\"\n        Calculate the angular great circle distance matrix.\n\n        **No normalization applied anymore!** Return values are in the range\n        0 to Pi.\n\n        **Example:**\n\n        >>> rr(GeoGrid.SmallTestGrid().angular_distance(), 2)\n        [['0'    '0.1'  '0.19' '0.29' '0.39' '0.48']\n         ['0.1'  '0'    '0.1'  '0.19' '0.29' '0.39']\n         ['0.19' '0.1'  '0'    '0.1'  '0.19' '0.29']\n         ['0.29' '0.19' '0.1'  '0'    '0.1'  '0.19']\n         ['0.39' '0.29' '0.19' '0.1'  '0'    '0.1']\n         ['0.48' '0.39' '0.29' '0.19' '0.1'  '0']]\n\n        :rtype: 2D Numpy array [index, index]\n        :return: the angular great circle distance matrix.\n        \"\"\"\n        #  Get number of nodes\n        N = self.N\n        #  Initialize cython cof of angular distance matrix\n        cosangdist = np.zeros((N, N), dtype=FIELD)\n        _calculate_angular_distance(\n            #  Get sequences of cosLat, sinLat, cosLon and sinLon for all nodes\n            to_cy(self.cos_lat(), FIELD),\n            to_cy(self.sin_lat(), FIELD),\n            to_cy(self.cos_lon(), FIELD),\n            to_cy(self.sin_lon(), FIELD),\n            cosangdist, N)\n        return np.arccos(cosangdist)\n\n    def boundaries(self):\n        \"\"\"\n        Return the spatio-temporal grid boundaries.\n\n        Structure of the returned dictionary:\n          - boundaries = {\"time_min\": self._boundaries[\"time_min\"],\n                          \"time_max\": self._boundaries[\"time_max\"],\n                          \"lat_min\": self._boundaries[\"space_min\"][0],\n                          \"lat_max\": self._boundaries[\"space_max\"][1],\n                          \"lon_min\": self._boundaries[\"space_min\"][0],\n                          \"lon_max\": self._boundaries[\"space_max\"][1]}\n\n        :rtype: dictionary\n        :return: the spatio-temporal grid boundaries.\n        \"\"\"\n        boundaries = {\"time_min\": self._boundaries[\"time_min\"],\n                      \"time_max\": self._boundaries[\"time_max\"],\n                      \"lat_min\": self._boundaries[\"space_min\"][0],\n                      \"lat_max\": self._boundaries[\"space_max\"][0],\n                      \"lon_min\": self._boundaries[\"space_min\"][1],\n                      \"lon_max\": self._boundaries[\"space_max\"][1]}\n        return boundaries\n\n    def print_boundaries(self):\n        \"\"\"\n        Pretty print the spatio-temporal grid boundaries.\n\n        **Example:**\n\n        >>> print(GeoGrid.SmallTestGrid().print_boundaries())\n                 time     lat     lon\n           min    0.0    0.00    2.50\n           max    9.0   25.00   15.00\n\n        :rtype: string\n        :return: printable string for the spatio-temporal grid boundaries\n        \"\"\"\n        return (\n            \"         time     lat     lon\"\n            \"\\n   min {time_min:6.1f} {lat_min: 7.2f} {lon_min: 7.2f}\"\n            \"\\n   max {time_max:6.1f} {lat_max: 7.2f} {lon_max: 7.2f}\"\n        ).format(**self.boundaries())\n\n    def grid(self):\n        \"\"\"\n        Return the grid's spatio-temporal sampling points.\n\n        Structure of the returned dictionary:\n          - grid = {\"time\": self._grid[\"time\"],\n                    \"lat\": self._grid[\"space\"][0],\n                    \"lon\": self._grid[\"space\"][1]}\n\n        **Examples:**\n\n        >>> Grid.SmallTestGrid().grid()[\"space\"][0]\n        array([  0.,   5.,  10.,  15.,  20.,  25.], dtype=float32)\n        >>> Grid.SmallTestGrid().grid()[\"space\"][0][5]\n        15.0\n\n        :rtype: dictionary\n        :return: the grid's spatio-temporal sampling points.\n        \"\"\"\n        grid = {\"time\": self._grid[\"time\"],\n                \"lat\": self._grid[\"space\"][0],\n                \"lon\": self._grid[\"space\"][1]}\n        return grid\n\n    #\n    #  Methods for selecting regions\n    #\n\n    def region_indices(self, region):\n        \"\"\"\n        Returns a boolean array of nodes with True values when the node\n        is inside the region.\n\n        **Example:**\n\n        >>> GeoGrid.SmallTestGrid().region_indices(\n        ...     np.array([0.,0.,0.,11.,11.,11.,11.,0.])).astype(int)\n        array([0, 1, 1, 0, 0, 0])\n\n        :type region: 1D Numpy array [n_polygon_nodes]\n        :arg region: array of lon, lat, lon, lat, ...\n                     [-80.2, 5., -82.4, 5.3, ...] as copied from Google Earth\n                     Polygon file\n        :rtype: 1D bool array [index]\n        :return: bool array with True for nodes inside region\n        \"\"\"\n        # Reshape Google Earth array  into (n,2) array\n        remapped_region = region.reshape(len(region)//2, 2)\n        # Remap from East-West to 360 degree map if the longitudes are [0, 360]\n        if self._grid[\"space\"][1].min() >= 0:\n            remapped_region[remapped_region[:, 0] < 0, 0] = \\\n                360 + remapped_region[remapped_region[:, 0] < 0, 0]\n\n        lat_lon_map = np.column_stack((self._grid[\"space\"][1],\n                                       self._grid[\"space\"][0]))\n\n        return path.Path(remapped_region).contains_points(lat_lon_map)\n\n    @staticmethod\n    def region(name):\n        \"\"\"Return some standard regions.\"\"\"\n        if name == 'ENSO':\n            return np.array([-79.28273150749884, -10.49311965331937,\n                             -79.29849791038734, 10.12527300655218,\n                             -174.9221853596061, 10.07293121423917,\n                             -174.8362810586096, -10.46407198776264,\n                             -80.13229308153623, -10.36724072894785,\n                             -79.28273150749884, -10.49311965331937])\n        elif name == 'NINO34':\n            return np.array([-118.6402427933005, 7.019906838300821,\n                             -171.0067408177714, 6.215022481004243,\n                             -171.0364908514962, -5.768616252424354,\n                             -119.245702264066, -5.836385150138187,\n                             -118.6402427933005, 7.019906838300821])\n        else:\n            return None\n"
  },
  {
    "path": "src/pyunicorn/core/geo_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides class for analyzing complex network embedded on a spherical surface.\n\"\"\"\n\nimport numpy as np\nimport igraph\n\nfrom .spatial_network import SpatialNetwork\nfrom .geo_grid import GeoGrid\n\n\nclass GeoNetwork(SpatialNetwork):\n    \"\"\"\n    Encapsulates a network embedded on a spherical surface.\n\n    Particularly adds more network measures and statistics based on the\n    spatial embedding.\n\n    :ivar node_weight_type: (string) - The type of geographical node weight to\n                            be used.\n    \"\"\"\n\n    #\n    #  Definitions of internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, grid: GeoGrid, adjacency=None, edge_list=None,\n                 directed=False, node_weight_type=\"surface\", silence_level=0):\n        \"\"\"\n        Initialize an instance of GeoNetwork.\n\n        :type grid: :class:`.GeoGrid`\n        :arg grid: The GeoGrid object describing the network's spatial\n            embedding.\n        :type adjacency: 2D array (int8) [index, index]\n        :arg adjacency: The network's adjacency matrix.\n        :type edge_list: array-like list of lists\n        :arg  edge_list: Edge list of the new network.\n                         Entries [i,0], [i,1] contain the end-nodes of an edge.\n        :arg bool directed: Determines, whether the network is treated as\n            directed.\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        :arg int silence_level: The inverse level of verbosity of the object.\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos² lat)\n        \"\"\"\n        assert isinstance(grid, GeoGrid)\n        self.grid: GeoGrid = grid\n        \"\"\"GeoGrid object describing the network's spatial embedding\"\"\"\n\n        #  Call constructor of parent class Network\n        SpatialNetwork.__init__(self, grid=grid, adjacency=adjacency,\n                                edge_list=edge_list, directed=directed,\n                                silence_level=silence_level)\n\n        #  Set area weights\n        self.set_node_weight_type(node_weight_type)\n\n        #  cartesian coordinates of nodes\n        self.cartesian = None\n        self.grid_neighbours = None\n        self.grid_neighbours_set = None\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of the GeoNetwork object.\n        \"\"\"\n        return (f'GeoNetwork:\\n{SpatialNetwork.__str__(self)}\\n'\n                f'Geographical boundaries:\\n{self.grid.print_boundaries()}')\n\n    def set_node_weight_type(self, node_weight_type):\n        \"\"\"\n        Set node weights for calculation of n.s.i. measures according to\n        requested type.\n\n        Possible choices for ``node_weight_type``:\n          - None (constant unit weights)\n          - \"surface\" (cos lat)\n          - \"irrigation\" (cos² lat)\n\n        :arg str node_weight_type: The type of geographical node weight to be\n            used.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Setting area weights according to type \"\n                  f\"{node_weight_type} ...\")\n\n        #  Set instance variable accordingly\n        self.node_weight_type = node_weight_type\n\n        if node_weight_type == \"surface\":\n            self._node_weights = self.grid.cos_lat()\n        elif node_weight_type == \"irrigation\":\n            self._node_weights = np.square(self.grid.cos_lat())\n        #  If None or invalid choice:\n        else:\n            self._node_weights = None\n\n    #\n    #  Load and save GeoNetwork object\n    #\n\n    # pylint: disable=keyword-arg-before-vararg\n    @staticmethod\n    def Load(filename, fileformat=None, silence_level=0, *args, **kwds):\n        \"\"\"\n        Return a GeoNetwork object stored in files.\n\n        Unified reading function for graphs. Relies on and partially extends\n        the corresponding igraph function. Refer to igraph documentation for\n        further details on the various reader methods for different formats.\n\n        This method tries to identify the format of the graph given in\n        the first parameter and calls the corresponding reader method.\n\n        Existing node and link attributes/weights are also restored depending\n        on the chosen file format. E.g., the formats GraphML and gzipped\n        GraphML are able to store both node and link weights.\n\n        The remaining arguments are passed to the reader method without\n        any changes.\n\n        :arg tuple/list filename: Tuple or list of two strings, namely\n            the paths to the files containing the Network object\n            and the GeoGrid object (filename_network, filename_grid)\n        :arg str fileformat: the format of the file (if known in advance)\n          ``None`` means auto-detection. Possible values are: ``\"ncol\"`` (NCOL\n          format), ``\"lgl\"`` (LGL format), ``\"graphml\"``, ``\"graphmlz\"``\n          (GraphML and gzipped GraphML format), ``\"gml\"`` (GML format),\n          ``\"net\"``, ``\"pajek\"`` (Pajek format), ``\"dimacs\"`` (DIMACS format),\n          ``\"edgelist\"``, ``\"edges\"`` or ``\"edge\"`` (edge list),\n          ``\"adjacency\"`` (adjacency matrix), ``\"pickle\"`` (Python pickled\n          format).\n        :arg int silence_level: The inverse level of verbosity of the object.\n        :rtype: SpatialNetwork object\n        :return: :class:`GeolNetwork` instance.\n        \"\"\"\n        try:\n            (filename_network, filename_grid) = filename\n        except ValueError as e:\n            raise ValueError(\"'filename' must be a tuple or list of two \"\n                             \"items: filename_network, filename_grid\") from e\n\n        #  Load Grid object\n        grid = GeoGrid.Load(filename_grid)\n        print(grid.__class__)\n\n        #  Load to igraph Graph object\n        graph = igraph.Graph.Read(f=filename_network, format=fileformat,\n                                  *args, **kwds)\n\n        #  Extract adjacency matrix\n        A = np.array(graph.get_adjacency(type=2).data)\n\n        #  Create GeoNetwork instance\n        net = GeoNetwork(adjacency=A, grid=grid,\n                         directed=graph.is_directed(),\n                         silence_level=silence_level)\n\n        #  Extract node weights\n        if \"node_weight_nsi\" in graph.vs.attribute_names():\n            node_weights = \\\n                np.array(graph.vs.get_attribute_values(\"node_weight_nsi\"))\n            net.node_weights = node_weights\n\n        #  Overwrite igraph Graph object in Network instance to restore link\n        #  attributes/weights\n        net.graph = graph\n        #  invalidate cache\n        net._mut_la += 1\n        return net\n\n    def save_for_cgv(self, filename, fileformat=\"graphml\"):\n        \"\"\"\n        Save the GeoNetwork and its attributes for the CGV visualization\n        software.\n\n        The node coordinates are stored as node attributes by default, likewise\n        angular link distances are stored as edge attributes by default. All\n        additional node and link properties are also stored for visualization.\n\n        This format is intended for being used by the spatial graph\n        visualization software CGV developed in Rostock (contact Thomas Nocke,\n        nocke@pik-potsdam.de). By default, the file includes the latitude and\n        longitude vectors as node properties, as well as the geodesic angular\n        distance as an link property.\n\n        :arg str file_name: The file name should end with \".dot\" or \".gml\".\n        :arg str fileformat: The file format: \"graphml\"  - GraphML format\n            \"graphmlz\" - gzipped GraphML format\n            \"graphviz\" - GraphViz format\n        \"\"\"\n        #  Save node coordinates as node attribute\n        self.set_node_attribute(\"lat\", self.grid.lat_sequence())\n        self.set_node_attribute(\"lon\", self.grid.lon_sequence())\n\n        #  Save geodesic angular distances on the sphere as link attribute\n        self.set_link_attribute(\"ang_dist\", self.grid.angular_distance())\n\n        #  Save network, independent of filename!\n        if fileformat in [\"graphml\", \"graphmlz\", \"graphviz\"]:\n            self.graph.save(filename, format=fileformat)\n        else:\n            print(\"ERROR: the chosen format is not supported by save_for_cgv \"\n                  \"for use with the CGV software.\")\n\n    #\n    #  Graph generation methods\n    #\n\n    @staticmethod\n    def SmallTestNetwork():\n        \"\"\"\n        Return a 6-node undirected geographically embedded test network.\n\n        The test network consists of the SmallTestNetwork of the Network class\n        with node coordinates given by the SmallTestGrid of the GeoGrid class.\n\n        The network looks like this::\n\n                3 - 1\n                |   | \\\\\n            5 - 0 - 4 - 2\n\n        :rtype: GeoNetwork instance\n        :return: an instance of GeoNetwork for testing purposes.\n        \"\"\"\n        return GeoNetwork(grid=GeoGrid.SmallTestGrid(),\n                          adjacency=SpatialNetwork.SmallTestNetwork()\n                          .adjacency,\n                          directed=False, node_weight_type=\"surface\",\n                          silence_level=2)\n\n    @staticmethod\n    def Model(network_model, grid, node_weight_type=\"surface\", **kwargs):\n        \"\"\"\n        Return a new model graph generated with the specified network model\n        and embedded on a geographical grid\n        \"\"\"\n        A = getattr(GeoNetwork, network_model)(**kwargs)\n        return GeoNetwork(adjacency=A, grid=grid, directed=False,\n                          node_weight_type=node_weight_type)\n\n    #\n    #  Generate a geographical distribution\n    #\n\n    #  FIXME: Derive this method from a generalized variant based on n.s.i.\n    #  distributions.\n    def geographical_distribution(self, sequence, n_bins):\n        \"\"\"\n        Return a normalized geographical frequency distribution.\n\n        Also return the estimated statistical error and lower bin boundaries.\n\n        This function counts which percentage of total surface area falls into\n        a bin and NOT which number of nodes does so.\n\n        .. note::\n           Be aware that this method only returns meaningful results\n           for regular rectangular grids, where the representative area of each\n           node is proportional to the cosine of its latitude.\n\n        **Example:**\n\n        >>> net = GeoNetwork.SmallTestNetwork()\n        >>> r(net.geographical_distribution(\n        ...     sequence=net.degree(), n_bins=3)[0])\n        array([ 0.1565, 0.3367, 0.5068])\n\n        :type sequence: 1D Numpy array [index]\n        :arg sequence: The input sequence (e.g., some local network measure).\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of bins for histogram.\n\n        :rtype: tuple of three 1D Numpy arrays [bin]\n        :return: the geographical distribution, statistical error, and lower\n                 bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating geographical frequency distribution...\")\n\n        #  Initializations\n        hist = np.zeros(n_bins)\n\n        #  Get sequence of cosines of latitude\n        cos_lat = self.grid.cos_lat()\n        #  Calculate total dimensionless area of the sphere\n        norm = cos_lat.sum()\n\n        #  Get range for histogram\n        range_min = float(sequence.min())\n        range_max = float(sequence.max())\n\n        #  Calculate scaling factor for histogram\n        scaling = 1. / (range_max - range_min)\n\n        #  Get array of symbols corresponding to sequence\n        symbolic = \\\n            ((n_bins - 1) * scaling * (sequence - range_min)).astype(\"int\")\n\n        #  Calculate histogram\n        for i in range(len(sequence)):\n            hist[symbolic[i]] += cos_lat[i]\n\n        #  Normalize histogram by the total dimensionless area\n        hist /= norm\n\n        #  Construct lower bin boundaries\n        lbb = np.linspace(range_min, range_max, n_bins + 1)[:-1]\n\n        #  Calculate statistical error given by 1/n_i per bin i,\n        #  where n_i is the number of samples per bin.\n        error = np.zeros(n_bins)\n        error[hist != 0] = 1 / np.sqrt(hist[hist != 0])\n\n        return (hist, error, lbb)\n\n    def geographical_cumulative_distribution(self, sequence, n_bins):\n        \"\"\"\n        Return a normalized geographical cumulative distribution.\n\n        Also return estimated statistical error and the lower bin boundaries.\n\n        This function counts which percentage of total surface area has a value\n        of sequence larger or equal than the one bounded by a specific bin and\n        NOT which number of nodes does so.\n\n        .. note::\n           Be aware that this method only returns meaningful results\n           for regular rectangular grids, where the representative area of each\n           node is proportional to the cosine of its latitude.\n\n        **Example:**\n\n        >>> net = GeoNetwork.SmallTestNetwork()\n        >>> r(net.geographical_cumulative_distribution(\n        ...     sequence=net.degree(), n_bins=3)[0])\n        array([ 1. , 0.8435, 0.5068])\n\n        :type sequence: 1D Numpy array [index]\n        :arg sequence: The input sequence (e.g., some local network measure).\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of bins for histogram.\n\n        :rtype: tuple of three 1D Numpy arrays [bin]\n        :return: the cumulative geographical distribution, statistical error,\n                 and lower bin boundaries.\n        \"\"\"\n        (dist, error, lbb) = self.geographical_distribution(sequence, n_bins)\n        cumu_dist = np.zeros(n_bins)\n        for i in range(n_bins):\n            cumu_dist[i] = dist[i:].sum()\n        return (cumu_dist, error, lbb)\n\n    #\n    #  Area weighted connectivity (AWC) related measures\n    #\n\n    def area_weighted_connectivity(self):\n        \"\"\"\n        Return area weighted connectivity (:math:`AWC`).\n\n        It gives the fractional area of the network, a node is connected to.\n        :math:`AWC` is closely related to node splitting invariant degree\n        :meth:`.Network.nsi_degree` with area as node weight.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().area_weighted_connectivity())\n        array([ 0.4854, 0.499 , 0.3342, 0.3446, 0.5146, 0.1726])\n\n        :rtype: 1D Numpy array [index]\n        :return: the area weighted connectivity sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating area weighted connectivity...\")\n\n        if self.directed:\n            return (self.inarea_weighted_connectivity()\n                    + self.outarea_weighted_connectivity())\n        else:\n            return self.inarea_weighted_connectivity()\n\n    def inarea_weighted_connectivity(self):\n        \"\"\"\n        Return in-area weighted connectivity.\n\n        It gives the fractional area of the netwerk that connects to a given\n        node. For undirected networks, it calculates total area weighted\n        connectivity.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().inarea_weighted_connectivity())\n        array([ 0.4854, 0.499 , 0.3342, 0.3446, 0.5146, 0.1726])\n\n        :rtype: 1D Numpy array [index]\n        :return: the in-area weighted connectivity sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating in - area weighted connectivity...\")\n\n        #  Calculate the sequence of cosine of latitude for all nodes\n        cos_lat = self.grid.cos_lat()\n\n        #  Calculate total dimensionless area of the sphere\n        norm = cos_lat.sum()\n\n        #  Normalize area weighted connectivity by the total dimensionless area\n        inawc = cos_lat.dot(self.adjacency) / norm\n\n        return inawc\n\n    def outarea_weighted_connectivity(self):\n        \"\"\"\n        Return out-area weighted connectivity.\n\n        It gives the fractional area of the netwerk that a given node connects\n        to. For undirected networks, it calculates total area weighted\n        connectivity.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                outarea_weighted_connectivity())\n        array([ 0.4854, 0.499 , 0.3342, 0.3446, 0.5146, 0.1726])\n\n        :rtype: 1D Numpy array [index]\n        :return: the out-area weighted connectivity sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating out - area weighted connectivity...\")\n\n        #  Calculate the sequence of cosine of latitude for all nodes\n        cos_lat = self.grid.cos_lat()\n\n        #  Calculate total dimensionless area of the sphere\n        norm = cos_lat.sum()\n\n        #  Normalize area weighted connectivity by the total dimensionless area\n        outawc = np.dot(self.adjacency, cos_lat) / norm\n\n        return outawc\n\n    def area_weighted_connectivity_distribution(self, n_bins):\n        \"\"\"\n        Return the area weighted connectivity frequency distribution.\n\n        Also return estimated statistical error and lower bin boundaries.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                area_weighted_connectivity_distribution(n_bins=4)[0])\n        array([ 0.1565, 0.3367, 0.3446, 0.1622])\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of bins for histogram.\n\n        :rtype: tuple of three 1D Numpy arrays [bin]\n        :return: the :math:`AWC` distribution, statistical error,\n                 and lower bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating AWC frequency distribution...\")\n\n        awc = self.area_weighted_connectivity()\n\n        return self.geographical_distribution(awc, n_bins)\n\n    def inarea_weighted_connectivity_distribution(self, n_bins):\n        \"\"\"\n        Return the in-area weighted connectivity frequency distribution.\n\n        Also return estimated statistical error and lower bin boundaries.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                inarea_weighted_connectivity_distribution(n_bins=4)[0])\n        array([ 0.1565, 0.3367, 0.3446, 0.1622])\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of bins for histogram.\n\n        :rtype: tuple of three 1D Numpy arrays [bin]\n        :return: the in-:math:`AWC` distribution, statistical error,\n                 and lower bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating in-AWC frequency distribution...\")\n\n        in_awc = self.inarea_weighted_connectivity()\n\n        return self.geographical_distribution(in_awc, n_bins)\n\n    def outarea_weighted_connectivity_distribution(self, n_bins):\n        \"\"\"\n        Return the out-area weighted connectivity frequency distribution.\n\n        Also return estimated statistical error and lower bin boundaries.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                outarea_weighted_connectivity_distribution(n_bins=4)[0])\n        array([ 0.1565, 0.3367, 0.3446, 0.1622])\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of bins for histogram.\n\n        :rtype: tuple of three 1D Numpy arrays [bin]\n        :return: the out-:math:`AWC` distribution, statistical error,\n                 and lower bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating out-AWC frequency distribution...\")\n\n        out_awc = self.outarea_weighted_connectivity()\n\n        return self.geographical_distribution(out_awc, n_bins)\n\n    def area_weighted_connectivity_cumulative_distribution(self, n_bins):\n        \"\"\"\n        Return the cumulative area weighted connectivity distribution.\n\n        Also return estimated statistical error and lower bin boundaries.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                area_weighted_connectivity_cumulative_distribution(\n        ...         n_bins=4)[0])\n        array([ 1. , 0.8435, 0.5068, 0.1622])\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of bins for histogram.\n\n        :rtype: tuple of three 1D Numpy arrays [bin]\n        :return: the cumulative :math:`AWC` distribution, statistical error,\n                 and lower bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating cumulative AWC distribution...\")\n\n        awc = self.area_weighted_connectivity()\n\n        return self.geographical_cumulative_distribution(awc, n_bins)\n\n    def inarea_weighted_connectivity_cumulative_distribution(self, n_bins):\n        \"\"\"\n        Return the cumulative in-area weighted connectivity distribution.\n\n        Also return estimated statistical error and lower bin boundaries.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                inarea_weighted_connectivity_cumulative_distribution(\n        ...         n_bins=4)[0])\n        array([ 1. , 0.8435, 0.5068, 0.1622])\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of bins for histogram.\n\n        :rtype: tuple of three 1D Numpy arrays [bin]\n        :return: the cumulative in-:math:`AWC` distribution, statistical error,\n                 and lower bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating cumulative in-AWC distribution...\")\n\n        in_awc = self.inarea_weighted_connectivity()\n\n        return self.geographical_cumulative_distribution(in_awc, n_bins)\n\n    def outarea_weighted_connectivity_cumulative_distribution(self, n_bins):\n        \"\"\"\n        Return the cumulative out-area weighted connectivity distribution.\n\n        Also return estimated statistical error and lower bin boundaries.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                outarea_weighted_connectivity_cumulative_distribution(\n        ...         n_bins=4)[0])\n        array([ 1. , 0.8435, 0.5068, 0.1622])\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of bins for histogram.\n\n        :rtype: tuple of three 1D Numpy arrays [bin]\n        :return: the cumulative out-:math:`AWC` distribution, statistical\n                 error, and lower bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating cumulative out-AWC distribution...\")\n\n        out_awc = self.outarea_weighted_connectivity()\n\n        return self.geographical_cumulative_distribution(out_awc, n_bins)\n\n    def average_neighbor_area_weighted_connectivity(self):\n        \"\"\"\n        Return average neighbor area weighted connectivity.\n\n        .. note::\n           Does not use directionality information.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                average_neighbor_area_weighted_connectivity())\n        array([ 0.3439, 0.3978, 0.5068, 0.4922, 0.4395, 0.4854])\n\n        :rtype: 1D Numpy array [index]\n        :return: the average neighbor area weighted connectivity sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating average neighbour AWC...\")\n\n        A = self.undirected_adjacency()\n        degree = self.degree()\n        awc = self.area_weighted_connectivity()\n        average_neighbor_awc = A * awc\n\n        #  Normalize by node degree\n        average_neighbor_awc[degree != 0] /= degree[degree != 0]\n        return average_neighbor_awc\n\n    def max_neighbor_area_weighted_connectivity(self):\n        \"\"\"\n        Return maximum neighbor area weighted connectivity.\n\n        .. note::\n           Does not use directionality information.\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                max_neighbor_area_weighted_connectivity())\n        array([ 0.5146, 0.5146, 0.5146, 0.499 , 0.499 , 0.4854])\n\n        :rtype: 1D Numpy array [index]\n        :return: the maximum neighbor area weighted connectivity sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating maximum neighbour AWC...\")\n\n        A = self.undirected_adjacency().toarray()\n        awc = self.area_weighted_connectivity()\n        max_neighbor_awc = np.zeros(self.N)\n\n        for i in range(self.N):\n            max_neighbor_awc[i] = awc[A[i, :] == 1].max()\n\n        return max_neighbor_awc\n\n    #\n    #  Distance related measures\n    #\n\n    #  (Un)directed total link distances\n\n    def total_link_distance(self, geometry_corrected=False):\n        \"\"\"\n        Return the sequence of total link distances for all nodes.\n\n        .. note::\n           Does not use directionality information.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                total_link_distance(geometry_corrected=False))\n        array([ 0.1886, 0.097 , 0.0486, 0.0838, 0.1498, 0.0837])\n\n        :arg bool geometry_corrected: Toggles geometry correction.\n        :rtype: 1D array [index]\n        :return: the total link distance sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating total link distance...\")\n\n        ald = self.average_link_distance(geometry_corrected)\n        awc = self.area_weighted_connectivity()\n\n        return ald * awc\n\n    def intotal_link_distance(self, geometry_corrected=False):\n        \"\"\"\n        Return the sequence of in-total link distances for all nodes.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                intotal_link_distance(geometry_corrected=False))\n        array([ 0.1886, 0.097 , 0.0486, 0.0838, 0.1498, 0.0837])\n\n        :arg bool geometry_corrected: Toggles geometry correction.\n        :rtype: 1D array [index]\n        :return: the in-total link distance sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating in-total link distance...\")\n\n        in_ald = self.inaverage_link_distance(geometry_corrected)\n        in_awc = self.inarea_weighted_connectivity()\n\n        return in_ald * in_awc\n\n    def outtotal_link_distance(self, geometry_corrected=False):\n        \"\"\"\n        Return the sequence of out-total link distances for all nodes.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                outtotal_link_distance(geometry_corrected=False))\n        array([ 0.1886, 0.097 , 0.0486, 0.0838, 0.1498, 0.0837])\n\n        :arg bool geometry_corrected: Toggles geometry correction.\n        :rtype: 1D array [index]\n        :return: the out-total link distance sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating out-total link distance...\")\n\n        out_ald = self.outaverage_link_distance(geometry_corrected)\n        out_awc = self.outarea_weighted_connectivity()\n\n        return out_ald * out_awc\n\n    #  (Un)directed connectivity weighted link distances\n\n    def _calculate_general_connectivity_weighted_distance(self, adjacency,\n                                                          degree):\n        \"\"\"\n        Return general connectivity weighted link distances (CWD).\n\n        This method is called to calculate undirected CWD, in-CWD\n        and out-CWD.\n\n        :type adjacency: 2D array [index, index]\n        :arg adjacency: The adjacency matrix.\n        :type degree: 1D array [index]\n        :arg degree: The degree sequence.\n        :rtype: 1D array [index]\n        :return: the general connectivity weighted distance sequence.\n        \"\"\"\n        D = self.grid.angular_distance()\n        connectivity_weighted_distance = np.zeros(self.N)\n\n        cos_lat = self.grid.cos_lat()\n        norm = cos_lat.sum()\n\n        for i in range(self.N):\n            connectivity_weighted_distance[i] = \\\n                (adjacency[i, :] * cos_lat * D[i, :]).sum()\n\n        #  Normalize by node degree and total dimensionless area\n        connectivity_weighted_distance[degree != 0] /= \\\n            degree[degree != 0] * norm\n\n        return connectivity_weighted_distance\n\n    def connectivity_weighted_distance(self):\n        \"\"\"\n        Return undirected connectivity weighted link distances (CWD).\n\n        .. note::\n           Does not use directionality information.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                connectivity_weighted_distance())\n        array([ 0.0625, 0.0321, 0.0241, 0.0419, 0.05 , 0.0837])\n\n        :rtype: 1D Numpy array [index]\n        :return: the undirected connectivity weighted distance sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating connectivity weighted link distance...\")\n\n        A = self.undirected_adjacency().toarray()\n        degree = self.degree()\n        return self._calculate_general_connectivity_weighted_distance(\n            A, degree)\n\n    def inconnectivity_weighted_distance(self):\n        \"\"\"\n        Return in-connectivity weighted link distances (CWD).\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                inconnectivity_weighted_distance())\n        array([ 0.0625, 0.0321, 0.0241, 0.0419, 0.05 , 0.0837])\n\n        :rtype: 1D Numpy array [index]\n        :return: the in-connectivity weighted distance sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating in-connectivity weighted link distance...\")\n\n        A = self.adjacency.transpose()\n        indegree = self.indegree()\n\n        return self._calculate_general_connectivity_weighted_distance(A,\n                                                                      indegree)\n\n    def outconnectivity_weighted_distance(self):\n        \"\"\"\n        Return out-connectivity weighted link distances (CWD).\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                outconnectivity_weighted_distance())\n        array([ 0.0625, 0.0321, 0.0241, 0.0419, 0.05 , 0.0837])\n\n        :rtype: 1D Numpy array [index]\n        :return: the out-connectivity weighted distance sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating out-connectivity weighted link distance...\")\n\n        A = self.adjacency\n        outdegree = self.outdegree()\n\n        return self._calculate_general_connectivity_weighted_distance(\n            A, outdegree)\n\n    #\n    #  Clustering coefficients including geographical information\n    #\n\n    def local_geographical_clustering(self):\n        \"\"\"\n        Return local geographical clustering.\n\n        Returns the sequence of local clustering coefficients weighted by the\n        inverse angular great circle distance between nodes. This guarantees,\n        that short links between spatially neighboring nodes in a triangle are\n        weighted higher than long links between nodes that are spatially\n        far away.\n\n        Uses a definition of weighted clustering coefficient introduced in\n        [Holme2007]_.\n\n        .. note::\n           Experimental measure!\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().local_geographical_clustering())\n        Calculating local weighted clustering coefficient...\n        array([ 0. , 0.0998, 0.1489, 0. , 0.2842, 0. ])\n\n        :rtype: 1D Numpy array (index)\n        :return: the local geographical clustering sequence.\n        \"\"\"\n        ad = self.grid.angular_distance().copy()\n        ad[ad == 0] = np.inf\n        distance_weighted_adjacency = self.adjacency / ad\n        return self.weighted_local_clustering(distance_weighted_adjacency)\n\n    @staticmethod\n    def cartesian2latlon(pos):\n        return np.arcsin(pos[2]) * 180 / np.pi, \\\n            np.arctan2(pos[0], pos[1]) * 180 / np.pi\n\n    @staticmethod\n    def latlon2cartesian(lat, lon):\n        lat *= np.pi/180\n        lon *= np.pi/180\n        coslat = np.cos(lat)\n        return [coslat * np.sin(lon), coslat * np.cos(lon), np.sin(lat)]\n"
  },
  {
    "path": "src/pyunicorn/core/grid.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides class for spatio-temporal grids.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable\nimport pickle\n\nimport numpy as np\n\nfrom .cache import Cached\nfrom ._ext.types import to_cy, FIELD\nfrom ._ext.numerics import _calculate_euclidean_distance\n\n\nclass Grid(Cached):\n    \"\"\"\n    Encapsulates a spatio-temporal grid.\n\n    The spatial grid points can be arbitrarily distributed, which is useful\n    for representing station data or geodesic grids.\n    \"\"\"\n\n    #\n    #  Definitions of internal methods\n    #\n\n    def __init__(self, time_seq: np.ndarray, space_seq: np.ndarray,\n                 silence_level: int = 0):\n        \"\"\"\n        Initialize an instance of Grid.\n\n        :type time_seq: 1D Numpy array [time]\n        :arg time_seq: The increasing sequence of temporal sampling points.\n\n        :type space_seq: 2D Numpy array [dim, index]\n        :arg space_seq: The sequences of spatial sampling points.\n\n        :type silence_level: number (int)\n        :arg silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n\n        #  Set basic dictionaries\n        self._grid = {\"time\": time_seq.astype(\"float32\"),\n                      \"space\": space_seq.astype(\"float32\")}\n        self._grid_size = {\"time\": len(time_seq),\n                           \"space\": space_seq.shape[1]}\n\n        self._boundaries = {\"time_min\": time_seq.min(),\n                            \"time_max\": time_seq.max(),\n                            \"space_min\": np.amin(space_seq, axis=1),\n                            \"space_max\": np.amax(space_seq, axis=1)}\n\n        #  Defines the number of spatial grid points / nodes at one instant\n        #  of time\n        self.N = self._grid_size[\"space\"]\n        \"\"\"(number (int)) - The number of spatial grid points / nodes.\"\"\"\n\n        #  Set silence level\n        self.silence_level = silence_level\n        \"\"\"(number (int)) - The inverse level of verbosity of the object.\"\"\"\n\n        #  Defines the total number of data points / grid points / samples of\n        #  the corresponding data set.\n        self.n_grid_points = self._grid_size[\"time\"] * self.N\n        \"\"\"(number (int)) - The total number of data points / samples.\"\"\"\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        # The following attributes are assumed immutable:\n        #   (N, _grid)\n        return ()\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of the Grid object.\n        \"\"\"\n        return (f\"Grid: {self._grid_size['space']} grid points, \"\n                f\"{self._grid_size['time']} timesteps.\")\n\n    #\n    #  Functions for loading and saving the Grid object\n    #\n\n    def save(self, filename):\n        \"\"\"\n        Save the Grid object to a pickle file.\n\n        :arg str filename: The name of the file where Grid object is stored\n            (including ending).\n        \"\"\"\n        try:\n            with open(filename, 'wb') as f:\n                pickle.dump(self, f)\n        except IOError:\n            print(\"An error occurred while saving Grid instance to \"\n                  f\"pickle file {filename}\")\n\n    @staticmethod\n    def Load(filename):\n        \"\"\"\n        Return a Grid object stored in a pickle file.\n\n        :arg str filename: The name of the file where Grid object is stored\n            (including ending).\n        :rtype: Grid object\n        :return: :class:`Grid` instance.\n        \"\"\"\n        with open(filename, 'rb') as f:\n            grid = pickle.load(f)\n\n        return grid\n\n    #\n    #  Alternative constructors and Grid generation methods\n    #\n\n    @staticmethod\n    def SmallTestGrid():\n        \"\"\"\n        Return test grid of 6 spatial grid points with 10 temporal sampling\n        points each.\n\n        :rtype: Grid instance\n        :return: a Grid instance for testing purposes.\n        \"\"\"\n        return Grid(time_seq=np.arange(10),\n                    space_seq=np.array([[0, 5, 10, 15, 20, 25],\n                                        [2.5, 5., 7.5, 10., 12.5, 15.]]),\n                    silence_level=2)\n\n    @staticmethod\n    def RegularGrid(time_seq, space_grid, silence_level=0):\n        \"\"\"\n        Initialize an instance of a regular grid.\n\n        **Examples:**\n\n        >>> Grid.RegularGrid(\n        ...      time_seq=np.arange(2),\n                 space_grid=[np.array([0.,5.]), np.array([1.,2.])],\n                 silence_level=2).sequence(0)\n        array([ 0.,  0.,  5.,  5.], dtype=float32)\n        >>> Grid.RegularGrid(\n        ...     time_seq=np.arange(2),\n                space_grid=[np.array([0.,5.]), np.array([1.,2.])],\n                silence_level=2).sequence(1)\n        array([ 1.,  2.,  1.,  2.], dtype=float32)\n\n        :type time_seq: 1D Numpy array [time]\n        :arg time_seq: The increasing sequence of temporal sampling points.\n\n        :type space_grids: list of 1D Numpy arrays [dim, n]\n        :arg space_grids: The spatial grid.\n\n        :type silence_level: number (int)\n        :arg silence_level: The inverse level of verbosity of the object.\n\n        :rtype: Grid object\n        :return: :class:`Grid` instance.\n        \"\"\"\n        #  Generate sequences of positions for all nodes\n        space_seq = Grid.coord_sequence_from_rect_grid(space_grid)\n\n        #  Return instance of Grid\n        return Grid(time_seq, space_seq, silence_level)\n\n    #\n    #  Definitions of grid related functions\n    #\n\n    @staticmethod\n    def coord_sequence_from_rect_grid(space_grid):\n        \"\"\"\n        Return the sequences of coordinates for a regular and\n        rectangular grid.\n\n        **Example:**\n\n        >>> Grid.coord_sequence_from_rect_grid(\n        ...     space_grid=[np.array([0.,5.]), np.array([1.,2.])]\n        [array([ 0.,  0.,  5.,  5.]), array([ 1.,  2.,  1.,  2.])]\n\n        :type space_grid: list of 1D Numpy arrays [dim, n]\n        :arg space_grid: The grid's sampling points.\n\n        :rtype: list of 1D Numpy arrays [index]\n        :return: the coordinates of all nodes in the grid.\n        \"\"\"\n        space_seq = np.meshgrid(*space_grid)\n        space_seq = np.array([dim_seq.flatten('F') for dim_seq in space_seq])\n\n        return space_seq\n\n    def sequence(self, dimension):\n        \"\"\"\n        Return the positional sequence for all nodes for the specified\n        dimension.\n\n        **Example:**\n\n        >>> Grid.SmallTestGrid().sequence(0)\n        array([  0.,   5.,  10.,  15.,  20.,  25.], dtype=float32)\n\n        :type dimension: integer\n        :arg dimension: The number of the dimension\n\n        :rtype: 1D Numpy array [index]\n        :return: the sequence of positions in the specified dimension for all\n            nodes.\n        \"\"\"\n        return self._grid[\"space\"][dimension]\n\n    def node_number(self, x):\n        \"\"\"\n        Return the index of the closest node given euclidean coordinates.\n\n        **Example:**\n\n        >>> Grid.SmallTestGrid().node_number(x=(14., 9.))\n        3\n\n        :type x: number (float)\n        :arg x: The x coordinate.\n\n        :type y: number (float)\n        :arg y: The y coordinate.\n\n        :rtype: number (int)\n        :return: the closest node's index.\n        \"\"\"\n        x = np.array(x)\n\n        # Get the differences of the coordinates of all nodes to the given\n        # coordinates\n        diff = self._grid[\"space\"].T - x\n\n        # Get sequences of cosLat, sinLat, cosLon and sinLon for all nodes\n        dist = np.sqrt(np.sum(diff**2, axis=1))\n\n        #  Get index of closest node\n        n_node = dist.argmin()\n\n        return n_node\n\n    def node_coordinates(self, index):\n        \"\"\"\n        Return the position of node ``index``.\n\n        **Example:**\n\n        >>> Grid.SmallTestGrid().node_coordinates(3)\n        [15.0, 10.0]\n\n        :type index: number (int)\n        :arg index: The node index as used in node sequences.\n\n        :rtype: tuple of number (float)\n        :return: the node's coordinates.\n        \"\"\"\n        return tuple(self._grid[\"space\"][:, index])\n\n    def distance(self):\n        \"\"\"\n        Calculate and return the standard distance matrix of the corresponding\n        grid type\n\n        :rtype: 2D Numpy array [index, index]\n        :return: the distance matrix.\n        \"\"\"\n        return self.euclidean_distance()\n\n    @Cached.method()\n    def euclidean_distance(self):\n        \"\"\"\n        Return the euclidean distance matrix between grid points.\n\n        **Example:**\n\n        >>> Grid.SmallTestGrid().euclidean_distance().round(2)\n        [[ 0.    5.59 11.18 16.77 22.36 27.95]\n         [ 5.59  0.    5.59 11.18 16.77 22.36]\n         [11.18  5.59  0.    5.59 11.18 16.77]\n         [16.77 11.18  5.59  0.    5.59 11.18]\n         [22.36 16.77 11.18  5.59  0.    5.59]\n         [27.95 22.36 16.77 11.18  5.59  0.  ]]\n\n        :rtype: 2D Numpy array [index, index]\n        :return: the euclidean distance matrix.\n        \"\"\"\n        #  Get number of nodes\n        N_nodes = self.N\n\n        #  Get sequences of coordinates\n        sequences = to_cy(self._grid[\"space\"], FIELD)\n\n        #  Get number of dimensions\n        N_dim = sequences.shape[0]\n\n        distance = np.zeros((N_nodes, N_nodes), dtype=FIELD)\n        _calculate_euclidean_distance(sequences, distance, N_dim, N_nodes)\n        return distance\n\n    def boundaries(self):\n        \"\"\"\n        Return the spatio-temporal grid boundaries.\n\n        Structure of the returned dictionary:\n          - self._boundaries = {\"time_min\": time_seq.min(),\n                                \"time_max\": time_seq.max(),\n                                \"space_min\": np.amax(space_seq, axis=1),\n                                \"space_max\": np.amin(space_seq, axis=1)}\n\n        :rtype: dictionary\n        :return: the spatio-temporal grid boundaries.\n        \"\"\"\n        return self._boundaries\n\n    def grid(self):\n        \"\"\"\n        Return the grid's spatio-temporal sampling points.\n\n        Structure of the returned dictionary:\n          - self._grid = {\"time\": time_seq.astype(\"float32\"),\n                          \"space\": space_seq.astype(\"float32\")}\n\n        **Examples:**\n\n        >>> Grid.SmallTestGrid().grid()[\"space\"][0]\n        array([  0.,   5.,  10.,  15.,  20.,  25.], dtype=float32)\n        >>> Grid.SmallTestGrid().grid()[\"space\"][0][5]\n        15.0\n\n        :rtype: dictionary\n        :return: the grid's spatio-temporal sampling points.\n        \"\"\"\n        return self._grid\n\n    def grid_size(self):\n        \"\"\"\n        Return the sizes of the grid's spatial and temporal dimensions.\n\n        Structure of the returned dictionary:\n          - self._grid_size = {\"time\": len(time_seq),\n                               \"space\": space_seq.shape[1]}\n\n        **Example:**\n\n        >>> print(Grid2D.SmallTestGrid().print_grid_size())\n           space    time\n               6      10\n\n        :rtype: dictionary\n        :return: the sizes of the grid's spatial and temporal dimensions.\n        \"\"\"\n        return self._grid_size\n\n    def print_grid_size(self):\n        \"\"\"\n        Pretty print the sizes of the grid's spatial and temporal dimensions.\n        \"\"\"\n        return \"     space    time\\n   {space:7} {time:7}\".format(\n            **self.grid_size())\n\n    def geometric_distance_distribution(self, n_bins):\n        \"\"\"\n        Return the distribution of distances between all pairs of grid points.\n\n        **Examples:**\n\n        >>> Grid.SmallTestGrid().geometric_distance_distribution(3)[0].round(2)\n        array([0.33, 0.47, 0.2 ])\n        >>> Grid.SmallTestGrid().geometric_distance_distribution(3)[1].round(2)\n        array([ 0.  ,  9.32, 18.63, 27.95], dtype=float32)\n\n        :type n_bins: number (int)\n        :arg n_bins: The number of histogram bins.\n\n        :rtype: tuple of two 1D Numpy arrays [bin]\n        :return: the normalized histogram and lower bin boundaries of\n            distances.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating the geometric distance distribution of the \"\n                  \"grid...\")\n\n        #  Get angular distance matrix\n        D = self.distance()\n\n        #  Determine range for link distance histograms\n        max_range = D.max()\n        interval = (0, max_range)\n\n        #  Calculate geometry related factor of distributions to divide it out\n        (dist, lbb) = np.histogram(a=D, bins=n_bins, range=interval)\n        #  Subtract self.N from first bin because of spurious links with zero\n        #  distance on the diagonal of the angular distance matrix\n        dist[0] -= self.N\n\n        #  Normalize distribution\n        dist = dist.astype(\"float\")\n        dist /= dist.sum()\n\n        return (dist, lbb)\n"
  },
  {
    "path": "src/pyunicorn/core/interacting_networks.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for analyzing spatially embedded complex networks, handling\nmultivariate data and generating time series surrogates.\n\"\"\"\n\nimport numpy as np\nfrom numpy import random\n\nfrom ._ext.types import to_cy, ADJ, NODE, DWEIGHT, DFIELD\nfrom ._ext.numerics import _randomlySetCrossLinks, _randomlyRewireCrossLinks, \\\n    _cross_transitivity, _nsi_cross_transitivity, _cross_local_clustering, \\\n    _nsi_cross_local_clustering\n\nfrom .network import Network, NetworkError\n\n\nclass InteractingNetworks(Network):\n\n    \"\"\"\n    Encapsulates an ensemble of interacting networks.\n\n    Provides measures to analyze the interaction topology of different pairs of\n    subnetworks (groups of vertices).\n\n    So far, most methods only give meaningful results for undirected networks!\n\n    The idea of interacting networks and measures for their analysis are\n    described in [Donges2011a]_.\n\n    Consistently node-weighted measures for interacting network topologies are\n    derived, described and applied in [Wiedermann2011]_.\n    \"\"\"\n    #\n    #  Definitions of internal methods\n    #\n\n    def __init__(self, adjacency, directed=False, node_weights=None,\n                 silence_level=0):\n        \"\"\"\n        Initialize an instance of InteractingNetworks.\n\n        :type adjacency: square numpy array or list [node,node] of 0s and 1s\n        :arg  adjacency: Adjacency matrix of the new network.  Entry [i,j]\n            indicates whether node i links to node j.  Its diagonal must be\n            zero.  Must be symmetric if directed=False.\n        :arg bool directed: Indicates whether the network shall be considered\n            as directed. If False, adjacency must be symmetric.\n        :type node_weights: 1d numpy array or list [node] of floats >= 0\n        :arg  node_weights: Optional array or list of node weights to be used\n            for node splitting invariant network measures.  Entry [i] is the\n            weight of node i.  (Default: list of ones)\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        Network.__init__(self, adjacency=adjacency, directed=directed,\n                         node_weights=node_weights,\n                         silence_level=silence_level)\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of InteractingNetworks object.\n        \"\"\"\n        return 'InteractingNetworks:\\n' + Network.__str__(self)\n\n    #\n    #  Graph generation methods\n    #\n\n    @staticmethod\n    def SmallTestNetwork():\n        \"\"\"\n        Return a 6-node undirected test network.\n\n        The network looks like this::\n\n                3 - 1\n                |   | \\\\\n            5 - 0 - 4 - 2\n\n        :rtype: InteractingNetworks instance\n        :return: an InteractingNetworks instance for testing purposes.\n        \"\"\"\n        nw = InteractingNetworks(adjacency=[[0, 0, 0, 1, 1, 1],\n                                            [0, 0, 1, 1, 1, 0],\n                                            [0, 1, 0, 0, 1, 0],\n                                            [1, 1, 0, 0, 0, 0],\n                                            [1, 1, 1, 0, 0, 0],\n                                            [1, 0, 0, 0, 0, 0]],\n                                 directed=False,\n                                 node_weights=[0.6, 0.8, 1.0, 1.2, 1.4, 1.6],\n                                 silence_level=2)\n        link_weights = np.array([[0, 0, 0, 1.3, 2.5, 1.1],\n                                 [0, 0, 2.3, 2.9, 2.7, 0],\n                                 [0, 2.3, 0, 0, 1.5, 0],\n                                 [1.3, 2.9, 0, 0, 0, 0],\n                                 [2.5, 2.7, 1.5, 0, 0, 0],\n                                 [1.1, 0, 0, 0, 0, 0]])\n        nw.set_link_attribute(\"link_weights\", link_weights)\n        return nw\n\n    @staticmethod\n    def SmallDirectedTestNetwork():\n        \"\"\"\n        Return a 6-node directed test network with node and edge weights.\n\n        The node weights are [1.5, 1.7, 1.9, 2.1, 2.3, 2.5],\n        a typical node weight for corrected n.s.i. measures would be 2.0.\n\n        :rtype: InteractingNetworks instance\n        \"\"\"\n        nw = InteractingNetworks(adjacency=[[0, 1, 0, 1, 0, 0],\n                                            [0, 0, 1, 0, 1, 0],\n                                            [0, 0, 0, 0, 0, 0],\n                                            [0, 1, 0, 0, 0, 0],\n                                            [1, 0, 1, 0, 0, 0],\n                                            [1, 0, 0, 0, 0, 0]],\n                                 directed=True,\n                                 node_weights=[0.6, 0.8, 1.0, 1.2, 1.4, 1.6],\n                                 silence_level=1)\n        nw.set_link_attribute(\"link_weights\", np.array([[0, 1.3, 0, 2.5, 0, 0],\n                                                        [0, 0, 1.9, 0, 1.0, 0],\n                                                        [0, 0, 0, 0, 0, 0],\n                                                        [0, 3.0, 0, 0, 0, 0],\n                                                        [2.1, 0, 2.7, 0, 0, 0],\n                                                        [1.5, 0, 0, 0, 0, 0]]))\n        return nw\n\n    @staticmethod\n    def RandomlySetCrossLinks(network, node_list1, node_list2,\n                              cross_link_density=None,\n                              number_cross_links=None):\n        \"\"\"\n        Creates a set of random cross links between the considered\n        interacting subnetworks. The number of cross links to be set\n        can be chosen either explicitly or via a predefined cross link density.\n        By not choosing any of either, a null model is created under\n        preservation of the cross link density of the initial network.\n\n        Implementation:\n\n        Determines the number of cross links to be set.\n        Creates an empty cross adjacency matrix.\n        Randomly picks the coordinates of an entry and sets it to one.\n        Repeats the procedure until the desired cross link density\n        is reached.\n\n        :type network: InteractingNetworks instance\n        :arg network: The base network for setting random cross links.\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :rtype:  :class:`InteractingNetworks`\n        :return: The initial InteractingNetworks with random cross links\n        \"\"\"\n        #  store node lists as arrays\n        nodes1 = np.array(node_list1, dtype=NODE)\n        nodes2 = np.array(node_list2, dtype=NODE)\n        #  retrieve number of nodes\n        N1, N2 = len(nodes1), len(nodes2)\n        #  retrieve cross adjacency matrix\n        cross_A = network.cross_adjacency(nodes1, nodes2).astype(ADJ)\n\n        #  determine number of cross links\n        if cross_link_density is not None:\n            number_cross_links = int(cross_link_density * (N1 * N2))\n            print(\"Setting number of cross links according to \"\n                  \"chosen link density.\")\n        elif cross_link_density is None and number_cross_links is None:\n            number_cross_links = int(cross_A.sum())\n            print(\"Creating a null model for the given interacting networks.\")\n        #  else: take the explicitly chosen number of cross links\n        if number_cross_links > (N1 * N2):\n            print(\"The number of cross links exceeds maximum.\")\n            print(\"Setting link density of initial interacting network.\")\n            number_cross_links = int(cross_A.sum())\n\n        #  retrieve adjacency matrix of the full interacting network\n        A_new = network.adjacency.astype(ADJ)\n        #  create new empty cross adjacency matrix\n        cross_A_new = np.zeros((N1, N2), dtype=ADJ)\n\n        _randomlySetCrossLinks(A_new, cross_A_new, number_cross_links,\n                               nodes1, nodes2, N1, N2)\n        return InteractingNetworks(adjacency=A_new,\n                                   directed=network.directed,\n                                   node_weights=network.node_weights,\n                                   silence_level=network.silence_level)\n\n    @staticmethod\n    def RandomlySetCrossLinks_sparse(network, node_list1, node_list2,\n                                     cross_link_density=None,\n                                     number_cross_links=None):\n        \"\"\"\n        Creates a set of random cross links between the considered\n        interacting subnetworks. The number of cross links to be set\n        can be chosen either explicitly or via a predefined cross link density.\n        By not choosing any of either, a null model is created under\n        preservation of the cross link density of the initial network.\n\n        Implementation:\n\n        Determines the number of cross links to be set.\n        Creates an empty cross adjacency matrix.\n        Randomly picks the coordinates of an entry and sets it to one.\n        Repeats the procedure until the desired cross link density\n        is reached.\n\n        :type network: InteractingNetworks instance\n        :arg network: The base network for setting random cross links.\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :rtype:  :class:`InteractingNetworks`\n        :return: The initial InteractingNetworks with random cross links\n        \"\"\"\n        #  store node lists as arrays\n        nodes1 = np.array(node_list1, dtype=int)\n        nodes2 = np.array(node_list2, dtype=int)\n        #  retrieve number of nodes\n        N1, N2 = len(nodes1), len(nodes2)\n        #  retrieve cross adjacency matrix\n        cross_A = network.cross_adjacency_sparse(nodes1, nodes2).astype(int)\n\n        #  determine number of cross links\n        if cross_link_density is not None:\n            number_cross_links = int(cross_link_density * (N1 * N2))\n            print(\"Setting number of cross links according to chosen \\\n                  link density.\")\n        elif cross_link_density is None and number_cross_links is None:\n            number_cross_links = int(sum(cross_A.values()))\n            print(\"Creating a null model for the given interacting networks.\")\n        #  else: take the explicitly chosen number of cross links\n\n        if number_cross_links > (N1 * N2):\n            print(\"The number of cross links exceeds maximum.\")\n            print(\"Setting link density of initial interacting network.\")\n            number_cross_links = int(sum(cross_A.values()))\n\n        #  retrieve adjacency matrix of the full interacting network\n        A_new = network.sp_A.astype(int)\n        #  create new empty cross adjacency matrix\n        cross_A_new = np.zeros((N1, N2))\n\n        n_1, n_2 = 0, 0\n        node1, node2 = 0, 0\n        for i in range(number_cross_links):\n            while True:\n                n_1 = int(random.random() * N1)\n                n_2 = int(random.random() * N2)\n                if not (cross_A_new[n_1, n_2] == 1):\n                    break\n            cross_A_new[n_1, n_2] = 1\n        for i in range(N1):\n            for j in range(N2):\n                node1 = int(nodes1[i])\n                node2 = int(nodes2[j])\n                A_new[node1, node2] = cross_A_new[i, j]\n                A_new[node2, node1] = cross_A_new[i, j]\n\n        return InteractingNetworks(adjacency=A_new,\n                                   directed=network.directed,\n                                   node_weights=network.node_weights,\n                                   silence_level=network.silence_level)\n\n    @staticmethod\n    def RandomlyRewireCrossLinks(network, node_list1, node_list2, swaps):\n        \"\"\"\n        Randomize the cross links between two subnetworks under preservation of\n        cross degree centrality of both subnetworks.\n\n        Chooses randomly two cross links and swaps their ending points in\n        subnetwork 2.\n\n        Implementation:\n\n        Stores the coordinates of the \"1\"-entries of the cross adjacency matrix\n        in a tuple. Chooses randomly two entries of the tuple (ergo two cross\n        links) allowing for the constraints that\n\n        (1) the chosen links have distinct starting points in subnetwork 1 and\n            distinct ending points in subnetwork 2\n        (2) there do not exist intermediate links such that starting point of\n            link 1 is connected to ending point of link 2 and vice versa.\n\n        [In case two links have the same starting point or / and the same\n        ending point, condition (2) is never satisfied. Therefore only\n        condition (2) is implemented.]\n\n        Swaps the ending points of the links in subnetwork 2 and overwrites the\n        coordinates of the initial links in the tuple. The number of\n        permutation procedures is determined by the \"swaps\" argument and the\n        initial number of cross links. Creates a new adjacency matrix out of\n        the altered tuple of coordinates.\n\n        **Example** (Degree and cross degree sequences should be the same after\n        rewiring):\n\n        >>> net = InteractingNetworks.SmallTestNetwork()\n        >>> print(\"Degree:\", net.degree())\n        Degree: [3 3 2 2 3 1]\n        >>> print(\"Cross degree:\", net.cross_degree(\n        ...     node_list1=[0,3,5], node_list2=[1,2,4]))\n        Cross degree: [1 1 0]\n        >>> rewired_net = net.RandomlyRewireCrossLinks(\n        ...     network=net, node_list1=[0,3,5],\n        ...     node_list2=[1,2,4], swaps=10.)\n        >>> print(\"Degree:\", rewired_net.degree())\n        Degree: [3 3 2 2 3 1]\n        >>> print(\"Cross degree:\", rewired_net.cross_degree(\n        ...     node_list1=[0,3,5], node_list2=[1,2,4]))\n        Cross degree: [1 1 0]\n\n        :type network: :class:`InteractingNetworks` instance\n        :arg network: The base network for rewiring cross links.\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg float internal: Gives the fraction number_swaps /\n            number_cross_links.\n        :rtype:  :class:`InteractingNetworks`\n        :return: The initial InteractingNetworks with swapped cross links\n        \"\"\"\n        #  retrieve cross adjacency matrix of the considered interacting\n        #  network\n        cross_A = network.cross_adjacency(node_list1, node_list2).astype(ADJ)\n        #  determine number of cross links\n        number_cross_links = cross_A.sum()\n        #  Store node lists as arrays\n        nodes1 = np.array(node_list1, dtype=NODE)\n        nodes2 = np.array(node_list2, dtype=NODE)\n        #  retrieve adjacency matrix of the full interacting network\n        A_new = network.adjacency.astype(ADJ)\n        #  determine number of cross link permutations that will be performed\n        number_swaps = NODE(swaps * number_cross_links)\n        #  Create list of cross links\n        cross_links = np.array(cross_A.nonzero(), dtype=NODE).transpose()\n\n        _randomlyRewireCrossLinks(A_new, cross_A, cross_links, nodes1, nodes2,\n                                  number_cross_links, number_swaps)\n        return InteractingNetworks(adjacency=A_new,\n                                   directed=network.directed,\n                                   node_weights=network.node_weights,\n                                   silence_level=network.silence_level)\n\n    #\n    #  Define methods for handling the interacting networks\n    #\n\n    def subnetwork(self, node_list):\n        \"\"\"\n        Return the subnetwork induced by a subset of nodes as a Network object.\n\n        This can be used to conveniently analyze the subnetwork separately,\n        e.g., for calculation network measures solely this subnetwork.\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :rtype: Network\n        :return: the subnetwork induced by the nodes in node_list.\n        \"\"\"\n        return Network(adjacency=self.internal_adjacency(node_list),\n                       directed=self.directed,\n                       node_weights=self.node_weights[node_list],\n                       silence_level=self.silence_level)\n\n    def internal_adjacency(self, node_list):\n        \"\"\"\n        Return the adjacency matrix of a subnetwork induced by a subset of\n        nodes.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                internal_adjacency([0,3,5])\n        array([[0, 1, 1], [1, 0, 0], [1, 0, 0]], dtype=int8)\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                internal_adjacency([1,2,4])\n        array([[0, 1, 1], [1, 0, 1], [1, 1, 0]], dtype=int8)\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :rtype: 2D array [node index, node index]\n        :return: the subnetwork's adjacency matrix.\n        \"\"\"\n        #  Create igraph Graph object describing the subgraph\n        subgraph = self.graph.subgraph(node_list)\n        #  Get adjacency matrix\n        return np.array(subgraph.get_adjacency(type=2).data).astype(np.int8)\n\n    def cross_adjacency(self, node_list1, node_list2):\n        \"\"\"\n        Return cross adjacency matrix describing the interaction of two\n        subnetworks.\n\n        The cross adjacency matrix entry :math:`CA_{ij} = 1` describes that\n        node i in the first subnetwork is linked to node j in the second\n        subnetwork.  Vice versa, :math:`CA_{ji} = 1` indicates that node j in\n        the first subnetwork is linked to node i in the second subnetwork.\n\n        .. note::\n           The Cross adjacency matrix is NEITHER square NOR symmetric in\n           general!\n\n        **Examples:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                cross_adjacency([1,2,4], [0,3,5]))\n        array([[0, 1, 0], [0, 0, 0], [1, 0, 0]])\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                cross_adjacency([1,2,3,4], [0,5]))\n        array([[0, 0], [0, 0], [1, 0], [1, 0]])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :rtype: 2D array [node index_1, node index_2]\n        :return: the cross adjacency matrix.\n        \"\"\"\n        return self.adjacency[node_list1, :][:, node_list2]\n\n    def cross_adjacency_sparse(self, node_list1, node_list2):\n        \"\"\"\n        Return cross adjacency matrix describing the interaction of two\n        subnetworks.\n\n        The cross adjacency matrix entry M{CA_ij = 1} describes that node i\n        in the first subnetwork is linked to node j in the second subnetwork.\n        Vice versa, M{CA_ji = 1} indicates that node j in the first subnetwork\n        is linked to node i in the second subnetwork.\n\n        .. note::\n\n           The Cross adjacency matrix is NEITHER square NOR symmetric in\n           general!\n\n        Examples:\n\n        >>> print(InteractingNetworks.SmallTestNetwork().\\\n                cross_adjacency_sparse([1,2,4], [0,3,5]))\n        [[0 1 0] [0 0 0] [1 0 0]]\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :rtype: 2D array [node index_1, node index_2]\n        :return: the cross adjacency matrix.\n        \"\"\"\n        return self.sp_A[node_list1, :][:, node_list2].toarray()\n\n    def internal_link_attribute(self, attribute_name, node_list):\n        \"\"\"\n        Return a like attribute matrix of a subnetwork induced by a subset of\n        nodes.\n\n        **Example:**\n\n        >>> net = InteractingNetworks.SmallTestNetwork()\n        >>> r(net.internal_link_attribute(\"link_weights\", [1,2,3]))\n        array([[ 0. ,  2.3,  2.9],\n               [ 2.3,  0. ,  0. ],\n               [ 2.9,  0. ,  0. ]])\n\n        :arg str attribute_name: _name of link attribute to be used\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :rtype: square numpy array [node_index, node_index]\n        :return: link weights submatrix\n        \"\"\"\n        weights = np.zeros((len(node_list), len(node_list)))\n        subgraph = self.graph.subgraph(node_list)\n\n        if self.directed:\n            for e in subgraph.es:\n                weights[e.tuple] = e[attribute_name]\n        #  Symmetrize if subgraph is undirected\n        else:\n            for e in subgraph.es:\n                weights[e.tuple] = e[attribute_name]\n                weights[e.tuple[1], e.tuple[0]] = e[attribute_name]\n\n        return weights\n\n    def cross_link_attribute(self, attribute_name, node_list1, node_list2):\n        \"\"\"\n        Return a cross link weights matrix describing the interaction of two\n        subnetworks.\n\n        The cross link weights matrix entry :math:`CW_{ij} = w` describes that\n        node i in the first subnetwork is linked to node j in the second\n        subnetwork with weights :math:`w`.\n\n        .. note::\n\n           The cross link weights matrix is NEITHER square NOR symmetric in\n           general!\n\n        Example:\n\n        >>> net = InteractingNetworks.SmallTestNetwork()\n        >>> r(net.cross_link_attribute(\"link_weights\", [1,2,3], [0,4]))\n        array([[ 0. ,  2.7],\n               [ 0. ,  1.5],\n               [ 1.3,  0. ]])\n\n        :arg str attribute_name: _name of link attribute to be used\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :rtype: 2D array [node index_1, node index_2]\n        :return: the cross adjacency matrix.\n        \"\"\"\n        W = self.link_attribute(attribute_name)\n        return W[node_list1, :][:, node_list2]\n\n    def internal_path_lengths(self, node_list, link_attribute=None):\n        \"\"\"\n        Return internal path length matrix of an induced subnetwork.\n\n        Contains the paths length between all pairs of nodes within the\n        subnetwork. However, the paths themselves will generally contain nodes\n        from the full network. To avoid this and only consider paths lying\n        within the subnetwork, do the following:\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                subnetwork([0,3,5]).path_lengths()\n        array([[ 0., 1., 1.], [ 1., 0., 2.], [ 1., 2., 0.]])\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                internal_path_lengths([0,3,5], None)\n        array([[ 0., 1., 1.], [ 1., 0., 2.], [ 1., 2., 0.]])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                internal_path_lengths([1,2,4], None)\n        array([[ 0., 1., 1.], [ 1., 0., 1.], [ 1., 1., 0.]])\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 2D array [node index, node index]\n        :return: the internal path length matrix of an induced subnetwork.\n        \"\"\"\n        return self.\\\n            path_lengths(link_attribute)[node_list, :][:, node_list]\n\n    def cross_path_lengths(self, node_list1, node_list2, link_attribute=None):\n        \"\"\"\n        Return cross path length matrix for a pair of subnetworks.\n\n        Contains the path length between nodes from different subnetworks. The\n        paths may generally contain nodes from the full network.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_path_lengths([0,3,5], [1,2,4], None)\n        array([[ 2.,  2.,  1.], [ 1.,  2.,  2.], [ 3.,  3.,  2.]])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_path_lengths([0,5], [1,2,3,4], None)\n        array([[ 2.,  2.,  1.,  1.], [ 3.,  3.,  2.,  2.]])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 2D array [index1, index2]\n        :return: the cross path length matrix for a pair of subnetworks.\n        \"\"\"\n        return self.path_lengths(link_attribute)[node_list1, :][:, node_list2]\n\n    #\n    #  Define scalar statistics for interacting networks\n    #\n\n    def number_cross_links(self, node_list1, node_list2):\n        \"\"\"\n        Return the number of links connecting the two subnetworks.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                number_cross_links([0,3,5], [1,2,4])\n        2\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                number_cross_links([0,5], [1,2,3,4])\n        2\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return int: the number of links between nodes from different\n            subnetworks.\n        \"\"\"\n        if self.directed:\n            raise NetworkError(\"Not implemented yet...\")\n\n        return self.cross_adjacency(node_list1, node_list2).sum()\n\n    def total_cross_degree(self, node_list1, node_list2):\n        \"\"\"\n        Return the total cross degree of the two subnetworks.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                toal_cross_degree([0,3,5], [1,2,4])\n        1.0\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                total_cross_degree([0,5], [1,2,3,4]).round(4)\n        0.6667\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return int: the total cross degree.\n        \"\"\"\n        return np.mean(self.cross_degree(node_list1, node_list2))\n\n    def number_internal_links(self, node_list):\n        \"\"\"\n        Return the number of links within an induced subnetwork.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                number_internal_links([0,3,5])\n        2\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                number_internal_links([1,2,4])\n        3\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :return int: the number of links within a given subnetwork.\n        \"\"\"\n        n_links = self.internal_adjacency(node_list).sum()\n        if self.directed:\n            return n_links\n        else:\n            return n_links // 2\n\n    def cross_degree_density(self, node_list1, node_list2):\n        \"\"\"\n        Return the density of degrees, i.e., the cross degree sequence of the\n        first subnetwork normalized to the number of nodes in the second\n        subnetwork\n\n        **Example:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_degree_density([0,3,5], [1,2,4])\n        array([0.33333333, 0.33333333, 0.        ])\n\n        :arg [int] node_list1: list of node indices describing the first\n                               subnetwork\n\n        :arg [int] node_list2: list of node indices describing the second\n                               subnetwork\n\n        :rtype: 1D array [node index]\n        :return: the cross degree sequence.\n        \"\"\"\n\n        N2 = len(node_list2)\n        return self.cross_degree(node_list1, node_list2) / N2\n\n    def cross_link_density(self, node_list1, node_list2):\n        \"\"\"\n        Return the density of links between two subnetworks.\n\n        **Examples:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                cross_link_density([0,3,5], [1,2,4]))\n        0.2222\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_link_density([0,5], [1,2,3,4])\n        0.25\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return float: the density of links between two subnetworks.\n        \"\"\"\n        N1, N2 = len(node_list1), len(node_list2)\n        if self.directed:\n            raise NetworkError(\"Not implemented yet...\")\n\n        n_cl = self.number_cross_links(node_list1, node_list2)\n        return float(n_cl) / (N1 * N2)\n\n    def internal_link_density(self, node_list):\n        \"\"\"\n        Return the density of links within an induced subnetwork.\n\n        **Examples:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                internal_link_density([0,3,5]))\n        0.6667\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                internal_link_density([1,2,3,4]))\n        0.6667\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :return float: the density of links within a subnetwork.\n        \"\"\"\n        N = len(node_list)\n        n_links = InteractingNetworks.number_internal_links(self, node_list)\n        if self.directed:\n            return float(n_links) / (N * (N - 1))\n        else:\n            return 2 * float(n_links) / (N * (N - 1))\n\n    def internal_global_clustering(self, node_list):\n        \"\"\"\n        Return internal global clustering coefficients for an induced\n        subnetwork.\n\n        Internal global clustering coefficients are calculated as mean values\n        from the local clustering sequence of the whole network. This\n        implies that triangles spanning different subnetworks will generally\n        contribute to the internal clustering coefficient.\n\n        To avoid this and consider only triangles lying within the subnetwork:\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                subnetwork([0,3,5]).global_clustering())\n        0.0\n\n        **Examples:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                internal_global_clustering([0,3,5]))\n        0.0\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                internal_global_clustering([1,2,4]))\n        0.5556\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :return float: the internal global clustering coefficient for a\n            subnetwork.\n        \"\"\"\n        clustering = self.local_clustering()\n        internal_clustering = clustering[node_list].mean()\n        return internal_clustering\n\n    def cross_global_clustering(self, node_list1, node_list2):\n        \"\"\"\n        Return global cross clustering for a pair of subnetworks.\n\n        The global cross clustering coefficient C_v gives the average\n        probability, that two randomly drawn neighbors in subnetwork 2 of node\n        v in subnetwork 1 are also neighbors and vice versa. It counts\n        triangles having one vertex in subnetwork 1 and two vertices in\n        subnetwork 2 and vice versa.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_global_clustering([0,3,5], [1,2,4])\n        0.0\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_global_clustering([2], [1,3,4])\n        1.0\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_global_clustering([3,4], [1,2])\n        0.5\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return float: the cross global clustering coefficient for a pair of\n            subnetworks.\n        \"\"\"\n        #  Get cross local clustering sequences\n        cc = InteractingNetworks.cross_local_clustering(self,\n                                                        node_list1, node_list2)\n        return cc.mean()\n\n    def cross_global_clustering_sparse(self, node_list1, node_list2):\n        \"\"\"\n        Return global cross clustering for a pair of subnetworks.\n\n        The global cross clustering coefficient C_v gives the average\n        probability, that two randomly drawn neighbors in subnetwork 2 of node\n        v in subnetwork 1 are also neighbors and vice versa. It counts\n        triangles having one vertex in subnetwork 1 and two vertices in\n        subnetwork 2 and vice versa.\n\n        Examples:\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_global_clustering_sparse([0,3,5], [1,2,4])\n        0.0\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_global_clustering_sparse([2], [1,3,4])\n        1.0\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_global_clustering_sparse([3,4], [1,2])\n        0.5\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return float: the cross global clustering coefficient for a pair of\n            subnetworks.\n        \"\"\"\n        #  Get cross local clustering sequences\n        cc = self.cross_local_clustering_sparse(node_list1, node_list2)\n        return cc.mean()\n\n    def cross_transitivity(self, node_list1, node_list2):\n        \"\"\"\n        Return cross transitivity for a pair of subnetworks.\n\n        The cross transitivity is the probability, that two randomly drawn\n        neighbors in subnetwork 2 of node v in subnetwork 1 are also neighbors.\n        It counts triangles having one vertex in subnetwork 1 and two vertices\n        in subnetwork 2. Cross transitivity tends to weight low cross degree\n        vertices less strongly when compared to the global cross clustering\n        coefficient (see [Newman2003]_).\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_transitivity([0,3,5], [1,2,4])\n        0.0\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_transitivity([2], [1,3,4])\n        1.0\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_transitivity([3,4], [1,2])\n        1.0\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return float: the cross transitivity for a pair of subnetworks.\n        \"\"\"\n        return _cross_transitivity(\n            to_cy(self.adjacency, ADJ),\n            np.array(node_list1, dtype=NODE), np.array(node_list2, dtype=NODE))\n\n    def cross_transitivity_sparse(self, node_list1, node_list2):\n        \"\"\"\n        Return cross transitivity for a pair of subnetworks.\n\n        The cross transitivity is the probability, that two randomly drawn\n        neighbors in subnetwork 2 of node v in subnetwork 1 are also\n        neighbors. It counts triangles having one vertex in\n        subnetwork 1 and two vertices in subnetwork 2. Cross\n        transitivity tends to weight low cross degree vertices less strongly\n        when compared to the global cross clustering coefficient (see Newman,\n        SIAM Review, 2003).\n\n        Examples:\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_transitivity_sparse([0,3,5], [1,2,4])\n        0.0\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_transitivity_sparse([3,4], [1,2])\n        1.0\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return float: the cross transitivity for a pair of subnetworks.\n        \"\"\"\n        cross_degree = self.cross_degree(node_list1, node_list2)\n\n        #  Get sparse adjacency matrix\n        A = self.sp_A[node_list1+node_list2, :][:, node_list1+node_list2]\n        #  Get subnetwork sizes\n        N1, N2 = len(node_list1), len(node_list2)\n        #  Initialize\n        cross_transitivity = 0.0\n        #  Set counter\n        counter_triangles = 0.0\n        counter_triples = 0.0\n        #  Calculate cross transitivity from subnetwork 1 to subnetwork 2\n        #  Loop over nodes in subnetwork 1\n        for i in range(N1):\n            node1 = i\n            if cross_degree[i] > 1:\n                #  Loop over unique pairs of nodes in subnetwork 2\n                for j in range(N1, N1+N2):\n                    node2 = j\n                    for k in range(N1, j):\n                        node3 = k\n                        if A[node1, node2] == 1 and A[node1, node3] == 1:\n                            counter_triples += 1\n                            if A[node2, node3] == 1:\n                                counter_triangles += 1\n\n        if counter_triples:\n            cross_transitivity = counter_triangles / counter_triples\n        return cross_transitivity\n\n    @staticmethod\n    def _calculate_general_average_path_length(path_lengths, internal=False):\n        \"\"\"\n        Calculate general average path length for interacting networks.\n\n        :type path_lengths: 2D array [index, index]\n        :arg path_lengths: The path length matrix.\n        :arg bool internal: Indicates, whether internal or cross average path\n            length shall be calculated.\n        :return float: the general average path length.\n        \"\"\"\n        #  Get shape of path lengths array for normalization\n        (N, M) = path_lengths.shape\n\n        #  Identify unconnected pairs and save in binary array isinf\n        unconnected_pairs = np.isinf(path_lengths)\n        #  Count the number of unconnected pairs\n        n_unconnected_pairs = unconnected_pairs.sum()\n        #  Set infinite entries corresponding to unconnected pairs to zero\n        path_lengths[unconnected_pairs] = 0\n\n        #  Take average of shortest geographical path length matrix optionally\n        #  excluding the diagonal, since it is always zero, and all unconnected\n        #  pairs. The diagonal should never contain infinities, so that should\n        #  not be a problem.\n        if internal:\n            norm = float((N - 1) * M - n_unconnected_pairs)\n        else:\n            norm = float(N * M - n_unconnected_pairs)\n\n        average_path_length = path_lengths.sum() / norm\n\n        #  Reverse changes to path_lengths\n        path_lengths[unconnected_pairs] = np.inf\n        return average_path_length\n\n    def cross_average_path_length(self, node_list1, node_list2,\n                                  link_attribute=None):\n        \"\"\"\n        Return cross average path length.\n\n        Return the average (weighted) shortest path length between two induced\n        subnetworks.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_average_path_length([0,3,5], [1,2,4], None)\n        2.0\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_average_path_length([0,5], [1,2,3,4], None)\n        2.0\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :return float: the cross average path length between a pair of\n            subnetworks.\n        \"\"\"\n        path_lengths = InteractingNetworks.cross_path_lengths(\n            self, node_list1, node_list2, link_attribute)\n\n        return self._calculate_general_average_path_length(\n            path_lengths, internal=False)\n\n    def internal_average_path_length(self, node_list, link_attribute=None):\n        \"\"\"\n        Return internal average path length for an induced subnetwork.\n\n        Return the average (weighted) shortest path length between all pairs\n        of nodes within a subnetwork separately for which a path exists. Paths\n        between nodes from different subnetworks are not included in the\n        average!\n\n        However, even if the end points lie within the same layer, the paths\n        themselves will generally contain nodes from the whole network. To\n        avoid this and only consider paths lying within the subnetwork, do the\n        following:\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                subnetwork([0,3,5]).average_path_length(None))\n        1.3333\n\n        **Examples:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                internal_average_path_length([0,3,5], None))\n        1.3333\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                internal_average_path_length([1,2,4], None))\n        1.0\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :return float: the internal average path length.\n        \"\"\"\n        path_lengths = self.internal_path_lengths(node_list, link_attribute)\n        return self._calculate_general_average_path_length(path_lengths,\n                                                           internal=True)\n\n    def average_cross_closeness(self, node_list1, node_list2,\n                                link_attribute=None):\n        \"\"\"\n        Return the average cross closeness.\n\n        **Example:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                average_cross_closeness([0,5], [1,2,3,4]))\n        1.7143\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :return float: the average cross closeness.\n        \"\"\"\n        return np.mean(self.cross_closeness(node_list1, node_list2,\n                                            link_attribute))\n\n    def global_efficiency(self, node_list1, node_list2, link_attribute=None):\n        \"\"\"\n        Return the global efficiency.\n\n        **Example:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                global_efficiency([0,5], [1,2,3,4]))\n        1.7143\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :return float: the global efficiency.\n        \"\"\"\n        local_efficiency = self.local_efficiency(node_list1, node_list2,\n                                                 link_attribute)\n        return 1/np.mean(local_efficiency)\n\n    #\n    #  Define local measures for interacting networks\n    #\n\n    def cross_degree(self, node_list1, node_list2, link_attribute=None):\n        \"\"\"\n        Return the cross degree sequence for one subnetwork with respect to a\n        second subnetwork.\n\n        Gives the number of links from a specific node in the first subnetwork\n        projecting to the second subnetwork. If a link attribute is specified,\n        return the associated strength\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_degree([0,3,5], [1,2,4])\n        array([1, 1, 0])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_degree([1,2,4], [0,3,5])\n        array([1, 0, 1])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_degree([1,2,3,4], [0,5])\n        array([0, 0, 1, 1])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg str key: link attribute key (optional)\n        :rtype: 1D array [node index]\n        :return: the cross degree sequence.\n        \"\"\"\n        if self.directed:\n            return (self.cross_indegree(node_list1, node_list2,\n                                        link_attribute)\n                    + self.cross_outdegree(node_list1, node_list2,\n                                           link_attribute))\n        else:\n            return self.cross_outdegree(node_list1, node_list2,\n                                        link_attribute)\n\n    def cross_indegree(self, node_list1, node_list2, link_attribute=None):\n        \"\"\"\n        Return the cross indegree sequence for the first given subnetwork with\n        respect to the second given subnetwork\n\n        Gives the number of links from nodes in subnetwork two to a specific\n        node from subnetwork one. If a link attribute is specified,\n        return the associated in strength.\n\n\n        **Example:**\n\n        >>> net = InteractingNetworks.SmallDirectedTestNetwork()\n        >>> net.cross_indegree([1, 2], [0, 3, 4])\n        array([2, 1])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg str key: link attribute key (optional)\n        :rtype: 1D array [node index]\n        :return: the cross in degree sequence.\n        \"\"\"\n        # pylint: disable=arguments-out-of-order\n        if link_attribute is None:\n            return np.sum(self.cross_adjacency(node_list2, node_list1), axis=0)\n        else:\n            return np.sum(self.cross_link_attribute(link_attribute, node_list2,\n                                                    node_list1), axis=0)\n\n    def cross_outdegree(self, node_list1, node_list2, link_attribute=None):\n        \"\"\"\n        Return the cross outdegree sequence for the first given subnetwork with\n        respect to the second given subnetwork\n\n        Gives the number of links from a specific node in subnetwork one to\n        nodes in subnetwork two. If a link attribute is specified,\n        return the associated out strength.\n\n        **Example:**\n\n        >>> net = InteractingNetworks.SmallDirectedTestNetwork()\n        >>> net.cross_outdegree([1, 2], [0, 3, 4])\n        array([1, 0])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg str key: link attribute key (optional)\n        :rtype: 1D array [node index]\n        :return: the cross out degree sequence.\n        \"\"\"\n        if link_attribute is None:\n            return np.sum(self.cross_adjacency(node_list1, node_list2), axis=1)\n        else:\n            return np.sum(self.cross_link_attribute(link_attribute, node_list1,\n                                                    node_list2), axis=1)\n\n    def internal_degree(self, node_list, link_attribute=None):\n        \"\"\"\n        Return the internal degree sequence of one induced subnetwork.\n\n        Gives the number of links from a specific node to other nodes within\n        the same induced subnetwork. If a link attribute is specified,\n        return the associated strength.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().internal_degree([0,3,5])\n        array([2, 1, 1])\n        >>> InteractingNetworks.SmallTestNetwork().internal_degree([1,2,4])\n        array([2, 2, 2])\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :arg str key: link attribute key (optional)\n        :rtype: 1D array [node index]\n        :return: the internal degree sequence.\n        \"\"\"\n        if self.directed:\n            return (self.internal_indegree(node_list, link_attribute)\n                    + self.internal_outdegree(node_list, link_attribute))\n        else:\n            return self.internal_outdegree(node_list, link_attribute)\n\n    def internal_indegree(self, node_list, link_attribute=None):\n        \"\"\"\n        Return the internal indegree sequence of one induced subnetwork.\n\n        Gives the number of links from other nodes to a specific node within\n        the same induced subnetwork. If a link attribute is specified,\n        return the associated in strength.\n\n        **Example:**\n\n        >>> net = InteractingNetworks.SmallDirectedTestNetwork()\n        >>> net.internal_indegree([0, 1, 3])\n        array([0, 2, 1])\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :arg str key: link attribute key (optional)\n        :rtype: 1D array [node index]\n        :return: the internal in degree sequence.\n        \"\"\"\n        if link_attribute is None:\n            return np.sum(self.internal_adjacency(node_list), axis=0)\n        else:\n            return np.sum(self.internal_link_attribute(link_attribute,\n                                                       node_list), axis=0)\n\n    def internal_outdegree(self, node_list, link_attribute=None):\n        \"\"\"\n        Return the internal outdegree sequence of one induced subnetwork.\n\n        Gives the number of links from a specific node to other nodes within\n        the same induced subnetwork. If a link attribute is specified,\n        return the associated out strength.\n\n        **Example:**\n\n        >>> net = InteractingNetworks.SmallDirectedTestNetwork()\n        >>> net.internal_outdegree([0, 1, 3])\n        array([2, 0, 1])\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :arg str key: link attribute key (optional)\n        :rtype: 1D array [node index]\n        :return: the internal out degree sequence.\n        \"\"\"\n        if link_attribute is None:\n            return np.sum(self.internal_adjacency(node_list), axis=1)\n        else:\n            return np.sum(self.internal_link_attribute(link_attribute,\n                                                       node_list), axis=1)\n\n    def cross_local_clustering(self, node_list1, node_list2):\n        \"\"\"\n        Return local cross clustering for a pair of subnetworks.\n\n        The local cross clustering coefficient C_v gives the probability, that\n        two randomly drawn neighbors in subnetwork 1 of node v in subnetwork 1\n        are also neighbors. It counts triangles having one vertex in\n        subnetwork 1 and two vertices in subnetwork 2.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_local_clustering([0,3,5], [1,2,4])\n        array([ 0.,  0.,  0.])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_local_clustering([2], [1,3,4])\n        array([ 1.])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_local_clustering([3,4], [1,2])\n        array([ 0.,  1.])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :rtype: 1D array [node index]\n        :return: the cross local clustering coefficient.\n        \"\"\"\n        nodes1 = np.array(node_list1, dtype=NODE)\n        nodes2 = np.array(node_list2, dtype=NODE)\n        #  Get cross degree sequence\n        cross_degree = InteractingNetworks.cross_degree(self, nodes1, nodes2)\n        #  Prepare normalization factor\n        norm = cross_degree * (cross_degree - 1) / 2.\n        #  Initialize\n        cross_clustering = np.zeros_like(nodes1, dtype=DFIELD)\n\n        _cross_local_clustering(to_cy(self.adjacency, ADJ),\n                                to_cy(norm, DFIELD),\n                                nodes1, nodes2, cross_clustering)\n        return cross_clustering\n\n    def cross_local_clustering_sparse(self, node_list1, node_list2):\n        \"\"\"\n        Return local cross clustering for a pair of subnetworks.\n\n        The local cross clustering coefficient C_v gives the probability, that\n        two randomly drawn neighbors in subnetwork 1 of node v in subnetwork 1\n        are also neighbors. It counts triangles having one vertex in\n        subnetwork 1 and two vertices in subnetwork 2.\n\n        Examples:\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_local_clustering_sparse([0,3,5], [1,2,4])\n        array([ 0.,  0.,  0.])\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_local_clustering_sparse([2], [1,3,4])\n        array([ 1.])\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_local_clustering_sparse([3,4], [1,2])\n        array([ 0.,  1.])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :rtype: 1D array [node index]\n        :return: the cross local clustering coefficient.\n        \"\"\"\n        #  Get cross degree sequence\n        cross_degree = self.cross_degree(node_list1, node_list2)\n        #  Get full adjacency matrix\n        A = self.sp_A[node_list1+node_list2, :][:, node_list1+node_list2]\n        #  Get layer sizes\n        N1, N2 = len(node_list1), len(node_list2)\n\n        #  Initialize\n        cross_clustering = np.zeros(N1)\n        #  Prepare normalization factor\n        norm = cross_degree * (cross_degree - 1) / 2\n\n        # Calculate cross clustering from subnetwork 1 to subnetwork 2\n        counter = 0\n        for node1 in range(N1):\n            if not norm[node1] == 0:\n                # Reset counter\n                counter = 0\n                #  Loop over unique pairs of nodes in subnetwork 2\n                for node2 in range(N1, N1+N2):\n                    for node3 in range(N1, node2):\n                        if (A[node1, node2] == 1 and A[node2, node3] == 1\n                                and A[node3, node1] == 1):\n                            counter += 1\n                cross_clustering[node1] = counter / norm[node1]\n\n        return cross_clustering\n\n    def _calculate_general_closeness(self, path_lengths, internal=True):\n        \"\"\"\n        Calculate general closeness sequence for interacting networks.\n\n        :type path_lengths: 2D array [node,node] of floats\n        :arg  path_lengths: Path lengths to use\n        :arg bool internal: Indicates, whether internal or cross closeness\n            shall be calculated.\n        :rtype:  1D array [index]\n        :return: the general closeness sequence.\n        \"\"\"\n        #  Get shape of path lengths array\n        (N, M) = path_lengths.shape\n\n        #  Set total number of nodes to be considered for calculation\n        if internal:\n            n_nodes = N\n            norm = M - 1\n        else:\n            n_nodes = self.N  # All nodes of the whole network here!\n            norm = M\n\n        #  Closeness has the length of the first dimension of path lengths\n        closeness = np.zeros(N)\n\n        #  Identify unconnected pairs and save in binary array isinf\n        unconnected_pairs = np.isinf(path_lengths)\n        #  Set infinite entries corresponding to unconnected pairs to maximum\n        #  possible path length.\n        path_lengths[unconnected_pairs] = n_nodes - 1\n\n        #  Some nodes have a distance of zero to all their\n        #  neighbors. These nodes get zero closeness centrality.\n        path_length_sum = path_lengths.sum(axis=1)\n        #  M entries have been summed over, so we also have to normalize by M\n        closeness[path_length_sum != 0] = \\\n            norm / path_length_sum[path_length_sum != 0]\n\n        #  Reverse changes to path_lengths\n        path_lengths[unconnected_pairs] = np.inf\n\n        return closeness\n\n    def cross_closeness(self, node_list1, node_list2, link_attribute=None):\n        \"\"\"\n        Return cross closeness sequence for a pair of induced subnetworks.\n\n        Gives the inverse average geodesic distance from a node in subnetwork 1\n        to all nodes in subnetwork 2.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_closeness([0,3,5], [1,2,4], None)\n        array([ 0.6  ,  0.6  ,  0.375])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_closeness([0,5], [1,2,3,4], None)\n        array([ 0.66666667,  0.4       ])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 1D arrays [index]\n        :return: the cross closeness sequence.\n        \"\"\"\n        path_lengths = InteractingNetworks.cross_path_lengths(\n            self, node_list1, node_list2, link_attribute)\n\n        return self._calculate_general_closeness(path_lengths, internal=False)\n\n    def internal_closeness(self, node_list, link_attribute=None):\n        \"\"\"\n        Return internal closeness sequence for an induced subnetwork.\n\n        Gives the inverse average geodesic distance from a node to all other\n        nodes in the same induced subnetwork.\n\n        However, the included paths will generally contain nodes from the whole\n        network. To avoid this, do the following:\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                subnetwork([0,3,5]).closeness(None))\n        array([ 1. , 0.6667, 0.6667])\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                internal_closeness([0,3,5], None)\n        array([ 1.        ,  0.66666667,  0.66666667])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                internal_closeness([1,2,4], None)\n        array([ 1.,  1.,  1.])\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 1D array [index]\n        :return: the internal closeness sequence.\n        \"\"\"\n        path_lengths = self.internal_path_lengths(node_list, link_attribute)\n        return self._calculate_general_closeness(path_lengths, internal=True)\n\n    def cross_betweenness(self, node_list1, node_list2):\n        \"\"\"\n        Return the cross betweenness sequence for the whole network with\n        respect to a pair of subnetworks.\n\n        Gives the normalized number of shortest paths only between nodes from\n        **two** subnetworks, in which a node :math:`i` is contained. This is\n        equivalent to the inter-regional / inter-group betweenness with respect\n        to subnetwork 1 and subnetwork 2.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_betweenness([2], [3,5])\n        array([ 1.,  1.,  0.,  0.,  1.,  0.])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                cross_betweenness(range(0,6), range(0,6))\n        array([ 9.,  3.,  0.,  2.,  6.,  0.])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :rtype: 1D arrays [node index]\n        :return: the cross betweenness sequence for the whole network with\n            respect to two subnetworks.\n        \"\"\"\n        return self.interregional_betweenness(sources=node_list1,\n                                              targets=node_list2)\n\n    def internal_betweenness(self, node_list):\n        \"\"\"\n        Return the internal betweenness sequence for an induced subnetwork.\n\n        Gives the normalized number of shortest paths only between nodes from\n        subnetwork 1, in which a node :math:`i` from the whole network is\n        contained.  This is equivalent to the inter-regional / inter-group\n        betweenness with respect to subnetwork 1 and subnetwork 1.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                internal_betweenness(range(0,6))\n        array([ 9.,  3.,  0.,  2.,  6.,  0.])\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :rtype: 1D array [node index]\n        :return: the internal betweenness sequence for layer 1.\n        \"\"\"\n        return self.interregional_betweenness(sources=node_list,\n                                              targets=node_list)\n\n    def local_efficiency(self, node_list1, node_list2, link_attribute=None):\n        \"\"\"\n        Return the local efficiency sequence for an induced subnetwork.\n\n        **Example:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                local_efficiency([0,5], [1,2,3,4])\n        array([0.75      , 0.41666667])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 1D arrays [index]\n        :return: the local efficiency sequence.\n        \"\"\"\n        path_lengths = self.cross_path_lengths(node_list1, node_list2,\n                                               link_attribute)\n        return np.mean(1/path_lengths, axis=1)\n\n    def nsi_cross_degree(self, node_list1, node_list2):\n        \"\"\"\n        Return the n.s.i. cross-degree for a pair of induced subnetworks.\n\n        Gives an estimation about the quota of the whole domain of interest of\n        the subnetwork 2 any node in the subnetwork 1 is connected to.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_degree([0,1,2],[3,4,5])\n        array([ 4.2,  2.6,  1.4])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_degree([0,2,5],[1,4])\n        array([ 1.4,  2.2,  0. ])\n\n        :arg [int] node_list1: list of node indices describing the subnetwork 1\n        :arg [int] node_list2: list of node indices describing the subnetwork 2\n        :rtype: 1D array [node index]\n        :return: the n.s.i. cross-degree for layer 1.\n        \"\"\"\n        cross_A = (self.adjacency\n                   + np.eye(self.N))[node_list1, :][:, node_list2]\n        return (cross_A * self.node_weights[node_list2]).sum(axis=1)\n\n    def nsi_cross_mean_degree(self, node_list1, node_list2):\n        \"\"\"\n        Return the n.s.i. cross-mean degree for a pair of induced subnetworks.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_mean_degree([0,1,2],[3,4,5])\n        2.5\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_mean_degree([0,2,5],[1,4]))\n        0.95\n\n        :arg [int] node_list1: list of node indices describing the subnetwork 1\n        :arg [int] node_list2: list of node indices describing the subnetwork 2\n        :return float: the n.s.i. cross-mean degree for layer 1.\n        \"\"\"\n        nsi_cross = self.nsi_cross_degree(node_list1, node_list2)\n        node_weights = self.node_weights[node_list1]\n        W_i = sum(node_weights)\n        return sum(nsi_cross * node_weights) / W_i\n\n    def nsi_internal_degree(self, node_list):\n        \"\"\"\n        Return the n.s.i. internal degree sequence of one induced subnetwork.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_internal_degree([0,3,5])\n        array([ 3.4,  1.8,  2.2])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_internal_degree([0,1,3,5])\n        array([ 3.4,  2. ,  2.6,  2.2])\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :rtype: 1D array [node index]\n        :return: the n.s.i. internal degree sequence\n        \"\"\"\n        return self.nsi_cross_degree(node_list, node_list)\n\n    def nsi_cross_local_clustering(self, node_list1, node_list2):\n        \"\"\"\n        Return the n.s.i. cross-local clustering coefficient for a pair of\n        induced subnetworks.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_local_clustering([0,1,2],[3,4,5])\n        array([ 0.33786848,  0.50295858,  1.  ])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_local_clustering([0,2,5],[1,4])\n        array([ 1.,  1.,  0.])\n\n        :arg [int] node_list1: list of node indices describing the subnetwork 1\n        :arg [int] node_list2: list of node indices describing the subnetwork 2\n        :rtype: 1D array [node index]\n        :return: the n.s.i. cross-local clustering coefficient for layer 1.\n        \"\"\"\n        nodes1 = np.array(node_list1, dtype=NODE)\n        nodes2 = np.array(node_list2, dtype=NODE)\n        nsi_cc = np.zeros(nodes1.shape, dtype=DFIELD)\n        _nsi_cross_local_clustering(\n            to_cy(self.adjacency + np.eye(self.N, dtype=ADJ), ADJ),\n            nsi_cc, nodes1, nodes2, to_cy(self.node_weights, DWEIGHT))\n\n        norm = self.nsi_cross_degree(nodes1, nodes2) ** 2\n        nsi_cc[norm != 0] = nsi_cc[norm != 0] / norm[norm != 0]\n        nsi_cc[norm == 0] = 0\n        return nsi_cc\n\n    def nsi_cross_closeness_centrality(self, node_list1, node_list2):\n        \"\"\"\n        Return the n.s.i. cross-closeness centrality for a pair of induced\n        subnetworks.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_closeness_centrality([0,1,2],[3,4,5])\n        array([ 1.        ,  0.56756757,  0.48837209])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_closeness_centrality([0,2,5],[1,4])\n        array([ 0.73333333,  1.        ,  0.42307692])\n\n        :arg [int] node_list1: list of node indices describing the subnetwork 1\n        :arg [int] node_list2: list of node indices describing the subnetwork 2\n        :rtype: 1D array [node index]\n        :return: the n.s.i. cross-closeness for layer 1.\n        \"\"\"\n        shortest_paths = self.path_lengths()\n        node_weights = self.node_weights\n\n        nsi_shortest_paths = shortest_paths + np.eye(len(shortest_paths))\n        nsi_shortest_paths[np.isinf(nsi_shortest_paths)] = self.N - 1\n\n        nsi_cross_paths = nsi_shortest_paths[node_list1, :][:, node_list2]\n        W = sum(node_weights[node_list2])\n        return W / np.dot(nsi_cross_paths, node_weights[node_list2])\n\n    def nsi_internal_closeness_centrality(self, node_list):\n        \"\"\"\n        Return the n.s.i. internal closeness sequence of one induced\n        subnetwork.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_internal_closeness_centrality([0,3,5])\n        array([ 1.        ,  0.68      ,  0.73913043])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_internal_closeness_centrality([0,1,3,5])\n        array([ 0.84      ,  0.525     ,  0.72413793,  0.6       ])\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :rtype: 1D array [node index]\n        :return: the n.s.i. internal closeness sequence\n        \"\"\"\n        return self.nsi_cross_closeness_centrality(node_list, node_list)\n\n    def nsi_cross_global_clustering(self, node_list1, node_list2):\n        \"\"\"\n        Return the n.s.i. cross-global clustering coefficient for an induced\n        subnetwork 1 with regard to a second induced subnetwork 2.\n\n        **Examples:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_global_clustering([0,1,2],[3,4,5]))\n        0.6688\n\n        :arg [int] node_list1: list of node indices describing the subnetwork 1\n        :arg [int] node_list2: list of node indices describing the subnetwork 2\n        :return float: the n.s.i. cross-global clustering coefficient for the\n            subnetwork 1 with regard to subnetwork 2.\n        \"\"\"\n        nsi_cc = self.nsi_cross_local_clustering(node_list1, node_list2)\n        node_weights = self.node_weights[node_list1]\n        return sum(node_weights * nsi_cc) / sum(node_weights)\n\n    def nsi_internal_local_clustering(self, node_list):\n\n        \"\"\"\n        Return the n.s.i. internal cross-local clustering coefficient for an\n        induced subnetwork.\n\n        **Examples:**\n\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_internal_local_clustering([1,2,3,5])\n        array([ 0.73333333,  1.        ,  1.        ,  1.        ])\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_internal_local_clustering([0,2,4])\n        array([ 1.        ,  1.        ,  0.86666667])\n\n        :arg [int] node_list: list of node indices describing the subnetwork\n        :rtype: 1D numpy array [node_index]\n        :return: the n.s.i. internal-local clustering coefficient for all nodes\n            within the induced subnetwork\n        \"\"\"\n        return self.nsi_cross_local_clustering(node_list, node_list)\n\n    def nsi_cross_betweenness(self, node_list1, node_list2):\n        \"\"\"\n        Return the n.s.i. cross betweenness sequence for the whole network with\n        respect to a pair of subnetworks.\n\n        **Examples:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_betweenness([0,4,5],[1,3]))\n        array([ 6.5333,  1.2   ,  0.    ,\n                0.6769,  0.6769,  0.    ])\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_betweenness([0,1],[2,3,4,5]))\n        array([ 2.1333,  0.    ,  0.    ,\n                0.4923,  0.9209,  0.    ])\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :rtype: 1D arrays [node index]\n        :return: the n.s.i. cross betweenness sequence for the whole network\n            with respect to two subnetworks.\n        \"\"\"\n        return self.nsi_interregional_betweenness(sources=node_list1,\n                                                  targets=node_list2)\n\n    def nsi_cross_edge_density(self, node_list1, node_list2):\n        \"\"\"\n        Return the n.s.i. density of edges between two subnetworks.\n\n        **Examples:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_edge_density([1,2,3],[0,5]))\n        0.1091\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_edge_density([0],[1,4,5]))\n        0.7895\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return float: the n.s.i. cross density of edges between two\n            subnetworks 1 and 2.\n        \"\"\"\n        W_j = sum(self.node_weights[node_list2])\n        return self.nsi_cross_mean_degree(node_list1, node_list2) / W_j\n\n    def nsi_cross_transitivity(self, node_list1, node_list2):\n        \"\"\"\n        Return n.s.i. cross-transitivity for a pair of subnetworks.\n\n        **Examples:**\n\n        >>> r(InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_transitivity([1,2],[0,3,4,5]))\n        0.6352\n        >>> InteractingNetworks.SmallTestNetwork().\\\n                nsi_cross_transitivity([0,2,3],[1])\n        1.0\n\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return float: the n.s.i. cross transitivity for a pair of subnetworks\n            1 and 2.\n        \"\"\"\n        return _nsi_cross_transitivity(\n            to_cy(self.adjacency + np.eye(self.N, dtype=ADJ), ADJ),\n            np.array(node_list1, dtype=NODE),\n            np.array(node_list2, dtype=NODE),\n            to_cy(self.node_weights, DWEIGHT))\n\n    def nsi_cross_average_path_length(self, node_list1, node_list2):\n        \"\"\"\n        Return n.s.i. cross average path length between two induced\n        subnetworks.\n\n        **Examples:**\n\n        >>> net = InteractingNetworks.SmallTestNetwork()\n        >>> r(net.nsi_cross_average_path_length([0,5],[1,2,4]))\n        3.3306\n        >>> r(net.nsi_cross_average_path_length([1,3,4,5],[2]))\n        0.376\n\n        :arg [int] node_list1: list of node indices describing the first\n            subnetwork\n        :arg [int] node_list2: list of node indices describing the second\n            subnetwork\n        :return float: the n.s.i. cross-average path length between a pair of\n            subnetworks.\n        \"\"\"\n        shortest_paths = self.path_lengths()\n        nsi_shortest_paths = shortest_paths + np.eye(len(shortest_paths))\n        node_weights = self.node_weights\n\n        Wi = sum(node_weights[node_list1])\n        Wj = sum(node_weights[node_list1])\n\n        w_v = np.zeros([len(node_list2), len(node_list1)])\n        w_v[:] = node_weights[node_list1]\n        w_q = np.zeros([len(node_list1), len(node_list2)])\n        w_q[:] = node_weights[node_list2]\n\n        Wij = w_v.transpose() + w_q\n        nsi_cross_paths = nsi_shortest_paths[node_list1, :][:, node_list2]\n        Wij = Wij[np.isinf(nsi_cross_paths)].sum()\n        nsi_shortest_paths[np.isinf(nsi_shortest_paths)] = self.N - 1\n        nsi_cross_paths = nsi_shortest_paths[node_list1, :][:, node_list2]\n\n        Lij = np.sum(nsi_cross_paths*node_weights[node_list2], axis=1)\n        Lij = np.sum(Lij * node_weights[node_list1], axis=0)\n        return Lij / (Wi*Wj - Wij)\n"
  },
  {
    "path": "src/pyunicorn/core/netcdf_dictionary.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for saving and loading NetCDF files from and to\nappropriate Python dictionaries, allowing NetCDF4 compression methods.\n\"\"\"\n\n#\n#  Imports\n#\n\nimport numpy as np\n\ntry:\n    from h5netcdf.legacyapi import Dataset\nexcept ImportError:\n    try:\n        from netCDF4 import Dataset\n    except ImportError:\n        print(\"pyunicorn: Packages netCDF4 or h5netcdf could not be loaded. \"\n              \"Some functionality in class NetCDFDictionary might not be \"\n              \"available!\")\n\n\n#\n#  Define class NetCDF\n#\n\nclass NetCDFDictionary:\n\n    \"\"\"\n    Encapsulates appropriate dictionary following NetCDF conventions.\n\n    Also contains methods to load data from NetCDF and NetCDF4 files.\n    \"\"\"\n\n    # TODO: implement silence_level consistently\n    def __init__(self, data_dict=None, silence_level=0):\n        \"\"\"\n        Return a NetCDF object containing an appropriately structured\n        dictionary.\n\n        If no data_dict is given, a default quasi-empty dictionary is created.\n\n        :type data_dict: dictionary\n        :arg data_dict: Contains data in a structure following NetCDF\n            conventions: {\"global_attributes\": {}, \"dimensions\": {},\n            \"variables\": {\"obs\": {\"array\": (), \"dims\": (), \"attributes\": ()}}}\n\n        :type silence_level: int >= 0\n        :arg silence_level: The higher, the less progress info is output.\n        \"\"\"\n        if data_dict is None:\n            data_dict = {\n                \"global_attributes\": {\n                    \"title\": \"Quasi-empty default dictionary\"},\n                \"dimensions\": {\"x\": 1},\n                \"variables\": {\n                    \"obs\": {\"array\": np.array((1,)), \"dims\": ('x',),\n                            \"attributes\": {\"long_name\": \"observable\"}}}}\n        self.dict = data_dict\n\n        self.silence_level = silence_level\n        \"\"\"(int >= 0)\n        The higher, the less progress info is output.\n        \"\"\"\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of the object.\n        \"\"\"\n        text = (f'NetCDFDictionary:\\nGlobal attributes:\\n'\n                f'{self.dict[\"global_attributes\"]}\\nVariables:')\n\n        for key in self.dict[\"variables\"].keys():\n            text += (f'\\n\\t{key}\\t-> array shape'\n                     f'{self.dict[\"variables\"][key][\"array\"].shape}')\n        return text\n\n    #\n    #  Define methods for NetCDF4 files via NetCDF4 module\n    #\n\n    @staticmethod\n    def from_file(file_name, with_array='all'):\n        \"\"\"\n        Load NetCDF4 file into a dictionary.\n\n        Supported file types ``file_type`` are:\n          - \"NetCDF\"\n          - \"NetCDF4\"\n\n        :arg str file_name: The name of the data file.\n        :arg [str] with_array: Names of data arrays to be loaded completely.\n        :rtype: NetCDF instance\n        \"\"\"\n        #  Open NetCDF4 file\n        try:\n            cdf = Dataset(file_name, \"r\")\n            print(f\"MODULE: File {file_name} opened.\")\n        except RuntimeError:\n            print(f\"MODULE: File {file_name} couldn't be opened.\")\n            return None\n\n        #  Create empty dictionary structure\n        content = {\"global_attributes\": {}, \"dimensions\": {}, \"variables\": {}}\n        #  Copy all global attributes and all dimensions\n        content[\"global_attributes\"] = cdf.__dict__\n        for dim_name, _ in cdf.dimensions.iteritems():\n            content[\"dimensions\"][dim_name] = len(cdf.dimensions[dim_name])\n\n        #  Loop over variables\n        for var in cdf.variables.keys():\n            #  Create empty dictionary for variable var\n            content[\"variables\"][var] = {\"array\": {}, \"type\": {}, \"dims\": {},\n                                         \"attributes\": {}}\n            #  Copy type, dimensions and variable attributes\n            content[\"variables\"][var][\"type\"] = cdf.variables[var].dtype.char\n            content[\"variables\"][var][\"dims\"] = cdf.variables[var].dimensions\n            content[\"variables\"][var][\"attributes\"] = \\\n                cdf.variables[var].__dict__\n\n            #  Load data if wanted\n            if var in with_array or with_array == 'all':\n                try:\n                    content[\"variables\"][var][\"array\"] = cdf.variables[var][:]\n                    print(f\"MODULE: Array {var} loaded to dictionary.\")\n                except MemoryError:\n                    print(f\"Memory Error during loading of array {var}\")\n                except RuntimeError:\n                    print(f\"Other Error during loading of array {var}\")\n\n                try:\n                    content[\"variables\"][var][\"array\"] = \\\n                        content[\"variables\"][var][\"array\"].astype('float32')\n                    print(f\"MODULE: Array {var} converted to 'float32'.\")\n                except MemoryError:\n                    print(\"MODULE: Memory Error during conversion of \"\n                          f\"array {var}.\")\n                except RuntimeError:\n                    print(\"MODULE: Other Error during conversion of \"\n                          f\"array {var}.\")\n\n                #  If a scale_factor is given in the variable, rescale array\n                if \"scale_factor\" in content[\"variables\"][var][\"attributes\"]:\n                    content[\"variables\"][var][\"array\"] *= \\\n                        cdf.variables[var].scale_factor\n                    del content[\"variables\"][var][\"attributes\"][\"scale_factor\"]\n                if \"add_offset\" in content[\"variables\"][var][\"attributes\"]:\n                    content[\"variables\"][var][\"array\"] += \\\n                        cdf.variables[var].add_offset\n                    del content[\"variables\"][var][\"attributes\"][\"add_offset\"]\n                #  Recalculate actual_range\n                ar_max = content[\"variables\"][var][\"array\"].max()\n                ar_min = content[\"variables\"][var][\"array\"].min()\n                content[\"variables\"][var][\"attributes\"][\"actual_range\"] = \\\n                    np.array([ar_min, ar_max])\n\n        print(\"MODULE: Dictionary loaded from NetCDF file.\")\n        cdf.close()\n\n        return NetCDFDictionary(content)\n\n    #  FIXME: createDimension - length of time variable should be \"unlimited\"\n    #  TODO: Change file_name automatically if file already exists\n    def to_file(self, file_name, compress=False, comp_level=6,\n                least_significant_digit=10):\n        \"\"\"\n        Write NetCDF4 file by using appropriate dictionary.\n\n        :arg str file_name: The name of the data file.\n        :arg bool compress: Determines whether the data should be compressed.\n        :arg int comp_level: Level of compression, between 0 (no compression,\n            fastest) and 9 (strongest compression, slowest).\n        :arg int least_significant_digit: Last precise digit.\n        \"\"\"\n        #  Check dictionary for empty entries\n        for val in self.dict.keys():\n            if not self.dict[val]:\n                print(\"MODULE: Entry {val} is empty.\")\n\n        print(f\"MODULE: If {file_name} already existed, old file will be \"\n              \"overwritten.\")\n        #  Format can be:\n        #  NETCDF3_CLASSIC, NETCDF3_64BIT, NETCDF4_CLASSIC, NETCDF4\n        cdf = Dataset(file_name, \"w\", format=\"NETCDF4\")\n\n        #  Write global attributes\n        for val in self.dict[\"global_attributes\"]:\n            setattr(cdf, val, self.dict[\"global_attributes\"][val])\n\n        #  Write dimensions with given lengths\n        for val in self.dict[\"dimensions\"]:\n            if val == \"time\":\n                cdf.createDimension(val, self.dict[\"dimensions\"][val])\n            else:\n                cdf.createDimension(val, self.dict[\"dimensions\"][val])\n\n        #  Write variables\n        for var in self.dict[\"variables\"]:\n            #  Check variable dictionary for empty entries\n            for key in self.dict[\"variables\"][var].keys():\n                if not self.dict[\"variables\"][var][key] and key != \"type\":\n                    print(f\"MODULE: Entry {key} in variable {var} is empty.\")\n\n            var_type = self.dict[\"variables\"][var][\"array\"].dtype.char\n            try:\n                var_ = cdf.createVariable(\n                    var, var_type, self.dict[\"variables\"][var][\"dims\"],\n                    zlib=compress, complevel=comp_level,\n                    least_significant_digit=least_significant_digit)\n            except RuntimeError:\n                print(f\"MODULE: Couldn't create variable {var} \"\n                      \"in NetCDF file.\")\n\n            #  Copy the array\n            var_[:] = self.dict[\"variables\"][var][\"array\"]\n\n            #  Calculate actual_range for variables\n            ar_max = self.dict[\"variables\"][var][\"array\"].max()\n            ar_min = self.dict[\"variables\"][var][\"array\"].min()\n            self.dict[\"variables\"][var][\"attributes\"][\"actual_range\"] = \\\n                np.array([ar_min, ar_max])\n\n            #  Write all variable attributes to dictionary\n            for att in self.dict[\"variables\"][var][\"attributes\"]:\n                setattr(var_, att,\n                        self.dict[\"variables\"][var][\"attributes\"][att])\n\n        cdf.close()\n        print(\"MODULE: Dictionary saved as NetCDF file {file_name}.\")\n"
  },
  {
    "path": "src/pyunicorn/core/network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for analyzing spatially embedded complex networks, handling\nmultivariate data and generating time series surrogates.\n\"\"\"\n\nimport sys                          # performance testing\nimport time\nfrom functools import partial\nfrom typing import Tuple, Optional\nfrom collections.abc import Hashable\nfrom multiprocessing import get_context, cpu_count\n\nimport numpy as np                  # array object and fast numerics\nfrom numpy import random\nfrom scipy import linalg            # solvers\nfrom scipy.linalg import expm\nfrom scipy import sparse as sp      # fast sparse matrices\nfrom scipy.sparse.linalg import eigsh, inv, splu\nfrom tqdm import tqdm, trange       # easy progress bar handling\n\nimport igraph                       # high performance graph theory tools\n\nfrom .cache import Cached\nfrom ..utils import mpi             # parallelized computations\n\nfrom ._ext.types import \\\n    to_cy, ADJ, MASK, NODE, DEGREE, DWEIGHT, DFIELD\nfrom ._ext.numerics import \\\n    _local_cliquishness_4thorder, _local_cliquishness_5thorder, \\\n    _nsi_betweenness, _mpi_newman_betweenness, _mpi_nsi_newman_betweenness\n\n# =============================================================================\n#  Utilities\n\n\ndef nz_coords(matrix):\n    \"\"\"\n    Find coordinates of all non-zero entries in a sparse matrix.\n\n    :return: list of coordinates [row,col]\n    :rtype:  array([[int>=0,int>=0]])\n    \"\"\"\n    return np.array(matrix.nonzero()).T\n\n\nclass NetworkError(Exception):\n    \"\"\"\n    Used for all exceptions raised by Network.\n    \"\"\"\n    def __init__(self, value):\n        Exception.__init__(self)\n        self.value = value\n\n    def __str__(self):\n        return repr(self.value)\n\n\n# =============================================================================\n#  Doctest helpers\n\n\ndef r(obj, decimals=4):\n    \"\"\"\n    Round numbers, arrays or iterables thereof. Only used in docstrings.\n    \"\"\"\n    if isinstance(obj, (np.ndarray, np.matrix)):\n        if obj.dtype.kind == 'f':\n            rounded = np.around(obj.astype(np.longdouble),\n                                decimals=decimals).astype(np.float64)\n        elif obj.dtype.kind == 'i':\n            rounded = obj.astype(np.int)\n        else:\n            raise TypeError('obj is of unsupported dtype kind.')\n    elif isinstance(obj, list):\n        rounded = map(r, obj)\n    elif isinstance(obj, tuple):\n        rounded = tuple(map(r, obj))\n    elif isinstance(obj, (float, np.float32, np.float64, np.float128)):\n        rounded = np.float64(np.around(np.float128(obj), decimals=decimals))\n    elif isinstance(obj, (int, np.int8, np.int16, np.int32)):\n        rounded = int(obj)\n    else:\n        rounded = obj\n    return rounded\n\n\ndef rr(obj, decimals=4):\n    \"\"\"\n    Round arrays in scientific notation. Only used in docstrings.\n    \"\"\"\n    print(np.vectorize('%.4g'.__mod__)(r(obj, decimals=decimals)))\n\n\n# =============================================================================\n\n\nclass Network(Cached):\n    \"\"\"\n    A Network is a simple, undirected or directed graph with optional node\n    and/or link weights. This class encapsulates data structures and methods to\n    represent, generate and analyze such structures.\n\n    Network relies on the package igraph for many of its features, but also\n    implements new functionality. Highlights include weighted and directed\n    statistical network measures, measures based on random walks, and\n    node splitting invariant network measures.\n\n    **Examples:**\n\n    Create an undirected network given the adjacency matrix:\n\n    >>> net = Network(adjacency=[[0,1,0,0,0,0], [1,0,1,0,0,1],\n    ...                          [0,1,0,1,1,0], [0,0,1,0,1,0],\n    ...                          [0,0,1,1,0,1], [0,1,0,0,1,0]])\n\n    Create an Erdos-Renyi random graph:\n\n    >>> net = Network.Model(\"ErdosRenyi\", n_nodes=100, link_probability=0.05)\n    Generating Erdos-Renyi random graph with 100 nodes and probability 0.05...\n    \"\"\"\n\n    #\n    #  Definitions of internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, adjacency=None, n_nodes=None, edge_list=None,\n                 directed=False, node_weights=None, silence_level=0):\n        \"\"\"\n        Return a new directed or undirected Network object\n        with given adjacency matrix and optional node weights.\n\n        :type adjacency: square array-like [node,node], or pysparse matrix of\n            0s and 1s\n        :arg  adjacency: Adjacency matrix of the new network.  Entry [i,j]\n            indicates whether node i links to node j.  Its diagonal must be\n            zero.  Must be symmetric if directed=False.\n        :type n_nodes: int\n        :arg  n_nodes: Number of nodes, optional argument when using edge_list\n        :type edge_list: array-like list of lists\n        :arg  edge_list: Edge list of the new network.  Entries [i,0], [i,1]\n            contain the end-nodes of an edge.\n        :arg bool directed: Indicates whether the network shall be considered\n            as directed. If False, adjacency must be symmetric.\n        :type node_weights: 1d numpy array or list [node] of floats >= 0\n        :arg  node_weights: Optional array or list of node weights to be used\n            for node splitting invariant network measures.  Entry [i] is the\n            weight of node i.  (Default: list of ones)\n        :type silence_level: int >= 0\n        :arg  silence_level: The higher, the less progress info is output.\n        :rtype: :class:`Network` instance\n        :return: The new network.\n        \"\"\"\n\n        self.directed: bool = directed\n        \"\"\"indicates whether the network is directed\"\"\"\n        self.silence_level: int = silence_level\n        \"\"\"higher -> less progress info\"\"\"\n\n        self._mut_A: int = 0\n        \"\"\"mutation count tracking `self.adjcency`\"\"\"\n        self._mut_nw: int = 0\n        \"\"\"mutation count tracking `self.node_weights`\"\"\"\n        self._mut_la: int = 0\n        \"\"\"mutation count tracking `self.graph.es`\"\"\"\n\n        self.N: int = 0\n        \"\"\"number of nodes\"\"\"\n        if n_nodes is not None:\n            self.N = n_nodes\n\n        self.n_links: int = 0\n        \"\"\"number of links\"\"\"\n        self.link_density: float = 0\n        \"\"\"proportion of linked node pairs\"\"\"\n\n        self.sp_A: sp.csc_matrix = None\n        \"\"\"\n        Adjacency matrix. A[i,j]=1 indicates a link i -> j. Symmetric if the\n        network is undirected.\n        \"\"\"\n        self.sp_dtype = None\n\n        self.graph: igraph.Graph = None\n        \"\"\"embedded graph object providing some standard network measures\"\"\"\n\n        self._node_weights: Optional[np.ndarray] = None\n        self.mean_node_weight: float = 0\n        \"\"\"mean node weight\"\"\"\n        self.total_node_weight: float = 0\n        \"\"\"total node weight\"\"\"\n\n        if adjacency is not None:\n            self.adjacency = adjacency\n        elif edge_list is not None:\n            self.set_edge_list(edge_list, n_nodes)\n        else:\n            raise NetworkError(\"An adjacency matrix or edge list has to be \"\n                               \"given to initialize an instance of Network.\")\n\n        self.node_weights = node_weights\n        self.degree()\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        return (self.directed, self._mut_A,)\n\n    def __str__(self):\n        \"\"\"\n        Return a short summary of the network.\n\n        **Example:**\n\n        >>> print(Network.SmallTestNetwork())\n        Network: undirected, 6 nodes, 7 links, link density 0.467.\n\n        :rtype: string\n        \"\"\"\n        net_type_prefix = '' if self.directed else 'un'\n        return (f\"Network: {net_type_prefix}directed, \"\n                f\"{self.N} nodes, {self.n_links} links, \"\n                f\"link density {self.link_density:.3f}.\")\n\n    def __len__(self):\n        \"\"\"\n        Return the number of nodes as the 'length'.\n\n        **Example:**\n\n        >>> len(Network.SmallTestNetwork())\n        6\n\n        :rtype: int > 0\n        \"\"\"\n        return self.N\n\n    def copy(self):\n        \"\"\"\n        Return a copy of the network.\n        \"\"\"\n        return Network(adjacency=self.sp_A, directed=self.directed,\n                       node_weights=self.node_weights,\n                       silence_level=self.silence_level)\n\n    def undirected_copy(self):\n        \"\"\"\n        Return an undirected copy of the network.\n\n        Nodes i and j are linked in the copy if, in the current network, i\n        links to j or j links to i or both.\n\n        **Example:**\n\n        >>> net = Network(adjacency=[[0,1],[0,0]], directed=True); print(net)\n        Network: directed, 2 nodes, 1 links, link density 0.500.\n        >>> print(net.undirected_copy())\n        Network: undirected, 2 nodes, 1 links, link density 1.000.\n\n        :rtype: :class:`Network` instance\n        \"\"\"\n        return Network(adjacency=self.undirected_adjacency(),\n                       directed=False, node_weights=self.node_weights,\n                       silence_level=self.silence_level)\n\n    def permuted_copy(self, permutation):\n        \"\"\"\n        Return a copy of the network with node numbers rearranged. This\n        operation should not change topological information and network\n        measures.\n\n        :type permutation: array-like [int]\n        :arg permutation: desired permutation of nodes\n        :rtype: :class:`Network` instance\n        \"\"\"\n        idx = np.array(permutation)\n        if (sorted(idx) != np.arange(self.N)).any():\n            raise NetworkError(\"Incorrect permutation indices!\")\n\n        return Network(adjacency=self.sp_A[idx][:, idx],\n                       node_weights=self.node_weights[idx],\n                       directed=self.directed,\n                       silence_level=self.silence_level)\n\n    def splitted_copy(self, node=-1, proportion=0.5):\n        \"\"\"\n        Return a copy of the network with one node splitted.\n\n        The specified node is split in two interlinked nodes\n        which are linked to the same nodes as the original node,\n        and the weight is splitted according to the given proportion.\n\n        (This method is useful for testing the node splitting invariance\n        of measures since a n.s.i. measure will be the same before and after\n        the split.)\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork(); print(net)\n        Network: undirected, 6 nodes, 7 links, link density 0.467.\n        >>> net2 = net.splitted_copy(node=5, proportion=0.2); print(net2)\n        Network: undirected, 7 nodes, 9 links, link density 0.429.\n        >>> print(net.node_weights); print(net2.node_weights)\n        [ 1.5  1.7  1.9  2.1  2.3  2.5]\n        [ 1.5  1.7  1.9  2.1  2.3  2.  0.5]\n\n        :type node: int\n        :arg  node: The index of the node to be splitted. If negative,\n                    N + index is used. The new node gets index N. (Default: -1)\n\n        :type proportion: float from 0 to 1\n        :arg  proportion: The splitted node gets a new weight of\n                          (1-proportion) * (weight of splitted node),\n                          and the new node gets a weight of\n                          proportion * (weight of splitted node).\n                          (Default: 0.5)\n\n        :rtype: :class:`Network`\n        \"\"\"\n        N, A, w = self.N, self.sp_A, self.node_weights\n        if node < 0:\n            node += N\n\n        new_A = sp.lil_matrix((N+1, N+1))\n        new_w = np.zeros(N+1)\n        new_A[:N, :N] = A\n        # add last row and column\n        new_A[:N, N] = A[:, node]\n        new_A[N, :N] = A[node, :]\n        # connect new node with original\n        new_A[node, N] = new_A[N, node] = 1\n        # copy and adjust weights\n        new_w[:N] = w[:N]\n        new_w[N] = proportion * w[node]\n        new_w[node] = (1.0 - proportion) * w[node]\n\n        new_NW = Network(adjacency=new_A, directed=self.directed,\n                         node_weights=new_w, silence_level=self.silence_level)\n        # -- Copy link attributes\n        for a in self.graph.es.attributes():\n            W = self.link_attribute(a)\n            new_W = np.zeros((N+1, N+1))\n            new_W[:N, :N] = W\n            # add last row and column\n            new_W[:N, N] = W[:, node]\n            new_W[N, :N] = W[node, :]\n            # assign weight between new node and original and for self loop\n            new_W[node, N] = new_W[N, node] = new_W[N, N] = W[node, node]\n            new_NW.set_link_attribute(a, new_W)\n        # --\n        return new_NW\n\n    @property\n    def adjacency(self):\n        \"\"\"\n        Return the (possibly non-symmetric) adjacency matrix as a dense matrix.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().adjacency)\n        array([[0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 1, 0], [0, 1, 0, 0, 1, 0],\n               [1, 1, 0, 0, 0, 0], [1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0]])\n\n        :rtype: square numpy array [node,node] of 0s and 1s\n        \"\"\"\n        return self.sp_A.toarray()\n\n    @adjacency.setter\n    def adjacency(self, adjacency):\n        \"\"\"\n        Set a new adjacency matrix.\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork(); print(net)\n        Network: undirected, 6 nodes, 7 links, link density 0.467.\n        >>> net.adjacency = [[0,1],[1,0]]; print(net)\n        Network: undirected, 2 nodes, 1 links, link density 1.000.\n\n        :type adjacency: square array-like [[0|1]]\n        :arg  adjacency: Entry [i,j] indicates whether node i links to node j.\n            Its diagonal must be zero. Symmetric if the network is undirected.\n        \"\"\"\n        # convert to sparse matrix\n        self.sp_A = None\n        if not sp.issparse(adjacency):\n            adjacency = sp.csc_matrix(np.array(adjacency))\n\n        # ensure square matrix\n        M, N = adjacency.shape\n        if M != N:\n            raise NetworkError(\"Adjacency must be square!\")\n        self.N = N\n        if N < 32767:\n            self.sp_dtype = np.int16\n        else:\n            self.sp_dtype = np.int32\n        self.sp_A = adjacency.tocsc().astype(self.sp_dtype)\n\n        # calculate graph attributes\n        edges = nz_coords(adjacency)\n        self.n_links = edges.shape[0]\n        self.link_density = 1.0 * self.n_links / N / (N - 1)\n        if not self.directed:\n            self.n_links //= 2\n\n        # create graph object\n        self.graph = igraph.Graph(n=N, edges=list(edges),\n                                  directed=self.directed)\n        self.graph.simplify()\n\n        # invalidate cache\n        self._mut_A += 1\n\n    def set_edge_list(self, edge_list, n_nodes=None):\n        \"\"\"\n        Reset network from an edge list representation.\n\n        .. note::\n           Assumes that nodes are numbered by natural numbers from 0 to N-1\n           without gaps!\n\n        **Example:**\n\n        :type edge_list: array-like [[int>=0,int>=0]]\n        :arg  edge_list: [[i,j]] for edges i -> j\n        \"\"\"\n        #  Convert to Numpy array and get number of nodes\n        edges = np.array(edge_list)\n\n        if n_nodes is None:\n            N = edges.max() + 1\n        else:\n            N = n_nodes\n\n        #  Symmetrize if undirected network\n        if not self.directed:\n            edges = np.append(edges, edges[:, [1, 0]], axis=0)\n\n        #  Create sparse adjacency matrix from edge list\n        sp_A = sp.coo_matrix(\n            (np.ones_like(edges.T[0]), tuple(edges.T)), shape=(N, N))\n\n        #  Set sparse adjacency matrix\n        self.adjacency = sp_A\n\n    @property\n    def node_weights(self):\n        \"\"\"array of node weights\"\"\"\n        return self._node_weights\n\n    @node_weights.setter\n    def node_weights(self, weights: Optional[np.ndarray]):\n        \"\"\"\n        Set the node weights to be used for node splitting invariant network\n        measures.\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork(); print(net.node_weights)\n        [ 1.5  1.7  1.9  2.1  2.3  2.5]\n        >>> net.node_weights = [1,1,1,1,1,1]; print(net.node_weights)\n        [ 1.  1.  1.  1.  1.  1.]\n\n        :type weights: array-like [float>=0]\n        :arg  weights: array-like [node] of weights (default: [1...1])\n        \"\"\"\n        N = self.N\n\n        if weights is None:\n            w = np.ones(N, dtype=DWEIGHT)\n        elif len(weights) != N:\n            raise NetworkError(\"Incorrect number of node weights!\")\n        else:\n            w = np.array(weights, dtype=DWEIGHT)\n\n        self._node_weights = w\n        self.mean_node_weight = w.mean()\n        self.total_node_weight = w.sum()\n\n        # invalidate cache\n        self._mut_nw += 1\n\n    def sp_Aplus(self):\n        \"\"\"A^+ = A + Id. matrix used in n.s.i. measures\"\"\"\n        return self.sp_A + sp.identity(self.N, dtype=self.sp_dtype)\n\n    def sp_diag_w(self):\n        \"\"\"Sparse diagonal matrix of node weights\"\"\"\n        return sp.diags([self.node_weights], [0],\n                        shape=(self.N, self.N), format='csc', dtype=None)\n\n    def sp_diag_w_inv(self):\n        \"\"\"Sparse diagonal matrix of inverse node weights\"\"\"\n        return sp.diags([1 / self.node_weights], [0],\n                        shape=(self.N, self.N), format='csc', dtype=None)\n\n    def sp_diag_sqrt_w(self):\n        \"\"\"Sparse diagonal matrix of square roots of node weights\"\"\"\n        return sp.diags([np.sqrt(self.node_weights)], [0],\n                        shape=(self.N, self.N), format='csc', dtype=None)\n\n    #\n    #  Load and save Network object\n    #\n\n    # pylint: disable=keyword-arg-before-vararg\n    def save(self, filename, fileformat=None, *args, **kwds):\n        \"\"\"\n        Save the Network object to a file.\n\n        Unified writing function for graphs. Relies on and partially extends\n        the corresponding igraph function. Refer to igraph documentation for\n        further details on the various writer methods for different formats.\n\n        This method tries to identify the format of the graph given in\n        the first parameter (based on extension) and calls the corresponding\n        writer method.\n\n        Existing node and link attributes/weights are also stored depending\n        on the chosen file format. E.g., the formats GraphML and gzipped\n        GraphML are able to store both node and link weights.\n\n        The remaining arguments are passed to the writer method without\n        any changes.\n\n        :arg str filename: The name of the file where the Network object is to\n            be stored.\n        :arg str fileformat: the format of the file (if one wants to override\n            the format determined from the filename extension, or the filename\n            itself is a stream). ``None`` means auto-detection. Possible values\n            are: ``\"ncol\"`` (NCOL format), ``\"lgl\"`` (LGL format),\n            ``\"graphml\"``, ``\"graphmlz\"`` (GraphML and gzipped GraphML format),\n            ``\"gml\"`` (GML format), ``\"dot\"``, ``\"graphviz\"`` (DOT format, used\n            by GraphViz), ``\"net\"``, ``\"pajek\"`` (Pajek format), ``\"dimacs\"``\n            (DIMACS format), ``\"edgelist\"``, ``\"edges\"`` or ``\"edge\"`` (edge\n            list), ``\"adjacency\"`` (adjacency matrix), ``\"pickle\"`` (Python\n            pickled format), ``\"svg\"`` (Scalable Vector Graphics).\n        \"\"\"\n        #  Store node weights as an igraph vertex attribute for saving\n        #  Link attributes/weights are stored automatically if they exist\n        if self.node_weights is not None:\n            self.graph.vs.set_attribute_values(\n                \"node_weight_nsi\", list(self.node_weights))\n\n        self.graph.write(f=filename, format=fileformat, *args, **kwds)\n\n    # pylint: disable=keyword-arg-before-vararg\n    @staticmethod\n    def Load(filename, fileformat=None, silence_level=0, *args, **kwds):\n        \"\"\"\n        Return a Network object stored in a file.\n\n        Unified reading function for graphs. Relies on and partially extends\n        the corresponding igraph function. Refer to igraph documentation for\n        further details on the various reader methods for different formats.\n\n        This method tries to identify the format of the graph given in\n        the first parameter and calls the corresponding reader method.\n\n        Existing node and link attributes/weights are also restored depending\n        on the chosen file format. E.g., the formats GraphML and gzipped\n        GraphML are able to store both node and link weights.\n\n        The remaining arguments are passed to the reader method without\n        any changes.\n\n        :arg str filename: The name of the file containing the Network object.\n        :arg str fileformat: the format of the file (if known in advance).\n          ``None`` means auto-detection. Possible values are: ``\"ncol\"`` (NCOL\n          format), ``\"lgl\"`` (LGL format), ``\"graphml\"``, ``\"graphmlz\"``\n          (GraphML and gzipped GraphML format), ``\"gml\"`` (GML format),\n          ``\"net\"``, ``\"pajek\"`` (Pajek format), ``\"dimacs\"`` (DIMACS format),\n          ``\"edgelist\"``, ``\"edges\"`` or ``\"edge\"`` (edge list),\n          ``\"adjacency\"`` (adjacency matrix), ``\"pickle\"`` (Python pickled\n          format).\n        :type silence_level: int >= 0\n        :arg  silence_level: The higher, the less progress info is output.\n        :rtype: Network object\n        :return: :class:`Network` instance.\n        \"\"\"\n        #  Load to igraph Graph object\n        graph = igraph.Graph.Read(f=filename, format=fileformat, *args, **kwds)\n        return Network.FromIGraph(graph=graph, silence_level=silence_level)\n\n    #\n    #  Graph generation methods\n    #\n\n    @staticmethod\n    def FromIGraph(graph, silence_level=0):\n        \"\"\"\n        Return a :class:`Network` object given an igraph Graph object.\n\n        :type graph: igraph Graph object\n        :arg graph: The igraph Graph object to be converted.\n\n        :type silence_level: int >= 0\n        :arg  silence_level: The higher, the less progress info is output.\n\n        :rtype: :class:`Network` instance\n        :return: :class:`Network` object.\n        \"\"\"\n        #  Get number of nodes\n        N = len(graph.vs)\n\n        #  Get directedness\n        directed = graph.is_directed()\n\n        #  Extract edge list\n        edges = np.array(graph.get_edgelist())\n\n        #  Symmetrize if undirected network\n        if not directed:\n            edges = np.append(edges, edges[:, [1, 0]], axis=0)\n\n        #  Create sparse adjacency matrix from edge list\n        sp_A = sp.coo_matrix(\n            (np.ones_like(edges.T[0]), tuple(edges.T)), shape=(N, N))\n\n        #  Extract node weights\n        if \"node_weight_nsi\" in graph.vs.attribute_names():\n            node_weights = np.array(\n                graph.vs.get_attribute_values(\"node_weight_nsi\"))\n        else:\n            node_weights = None\n\n        net = Network(adjacency=sp_A, directed=directed,\n                      node_weights=node_weights, silence_level=silence_level)\n\n        #  Overwrite igraph Graph object in Network instance to restore link\n        #  attributes/weights\n        net.graph = graph\n        #  invalidate cache\n        net._mut_la += 1\n        return net\n\n    @staticmethod\n    def SmallTestNetwork():\n        \"\"\"\n        Return a 6-node undirected test network with node weights.\n\n        The network looks like this::\n\n                3 - 1\n                |   | \\\\\n            5 - 0 - 4 - 2\n\n        The node weights are [1.5, 1.7, 1.9, 2.1, 2.3, 2.5],\n        a typical node weight for corrected n.s.i. measures would be 2.0.\n\n        :rtype: :class:`Network` instance\n        :return: :class:`Network` object.\n        \"\"\"\n        nw = Network(adjacency=[[0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 1, 0],\n                                [0, 1, 0, 0, 1, 0], [1, 1, 0, 0, 0, 0],\n                                [1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0]],\n                     directed=False,\n                     node_weights=[1.5, 1.7, 1.9, 2.1, 2.3, 2.5],\n                     silence_level=1)\n        link_weights = np.array([[0, 0, 0, 1.3, 2.5, 1.1],\n                                 [0, 0, 2.3, 2.9, 2.7, 0],\n                                 [0, 2.3, 0, 0, 1.5, 0],\n                                 [1.3, 2.9, 0, 0, 0, 0],\n                                 [2.5, 2.7, 1.5, 0, 0, 0],\n                                 [1.1, 0, 0, 0, 0, 0]])\n        nw.set_link_attribute(\"link_weights\", link_weights)\n        return nw\n\n    @staticmethod\n    def SmallDirectedTestNetwork():\n        \"\"\"\n        Return a 6-node directed test network with node and edge weights.\n\n        The node weights are [1.5, 1.7, 1.9, 2.1, 2.3, 2.5],\n        a typical node weight for corrected n.s.i. measures would be 2.0.\n\n        :rtype: :class:`Network` instance\n        :return: :class:`Network` object.\n        \"\"\"\n        nw = Network(adjacency=[[0, 1, 0, 1, 0, 0], [0, 0, 1, 0, 1, 0],\n                                [0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0],\n                                [1, 0, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0]],\n                     directed=True,\n                     node_weights=[1.5, 1.7, 1.9, 2.1, 2.3, 2.5],\n                     silence_level=1)\n        nw.set_link_attribute(\"link_weights\", np.array([[0, 1.3, 0, 2.5, 0, 0],\n                                                        [0, 0, 1.9, 0, 1.0, 0],\n                                                        [0, 0, 0, 0, 0, 0],\n                                                        [0, 3.0, 0, 0, 0, 0],\n                                                        [2.1, 0, 2.7, 0, 0, 0],\n                                                        [1.5, 0, 0, 0, 0, 0]]))\n        return nw\n\n    #\n    #  Network models\n    #\n\n    @staticmethod\n    def Model(network_model, **kwargs):\n        \"\"\"\n        Return a new model graph generated with the specified network model\n\n        **Example:**\n\n        >>> print(Network.Model(\"ErdosRenyi\", n_nodes=10, n_links=18))\n        Generating Erdos-Renyi random graph with 10 nodes and 18 links...\n        Network: undirected, 10 nodes, 18 links, link density 0.400.\n\n        :type network_model string\n        :arg network_model name of the corresponding network model\n\n        :rtype: :class:`Network` instance\n        :return: :class:`Network` object.\n\n        Possible choices for ``network_model``:\n          - \"ErdosRenyi\"\n          - \"BarabasiAlbert\"\n          - \"BarabasiAlbert_igraph\"\n          - \"Configuration\"\n        \"\"\"\n        A = getattr(Network, network_model)(**kwargs)\n        return Network(A)\n\n    @staticmethod\n    def ErdosRenyi(n_nodes=100, link_probability=None, n_links=None,\n                   silence_level=0):\n        \"\"\"\n        Return adjacency matrix of a new undirected Erdos-Renyi random graph\n        with a given number of nodes and linking probability.\n\n        The expected link density equals this probability.\n\n        **Example:**\n\n        >>> A = Network.ErdosRenyi(n_nodes=10, n_links=18)\n        Generating Erdos-Renyi random graph with 10 nodes and 18 links...\n\n        :type n_nodes: int > 0\n        :arg  n_nodes: Number of nodes. (Default: 100)\n\n        :type link_probability: float from 0 to 1, or None\n        :arg  link_probability: If not None, each pair of nodes is\n                                independently linked with this probability.\n                                (Default: None)\n\n        :type n_links: int > 0, or None\n        :arg  n_links: If not None, this many links are assigned at random.\n                       Must be None if link_probability is not None.\n                       (Default: None)\n\n        :type silence_level: int >= 0\n        :arg  silence_level: The higher, the less progress info is output.\n\n        :rtype: square array-like [node,node]\n        :return: adjacency matrix of the generated model network\n        \"\"\"\n        if link_probability is not None and n_links is None:\n            if silence_level < 1:\n                print(f\"Generating Erdos-Renyi random graph with \"\n                      f\"{n_nodes} nodes and probability {link_probability}...\")\n\n            graph = igraph.Graph.Erdos_Renyi(n=n_nodes, p=link_probability)\n\n        elif link_probability is None and n_links is not None:\n            if silence_level < 1:\n                print(f\"Generating Erdos-Renyi random graph with \"\n                      f\"{n_nodes} nodes and {n_links} links...\")\n\n            graph = igraph.Graph.Erdos_Renyi(n=n_nodes, m=n_links)\n\n        else:\n            raise ValueError(\"`ErdosRenyi()` requires either a \"\n                             \"`link_probability` or `n_links` argument.\")\n\n        return np.array(graph.get_adjacency(type=2).data)\n\n    @staticmethod\n    def BarabasiAlbert_igraph(n_nodes=100, n_links_each=5):\n        \"\"\"\n        Return adjacency matrix of a new undirected Barabasi-Albert random\n        graph generated by igraph.\n\n        CAUTION: actual no. of new links can be smaller than n_links_each\n        because neighbours are drawn with replacement and graph is then\n        simplified.\n\n        The given number of nodes are added in turn to the initially empty node\n        set, and each new node is linked to the given number of existing nodes.\n        The resulting link density is approx. 2 * ``n_links_each``/``n_nodes``.\n\n        **Example:** Generating a random tree:\n\n        >>> A = Network.BarabasiAlbert_igraph(n_nodes=100, n_links_each=1)\n\n        :type n_nodes: int > 0\n        :arg  n_nodes: Number of nodes. (Default: 100)\n\n        :type n_links_each: int > 0\n        :arg  n_links_each: Number of links to existing nodes each new node\n                            gets during construction. (Default: 5)\n\n        :rtype: square array-like [node,node]\n        :return: adjacency matrix of generated network\n        \"\"\"\n        graph = igraph.Graph.Barabasi(n=n_nodes, m=n_links_each)\n\n        # Remove self-loops and multiple links, this does of course change the\n        # actual degree sequence of the generated graph, but just slightly\n        graph.simplify()\n\n        return np.array(graph.get_adjacency(type=2).data)\n\n    # FIXME: Add example\n    @staticmethod\n    def BarabasiAlbert(n_nodes=100, n_links_each=5):\n        \"\"\"\n        Return adjacency matrix of a new undirected Barabasi-Albert random\n        graph with exactly n_links_each * (n_nodes-n_links_each) links.\n\n        :type n_nodes: int > 0\n        :arg  n_nodes: Number of nodes. (Default: 100)\n\n        :type n_links_each: int > 0\n        :arg  n_links_each: Number of links to existing nodes each new node\n                            gets during construction. (Default: 5)\n\n        :rtype: square array-like [node,node]\n        :return: adjacency matrix of generated network\n        \"\"\"\n        # start with 1+m nodes of which the first is linked to the rest\n        N, m = n_nodes, n_links_each\n        A = sp.lil_matrix((N, N), dtype=np.int8)\n        A[0, 1:1+m] = 1\n        A[1:1+m, 0] = 1\n\n        # inverse cum. degree distribution\n        dtype = np.int16 if N < 32767 else np.int32\n        targets = np.zeros(2*m*(N-m), dtype=dtype)\n        last_child = np.zeros(N, dtype=dtype)\n        targets[m:2*m] = range(1, 1+m)\n        n_targets = 2*m\n        for j in range(1+m, N):\n            for it in range(m):\n                while True:\n                    i = targets[int(random.uniform(low=0, high=n_targets))]\n                    if last_child[i] != j:\n                        break\n                A[i, j] = A[j, i] = 1\n                targets[n_targets + it] = i\n                last_child[i] = j\n            targets[n_targets + m: n_targets + 2*m] = j\n            n_targets += 2*m\n\n        return A\n\n    @staticmethod\n    def Configuration(degree):\n        \"\"\"\n        Return adjacency matrix of a new configuration model random graph\n        with a given degree sequence.\n\n        **Example:** Generate a network of 1000 nodes with degree 3 each:\n\n        >>> A = Network.Configuration([3 for _ in range(0,1000)]))\n        Generating configuration model random graph\n        from given degree sequence...\n\n        :type degree: 1d numpy array or list [node]\n        :arg  degree: Array or list of degree wanted.\n\n        :type silence_level: int >= 0\n        :arg  silence_level: The higher, the less progress info is output.\n\n        :rtype: square array-like [node,node]\n        :return: adjacency matrix of generated network\n        \"\"\"\n        print(\"Generating configuration model random graph\\n\"\n              + \"from given degree sequence...\")\n\n        graph = igraph.Graph.Degree_Sequence(out=list(degree))\n\n        #  Remove self-loops and multiple links, this does of course change the\n        #  actual degree sequence of the generated graph, but just slightly\n        graph.simplify()\n\n        return np.array(graph.get_adjacency(type=2).data)\n\n    @staticmethod\n    def WattsStrogatz(N, k, p):\n        \"\"\"\n        Return adjacency matrix of a Watt-Strogatz random graph.\n\n        Reference: [Watts1998]_\n\n        **Example:** Generate a network of 100 nodes with rewiring probability\n        0.1\n\n        >>> A = Network.WattsStrogatz(N=100, k=2, p=0.1)\n        Generating Watts-Strogatz random graph with 100 nodes and rewiring\n        probability 0.1\n\n        :type N: int > 0\n        :arg N: Number of nodes.\n\n        :type k: int > 0\n        :arg k: Each node is connected to k nearest neighbors in ring topology.\n\n        :type p: float > 0\n        :arg p: Probability of rewiring each edge.\n\n        :rtype: square array-like [node,node]\n        :return: adjacency matrix of generated network\n        \"\"\"\n        print(f\"Generating Watts-Strogatz random graph with {N} nodes and \"\n              f\"rewiring probability {p}\")\n\n        graph = igraph.Graph.Watts_Strogatz(dim=1, size=N, nei=k, p=p)\n\n        return np.array(graph.get_adjacency(type=2).data)\n\n    @staticmethod\n    # pylint: disable=too-many-positional-arguments\n    def GrowWeights(n_nodes=100, n_initials=1, exponent=1,\n                    mode=\"exp\",\n                    split_prob=.01,  # for exponential model\n                    split_weight=100,  # for reciprocal model\n                    beta=1.0, n_increases=1e100):\n        \"\"\"\n        EXPERIMENTAL\n        \"\"\"\n        N = n_nodes\n        w = np.zeros(N)\n        inc_prob = np.zeros(N)\n        w[:n_initials] = 1\n        inc_prob[:n_initials] = 1\n        total_inc_prob = inc_prob.sum()\n        hold_prob = 1 - split_prob\n\n        def _inc_target():\n            thd = random.uniform(low=0, high=total_inc_prob)\n            i = 0\n            cum = inc_prob[0]\n            while cum < thd:\n                i += 1\n                cum += inc_prob[i]\n            return i\n\n        this_N = n_initials\n        it = 0\n        with tqdm(total=N) as pbar:\n            while this_N < N and it < n_increases:\n                it += 1\n                i = _inc_target()\n                total_inc_prob -= inc_prob[i]\n                w[i] += 1\n                inc_prob[i] = w[i]**exponent\n                total_inc_prob += inc_prob[i]\n                if (mode == \"exp\" and random.uniform() > hold_prob**w[i]) or \\\n                        (mode == \"rec\" and random.uniform()\n                         < w[i]*1.0/(split_weight+w[i])):  # reciprocal\n                    # split i into i,this_N:\n                    total_inc_prob -= inc_prob[i]\n                    w[this_N] = w[i]*random.beta(beta, beta)\n                    w[i] -= w[this_N]\n                    inc_prob[this_N] = w[this_N]**exponent\n                    inc_prob[i] = w[i]**exponent\n                    total_inc_prob += inc_prob[this_N] + inc_prob[i]\n                    this_N += 1\n                    pbar.update()\n        return w\n\n    def randomly_rewire(self, iterations):\n        \"\"\"\n        Randomly rewire the network, preserving the degree sequence.\n\n        **Example:** Generate a network of 100 nodes with degree 5 each:\n\n        >>> net = Network.SmallTestNetwork(); print(net)\n        Network: undirected, 6 nodes, 7 links, link density 0.467.\n        >>> net.randomly_rewire(iterations=10); print(net)\n        Randomly rewiring the network,preserving the degree sequence...\n        Network: undirected, 6 nodes, 7 links, link density 0.467.\n\n        :type iterations: int > 0\n        :arg iterations: Number of iterations. In each iteration, two randomly\n            chosen links a--b and c--d for which {a,c} and {b,d} are not\n            linked, are replaced by the links a--c and b--d.\n        \"\"\"\n        # TODO: verify that it is indeed as described above.\n        if self.silence_level <= 1:\n            print(\"Randomly rewiring the network,\"\n                  + \"preserving the degree sequence...\")\n\n        # rewire embedded igraph.Graph:\n        self.graph.rewire(iterations)\n\n        # update all data that depends on rewired edge list:\n        self.set_edge_list(self.graph.get_edgelist())\n\n    def edge_list(self):\n        \"\"\"\n        Return the network's edge list.\n\n        **Example:**\n\n        >>> print(Network.SmallTestNetwork().edge_list()[:8])\n        [[0 3] [0 4] [0 5] [1 2] [1 3] [1 4] [2 1] [2 4]]\n\n        :rtype: array-like (numpy matrix or list of lists/tuples)\n        \"\"\"\n        return nz_coords(self.sp_A)\n\n    def undirected_adjacency(self):\n        \"\"\"\n        Return the adjacency matrix of the undirected version of the network\n        as a dense numpy array.\n        Entry [i,j] is 1 if i links to j or j links to i.\n\n        **Example:**\n\n        >>> net = Network(adjacency=[[0,1],[0,0]], directed=True)\n        >>> print(net.undirected_adjacency().toarray())\n        [[0 1] [1 0]]\n\n        :rtype: array([[0|1]])\n        \"\"\"\n        return self.sp_A.maximum(self.sp_A.T)\n\n    def laplacian(self, direction=\"out\", link_attribute=None):\n        \"\"\"\n        Return the (possibly non-symmetric) dense Laplacian matrix.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().laplacian())\n        array([[ 3,  0,  0, -1, -1, -1], [ 0,  3, -1, -1, -1,  0],\n               [ 0, -1,  2,  0, -1,  0], [-1, -1,  0,  2,  0,  0],\n               [-1, -1, -1,  0,  3,  0], [-1,  0,  0,  0,  0,  1]])\n\n        :arg str direction: This argument is ignored for undirected graphs.\n            \"out\" - out-degree on diagonal of laplacian\n            \"in\"  - in-degree on diagonal of laplacian\n        :arg str link_attribute: name of link attribute to be used\n        :rtype: square array [node,node] of ints\n        \"\"\"\n        if link_attribute == \"topological\":\n            print(\"WARNING: link_attribute='topological' is deprecated.\\n\"\n                  + \"Use link_attribute=None instead.\")\n            link_attribute = None\n\n        if link_attribute is None:\n            if self.directed:\n                if direction == \"out\":\n                    diagonal = self.outdegree()\n                elif direction == \"in\":\n                    diagonal = self.indegree()\n                else:\n                    raise ValueError('direction must be \"in\" or \"out\".')\n            else:\n                diagonal = self.degree()\n\n            return np.diag(diagonal, 0) - self.adjacency\n        else:\n            raise NotImplementedError(\"Only implemented for link_attribute \\\n                                      =None.\")\n\n    def nsi_laplacian(self):\n        \"\"\"\n        Return the n.s.i. Laplacian matrix (undirected networks only!).\n\n        **Example:**\n\n        >>> Network.SmallTestNetwork().nsi_laplacian()\n        Calculating n.s.i. degree...\n        array([[ 6.9,  0. ,  0. , -2.1, -2.3, -2.5],\n               [ 0. ,  6.3, -1.9, -2.1, -2.3,  0. ],\n               [ 0. , -1.7,  4. ,  0. , -2.3,  0. ],\n               [-1.5, -1.7,  0. ,  3.2,  0. ,  0. ],\n               [-1.5, -1.7, -1.9,  0. ,  5.1,  0. ],\n               [-1.5,  0. ,  0. ,  0. ,  0. ,  1.5]])\n\n        :rtype: square array([[float]])\n        \"\"\"\n        if self.directed:\n            raise NotImplementedError(\"Not implemented for directed networks.\")\n        return (\n            self.sp_nsi_diag_k() - self.sp_Aplus() * self.sp_diag_w()\n            ).toarray()\n\n    #\n    #  Calculate frequency and cumulative distributions\n    #\n\n    # TODO: add sensible default for n_bins depending on len(values)\n    @staticmethod\n    def _histogram(values, n_bins, interval=None):\n        \"\"\"\n        Return a normalized histogram of a list of values,\n        its statistical error, and the lower bin boundaries.\n\n        **Example:** Get the relative frequencies only:\n\n        >>> r(Network._histogram(\n        ...     values=[1,2,13], n_bins=3, interval=(0,30))[0])\n        array([ 0.6667,  0.3333,  0. ])\n\n        :type values: 1d array or list of floats\n        :arg  values: The values whose distribution is wanted.\n\n        :type n_bins: int > 0\n        :arg  n_bins: Number of bins to be used for the histogram.\n\n        :type interval: tuple (float,float), or None\n        :arg  interval: Optional interval to use. If None, the minimum and\n                        maximum values are used. (Default: None)\n\n        :rtype:  tuple (list,list,list)\n        :return: A list of relative bin frequencies, a list of estimated\n                 statistical errors, and a list of lower bin boundaries.\n        \"\"\"\n        hist = np.histogram(values, bins=n_bins, range=interval, density=False)\n        frequencies = hist[0].astype('float64')\n        bin_starts = hist[1][:-1]\n\n        # Calculate statistical error given by 1/n_i per bin i,\n        # where n_i is the number of samples per bin\n        error = np.zeros(n_bins)\n        error[frequencies != 0] = 1 / np.sqrt(frequencies[frequencies != 0])\n        # FIXME: this seems not correct. If the true probability for the bin\n        # is p_i, the variance of  n_i / N  is  p_i * (1 - p_i) / N\n        # which can be estimated from n_i by  n_i * (N - n_i) / N**3\n\n        #  Normalize frequencies and error\n        rel_freqs = frequencies / frequencies.sum()\n        error /= frequencies.sum()\n\n        return (rel_freqs, error, bin_starts)\n\n    @staticmethod\n    def _cum_histogram(values, n_bins, interval=None):\n        \"\"\"\n        Return a normalized cumulative histogram of a list of values,\n        and the lower bin boundaries.\n\n        **Example:** Get the relative frequencies only:\n\n        >>> r(Network._cum_histogram(\n        ...     values=[1,2,13], n_bins=3, interval=(0,30))[0])\n        array([ 1. ,  0.3333,  0. ])\n\n        :type values: 1d array or list of floats\n        :arg  values: The values whose distribution is wanted.\n\n        :type n_bins: int > 0\n        :arg  n_bins: Number of bins to be used for the histogram.\n\n        :type interval: tuple (float,float), or None\n        :arg  interval: Optional range to use. If None, the minimum and maximum\n                        values are used. (Default: None)\n\n        :rtype:  tuple (list,list)\n        :return: A list of cumulative relative bin frequencies\n                 (entry [i] is the sum of the frequencies of all bins j >= i),\n                 and a list of lower bin boundaries.\n        \"\"\"\n        (rel_freqs, _, bin_starts) = \\\n            Network._histogram(values=values, n_bins=n_bins, interval=interval)\n        cum_rel_freqs = rel_freqs[::-1].cumsum()[::-1]\n        return (cum_rel_freqs, bin_starts)\n\n    #\n    #  Methods working with node attributes\n    #\n\n    def set_node_attribute(self, attribute_name: str, values):\n        \"\"\"\n        Add a node attribute.\n\n        Examples for node attributes/weights are degree or betweenness.\n\n        :arg str attribute_name: The name of the node attribute.\n\n        :type values: 1D Numpy array [node]\n        :arg values: The node attribute sequence.\n        \"\"\"\n        if len(values) == self.N:\n            self.graph.vs.set_attribute_values(attrname=attribute_name,\n                                               values=values)\n        else:\n            print(\"Error! Vertex attribute data array\", attribute_name,\n                  \"has to have the same length as the number of nodes \"\n                  \"in the graph.\")\n\n    def node_attribute(self, attribute_name: str):\n        \"\"\"\n        Return a node attribute.\n\n        Examples for node attributes/weights are degree or betweenness.\n\n        :arg str attribute_name: The name of the node attribute.\n\n        :rtype: 1D Numpy array [node]\n        :return: The node attribute sequence.\n        \"\"\"\n        return np.array(self.graph.vs.get_attribute_values(attribute_name))\n\n    def del_node_attribute(self, attribute_name: str):\n        \"\"\"\n        Delete a node attribute.\n\n        :arg str attribute_name: Name of node attribute to be deleted.\n        \"\"\"\n        if attribute_name in self.graph.vs.attributes():\n            del self.graph.vs[attribute_name]\n\n    #\n    #  Methods working with link attributes\n    #\n\n    def find_link_attribute(self, attribute_name: str):\n        return attribute_name in self.graph.es.attributes()\n\n    def average_link_attribute(self, attribute_name: str):\n        \"\"\"\n        For each node, return the average of a link attribute\n        over all links of that node.\n\n        :arg str attribute_name: Name of link attribute to be used.\n\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        return self.link_attribute(attribute_name).mean(axis=1)\n\n    def link_attribute(self, attribute_name: str):\n        \"\"\"\n        Return the values of a link attribute.\n\n        :arg str attribute_name: Name of link attribute to be used.\n\n        :rtype:  square numpy array [node,node]\n        :return: Entry [i,j] is the attribute of the link from i to j.\n        \"\"\"\n        #  Initialize weights array\n        weights = np.zeros((self.N, self.N))\n\n        if self.directed:\n            for e in self.graph.es:\n                weights[e.tuple] = e[attribute_name]\n        #  Symmetrize if graph is undirected\n        else:\n            for e in self.graph.es:\n                weights[e.tuple] = e[attribute_name]\n                weights[e.tuple[1], e.tuple[0]] = e[attribute_name]\n        return weights\n\n    def del_link_attribute(self, attribute_name: str):\n        \"\"\"\n        Delete a link attribute.\n\n        :arg str attribute_name: name of link attribute to be deleted\n        \"\"\"\n        if self.find_link_attribute(attribute_name):\n            del self.graph.es[attribute_name]\n            # invalidate cache\n            self._mut_la += 1\n\n    def set_link_attribute(self, attribute_name, values):\n        \"\"\"\n        Set the values of some link attribute.\n\n        These can be used as weights in measures requiring link weights.\n\n        .. note::\n           The attribute/weight matrix should be symmetric for undirected\n           networks.\n\n        :arg str attribute_name: name of link attribute to be set\n\n        :type values: square numpy array [node,node]\n        :arg  values: Entry [i,j] is the attribute of the link from i to j.\n        \"\"\"\n        for e in self.graph.es:\n            e[attribute_name] = values[e.tuple]\n        # invalidate cache\n        self._mut_la += 1\n\n    #\n    #  Degree related measures\n    #\n\n    @Cached.method()\n    def degree(self, link_attribute=None):\n        \"\"\"\n        Return list of degrees.\n\n        If a link attribute is specified, return the associated strength.\n\n        **Example:**\n\n        >>> Network.SmallTestNetwork().degree()\n        array([3, 3, 2, 2, 3, 1])\n\n        :arg str link_attribute: link attribute [optional]\n        :rtype: array([int>=0])\n        \"\"\"\n        if self.directed:\n            return self.indegree(link_attribute) + self.outdegree(link_attribute)\n        else:\n            return self.outdegree(link_attribute)\n\n    @Cached.method(attrs=(\"_mut_la\",))\n    def indegree(self, link_attribute=None):\n        \"\"\"\n        Return list of in-degrees.\n\n        If a link attribute is specified, return the associated\n        in-strength.\n\n        **Example:**\n\n        >>> Network.SmallDirectedTestNetwork().indegree()\n        array([2, 2, 2, 1, 1, 0])\n\n        :arg str link_attribute: link attribute [optional]\n        :rtype: array([int>=0])\n        \"\"\"\n        if link_attribute is None:\n            return self.sp_A.toarray().sum(axis=0).astype(int)\n        else:\n            return self.link_attribute(link_attribute).sum(axis=0).T\n\n    @Cached.method(attrs=(\"_mut_la\",))\n    def outdegree(self, link_attribute=None):\n        \"\"\"\n        Return list of out-degrees.\n\n        If a link attribute is specified, return the associated\n        out-strength.\n\n        **Example:**\n\n        >>> Network.SmallDirectedTestNetwork().outdegree()\n        array([2, 2, 0, 1, 2, 1])\n\n        :arg str link_attribute: link attribute [optional]\n        :rtype: array([int>=0])\n        \"\"\"\n        if link_attribute is None:\n            return self.sp_A.toarray().sum(axis=1).T.astype(int)\n        else:\n            return self.link_attribute(link_attribute).sum(axis=1).T\n\n    @Cached.method(attrs=(\"_mut_la\",))\n    def bildegree(self, link_attribute=None):\n        \"\"\"\n        Return list of bilateral degrees, i.e. the number of simultaneously in-\n        and out-going edges.\n\n        If a link attribute is specified, return the associated bilateral\n        strength.\n\n        **Exmaple:**\n\n        >>> Network.SmallDirectedTestNetwork().bildegree()\n        array([0, 0, 0, 0, 0, 0], dtype=int16)\n        >>> net = Network.SmallTestNetwork()\n        >>> (net.bildegree() == net.degree()).all()\n        True\n        \"\"\"\n        if link_attribute is None:\n            return (self.sp_A * self.sp_A).diagonal()\n        else:\n            w = self.link_attribute(link_attribute)\n            return (w @ w).diagonal()\n\n    def sp_nsi_diag_k(self):\n        \"\"\"Sparse diagonal matrix of n.s.i. degrees\"\"\"\n        return sp.diags([self.nsi_degree()], [0],\n                        shape=(self.N, self.N), format='csc', dtype=None)\n\n    def sp_nsi_diag_k_inv(self):\n        \"\"\"Sparse diagonal matrix of inverse n.s.i. degrees\"\"\"\n        return sp.diags([np.power(self.nsi_degree(), -1)], [0],\n                        shape=(self.N, self.N), format='csc', dtype=None)\n\n    @Cached.method(attrs=(\"_mut_nw\", \"_mut_la\"))\n    def nsi_degree(self, link_attribute=None, typical_weight=None):\n        \"\"\"\n        For each node, return its uncorrected or corrected n.s.i. degree.\n\n        If a link attribute is specified, return the associated n.s.i.\n        strength.\n\n        **Examples:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> net.nsi_degree()\n        Calculating n.s.i. degree...\n        array([ 8.4,  8. ,  5.9,  5.3,  7.4,  4. ])\n        >>> net.splitted_copy().nsi_degree()\n        Calculating n.s.i. degree...\n        array([ 8.4,  8. ,  5.9,  5.3,  7.4,  4. ,  4. ])\n        >>> net.nsi_degree(typical_weight=2.0)\n        array([ 3.2 ,  3.  ,  1.95,  1.65,  2.7 ,  1.  ])\n        >>> net.splitted_copy().nsi_degree(typical_weight=2.0)\n        Calculating n.s.i. degree...\n        array([ 3.2 ,  3.  ,  1.95,  1.65,  2.7 ,  1.  ,  1.  ])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.degree())\n        array([3, 3, 2, 2, 3, 1])\n        >>> r(net.splitted_copy().degree())\n        array([4, 3, 2, 2, 3, 2, 2])\n\n        :arg str link_attribute: link attribute (optional)\n        :type typical_weight: float > 0\n        :arg float typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n\n        :rtype: array([float])\n        \"\"\"\n        if self.directed:\n            res = self.nsi_indegree(link_attribute) + self.nsi_outdegree(link_attribute)\n        else:\n            if link_attribute is None:\n                res = self.sp_Aplus() * self.node_weights\n            else:\n                w = self.link_attribute(link_attribute)\n                res = (self.node_weights @ w).squeeze()\n\n        if typical_weight is None:\n            return res\n        else:\n            return res/typical_weight - 1.0\n\n    @Cached.method(attrs=(\"_mut_nw\", \"_mut_la\"))\n    def nsi_indegree(self, link_attribute=None, typical_weight=None):\n        \"\"\"\n        For each node, return its n.s.i. indegree.\n\n        If a link attribute is specified, return the associated n.s.i.\n        in-strength.\n\n        **Examples:**\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> net.nsi_indegree()\n        array([ 6.3,  5.3,  5.9,  3.6,  4. ,  2.5])\n        >>> net.splitted_copy().nsi_indegree()\n        array([ 6.3,  5.3,  5.9,  3.6,  4. ,  2.5,  2.5])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> net.indegree()\n        array([2, 2, 2, 1, 1, 0])\n        >>> net.splitted_copy().indegree()\n        array([3, 2, 2, 1, 1, 1, 1])\n\n        :arg str link_attribute: link attribute [optional]\n        :type typical_weight: float > 0\n        :arg  typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n\n        :rtype: array([float])\n        \"\"\"\n        if link_attribute is None:\n            res = self.node_weights * self.sp_Aplus()\n        else:\n            res = (self.node_weights @ self.link_attribute(link_attribute)).squeeze()\n        if typical_weight is None:\n            return res\n        else:\n            return res/typical_weight - 1.0\n\n    @Cached.method(attrs=(\"_mut_nw\", \"_mut_la\"))\n    def nsi_outdegree(self, link_attribute=None, typical_weight=None):\n        \"\"\"\n        For each node, return its n.s.i. outdegree.\n\n        If a link attribute is specified, return the associated n.s.i.\n        out-strength.\n\n        **Examples:**\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> net.nsi_outdegree()\n        array([ 5.3,  5.9,  1.9,  3.8,  5.7,  4. ])\n        >>> net.splitted_copy().nsi_outdegree()\n        array([ 5.3,  5.9,  1.9,  3.8,  5.7,  4. ,  4. ])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> net.outdegree()\n        array([2, 2, 0, 1, 2, 1])\n        >>> net.splitted_copy().outdegree()\n        array([2, 2, 0, 1, 2, 2, 2])\n\n        :arg str link_attribute: link attribute [optional]\n        :type typical_weight: float > 0\n        :arg  typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n\n        :rtype: array([float])\n        \"\"\"\n        if link_attribute is None:\n            res = self.sp_Aplus() * self.node_weights\n        else:\n            res = (self.link_attribute(link_attribute) @ self.node_weights).squeeze()\n        if typical_weight is None:\n            return res\n        else:\n            return res/typical_weight - 1.0\n\n    @Cached.method(attrs=(\"_mut_nw\",))\n    def nsi_bildegree(self, link_attribute=None, typical_weight=None):\n        \"\"\"\n        For each node, return its n.s.i. bilateral degree.\n\n        If a link attribute is specified, return the associated n.s.i.\n        bilateral strength.\n\n        :arg str link_attribute: link attribute [optional]\n        :type typical_weight: float > 0\n        :arg  typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n\n        :rtype: array([float])\n        \"\"\"\n        assert link_attribute is None, \"nsi_bildegree is not implemented with link_attribute yet\"\n        Ap = self.sp_Aplus()\n        res = (Ap * sp.diags(self.node_weights, dtype=None) * Ap).diagonal()\n        if typical_weight is None:\n            return res\n        else:\n            return res/typical_weight - 1.0\n\n    @Cached.method(name=\"the degree frequency distribution\")\n    def degree_distribution(self):\n        \"\"\"\n        Return the degree frequency distribution.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().degree_distribution())\n        Calculating the degree frequency distribution...\n        array([ 0.1667, 0.3333, 0.5 ])\n\n        :rtype:  1d numpy array [k] of ints >= 0\n        :return: Entry [k] is the number of nodes having degree k.\n        \"\"\"\n        k = self.degree()\n        return self._histogram(values=k, n_bins=k.max())[0]\n\n    @Cached.method(name=\"the in-degree frequency distribution\")\n    def indegree_distribution(self):\n        \"\"\"\n        Return the in-degree frequency distribution.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().indegree_distribution())\n        Calculating in-degree frequency distribution...\n        array([ 0.1667, 0.3333, 0.5 ])\n\n        :rtype:  1d numpy array [k] of ints >= 0\n        :return: Entry [k] is the number of nodes having in-degree k.\n        \"\"\"\n        ki = self.indegree()\n        return self._histogram(values=ki, n_bins=ki.max())[0]\n\n    @Cached.method(name=\"the out-degree frequency distribution\")\n    def outdegree_distribution(self):\n        \"\"\"\n        Return the out-degree frequency distribution.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().outdegree_distribution())\n        Calculating out-degree frequency distribution...\n        array([ 0.1667, 0. , 0.3333, 0.5 ])\n\n        :rtype:  1d numpy array [k] of ints >= 0\n        :return: Entry [k] is the number of nodes having out-degree k.\n        \"\"\"\n        ko = self.outdegree()\n        return self._histogram(values=ko, n_bins=ko.max()+1)[0]\n\n    @Cached.method(name=\"the cumulative degree distribution\")\n    def degree_cdf(self):\n        \"\"\"\n        Return the cumulative degree frequency distribution.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().degree_cdf())\n        Calculating the cumulative degree distribution...\n        array([ 1. , 0.8333,  0.5 ])\n\n        :rtype:  1d numpy array [k] of ints >= 0\n        :return: Entry [k] is the number of nodes having degree k or more.\n        \"\"\"\n        k = self.degree()\n        return self._cum_histogram(values=k, n_bins=k.max())[0]\n\n    @Cached.method(name=\"the cumulative in-degree distribution\")\n    def indegree_cdf(self):\n        \"\"\"\n        Return the cumulative in-degree frequency distribution.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().indegree_cdf())\n        Calculating the cumulative in-degree distribution...\n        array([ 1. , 0.8333, 0.8333, 0.5 ])\n\n        :rtype:  1d numpy array [k] of ints >= 0\n        :return: Entry [k] is the number of nodes having in-degree k or more.\n        \"\"\"\n        ki = self.indegree()\n        return self._cum_histogram(values=ki, n_bins=ki.max() + 1)[0]\n\n    @Cached.method(name=\"the cumulative out-degree distribution\")\n    def outdegree_cdf(self):\n        \"\"\"\n        Return the cumulative out-degree frequency distribution.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().outdegree_cdf())\n        Calculating the cumulative out-degree distribution...\n        array([ 1. , 0.8333, 0.8333, 0.5 ])\n\n        :rtype:  1d numpy array [k] of ints >= 0\n        :return: Entry [k] is the number of nodes having out-degree k or more.\n        \"\"\"\n        ko = self.outdegree()\n        return self._cum_histogram(values=ko, n_bins=ko.max() + 1)[0]\n\n    @Cached.method(name=\"a n.s.i. degree frequency histogram\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_degree_histogram(self, typical_weight=None):\n        \"\"\"\n        Return a frequency (!) histogram of n.s.i. degree.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().nsi_degree_histogram())\n        Calculating a n.s.i. degree frequency histogram...\n        Calculating n.s.i. degree...\n        (array([ 0.3333, 0.1667, 0.5 ]), array([ 0.1179, 0.1667, 0.0962]),\n         array([ 4. , 5.4667, 6.9333]))\n\n        :type typical_weight: float > 0\n        :arg  typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n\n        :rtype:  tuple (list,list)\n        :return: List of frequencies and list of lower bin bounds.\n        \"\"\"\n        nsi_k = self.nsi_degree(typical_weight=typical_weight)\n        return self._histogram(values=nsi_k,\n                               n_bins=int(nsi_k.max()/nsi_k.min()) + 1)\n\n    @Cached.method(name=\"a cumulative n.s.i. degree frequency histogram\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_degree_cumulative_histogram(self, typical_weight=None):\n        \"\"\"\n        Return a cumulative frequency (!) histogram of n.s.i. degree.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().nsi_degree_cumulative_histogram())\n        Calculating a cumulative n.s.i. degree frequency histogram...\n        Calculating n.s.i. degree...\n        (array([ 1. , 0.6667, 0.5 ]), array([ 4. , 5.4667, 6.9333]))\n\n        :type typical_weight: float > 0\n        :arg  typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n\n        :rtype:  tuple (list,list)\n        :return: List of cumulative frequencies and list of lower bin bounds.\n        \"\"\"\n        nsi_k = self.nsi_degree(typical_weight=typical_weight)\n        return self._cum_histogram(values=nsi_k,\n                                   n_bins=int(nsi_k.max()/nsi_k.min()) + 1)\n\n    @Cached.method(name=\"average neighbours' degrees\")\n    def average_neighbors_degree(self):\n        \"\"\"\n        For each node, return the average degree of its neighbors.\n\n        (Does not use directionality information.)\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().average_neighbors_degree())\n        Calculating average neighbours' degrees...\n        array([ 2. ,  2.3333,  3. , 3. ,  2.6667,  3. ])\n\n        :rtype: 1d numpy array [node] of floats >= 0\n        \"\"\"\n        k = self.degree() * 1.0\n        return self.undirected_adjacency() * k / k[k != 0]\n\n    @Cached.method(name=\"maximum neighbours' degrees\")\n    def max_neighbors_degree(self):\n        \"\"\"\n        For each node, return the maximal degree of its neighbors.\n\n        (Does not use directionality information.)\n\n        **Example:**\n\n        >>> Network.SmallTestNetwork().max_neighbors_degree()\n        Calculating maximum neighbours' degree...\n        array([3, 3, 3, 3, 3, 3])\n\n        :rtype: 1d numpy array [node] of ints >= 0\n        \"\"\"\n        nbks = self.undirected_adjacency().multiply(self.degree())\n        return nbks.toarray().max(axis=1).T\n\n    @Cached.method(name=\"n.s.i. average neighbours' degrees\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_average_neighbors_degree(self):\n        \"\"\"\n        For each node, return the average n.s.i. degree of its neighbors.\n\n        (not yet implemented for directed networks.)\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_average_neighbors_degree())\n        Calculating n.s.i. average neighbours' degree...\n        Calculating n.s.i. degree...\n        array([ 6.0417, 6.62 , 7.0898, 7.0434, 7.3554, 5.65 ])\n        >>> r(net.splitted_copy().nsi_average_neighbors_degree())\n        Calculating n.s.i. average neighbours' degree...\n        Calculating n.s.i. degree...\n        array([ 6.0417, 6.62 , 7.0898, 7.0434, 7.3554, 5.65 , 5.65 ])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.average_neighbors_degree())\n        Calculating average neighbours' degrees...\n        array([ 2. , 2.3333, 3. , 3. , 2.6667, 3. ])\n        >>> r(net.splitted_copy().average_neighbors_degree())\n        Calculating average neighbours' degrees...\n        array([ 2.25 , 2.3333, 3. , 3.5 , 3. , 3. , 3. ])\n\n        :rtype: 1d numpy array [node] of floats >= 0\n        \"\"\"\n        if self.directed:\n            raise NotImplementedError(\"Not implemented for directed networks.\")\n\n        # A+ * (Dw * k) is faster than (A+ * Dw) * k\n        nsi_k = self.nsi_degree()\n        return self.sp_Aplus() * (self.sp_diag_w() * nsi_k) / nsi_k\n        # TODO: enable correction by typical_weight\n\n    @Cached.method(name=\"n.s.i. maximum neighbours' degrees\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_max_neighbors_degree(self):\n        \"\"\"\n        For each node, return the maximal n.s.i. degree of its neighbors.\n\n        (not yet implemented for directed networks.)\n\n        **Example:**\n\n        >>> Network.SmallTestNetwork().nsi_max_neighbors_degree()\n        Calculating n.s.i. maximum neighbour degree...\n        Calculating n.s.i. degree...\n        array([ 8.4,  8. ,  8. ,  8.4,  8.4,  8.4])\n\n        as compared to the unweighted version:\n\n        >>> print(Network.SmallTestNetwork().max_neighbors_degree())\n        Calculating maximum neighbours' degree...\n        [3 3 3 3 3 3]\n\n        :rtype: 1d numpy array [node] of floats >= 0\n        \"\"\"\n        if self.directed:\n            raise NotImplementedError(\"Not implemented for directed networks.\")\n\n        self.nsi_degree()\n        # matrix with the degrees of nodes' neighbours as rows\n        return (\n            self.sp_Aplus() * self.sp_nsi_diag_k()).toarray().max(axis=1).T\n        # TODO: enable correction by typical_weight\n\n    #\n    #   Measures of clustering, transitivity and cliquishness\n    #\n\n    @Cached.method(name=\"local clustering coefficients\")\n    def local_clustering(self):\n        \"\"\"\n        For each node, return its (Watts-Strogatz) clustering coefficient.\n\n        This is the proportion of all pairs of its neighbors which are\n        themselves interlinked.\n\n        (Uses directionality information, if available)\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().local_clustering())\n        Calculating local clustering coefficients...\n        array([ 0. , 0.3333, 1. , 0. , 0.3333, 0. ])\n\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        C = np.array(self.graph.transitivity_local_undirected())\n        C[np.isnan(C)] = 0\n        return C\n\n    @Cached.method(name=\"the global clustering coefficient (C_2)\")\n    def global_clustering(self):\n        \"\"\"\n        Return the global (Watts-Strogatz) clustering coefficient.\n\n        This is the mean of the local clustering coefficients. [Newman2003]_\n        refers to this measure as C_2.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().global_clustering())\n        Calculating global clustering coefficient (C_2)...\n        Calculating local clustering coefficients...\n        0.2778\n\n        :rtype: float between 0 and 1\n        \"\"\"\n        return self.local_clustering().mean()\n\n    # pylint: disable=too-many-positional-arguments\n    def _motif_clustering_helper(self, t_func, T, link_attribute=None, nsi=False,\n                                 typical_weight=None, ksum=None):\n        \"\"\"\n        Helper function to compute the local motif clustering coefficients.\n        For each node, returns a specific clustering coefficient, depending\n        on the input arguments.\n\n        :arg function t_func: multiplication of adjacency-type matrices\n        :arg 1d numpy array [node]: denominator made out of (in/out/bil)degrees\n        :arg str link_attribute: link attribute (optional)\n        :arg bool nsi: flag for nsi calculation (default: False)\n        :type typical_weight: float > 0\n        :arg float typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        if nsi:\n            nodew = sp.csc_matrix(np.eye(self.N) * self.node_weights)\n        if link_attribute is None:\n            # pylint: disable=possibly-used-before-assignment\n            A = self.sp_Aplus() * nodew if nsi else self.sp_A\n            AT = self.sp_Aplus().T * nodew if nsi else A.T\n        else:\n            M = sp.csc_matrix(self.link_attribute(link_attribute)**(1/3.))\n            A = M * nodew if nsi else M\n            AT = M.T * nodew if nsi else M.T\n\n        t = t_func(A, AT).diagonal()\n        T = T.astype(float)\n        T[T == 0] = np.nan\n        if typical_weight is None:\n            C = t / (self.node_weights * T) if nsi else t / T\n            C[np.isnan(C)] = 0\n            return C\n        else:\n            bilk = self.nsi_bildegree(typical_weight=typical_weight)\n            numerator = t / self.node_weights\n            return ((numerator/typical_weight**2 - 3.0*bilk - 1.0)\n                    / (T - ksum/typical_weight - bilk + 2))\n\n    @Cached.method(name=\"the local cycle motif clustering coefficients\")\n    def local_cyclemotif_clustering(self, link_attribute=None):\n        \"\"\"\n        For each node, return the clustering coefficient with respect to the\n        cycle motif.\n\n        If a link attribute is specified, return the associated link\n        weighted version.\n\n        **Example:**\n\n        >>> r(Network.SmallDirectedTestNetwork().local_cyclemotif_clustering())\n        Calculating local cycle motif clustering coefficient...\n        array([ 0.25,  0.25,  0.  ,  0.  ,  0.5 ,  0.  ])\n\n        :arg str link_attribute: link attribute (optional)\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        def t_func(x, xT):  # pylint: disable=unused-argument\n            return x * x * x\n        T = self.indegree() * self.outdegree() - self.bildegree()\n        return self._motif_clustering_helper(t_func, T, link_attribute=link_attribute)\n\n    @Cached.method(name=\"the local mid. motif clustering coefficients\")\n    def local_midmotif_clustering(self, link_attribute=None):\n        \"\"\"\n        For each node, return the clustering coefficient with respect to the\n        mid. motif.\n\n        If a link attribute is specified, return the associated link\n        weighted version.\n\n        **Example:**\n\n        >>> r(Network.SmallDirectedTestNetwork().local_midmotif_clustering())\n        Calculating local mid. motif clustering coefficient...\n        array([ 0. ,  0. ,  0. ,  1. ,  0.5,  0. ])\n\n        :arg str link_attribute: link attribute (optional)\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        def t_func(x, xT):\n            return x * xT * x\n        T = self.indegree() * self.outdegree() - self.bildegree()\n        return self._motif_clustering_helper(t_func, T, link_attribute=link_attribute)\n\n    @Cached.method(name=\"the local in motif clustering coefficients\")\n    def local_inmotif_clustering(self, link_attribute=None):\n        \"\"\"\n        For each node, return the clustering coefficient with respect to the\n        in motif.\n\n        If a link attribute is specified, return the associated link\n        weighted version.\n\n        **Example:**\n\n        >>> r(Network.SmallDirectedTestNetwork().local_inmotif_clustering())\n        Calculating local in motif clustering coefficient...\n        array([ 0. ,  0.5,  0.5,  0. ,  0. ,  0. ])\n\n        :arg str link_attribute: link attribute (optional)\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        def t_func(x, xT):\n            return xT * x * x\n        T = self.indegree() * (self.indegree() - 1)\n        return self._motif_clustering_helper(t_func, T, link_attribute=link_attribute)\n\n    @Cached.method(name=\"the local out motif clustering coefficients\")\n    def local_outmotif_clustering(self, link_attribute=None):\n        \"\"\"\n        For each node, return the clustering coefficient with respect to the\n        out motif.\n\n        If a link attribute is specified, return the associated link\n        weighted version.\n\n        **Example:**\n\n        >>> r(Network.SmallDirectedTestNetwork().local_outmotif_clustering())\n        Calculating local out motif clustering coefficient...\n        array([ 0.5,  0.5,  0. ,  0. ,  0. ,  0. ])\n\n        :arg str link_attribute: link attribute (optional)\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        def t_func(x, xT):\n            return x * x * xT\n        T = self.outdegree() * (self.outdegree() - 1)\n        return self._motif_clustering_helper(t_func, T, link_attribute=link_attribute)\n\n    @Cached.method(name=\"the local n.s.i. cycle motif clustering coefficients\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_local_cyclemotif_clustering(self, link_attribute=None, typical_weight=None):\n        \"\"\"\n        For each node, return the nsi clustering coefficient with respect to\n        the cycle motif.\n\n        If a link attribute is specified, return the associated link\n        weighted version.\n\n        Reference: [Zemp2014]_\n\n        **Examples:**\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> r(net.nsi_local_cyclemotif_clustering())\n        Calculating local nsi cycle motif clustering coefficient...\n        array([ 0.1845,  0.2028,  0.322 ,  0.3224,  0.3439,  0.625 ])\n        >>> r(net.splitted_copy(node=1).nsi_local_cyclemotif_clustering())\n        Calculating local nsi cycle motif clustering coefficient...\n        array([ 0.1845,  0.2028,  0.322 ,  0.3224,  0.3439,  0.625 ,  0.2028])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> r(net.local_cyclemotif_clustering())\n        Calculating local cycle motif clustering coefficient...\n        array([ 0.25,  0.25,  0.  ,  0.  ,  0.5 ,  0.  ])\n        >>> r(net.splitted_copy(node=1).local_cyclemotif_clustering())\n        Calculating local cycle motif clustering coefficient...\n        array([ 0.3333,  0.125 ,  0.    ,  0.    ,  0.5   ,  0.    ,  0.125 ])\n\n        :arg str link_attribute: link attribute (optional)\n        :type typical_weight: float > 0\n        :arg float typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n        \"\"\"\n        def t_func(x, xT):  # pylint: disable=unused-argument\n            return x * x * x\n        ink = self.nsi_indegree(typical_weight=typical_weight)\n        outk = self.nsi_outdegree(typical_weight=typical_weight)\n        T = ink * outk\n        ksum = ink + outk\n        return self._motif_clustering_helper(\n            t_func, T, link_attribute=link_attribute, nsi=True,\n            typical_weight=typical_weight, ksum=ksum)\n\n    @Cached.method(name=\"the local n.s.i. mid. motif clustering coefficients\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_local_midmotif_clustering(self, link_attribute=None, typical_weight=None):\n        \"\"\"\n        For each node, return the nsi clustering coefficient with respect to\n        the mid motif.\n\n        If a link attribute is specified, return the associated link\n        weighted version.\n\n        Reference: [Zemp2014]_\n\n        **Examples:**\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> r(net.nsi_local_midmotif_clustering())\n        Calculating local nsi mid. motif clustering coefficient...\n        array([ 0.4537,  0.5165,  1.    ,  1.    ,  0.8882,  1.    ])\n        >>> r(net.splitted_copy(node=4).nsi_local_midmotif_clustering())\n        Calculating local nsi mid. motif clustering coefficient...\n        array([ 0.4537,  0.5165,  1.    ,  1.    ,  0.8882,  1.    ,  0.8882])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> r(net.local_midmotif_clustering())\n        Calculating local mid. motif clustering coefficient...\n        array([ 0. ,  0. ,  0. ,  1. ,  0.5,  0. ])\n        >>> r(net.splitted_copy(node=4).local_midmotif_clustering())\n        Calculating local mid. motif clustering coefficient...\n        array([ 0. ,  0. ,  0. ,  1. ,  0.8,  0. ,  0.8])\n\n        :arg str link_attribute: link attribute (optional)\n        :type typical_weight: float > 0\n        :arg float typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n        \"\"\"\n        def t_func(x, xT):\n            return x * xT * x\n        ink = self.nsi_indegree(typical_weight=typical_weight)\n        outk = self.nsi_outdegree(typical_weight=typical_weight)\n        T = ink * outk\n        ksum = ink + outk\n        return self._motif_clustering_helper(\n            t_func, T, link_attribute=link_attribute, nsi=True,\n            typical_weight=typical_weight, ksum=ksum)\n\n    @Cached.method(name=\"the local n.s.i. in motif clustering coefficients\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_local_inmotif_clustering(self, link_attribute=None, typical_weight=None):\n        \"\"\"\n        For each node, return the nsi clustering coefficient with respect to\n        the in motif.\n\n        If a link attribute is specified, return the associated link\n        weighted version.\n\n        Reference: [Zemp2014]_\n\n        **Examples:**\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> r(net.nsi_local_inmotif_clustering())\n        Calculating local nsi in motif clustering coefficient...\n        array([ 0.5288,  0.67  ,  0.6693,  0.7569,  0.7556,  1.    ])\n        >>> r(net.splitted_copy(node=1).nsi_local_inmotif_clustering())\n        Calculating local nsi in motif clustering coefficient...\n        array([ 0.5288,  0.67  ,  0.6693,  0.7569,  0.7556,  1.    ,  0.67  ])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> r(net.local_inmotif_clustering())\n        Calculating local in motif clustering coefficient...\n        array([ 0. ,  0.5,  0.5,  0. ,  0. ,  0. ])\n        >>> r(net.splitted_copy(node=1).local_inmotif_clustering())\n        Calculating local in motif clustering coefficient...\n        array([ 0.    ,  0.5   ,  0.6667,  0.    ,  1.    ,  0.    ,  0.5   ])\n\n\n        :arg str link_attribute: link attribute (optional)\n        :type typical_weight: float > 0\n        :arg float typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n        \"\"\"\n        def t_func(x, xT):\n            return xT * x * x\n        ink = self.nsi_indegree(typical_weight=typical_weight)\n        T = ink**2\n        ksum = ink * 2\n        return self._motif_clustering_helper(\n            t_func, T, link_attribute=link_attribute, nsi=True,\n            typical_weight=typical_weight, ksum=ksum)\n\n    @Cached.method(name=\"the local n.s.i. out motif clustering coefficients\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_local_outmotif_clustering(self, link_attribute=None, typical_weight=None):\n        \"\"\"\n        For each node, return the nsi clustering coefficient with respect to\n        the out motif.\n\n        If a link attribute is specified, return the associated link\n        weighted version.\n\n        Reference: [Zemp2014]_\n\n        **Examples:**\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> r(net.nsi_local_outmotif_clustering())\n        Calculating local nsi out motif clustering coefficient...\n        array([ 0.67  ,  0.6693,  1.    ,  0.7528,  0.5839,  0.7656])\n        >>> r(net.splitted_copy(node=0).nsi_local_outmotif_clustering())\n        Calculating local nsi out motif clustering coefficient...\n        array([ 0.67  ,  0.6693,  1.    ,  0.7528,  0.5839,  0.7656,  0.67  ])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallDirectedTestNetwork()\n        >>> r(net.local_outmotif_clustering())\n        Calculating local out motif clustering coefficient...\n        array([ 0.5,  0.5,  0. ,  0. ,  0. ,  0. ])\n        >>> r(net.splitted_copy(node=0).local_outmotif_clustering())\n        Calculating local out motif clustering coefficient...\n        array([ 0.5   ,  0.5   ,  0.    ,  0.    ,  0.3333,  1.    ,  0.5   ])\n\n        :arg str link_attribute: link attribute (optional)\n        :type typical_weight: float > 0\n        :arg float typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n        \"\"\"\n        def t_func(x, xT):\n            return x * x * xT\n        outk = self.nsi_outdegree(typical_weight=typical_weight)\n        T = outk**2\n        ksum = outk * 2\n        return self._motif_clustering_helper(\n            t_func, T, link_attribute=link_attribute, nsi=True,\n            typical_weight=typical_weight, ksum=ksum)\n\n    @Cached.method(name=\"transitivity coefficient (C_1)\")\n    def transitivity(self):\n        \"\"\"\n        Return the transitivity (coefficient).\n\n        This is the ratio of three times the number of triangles to the number\n        of connected triples of vertices. [Newman2003]_ refers to this measure\n        as C_1.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().transitivity())\n        Calculating transitivity coefficient (C_1)...\n        0.2727\n\n        :rtype: float between 0 and 1\n        \"\"\"\n        return self.graph.transitivity_undirected()\n\n    def higher_order_transitivity(self, order, estimate=False):\n        \"\"\"\n        Return transitivity of a certain order.\n\n        The transitivity of order n is defined as:\n         - (n x Number of cliques of n nodes) / (Number of stars of n nodes)\n\n        It is a generalization of the standard network transitivity, which is\n        included as a special case for n = 3.\n\n        :arg int order: The order (number of nodes) of cliques to be\n            considered.\n        :arg bool estimate: Toggles random sampling for estimating higher order\n            transitivity (much faster than exact calculation).\n        :rtype: number (float) between 0 and 1\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating transitivity of order\", order, \"...\")\n\n        if order in [0, 1, 2]:\n            raise NetworkError(\"Higher order transitivity is not defined for \\\n                               orders 0, 1 and 2.\")\n        if order == 3:\n            return self.transitivity()\n\n        if order == 4:\n            if estimate:\n                motif_counts = self.graph.motifs_randesu(\n                    size=4, cut_prob=[0.5, 0.5, 0.5, 0.5])\n            else:\n                motif_counts = self.graph.motifs_randesu(size=4)\n\n            #  Sum over all motifs that contain a star\n            n_stars = motif_counts[4] + motif_counts[7] + \\\n                2 * motif_counts[9] + 4 * motif_counts[10]\n            n_cliques = motif_counts[10]\n\n            # print(motif_counts)\n\n            if n_stars != 0:\n                return 4 * n_cliques / float(n_stars)\n            else:\n                return 0.\n\n        if order > 4:\n            raise NotImplementedError(\"Higher order transitivity is not yet \\\n                                      implemented for orders larger than 4.\")\n\n        raise ValueError(\"Order has to be a positive integer.\")\n\n    def local_cliquishness(self, order):\n        \"\"\"\n        Return local cliquishness of a certain order.\n\n        The local cliquishness measures the relative number of cliques (fully\n        connected subgraphs) of a certain order that a node participates in.\n\n        Local cliquishness is not defined for orders 1 and 2. For order 3,\n        it is equivalent to the local clustering coefficient\n        :meth:`local_clustering`, since cliques of order 3 are triangles.\n\n        Local cliquishness is always bounded by 0 and 1 and set to zero for\n        nodes with degree smaller than order - 1.\n\n        :type order: number (int)\n        :arg order: The order (number of nodes) of cliques to be considered.\n\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        if self.directed:\n            raise NetworkError(\"Not implemented yet...\")\n\n        if self.silence_level <= 1:\n            print(\"Calculating local cliquishness of order\", order, \"...\")\n\n        if order in [0, 1, 2]:\n            raise NetworkError(\"Local cliquishness is not defined for orders \\\n                               0, 1 and 2.\")\n\n        if order == 3:\n            return self.local_clustering()\n\n        if order == 4:\n            return _local_cliquishness_4thorder(\n                self.N, to_cy(self.adjacency, ADJ),\n                to_cy(self.degree(), DEGREE))\n        if order == 5:\n            return _local_cliquishness_5thorder(\n                self.N, to_cy(self.adjacency, ADJ),\n                to_cy(self.degree(), DEGREE))\n        if order > 5:\n            raise NotImplementedError(\"Local cliquishness is not yet \\\n                                      implemented for orders larger than 5.\")\n\n        raise ValueError(\"Order has to be a positive integer.\")\n\n    @staticmethod\n    def weighted_local_clustering(weighted_A):\n        \"\"\"\n        For each node, return its weighted clustering coefficient,\n        given a weighted adjacency matrix.\n\n        This follows [Holme2007]_.\n\n        **Example:**\n\n        >>> print(r(Network.weighted_local_clustering(weighted_A=[\n        ...     [ 0.  , 0.  , 0.  , 0.55, 0.65, 0.75],\n        ...     [ 0.  , 0.  , 0.63, 0.77, 0.91, 0.  ],\n        ...     [ 0.  , 0.63, 0.  , 0.  , 1.17, 0.  ],\n        ...     [ 0.55, 0.77, 0.  , 0.  , 0.  , 0.  ],\n        ...     [ 0.65, 0.91, 1.17, 0.  , 0.  , 0.  ],\n        ...     [ 0.75, 0.  , 0.  , 0.  , 0.  , 0.  ]])))\n        Calculating local weighted clustering coefficient...\n        [ 0.  0.2149  0.3539  0.  0.1538  0. ]\n\n        as compared to the unweighted version:\n\n        >>> print(r(Network.SmallTestNetwork().local_clustering()))\n        Calculating local clustering coefficients...\n        [ 0.  0.3333  1.  0.  0.3333  0. ]\n\n        :type weighted_A: square numpy array [node,node] of floats >= 0\n        :arg  weighted_A: Entry [i,j] is the link weight from i to j.\n                          A value of 0 means there is no link.\n\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        # TODO: must be symmetric? directed version?\n        print(\"Calculating local weighted clustering coefficient...\")\n\n        wA = np.array(weighted_A)\n        max_w = np.ones_like(wA).dot(wA.max())\n        return (np.linalg.matrix_power(wA, 3).diagonal()\n                / (wA.dot(max_w).dot(wA)).diagonal())\n\n    def nsi_twinness(self):\n        \"\"\"\n        For each pair of nodes, return an n.s.i. measure of 'twinness'.\n\n        This varies from 0.0 for unlinked nodes to 1.0 for linked nodes having\n        exactly the same neighbors (called twins).\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> print(r(net.nsi_twinness()))\n        Calculating n.s.i. degree...\n        [[ 1.      0.      0.      0.4286  0.4524  0.4762]\n         [ 0.      1.      0.7375  0.475   0.7375  0.    ]\n         [ 0.      0.7375  1.      0.      0.7973  0.    ]\n         [ 0.4286  0.475   0.      1.      0.      0.    ]\n         [ 0.4524  0.7375  0.7973  0.      1.      0.    ]\n         [ 0.4762  0.      0.      0.      0.      1.    ]]\n        >>> print(r(net.splitted_copy().nsi_twinness()))\n        Calculating n.s.i. degree...\n        [[ 1.      0.      0.      0.4286  0.4524  0.4762  0.4762]\n         [ 0.      1.      0.7375  0.475   0.7375  0.      0.    ]\n         [ 0.      0.7375  1.      0.      0.7973  0.      0.    ]\n         [ 0.4286  0.475   0.      1.      0.      0.      0.    ]\n         [ 0.4524  0.7375  0.7973  0.      1.      0.      0.    ]\n         [ 0.4762  0.      0.      0.      0.      1.      1.    ]\n         [ 0.4762  0.      0.      0.      0.      1.      1.    ]]\n\n        :rtype: square array [node,node] of floats between 0 and 1\n        \"\"\"\n        # TODO: implement other versions as weĺl\n        N, k, Ap = self.N, self.nsi_degree(), self.sp_Aplus()\n        commons = Ap * self.sp_diag_w() * Ap\n        kk = np.repeat([k], N, axis=0)\n        return Ap.toarray() * commons.toarray() / np.maximum(kk, kk.T)\n\n    #\n    #  Measure Assortativity coefficient\n    #\n\n    def assortativity(self):\n        \"\"\"\n        Return the assortativity coefficient.\n\n        This follows [Newman2002]_.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().assortativity())\n        -0.4737\n\n        :rtype: float\n        \"\"\"\n        degree = self.graph.degree()\n        degree_sq = [deg**2 for deg in degree]\n\n        m = float(self.graph.ecount())\n        num1, num2, den1 = 0, 0, 0\n\n        for source, target in self.graph.get_edgelist():\n            num1 += degree[source] * degree[target]\n            num2 += degree[source] + degree[target]\n            den1 += degree_sq[source] + degree_sq[target]\n\n        num1 /= m\n        den1 /= 2*m\n        num2 = (num2 / (2 * m)) ** 2\n        return (num1 - num2) / (den1 - num2)\n\n    @Cached.method(name=\"n.s.i. local clustering\", attrs=(\"_mut_nw\",))\n    def nsi_local_clustering(self, typical_weight=None):\n        \"\"\"\n        For each node, return its uncorrected (between 0 and 1) or corrected\n        (at most 1 / negative / NaN) n.s.i. clustering coefficient.\n\n        (not yet implemented for directed networks)\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_local_clustering())\n        Calculating n.s.i. degree...\n        array([ 0.5513, 0.7244, 1. , 0.8184, 0.8028, 1. ])\n        >>> r(net.splitted_copy().nsi_local_clustering())\n        Calculating n.s.i. degree...\n        array([ 0.5513, 0.7244, 1. , 0.8184, 0.8028, 1. , 1. ])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.local_clustering())\n        Calculating local clustering coefficients...\n        array([ 0. , 0.3333, 1. , 0. , 0.3333, 0. ])\n        >>> r(net.splitted_copy().local_clustering())\n        Calculating local clustering coefficients...\n        array([ 0.1667, 0.3333, 1. ,  0. , 0.3333, 1. , 1. ])\n\n        :type typical_weight: float > 0\n        :arg  typical_weight: Optional typical node weight to be used for\n            correction. If None, the uncorrected measure is\n            returned. (Default: None)\n\n        :rtype: array([float])\n        \"\"\"\n        if self.directed:\n            raise NotImplementedError(\"Not implemented for directed networks.\")\n\n        k = self.nsi_degree(typical_weight=typical_weight)\n\n        if typical_weight is None:\n            if self.silence_level <= 1:\n                print(\"Calculating uncorrected n.s.i. \"\n                      \"local clustering coefficients...\")\n            w = self.node_weights\n            A_Dw = self.sp_A * self.sp_diag_w()\n            numerator = (A_Dw * self.sp_Aplus() * A_Dw.T).diagonal()\n            return (numerator + 2*k*w - w**2) / k**2\n        else:\n            if self.silence_level <= 1:\n                print(\"Calculating corrected n.s.i. \"\n                      \"local clustering coefficients...\")\n            Ap = self.sp_Aplus()\n            Ap_Dw = Ap * self.sp_diag_w()\n            numerator = (Ap_Dw * Ap_Dw * Ap).diagonal()\n            return (numerator/typical_weight**2 - 3.0*k - 1.0) / (k * (k-1.0))\n\n    @Cached.method(name=\"the n.s.i. global topological clustering coefficient\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_global_clustering(self):\n        \"\"\"\n        Return the n.s.i. global clustering coefficient.\n\n        (not yet implemented for directed networks.)\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().nsi_global_clustering())\n        Calculating n.s.i. global topological clustering coefficient...\n        Calculating n.s.i. degree...\n        0.8353\n\n        as compared to the unweighted version:\n\n        >>> r(Network.SmallTestNetwork().global_clustering())\n        Calculating global clustering coefficient (C_2)...\n        Calculating local clustering coefficients...\n        0.2778\n\n        :rtype: float between 0 and 1\n        \"\"\"\n        if self.directed:\n            raise NotImplementedError(\"Not implemented for directed networks.\")\n\n        return (self.nsi_local_clustering().dot(self.node_weights)\n                / self.total_node_weight)\n\n    @Cached.method(name=\"n.s.i. transitivity\", attrs=(\"_mut_nw\",))\n    def nsi_transitivity(self):\n        \"\"\"\n        Return the n.s.i. transitivity.\n\n        .. warning::\n           Not yet implemented!\n\n        :rtype: float between 0 and 1\n        \"\"\"\n        if self.directed:\n            raise NotImplementedError(\"Not implemented for directed networks.\")\n\n        A = self.sp_Aplus()\n        A_Dw = A * self.sp_diag_w()\n        num = (A_Dw * A_Dw * A_Dw).diagonal().sum()\n        denum = (self.sp_diag_w() * A_Dw * A_Dw).sum()\n\n        return num / denum\n\n    @Cached.method(name=\"the n.s.i. local Soffer clustering coefficients\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_local_soffer_clustering(self):\n        \"\"\"\n        For each node, return its n.s.i. clustering coefficient\n        with bias-reduction following [Soffer2005]_.\n\n        (not yet implemented for directed networks.)\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_local_soffer_clustering())\n        Calculating n.s.i. local Soffer clustering coefficients...\n        Calculating n.s.i. degree...\n        array([ 0.7665, 0.8754, 1. , 0.8184, 0.8469, 1. ])\n        >>> r(net.splitted_copy().nsi_local_soffer_clustering())\n        Calculating n.s.i. local Soffer clustering coefficients...\n        Calculating n.s.i. degree...\n        array([ 0.7665, 0.8754, 1. , 0.8184, 0.8469, 1. , 1. ])\n\n        as compared to the version without bias-reduction:\n\n        >>> r(Network.SmallTestNetwork().nsi_local_clustering())\n        Calculating n.s.i. degree...\n        array([ 0.5513, 0.7244, 1. , 0.8184, 0.8028, 1. ])\n\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        if self.directed:\n            raise NotImplementedError(\"Not implemented for directed networks.\")\n\n        # numerator is determined as above\n        Ap = self.sp_Aplus()\n        Ap_Dw = Ap * self.sp_diag_w()\n        numerator = (Ap_Dw * Ap_Dw * Ap).diagonal()\n\n        # denominator depends on degrees of neighbours\n        N, k = self.N, self.nsi_degree()\n        mink = np.array([[min(k[i], k[j]) for j in range(N)]\n                         for i in range(N)])\n        denominator = (mink * (self.sp_diag_w() * Ap)).diagonal()\n        return numerator / denominator\n\n    #\n    #  Measure path lengths\n    #\n\n    @Cached.method(name=\"path lengths\")\n    def path_lengths(self, link_attribute=None):\n        \"\"\"\n        For each pair of nodes i,j, return the (weighted) shortest path length\n        from i to j (also called the distance from i to j).\n\n        This is the shortest length of a path from i to j along links,\n        or infinity if there is no such path.\n\n        The length of links can be specified by an optional link attribute.\n\n        **Example:**\n\n        >>> print(Network.SmallTestNetwork().path_lengths())\n        Calculating all shortest path lengths...\n        [[ 0.  2.  2.  1.  1.  1.]\n         [ 2.  0.  1.  1.  1.  3.]\n         [ 2.  1.  0.  2.  1.  3.]\n         [ 1.  1.  2.  0.  2.  2.]\n         [ 1.  1.  1.  2.  0.  2.]\n         [ 1.  3.  3.  2.  2.  0.]]\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: square array [[float]]\n        \"\"\"\n        if link_attribute == \"topological\":\n            print(\"WARNING: link_attribute='topological' is deprecated.\\n\"\n                  + \"Use link_attribute=None instead.\")\n            link_attribute = None\n\n        if link_attribute is None:\n            if self.silence_level <= 1:\n                print(\"Calculating all shortest path lengths...\")\n\n            # fixed negative numbers to infinity!\n            pl = np.array(self.graph.distances(), dtype=float)\n            pl[pl < 0] = np.inf\n            return pl\n        else:\n            if self.silence_level <= 1:\n                print(\"Calculating weighted shortest path lengths...\")\n\n            return np.array(\n                self.graph.distances(weights=link_attribute, mode=1))\n\n    def average_path_length(self, link_attribute=None):\n        \"\"\"\n        Return the average (weighted) shortest path length between all pairs\n        of nodes for which a path exists.\n\n        **Example:**\n\n        >>> print(r(Network.SmallTestNetwork().average_path_length()))\n        Calculating average (weighted) shortest path length...\n        1.6667\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: float\n        \"\"\"\n        if link_attribute == \"topological\":\n            print(\"WARNING: link_attribute='topological' is deprecated.\\n\"\n                  + \"Use link_attribute=None instead.\")\n            link_attribute = None\n\n        if self.silence_level <= 1:\n            print(\"Calculating average (weighted) shortest path length...\")\n\n        if link_attribute is None:\n            return self.graph.average_path_length()\n        else:\n            path_lengths = self.path_lengths(link_attribute)\n\n            #  Identify unconnected pairs and save in binary array isinf\n            unconnected_pairs = np.isinf(path_lengths)\n            #  Count the number of unconnected pairs\n            n_unconnected_pairs = unconnected_pairs.sum()\n            #  Set infinite entries corresponding to unconnected pairs to zero\n            path_lengths[unconnected_pairs] = 0\n\n            #  Take average of shortest geographical path length matrix\n            #  excluding the diagonal, since it is always zero, and all\n            #  unconnected pairs.  The diagonal should never contain\n            #  infinities, so that should not be a problem.\n            average_path_length = (path_lengths.sum() / float(\n                self.N * (self.N - 1) - n_unconnected_pairs))\n\n            #  Reverse changes to path_lengths\n            path_lengths[unconnected_pairs] = np.inf\n\n            return average_path_length\n\n    @Cached.method(name=\"the n.s.i. average shortest path length\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_average_path_length(self):\n        \"\"\"\n        Return the n.s.i. average shortest path length between all pairs of\n        nodes for which a path exists.\n\n        The path length from a node to itself is considered to be 1 to achieve\n        node splitting invariance.\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_average_path_length())\n        Calculating n.s.i. average shortest path length...\n        Calculating all shortest path lengths...\n        1.6003\n        >>> r(net.splitted_copy().nsi_average_path_length())\n        Calculating n.s.i. average shortest path length...\n        Calculating all shortest path lengths...\n        1.6003\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.average_path_length())\n        Calculating average (weighted) shortest path length...\n        1.6667\n        >>> r(net.splitted_copy().average_path_length())\n        Calculating average (weighted) shortest path length...\n        1.7619\n\n        :rtype: float\n        \"\"\"\n        w = self.node_weights\n        # set diagonal to 1 (nodes get unit distance to themselves)\n        nsi_distances = self.path_lengths() + np.identity(self.N)\n        weight_products = np.outer(w, w)\n\n        #  Set infinite entries corresponding to unconnected pairs to zero\n        unconnected_pairs = np.isinf(nsi_distances)\n        nsi_distances[unconnected_pairs] = 0\n        weight_products[unconnected_pairs] = 0\n\n        # nsi_distances is not sparse, so we use matrix product\n        return w.dot(nsi_distances.dot(w)) / weight_products.sum()\n\n    def diameter(self, directed=True, only_connected=True):\n        \"\"\"\n        Return the diameter (largest shortest path length between any nodes).\n\n        **Example:**\n\n        >>> print(Network.SmallTestNetwork().diameter())\n        3\n\n        :arg bool directed: Indicates whether to respect link directions if the\n            network is directed. (Default: True)\n        :arg bool only_connected: Indicates whether to use only pairs of nodes\n            with a connecting path. If False and the network is unconnected,\n            the number of all nodes is returned.  (Default: True)\n        :rtype: int >= 0\n        \"\"\"\n        return self.graph.diameter(directed=directed, unconn=only_connected)\n\n    #\n    #  Link valued measures\n    #\n\n    @Cached.method(name=\"matching index matrix\")\n    def matching_index(self):\n        \"\"\"\n        For each pair of nodes, return their matching index.\n\n        This is the ratio of the number of common neighbors and the number of\n        nodes linked to at least one of the two nodes.\n\n        **Example:**\n\n        >>> print(r(Network.SmallTestNetwork().matching_index()))\n        Calculating matching index matrix...\n        [[ 1.    0.5   0.25    0.      0.      0.    ]\n         [ 0.5   1.    0.25    0.      0.2     0.    ]\n         [ 0.25  0.25  1.      0.3333  0.25    0.    ]\n         [ 0.    0.    0.3333  1.      0.6667  0.5   ]\n         [ 0.    0.2   0.25    0.6667  1.      0.3333]\n         [ 0.    0.    0.      0.5     0.3333  1.    ]]\n\n        :rtype: array([[0<=float<=1,0<=float<=1]])\n        \"\"\"\n        commons = (self.sp_A * self.sp_A).astype(DFIELD).toarray()\n        kk = np.repeat([self.degree()], self.N, axis=0)\n        return commons / (kk + kk.T - commons)\n\n    @Cached.method(name=\"link betweenness\")\n    def link_betweenness(self):\n        \"\"\"\n        For each link, return its betweenness.\n\n        This measures on how likely the link is on a randomly chosen shortest\n        path in the network.\n\n        (Does not respect directionality of links.)\n\n        **Example:**\n\n        >>> print(Network.SmallTestNetwork().link_betweenness())\n        Calculating link betweenness...\n        [[ 0.   0.   0.   3.5  5.5  5. ] [ 0.   0.   2.   3.5  2.5  0. ]\n         [ 0.   2.   0.   0.   3.   0. ] [ 3.5  3.5  0.   0.   0.   0. ]\n         [ 5.5  2.5  3.   0.   0.   0. ] [ 5.   0.   0.   0.   0.   0. ]]\n\n        :rtype:  square numpy array [node,node] of floats\n        :return: Entry [i,j] is the betweenness of the link between i and j,\n                 or 0 if i is not linked to j.\n        \"\"\"\n        #  Calculate link betweenness\n        link_betweenness = self.graph.edge_betweenness()\n\n        #  Initialize\n        result, ecount = np.zeros((self.N, self.N)), 0\n\n        #  Get graph adjacency list\n        A_list = self.graph.get_adjlist()\n\n        #  Write link betweenness values to matrix\n        for i, Ai in enumerate(A_list):\n            for j in Ai:\n                #  Only visit links once\n                if i < j:\n                    result[i, j] = result[j, i] = link_betweenness[ecount]\n                    ecount += 1\n        return result\n\n    def edge_betweenness(self):\n        \"\"\"\n        For each link, return its betweenness.\n\n        Alias to :meth:`link_betweenness`. This measures on how likely the\n        link is on a randomly chosen shortest path in the network.\n\n        (Does not respect directionality of links.)\n\n        **Example:**\n\n        >>> print(Network.SmallTestNetwork().edge_betweenness())\n        Calculating link betweenness...\n        [[ 0.   0.   0.   3.5  5.5  5. ] [ 0.   0.   2.   3.5  2.5  0. ]\n         [ 0.   2.   0.   0.   3.   0. ] [ 3.5  3.5  0.   0.   0.   0. ]\n         [ 5.5  2.5  3.   0.   0.   0. ] [ 5.   0.   0.   0.   0.   0. ]]\n\n        :rtype:  square numpy array [node,node] of floats\n        :return: Entry [i,j] is the betweenness of the link between i and j,\n                 or 0 if i is not linked to j.\n        \"\"\"\n        return self.link_betweenness()\n\n    #\n    #  Node valued centrality measures\n    #\n\n    @Cached.method(name=\"node betweenness\", attrs=(\"_mut_la\",))\n    def betweenness(self, link_attribute=None):\n        \"\"\"\n        For each node, return its (weighted) betweenness.\n\n        This measures roughly how many shortest paths pass through the node.\n\n        **Example:**\n\n        >>> Network.SmallTestNetwork().betweenness()\n        Calculating node betweenness...\n        array([ 4.5,  1.5,  0. ,  1. ,  3. ,  0. ])\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 1d numpy array [node] of floats >= 0\n        \"\"\"\n        #  Return the absolute value of normed tbc, since a bug sometimes\n        #  results in negative signs\n        #  The measure is normed by the maximum betweenness centrality achieved\n        #  only by the star (Freeman 1978): (n**2-3*n+2)/2\n        #  This restricts TBC to 0 <= TBC <= 1\n        # maxTBC =  ( self.N**2 - 3 * self.N + 2 ) / 2\n\n        return np.abs(np.array(self.graph.betweenness(weights=link_attribute)))\n\n    def interregional_betweenness(self, sources=None, targets=None):\n        \"\"\"\n        For each node, return its interregional betweenness for given sets\n        of source and target nodes.\n\n        This measures roughly how many shortest paths from one of the sources\n        to one of the targets pass through the node.\n\n        **Examples:**\n\n        >>> Network.SmallTestNetwork().interregional_betweenness(\n        ...     sources=[2], targets=[3,5])\n        Calculating interregional betweenness...\n        array([ 1.,  1.,  0.,  0.,  1.,  0.])\n        >>> Network.SmallTestNetwork().interregional_betweenness(\n        ...     sources=range(0,6), targets=range(0,6))\n        Calculating interregional betweenness...\n        array([ 9.,  3.,  0.,  2.,  6.,  0.])\n\n        as compared to\n\n        >>> Network.SmallTestNetwork().betweenness()\n        Calculating node betweenness...\n        array([ 4.5,  1.5,  0. ,  1. ,  3. ,  0. ])\n\n        :type sources: 1d numpy array or list of ints from 0 to n_nodes-1\n        :arg  sources: Set of source node indices.\n\n        :type targets: 1d numpy array or list of ints from 0 to n_nodes-1\n        :arg  targets: Set of target node indices.\n\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        return self.nsi_betweenness(sources=sources, targets=targets,\n                                    nsi=False)\n\n    def nsi_interregional_betweenness(self, sources, targets):\n        \"\"\"\n        For each node, return its n.s.i. interregional betweenness for given\n        sets of source and target nodes.\n\n        This measures roughly how many shortest paths from one of the sources\n        to one of the targets pass through the node, taking node weights into\n        account.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().nsi_interregional_betweenness(\n        ...     sources=[2], targets=[3,5]))\n        Calculating n.s.i. interregional betweenness...\n        array([ 3.1667, 2.3471, 0. , 0. , 2.0652, 0. ])\n\n        as compared to the unweighted version:\n\n        >>> Network.SmallTestNetwork().interregional_betweenness(\n        ...     sources=[2], targets=[3,5])\n        Calculating interregional betweenness...\n        array([ 1.,  1.,  0.,  0.,  1.,  0.])\n\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        return self.nsi_betweenness(sources=sources, targets=targets)\n\n    def nsi_betweenness(self, sources=None, targets=None,\n                        nsi: bool = True, parallelize: bool = False):\n        \"\"\"\n        For each node, return its n.s.i. betweenness. [Newman2001]_\n\n        This measures roughly how many shortest paths pass through the node,\n        taking node weights into account.\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_betweenness())\n        Calculating n.s.i. betweenness...\n        array([ 29.6854, 7.7129, 0. , 3.0909, 9.6996, 0. ])\n        >>> r(net.splitted_copy().nsi_betweenness())\n        Calculating n.s.i. betweenness...\n        array([ 29.6854, 7.7129, 0. , 3.0909, 9.6996, 0. , 0. ])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallTestNetwork()\n        >>> net.betweenness()\n        Calculating node betweenness...\n        array([ 4.5,  1.5,  0. ,  1. ,  3. ,  0. ])\n        >>> net.splitted_copy().betweenness()\n        Calculating node betweenness...\n        array([ 8.5,  1.5,  0. ,  1.5,  4.5,  0. ,  0. ])\n\n        :arg bool parallelize: Toggle multiprocessing\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        # initialize node lists\n        is_source = np.zeros(self.N, dtype=MASK)\n        if sources is not None:\n            is_source[sources] = 1\n        else:\n            is_source[range(0, self.N)] = 1\n        if targets is not None:\n            targets = np.array(list(map(int, targets)))\n        else:\n            targets = np.arange(0, self.N)\n\n        # call cached worker method with hashable arguments\n        return self._nsi_betweenness(\n            tuple(is_source), tuple(targets), nsi, parallelize)\n\n    @Cached.method(name=\"n.s.i. betweenness\", attrs=(\"_mut_nw\",))\n    def _nsi_betweenness(self, is_source: Tuple[MASK], targets: Tuple[NODE],\n                         nsi: bool, parallelize: bool):\n        # type cast inputs\n        assert all(isinstance(arg, tuple) for arg in [is_source, targets])\n        is_source = np.array(is_source, dtype=MASK)\n        targets = np.array(targets, dtype=NODE)\n        k_in = to_cy(self.indegree(), DEGREE)\n        k_out = to_cy(self.outdegree(), DEGREE) if self.directed else k_in\n\n        # initialize node weights\n        w = to_cy(self.node_weights, DWEIGHT)\n        w = w if nsi else np.ones_like(w)\n\n        # list of INCOMING links (contains each link twice if undirected)\n        in_links = nz_coords(self.sp_A.T)\n\n        # incoming-link-neighbours of each node\n        flat_neighbors = to_cy(np.array(in_links)[:, 1], NODE)\n\n        # assert consistency of array lengths\n        E = self.n_links if self.directed else 2*self.n_links\n        assert k_in.sum() == len(flat_neighbors) == E, \\\n            \"Inconsistency in number of links and neighbors.\"\n\n        # call Cython implementation\n        worker = partial(_nsi_betweenness,\n                         self.N, w, k_in, k_out, self.directed,\n                         flat_neighbors, is_source)\n        if parallelize:\n            # (naively) parallelize loop over nodes\n            n_workers = cpu_count()\n            batches = np.array_split(targets, n_workers)\n            with get_context(\"spawn\").Pool() as pool:\n                betw_w = np.sum(pool.map(worker, batches), axis=0)\n                pool.close()\n                pool.join()\n        else:\n            betw_w = worker(targets)\n        return betw_w / w\n\n    @Cached.method(name=\"eigenvector centrality\")\n    def eigenvector_centrality(self):\n        \"\"\"\n        For each node, return its eigenvector centrality.\n\n        This is the load on this node from the eigenvector corresponding to the\n        largest eigenvalue of the adjacency matrix, normalized to a\n        maximum of 1.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().eigenvector_centrality())\n        Calculating eigenvector centrality...\n        array([ 0.7895, 0.973 , 0.7769, 0.6941, 1. , 0.3109])\n\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        # TODO: allow for weights\n        _, evecs = eigsh(self.sp_A.astype(float), k=1, sigma=self.N**2,\n                         maxiter=100, tol=1e-8)\n        ec = evecs.T[0]\n        ec *= np.sign(ec[0])\n        return ec / ec.max()\n\n    @Cached.method(name=\"n.s.i. eigenvector centrality\", attrs=(\"_mut_nw\",))\n    def nsi_eigenvector_centrality(self):\n        \"\"\"\n        For each node, return its n.s.i. eigenvector centrality.\n\n        This is the load on this node from the eigenvector corresponding to the\n        largest eigenvalue of the n.s.i. adjacency matrix, divided by\n        sqrt(node weight) and normalized to a maximum of 1.\n\n        For a directed network, this uses the right eigenvectors. To get the\n        values for the left eigenvectors, apply this to the inverse network!\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_eigenvector_centrality())\n        Calculating n.s.i. eigenvector centrality...\n        array([ 0.8045, 1. , 0.8093, 0.6179, 0.9867, 0.2804])\n        >>> r(net.splitted_copy().nsi_eigenvector_centrality())\n        Calculating n.s.i. eigenvector centrality...\n        array([ 0.8045, 1. , 0.8093, 0.6179, 0.9867, 0.2804, 0.2804])\n\n        as compared to the unweighted version:\n\n        >>> r(net.eigenvector_centrality())\n        Calculating eigenvector centrality...\n        array([ 0.7895, 0.973 , 0.7769, 0.6941, 1. , 0.3109])\n        >>> r(net.splitted_copy().eigenvector_centrality())\n        Calculating eigenvector centrality...\n        array([ 1. , 0.8008, 0.6226, 0.6625, 0.8916, 0.582 , 0.582 ])\n\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        DwR = self.sp_diag_sqrt_w()\n        sp_Astar = DwR * self.sp_Aplus() * DwR\n        _, evecs = eigsh(sp_Astar, k=1, sigma=self.total_node_weight**2,\n                         maxiter=100, tol=1e-8)\n        ec = evecs.T[0] / np.sqrt(self.node_weights)\n        ec *= np.sign(ec[0])\n        return ec / ec.max()\n\n    def pagerank(self, link_attribute=None, use_directed=True):\n        \"\"\"\n        For each node, return its (weighted) PageRank.\n\n        This is the load on this node from the eigenvector corresponding to the\n        largest eigenvalue of a modified adjacency matrix, normalized to a\n        maximum of 1.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().pagerank())\n        Calculating PageRank...\n        array([ 0.2184, 0.2044, 0.1409, 0.1448, 0.2047, 0.0869])\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' weight. If None, links have weight 1. (Default: None)\n        :rtype: 1d numpy array [node] of\n        \"\"\"\n        if link_attribute == \"topological\":\n            print(\"WARNING: link_attribute='topological' is deprecated.\\n\"\n                  + \"Use link_attribute=None instead.\")\n            link_attribute = None\n        if link_attribute is None:\n            if self.silence_level <= 1:\n                print(\"Calculating PageRank...\")\n            return np.array(self.graph.personalized_pagerank(\n                directed=use_directed, weights=None))\n        else:\n            if self.silence_level <= 1:\n                print(\"Calculating weighted PageRank...\")\n            return np.array(self.graph.personalized_pagerank(\n                directed=use_directed, weights=link_attribute))\n\n    def closeness(self, link_attribute=None):\n        \"\"\"\n        For each node, return its (weighted) closeness.\n\n        This is the inverse of the mean shortest path length from the node to\n        all other nodes.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().closeness())\n        Calculating closeness...\n        array([ 0.7143, 0.625 , 0.5556, 0.625 , 0.7143, 0.4545])\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        # TODO: check and describe behaviour for unconnected networks\n        if link_attribute == \"topological\":\n            print(\"WARNING: link_attribute='topological' is deprecated.\\n\"\n                  + \"Use link_attribute=None instead.\")\n            link_attribute = None\n\n        if link_attribute is None:\n            if self.silence_level <= 1:\n                print(\"Calculating closeness...\")\n\n            #  Return the absolute value of tcc, since a bug sometimes results\n            #  in negative signs\n            return np.abs(np.array(self.graph.closeness()))\n\n        else:\n            CC = np.zeros(self.N)\n            path_lengths = self.path_lengths(link_attribute)\n\n            if self.silence_level <= 1:\n                print(\"Calculating weighted closeness...\")\n\n            #  Identify unconnected pairs and save in binary array isinf\n            unconnected_pairs = np.isinf(path_lengths)\n            #  Set infinite entries corresponding to unconnected pairs to\n            #  number of vertices\n            path_lengths[unconnected_pairs] = self.N\n\n            #  Some polar nodes have an assigned distance of zero to all their\n            #  neighbors. These nodes get zero geographical closeness\n            #  centrality.\n            path_length_sum = path_lengths.sum(axis=1)\n            CC[path_length_sum != 0] = \\\n                (self.N - 1) / path_length_sum[path_length_sum != 0]\n\n            #  Reverse changes to weightedPathLengths\n            path_lengths[unconnected_pairs] = np.inf\n\n            return CC\n\n    @Cached.method(name=\"n.s.i. closeness\", attrs=(\"_mut_nw\",))\n    def nsi_closeness(self):\n        \"\"\"\n        For each node, return its n.s.i. closeness.\n\n        This is the inverse of the mean shortest path length from the node to\n        all other nodes. If the network is not connected, the result is 0.\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_closeness())\n        Calculating n.s.i. closeness...\n        Calculating all shortest path lengths...\n        array([ 0.7692, 0.6486, 0.5825, 0.6417, 0.7229, 0.5085])\n        >>> r(net.splitted_copy().nsi_closeness())\n        Calculating n.s.i. closeness...\n        Calculating all shortest path lengths...\n        array([ 0.7692, 0.6486, 0.5825, 0.6417, 0.7229, 0.5085, 0.5085])\n\n        as compared to the unweighted version:\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.closeness())\n        Calculating closeness...\n        array([ 0.7143, 0.625 , 0.5556, 0.625 , 0.7143, 0.4545])\n        >>> r(net.splitted_copy().closeness())\n        Calculating closeness...\n        array([ 0.75 , 0.5455, 0.5 , 0.6 , 0.6667, 0.5 , 0.5 ])\n\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        # similar to nsi_average_path_length:\n        nsi_distances = self.path_lengths() + np.identity(self.N)\n        return (self.total_node_weight\n                / np.dot(nsi_distances, self.node_weights))\n\n    @Cached.method(name=\"n.s.i. harmonic closeness\", attrs=(\"_mut_nw\",))\n    def nsi_harmonic_closeness(self):\n        \"\"\"\n        For each node, return its n.s.i. harmonic closeness.\n\n        This is the inverse of the harmonic mean shortest path length from the\n        node to all other nodes. If the network is not connected, the result is\n        not necessarily 0.\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_harmonic_closeness())\n        Calculating n.s.i. harmonic closeness...\n        Calculating all shortest path lengths...\n        array([ 0.85 , 0.7986, 0.7111, 0.7208, 0.8083, 0.6167])\n        >>> r(net.splitted_copy().nsi_harmonic_closeness())\n        Calculating n.s.i. harmonic closeness...\n        Calculating all shortest path lengths...\n        array([ 0.85 , 0.7986, 0.7111, 0.7208, 0.8083, 0.6167, 0.6167])\n\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        # similar to nsi_average_path_length:\n        nsi_distances = self.path_lengths() + np.identity(self.N)\n        return (np.dot(1.0 / nsi_distances, self.node_weights)\n                / self.total_node_weight)\n\n    @Cached.method(name=\"n.s.i. exponential closeness centrality\",\n                   attrs=(\"_mut_nw\",))\n    def nsi_exponential_closeness(self):\n        \"\"\"\n        For each node, return its n.s.i. exponential harmonic closeness.\n\n        This is the mean of  2**(- shortest path length)  from the\n        node to all other nodes. If the network is not connected, the result is\n        not necessarily 0.\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_exponential_closeness())\n        Calculating n.s.i. exponential closeness centrality...\n        Calculating all shortest path lengths...\n        array([ 0.425 , 0.3906, 0.3469, 0.3604, 0.4042, 0.2958])\n        >>> r(net.splitted_copy().nsi_exponential_closeness())\n        Calculating n.s.i. exponential closeness centrality...\n        Calculating all shortest path lengths...\n        array([ 0.425 , 0.3906, 0.3469, 0.3604, 0.4042, 0.2958, 0.2958])\n\n        :rtype: 1d numpy array [node] of floats between 0 and 1\n        \"\"\"\n        # similar to nsi_average_path_length:\n        nsi_distances = self.path_lengths() + np.identity(self.N)\n        return (np.dot(2.0**(-nsi_distances), self.node_weights)\n                / self.total_node_weight)\n\n    @Cached.method(name=\"Arenas-type random walk betweenness\")\n    def arenas_betweenness(self):\n        \"\"\"\n        For each node, return its Arenas-type random walk betweenness.\n\n        This measures how often a random walk search for a random target node\n        from a random source node is expected to pass this node.  (see\n        [Arenas2003]_)\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().arenas_betweenness())\n        Calculating Arenas-type random walk betweenness...\n           (giant component size: 6 (1.0))\n        array([ 50.1818, 50.1818, 33.4545, 33.4545, 50.1818, 16.7273])\n\n        :rtype: 1d numpy array [node] of floats >= 0\n        \"\"\"\n        t0 = time.time()\n\n        #  Initialize the array to hold random walk betweenness\n        arenas_betweenness = np.zeros(self.N)\n\n        #  Random walk betweenness has to be calculated for each component\n        #  separately Therefore get different components of the graph first\n        components = self.graph.connected_components()\n\n        #  Print giant component size\n        if self.silence_level <= 1:\n            print(\"   (giant component size: \"\n                  + str(components.giant().vcount()) + \" (\"\n                  + str(components.giant().vcount()\n                        / float(self.graph.vcount())) + \"))\")\n\n        for c, comp in enumerate(components):\n            #  If the component has size 1, set random walk betweenness to zero\n            if len(comp) == 1:\n                arenas_betweenness[comp[0]] = 0\n            #  For larger components, continue with the calculation\n            else:\n                #  Get the subgraph corresponding to component i\n                subgraph = components.subgraph(c)\n\n                #  Get the subgraph A matrix\n                A = np.array(subgraph.get_adjacency(type=2).data)\n\n                #  Generate a Network object representing the subgraph\n                subnetwork = Network(adjacency=A, directed=False)\n\n                #  Get the number of nodes of the subgraph (the component size)\n                N = subnetwork.N\n\n                #  Initialize the RWB array\n                component_betweenness = np.zeros(N)\n\n                #  Get the subnetworks degree sequence\n                k = subnetwork.degree().astype('float64')\n\n                #  Clean up\n                del subgraph, subnetwork\n\n                #  Get the P that is modified and inverted by the C++ code\n                P = np.dot(np.diag(1 / k), A)\n\n                for i in range(N):\n                    #  Store the kth row of the P\n                    row_i = np.copy(P[i, :])\n\n                    #  Set the i-th row of the P to zero to account for the\n                    #  absorption of random walkers at their destination\n                    P[i, :] = 0\n\n                    #  Calculate the b^i matrix\n                    B = np.dot(np.linalg.inv(np.identity(N) - P), P)\n\n                    #  Perform the summation over source node c\n                    component_betweenness += B.sum(axis=0)\n\n                    #  Restore the P\n                    P[i, :] = row_i\n\n                #  Normalize RWB by component size\n                # component_betweenness *= N\n\n                #  Get the list of vertex numbers in the subgraph\n                nodes = comp\n\n                #  Copy results into randomWalkBetweennessArray at the correct\n                #  positions\n                for j, node in enumerate(nodes):\n                    arenas_betweenness[node] = component_betweenness[j]\n\n        if self.silence_level <= 0:\n            print(\"...took\", time.time()-t0, \"seconds\")\n\n        return arenas_betweenness\n\n    # parallelized main loop\n    @staticmethod\n    # pylint: disable=too-many-positional-arguments\n    def _mpi_nsi_arenas_betweenness(\n            N, sp_P, this_Aplus, w, this_w, start_i, end_i,\n            exclude_neighbors, stopping_mode, this_twinness):\n        error_message, result = '', None\n        try:\n            component_betweenness = np.zeros(N)\n            for i in range(start_i, end_i):\n                # For i and each neighbour of it, modify the corresponding row\n                # of P to account for the absorption of random walkers at their\n                # destination\n                sp_Pi = sp_P.copy()\n                Aplus_i = this_Aplus[i-start_i, :]\n                update_keys = [k for k in sp_Pi.keys() if Aplus_i[k[0]] == 1]\n                if stopping_mode == \"twinness\":\n                    twinness_i = this_twinness[i-start_i, :]\n                    update_vals = [sp_Pi[k] * (1.0 - twinness_i[k[0]])\n                                   for k in update_keys]\n                else:  # \"neighbors\"\n                    update_vals = np.zeros(len(update_keys))\n                update_rows, update_cols = zip(*update_keys)\n                sp_Pi[update_rows, update_cols] = update_vals\n                sp_Pi = sp_Pi.tocsc()\n                sp_Pi.eliminate_zeros()\n\n                # solve (1 - sp_Pi) * V = sp_Pi\n                V = splu(\n                    sp.identity(N, format='csc') - sp_Pi\n                ).solve(sp_Pi.toarray())\n\n                if exclude_neighbors:\n                    # for the result, we use only those targets i which are not\n                    # neighboured to our node of interest j\n                    B_sum = w.dot((V.T * (1 - Aplus_i)).T) * (1 - Aplus_i)\n                else:\n                    B_sum = w.dot(V)\n                component_betweenness += this_w[i-start_i] * B_sum\n\n            result = component_betweenness, start_i, end_i\n        except RuntimeError:\n            e = sys.exc_info()\n            error_message = (str(e[0]) + '\\n' + str(e[1]))\n\n        return error_message, result\n\n    # TODO: settle for some suitable defaults\n    def nsi_arenas_betweenness(self, exclude_neighbors=True,\n                               stopping_mode=\"neighbors\"):\n        \"\"\"\n        For each node, return its n.s.i. Arenas-type random walk betweenness.\n\n        This measures how often a random walk search for a random target node\n        from a random source node is expected to pass this node. (see\n        [Arenas2003]_)\n\n        **Examples:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_arenas_betweenness())\n        Calculating n.s.i. Arenas-type random walk betweenness...\n           (giant component size: 6 (1.0))\n        Calculating n.s.i. degree...\n        array([ 20.5814, 29.2103, 27.0075, 19.5434, 25.2849, 24.8483])\n        >>> r(net.splitted_copy().nsi_arenas_betweenness())\n        Calculating n.s.i. Arenas-type random walk betweenness...\n           (giant component size: 7 (1.0))\n        Calculating n.s.i. degree...\n        array([ 20.5814, 29.2103, 27.0075, 19.5434, 25.2849, 24.8483, 24.8483])\n        >>> r(net.nsi_arenas_betweenness(exclude_neighbors=False))\n        Calculating n.s.i. Arenas-type random walk betweenness...\n           (giant component size: 6 (1.0))\n        Calculating n.s.i. degree...\n        array([ 44.5351, 37.4058, 27.0075, 21.7736, 31.3256, 24.8483])\n        >>> r(net.nsi_arenas_betweenness(stopping_mode=\"twinness\"))\n        Calculating n.s.i. Arenas-type random walk betweenness...\n           (giant component size: 6 (1.0))\n        Calculating n.s.i. degree...\n        Calculating n.s.i. degree...\n        array([ 22.6153, 41.2314, 38.6411, 28.6195, 38.5824, 30.2994])\n\n        as compared to its unweighted version:\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.arenas_betweenness())\n        Calculating Arenas-type random walk betweenness...\n           (giant component size: 6 (1.0))\n        array([ 50.1818, 50.1818, 33.4545, 33.4545, 50.1818, 16.7273])\n        >>> r(net.splitted_copy().arenas_betweenness())\n        Calculating Arenas-type random walk betweenness...\n           (giant component size: 7 (1.0))\n        array([ 90.4242, 67.8182, 45.2121, 45.2121, 67.8182, 45.2121, 45.2121])\n\n        :arg bool exclude_neighbors: Indicates whether to use only source and\n            target nodes that are not linked to the node of interest.\n            (Default: True)\n        :arg str stopping_mode: Specifies when the random walk is stopped. If\n            \"neighbors\", the walk stops as soon as it reaches a neighbor of the\n            target node. If \"twinnness\", the stopping probability at each step\n            is the twinnness of the current and target nodes as given by\n            :meth:`nsi_twinness()`. (Default: \"neighbors\")\n        :rtype: 1d numpy array [node] of floats >= 0\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating n.s.i. Arenas-type random walk betweenness...\")\n\n        t0 = time.time()\n\n        #  Initialize the array to hold random walk betweenness\n        nsi_arenas_betweenness = np.zeros(self.N)\n\n        #  Random walk betweenness has to be calculated for each component\n        #  separately. Therefore get different components of the graph first\n        components = self.graph.connected_components()\n\n        #  Print giant component size\n        if self.silence_level <= 1:\n            print(\"   (giant component size: \"\n                  + str(components.giant().vcount()) + \" (\"\n                  + str(components.giant().vcount()\n                        / float(self.graph.vcount())) + \"))\")\n\n        for c, comp in enumerate(components):\n            #  If the component has size 1, set random walk betweenness to zero\n            if len(comp) == 1:\n                nsi_arenas_betweenness[comp[0]] = 0\n            #  For larger components, continue with the calculation\n            else:\n                #  Get the subgraph corresponding to component i\n                subgraph = components.subgraph(c)\n                A = np.array(subgraph.get_adjacency(type=2).data)\n                del subgraph\n\n                #  Get the list of vertex numbers in the subgraph\n                nodes = comp\n\n                # Extract corresponding area weight vector\n                w = np.zeros(len(nodes))\n                for j, node in enumerate(nodes):\n                    w[j] = self.node_weights[node]\n\n                #  Generate a Network object representing the subgraph\n                subnet = Network(adjacency=A, directed=False, node_weights=w)\n                N = subnet.N\n\n                #  Calculate the subnetworks degree sequence\n                subnet.nsi_degree()\n                Aplus = (A + np.identity(N)).astype(int)\n                if stopping_mode == \"twinness\":\n                    twinness = self.nsi_twinness()\n\n                #  Get the sparse P matrix that gets modified and inverted\n                sp_P = (subnet.sp_nsi_diag_k_inv() * subnet.sp_Aplus()\n                        * subnet.sp_diag_w()).todok()\n\n                if mpi.available:\n                    # determine in how many parts outer loop is split at max:\n                    max_parts = max(1, int(np.ceil(\n                        min((mpi.size-1) * 10.0, 0.1 * N))))\n                    # corresponding step size for c index of outer loop:\n                    step = int(np.ceil(1.0 * N / (1.0 * max_parts)))\n                    # actual number of parts accounting for rounding of steps:\n                    parts = int(np.ceil(1.0 * N / (1.0 * step)))\n                    if self.silence_level <= 0:\n                        print(f\"   parallelizing on {mpi.size-1}\"\n                              f\" slaves into {parts} parts with \"\n                              f\"{step} nodes each...\")\n\n                    for index in range(parts):\n                        start_i = index * step\n                        end_i = min((index + 1) * step, N)\n                        if start_i >= end_i:\n                            break\n                        this_Aplus = Aplus[start_i:end_i, :]\n                        this_w = w[start_i:end_i]\n                        if stopping_mode == \"twinness\":\n                            this_twinness = twinness[start_i:end_i, :]\n                        else:\n                            this_twinness = None\n                        if self.silence_level <= 0:\n                            print(\"   submitting\", index)\n                            mpi.submit_call(\n                                \"Network._mpi_nsi_arenas_betweenness\",\n                                (N, sp_P, this_Aplus, w, this_w,\n                                 start_i, end_i, exclude_neighbors,\n                                 stopping_mode, this_twinness),\n                                module=\"pyunicorn\", id=index)\n\n                    # Retrieve results of all submitted jobs\n                    component_betweenness = np.zeros(N)\n                    for index in range(parts):\n                        start_i = index * step\n                        if self.silence_level <= 0:\n                            print(\"   retrieving results from\", index)\n                        error_message, result = mpi.get_result(index)\n                        if error_message != '':\n                            print(error_message)\n                            sys.exit()\n                        this_betweenness, start_i, end_i = result\n                        component_betweenness += this_betweenness\n                else:\n                    component_betweenness = np.zeros(N)\n                    if stopping_mode == \"twinness\":\n                        this_twinness = twinness\n                    else:\n                        this_twinness = None\n                    error_message, result = \\\n                        Network._mpi_nsi_arenas_betweenness(\n                            N, sp_P, Aplus, w, w, 0, N,\n                            exclude_neighbors, stopping_mode, this_twinness)\n                    if error_message != '':\n                        print(error_message)\n                        sys.exit()\n                    this_betweenness, start_i, end_i = result\n                    component_betweenness += this_betweenness\n\n                component_betweenness /= w\n\n                # here I tried several ways to correct for the fact that k is\n                # not neighboured to j (see above):\n                # component_betweenness *= 1-w/nsi_k\n                # component_betweenness += subnet.total_node_weight*nsi_k\n                # component_betweenness -= subnet.total_node_weight*nsi_k\n                # is this an improvement???\n\n                #  Clean up\n                del subnet\n\n                #  Copy results into randomWalkBetweennessArray at the correct\n                #  positions\n                for j, node in enumerate(nodes):\n                    nsi_arenas_betweenness[node] = component_betweenness[j]\n\n        if self.silence_level <= 0:\n            print(\"...took\", time.time()-t0, \"seconds\")\n\n        return nsi_arenas_betweenness\n\n    @Cached.method(name=\"Newman's random walk betweenness\")\n    def newman_betweenness(self):\n        \"\"\"\n        For each node, return Newman's random walk betweenness.\n\n        This measures how often a random walk search for a random target node\n        from a random source node is expected to pass this node, not counting\n        when the walk returns along a link it took before to leave the node.\n        (see [Newman2005]_)\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().newman_betweenness())\n        Calculating Newman's random walk betweenness...\n           (giant component size: 6 (1.0))\n        array([ 4.1818, 3.4182, 2.5091, 3.0182, 3.6 , 2. ])\n\n        :rtype: 1d numpy array [node] of floats >= 0\n        \"\"\"\n        t0 = time.time()\n\n        #  Initialize the array to hold random walk betweenness\n        newman_betweenness = np.zeros(self.N)\n\n        #  Random walk betweenness has to be calculated for each component\n        #  separately. Therefore get different components of the graph first\n        components = self.graph.connected_components()\n\n        #  Print giant component size\n        if self.silence_level <= 1:\n            print(\"   (giant component size: \"\n                  + str(components.giant().vcount()) + \" (\"\n                  + str(components.giant().vcount()\n                        / float(self.graph.vcount())) + \"))\")\n\n        for c, comp in enumerate(components):\n            #  If the component has size 1, set random walk betweenness to zero\n            if len(comp) < 2:\n                newman_betweenness[comp[0]] = 0\n            #  For larger components, continue with the calculation\n            else:\n                #  Get the subgraph A matrix corresponding to component c\n                subgraph = components.subgraph(c)\n                A = np.array(subgraph.get_adjacency(type=2).data, dtype=ADJ)\n\n                #  Generate a Network object representing the subgraph\n                subnetwork = Network(adjacency=A, directed=False)\n                N, sp_A = subnetwork.N, subnetwork.sp_A\n\n                # Kirchhoff matrix\n                sp_M = sp.diags([subnetwork.indegree()], [0],\n                                shape=(N, N), format='csc', dtype=None) - sp_A\n\n                # invert it without last row/col\n                # FIXME: in rare cases (when there is an exact twin to the last\n                # node), this might not be invertible and a different row/col\n                # would need to be removed!\n                V = sp.lil_matrix((N, N))\n                V[:-1, :-1] = inv(sp_M[:-1, :-1])\n                V = V.toarray()\n                del subgraph, subnetwork, sp_A, sp_M\n\n                component_betweenness = np.zeros(N)\n                if mpi.available:\n                    # determine in how many parts outer loop is split at max:\n                    max_parts = max(1, int(np.ceil(\n                        min((mpi.size-1) * 10.0, 0.1 * N))))\n                    # corresponding step size for c index of outer loop:\n                    step = int(np.ceil(1.0 * N / (1.0 * max_parts)))\n                    # actual number of parts accounting for rounding of steps:\n                    parts = int(np.ceil(1.0 * N / (1.0 * step)))\n                    if self.silence_level <= 0:\n                        print(\"   parallelizing on \" + str((mpi.size-1))\n                              + \" slaves into \" + str(parts) + \" parts with \"\n                              + str(step) + \" nodes each...\")\n\n                    # now submit the jobs:\n                    for index in range(parts):\n                        start_i = index * step\n                        end_i = min((index + 1) * step, N)\n                        if start_i >= end_i:\n                            break\n                        this_A = A[start_i:end_i, :]\n                        # submit the job and add it to the list of jobs, so\n                        # that later the results can be retrieved:\n                        if self.silence_level <= 0:\n                            print(\"submitting part from\", start_i, \"to\", end_i)\n                        mpi.submit_call(\n                            \"core._ext.numerics._mpi_newman_betweenness\",\n                            (to_cy(this_A, ADJ), to_cy(V, DFIELD),\n                             N, start_i, end_i),\n                            module=\"pyunicorn\", id=index,\n                            time_est=this_A.sum())\n\n                    # Retrieve results of all submitted jobs:\n                    component_betweenness = np.zeros(N)\n                    for index in range(parts):\n                        # the following call connects to the submitted job,\n                        # waits until it finishes, and retrieves the result:\n                        if self.silence_level <= 0:\n                            print(\"retrieving results from \", index)\n                        this_betweenness, start_i, end_i = \\\n                            mpi.get_result(index)\n                        component_betweenness[start_i:end_i] = this_betweenness\n                else:\n                    component_betweenness, start_i, end_i =\\\n                        _mpi_newman_betweenness(\n                            to_cy(A, ADJ), to_cy(V, DFIELD),\n                            N, 0, N)\n\n                component_betweenness += 2 * (N - 1)\n                component_betweenness /= (N - 1.0)  # TODO: why is this?\n\n                # sort results into correct positions\n                nodes = comp\n                for j, node in enumerate(nodes):\n                    newman_betweenness[node] = component_betweenness[j]\n\n        if self.silence_level <= 0:\n            print(\"...took\", time.time()-t0, \"seconds\")\n\n        return newman_betweenness\n\n    def nsi_newman_betweenness(self, add_local_ends=False):\n        \"\"\"\n        For each node, return its n.s.i. Newman-type random walk betweenness.\n\n        This measures how often a random walk search for a random target node\n        from a random source node is expected to pass this node, not counting\n        when the walk returns along a link it took before to leave the node.\n        (see [Newman2005]_)\n\n        In this n.s.i. version, node weights are taken into account, and only\n        random walks are used that do not start or end in neighbors of the\n        node.\n\n\n        **Example:**\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.nsi_newman_betweenness())\n        Calculating n.s.i. Newman-type random walk betweenness...\n           (giant component size: 6 (1.0))\n        Calculating n.s.i. degree...\n        array([ 0.4048, 0. , 0.8521, 3.3357, 1.3662, 0. ])\n        >>> r(net.splitted_copy().nsi_newman_betweenness())\n        Calculating n.s.i. Newman-type random walk betweenness...\n           (giant component size: 7 (1.0))\n        Calculating n.s.i. degree...\n        array([ 0.4048, 0. , 0.8521, 3.3357, 1.3662, 0. , 0. ])\n        >>> r(net.nsi_newman_betweenness(add_local_ends=True))\n        Calculating n.s.i. Newman-type random walk betweenness...\n           (giant component size: 6 (1.0))\n        Calculating n.s.i. degree...\n        array([ 131.4448, 128. , 107.6421, 102.4457, 124.2062, 80. ])\n        >>> r(net.splitted_copy().nsi_newman_betweenness(\n        ...     add_local_ends=True))\n        Calculating n.s.i. Newman-type random walk betweenness...\n           (giant component size: 7 (1.0))\n        Calculating n.s.i. degree...\n        array([ 131.4448, 128. , 107.6421, 102.4457, 124.2062, 80. , 80. ])\n\n        as compared to its unweighted version:\n\n        >>> net = Network.SmallTestNetwork()\n        >>> r(net.newman_betweenness())\n        Calculating Newman's random walk betweenness...\n           (giant component size: 6 (1.0))\n        array([ 4.1818, 3.4182, 2.5091, 3.0182, 3.6 , 2. ])\n        >>> r(net.splitted_copy().newman_betweenness())\n        Calculating Newman's random walk betweenness...\n           (giant component size: 7 (1.0))\n        array([ 5.2626, 3.5152, 2.5455, 3.2121, 3.8182, 2.5556, 2.5556])\n\n        :arg bool add_local_ends: Indicates whether to add a correction for the\n            fact that walks starting or ending in neighbors are not used.\n            (Default: false)\n        :rtype: array [float>=0]\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating n.s.i. Newman-type random walk betweenness...\")\n\n        t0 = time.time()\n\n        #  Initialize the array to hold random walk betweenness\n        nsi_newman_betweenness = np.zeros(self.N)\n\n        #  Random walk betweenness has to be calculated for each component\n        #  separately. Therefore get different components of the graph first\n        components = self.graph.connected_components()\n\n        #  Print giant component size\n        if self.silence_level <= 1:\n            print(\"   (giant component size: \"\n                  + str(components.giant().vcount()) + \" (\"\n                  + str(components.giant().vcount()\n                        / float(self.graph.vcount())) + \"))\")\n\n        for c, comp in enumerate(components):\n            #  If the component has size 1, set random walk betweenness to zero\n            # FIXME: check why there was a problem with ==1\n            if len(comp) < 2:\n                nsi_newman_betweenness[comp[0]] = 0\n            #  For larger components, continue with the calculation\n            else:\n                #  Get the subgraph corresponding to component i\n                subgraph = components.subgraph(c)\n\n                #  Get the subgraph A matrix\n                A = np.array(subgraph.get_adjacency(type=2).data, dtype=ADJ)\n\n                #  Get the list of vertex numbers in the subgraph\n                nodes = comp\n\n                # Extract corresponding area weight vector:\n                w = to_cy(self.node_weights[nodes], DWEIGHT)\n\n                #  Generate a Network object representing the subgraph\n                subnet = Network(adjacency=A, directed=False, node_weights=w)\n                N = subnet.N\n\n                #  Initialize the RWB array\n                component_betweenness = np.zeros(N)\n\n                # sp_M = area-weighted Kirchhoff matrix * diag(w)^(-1)\n                Ap = subnet.sp_Aplus()\n                Dw, DwI = subnet.sp_diag_w(), subnet.sp_diag_w_inv()\n                Dk, DkI = subnet.sp_nsi_diag_k(), subnet.sp_nsi_diag_k_inv()\n                sp_M = Dw * (Dk - Ap * Dw) * DwI\n\n                # invert sp_M without last row/col (see above)\n                sp_M_inv = sp.lil_matrix((N, N))\n                sp_M_inv[:-1, :-1] = inv(sp_M[:-1, :-1])\n\n                # Note: sp_M_inv is not necessarily sparse, so the order is\n                # important for performance\n                V = ((DkI * Ap) * sp_M_inv).T.astype(DFIELD).toarray()\n                del subgraph, Ap, Dw, DwI, Dk, DkI, sp_M, sp_M_inv\n\n                # TODO: verify that this was indeed wrong\n                # w = self.node_weights\n\n                # indicator matrix that i,j are not neighboured or equal\n                not_adjacent_or_equal = (1 - A - np.identity(N)).astype(MASK)\n\n                if mpi.available:\n                    # determine in how many parts outer loop is split at max:\n                    max_parts = max(1, int(np.ceil(\n                        min((mpi.size-1) * 10.0, 0.1 * N))))\n                    # corresponding step size for c index of outer loop:\n                    step = int(np.ceil(1.0 * N / (1.0 * max_parts)))\n                    # actual number of parts accounting for rounding of steps:\n                    parts = int(np.ceil(1.0 * N / (1.0 * step)))\n                    if self.silence_level <= 0:\n                        print(\"   parallelizing on \" + str((mpi.size-1))\n                              + \" slaves into \" + str(parts) + \" parts with \"\n                              + str(step) + \" nodes each...\")\n\n                    for idx in range(parts):\n                        start_i = idx * step\n                        end_i = min((idx+1)*step, N)\n                        if start_i >= end_i:\n                            break\n                        this_A = A[start_i:end_i, :]\n                        this_not_adjacent_or_equal = \\\n                            not_adjacent_or_equal[start_i:end_i, :]\n\n                        mpi.submit_call(\n                            \"core._ext.numerics._mpi_nsi_newman_betweenness\",\n                            (to_cy(this_A, ADJ), to_cy(V, DFIELD), N, w,\n                             this_not_adjacent_or_equal, start_i, end_i),\n                            module=\"pyunicorn\", id=idx)\n\n                    # Retrieve results of all submitted jobs\n                    component_betweenness = np.zeros(N)\n                    for idx in range(parts):\n                        this_betweenness, start_i, end_i = mpi.get_result(idx)\n                        component_betweenness[start_i:end_i] = this_betweenness\n\n                else:\n                    component_betweenness, start_i, end_i = \\\n                        _mpi_nsi_newman_betweenness(\n                            to_cy(A, ADJ), to_cy(V, DFIELD), N, w,\n                            not_adjacent_or_equal, 0, N)\n\n                #  Correction for the fact that we used only s,t not\n                #  neighboured to i\n                if add_local_ends:\n                    nsi_k = subnet.nsi_degree()\n                    component_betweenness += (2.0 * w.sum() - nsi_k) * nsi_k\n\n                #  Copy results into randomWalkBetweennessArray at the correct\n                #  positions\n                for j, node in enumerate(nodes):\n                    nsi_newman_betweenness[node] = component_betweenness[j]\n\n        if self.silence_level <= 0:\n            print(\"...took\", time.time()-t0, \"seconds\")\n\n        return nsi_newman_betweenness\n\n    #\n    #  Efficiency measures\n    #\n\n    def global_efficiency(self, link_attribute=None):\n        \"\"\"\n        Return the global (weighted) efficiency. (see [Costa2007]_)\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().global_efficiency())\n        Calculating all shortest path lengths...\n        Calculating global (weighted) efficiency...\n        0.7111\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: float\n        \"\"\"\n        if link_attribute == \"topological\":\n            print(\"WARNING: link_attribute='topological' is deprecated.\\n\"\n                  + \"Use link_attribute=None instead.\")\n            link_attribute = None\n\n        path_lengths = self.path_lengths(link_attribute)\n\n        if self.silence_level <= 1:\n            print(\"Calculating global (weighted) efficiency...\")\n\n        #  Set path lengths on diagonal to infinity to avoid summing over those\n        #  entries when calculating efficiency\n        np.fill_diagonal(path_lengths, np.inf)\n\n        #  Calculate global efficiency\n        efficiency = (1/float(self.N * (self.N-1)) * (1/path_lengths).sum())\n\n        #  Restore path lengths on diagonal to zero\n        np.fill_diagonal(path_lengths, 0)\n\n        return efficiency\n\n    @Cached.method(name=\"n.s.i. global efficiency\", attrs=(\"_mut_nw\",))\n    def nsi_global_efficiency(self):\n        \"\"\"\n        Return the n.s.i. global efficiency.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().nsi_global_efficiency())\n        Calculating n.s.i. global efficiency...\n        Calculating all shortest path lengths...\n        0.7415\n\n        :rtype: float\n        \"\"\"\n        w = self.node_weights\n        #  Set path lengths on diagonal to 1\n        nsi_dist = self.path_lengths() + np.identity(self.N)\n        return w.dot((1/nsi_dist).dot(w)) / self.total_node_weight**2\n\n    def distance_based_measures(self, replace_inf_by=None):\n        \"\"\"\n        Return a dictionary of local and global measures that are based on\n        shortest path lengths.\n\n        This is useful for large graphs for which the matrix of all shortest\n        path lengths cannot be stored.\n\n        EXPERIMENTAL!\n\n        :type replace_inf_by: float/inf/None\n        :arg replace_inf_by: If None, the number of nodes is used.\n            (Default: None)\n        :rtype: dictionary with keys \"closeness\", \"harmonic_closeness\",\n            \"exponential_closeness\", \"average_path_length\",\n            \"global_efficiency\", \"nsi_closeness\", \"nsi_harmonic_closeness\",\n            \"nsi_exponential_closeness\", \"nsi_average_path_length\",\n            \"nsi_global_efficiency\"\n        \"\"\"\n        N, w, W = self.N, self.node_weights, self.total_node_weight\n\n        if replace_inf_by is None:\n            replace_inf_by = N\n\n        closeness = np.zeros(N)\n        harmonic_closeness = np.zeros(N)\n        exponential_closeness = np.zeros(N)\n        average_path_length = 0\n        nsi_closeness = np.zeros(N)\n        nsi_harmonic_closeness = np.zeros(N)\n        nsi_exponential_closeness = np.zeros(N)\n        nsi_average_path_length = 0\n\n        for i in range(N):\n            if self.silence_level == 0:\n                print(i)\n            di = np.array(self.graph.distances(i), dtype=float).flatten()\n            di[np.where(di == np.inf)] = replace_inf_by\n\n            closeness[i] = 1.0 / di.sum()\n            average_path_length += di.sum()\n\n            di[i] = np.inf\n            harmonic_closeness[i] = (1.0/di).sum()\n            exponential_closeness[i] = (0.5**di).sum()\n\n            di[i] = 1\n            nsi_closeness[i] = 1.0 / (w*di).sum()\n            nsi_average_path_length += w[i] * (w*di).sum()\n            nsi_harmonic_closeness[i] = (w/di).sum()\n            nsi_exponential_closeness[i] = (w * 0.5**di).sum()\n\n        return {\n            \"closeness\": closeness * (N-1),\n            \"harmonic_closeness\": harmonic_closeness / (N-1),\n            \"exponential_closeness\": exponential_closeness / (N-1),\n            \"average_path_length\": average_path_length / N*(N-1),\n            \"global_efficiency\": harmonic_closeness.mean() / (N-1),\n            \"nsi_closeness\": nsi_closeness * W,\n            \"nsi_harmonic_closeness\": nsi_harmonic_closeness / W,\n            \"nsi_exponential_closeness\": nsi_exponential_closeness / W,\n            \"nsi_average_path_length\": nsi_average_path_length / W**2,\n            \"nsi_global_efficiency\": w.dot(nsi_harmonic_closeness) / W**2\n        }\n\n    #\n    #  Vulnerability measures\n    #\n\n    def local_vulnerability(self, link_attribute=None):\n        \"\"\"\n        For each node, return its vulnerability. (see [Costa2007]_)\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().local_vulnerability())\n        Calculating all shortest path lengths...\n        Calculating global (weighted) efficiency...\n        Calculating (weighted) node vulnerabilities...\n        array([ 0.2969, 0.0625, -0.0313, -0.0078, 0.0977, -0.125 ])\n\n        :arg str link_attribute: Optional name of the link attribute to be used\n            as the links' length. If None, links have length 1. (Default: None)\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        if link_attribute == \"topological\":\n            print(\"WARNING: link_attribute='topological' is deprecated.\\n\"\n                  + \"Use link_attribute=None instead.\")\n            link_attribute = None\n\n        vulnerability = np.zeros(self.N)\n\n        #  Calculate global efficiency of complete network E\n        global_efficiency = self.global_efficiency(link_attribute)\n\n        if self.silence_level <= 1:\n            print(\"Calculating (weighted) node vulnerabilities...\")\n\n        for i in trange(self.N, disable=self.silence_level > 1):\n            #  Remove vertex i from graph\n            graph = self.graph - i\n\n            #  Generate Network object from this reduced graph\n            network = Network.FromIGraph(graph, 2)\n\n            #  Calculate global topological efficiency E_i after removal of\n            #  vertex i\n            node_efficiency = network.global_efficiency(link_attribute)\n\n            #  Calculate local topological vulnerability of vertex i\n            vulnerability[i] = ((global_efficiency - node_efficiency)\n                                / global_efficiency)\n\n            #  Clean up\n            del graph, network\n\n        return vulnerability\n\n    #\n    #  Community measures\n    #\n\n    @Cached.method(name=\"coreness\")\n    def coreness(self):\n        \"\"\"\n        For each node, return its coreness.\n\n        The k-core of a network is a maximal subnetwork in which each node has\n        at least degree k. (Degree here means the degree in the subnetwork of\n        course). The coreness of a node is k if it is a member of the k-core\n        but not a member of the (k+1)-core.\n\n        **Example:**\n\n        >>> Network.SmallTestNetwork().coreness()\n        Calculating coreness...\n        array([2, 2, 2, 2, 2, 1])\n\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        return np.array(self.graph.coreness())\n\n    #\n    #  Synchronizability measures\n    #\n\n    @Cached.method(name=\"the master stability function synchronizability\")\n    def msf_synchronizability(self):\n        \"\"\"\n        Return the synchronizability in the master stability function\n        framework.\n\n        This is equal to the largest eigenvalue of the graph Laplacian divided\n        by the smallest non-zero eigenvalue. A smaller value indicates higher\n        synchronizability and vice versa. This function makes sense for\n        undirected climate networks (with symmetric Laplacian matrix).\n        For directed networks, the undirected Laplacian matrix is used.\n\n        (see [Pecora1998]_)\n\n        .. note::\n           Only defined for undirected networks.\n\n        **Example:**\n\n        >>> r(Network.SmallTestNetwork().msf_synchronizability())\n        Calculating master stability function synchronizability...\n        6.7784\n\n        :rtype: float\n        \"\"\"\n        # TODO: use sparse version to speed up!\n        #  Get undirected graph laplacian\n        laplacian = self.laplacian()\n\n        #  Get eigenvalues of laplacian\n        eigenvalues = np.real(linalg.eigvals(laplacian))\n\n        #  Sort eigenvalues in ascending order\n        eigenvalues.sort()\n\n        #  Get smallest non-zero eigenvalue (Fiedler value)\n        i = 0\n        fiedler_value = 0\n\n        #  The limited accuracy of eigenvalue calculation forces the use of\n        #  some threshold, below which eigenvalues are considered to be zero\n        accuracy = 10**(-10)\n\n        while (eigenvalues[i] <= accuracy) and (i < self.N - 1):\n            fiedler_value = eigenvalues[i+1]\n            i += 1\n\n        #  Calculate synchronizability R\n        R = eigenvalues[-1] / fiedler_value\n\n        return R\n\n    #\n    #  Distance measures between two graphs\n    #\n\n    def hamming_distance_from(self, other_network):\n        \"\"\"\n        Return the normalized hamming distance between this and another\n        network.\n\n        This is the percentage of links that have to be changed to transform\n        this network into the other. Hamming distance is only defined for\n        networks with an equal number of nodes.\n\n        :rtype: float between 0 and 1\n        \"\"\"\n        #  Get own adjacency matrix\n        A = self.adjacency\n        #  Get the other graph's adjacency matrix\n        B = other_network.adjacency\n\n        #  Check if the graphs have the same number of vertices\n        if self.N == other_network.N:\n            #  Calculate the hamming distance\n            hamming = (A != B).sum()\n\n            #  Return the normalized hamming distance\n            return hamming / float(self.N * (self.N - 1))\n        else:\n            raise NetworkError(\"Only defined for networks with same number of \\\n                               nodes.\")\n\n    def spreading(self, alpha=None):\n        \"\"\"\n        For each node, return its \"spreading\" value.\n\n        .. note::\n           This is still EXPERIMENTAL!\n\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        if alpha is None:\n            alpha = 1.0 / self.degree().mean()\n        return expm(np.log(2.0) * (\n            alpha * self.adjacency\n            - np.identity(self.N))).sum(axis=0).flatten()\n\n    def nsi_spreading(self, alpha=None):\n        \"\"\"\n        For each node, return its n.s.i. \"spreading\" value.\n\n        .. note::\n           This is still EXPERIMENTAL!\n\n        :rtype: 1d numpy array [node] of floats\n        \"\"\"\n        N, Aplus = self.N, self.sp_Aplus().toarray()\n        w, k = self.node_weights, self.nsi_degree()\n        if alpha is None:\n            alpha = self.total_node_weight / k.dot(w)\n        return (\n            expm(np.log(2.0) * (Aplus * alpha * w - sp.identity(N))).dot(Aplus)\n            * w.reshape((N, 1))).sum(axis=0)\n"
  },
  {
    "path": "src/pyunicorn/core/resistive_network.py",
    "content": "# # Copyright (C) 2014 Paul Schultz and the SWIPO Project\n#\n# Authors (this file):\n#   Stefan Schinkel <stefan.schinkel@gmail.com>\n#   Paul Schultz pschultz@pik-potsdam.de>\n#\n#\n# References: [Schultz2014]_, [Schultz2014a]_,\n#\n# ToDo:\n#  - included Schultz' Predictor and growth algorithm (among others)\n\n\n\"\"\"\nModule contains class ResNetwork.\n\nProvides function for computing resistance based networks. It is subclassed\nfrom GeoNetwork and provides most GeoNetwork's functions/properties.\n\nThe class has the following instance variables::\n\n    (bool) flagDebug     : flag for debugging mode\n    (bool) flagComplex   : flag for complex input\n    (ndarray) resistances: array of resistances (complex or real)\n\nOverriden inherited methods::\n\n    (str) __str__          : extended description\n    (ndarray) get_adjacency: returns complex adjacency if needed\n\"\"\"\n\n#  Import NumPy for the array object and fast numerics\nimport numpy as np\n\n# Import handler for sparse matrices\nfrom scipy import sparse\n\n#  Import iGraph for high performance graph theory tools written in pure ANSI-C\nimport igraph\n\nfrom ._ext.types import to_cy, FIELD, DFIELD\nfrom ._ext.numerics import _vertex_current_flow_betweenness, \\\n    _edge_current_flow_betweenness\n\n# Import things we inherit from\nfrom .geo_network import GeoNetwork\nfrom .geo_grid import GeoGrid\n\n# a network Error (use uncertain)\n# from .network import NetworkError\n\n\nclass ResNetwork(GeoNetwork):\n    \"\"\" A resistive network class\n\n    ResNetwork, provides methods for an extended analysis of\n    resistive/resistance-based networks.\n\n    **Examples:**\n\n    >>> print(ResNetwork.SmallTestNetwork())\n    ResNetwork:\n    GeoNetwork:\n    Network: undirected, 5 nodes, 5 links, link density 0.500.\n    Geographical boundaries:\n             time     lat     lon\n       min    0.0    0.00 -180.00\n       max    9.0   90.00  180.00\n    Average resistance: 2.4\n    \"\"\"\n###############################################################################\n# ##                       MAGIC FUNCTIONS                                 ## #\n###############################################################################\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, resistances, grid=None, adjacency=None, edge_list=None,\n                 directed=False, node_weight_type=None, silence_level=2):\n\n        \"\"\"Initialize an instance of ResNetwork.\n\n        :type resistances: 2D NumPy array\n        :arg resistances: A matrix with the resistances\n\n        :type grid: GeoGrid object\n        :arg grid: The GeoGrid object describing the network's spatial\n            embedding.\n\n        :type adjacency: 2D NumPy array (int8) [index, index]\n        :arg adjacency: The network's adjacency matrix.\n\n        :type edge_list: array-like list of lists\n        :arg  edge_list: Edge list of the new network.\n                         Entries [i,0], [i,1] contain the end-nodes of an edge.\n\n        :type directed: boolean\n        :arg directed: Determines, whether the network is treated as directed.\n\n        :type node_weight_type: string\n        :arg node_weight_type: The type of geographical node weight to be used.\n\n        :type silence_level: number (int)\n        :arg silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n\n        # 1) prepare params so we can init() the parent\n\n        # 1a) an adjacency matrix\n        #     by default, if only resistance are given,\n        #     these define the adjacency\n        if adjacency is None:\n            if silence_level < 2:\n                print(\"Using adjacency as definded by resistances\")\n\n            adjacency = np.zeros(resistances.shape)\n            adjacency[resistances != 0] = 1\n\n        # 1b) a Grid object\n        #     an actual grid might not exist, so we fake one\n        if grid is None:\n            if silence_level < 2:\n                print(\"Using dummy grid\")\n            grid = GeoGrid(\n                time_seq=np.arange(10), lat_seq=np.absolute(\n                    np.linspace(-90, 90, adjacency.shape[0])),\n                lon_seq=np.linspace(-180, 180, adjacency.shape[0]),\n                silence_level=0)\n\n        # 2) init parent\n        GeoNetwork.__init__(self, grid, adjacency=adjacency,\n                            node_weight_type=node_weight_type,\n                            silence_level=silence_level)\n\n        # 3) add ResNetwork specific parts\n\n        # 3a) set the resitance values\n        #     this sets the property and forces the\n        #     updating of the admittance and R\n        self.sparse_Adm = None\n        self.adm_graph = None\n        self.sparse_R = None\n        self.update_resistances(resistances)\n\n        # 4) cache\n        self._effective_resistances = None\n\n    def __str__(self):\n        \"\"\"\n        Return a short summary of the resistive network.\n        \"\"\"\n        return (f\"ResNetwork:\\n{GeoNetwork.__str__(self)}\\n\"\n                f\"Average resistance: {self.resistances.mean()}\")\n\n###############################################################################\n# ##                       PUBLIC FUNCTIONS                                ## #\n###############################################################################\n    @staticmethod\n    def SmallTestNetwork():\n        r\"\"\"\n        Create a small test network with unit resistances of the following\n        topology::\n\n            0------1--------3------4\n                    \\      /\n                     \\    /\n                      \\  /\n                       \\/\n                       2\n\n        :rtype: Resistive Network instance\n        :return: an ResNetwork instance for testing purposes.\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork()\n        >>> isinstance(res, ResNetwork)\n        True\n        \"\"\"\n        adjacency = np.array([[0, 1, 0, 0, 0],\n                              [1, 0, 1, 1, 0],\n                              [0, 1, 0, 1, 0],\n                              [0, 1, 1, 0, 1],\n                              [0, 0, 0, 1, 0]], dtype='int8')\n\n        # sample symmetric resistances w/ rational reciprocals\n        # resistances = np.array([2,2,8,2,8,8,2,8,10,10])\n\n        # # the resistances should be a full matrix\n        resistances = np.array([[0, 2, 0, 0, 0],\n                                [2, 0, 8, 2, 0],\n                                [0, 8, 0, 8, 0],\n                                [0, 2, 8, 0, 10],\n                                [0, 0, 0, 10, 0]])\n        # a grid\n        grid = GeoGrid(\n            time_seq=np.arange(10), lat_seq=np.absolute(\n                np.linspace(-90, 90, adjacency.shape[0])),\n            lon_seq=np.linspace(-180, 180, adjacency.shape[0]),\n            silence_level=0)\n\n        return ResNetwork(resistances, grid=grid, adjacency=adjacency)\n\n    @staticmethod\n    def SmallComplexNetwork():\n        \"\"\"\n        A test network with complex resistances analogue to\n        SmallTestNetwork()\n\n        :rtype: Resistive Network instance\n        :return: an ResNetwork instance with complex resistances\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallComplexNetwork()\n        >>> isinstance(res, ResNetwork)\n        True\n        >>> res.flagComplex\n        True\n        >>> adm = res.get_admittance()\n        >>> print(adm.real)\n        [[ 0.      0.1     0.      0.      0.    ]\n         [ 0.1     0.      0.0625  0.25    0.    ]\n         [ 0.      0.0625  0.      0.0625  0.    ]\n         [ 0.      0.25    0.0625  0.      0.05  ]\n         [ 0.      0.      0.      0.05    0.    ]]\n\n        >>> print(adm.imag)\n        [[ 0.     -0.2     0.      0.      0.    ]\n         [-0.2     0.     -0.0625 -0.25    0.    ]\n         [ 0.     -0.0625  0.     -0.0625  0.    ]\n         [ 0.     -0.25   -0.0625  0.     -0.05  ]\n         [ 0.      0.      0.     -0.05    0.    ]]\n\n        \"\"\"\n\n        resistances = np.zeros((5, 5), dtype=complex)\n        resistances.real = [[0, 2, 0, 0, 0],\n                            [2, 0, 8, 2, 0],\n                            [0, 8, 0, 8, 0],\n                            [0, 2, 8, 0, 10],\n                            [0, 0, 0, 10, 0]]\n        resistances.imag = [[0, 4, 0, 0, 0],\n                            [4, 0, 8, 2, 0],\n                            [0, 8, 0, 8, 0],\n                            [0, 2, 8, 0, 10],\n                            [0, 0, 0, 10, 0]]\n\n        return ResNetwork(resistances)\n\n    def update_resistances(self, resistances):\n        \"\"\"\n        Update the resistance matrix\n\n        This function is called to changed the resistance matrix. It sets the\n        property and the calls the :meth:`update_admittance` and\n        :meth:`update_R` functions.\n\n        :rtype: None\n\n        **Examples:**\n\n        >>> # test network with given resistances\n        >>> res = ResNetwork.SmallTestNetwork()\n        >>> print(res.resistances)\n        [[ 0  2  0  0  0]\n         [ 2  0  8  2  0]\n         [ 0  8  0  8  0]\n         [ 0  2  8  0 10]\n         [ 0  0  0 10  0]]\n        >>> # print admittance and admittance Laplacian\n        >>> print(res.get_admittance())\n        [[ 0.     0.5    0.     0.     0.   ]\n         [ 0.5    0.     0.125  0.5    0.   ]\n         [ 0.     0.125  0.     0.125  0.   ]\n         [ 0.     0.5    0.125  0.     0.1  ]\n         [ 0.     0.     0.     0.1    0.   ]]\n        >>> print(res.admittance_lapacian())\n        [[ 0.5   -0.5    0.     0.     0.   ]\n         [-0.5    1.125 -0.125 -0.5    0.   ]\n         [ 0.    -0.125  0.25  -0.125  0.   ]\n         [ 0.    -0.5   -0.125  0.725 -0.1  ]\n         [ 0.     0.     0.    -0.1    0.1  ]]\n        >>> # now update to unit resistance\n        >>> res.update_resistances(res.adjacency)\n        >>> # and check new admittance/admittance Laplacian\n        >>> print(res.get_admittance())\n        [[ 0.  1.  0.  0.  0.]\n         [ 1.  0.  1.  1.  0.]\n         [ 0.  1.  0.  1.  0.]\n         [ 0.  1.  1.  0.  1.]\n         [ 0.  0.  0.  1.  0.]]\n        >>> print(res.admittance_lapacian())\n        [[ 1. -1.  0.  0.  0.]\n         [-1.  3. -1. -1.  0.]\n         [ 0. -1.  2. -1.  0.]\n         [ 0. -1. -1.  3. -1.]\n         [ 0.  0.  0. -1.  1.]]\n        \"\"\"\n\n        # ensure ndarray\n        if not isinstance(resistances, np.ndarray):\n            resistances = np.array(resistances)\n\n        # check complex/real\n        self.flagComplex = np.iscomplexobj(resistances)\n\n        # set property\n        self.resistances = resistances\n\n        # update the admittance\n        self.update_admittance()\n\n        # and update R\n        self.update_R()\n\n    def update_admittance(self):\n        \"\"\"\n        Updates admittance matrix which is inverse the resistances\n\n        :rtype: none\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork();print(res.get_admittance())\n        [[ 0.     0.5    0.     0.     0.   ]\n         [ 0.5    0.     0.125  0.5    0.   ]\n         [ 0.     0.125  0.     0.125  0.   ]\n         [ 0.     0.5    0.125  0.     0.1  ]\n         [ 0.     0.     0.     0.1    0.   ]]\n        >>> print(type(res.get_admittance()))\n        <class 'numpy.ndarray'>\n        \"\"\"\n        # a sparse matrix for the admittance values\n        # we start w/ a lil_matrix, maybe convert that\n        # to csr_matrix ( Compressed Sparse Row) or\n        # to csc_matrix ( Compressed Sparse Column) later\n\n        # complex number support\n        if self.flagComplex:\n            dtype = complex\n        else:\n            dtype = float\n\n        self.sparse_Adm = sparse.lil_matrix((self.N, self.N), dtype=dtype)\n\n        # get the edges\n        edgeList = list(self.edge_list())\n\n        # populate array\n        for edge in edgeList:\n            # print(\"setting %d %d to %f\" % (\n            #     edge[0], edge[1], 1./self.resistances[edge[0], edge[1]]))\n            self.sparse_Adm[edge[0], edge[1]] = \\\n                1./self.resistances[edge[0], edge[1]]\n\n        # Similar to GeoNetwork, we embed an iGraph instance for\n        # the admittance matrix\n        self.adm_graph = igraph.Graph(n=self.N, edges=edgeList,\n                                      directed=self.directed)\n        self.graph.simplify()\n\n    def get_admittance(self):\n        \"\"\"Return the (possibly non-symmetric) dense admittance matrix\n\n        :rtype: square NumPy matrix [node,node] of ints\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork();print(res.get_admittance())\n        [[ 0.     0.5    0.     0.     0.   ]\n         [ 0.5    0.     0.125  0.5    0.   ]\n         [ 0.     0.125  0.     0.125  0.   ]\n         [ 0.     0.5    0.125  0.     0.1  ]\n         [ 0.     0.     0.     0.1    0.   ]]\n        >>> print(type( res.get_admittance() ))\n        <class 'numpy.ndarray'>\n        \"\"\"\n        return self.sparse_Adm.toarray()\n\n    def update_R(self):\n        \"\"\"Updates R, the pseudo inverse of the admittance Laplacian\n\n        This function is run, whenever the admittance is changed.\n\n        :rtype: none\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork();print(res.get_admittance())\n        [[ 0.     0.5    0.     0.     0.   ]\n         [ 0.5    0.     0.125  0.5    0.   ]\n         [ 0.     0.125  0.     0.125  0.   ]\n         [ 0.     0.5    0.125  0.     0.1  ]\n         [ 0.     0.     0.     0.1    0.   ]]\n        >>> print(type( res.get_admittance() ))\n        <class 'numpy.ndarray'>\n\n        \"\"\"\n        # a sparse matrix for the admittance values\n        self.sparse_R = sparse.lil_matrix(\n            np.linalg.pinv(self.admittance_lapacian()))\n\n    def get_R(self):\n        \"\"\"Return the pseudo inverse of of the admittance Laplacian\n\n        The pseudoinverse is used of the novel betweeness  measures such as\n        :meth:`vertex_current_flow_betweenness` and\n        :meth:`edge_current_flow_betweenness` It is computed on instantiation\n        and on change of the resistances/admittance\n\n        :returns: the pseudoinverse of the admittange Laplacian\n        :rtype: ndarray (float)\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork();print(res.get_R())\n        [[ 2.28444444  0.68444444 -0.56       -0.20444444 -2.20444444]\n         [ 0.68444444  1.08444444 -0.16        0.19555556 -1.80444444]\n         [-0.56       -0.16        3.04       -0.16       -2.16      ]\n         [-0.20444444  0.19555556 -0.16        1.08444444 -0.91555556]\n         [-2.20444444 -1.80444444 -2.16       -0.91555556  7.08444444]]\n        \"\"\"\n        return self.sparse_R.toarray()\n\n    def admittance_lapacian(self):\n        \"\"\"\n        Return the (possibly non-symmetric) dense Laplacian matrix of the\n        admittance.\n\n        :rtype: square NumPy matrix [node,node] of\n\n        **Examples:**\n\n        >>> print(ResNetwork.SmallTestNetwork().admittance_lapacian())\n        [[ 0.5   -0.5    0.     0.     0.   ]\n         [-0.5    1.125 -0.125 -0.5    0.   ]\n         [ 0.    -0.125  0.25  -0.125  0.   ]\n         [ 0.    -0.5   -0.125  0.725 -0.1  ]\n         [ 0.     0.     0.    -0.1    0.1  ]]\n        >>> print(type( ResNetwork.SmallTestNetwork().admittance_lapacian() ))\n        <class 'numpy.ndarray'>\n         \"\"\"\n\n        return np.diag(sum(self.get_admittance())) - self.get_admittance()\n\n    def admittive_degree(self):\n        \"\"\"admittive degree of the network\n\n        The admittive (or effective) degree of the resistive network,\n        which is the counterpart to the traditional degree.\n\n        :rtype: 1D NumPy array\n\n        **Examples:**\n\n        >>> print(ResNetwork.SmallTestNetwork().admittive_degree())\n        [ 0.5    1.125  0.25   0.725  0.1  ]\n        >>> print(type( ResNetwork.SmallTestNetwork().admittive_degree() ))\n        <class 'numpy.ndarray'>\n        \"\"\"\n        return np.sum(self.get_admittance(), axis=0)\n\n    def average_neighbors_admittive_degree(self):\n        \"\"\" Average neighbour effective degree\n\n        :rtype: 1D NumPy array\n\n        **Examples:**\n\n        >>> print(ResNetwork.SmallTestNetwork().\\\n                average_neighbors_admittive_degree())\n        [ 2.25  1.31111111  7.4  2.03448276  7.25  ]\n        >>> print(type(ResNetwork.SmallTestNetwork().admittive_degree()))\n        <class 'numpy.ndarray'>\n        \"\"\"\n\n        # get the admittive degree (row sum)\n        # and adjacency matrix\n        ad = self.admittive_degree()\n        adj = self.adjacency\n\n        # in case of complex resistances we also use the dot product,\n        # but of complex-valued arrays\n        # This is NOT right, BUT:\n        # np.dot treats complex numbers wrongly and computes the\n        # dot product of the real and the imag part seperately\n        # which in our case is exactly what we want\n        if self.flagComplex:\n            adj = np.array(adj, dtype=complex)\n            adj.imag = adj.real\n\n        # dot product of adjacency and degree\n        # normalised by the row sum (admittive degree)\n        return np.dot(adj, ad) / ad\n\n        # to sweave later on:\n        # N = self.N\n        # adjacency = self.adjacency\n        # ANED = np.zeros(N)\n        # ED = self.admittive_degree()\n        # for i in range(N):\n        #     sum = 0\n        #     for j in range(N):\n        #         sum += adjacency[i][j]*ED[j]\n        #     ANED[i] = sum/ED[i]\n        # # print(ANED)\n\n    def local_admittive_clustering(self):\n        r\"\"\"\n        Return node wise admittive clustering coefficient (AC).\n\n        The AC is the electrical analogue of the clustering coefficient for\n        regular network (see :meth:`.get_admittive_ws_clustering` and\n        :meth:`.get_local_clustering` and sometimes called Effective Clustering\n        (EC))\n\n        The admittive clustering (:math:`ac`) of node :math:`i` is defined as:\n\n        .. math::\n            \\text{ac}_i = \\frac\n                {\\sum_{j,k}^N\\alpha_{i,j},\\alpha_{i,k},\\alpha_{j,k}}\n                {\\text{ad}_i(\\text{d}_i-1)}\n\n        where\n            - :math:`\\alpha` is the admittance matrix\n            - :math:`ad_i` is the admittive degree of the node :math:`i`\n            - :math:`d_i` is the degree of the node :math:`i`\n\n        :rtype: 1d NumPy array (float)\n\n        **Examples:**\n\n        >>> res =  ResNetwork.SmallTestNetwork()\n        >>> print(res.local_admittive_clustering())\n        [ 0.  0.00694444  0.0625  0.01077586  0. ]\n        >>> print(type(res.local_admittive_clustering()))\n        <class 'numpy.ndarray'>\n        \"\"\"\n\n        # needed vals: admittance matrix and admittiv_degree\n        # are already complex/real as needed\n        admittance = self.get_admittance()\n        ad = self.admittive_degree()\n\n        # output and the degree have to be switched\n        if self.flagComplex:\n            d = np.array(self.degree(), dtype=complex)\n            ac = np.zeros(self.N, dtype=complex)\n\n        else:\n            d = self.degree()\n            ac = np.zeros(self.N)\n\n        # TODO: Sweave me!\n        for i in range(self.N):\n            dummy = 0\n            for j in range(self.N):\n                for k in range(self.N):\n                    dummy += admittance[i][j]*admittance[i][k]*admittance[j][k]\n            if d[i] == 1:\n                ac[i] = 0\n            else:\n                ac[i] = dummy/(ad[i] * (d[i]-1))\n\n        # return\n        return ac\n\n    def global_admittive_clustering(self):\n        \"\"\"\n        Return node wise admittive clustering coefficient.\n\n        :rtype: NumPy float\n\n        **Examples:**\n\n        >>> res =  ResNetwork.SmallTestNetwork()\n        >>> print(\"%.3f\" % res.global_admittive_clustering())\n        0.016\n        >>> print(type(res.global_admittive_clustering()))\n        <class 'numpy.float64'>\n        \"\"\"\n\n        return self.local_admittive_clustering().mean()\n\n    def effective_resistance(self, a, b):\n        \"\"\"\n        Return the effective resistance (ER) between two nodes\n        a and b. The ER is the electrical analogue to the shortest path\n        where a is considered as \"source\" and b as the \"sink\"\n\n        :type a: int\n        :arg a: index of the \"source\" node\n\n        :type b: int\n        :arg b: index of the \"sink\" node\n\n        :rtype: NumPy float\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork()\n        >>> print(res.effective_resistance(1,1))\n        0.0\n        >>> print(type( res.effective_resistance(1,1) ))\n        <class 'float'>\n        >>> print(\"%.3f\" % res.effective_resistance(1,2))\n        4.444\n        >>> print(type( res.effective_resistance(1,1) ))\n        <class 'float'>\n        \"\"\"\n        # return def for self-loop\n        if a == b:\n            if self.flagComplex:\n                return complex(0.0)\n            else:\n                return float(0.0)\n\n        # Get pseudoinverse of the Laplacian\n        R = self.get_R()\n\n        # return looked-up values\n        return R[a, a] - R[a, b] - R[b, a] + R[b, b]\n\n    def average_effective_resistance(self):\n        \"\"\"\n        Return the average effective resistance (<ER>) of the resistive\n        network, the average resistances for all \"paths\" (connections)\n\n        :rtype: float\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork()\n        >>> print(\"%.5f\" % res.average_effective_resistance())\n        7.28889\n        >>> print(type( res.average_effective_resistance() ))\n        <class 'numpy.float64'>\n        \"\"\"\n\n        # since the NW is symmetric, we can only\n        # sum over upper triangle, excluding zeros\n        # but multiply by 2 later on\n\n        # we also store a hidden, quick access var\n        self._effective_resistances = np.array([])\n\n        for i in range(self.N):\n            for j in range(i):\n                self._effective_resistances = np.append(\n                    self._effective_resistances,\n                    self.effective_resistance(i, j))\n\n        return 2*np.sum(self._effective_resistances) / (self.N*(self.N-1))\n\n    def diameter_effective_resistance(self):\n        \"\"\"\n        Return the diameter (the highest resistance path between any nodes).\n\n        :rtype: float\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork()\n        >>> print(\"%.3f\" % res.diameter_effective_resistance())\n        Re-computing all effective resistances\n        14.444\n        >>> print(type(res.diameter_effective_resistance()))\n        <class 'numpy.float64'>\n        >>> res = ResNetwork.SmallTestNetwork()\n        >>> x = res.average_effective_resistance()\n        >>> print(\"%.3f\" % res.diameter_effective_resistance())\n        14.444\n        \"\"\"\n        # try to use pre-computed values\n        if self._effective_resistances is not None:\n            diameter = np.max(self._effective_resistances)\n        else:\n            print(\"Re-computing all effective resistances\")\n            self.average_effective_resistance()\n            diameter = np.max(self._effective_resistances)\n\n        return diameter\n\n    def effective_resistance_closeness_centrality(self, a):\n        \"\"\"\n        The effective resistance closeness centrality (ERCC) of node a\n\n        :type a: int\n        :arg a: index of the \"source\" node\n\n        :rtype: NumPy float\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork()\n        >>> print(\"%.3f\" % res.effective_resistance_closeness_centrality(0))\n        0.154\n        >>> print(\"%.3f\" % res.effective_resistance_closeness_centrality(4))\n        0.080\n        \"\"\"\n\n        # alloc\n        ERCC = DFIELD(0.0)\n\n        # compute\n        for i in range(self.N):\n            ERCC += self.effective_resistance(a, i)\n        # ERCC /=  np.square( self.N - 1 )\n        ERCC = (self.N - 1) / ERCC\n\n        # return\n        return ERCC\n\n    def vertex_current_flow_betweenness(self, i):\n        r\"\"\"\n        Vertex Current Flow Betweeness (VCFB) of a node i.\n\n        The electrial version of Newmann's node betweeness is here\n        defined as the Vertex Current Flow Betweeness (VCGB) of a node\n\n        .. math::\n            VCFB_i := \\frac{ 2 }{ n \\left( n-1 \\right)} \\sum_{s<t} I_i^{st}\n\n        where\n\n        .. math::\n            I_i^{st} &= \\frac{1}{2}\\sum_{j} \\Gamma_{i,j} | V_i - V_j |\\\\\n                     &= \\frac{1}{2}\\sum_{j} \\Gamma_{i,j}\n                     | I_s(R_{i,s}-R_{j,s}) + I_t(R_{j,t}-R_{i,t}) |\n\n        and further:\n            - :math:`I_{s}^{st} := I_{s}`\n            - :math:`I_{t}^{st}  := I_{t}`\n            - :math:`\\Gamma` is the admittance matrix\n            - :math:`R` is the pseudoinverse of the admittance Laplacian\n\n        :arg int a: index of the \"source\" node\n        :rtype: NumPy float\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork()\n        >>> print(\"%.3f\" % res.vertex_current_flow_betweenness(1))\n        0.389\n        >>> print(\"%.3f\" % res.vertex_current_flow_betweenness(2))\n        0.044\n        \"\"\"\n        # set params\n        Is = It = FIELD(1.0)\n        return _vertex_current_flow_betweenness(\n            self.N, Is, It,\n            to_cy(self.get_admittance(), FIELD), to_cy(self.get_R(), FIELD), i)\n\n    def edge_current_flow_betweenness(self):\n        \"\"\"The electrial version of Newmann's edge betweeness\n\n        :rtype: NumPy float\n\n        **Examples:**\n\n        >>> res = ResNetwork.SmallTestNetwork()\n        >>> print(r(res.edge_current_flow_betweenness()))\n        [[ 0.      0.4     0.      0.      0.    ]\n         [ 0.4     0.      0.2444  0.5333  0.    ]\n         [ 0.      0.2444  0.      0.2444  0.    ]\n         [ 0.      0.5333  0.2444  0.      0.4   ]\n         [ 0.      0.      0.      0.4     0.    ]]\n        >>> # update to unit resistances\n        >>> res.update_resistances(res.adjacency)\n        >>> print(r(res.edge_current_flow_betweenness()))\n        [[ 0.      0.4     0.      0.      0.    ]\n         [ 0.4     0.      0.3333  0.4     0.    ]\n         [ 0.      0.3333  0.      0.3333  0.    ]\n         [ 0.      0.4     0.3333  0.      0.4   ]\n         [ 0.      0.      0.      0.4     0.    ]]\n        \"\"\"\n        # set currents\n        Is = It = FIELD(1)\n\n        return _edge_current_flow_betweenness(\n            self.N, Is, It,\n            to_cy(self.get_admittance(), FIELD), to_cy(self.get_R(), FIELD))\n\n\n###############################################################################\n# ##                       FUNCTIONS ATTIC                                 ## #\n###############################################################################\n\n    # These functions are no longer needed as the computation can be broken\n    # down to some indexing but they are kept as implementatin references\n    # since all git logs will be lost when adding resnw to pyunicorn.\n    #\n    #\n    # def _effective_resistance_python(self,a,b):\n    #     \"\"\"Python version of the effective resistance\n    #     \"\"\"\n    #     # Get pseudoinverse of the Laplacian\n    #     R = self.get_R()\n\n    #     t = R[a,a] - R[a,b] - R[b,a] + R[b,b]\n    #     print(\"the t is %f + %fi \" % (t.real,t.imag))\n    #     # construct a vector that is all zero except for\n    #     # the source (a) and the sink (b)\n    #     # if self.flagComplex:\n    #     #     base = np.zeros(self.N,dtype=complex)\n    #     # else:\n    #     base = np.zeros(self.N)\n\n    #     base[a] = 1;\n    #     base[b] = -1;\n\n    #     # multiply every row of R with the above vector\n    #     # and sum across rows => np.sum(R * base, axis=1) and then\n    #     # build the scalar product of the result and the base vector\n    #     ER = np.dot( np.sum(R * base, axis=1), base )\n\n    #     return ER\n\n    # def _effective_resistance_weave(self,a,b):\n    #     \"\"\" C version of effective resistance\n    #     \"\"\"\n    #     # Get pseudoinverse of the Laplacian\n    #     R = self.get_R()\n    #     N = np.float( self.N)\n\n    #     code = \\\n    #     \"\"\"\n    #     int i=0;\n    #     int j=0;\n    #     double ER = 0.0;\n\n    #     // vector for temp values\n    #     double tmp[int(N)];\n\n    #     // setup the base vector\n    #     double base[int(N)];\n\n    #     base[a] = 1;\n    #     base[b] = -1;\n\n    #     for(i=0;i<N; i++){\n    #         for (j=0; j<N; j++){\n    #             tmp[i] += R2(i,j) * base[j];\n    #         } //for j\n    #         ER += base[i] * tmp[i];\n    #     } // for i\n\n    #     return_val = ER;\n    #     \"\"\"\n    #     variables = ['a','b','N','R'];\n    #     ER = weave.inline(code,variables,compiler = \"gcc\")\n    #     return ER\n\n    # def _effective_resistance_weave_complex(self,a,b):\n    #     \"\"\" C version of effective resistance\n    #     \"\"\"\n    #     # Get pseudoinverse of the Laplacian\n    #     R = self.get_R()\n    #     N = np.float( self.N)\n\n    #     code = \\\n    #     \"\"\"\n    #     int i=0;\n    #     int j=0;\n    #     std::complex<double> ER = 0.0;\n\n    #     // vector for base and values\n    #     std::complex<double> base[int(N)];\n    #     base[a].real() = 1;\n    #     base[b].real() = -1;\n\n    #     // vector for temp values\n    #     std::complex<double> tmp[int(N)];\n\n    #     /*\n    #     tmp = (double*) calloc(N,sizeof(double));\n\n    #    /// handling of complex numbers via struct definition\n    #     // struct describing complex no.\n    #      typedef struct {\n    #         double real;\n    #         double imag;\n    #     } complex_def;\n\n    #     complex_def *base;\n\n    #     base = calloc(N * sizeof(*array));\n\n    #     */\n\n    #     for(i=0;i<N; i++){\n    #         for (j=0; j<N; j++){\n    #             tmp[i] += R2(i,j) * base[j];\n    #         } //for j\n    #         ER += base[i] * tmp[i];\n    #     } // for i\n\n    #     return_val = ER;\n    #     \"\"\"\n    #     variables = ['a','b','N','R'];\n    #     ER = weave.inline(code,variables,compiler = \"gcc\",\n    #         headers=[\"<complex.h>\"])\n    #     return ER\n"
  },
  {
    "path": "src/pyunicorn/core/spatial_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides class for analyzing spatially embedded complex networks.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable\n\nimport numpy as np\nfrom numpy import random\nimport igraph\n\nfrom ._ext.types import to_cy, ADJ, NODE, FIELD, DEGREE\nfrom ._ext.numerics import _randomly_rewire_geomodel_I, \\\n    _randomly_rewire_geomodel_II, _randomly_rewire_geomodel_III\n\nfrom .network import Network\nfrom .grid import Grid\n\n\nclass SpatialNetwork(Network):\n    \"\"\"\n    Encapsulates a spatially embedded network.\n\n    Adds more network measures and statistics based on the\n    spatial embedding.\n    \"\"\"\n\n    #\n    #  Definitions of internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, grid: Grid, adjacency=None, edge_list=None,\n                 directed=False, silence_level=0):\n        \"\"\"\n        Initialize an instance of SpatialNetwork.\n\n        :type grid: :class:`.Grid`\n        :arg grid: The Grid object describing the network's spatial embedding.\n        :type adjacency: 2D array (int8) [index, index]\n        :arg adjacency: The network's adjacency matrix.\n        :type edge_list: array-like list of lists\n        :arg  edge_list: Edge list of the new network.\n                         Entries [i,0], [i,1] contain the end-nodes of an edge.\n        :arg bool directed: Determines, whether the network is treated as\n            directed.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        assert isinstance(grid, Grid)\n        self.grid: Grid = grid\n        \"\"\"(Grid) - Grid object describing the network's spatial embedding\"\"\"\n\n        #  Call constructor of parent class Network\n        Network.__init__(self, adjacency=adjacency, edge_list=edge_list,\n                         directed=directed, silence_level=silence_level)\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        return Network.__cache_state__(self) + (self.grid,)\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of the SpatialNetwork object.\n        \"\"\"\n        return f'SpatialNetwork:\\n{Network.__str__(self)}'\n\n    #\n    #  Load and save GeoNetwork object\n    #\n\n    # pylint: disable=keyword-arg-before-vararg\n    def save(self, filename, fileformat=None, *args, **kwds):\n        \"\"\"\n        Save the SpatialNetwork object to files.\n\n        Unified writing function for graphs. Relies on and partially extends\n        the corresponding igraph function. Refer to igraph documentation for\n        further details on the various writer methods for different formats.\n\n        This method tries to identify the format of the graph given in\n        the first parameter (based on extension) and calls the corresponding\n        writer method.\n\n        Existing node and link attributes/weights are also stored depending\n        on the chosen file format. E.g., the formats GraphML and gzipped\n        GraphML are able to store both node and link weights.\n\n        The grid is not stored if the corresponding filename is None.\n\n        The remaining arguments are passed to the writer method without\n        any changes.\n\n        :arg tuple/list filename: Tuple or list of two strings, namely\n            the paths to the files where the Network object and the\n            GeoGrid object are to be stored (filename_network, filename_grid)\n        :arg str fileformat: the format of the file (if one wants to override\n            the format determined from the filename extension, or the filename\n            itself is a stream). ``None`` means auto-detection.  Possible\n            values are: ``\"ncol\"`` (NCOL format), ``\"lgl\"`` (LGL format),\n            ``\"graphml\"``, ``\"graphmlz\"`` (GraphML and gzipped GraphML format),\n            ``\"gml\"`` (GML format), ``\"dot\"``, ``\"graphviz\"`` (DOT format, used\n            by GraphViz), ``\"net\"``, ``\"pajek\"`` (Pajek format), ``\"dimacs\"``\n            (DIMACS format), ``\"edgelist\"``, ``\"edges\"`` or ``\"edge\"`` (edge\n            list), ``\"adjacency\"`` (adjacency matrix), ``\"pickle\"`` (Python\n            pickled format), ``\"svg\"`` (Scalable Vector Graphics).\n        \"\"\"\n        try:\n            (filename_network, filename_grid) = filename\n        except ValueError as e:\n            raise ValueError(\"'filename' must be a tuple or list of two \"\n                             \"items: filename_network, filename_grid\") from e\n        #  Store network\n        Network.save(self, filename=filename_network, fileformat=fileformat,\n                     *args, **kwds)\n\n        #  Store grid\n        if filename_grid is not None:\n            self.grid.save(filename=filename_grid)\n\n    # pylint: disable=keyword-arg-before-vararg\n    @staticmethod\n    def Load(filename, fileformat=None, silence_level=0, *args, **kwds):\n        \"\"\"\n        Return a SpatialNetwork object stored in files.\n\n        Unified reading function for graphs. Relies on and partially extends\n        the corresponding igraph function. Refer to igraph documentation for\n        further details on the various reader methods for different formats.\n\n        This method tries to identify the format of the graph given in\n        the first parameter and calls the corresponding reader method.\n\n        Existing node and link attributes/weights are also restored depending\n        on the chosen file format. E.g., the formats GraphML and gzipped\n        GraphML are able to store both node and link weights.\n\n        The remaining arguments are passed to the reader method without\n        any changes.\n\n        :arg tuple/list filename: Tuple or list of two strings, namely\n            the paths to the files containing the Network object and the\n            Grid object (filename_network, filename_grid)\n        :arg str fileformat: the format of the file (if known in advance)\n          ``None`` means auto-detection. Possible values are: ``\"ncol\"`` (NCOL\n          format), ``\"lgl\"`` (LGL format), ``\"graphml\"``, ``\"graphmlz\"``\n          (GraphML and gzipped GraphML format), ``\"gml\"`` (GML format),\n          ``\"net\"``, ``\"pajek\"`` (Pajek format), ``\"dimacs\"`` (DIMACS format),\n          ``\"edgelist\"``, ``\"edges\"`` or ``\"edge\"`` (edge list),\n          ``\"adjacency\"`` (adjacency matrix), ``\"pickle\"`` (Python pickled\n          format).\n        :arg int silence_level: The inverse level of verbosity of the object.\n        :rtype: SpatialNetwork object\n        :return: :class:`SpatialNetwork` instance.\n        \"\"\"\n        try:\n            (filename_network, filename_grid) = filename\n        except ValueError as e:\n            raise ValueError(\"'filename' must be a tuple or list of two \"\n                             \"items: filename_network, filename_grid\") from e\n\n        #  Load Grid object\n        grid = Grid.Load(filename_grid)\n\n        #  Load to igraph Graph object\n        graph = igraph.Graph.Read(f=filename_network, format=fileformat,\n                                  *args, **kwds)\n\n        #  Extract adjacency matrix\n        A = np.array(graph.get_adjacency(type=2).data)\n\n        #  Create GeoNetwork instance\n        net = SpatialNetwork(grid=grid, adjacency=A,\n                             directed=graph.is_directed(),\n                             silence_level=silence_level)\n\n        #  Extract node weights\n        if \"node_weight_nsi\" in graph.vs.attribute_names():\n            node_weights = \\\n                np.array(graph.vs.get_attribute_values(\"node_weight_nsi\"))\n            net.node_weights = node_weights\n\n        #  Overwrite igraph Graph object in Network instance to restore link\n        #  attributes/weights\n        net.graph = graph\n        #  invalidate cache\n        net._mut_la += 1\n        return net\n\n    @staticmethod\n    def SmallTestNetwork():\n        \"\"\"\n        Return a 6-node undirected geographically embedded test network.\n\n        The test network consists of the SmallTestNetwork of the Network class\n        with node coordinates given by the SmallTestGrid of the Grid class.\n\n        The network looks like this::\n\n                3 - 1\n                |   | \\\\\n            5 - 0 - 4 - 2\n\n        :rtype: SpatialNetwork object\n        :return: :class:`SpatialNetwork` instance for testing purposes.\n        \"\"\"\n        return SpatialNetwork(grid=Grid.SmallTestGrid(),\n                              adjacency=Network.SmallTestNetwork().adjacency,\n                              directed=False, silence_level=2)\n\n    @staticmethod\n    def Model(network_model, grid, **kwargs):\n        \"\"\"\n        Return a new model graph generated with the specified network model\n        and embedded on the specified spatial grid\n        \"\"\"\n        A = getattr(SpatialNetwork, network_model)(**kwargs)\n        return SpatialNetwork(grid, A)\n\n    #\n    #  Graph randomization methods\n    #\n\n    #  TODO: Experimental code!\n    def randomly_rewire_geomodel_I(self, distance_matrix, iterations,\n                                   inaccuracy):\n        \"\"\"\n        Randomly rewire the current network in place using geographical\n        model I.\n\n        Geographical model I preserves the degree sequence (exactly) and the\n        link distance distribution :math:`p(l)` (approximately).\n\n        A higher ``inaccuracy`` in the conservation of :math:`p(l)` will lead\n        to\n\n          - less deterministic links in the network and, hence,\n          - more degrees of freedom for the random graph and\n          - a shorter runtime of the algorithm, since more pairs of nodes\n            eligible for rewiring can be found.\n\n        **Example** (The degree sequence should be the same after rewiring):\n\n        >>> net = SpatialNetwork.SmallTestNetwork()\n        >>> net.randomly_rewire_geomodel_I(\n        ...     distance_matrix=net.grid.distance(),\n        ...     iterations=100, inaccuracy=100)\n        #\n        >>> net.degree()\n        array([3, 3, 2, 2, 3, 1])\n\n        :type distance_matrix: 2D Numpy array [index, index]\n        :arg distance_matrix: Suitable distance matrix between nodes.\n\n        :type iterations: number (int)\n        :arg iterations: The number of rewirings to be performed.\n\n        :type inaccuracy: number (float)\n        :arg inaccuracy: The inaccuracy with which to conserve :math:`p(l)`.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Randomly rewiring given graph, preserving the degree \"\n                  \"sequence and link distance distribution...\")\n        #  Get number of links\n        E = self.n_links\n        #  Collect adjacency and distance matrices\n        A = to_cy(self.adjacency, ADJ)\n        D = to_cy(distance_matrix, FIELD)\n        #  Get degree sequence\n        # degree = self.degree()\n\n        #  Define for brevity\n        eps = float(inaccuracy)\n\n        # iterations = int(iterations)\n\n        #  Get edge list\n        edges = to_cy(np.array(self.graph.get_edgelist()), NODE)\n\n        _randomly_rewire_geomodel_I(iterations, eps, A, D, E, edges)\n\n        #  Update all other properties of GeoNetwork\n        self.adjacency = A\n\n    #  TODO: Experimental code!\n    def randomly_rewire_geomodel_II(self, distance_matrix,\n                                    iterations, inaccuracy):\n        \"\"\"\n        Randomly rewire the current network in place using geographical\n        model II.\n\n        Geographical model II preserves the degree sequence :math:`k_v`\n        (exactly), the link distance distribution :math:`p(l)` (approximately),\n        and the average link distance sequence :math:`<l>_v` (approximately).\n\n        A higher ``inaccuracy`` in the conservation of :math:`p(l)` and\n        :math:`<l>_v` will lead to:\n\n          - less deterministic links in the network and, hence,\n          - more degrees of freedom for the random graph and\n          - a shorter runtime of the algorithm, since more pairs of nodes\n            eligible for rewiring can be found.\n\n        :type distance_matrix: 2D Numpy array [index, index]\n        :arg distance_matrix: Suitable distance matrix between nodes.\n\n        :type iterations: number (int)\n        :arg iterations: The number of rewirings to be performed.\n\n        :type inaccuracy: number (float)\n        :arg inaccuracy: The inaccuracy with which to conserve :math:`p(l)`.\n        \"\"\"\n        #  FIXME: Add example\n        if self.silence_level <= 1:\n            print(\"Randomly rewiring given graph, preserving the degree \"\n                  \"sequence, link distance distribution and average link \"\n                  \"distance sequence...\")\n\n        #  Get number of links\n        E = int(self.n_links)\n        #  Collect adjacency and distance matrices\n        A = to_cy(self.adjacency, ADJ)\n        D = to_cy(distance_matrix, FIELD)\n\n        #  Define for brevity\n        eps = float(inaccuracy)\n\n        #  Get edge list\n        edges = to_cy(np.array(self.graph.get_edgelist()), NODE)\n\n        _randomly_rewire_geomodel_II(iterations, eps, A, D, E, edges)\n\n        #  Set new adjacency matrix\n        self.adjacency = A\n\n    #  TODO: Experimental code!\n    def randomly_rewire_geomodel_III(self, distance_matrix,\n                                     iterations, inaccuracy):\n        \"\"\"\n        Randomly rewire the current network in place using geographical\n        model III.\n\n        Geographical model III preserves the degree sequence :math:`k_v`\n        (exactly), the link distance distribution :math:`p(l)` (approximately),\n        and the average link distance sequence :math:`<l>_v` (approximately).\n        Moreover, degree-degree correlations are also conserved exactly.\n\n        A higher ``inaccuracy`` in the conservation of :math:`p(l)` and\n        :math:`<l>_v` will lead to:\n\n          - less deterministic links in the network and, hence,\n          - more degrees of freedom for the random graph and\n          - a shorter runtime of the algorithm, since more pairs of nodes\n            eligible for rewiring can be found.\n\n        :type distance_matrix: 2D Numpy array [index, index]\n        :arg distance_matrix: Suitable distance matrix between nodes.\n\n        :type iterations: number (int)\n        :arg iterations: The number of rewirings to be performed.\n\n        :type inaccuracy: number (float)\n        :arg inaccuracy: The inaccuracy with which to conserve :math:`p(l)`.\n        \"\"\"\n        #  FIXME: Add example\n        if self.silence_level <= 1:\n            print(\"Randomly rewiring given graph, preserving the degree \"\n                  \"sequence, degree-degree correlations, link distance \"\n                  \"distribution and average link distance sequence...\")\n\n        #  Get number of nodes\n        #  Get number of links\n        E = int(self.n_links)\n        #  Collect adjacency and distance matrices\n        A = to_cy(self.adjacency, ADJ)\n        D = to_cy(distance_matrix, FIELD)\n        #  Get degree sequence\n        degree = to_cy(self.degree(), DEGREE)\n\n        #  Define for brevity\n        eps = float(inaccuracy)\n\n        #  Get edge list\n        edges = to_cy(np.array(self.graph.get_edgelist()), NODE)\n\n        _randomly_rewire_geomodel_III(iterations, eps, A, D, E, edges, degree)\n\n        #  Set new adjacency matrix\n        self.adjacency = A\n\n    def set_random_links_by_distance(self, a, b):\n        \"\"\"\n        Reassign links independently with\n        link probability = :math:`exp(a + b*angular distance)`.\n\n        .. note::\n           Modifies network in place, creates an undirected network!\n\n        **Example** (Repeat until a network with 5 links is created):\n\n        >>> net = GeoNetwork.SmallTestNetwork()\n        >>> while (net.n_links != 5):\n        ...     net.set_random_links_by_distance(a=0., b=-4.)\n        >>> net.n_links\n        5\n\n        :type a: number (float)\n        :arg a: The a parameter.\n\n        :type b: number (float)\n        :arg b: The b parameter.\n        \"\"\"\n        #  Get angular distance matrix\n        D = self.grid.distance()\n        #  Calculate link probabilities\n        p = np.exp(a + b * D)\n\n        #  Generate random numbers\n        P = random.random(D.shape)\n        #  Symmetrize\n        P = 0.5 * (P + P.transpose())\n\n        #  Create new adjacency matrix\n        A = (p >= P).astype(ADJ)\n        #  Set diagonal to zero - no self-loops!\n        np.fill_diagonal(A, 0)\n\n        #  Set new adjacency matrix\n        self.adjacency = A\n\n    #\n    #  Get link distance distribution\n    #\n\n    def link_distance_distribution(self, n_bins, grid_type=\"euclidean\",\n                                   geometry_corrected=False):\n        \"\"\"\n        Return the normalized link distance distribution.\n\n        Correct for the geometry of the embedding space by default.\n\n        **Examples:**\n\n        >>> GeoNetwork.SmallTestNetwork().link_distance_distribution(\n        ...     n_bins=4, geometry_corrected=False)[0]\n        array([ 0.14285714,  0.28571429,  0.28571429,  0.28571429])\n        >>> GeoNetwork.SmallTestNetwork().link_distance_distribution(\n        ...     n_bins=4, geometry_corrected=True)[0]\n        array([ 0.09836066,  0.24590164,  0.32786885,  0.32786885])\n\n        :arg int n_bins: The number of bins for histogram.\n        :arg str grid_type: Type of grid, used for distance calculation, can\n            take values \"euclidean\" and \"spherical\" (only for GeoNetwork).\n        :arg bool geometry_corrected: Toggles correction for grid geometry.\n        :rtype: tuple of three 1D arrays [bin]\n        :return: the link distance distribution, statistical error,\n                 and lower bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating link distance distribution...\")\n\n        #  Collect matrices\n        A = self.adjacency\n        if grid_type == \"spherical\":\n            if self.grid.__class__.__name__ != \"GeoGrid\":\n                raise NotImplementedError(\"Spherical coordinates are only \"\n                                          \"supported for GeoGrid!\")\n            D = self.grid.angular_distance()\n        elif grid_type == \"euclidean\":\n            D = self.grid.euclidean_distance()\n        else:\n            raise ValueError(\"Grid type unknown!\")\n\n        #  Determine range for link distance histograms\n        interval = (0, D.max())\n\n        #  Get link distance distribution\n        (dist, error, lbb) = self._histogram(D[A == 1], n_bins=n_bins,\n                                             interval=interval)\n\n        if geometry_corrected:\n            geometric_ld_dist = \\\n                self.grid.geometric_distance_distribution(n_bins)[0]\n            # Divide out the geometrical factor of the distribution\n            dist /= geometric_ld_dist\n\n        #  Normalize the distribution\n        dist /= dist.sum()\n\n        return (dist, error, lbb)\n\n    #\n    #  Distance related measures\n    #\n\n    #  (Un)directed average link distances\n\n    def _calculate_general_average_link_distance(self, adjacency, degree,\n                                                 geometry_corrected=False):\n        \"\"\"\n        Return general average link distances (:math:`ALD`).\n\n        This general method is called to calculate undirected average link\n        distance, average in-link distance and average out-link distance.\n\n        The resulting sequence can optionally be corrected for biases in\n        average link distance arising due to the grid geometry. E.g., for\n        regional networks, nodes on the boundaries may have a bias towards\n        larger values of :math:`ALD`, while nodes in the center have a bias\n        towards smaller values of :math:`ALD`.\n\n        :type adjacency: 2D array [index, index]\n        :arg adjacency: The adjacency matrix.\n        :type degree: 1D array [index]\n        :arg degree: The degree sequence.\n        :arg bool geometry_corrected: Toggles geometry correction.\n        :rtype: 1D array [index]\n        :return: the general average link distance sequence.\n        \"\"\"\n        D = self.grid.distance()\n\n        average_link_distance = np.zeros(self.N)\n\n        #  Normalize by degree, not by number of nodes\n        average_link_distance[degree != 0] = \\\n            (D * adjacency).sum(axis=1)[degree != 0] / degree[degree != 0]\n\n        if geometry_corrected:\n            #  Calculate the average link distance for a fully connected\n            #  network to correct for geometrical biases, particularly in\n            #  regional networks.\n            ald_correction = D.mean(axis=1)\n\n            #  Correct average link distance\n            average_link_distance /= ald_correction\n\n        return average_link_distance\n\n    def average_link_distance(self, geometry_corrected=False):\n        \"\"\"\n        Return average link distances (undirected).\n\n        .. note::\n           Does not use directionality information.\n\n        **Examples:**\n\n        >>> SpatialNetwork.SmallTestNetwork().\\\n                average_link_distance(geometry_corrected=False)\n        array([22.36067963, 11.18033981,  8.38525486, 13.97542477, 16.77050908,\n               27.95084953])\n        >>> SpatialNetwork.SmallTestNetwork().\\\n                average_link_distance(geometry_corrected=True)[:-1]\n        array([1.6       , 1.09090909, 1.        , 1.66666667, 1.63636357])\n\n        :arg bool geometry_corrected: Toggles geometry correction.\n        :rtype: 1D array [index]\n        :return: the average link distance sequence (undirected).\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating average link distance...\")\n\n        A = self.undirected_adjacency().toarray()\n        degree = self.degree()\n\n        return self._calculate_general_average_link_distance(\n            A, degree, geometry_corrected=geometry_corrected)\n\n    def inaverage_link_distance(self, geometry_corrected=False):\n        \"\"\"\n        Return in-average link distances.\n\n        Return regular average link distance for undirected networks.\n\n        **Example:**\n\n        >>> SpatialNetwork.SmallTestNetwork().\\\n                inaverage_link_distance(geometry_corrected=False)\n        array([22.36067963, 11.18033981,  8.38525486, 13.97542477, 16.77050908,\n               27.95084953])\n\n        :arg bool geometry_corrected: Toggles geometry correction.\n        :rtype: 1D array [index]\n        :return: the in-average link distance sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating in-average link distance...\")\n\n        A = self.adjacency.T\n        in_degree = self.indegree()\n\n        return self._calculate_general_average_link_distance(\n            A, in_degree, geometry_corrected=geometry_corrected)\n\n    def outaverage_link_distance(self, geometry_corrected=False):\n        \"\"\"\n        Return out-average link distances.\n\n        Return regular average link distance for undirected networks.\n\n        **Example:**\n\n        >>> SpatialNetwork.SmallTestNetwork().\n                outaverage_link_distance(geometry_corrected=False)\n        array([22.36067963, 11.18033981,  8.38525486, 13.97542477, 16.77050908,\n               27.95084953])\n\n        :arg bool geometry_corrected: Toggles geometry correction.\n        :rtype: 1D array [index]\n        :return: the out-average link distance sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating out-average link distance...\")\n\n        A = self.adjacency\n        out_degree = self.outdegree()\n\n        return self._calculate_general_average_link_distance(\n            A, out_degree, geometry_corrected=geometry_corrected)\n\n    def max_link_distance(self):\n        \"\"\"\n        Return maximum angular geodesic link distances.\n\n        .. note::\n           Does not use directionality information.\n\n        **Example:**\n\n        >>> SpatialNetwork.SmallTestNetwork().max_link_distance()\n        array([27.95085, 16.77051, 11.18034, 16.77051, 22.36068, 27.95085],\n              dtype=float32)\n\n        :rtype: 1D Numpy array [index]\n        :return: the maximum link distance sequence.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating maximum link distance...\")\n\n        A = self.undirected_adjacency().toarray()\n        D = self.grid.distance()\n\n        maximum_link_distance = (D * A).max(axis=1)\n        return maximum_link_distance\n\n    #\n    #  Link weighted network measures\n    #\n\n    def distance(self):\n        \"\"\"\n        Return the distance matrix.\n        \"\"\"\n        dist = self.grid.distance()\n        if not self.find_link_attribute('distance'):\n            self.set_link_attribute('distance', dist)\n        return dist\n\n    def average_distance_weighted_path_length(self):\n        \"\"\"\n        Return average distance weighted path length.\n\n        Returns the average path length link-weighted by the angular\n        great circle distance between nodes.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                average_distance_weighted_path_length())\n        0.4985\n\n        :rtype: number (float)\n        :return: the average distance weighted path length.\n        \"\"\"\n        self.distance()\n        return self.average_path_length('distance')\n\n    def distance_weighted_closeness(self):\n        \"\"\"\n        Return distance weighted closeness.\n\n        Returns the sequence of closeness centralities link-weighted by the\n        angular great circle distance between nodes.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                distance_weighted_closeness())\n        array([ 2.2378, 2.4501, 2.2396, 2.4501, 2.2396, 1.1982])\n\n        :rtype: 1D Numpy array [index]\n        :return: the distance weighted closeness sequence.\n        \"\"\"\n        self.distance()\n        return self.closeness('distance')\n\n    def local_distance_weighted_vulnerability(self):\n        \"\"\"\n        Return local distance weighted vulnerability.\n\n        Return the sequence of vulnerabilities link-weighted by\n        the angular great circle distance between nodes.\n\n        **Example:**\n\n        >>> r(GeoNetwork.SmallTestNetwork().\\\n                local_distance_weighted_vulnerability())\n        array([ 0.0325, 0.3137, 0.2056, 0.028 , -0.0283, -0.288 ])\n\n        :rtype: 1D Numpy array [index]\n        :return: the local distance weighted vulnerability sequence.\n        \"\"\"\n        self.distance()\n        return self.local_vulnerability('distance')\n"
  },
  {
    "path": "src/pyunicorn/eventseries/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\neventseries\n===========\n\nProvides a class for analyzing event series, namely event synchronization and\nevent coincidence analysis\n\nRelated Publications\n~~~~~~~~~~~~~~~~~~~~\n[Quiroga2002]_, [Boers2014]_, [Donges2016]_, [Odenweller2020]_, [Kreuz2007]_,\n[Marwan2015]_, [Schleussner2016]_.\n\nTo do\n~~~~~\n  - Combine precursor and trigger coincidence rate to obtain one ECA measure\n\"\"\"\n\nfrom .event_series import EventSeries\n"
  },
  {
    "path": "src/pyunicorn/eventseries/event_series.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides class for event series analysis, namely event synchronization (ES) and\nevent coincidence analysis (ECA). In addition, a method for the generation of\nbinary event series from continuous time series data is included.\nWhen instantiating a class, data must either be passed as an event\nmatrix (for details see below) or as a continuous time series. Using the class,\nan ES or ECA matrix can be calculated to generate a climate network using the\nEventSeriesClimateNetwork class. Both ES and ECA may be called without\ninstantiating an object of the class.\nSignificance levels are provided using analytic calculations using Poisson\npoint processes as a null model (for ECA only) or a Monte Carlo approach.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable\n\nimport warnings\n\nimport numpy as np\nfrom scipy import stats\n\nfrom ..core.cache import Cached\n\n\nclass EventSeries(Cached):\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, data, timestamps=None, taumax=np.inf, lag=0.0,\n                 threshold_method=None, threshold_values=None,\n                 threshold_types=None):\n        \"\"\"\n        Initialize an instance of EventSeries. Input data must be a 2D numpy\n        array with time as the first axis and variables as the second axis.\n        Event data is stored as an eventmatrix.\n\n        Format of eventmatrix:\n        An eventmatrix is a 2D numpy array with the first dimension covering\n        the timesteps and the second dimensions covering the variables. Each\n        variable at a specific timestep is either '1' if an event occured or\n        '0' if it did not, e.g. for 3 variables with 10 timesteps the\n        eventmatrix could look like\n\n            array([[0, 1, 0],\n                   [1, 0, 1],\n                   [0, 0, 0],\n                   [1, 0, 1],\n                   [0, 1, 0],\n                   [0, 0, 0],\n                   [1, 0, 0],\n                   [0, 0, 1],\n                   [0, 1, 0],\n                   [0, 0, 0]])\n\n        If input data is not provided as an eventmatrix, the constructor tries\n        to generate one using the make_event_matrix method. Default keyword\n        arguments are used in this case.\n\n        :type data: 2D Numpy array [time, variables]\n        :arg data: Event series array or array of non-binary variable values\n        :type timestamps: 1D Numpy array\n        :arg timestamps: Time points of events of data. If not provided,\n                        integer values are used\n        :type taumax: float\n        :arg taumax: maximum time difference between two events to be\n                    considered synchronous. Caution: For ES, the default is\n                    np.inf because of the intrinsic dynamic coincidence\n                    interval in ES. For ECA, taumax is a parameter of the\n                    method that needs to be defined!\n        :type lag: float\n        :arg lag: extra time lag between the event series\n        :type threshold_method: str 'quantile' or 'value' or 1D numpy array or\n                                str 'quantile' or 'value'\n        :arg threshold_method: specifies the method for generating a binary\n                               event matrix from an array of continuous time\n                               series. Default: None\n        :type threshold_values: 1D Numpy array or float\n        :arg threshold_values: quantile or real number determining threshold\n                               for each variable. Default: None.\n        :type threshold_types: str 'above' or 'below' or 1D list of strings\n                               'above' or 'below'\n        :arg threshold_types: Determines for each variable if event is below\n                              or above threshold\n        \"\"\"\n\n        if threshold_method is None:\n            # Check if data contains only binary values\n            if len(np.unique(data)) != 2 or not (\n                    np.unique(data) == np.array([0, 1])).all():\n                raise IOError(\"Event matrix not in correct format\")\n\n            # Save event matrix\n            self.__T = data.shape[0]\n            self.__N = data.shape[1]\n            self.__eventmatrix = data\n\n        else:\n            # If data is not in eventmatrix format, use method\n            # make_event_matrix to transform continuous time series to a binary\n            # time series\n            # Allow for wrong axis, i.e. first axis variables and second axis\n            # time if time series have the same length\n            if isinstance(data, np.ndarray):\n                if data.shape[1] > data.shape[0]:\n                    data = np.swapaxes(data, 0, 1)\n\n                self.__eventmatrix = \\\n                    self.make_event_matrix(data,\n                                           threshold_method=threshold_method,\n                                           threshold_values=threshold_values,\n                                           threshold_types=threshold_types)\n\n                self.__T = self.__eventmatrix.shape[0]\n                self.__N = self.__eventmatrix.shape[1]\n\n            else:\n                raise IOError('Input data is not in event matrix format!')\n\n        # If no timestamps are given, use integer array indices as timestamps\n        if timestamps is not None:\n            if timestamps.shape[0] != self.__T:\n                raise IOError(\"Timestamps array has not the same length as\"\n                              \" event matrix!\")\n            self.__timestamps = timestamps\n        else:\n            self.__timestamps = np.linspace(0.0, self.__T - 1, self.__T)\n\n        self.__taumax = float(taumax)\n        self.__lag = float(lag)\n\n        # save number of events\n        NrOfEvs = np.array(np.sum(self.__eventmatrix, axis=0), dtype=int)\n        self.__nrofevents = NrOfEvs\n\n        # Dictionary of symmetrization functions for later use\n        self.symmetrization_options = {\n            'directed': EventSeries._symmetrization_directed,\n            'symmetric': EventSeries._symmetrization_symmetric,\n            'antisym': EventSeries._symmetrization_antisym,\n            'mean': EventSeries._symmetrization_mean,\n            'max': EventSeries._symmetrization_max,\n            'min': EventSeries._symmetrization_min\n        }\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        # The following attributes are assumed immutable:\n        #   (__eventmatrix, __timestamps, __taumax, __lag)\n        return ()\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of the EventSeries object.\n        \"\"\"\n        return (f\"EventSeries: {self.__N} variables, \"\n                f\"{self.__T} timesteps, taumax: {self.__taumax:.1f}, \"\n                f\"lag: {self.__lag:.1f}\")\n\n    def get_event_matrix(self):\n        return self.__eventmatrix\n\n    @staticmethod\n    def _symmetrization_directed(matrix):\n        \"\"\"\n        Helper function for symmetrization options\n\n        :type matrix: 2D numpy array\n        :arg matrix: pairwise ECA/ES scores of data\n        :rtype: 2D numpy array\n        :return: original matrix\n        \"\"\"\n        return matrix\n\n    @staticmethod\n    def _symmetrization_symmetric(matrix):\n        \"\"\"\n        Helper function for symmetrization options\n\n        :type matrix: 2D numpy array\n        :arg matrix: pairwise ECA/ES scores of data\n        :rtype: 2D numpy array\n        :return: symmetrized matrix\n        \"\"\"\n        return matrix + matrix.T\n\n    @staticmethod\n    def _symmetrization_antisym(matrix):\n        \"\"\"\n        Helper function for symmetrization options\n\n        :type matrix: 2D numpy array\n        :arg matrix: pairwise ECA/ES scores of data\n        :rtype: 2D numpy array\n        :return: antisymmetrized matrix\n        \"\"\"\n        return matrix - matrix.T\n\n    @staticmethod\n    def _symmetrization_mean(matrix):\n        \"\"\"\n        Helper function for symmetrization options\n\n        :type matrix: 2D numpy array\n        :arg matrix: pairwise ECA/ES scores of data\n        :rtype: 2D numpy array\n        :return: symmetrized matrix using element-wise mean of matrix and\n                 transposed matrix\n        \"\"\"\n        return np.mean([matrix, matrix.T], axis=0)\n\n    @staticmethod\n    def _symmetrization_max(matrix):\n        \"\"\"\n        Helper function for symmetrization options\n\n        :type matrix: 2D numpy array\n        :arg matrix: pairwise ECA/ES scores of data\n        :rtype: 2D numpy array\n        :return: symmetrized matrix using element-wise maximum of matrix and\n                 transposed matrix\n        \"\"\"\n        return np.maximum(matrix, matrix.T)\n\n    @staticmethod\n    def _symmetrization_min(matrix):\n        \"\"\"\n        Helper function for symmetrization options\n\n        :type matrix: 2D numpy array\n        :arg matrix: pairwise ECA/ES scores of data\n        :rtype: 2D numpy array\n        :return: symmetrized matrix using element-wise minimum of matrix and\n                 transposed matrix\n        \"\"\"\n        return np.minimum(matrix, matrix.T)\n\n    @staticmethod\n    def make_event_matrix(data, threshold_method='quantile',\n                          threshold_values=None, threshold_types=None):\n        \"\"\"\n        Create a binary event matrix from continuous time series data. Data\n        format is eventmatrix, i.e. a 2D numpy array with first dimension\n        covering time and second dimension covering the values of the\n        variables.\n\n        :type data: 2D numpy array\n        :arg data: Continuous input data\n        :type threshold_method: str 'quantile' or 'value' or 1D numpy array of\n                                strings 'quantile' or 'value'\n        :arg threshold_method: specifies the method for generating a binary\n                               event matrix from an array of continuous time\n                               series. Default: 'quantile'\n        :type threshold_values: 1D Numpy array or float\n        :arg threshold_values: quantile or real number determining threshold\n                               for each variable. Default: None.\n        :type threshold_types: str 'above' or 'below' or 1D list of strings\n                               'above' or 'below'\n        :arg threshold_types: Determines for each variable if event is below or\n                              above threshold\n        :rtype: 2D numpy array\n        :return: eventmatrix\n        \"\"\"\n\n        # Check correct format of event matrix\n        if not np.all([len(i) == len(data[0]) for i in data]):\n            warnings.warn(\"Data does not contain equal number of events\")\n\n        data_axswap = np.swapaxes(data, 0, 1)\n        thresholds = np.zeros(data.shape[1])\n\n        # Check if inserted keyword arguments are correct and create parameter\n        # arrays in case only single keywords are used for data with more than\n        # one variable\n        threshold_method = np.array(threshold_method)\n        if threshold_method.shape == (data.shape[1],):\n            if not np.all([i in ['quantile', 'value'] for i in\n                           threshold_method]):\n                raise IOError(\"'threshold_method' must be either 'quantile' or\"\n                              \" 'value' or a 1D array-like object with\"\n                              \" entries 'quantile' or 'value' for each\"\n                              \" variable!\")\n        elif not threshold_method.shape:\n            if threshold_method in ['quantile', 'value']:\n                threshold_method = np.array([threshold_method] * data.shape[1])\n            else:\n                raise IOError(\"'threshold_method' must be either 'quantile' or\"\n                              \" 'value' or a 1D array-like object with entries\"\n                              \" 'quantile' or 'value' for each variable!\")\n        else:\n            raise IOError(\"'threshold_method' must be either 'quantile' or \"\n                          \"'value' or a 1D array-like object with entries \"\n                          \"'quantile' or 'value' for each variable!\")\n\n        if threshold_values is not None:\n            threshold_values = np.array(threshold_values)\n            if threshold_values.shape == (data.shape[1],):\n                if not np.all([isinstance(i, (float, int))\n                               for i in threshold_values]):\n                    raise IOError(\"'threshold_values' must be either float/int\"\n                                  \" or 1D array-like object of float/int for \"\n                                  \" each variable!\")\n            elif not threshold_values.shape:\n                if isinstance(threshold_values.item(), (int, float)):\n                    threshold_values = \\\n                        np.array([threshold_values] * data.shape[1])\n                else:\n                    raise IOError(\"'threshold_values' must be either float/int\"\n                                  \" or 1D array-like object of float/int for \"\n                                  \"each variable!\")\n            else:\n                raise IOError(\"'threshold_values' must be either float/int or \"\n                              \"1D array-like object of float/int for each \"\n                              \"variable!\")\n        else:\n            threshold_values = np.array([None] * data.shape[1])\n            warnings.warn(\"No 'threshold_values' given. Median is used by \"\n                          \"default!\")\n\n        if threshold_types is not None:\n            threshold_types = np.array(threshold_types)\n            if threshold_types.shape == (data.shape[1],):\n                if not np.all([i in ['above', 'below']\n                               for i in threshold_types]):\n                    raise IOError(\"'threshold_types' must be either 'above' or\"\n                                  \" 'below' or a 1D array-like object with \"\n                                  \"entries 'above' or 'below' for each \"\n                                  \"variable!\")\n            elif not threshold_types.shape:\n                if threshold_types in ['above', 'below']:\n                    threshold_types = \\\n                        np.array([threshold_types] * data.shape[1])\n                else:\n                    raise IOError(\"'threshold_types' must be either 'above' or\"\n                                  \" 'below' or a 1D array-like object with \"\n                                  \"entries 'above' or 'below' for each \"\n                                  \"variable!\")\n            else:\n                raise IOError(\"'threshold_types' must be either 'above' or \"\n                              \"'below' or a 1D array-like object with entries \"\n                              \"'above' or 'below' for each variable!\")\n        else:\n            threshold_types = np.array([None] * data.shape[1])\n            warnings.warn(\"No 'threshold_types' given. If 'threshold_values' \"\n                          \">= median, 'above' is used by default!\")\n\n        # Go through threshold_method, threshold_value and threshold_type\n        # for each variable and check if input parameters are valid\n        # In case of missing input parameters, try to set default values\n        for i in range(data.shape[1]):\n\n            if threshold_method[i] == 'quantile':\n\n                # Check if threshold quantile is between zero and one\n                if threshold_values[i] is not None:\n                    if threshold_values[i] > 1.0 or threshold_values[i] < 0.0:\n                        raise ValueError(\"Threshold_value for threshold_method\"\n                                         \" 'quantile' must lie between 0.0 and\"\n                                         \" 1.0!\")\n\n                # If threshold values are not given, use the median\n                else:\n                    threshold_values[i] = 0.5\n\n                # Compute threshold value according to quantile\n                thresholds[i] = \\\n                    np.quantile(data_axswap[i], threshold_values[i])\n\n                # If no threshold_types is given, check if threshold value is\n                # larger or equal median, then 'above'\n                if threshold_types[i] is None:\n                    if threshold_values[i] >= 0.5:\n                        threshold_types[i] = 'above'\n                    else:\n                        threshold_types[i] = 'below'\n\n            if threshold_method[i] == 'value':\n\n                if threshold_values[i] is None:\n                    thresholds[i] = np.median(data_axswap[i])\n                else:\n                    # Check if given threshold values lie within data range\n                    if np.max(data_axswap[i]) < threshold_values[i] or \\\n                            np.min(data_axswap[i]) > threshold_values[i]:\n                        raise IOError(\"Threshold_value for threshold_method \"\n                                      \"'value' must lie within variable \"\n                                      \"range!\")\n                    thresholds[i] = threshold_values[i]\n\n                if threshold_types[i] is None:\n                    if thresholds[i] >= np.median(data_axswap[i]):\n                        threshold_types[i] = 'above'\n                    else:\n                        threshold_types[i] = 'below'\n\n        # Other methods for thresholding can be easily added here\n\n        eventmatrix = np.zeros((data.shape[0], data.shape[1])) * (-1)\n        # Iterate through all variables of the data and create event matrix\n        # according to specified methods\n        for t in range(data.shape[0]):\n            for i in range(data.shape[1]):\n                if threshold_types[i] == 'above':\n                    if data[t][i] > thresholds[i]:\n                        eventmatrix[t][i] = 1\n                    else:\n                        eventmatrix[t][i] = 0\n                elif threshold_types[i] == 'below':\n                    if data[t][i] < thresholds[i]:\n                        eventmatrix[t][i] = 1\n                    else:\n                        eventmatrix[t][i] = 0\n\n        return eventmatrix\n\n    @staticmethod\n    # pylint: disable=too-many-positional-arguments\n    def event_synchronization(eventseriesx, eventseriesy, ts1=None, ts2=None,\n                              taumax=np.inf, lag=0.0):\n        \"\"\"\n        Calculates the directed event synchronization from two event series X\n        and Y using the algorithm described in [Quiroga2002]_,\n        [Odenweller2020]_\n\n        :type eventseriesx: 1D Numpy array\n        :arg eventseriesx: Event series containing '0's and '1's\n        :type eventseriesy: 1D Numpy array\n        :arg eventseriesy: Event series containing '0's and '1's\n        :type ts1: 1D Numpy array\n        :arg ts1: Event time array containing time points when events of event\n                  series 1 occur, not obligatory\n        :type ts2: 1D Numpy array\n        :arg ts2: Event time array containing time points when events of event\n                  series 2 occur, not obligatory\n        :type taumax: float\n        :arg taumax: maximum distance of two events to be counted as\n                     synchronous\n        :type lag: float\n        :arg lag: delay between the two event series, the second event series\n                  is shifted by the value of lag\n        :rtype: list\n        :return: [Event synchronization XY, Event synchronization YX]\n        \"\"\"\n\n        # Get time indices (type boolean or simple '0's and '1's)\n        # Careful here with datatype, int16 allows for maximum time index 32767\n        # Get time indices\n        if ts1 is None:\n            ex = np.array(np.where(eventseriesx), dtype='int16')\n        else:\n            ex = np.array([ts1[eventseriesx == 1]], dtype='float')\n        if ts2 is None:\n            ey = np.array(np.where(eventseriesy), dtype='int16')\n        else:\n            ey = np.array([ts2[eventseriesy == 1]], dtype='float')\n\n        ey = ey + lag\n\n        lx = ex.shape[1]\n        ly = ey.shape[1]\n        if lx == 0 or ly == 0:  # Division by zero in output\n            return np.nan, np.nan\n        if lx in [1, 2] or ly in [1, 2]:  # Too few events to calculate\n            return 0., 0.\n\n        # Array of distances\n        dstxy2 = 2 * (np.repeat(ex[:, 1:-1].T, ly - 2, axis=1)\n                      - np.repeat(ey[:, 1:-1], lx - 2, axis=0))\n        # Dynamical delay\n        diffx = np.diff(ex)\n        diffy = np.diff(ey)\n        diffxmin = np.minimum(diffx[:, 1:], diffx[:, :-1])\n        diffymin = np.minimum(diffy[:, 1:], diffy[:, :-1])\n        tau2 = np.minimum(np.repeat(diffxmin.T, ly - 2, axis=1),\n                          np.repeat(diffymin, lx - 2, axis=0))\n        tau2 = np.minimum(tau2, 2 * taumax)\n\n        # Count equal time events and synchronised events\n        eqtime = dstxy2.size - np.count_nonzero(dstxy2)\n\n        # Calculate boolean matrices of coincidences\n        Axy = (dstxy2 > 0) * (dstxy2 <= tau2)\n        Ayx = (dstxy2 < 0) * (dstxy2 >= -tau2)\n\n        # Loop over coincidences and determine number of double counts\n        # by checking at least one event of the pair is also coincided\n        # in other direction\n        countxydouble = countyxdouble = 0\n\n        for i, j in np.transpose(np.where(Axy)):\n            countxydouble += np.any(Ayx[i, :]) or np.any(Ayx[:, j])\n        for i, j in np.transpose(np.where(Ayx)):\n            countyxdouble += np.any(Axy[i, :]) or np.any(Axy[:, j])\n\n        # Calculate counting quantities and subtract half of double countings\n        countxy = np.sum(Axy) + 0.5 * eqtime - 0.5 * countxydouble\n        countyx = np.sum(Ayx) + 0.5 * eqtime - 0.5 * countyxdouble\n\n        norm = np.sqrt((lx - 2) * (ly - 2))\n        return countxy / norm, countyx / norm\n\n    @staticmethod\n    # pylint: disable=too-many-positional-arguments\n    def event_coincidence_analysis(eventseriesx, eventseriesy, taumax,\n                                   ts1=None, ts2=None, lag=0.0):\n        \"\"\"\n         Event coincidence analysis:\n         Returns the precursor and trigger coincidence rates of two event\n         series X and Y following the algorithm described in [Odenweller2020]_.\n\n         :type eventseriesx: 1D Numpy array\n         :arg eventseriesx: Event series containing '0's and '1's\n         :type eventseriesy: 1D Numpy array\n         :arg eventseriesy: Event series containing '0's and '1's\n         :type ts1: 1D Numpy array\n         :arg ts1: Event time array containing time points when events of event\n                   series 1 occur, not obligatory\n         :type ts2: 1D Numpy array\n         :arg ts2: Event time array containing time points when events of event\n                   series 2 occur, not obligatory\n         :type taumax: float\n         :arg taumax: coincidence interval width\n         :type lag: int\n         :arg lag: lag parameter\n         :rtype: list\n         :return: [Precursor coincidence rate XY, Trigger coincidence rate XY,\n               Precursor coincidence rate YX, Trigger coincidence rate YX]\n         \"\"\"\n\n        # Get time indices\n        if ts1 is None:\n            e1 = np.where(eventseriesx)[0]\n        else:\n            e1 = ts1[eventseriesx == 1]\n        if ts2 is None:\n            e2 = np.where(eventseriesy)[0]\n        else:\n            e2 = ts2[eventseriesy == 1]\n\n        # Count events that cannot be coincided due to lag and delT\n        if not (lag == 0 and taumax == 0):\n            n11 = len(e1[e1 <= e1[0] + lag + taumax])  # Start of es1\n            n12 = len(e1[e1 >= (e1[-1] - lag - taumax)])  # End of es1\n            n21 = len(e2[e2 <= e2[0] + lag + taumax])  # Start of es2\n            n22 = len(e2[e2 >= (e2[-1] - lag - taumax)])  # End of es2\n        else:\n            n11, n12, n21, n22 = 0, 0, 0, 0  # Instantaneous coincidence\n\n        # Number of events\n        l1 = len(e1)\n        l2 = len(e2)\n        # Array of all interevent distances\n        dst = (np.array([e1] * l2).T - np.array([e2] * l1))\n\n        # Count coincidences with array slicing\n        prec12 = np.count_nonzero(\n            np.any(((dst - lag >= 0) * (dst - lag <= taumax))[n11:, :],\n                   axis=1))\n        trig12 = np.count_nonzero(\n            np.any(((dst - lag >= 0) * (dst - lag <= taumax))\n                   [:, :dst.shape[1] - n22], axis=0))\n        prec21 = np.count_nonzero(np.any(((-dst - lag >= 0)\n                                          * (-dst - lag <= taumax))[:, n21:],\n                                         axis=0))\n        trig21 = np.count_nonzero(\n            np.any(((-dst - lag >= 0) * (-dst - lag <= taumax))\n                   [:dst.shape[0] - n12, :], axis=1))\n\n        # Normalisation and output\n        return (np.float32(prec12) / (l1 - n11),\n                np.float32(trig12) / (l2 - n22),\n                np.float32(prec21) / (l2 - n21),\n                np.float32(trig21) / (l1 - n12))\n\n    # pylint: disable=too-many-positional-arguments\n    def _eca_coincidence_rate(self, eventseriesx, eventseriesy,\n                              window_type='symmetric', ts1=None, ts2=None):\n        \"\"\"\n         Event coincidence analysis:\n         Returns the coincidence rates of two event series for both directions\n\n         :type eventseriesx: 1D Numpy array\n         :arg eventseriesx: Event series containing '0's and '1's\n         :type eventseriesy: 1D Numpy array\n         :arg eventseriesy: Event series containing '0's and '1's\n         :type ts1: 1D Numpy array\n         :arg ts1: Event time array containing time points when events of event\n                   series 1 occur, not obligatory\n         :type ts2: 1D Numpy array\n         :arg ts2: Event time array containing time points when events of event\n                   series 2 occur, not obligatory\n         :type window_type: str {'retarded', 'advanced', 'symmetric'}\n         :arg window_type: Only for ECA. Determines if precursor coincidence\n                           rate ('advanced'), trigger coincidence rate\n                           ('retarded') or a general coincidence rate with the\n                           symmetric interval [-taumax, taumax] are computed\n                           ('symmetric'). Default: 'symmetric'\n         :rtype: list\n         :return: Precursor coincidence rates [XY, YX]\n         \"\"\"\n        # Get time indices\n        if ts1 is None:\n            e1 = np.where(eventseriesx)[0]\n        else:\n            e1 = ts1[eventseriesx == 1]\n        if ts2 is None:\n            e2 = np.where(eventseriesy)[0]\n        else:\n            e2 = ts2[eventseriesy == 1]\n\n        lag = self.__lag\n        taumax = self.__taumax\n\n        # Number of events\n        l1 = len(e1)\n        l2 = len(e2)\n\n        # Array of all interevent distances\n        dst = (np.array([e1] * l2).T - np.array([e2] * l1))\n\n        if window_type == 'advanced':\n            deltaT1 = 0.0\n            deltaT2 = taumax\n\n            # Count events that cannot be coincided due to lag and deltaT\n            if not (lag == 0 and taumax == 0):\n                n11 = len(e1[e1 <= (e1[0] + lag + deltaT2)])  # Start of es1\n                n21 = len(e2[e2 <= (e2[0] + lag + deltaT2)])  # Start of es2\n                n12, n22 = 0, 0\n            else:\n                n11, n12, n21, n22 = 0, 0, 0, 0  # Instantaneous coincidence\n\n            # Count coincidences with array slicing\n            coincidence12 = np.count_nonzero(\n                np.any(((dst - lag >= deltaT1) * (dst - lag <= deltaT2))\n                       [n11:, :], axis=1))\n            coincidence21 = np.count_nonzero(\n                np.any(((-dst - lag >= deltaT1) * (-dst - lag <= deltaT2))\n                       [:, n21:], axis=0))\n\n        elif window_type == 'retarded':\n            deltaT1 = 0.0\n            deltaT2 = taumax\n\n            # Count events that cannot be coincided due to lag and delT\n            if not (lag == 0 and taumax == 0):\n                n11 = 0  # Start of es1\n                n12 = len(e1[e1 >= (e1[-1] - lag - deltaT2)])  # End of es1\n                n21 = 0  # Start of es2\n                n22 = len(e2[e2 >= (e2[-1] - lag - deltaT2)])  # End of es2\n            else:\n                n11, n12, n21, n22 = 0, 0, 0, 0  # Instantaneous coincidence\n\n            # Count coincidences with array slicing\n            coincidence12 = np.count_nonzero(\n                np.any(((dst - lag >= deltaT1) * (dst - lag <= deltaT2))\n                       [:, :dst.shape[1] - n22], axis=0))\n            coincidence21 = np.count_nonzero(\n                np.any(((-dst - lag >= deltaT1) * (-dst - lag <= deltaT2))\n                       [:dst.shape[0] - n12, :], axis=1))\n\n            return ((np.float32(coincidence12) / (l2 - n22),\n                     np.float32(coincidence21) / (l1 - n12)))\n\n        elif window_type == 'symmetric':\n            deltaT1, deltaT2 = -taumax, taumax\n\n            # Count events that cannot be coincided due to lag and delT\n            if not (lag == 0 and taumax == 0):\n                n11 = len(e1[e1 <= (e1[0] + lag + deltaT2)])  # Start of es1\n                n12 = len(e1[e1 >= (e1[-1] - lag + deltaT1)])  # End of es1\n                n21 = len(e2[e2 <= (e2[0] + lag + deltaT2)])  # Start of es2\n                n22 = len(e2[e2 >= (e2[-1] - lag + deltaT1)])  # End of es2\n            else:\n                n11, n12, n21, n22 = 0, 0, 0, 0  # Instantaneous coincidence\n\n            # Count coincidences with array slicing\n            coincidence12 = np.count_nonzero(\n                np.any(((dst - lag >= deltaT1) * (dst - lag <= deltaT2))\n                       [n11:dst.shape[0]-n12, :], axis=1))\n            coincidence21 = np.count_nonzero(\n                np.any(((-dst - lag >= deltaT1) * (-dst - lag <= deltaT2))\n                       [:, n21:dst.shape[1]-n22], axis=0))\n\n        else:\n            raise IOError(\"Parameter 'window_type' must be 'advanced',\"\n                          \" 'retarded' or 'symmetric'!\")\n\n        # Normalisation and output\n        return (np.float32(coincidence12) / (l1 - n11 - n12),\n                np.float32(coincidence21) / (l2 - n21 - n22))\n\n    def event_series_analysis(self, method='ES', symmetrization='directed',\n                              window_type='symmetric'):\n        \"\"\"\n        Returns the NxN matrix of the chosen event series measure where N is\n        the number of variables. The entry [i, j] denotes the event\n        synchronization or event coincidence analysis from variable j to\n        variable i. According to the 'symmetrization' parameter the event\n        series measure matrix is symmetrized or not.\n\n        The event coincidence rate of ECA is calculated according to the\n        formula: r(Y|X, DeltaT1, DeltaT2, tau) =\n        1/N_X sum_{i=1}^{N_X} Theta[sum{j=1}^{N_Y}\n        1_[DeltaT1, DeltaT2] (t_i^X - (t_j^Y + tau))],\n        where X is the first input event series, Y the second input event\n        series, N_X the number of events in X, DeltaT1 and DeltaT2 the given\n        coincidence interval boundaries, tau the lag between X and Y, Theta the\n        Heaviside function and 1 the indicator function.\n\n        :type method: str 'ES' or 'ECA'\n        :arg method: determines if ES or ECA should be used\n        :type symmetrization: str {'directed', 'symmetric', 'antisym',\n                              'mean', 'max', 'min'} for ES,\n                              str {'directed', 'mean', 'max', 'min'} for ECA\n        :arg symmetrization: determines if and which symmetrisation\n                             method should be used for the ES/ECA score matrix\n        :type window_type: str {'retarded', 'advanced', 'symmetric'}\n        :arg window_type: Only for ECA. Determines if precursor coincidence\n                          rate ('advanced'), trigger coincidence rate\n                          ('retarded') or a general coincidence rate with the\n                          symmetric interval [-taumax, taumax] are computed\n                          ('symmetric'). Default: 'symmetric'\n        :rtype: 2D numpy array\n        :return: pairwise event synchronization or pairwise coincidence rates\n                symmetrized according to input parameter 'symmetrization'\n        \"\"\"\n\n        if method not in ['ES', 'ECA']:\n            raise IOError(\"'method' parameter must be 'ECA' or 'ES'!\")\n\n        directedESMatrix = []\n\n        if method == 'ES':\n\n            if symmetrization not in ['directed', 'symmetric', 'antisym',\n                                      'mean', 'max', 'min']:\n                raise IOError(\"'symmetrization' parameter must be 'directed', \"\n                              \"'symmetric', 'antisym', 'mean', 'max' or\"\n                              \"'min' for event synchronization!\")\n\n            directedESMatrix = self._ndim_event_synchronization()\n\n        elif method == 'ECA':\n            if self.__taumax is np.inf:\n                raise ValueError(\"'delta' must be a finite time window to\"\n                                 \" determine event coincidence!\")\n\n            if symmetrization not in ['directed', 'mean', 'max', 'min']:\n                raise IOError(\"'symmetrization' parameter must be 'directed', \"\n                              \"'mean', 'max' or 'min' for event\"\n                              \"coincidence analysis!\")\n\n            if window_type not in ['retarded', 'advanced', 'symmetric']:\n                raise IOError(\"'window_type' must be 'retarded',\"\n                              \"'advanced' or 'symmetric'!\")\n\n            directedESMatrix = \\\n                self._ndim_event_coincidence_analysis(window_type=window_type)\n\n        # Use symmetrization functions for symmetrization and return result\n        return self.symmetrization_options[symmetrization](directedESMatrix)\n\n    @Cached.method()\n    def _ndim_event_synchronization(self):\n        \"\"\"\n        Compute NxN event synchronization matrix [i,j] with event\n        synchronization from j to i without symmetrization.\n\n        :rtype: NxN numpy array where N is the number of variables of the\n                eventmatrix\n        :return: event synchronization matrix\n        \"\"\"\n        # Get instance variables\n        eventmatrix = self.__eventmatrix\n        timestamps = self.__timestamps\n        lag = self.__lag\n        taumax = self.__taumax\n\n        directed = np.zeros((self.__N, self.__N))\n        for i in range(0, self.__N):\n            for j in range(i + 1, self.__N):\n                directed[i, j], directed[j, i] = \\\n                    self.event_synchronization(eventmatrix[:, i],\n                                               eventmatrix[:, j],\n                                               ts1=timestamps, ts2=timestamps,\n                                               taumax=taumax, lag=lag)\n        return directed\n\n    def _ndim_event_coincidence_analysis(self, window_type='symmetric'):\n        \"\"\"\n        Computes NxN event coincidence matrix of event coincidence rate\n\n        :type window_type: str {'retarded', 'advanced', 'symmetric'}\n        :arg window_type: Only for ECA. Determines if precursor coincidence\n                          rate ('advanced'), trigger coincidence rate\n                          ('retarded') or a general coincidence rate with the\n                          symmetric interval [-taumax, taumax] are computed\n                          ('symmetric'). Default: 'symmetric'\n        :rtype: NxN numpy array where N is the number of variables of the\n                eventmatrix\n        :return: event coincidence matrix\n        \"\"\"\n\n        eventmatrix = self.__eventmatrix\n        directed = np.zeros((self.__N, self.__N))\n        timestamps = self.__timestamps\n\n        for i in range(0, self.__N):\n            for j in range(i + 1, self.__N):\n                directed[i, j], directed[j, i] = \\\n                    self._eca_coincidence_rate(eventmatrix[:, i],\n                                               eventmatrix[:, j],\n                                               window_type=window_type,\n                                               ts1=timestamps, ts2=timestamps)\n\n        return directed\n\n    def _empirical_percentiles(self, method=None, n_surr=1000,\n                               symmetrization='directed',\n                               window_type='symmetric'):\n        \"\"\"\n        Compute p-values of event synchronisation (ES) and event coincidence\n        analysis (ECA) using a Monte-Carlo approach. Surrogates are obtained by\n        shuffling the event series. ES/ECA scores of the surrogate event series\n        are computed and p-values are the empirical percentiles of the original\n        event series compared to the ES/ECA scores of the surrogates.\n\n        :type method: str 'ES' or 'ECA'\n        :arg method: determines if ES or ECA should be used\n        :type n_surr: int\n        :arg n_surr: number of surrogates for Monte-Carlo method\n        :type symmetrization: str {'directed', 'symmetric', 'antisym',\n                              'mean', 'max', 'min'} for ES,\n                              str {'directed', 'mean', 'max', 'min'} for ECA\n        :arg symmetrization: determines if and which symmetrisation\n                             method should be used for the ES/ECA score matrix\n        :type window_type: str {'retarded', 'advanced', 'symmetric'}\n        :arg window_type: Only for ECA. Determines if precursor coincidence\n                          rate ('advanced'), trigger coincidence rate\n                          ('retarded') or a general coincidence rate with the\n                          symmetric interval [-taumax, taumax] are computed\n                          ('symmetric'). Default: 'symmetric'\n        :rtype: 2D numpy array\n        :return: p-values of the ES/ECA scores for all\n        \"\"\"\n\n        # Get instance variables\n        lag = self.__lag\n        deltaT = self.__taumax\n\n        event_series_result = \\\n            self.event_series_analysis(method=method,\n                                       symmetrization=symmetrization,\n                                       window_type=window_type)\n\n        surrogates = np.zeros((n_surr, self.__N, self.__N))\n        shuffled_es = self.__eventmatrix.copy()\n\n        # For each surrogate, shuffle each event series and perform ES/ECA\n        # analysis\n        for n in range(n_surr):\n            for i in range(self.__N):\n                np.random.shuffle(shuffled_es[:, i])\n\n            if method == 'ES':\n                for i in range(0, self.__N):\n                    for j in range(i + 1, self.__N):\n                        surrogates[n, i, j], surrogates[n, j, i] = \\\n                            self.event_synchronization(shuffled_es[:, i],\n                                                       shuffled_es[:, j],\n                                                       taumax=deltaT, lag=lag)\n\n            elif method == 'ECA':\n                for i in range(0, self.__N):\n                    for j in range(i + 1, self.__N):\n                        surrogates[n, i, j], surrogates[n, j, i] = \\\n                            self._eca_coincidence_rate(shuffled_es[:, i],\n                                                       shuffled_es[:, j],\n                                                       window_type=window_type)\n\n            # Symmetrize according to symmetry keyword argument\n            surrogates[n, :, :] = \\\n                self.symmetrization_options[\n                    symmetrization](surrogates[n, :, :])\n\n        # Calculate significance level via strict empirical percentiles for\n        # each event series pair\n        empirical_percentiles = np.zeros((self.__N, self.__N))\n        for i in range(self.__N):\n            for j in range(self.__N):\n                empirical_percentiles[i, j] = \\\n                    stats.percentileofscore(surrogates[:, i, j],\n                                            event_series_result[i][j],\n                                            kind='strict') / 100\n\n        return empirical_percentiles\n\n    # pylint: disable=too-many-positional-arguments\n    def event_analysis_significance(self, method=None,\n                                    surrogate='shuffle', n_surr=1000,\n                                    symmetrization='directed',\n                                    window_type='symmetric'):\n        \"\"\"\n        Returns significance levels (1 - p-values) for event synchronisation\n        (ES) and event coincidence analysis (ECA). For ECA, there is an\n        analytic option providing significance levels based on independent\n        Poisson processes. The 'shuffle' option uses a Monte-Carlo approach,\n        calculating ES or ECA scores for surrogate event time series obtained\n        by shuffling the original event time series. The significance levels\n        are the empirical percentiles of the ES/ECA scores of the original\n        event series compared with the scores of the surrogate data.\n\n        :type method: str 'ES' or 'ECA'\n        :arg method: determines if ES or ECA should be used\n        :type surrogate: str 'analytic' or 'shuffle'\n        :arg surrogate: determines if p-values should be calculated using a\n                        Monte-Carlo method or (only for ECA) an analytic\n                        Poisson process null model\n        :type n_surr: int\n        :arg n_surr: number of surrogates for Monte-Carlo method\n        :type symmetrization: str {'directed', 'symmetric', 'antisym',\n                              'mean', 'max', 'min'} for ES,\n                              str {'directed', 'mean', 'max', 'min'} for ECA\n        :arg symmetrization: determines if and which symmetrisation\n                             method should be used for the ES/ECA score matrix\n        :type window_type: str {'retarded', 'advanced', 'symmetric'}\n        :arg window_type: Only for ECA. Determines if precursor coincidence\n                          rate ('advanced'), trigger coincidence rate\n                          ('retarded') or a general coincidence rate with the\n                          symmetric interval [-taumax, taumax] are computed\n                          ('symmetric'). Default: 'symmetric'\n        :rtype: 2D numpy array\n        :return: significance levels of the ES/ECA scores for all pairs of\n                 event series in event matrix\n        \"\"\"\n\n        if method not in ['ES', 'ECA']:\n            raise IOError(\"'method' parameter must be 'ECA' or 'ES'!\")\n\n        if surrogate not in ['analytic', 'shuffle']:\n            raise IOError(\"'surrogate' parameter must be 'analytic' or \"\n                          \"'shuffle'!\")\n\n        # Get instance variables\n        deltaT = self.__taumax\n        lag = self.__lag\n\n        if method == 'ECA':\n\n            if symmetrization not in ['directed', 'mean', 'max', 'min']:\n                raise IOError(\"'symmetrization' parameter must be 'directed', \"\n                              \"'mean', 'max' or 'min' for event\"\n                              \"coincidence analysis!\")\n\n            if window_type not in ['retarded', 'advanced', 'symmetric']:\n                raise IOError(\"'window_type' must be 'retarded',\"\n                              \"'advanced' or 'symmetric'!\")\n\n            if surrogate == 'analytic':\n\n                if symmetrization != 'directed':\n                    raise IOError(\"'symmetrization' parameter should be\"\n                                  \"'directed' for analytical calculation of\"\n                                  \"significance levels!\")\n\n                if window_type not in ['retarded', 'advanced']:\n                    raise IOError(\"'window_type' parameter must be 'retarded'\"\n                                  \" or 'advanced' for analytical computation\"\n                                  \" of significance levels!\")\n\n                # Compute ECA scores of stored event matrix\n                directedECAMatrix = \\\n                    self._ndim_event_coincidence_analysis(\n                        window_type=window_type)\n                significance_levels = np.zeros((self.__N, self.__N))\n\n                NEvents = self.__nrofevents\n\n                if window_type == 'advanced':\n                    for i in range(self.__N):\n                        for j in range(i + 1, self.__N):\n                            # Compute Poisson probability p\n                            p = deltaT / (float(self.__timestamps[-1]) - lag)\n\n                            # Compute number of precursor coincidences 2->1\n                            K12 = int(directedECAMatrix[i][j] * NEvents[i])\n                            # Compute probability of at least K12 precursor\n                            # events\n                            pvalue = 0.0\n                            for K_star in range(K12, NEvents[i] + 1):\n                                pvalue += \\\n                                    stats.binom.pmf(K_star, NEvents[i],\n                                                    1.0 - pow(1.0 - p,\n                                                              NEvents[j]))\n                            significance_levels[i][j] = 1.0 - pvalue\n\n                            # Compute number of precursor coincidence 1->2\n                            K21 = int(directedECAMatrix[j][i] * NEvents[j])\n                            # Compute probability of at least K21 precursor\n                            # events\n                            pvalue = 0.0\n                            for K_star in range(K21, NEvents[j] + 1):\n                                pvalue += \\\n                                    stats.binom.pmf(K_star, NEvents[j],\n                                                    1.0 - pow(1.0 - p,\n                                                              NEvents[i]))\n                            significance_levels[j][i] = 1.0 - pvalue\n\n                    return significance_levels\n\n                # If window_type != 'advanced', it must be 'retarded'\n                else:\n                    for i in range(self.__N):\n                        for j in range(i + 1, self.__N):\n                            p = deltaT / (float(self.__timestamps[-1]) - lag)\n                            # Compute probability of at least K12 trigger\n                            # events\n\n                            # Compute number of trigger coincidence 2->1\n                            K12 = int(directedECAMatrix[i][j] * NEvents[j])\n                            # Compute Poisson probability p\n                            pvalue = 0.0\n                            for K_star in range(K12, NEvents[j]):\n                                pvalue += \\\n                                    stats.binom.pmf(K_star, NEvents[j],\n                                                    1.0 - pow(1.0 - p,\n                                                              NEvents[i]))\n                            significance_levels[i][j] = 1.0 - pvalue\n\n                            # Compute number of trigger coincidence 1->2\n                            K21 = int(directedECAMatrix[j][i] * NEvents[i])\n                            # Compute probability of at least K21 trigger\n                            # events\n                            pvalue = 0.0\n                            for K_star in range(K21, NEvents[i]):\n                                pvalue += \\\n                                    stats.binom.pmf(K_star, NEvents[i],\n                                                    1.0 - pow(1.0 - p,\n                                                              NEvents[j]))\n                            significance_levels[j][i] = 1.0 - pvalue\n\n                    return significance_levels\n\n            # If surrogate is not 'analytic', it must be 'shuffle'\n            else:\n                return \\\n                    self._empirical_percentiles(method='ECA', n_surr=n_surr,\n                                                symmetrization=symmetrization,\n                                                window_type=window_type)\n\n        elif method == 'ES':\n\n            if surrogate != 'shuffle':\n                raise IOError(\"Analytical calculation of significance level is\"\n                              \" only possible for event coincidence analysis!\")\n\n            if symmetrization not in ['directed', 'symmetric', 'antisym',\n                                      'mean', 'max', 'min']:\n                raise IOError(\"'symmetrization' parameter must be 'directed', \"\n                              \"'symmetric', 'antisym', 'mean', 'max' or\"\n                              \"'min' for event synchronization!\")\n\n            return \\\n                self._empirical_percentiles(method='ES',\n                                            n_surr=n_surr,\n                                            symmetrization=symmetrization)\n        else:\n            return None\n"
  },
  {
    "path": "src/pyunicorn/funcnet/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nfuncnet\n=======\n\nRelated Publications\n~~~~~~~~~~~~~~~~~~~~\n\n\"\"\"\n\nfrom .coupling_analysis import CouplingAnalysis\nfrom .coupling_analysis_pure_python import CouplingAnalysisPurePython\n"
  },
  {
    "path": "src/pyunicorn/funcnet/_ext/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n"
  },
  {
    "path": "src/pyunicorn/funcnet/_ext/numerics.pyx",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\nimport numpy as np\nfrom numpy cimport ndarray\n\nfrom ...core._ext.types import LAG, FIELD, DFIELD, NODE\nfrom ...core._ext.types cimport LAG_t, FIELD_t, DFIELD_t, NODE_t\n\n# coupling_analysis ===========================================================\n\n\ndef _symmetrize_by_absmax(\n        ndarray[FIELD_t, ndim=2, mode='c'] similarity_matrix not None,\n        ndarray[LAG_t, ndim=2, mode='c'] lag_matrix not None, int N):\n\n    cdef:\n        int i, j, I, J\n\n    # loop over all node pairs\n    for i in range(N):\n        for j in range(i+1, N):\n            # calculate max and argmax by comparing to\n            # previous value and storing max\n            if abs(similarity_matrix[i, j]) > abs(similarity_matrix[j, i]):\n                I, J = i, j\n            else:\n                I, J = j, i\n            similarity_matrix[J, I] = similarity_matrix[I, J]\n            lag_matrix[J, I] = -lag_matrix[I, J]\n\n    return similarity_matrix, lag_matrix\n\n\ndef _cross_correlation_max(\n        ndarray[FIELD_t, ndim=3, mode='c'] array not None,\n        int N, int tau_max, int corr_range):\n\n    cdef:\n        ndarray[FIELD_t, ndim=2, mode='c'] similarity_matrix = np.ones(\n            (N, N), dtype=FIELD)\n        ndarray[LAG_t, ndim=2, mode='c'] lag_matrix = np.zeros(\n            (N, N), dtype=LAG)\n        double crossij, max\n        int i, j, tau, k, argmax\n\n    # loop over all node pairs, NOT symmetric due to time shifts!\n    for i in range(N):\n        for j in range(N):\n            if i != j:\n                max = 0.0\n                argmax = 0\n                # loop over taus INCLUDING the last tau value\n                for tau in range(tau_max + 1):\n                    crossij = 0\n                    # here the actual cross correlation is calculated\n                    # assuming standardized arrays\n                    for k in range(corr_range):\n                        crossij += array[tau, i, k] * array[tau_max, j, k]\n                    # calculate max and argmax by comparing to\n                    # previous value and storing max\n                    if abs(crossij) > abs(max):\n                        max = crossij\n                        argmax = tau\n                similarity_matrix[i, j] = <FIELD_t> (max / corr_range)\n                lag_matrix[i, j] = <LAG_t> (tau_max - argmax)\n\n    return similarity_matrix, lag_matrix\n\n\ndef _cross_correlation_all(\n        ndarray[FIELD_t, ndim=3, mode='c'] array not None,\n        int N, int tau_max, int corr_range):\n\n    cdef:\n        int i, j, tau, k\n        double crossij\n        ndarray[FIELD_t, ndim=3, mode='c'] lagfuncs = np.zeros(\n            (N, N, tau_max+1), dtype=FIELD)\n\n    # loop over all node pairs, NOT symmetric due to time shifts!\n    for i in range(N):\n        for j in range(N):\n            # loop over taus INCLUDING the last tau value\n            for tau in range(tau_max + 1):\n                crossij = 0\n                # here the actual cross correlation is calculated\n                # assuming standardized arrays\n                for k in range(corr_range):\n                    crossij += array[tau, i, k] * array[tau_max, j, k]\n                lagfuncs[i, j, tau_max-tau] = <FIELD_t> (crossij / corr_range)\n\n    return lagfuncs\n\n\ndef _get_nearest_neighbors(\n        ndarray[FIELD_t, ndim=2, mode='c'] array not None,\n        int dim, int T, int dim_x, int dim_y, int k):\n\n    # Initialize\n    cdef:\n        int i, j, index, t, m, n, d, kxz, kyz, kz\n        double dz, dxyz, dx, dy, eps, epsmax\n        ndarray[NODE_t, ndim=1, mode='c'] indexfound = np.zeros(T, dtype=NODE)\n        ndarray[DFIELD_t, ndim=2, mode='c'] dist = np.zeros((dim, T), dtype=DFIELD)\n        ndarray[DFIELD_t, ndim=1, mode='c'] dxyzarray = np.zeros(k+1, dtype=DFIELD)\n        ndarray[NODE_t, ndim=1, mode='c'] k_xz = np.zeros(T, dtype=NODE)\n        ndarray[NODE_t, ndim=1, mode='c'] k_yz = np.zeros(T, dtype=NODE)\n        ndarray[NODE_t, ndim=1, mode='c'] k_z = np.zeros(T, dtype=NODE)\n\n    # Loop over time\n    for i in range(T):\n        # Growing cube algorithm:\n        # Test if n = #(points in epsilon-environment of reference point i) > k\n        # Start with epsilon for which 95% of points are inside the cube\n        # for a multivariate Gaussian\n        # eps increased by 2 later, also the initial eps\n        eps = (k/T)**(1./dim)\n\n        # n counts the number of neighbors\n        n = 0\n        while n <= k:\n            # Increase cube size\n            eps *= 2.\n            # Start with zero again\n            n = 0\n            # Loop through all points\n            for t in range(T):\n                d = 0\n                while d < dim and abs(array[d, i] - array[d, t]) < eps:\n                    d += 1\n\n                # If all distances are within eps, the point t lies\n                # within eps and n is incremented\n                if d == dim:\n                    indexfound[n] = t\n                    n += 1\n\n        # Calculate distance to points only within epsilon environment\n        # according to maximum metric\n        for j in range(n):\n            index = indexfound[j]\n\n            # calculate maximum metric distance to point\n            dxyz = 0.\n            for d in range(dim):\n                dist[d, j] = abs(array[d, i] - array[d, index])\n                dxyz = max(dist[d, j], dxyz)\n\n            # insertion-sort current distance into 'dxyzarray'\n            # if it is among the currently smallest k+1 distances\n            if j == 0:\n                dxyzarray[j] = dxyz\n            else:\n                m = min(k, <int> (j-1))\n                # go through previously sorted smallest distances and\n                # if it is smaller than any, find slot for current distance\n                while m >= 0 and dxyz < dxyzarray[m]:\n                    # if it's not in the last slot already,\n                    # move previously found distance to the right\n                    if not m == k:\n                        dxyzarray[m+1] = dxyzarray[m]\n                    m -= 1\n\n                # sort in, if a slot was found\n                if not m == k:\n                    dxyzarray[m+1] = dxyz\n\n        # Epsilon of k-th nearest neighbor in joint space\n        epsmax = dxyzarray[k]\n\n        # Count neighbors within epsmax in subspaces, since the reference\n        # point is included, all neighbors are at least 1\n        kz = 0\n        kxz = 0\n        kyz = 0\n        for j in range(T):\n\n            # X-subspace\n            dx = abs(array[0, i] - array[0, j])\n            for d in range(1, dim_x):\n                dist[d, j] = abs(array[d, i] - array[d, j])\n                dx = max(dist[d, j], dx)\n\n            # Y-subspace\n            dy = abs(array[dim_x, i] - array[dim_x, j])\n            for d in range(dim_x, dim_x + dim_y):\n                dist[d, j] = abs(array[d, i] - array[d, j])\n                dy = max(dist[d, j], dy)\n\n            # Z-subspace, if empty, dz stays 0\n            dz = 0.\n            for d in range(dim_x + dim_y, dim):\n                dist[d, j] = abs(array[d, i] - array[d, j])\n                dz = max(dist[d, j], dz)\n\n            # For no conditions, kz is counted up to T\n            if dz < epsmax:\n                kz += 1\n                if dx < epsmax:\n                    kxz += 1\n                if dy < epsmax:\n                    kyz += 1\n\n        # Write to numpy arrays\n        k_xz[i] = kxz\n        k_yz[i] = kyz\n        k_z[i] = kz\n\n    return k_xz, k_yz, k_z\n"
  },
  {
    "path": "src/pyunicorn/funcnet/coupling_analysis.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for analyzing spatially embedded complex networks, handling\nmultivariate data.\nWritten by Jakob Runge.\n\"\"\"\n\nimport numpy                        # array object and fast numerics\nfrom scipy import special, linalg   # special math functions\n\n# import mpi                          # parallelized computations\n\nfrom ..core._ext.types import to_cy, LAG, FIELD, \\\n    INT16TYPE, INT32TYPE, INT64TYPE\nfrom ._ext.numerics import _symmetrize_by_absmax, _cross_correlation_max, \\\n    _cross_correlation_all, _get_nearest_neighbors\n\n\n#\n#  Define class Coupling Analysis\n#\n\nclass CouplingAnalysis:\n\n    \"\"\"\n    Contains methods to calculate coupling matrices from large arrays\n    of scalar time series.\n    Comprises linear and information-theoretic measures, lagged\n    and directed couplings.\n    \"\"\"\n\n    #\n    #  Definitions of internal methods\n    #\n\n    def __init__(self, data, silence_level=0):\n        \"\"\"\n        Initialize an instance of CouplingAnalysis from data array.\n\n        :type data: multidimensional numpy array\n        :arg data: The time series array with time in first dimension.\n        :type silence_level: int >= 0\n        :arg  silence_level: The higher, the less progress info is output.\n        \"\"\"\n\n        self.silence_level = silence_level\n        \"\"\"(int>=0) higher -> less progress info\"\"\"\n\n        #  Flatten array along spatial dimensions to allow\n        #  for more convinient indexing\n        self.n_time = data.shape[0]\n        self.data = data.reshape(self.n_time, -1)\n        self.N = self.data.shape[1]\n\n        #  precalculation of p*log(p) needed for entropies\n        self.plogp = None\n\n    def __str__(self):\n        \"\"\"Return a string representation of the CouplingAnalysis object.\"\"\"\n        return (f'CouplingAnalysis: {self.N} variables, '\n                f'{self.n_time} timesteps.')\n\n    @staticmethod\n    def test_data():\n        \"\"\"\n        Return example test data as discussed in pyunicorn description paper.\n        \"\"\"\n        numpy.random.seed(42)\n        noise = numpy.random.randn(1000, 4)\n        data = noise\n        for t in range(2, 1000):\n            data[t, 0] = 0.8 * data[t-1, 0] + noise[t, 0]\n            data[t, 1] = 0.8 * data[t-1, 1] + 0.5 * data[t-2, 0] + noise[t, 1]\n            data[t, 2] = 0.7 * data[t-1, 0] + noise[t, 2]\n            data[t, 3] = 0.7 * data[t-2, 0] + noise[t, 3]\n        return data\n\n    def symmetrize_by_absmax(self, similarity_matrix, lag_matrix):\n\n        \"\"\"\n        Returns symmetrized similarity matrix.\n\n        Computes the largest absolute value for each pair (i,j) and (j,i) and\n        returns the in-place changed matrices of measures and lags. A negative\n        lag for an entry (i,j) in the lag_matrix then indicates a 'direction'\n        j --> i regarding the peak of the lag function, and vice versa for a\n        positive lag.\n\n        **Example:**\n\n        >>> coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n        >>> similarity_matrix, lag_matrix = coup_ana.cross_correlation(\n        ...     tau_max=2)\n        >>> r((similarity_matrix, lag_matrix))\n        (array([[ 1.    , 0.698 , 0.7788, 0.7535],\n                [ 0.4848, 1.    , 0.4507, 0.52  ],\n                [ 0.6219, 0.5704, 1.    , 0.5996],\n                [ 0.4833, 0.5503, 0.5002, 1.    ]]),\n         array([[0, 2, 1, 2], [0, 0, 0, 0],\n                [0, 2, 0, 1], [0, 2, 0, 0]]))\n        >>> r(coup_ana.symmetrize_by_absmax(similarity_matrix, lag_matrix))\n        (array([[ 1.    , 0.698 , 0.7788, 0.7535],\n                [ 0.698 , 1.    , 0.5704, 0.5503],\n                [ 0.7788, 0.5704, 1.    , 0.5996],\n                [ 0.7535, 0.5503, 0.5996, 1.    ]]),\n         array([[ 0, 2, 1, 2], [-2, 0, -2, -2],\n                [-1, 2, 0, 1], [-2, 2, -1, 0]]))\n\n        :type similarity_matrix: array-like [float]\n        :arg  similarity_matrix: array-like [node, node] matrix of similarity\n                                 estimates\n\n        :type lag_matrix: array-like [int>=0]\n        :arg  lag_matrix:  array-like [node, node] matrix of lags\n\n        :rtype: tuple of arrays\n        :returns: the value at the absolute maximum and the (pos or neg) lag.\n        \"\"\"\n\n        return _symmetrize_by_absmax(to_cy(similarity_matrix, FIELD),\n                                     to_cy(lag_matrix, LAG), self.N)\n\n    #\n    #  Define methods to estimate similarity measures\n    #\n    def cross_correlation(self, tau_max=0, lag_mode='max'):\n        r\"\"\"\n        Return cross correlation between all pairs of nodes.\n\n        Two lag-modes are available (default: lag_mode='max'):\n\n        lag_mode = 'all':\n        Return 3-dimensional array of lagged cross correlations between all\n        pairs of nodes. An entry :math:`(i, j, \\tau)` corresponds to\n        :math:`\\rho(X^i_t-\\tau, X^j_t)` for positive lags tau, i.e., the\n        direction i --> j for :math:`\\tau \\ne 0`.\n\n        lag_mode = 'max':\n        Return matrix of absolute maxima and corresponding lags of lagged\n        cross correlation (CC) between all pairs of nodes.\n        Returns two usually asymmetric matrices of CC values and lags: In each\n        matrix, an entry :math:`(i, j)` corresponds to the (positive or\n        negative) value and lag, respectively, at absolute maximum of\n        :math:`\\rho(X^i_t-\\tau, X^j_t)` for positive lags tau, i.e., the\n        direction i --> j for :math:`\\tau > 0`. The matrices are, thus,\n        asymmetric. The function :meth:`.symmetrize_by_absmax` can be used to\n        obtain a symmetric matrix.\n\n        **Example:**\n\n        >>> coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n        >>> similarity_matrix, lag_matrix = coup_ana.cross_correlation(\n        ...     tau_max=5, lag_mode='max')\n        >>> r((similarity_matrix, lag_matrix))\n        (array([[ 1.   ,  0.757 ,  0.779 ,  0.7536],\n               [ 0.4847,  1.    ,  0.4502,  0.5197],\n               [ 0.6219,  0.5844,  1.    ,  0.5992],\n               [ 0.4827,  0.5509,  0.4996,  1.    ]]),\n         array([[0, 4, 1, 2], [0, 0, 0, 0], [0, 3, 0, 1], [0, 2, 0, 0]]))\n\n        :type tau_max: int [int>=0]\n        :arg  tau_max: maximum lag of cross correlation lag function.\n\n        :type lag_mode: str [('max'|'all')]\n        :arg  lag_mode: lag-mode of cross correlations to return.\n\n        :rtype: 3D-array or tuple of matrices\n        :returns: all-lag array or matrices of value and lag at the absolute\n                  maximum.\n        \"\"\"\n\n        data = self.data\n        T, N = data.shape\n\n        # Sanity checks\n        if not isinstance(data, numpy.ndarray):\n            raise TypeError(f\"data is of type {type(data)}, \"\n                            \"must be numpy.ndarray\")\n        if N > T:\n            print(f\"Warning: data.shape = {data.shape},\"\n                  \" is it of shape (observations, variables) ?\")\n        assert numpy.isnan(data).sum() == 0, \"NaNs in the data\"\n        assert tau_max >= 0, f\"{tau_max =}\"\n        assert lag_mode in ['max', 'all'], f\"{lag_mode =}\"\n\n        #  Normalize time series to zero mean and unit variance for all lags\n        corr_range = T - tau_max\n        array = numpy.empty((tau_max + 1, N, corr_range), dtype=FIELD)\n\n        for t in range(tau_max + 1):\n            #  Remove mean value from time series at each node\n            array[t] = (\n                data[t:t+corr_range, :]\n                - data[t:t+corr_range, :].mean(axis=0).reshape(1, N)).T\n\n            #  Normalize the variance of anomalies to one\n            array[t] /= array[t].std(axis=1).reshape(N, 1)\n\n            #  Correct for nodes with zero variance in their time series\n            array[t][numpy.isnan(array[t])] = 0\n\n        if lag_mode == 'max':\n            return _cross_correlation_max(\n                to_cy(array, FIELD), N, tau_max, corr_range)\n        elif lag_mode == 'all':\n            return _cross_correlation_all(\n                to_cy(array, FIELD), N, tau_max, corr_range)\n        else:\n            return None\n\n    # pylint: disable=too-many-positional-arguments\n    def mutual_information(self, tau_max=0, estimator='knn',\n                           knn=10, bins=6, lag_mode='max'):\n        r\"\"\"\n        Return mutual information (MI) between all pairs of nodes.\n\n        Three estimators are available:\n\n        estimator = 'knn' (Recommended):\n        Based on k-nearest-neighbors [Kraskov2004]_,\n        version 1 in their paper. Larger k have smaller variance, but larger\n        (typically negative) bias, and vice versa.\n\n        estimator = 'binning':\n        Binning estimator based on equal-quantile binning.\n\n        estimator = 'gauss':\n        Captures only linear part of association. Essentially estimates a\n        transformed partial correlation.\n\n\n        Two lag-modes are available (default: lag_mode='max'):\n\n        lag_mode = 'all':\n        Return 3-dimensional array of lagged MI between all pairs of nodes. An\n        entry :math:`(i, j, \\tau)` corresponds to :math:`I(X^i_t-\\tau, X^j_t)`\n        for positive lags tau, i.e., the direction i --> j for :math:`\\tau \\ne\n        0`.\n\n        lag_mode = 'max':\n        Return matrix of absolute maxima and corresponding lags of lagged\n        MI between all pairs of nodes.\n        Returns two usually asymmetric matrices of MI values and lags: In each\n        matrix, an entry :math:`(i, j)` corresponds to the value and lag,\n        respectively, at absolute maximum of :math:`I(X^i_t-\\tau, X^j_t)` for\n        positive lags tau, i.e., the direction i --> j for :math:`\\tau > 0`.\n        The matrices are, thus, asymmetric. The function\n        :meth:`.symmetrize_by_absmax` can be used to obtain a symmetric matrix.\n\n        Reference: [Kraskov2004]_\n\n        **Example:**\n\n        >>> coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n        >>> similarity_matrix, lag_matrix = coup_ana.mutual_information(\n        ...     tau_max=5, knn=10, estimator='knn')\n        >>> r(similarity_matrix)\n        array([[ 4.6505,  0.4387,  0.4652,  0.4126],\n               [ 0.147 ,  4.6505,  0.1065,  0.1639],\n               [ 0.2483,  0.2126,  4.6505,  0.2204],\n               [ 0.1209,  0.199 ,  0.1453,  4.6505]])\n        >>> lag_matrix\n        array([[0, 4, 1, 2],\n               [0, 0, 0, 0],\n               [0, 2, 0, 1],\n               [0, 2, 0, 0]], dtype=int8)\n\n        :type tau_max: int [int>=0]\n        :arg  tau_max: maximum lag of MI lag function.\n\n        :type knn: int [int>=1]\n        :arg  knn: nearest-neighbor MI estimation parameter. (default: 10)\n\n        :type bins: int [int>=2]\n        :arg  bins: binning MI estimation parameter. (default: 6)\n\n        :type estimator: str [('knn'|'binning'|'gauss')]\n        :arg  estimator: MI estimator. (default: 'knn')\n\n        :type lag_mode: str [('max'|'all')]\n        :arg  lag_mode: lag-mode of MI to return.\n\n        :rtype: 3D-array or tuple of matrices\n        :returns: all-lag array or matrices of value and lag at the absolute\n                  maximum.\n        \"\"\"\n\n        data = self.data\n        T, N = data.shape\n\n        # Sanity checks\n        if not isinstance(data, numpy.ndarray):\n            raise TypeError(f\"data is of type {type(data)}, \"\n                            \"must be numpy.ndarray\")\n        if N > T:\n            print(f\"Warning: data.shape = {data.shape},\"\n                  \" is it of shape (observations, variables) ?\")\n        if T < 500:\n            print(f\"Warning: T = {T} ,\"\n                  \" unreliable estimation using MI estimator\")\n        assert numpy.isnan(data).sum() == 0, \"NaNs in the data\"\n        assert tau_max >= 0, f\"{tau_max =}\"\n        if estimator not in ('knn', 'binning', 'gauss'):\n            raise ValueError('estimator must be \"knn\", \"binning\" or \"gauss\".')\n        if estimator == 'knn':\n            assert 1 <= knn <= T/2., f\"{knn =}\"\n\n        if lag_mode == 'max':\n            similarity_matrix = numpy.ones((N, N), dtype=FIELD)\n            lag_matrix = numpy.zeros((N, N), dtype=LAG)\n        elif lag_mode == 'all':\n            lagfuncs = numpy.zeros((N, N, tau_max+1), dtype=FIELD)\n\n        if estimator == 'binning':\n            self.plogp = self.create_plogp(T)\n\n        for i in range(N):\n            for j in range(N):\n                maximum = 0.\n                lag_at_max = 0\n                for tau in range(tau_max + 1):\n\n                    X = [(i, -tau)]\n                    Y = [(j, 0)]\n                    Z = []\n\n                    XYZ = X + Y + Z\n                    dim = len(XYZ)\n                    max_lag = tau_max\n                    array = numpy.zeros((dim, T - max_lag))\n                    for d, node in enumerate(XYZ):\n                        var, lag = node\n                        array[d, :] = data[max_lag + lag: T + lag, var]\n\n                    if estimator == 'knn':\n                        xyz = numpy.array([0, 1])\n\n                        k_xz, k_yz, k_z = self.get_nearest_neighbors(\n                            array=array, xyz=xyz, k=knn, standardize=True)\n\n                        ixy_z = (special.digamma(knn)\n                                 + (- special.digamma(k_xz)\n                                    - special.digamma(k_yz)\n                                    + special.digamma(k_z)).mean())\n\n                    elif estimator == 'binning':\n                        symb_array = self._quantile_bin_array(array, bins=bins)\n\n                        # High-dimensional Histogram\n                        hist = self.bincount_hist(symb_array)\n\n                        # Entropies by use of vectorized function plogp\n                        hxyz = (-(self.plogp(hist)).sum()\n                                + self.plogp(T))/float(T)\n                        hxz = (-(self.plogp(hist.sum(axis=1))).sum()\n                               + self.plogp(T))/float(T)\n                        hyz = (-(self.plogp(hist.sum(axis=0))).sum()\n                               + self.plogp(T))/float(T)\n                        hz = (-(self.plogp(hist.sum(axis=0).sum(axis=0))).sum()\n                              + self.plogp(T))/float(T)\n\n                        ixy_z = hxz + hyz - hz - hxyz\n\n                    elif estimator == 'gauss':\n\n                        # Standardize\n                        array -= array.mean(axis=1).reshape(dim, 1)\n                        array /= array.std(axis=1).reshape(dim, 1)\n                        if numpy.isnan(array).sum() != 0:\n                            raise ValueError(\"nans after standardizing, \\\n                                             possibly constant array!\")\n\n                        x = array[0, :]\n                        y = array[1, :]\n\n                        ixy_z = self._par_corr_to_cmi(\n                            numpy.dot(x, y) / numpy.sqrt(\n                                numpy.dot(x, x) * numpy.dot(y, y)))\n\n                    if lag_mode == 'max':\n                        # pylint: disable=possibly-used-before-assignment\n                        if ixy_z > maximum:\n                            maximum = ixy_z\n                            lag_at_max = tau\n\n                    elif lag_mode == 'all':\n                        lagfuncs[i, j, tau] = ixy_z\n\n                if lag_mode == 'max':\n                    similarity_matrix[i, j] = maximum\n                    lag_matrix[i, j] = lag_at_max\n\n        if lag_mode == 'max':\n            return similarity_matrix, lag_matrix\n        elif lag_mode == 'all':\n            return lagfuncs\n        else:\n            return None\n\n    # pylint: disable=too-many-positional-arguments\n    def information_transfer(self, tau_max=0, estimator='knn',\n                             knn=10, past=1, cond_mode='ity', lag_mode='max'):\n        r\"\"\"\n        Return bivariate information transfer between all pairs of nodes.\n\n        Two condition modes of information transfer are available\n        as described in [Runge2012b]_.\n\n        Information transfer to Y (ITY):\n            .. math::\n                I(X^i_t-\\tau, X^j_t | X^j_t-1, ...,X^j_t-past)\n\n        Momentary information transfer (MIT):\n            .. math::\n                I(X^i_t-\\tau, X^j_t | X^j_t-1, ...,X^j_t-past, X^i_t-\\tau-1,\n                                       ...,X^j_t-\\tau-past)\n\n        Two estimators are available:\n\n        estimator = 'knn' (Recommended):\n        Based on k-nearest-neighbors [Kraskov2004]_,\n        version 1 in their paper. Larger k have smaller variance, but larger\n        (typically negative) bias, and vice versa.\n\n        estimator = 'gauss':\n        Captures only linear part of association. Essentially estimates a\n        transformed partial correlation.\n\n\n        Two lag-modes are available (default: lag_mode='max'):\n\n        lag_mode = 'all':\n        Return 3-dimensional array of lag-functions between all pairs of nodes.\n        An entry :math:`(i, j, \\tau)` corresponds to :math:`I(X^i_t-\\tau, X^j_t\n        | ...)` for positive lags tau, i.e., the direction i --> j for\n        :math:`\\tau \\ne 0`.\n\n        lag_mode = 'max':\n        Return matrix of absolute maxima and corresponding lags of\n        lag-functions between all pairs of nodes.\n        Returns two usually asymmetric matrices of values and lags: In each\n        matrix, an entry :math:`(i, j)` corresponds to the value and lag,\n        respectively, at absolute maximum of :math:`I(X^i_t-\\tau, X^j_t | ...)`\n        for positive lags tau, i.e., the direction i --> j for :math:`\\tau >\n        0`.  The matrices are, thus, asymmetric. The function\n        :meth:`.symmetrize_by_absmax` can be used to obtain a symmetric matrix.\n\n        **Example:**\n\n        >>> coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n        >>> similarity_matrix, lag_matrix = coup_ana.information_transfer(\n        ...     tau_max=5, estimator='knn', knn=10)\n        >>> r((similarity_matrix, lag_matrix))\n        (array([[ 0.    ,  0.1544,  0.3261,  0.3047],\n               [  0.0218,  0.    ,  0.0394,  0.0976],\n               [  0.0134,  0.0663,  0.    ,  0.1502],\n               [  0.0066,  0.0694,  0.0401,  0.    ]]),\n        array([[0, 2, 1, 2], [5, 0, 0, 0], [5, 1, 0, 1], [5, 0, 0, 0]]))\n\n        :type tau_max: int [int>=0]\n        :arg  tau_max: maximum lag of ITY lag function.\n\n        :type past: int [int>=1]\n        :arg  past: maximum lag of past history.\n\n        :type knn: int [int>=1]\n        :arg  knn: nearest-neighbor ITY estimation parameter. (default: 10)\n\n        :type bins: int [int>=2]\n        :arg  bins: binning ITY estimation parameter. (default: 6)\n\n        :type estimator: str [('knn'|'gauss')]\n        :arg  estimator: ITY estimator. (default: 'knn')\n\n        :type cond_mode: str [('ity'|'mit')]\n        :arg  cond_mode: condition mode. (default: 'ity')\n\n        :type lag_mode: str [('max'|'all')]\n        :arg  lag_mode: lag-mode of ITY to return.\n\n        :rtype: 3D-array or tuple of matrices\n        :returns: all-lag array or matrices of value and lag at the absolute\n                  maximum.\n        \"\"\"\n\n        data = self.data\n        T, N = data.shape\n\n        # Sanity checks\n        if not isinstance(data, numpy.ndarray):\n            raise TypeError(f\"data is of type {type(data)},\"\n                            \" must be numpy.ndarray\")\n        if N > T:\n            print(f\"Warning: data.shape = {data.shape},\"\n                  \" is it of shape (observations, variables) ?\")\n        if estimator == 'knn' and T < 500:\n            print(f\"Warning: T = {T} ,\"\n                  \" unreliable estimation using knn-estimator\")\n        if numpy.isnan(data).sum() != 0:\n            raise ValueError(\"NaNs in the data\")\n        if tau_max < 0:\n            raise ValueError(f\"tau_max = {tau_max}, but 0 <= tau_max\")\n        if estimator not in ('knn', 'binning', 'gauss'):\n            raise ValueError('estimator must be \"knn\", \"binning\" or \"gauss\".')\n        if estimator == 'knn':\n            if knn > T/2. or knn < 1:\n                raise ValueError(f\"knn = {knn}, should be between 1 and T/2\")\n\n        if lag_mode == 'max':\n            similarity_matrix = numpy.ones((N, N), dtype=FIELD)\n            lag_matrix = numpy.zeros((N, N), dtype=LAG)\n        elif lag_mode == 'all':\n            lagfuncs = numpy.zeros((N, N, tau_max+1), dtype=FIELD)\n\n        for i in range(N):\n            for j in range(N):\n                maximum = 0.\n                lag_at_max = 0\n                for tau in range(tau_max + 1):\n\n                    X = [(i, -tau)]\n                    Y = [(j, 0)]\n                    if cond_mode == 'ity':\n                        Z = [(j, -p) for p in range(1, past + 1)]\n                    elif cond_mode == 'mit':\n                        Z = [(j, -p) for p in range(1, past + 1)]\n                        Z += [(i, -tau - p) for p in range(1, past + 1)]\n\n                    XYZ = X + Y + Z\n\n                    dim = len(XYZ)\n                    max_lag = tau_max + past\n                    array = numpy.zeros((dim, T - max_lag))\n                    for d, node in enumerate(XYZ):\n                        var, lag = node\n                        array[d, :] = data[max_lag + lag: T + lag, var]\n\n                    if estimator == 'knn':\n                        xyz = numpy.array([0, 1])\n\n                        k_xz, k_yz, k_z = self.get_nearest_neighbors(\n                            array=array, xyz=xyz, k=knn, standardize=True)\n\n                        ixy_z = (special.digamma(knn)\n                                 + (- special.digamma(k_xz)\n                                    - special.digamma(k_yz)\n                                    + special.digamma(k_z)).mean())\n\n                    elif estimator == 'gauss':\n\n                        if numpy.isnan(array).sum() != 0:\n                            raise ValueError(\"nans in the array!\")\n\n                        # Standardize\n                        array -= array.mean(axis=1).reshape(dim, 1)\n                        array /= array.std(axis=1).reshape(dim, 1)\n                        if numpy.isnan(array).sum() != 0:\n                            raise ValueError(\"nans after standardizing, \\\n                                             possibly constant array!\")\n\n                        x = array[0, :]\n                        y = array[1, :]\n                        if len(array) > 2:\n                            confounds = array[2:, :]\n                            ortho_confounds = linalg.qr(confounds.T.copy(),\n                                                        mode='economic')[0].T\n                            x -= numpy.dot(numpy.dot(ortho_confounds, x),\n                                           ortho_confounds)\n                            y -= numpy.dot(numpy.dot(ortho_confounds, y),\n                                           ortho_confounds)\n\n                        ixy_z = self._par_corr_to_cmi(\n                            numpy.dot(x, y) / numpy.sqrt(\n                                numpy.dot(x, x) * numpy.dot(y, y)))\n\n                    if lag_mode == 'max':\n                        # pylint: disable=possibly-used-before-assignment\n                        if ixy_z > maximum:\n                            maximum = ixy_z\n                            lag_at_max = tau\n\n                    elif lag_mode == 'all':\n                        lagfuncs[i, j, tau] = ixy_z\n\n                if lag_mode == 'max':\n                    similarity_matrix[i, j] = maximum\n                    lag_matrix[i, j] = lag_at_max\n\n        if lag_mode == 'max':\n            similarity_matrix[range(N), range(N)] = 0.\n        elif lag_mode == 'all':\n            lagfuncs[range(N), range(N), 0.] = 0.\n\n        if lag_mode == 'max':\n            return similarity_matrix, lag_matrix\n        elif lag_mode == 'all':\n            return lagfuncs\n        else:\n            return None\n\n    #\n    #  Define helper methods\n    #\n\n    @staticmethod\n    def _par_corr_to_cmi(par_corr):\n        \"\"\"\n        Transformation of partial correlation to conditional mutual\n        information scale using the (multivariate) Gaussian assumption.\n\n        :type par_corr: float or array\n        :arg  par_corr: partial correlation\n\n        :rtype: float\n        :returns: transformed partial correlation.\n        \"\"\"\n\n        return -0.5*numpy.log(1. - par_corr**2)\n\n    @staticmethod\n    def get_nearest_neighbors(array, xyz, k, standardize=True):\n        \"\"\"\n        Returns nearest-neighbors for conditional mutual information estimator.\n\n        Reference: [Kraskov2004]_\n\n        :type array: array (float)\n        :arg  array: data array.\n\n        :type xyz: array [int(0|1|2)]\n        :arg  xyz: identifier of X, Y, Z in CMI\n\n        :type k: int [int>=1]\n        :arg  k: nearest-neighbor MI estimation parameter.\n\n        :type standardize: bool\n        :arg  standardize: standardize array before estimation. (default: True)\n\n        :rtype: tuple of arrays\n        :returns: nearest neighbors for each sample point.\n        \"\"\"\n        dim, T = array.shape\n\n        if standardize:\n            # Standardize\n            array = array.astype(FIELD)\n            array -= array.mean(axis=1).reshape(dim, 1)\n            array /= array.std(axis=1).reshape(dim, 1)\n            # If the time series is constant, return nan rather than raising\n            # Exception\n            if numpy.isnan(array).sum() != 0:\n                raise ValueError(\"nans after standardizing, possibly \\\n                                 constant array!\")\n\n        # Add noise to destroy ties...\n        array += 1E-10 * numpy.random.rand(dim, T)\n\n        dim_x = int(numpy.where(xyz == 0)[0][-1] + 1)\n        dim_y = int(numpy.where(xyz == 1)[0][-1] + 1 - dim_x)\n        # dim_z = maxdim - dim_x - dim_y\n\n        return _get_nearest_neighbors(\n            to_cy(array, FIELD), dim, T, dim_x, dim_y, k)\n\n    @staticmethod\n    def _quantile_bin_array(array, bins=6):\n        \"\"\"\n        Returns symbolified array with aequi-quantile binning.\n\n        This partition results in a uniform distribution of the marginals.\n\n        :type array: array\n        :arg array: data\n\n        :type bins: int\n        :arg bins: number of bins\n\n        :rtype: array\n        :returns: converted data\n        \"\"\"\n\n        dim, T = array.shape\n\n        # get the bin quantile steps\n        bin_edge = numpy.ceil(T/float(bins)).astype(int)\n\n        symb_array = numpy.zeros((dim, T), dtype=INT32TYPE)\n\n        # get the lower edges of the bins for every time series\n        edges = numpy.sort(array, axis=1)[:, ::bin_edge]\n        bins = edges.shape[1]\n\n        # This gives the symbolic time series\n        symb_array = (array.reshape(dim, T, 1)\n                      >= edges.reshape(dim, 1, bins)).sum(axis=2) - 1\n\n        return symb_array\n\n    @staticmethod\n    def bincount_hist(symb_array):\n        \"\"\"\n        Computes histogram from symbolic array.\n\n        :type symb_array: array of integers\n        :arg symb_array: symbolic data\n\n        :rtype: array\n        :returns: (unnormalized) histogram\n        \"\"\"\n\n        base = int(symb_array.max() + 1)\n\n        D, T = symb_array.shape\n\n        # Needed because numpy.bincount cannot process longs\n        assert isinstance(base**D, int)\n        assert base**D*16./8./1024.**3 < 3., (\n            'Dimension exceeds 3 GB of necessary memory '\n            '(change this code line if you got more...)')\n        assert D*base**D < 2**65, (\n            f'base = {base}, D = {D}: Histogram failed:'\n            ' dimension D*base**D exceeds int64 data type')\n\n        flathist = numpy.zeros((base**D), dtype=INT16TYPE)\n        multisymb = numpy.zeros(T, dtype=INT64TYPE)\n\n        for i in range(D):\n            multisymb += symb_array[i, :]*base**i\n\n        result = numpy.bincount(multisymb)\n        flathist[:len(result)] += result\n\n        return flathist.reshape(tuple(\n            [base, base] + [base for i in range(D-2)])).T\n\n    @staticmethod\n    def create_plogp(T):\n        \"\"\"\n        Precalculation of p*log(p) needed for entropies.\n\n        :type T: int\n        :arg  T: sample length\n\n        :rtype: array\n        :returns: p*log(p) array from p=1 to p=T\n        \"\"\"\n\n        gfunc = numpy.zeros(T+1)\n        gfunc[1:] = numpy.arange(1, T+1, 1)*numpy.log(numpy.arange(1, T+1, 1))\n\n        return numpy.vectorize(lambda t: gfunc[t])\n"
  },
  {
    "path": "src/pyunicorn/funcnet/coupling_analysis_pure_python.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for analyzing spatially embedded complex networks, handling\nmultivariate data and generating time series surrogates.\n\nWritten by Jakob Runge.\nCMSI Method Reference: [Pompe2011]_\n\"\"\"\n\n# array object and fast numerics\nimport numpy\n\n\n#\n#  Define class CouplingAnalysisPurePython\n#\n\nclass CouplingAnalysisPurePython:\n\n    \"\"\"\n    Contains methods to calculate coupling matrices from large arrays\n    of scalar time series.\n\n    Comprises linear and information theoretic measures, lagged\n    and directed (causal) couplings.\n    \"\"\"\n\n    #\n    #  Definitions of internal methods\n    #\n\n    def __init__(self, dataarray, only_tri=False, silence_level=0):\n        \"\"\"\n        Initialize an instance of CouplingAnalysisPurePython.\n\n        Possible choices for only_tri:\n          - \"True\" will calculate only the upper triangle of the coupling\n            matrix, excluding the diagonal, assuming symmetry (not for directed\n            measures)\n          - \"False\" will calculate the whole matrix (asymmetry somes from\n             different integration ranges)\n\n        :type dataarray: 4D, 3D or 2D Numpy array [time, index, index] or\n                         [time, index]\n        :arg dataarray: The time series array with time in first dimension\n        :arg bool only_tri: Symmetric/asymmetric assumption on coupling matrix.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n\n        #  only_tri will calculate the upper triangle excluding the diagonal\n        #  only. This assumes stationarity on the time series\n        self.only_tri = only_tri\n\n        #  Set silence level\n        self.silence_level = silence_level\n\n        #  Flatten observable anomaly array along lon/lat dimension to allow\n        #  for more convinient indexing and transpose the whole array as this\n        #  is faster in loops\n        if numpy.ndim(dataarray) == 4:\n            (self.total_time, n_lev, n_lat, n_lon) = dataarray.shape\n            self.N = n_lev * n_lat * n_lon\n            self.dataarray = dataarray.reshape(-1, self.N).T.copy()\n        if numpy.ndim(dataarray) == 3:\n            (self.total_time, n_lat, n_lon) = dataarray.shape\n            self.N = n_lat * n_lon\n            self.dataarray = dataarray.reshape(-1, self.N).T.copy()\n\n        elif numpy.ndim(dataarray) == 2:\n            (self.total_time, self.N) = dataarray.shape\n            self.dataarray = dataarray.T.copy()\n\n        else:\n            print(\"irregular array shape...\")\n            self.dataarray = dataarray.T.copy()\n\n        #  factorials below 10 in a list for permutation patterns\n        self.factorial = \\\n            numpy.array([1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880])\n        self.patternized = False\n        self.has_fft = False\n        self.originalFFT = None\n\n        #  lag_mode dict\n        self.lag_modi = {\"all\": 0, \"sum\": 1, \"max\": 2}\n\n    def __str__(self):\n        \"\"\"\n        Return a string representation of the CouplingAnalysisPurePython\n        object.\n        \"\"\"\n        shape = self.dataarray.shape\n        return (f'CouplingAnalysisPurePython: {shape[0]} variables, '\n                f'{shape[1]} timesteps.')\n\n    #\n    #  Define methods to calculate correlation strength and lags\n    #\n\n    #\n    #  Routines for calculating Cross Correlation\n    #\n\n    def cross_correlation(self, tau_max=0, lag_mode='all'):\n        \"\"\"\n        Returns the normalized cross correlation from all pairs of nodes from\n        a range of time lags.\n\n        The calculation ranges are shown below::\n\n            (-------------------------total_time--------------------------)\n            (---tau_max---)(---------corr_range------------)(---tau_max---)\n\n        CC is calculated about corr_range and with the other time series\n        shifted by tau\n\n        Possible choices for lag_mode:\n\n        - \"all\" will return the full function for all lags, possible large\n          memory need if only_tri is True, only the upper triangle contains the\n          values, the lower one is zeros\n        - \"sum\" will return the sum over positive and negative lags seperatly,\n          each inclunding tau=0 corrmat[0] is the positive sum, corrmat[1] the\n          negative sum\n        - \"max\" will return only the maximum coupling (in corrmat[0]) and its\n          lag (in corrmat[1])\n\n        :arg int tau_max: maximum lag in both directions, including last lag\n        :arg str lag_mode: the output mode\n        :rtype: 3D numpy array (float) [index, index, index]\n        :return: correlation matrix with different lag_mode choices\n        \"\"\"\n        #  Normalize anomaly time series to zero mean and unit variance for all\n        #  lags, array contains normalizations for all lags\n        corr_range = self.total_time - 2*tau_max\n        normalized_array = numpy.empty((2*tau_max + 1, self.N, corr_range),\n                                       dtype=\"float32\")\n\n        for t in range(2*tau_max + 1):\n            #  Remove mean value from time series at each vertex (grid point)\n            normalized_array[t] = self.dataarray[:, t:t+corr_range] - \\\n                self.dataarray[:, t:t+corr_range].\\\n                mean(axis=1).reshape(self.N, 1)\n\n            #  Normalize the variance of anomalies to one\n            normalized_array[t] /= normalized_array[t].\\\n                std(axis=1).reshape(self.N, 1)\n\n            #  Correct for grid points with zero variance in their time series\n            normalized_array[t][numpy.isnan(normalized_array[t])] = 0\n\n        return self._calculate_cc(normalized_array, tau_max=tau_max,\n                                  lag_mode=lag_mode)\n\n    def shuffled_surrogate_for_cc(self, fourier=False, tau_max=1,\n                                  lag_mode='all'):\n        \"\"\"\n        Returns a correlation matrix calculated with an independently shuffled\n        surrogate of the dataarray of length corr_range for all taus.\n\n        :arg int corr_range: length of sample\n        :arg int tau_max: maximum lag in both directions, including last lag\n        :arg str lag_mode: output mode\n        :rtype: 3D numpy array (float) [index, index, index]\n        :return: correlation matrix with different lag_mode choices\n        \"\"\"\n        # pylint: disable=possibly-used-before-assignment\n\n        if lag_mode not in self.lag_modi:\n            raise ValueError('lag_mode must be \"all\", \"sum\" or \"max\".')\n\n        corr_range = self.total_time - 2*tau_max\n\n        # Shuffle a copy of dataarray separatly for each node\n        array = numpy.copy(self.dataarray)\n        if fourier:\n            array = self.correlatedNoiseSurrogates(array)\n        else:\n            for i in range(self.N):\n                numpy.random.shuffle(array[i])\n\n        sample_array = numpy.zeros((1, self.N, corr_range), dtype=\"float32\")\n\n        sample_array[0] = array[:, :corr_range]\n        sample_array[0] -= sample_array[0].mean(axis=1).reshape(self.N, 1)\n        sample_array[0] /= sample_array[0].std(axis=1).reshape(self.N, 1)\n        sample_array[0, numpy.isnan(sample_array[0])] = 0\n\n        res = self._calculate_cc(sample_array, tau_max=0, lag_mode='all')\n\n        if lag_mode == 'all':\n            corrmat = numpy.repeat(res, 2*tau_max + 1, axis=0)\n        elif lag_mode == 'sum':\n            corrmat = numpy.array([abs(res[0]), abs(res[0])]) * (tau_max+1.)\n        elif lag_mode == 'max':\n            corrmat = numpy.array([abs(res[0]),\n                                   numpy.random.randint(-tau_max, tau_max+1,\n                                                        (self.N, self.N))])\n\n        return corrmat\n\n    def time_surrogate_for_cc(self, sample_range=100, tau_max=1,\n                              lag_mode='all'):\n        \"\"\"\n        Returns a joint shuffled surrogate of the full dataarray of length\n        sample_range for all taus.\n\n        Used for time evolution analysis. First one initializes the\n        CouplingAnalysis class with the full dataarray and then this function\n        is called for every single surrogate.\n\n        :arg int sample_range: length of sample\n        :arg int tau_max: maximum lag in both directions, including last lag\n        :arg str lag_mode: output mode\n        :rtype: 3D numpy array (float) [index, index, index]\n        :return: correlation matrix with different lag_mode choices\n        \"\"\"\n\n        perm = numpy.random.permutation(\n            range(tau_max, self.total_time - tau_max))[:sample_range]\n\n        sample_array = numpy.empty((2*tau_max + 1, self.N, sample_range),\n                                   dtype=\"float32\")\n\n        for t in range(2 * tau_max + 1):\n            tau = t - tau_max\n            sample_array[t] = self.dataarray[:, perm + tau]\n            sample_array[t] -= sample_array[t].mean(axis=1).reshape(self.N, 1)\n            sample_array[t] /= sample_array[t].std(axis=1).reshape(self.N, 1)\n            sample_array[t][numpy.isnan(sample_array[t])] = 0\n\n        return self._calculate_cc(sample_array, tau_max=tau_max,\n                                  lag_mode=lag_mode)\n\n    def _calculate_cc(self, array, tau_max, lag_mode):\n        \"\"\"\n        Returns the CC matrix.\n\n        :arg int tau_max: maximum lag in both directions, including last lag\n        :arg str lag_mode: output mode\n        :rtype: 3D numpy array (float) [index, index, index]\n        :return: correlation matrix with different lag_mode choices\n\n        ## lag_mode dict\n        mode = self.lag_modi[lag_mode]\n        \"\"\"\n        # pylint: disable=used-before-assignment\n\n        # lag_mode dict\n        mode = self.lag_modi[lag_mode]\n        only_tri = int(self.only_tri)\n\n        if lag_mode == 'all':\n            corrmat = numpy.zeros((2*tau_max + 1, self.N, self.N),\n                                  dtype='float32')\n        elif lag_mode == 'sum':\n            corrmat = numpy.zeros((2, self.N, self.N), dtype='float32')\n        elif lag_mode == 'max':\n            corrmat = numpy.zeros((2, self.N, self.N), dtype='float32')\n\n        # loop over all node pairs, NOT symmetric due to time shifts!\n        for i in range(self.N-only_tri):\n            for j in range((i+1)*only_tri, self.N):\n\n                if mode == 2:\n                    maxcross = 0.0\n                    argmax = 0\n\n                # loop over taus INCLUDING the last tau value\n                for t in range(2*tau_max+1):\n\n                    # here the actual cross correlation is calculated\n                    crossij = (array[tau_max, i, :] * array[t, j, :]).mean()\n\n                    # fill in values in matrix depending on lag_mode\n                    if mode == 0:\n                        corrmat[t, i, j] = crossij\n\n                    elif mode == 1:\n                        if t <= tau_max:\n                            corrmat[1, i, j] += numpy.abs(crossij)\n                        if t >= tau_max:\n                            corrmat[0, i, j] += numpy.abs(crossij)\n\n                    elif mode == 2:\n                        # calculate max and argmax by comparing to previous\n                        # value and storing max\n                        if numpy.abs(crossij) > maxcross:\n                            maxcross = numpy.abs(crossij)\n                            argmax = t\n\n                if mode == 2:\n                    corrmat[0, i, j] = maxcross\n                    corrmat[1, i, j] = argmax - tau_max\n\n        if self.only_tri:\n            if lag_mode == 'all':\n                corrmat = corrmat + corrmat.transpose(0, 2, 1)[::-1]\n            elif lag_mode == 'sum':\n                corrmat[0] += corrmat[1].transpose()\n                corrmat[1] = corrmat[0].transpose()\n            elif lag_mode == 'max':\n                corrmat[0] += corrmat[0].transpose()\n                corrmat[1] -= corrmat[1].transpose()\n\n        return corrmat\n\n    #\n    #  Routines for calculating Mutual Information with adaptive bins\n    #\n\n    def mutual_information(self, bins=16, tau_max=0, lag_mode='all'):\n        \"\"\"\n        Returns the normalized mutual information from all pairs of nodes from\n        a range of time lags.\n\n        MI = H_x + H_y - H_xy\n\n        Uses adaptive bins, where each marginal bin contains the same number of\n        samples. Then the marginal entropies have equal probable distributions\n        H_x = H_y = log(bins)\n\n        The calculation ranges are shown below::\n\n            (-------------------------total_time--------------------------)\n            (---tau_max---)(---------corr_range------------)(---tau_max---)\n\n        MI is calculated about corr_range and with the other time series\n        shifted by tau\n\n        Possible choices for lag_mode:\n\n        - \"all\" will return the full function for all lags, possible large\n          memory need if only_tri is True, only the upper triangle contains the\n          values, the lower one is zeros\n        - \"sum\" will return the sum over positive and negative lags seperatly,\n          each inclunding tau=0 corrmat[0] is the positive sum, corrmat[1] the\n          negative sum\n        - \"max\" will return only the maximum coupling (in corrmat[0]) and its\n          lag (in corrmat[1])\n\n        :arg int bins: number of bins for estimating MI\n        :arg int tau_max: maximum lag in both directions, including last lag\n        :arg str lag_mode: output mode\n        :rtype: 3D numpy array (float) [index, index, index]\n        :return: correlation matrix with different lag_mode choices\n        \"\"\"\n        if bins < 255:\n            dtype = 'uint8'\n        else:\n            dtype = 'int16'\n\n        # Normalize anomaly time series to zero mean and unit variance for all\n        # lags, array contains normalizations for all lags\n        corr_range = self.total_time - 2*tau_max\n\n        # get the bin quantile steps\n        bin_edge = numpy.ceil(corr_range/float(bins)).astype(int)\n\n        symbolic_array = numpy.empty((2*tau_max + 1, self.N, corr_range),\n                                     dtype=dtype)\n\n        for t in range(2*tau_max + 1):\n\n            array = self.dataarray[:, t:t+corr_range]\n\n            # get the lower edges of the bins for every time series\n            edges = numpy.sort(array, axis=1)[:, ::bin_edge]\n            bins = edges.shape[1]\n\n            # This gives the symbolic time series\n            symbolic_array[t] = \\\n                (array.reshape(self.N, corr_range, 1)\n                 >= edges.reshape(self.N, 1, bins)).sum(axis=2) - 1\n\n        return self._calculate_mi(symbolic_array, corr_range=corr_range,\n                                  bins=bins, tau_max=tau_max,\n                                  lag_mode=lag_mode)\n\n    def mutual_information_edges(self, bins=16, tau=0):\n        \"\"\"\n        Returns the normalized mutual information from all pairs of nodes from\n        a range of time lags.\n\n        MI = H_x + H_y - H_xy\n\n        Uses adaptive bins, where each marginal bin contains the same number of\n        samples. Then the marginal entropies have equal probable distributions\n        H_x = H_y = log(bins)\n\n        The calculation ranges are shown below::\n\n            (-------------------------total_time--------------------------)\n            (---tau_max---)(---------corr_range------------)(---tau_max---)\n\n        MI is calculated about corr_range and with the other time series\n        shifted by tau\n\n        :arg int bins: number of bins for estimating MI\n        :arg int tau_max: maximum lag in both directions, including last lag\n        :rtype: 2D numpy array (float) [index, index]\n        :return: bin edges for zero lag\n        \"\"\"\n\n        # get the bin quantile steps\n        bin_edge = numpy.ceil(self.total_time/float(bins))\n\n        array = self.dataarray[:, :]\n        array[:-tau, 1] = array[tau, 1]\n\n        # get the lower edges of the bins for every time series\n        edges = numpy.sort(array, axis=1)[:, ::bin_edge]\n        bins = edges.shape[1]\n\n        return edges\n\n    def shuffled_surrogate_for_mi(self, fourier=False, bins=16, tau_max=0,\n                                  lag_mode='all'):\n        \"\"\"\n        Returns a shuffled surrogate of normalized mutual information from all\n        pairs of nodes from a range of time lags.\n\n        :arg int bins: number of bins for estimating MI\n        :arg int tau_max: maximum lag in both directions, including last lag\n        :arg str lag_mode: output mode\n        :rtype: 3D numpy array (float) [index, index, index]\n        :return: correlation matrix with different lag_mode choices\n        \"\"\"\n        # pylint: disable=possibly-used-before-assignment\n\n        if lag_mode not in self.lag_modi:\n            raise ValueError('lag_mode must be \"all\", \"sum\" or \"max\".')\n\n        if bins < 255:\n            dtype = 'uint8'\n        else:\n            dtype = 'int16'\n\n        #  Normalize anomaly time series to zero mean and unit variance for all\n        #  lags, array contains normalizations for all lags\n        corr_range = self.total_time - 2*tau_max\n\n        # Shuffle a copy of dataarray seperatly for each node\n        array = numpy.copy(self.dataarray)\n        if fourier:\n            array = self.correlatedNoiseSurrogates(array)\n        else:\n            for i in range(self.N):\n                numpy.random.shuffle(array[i])\n\n        # get the bin quantile steps\n        bin_edge = numpy.ceil(corr_range/float(bins)).astype(int)\n\n        symbolic_array = numpy.empty((1, self.N, corr_range), dtype=dtype)\n\n        array = array[:, :corr_range]\n\n        # get the lower edges of the bins for every time series\n        edges = numpy.sort(array, axis=1)[:, ::bin_edge]\n        bins = edges.shape[1]\n\n        # This gives the symbolic time series\n        symbolic_array[0] = \\\n            (array.reshape(self.N, corr_range, 1)\n             >= edges.reshape(self.N, 1, bins)).sum(axis=2) - 1\n\n        res = self._calculate_mi(symbolic_array, corr_range=corr_range,\n                                 bins=bins, tau_max=0, lag_mode='all')\n\n        if lag_mode == 'all':\n            corrmat = numpy.repeat(res, 2*tau_max + 1, axis=0)\n        elif lag_mode == 'sum':\n            corrmat = numpy.array([res[0], res[0]]) * (tau_max+1.)\n        elif lag_mode == 'max':\n            corrmat = numpy.array(\n                [res[0], numpy.random.randint(-tau_max, tau_max+1,\n                                              (self.N, self.N))])\n\n        return corrmat\n\n    def time_surrogate_for_mi(self, bins=16, sample_range=100, tau_max=1,\n                              lag_mode='all'):\n        \"\"\"\n        Returns a joint shuffled surrogate of the full dataarray of length\n        sample_range for all taus.\n\n        Used for time evolution analysis. First one initializes the\n        CouplingAnalysis class with the full dataarray and then this function\n        is called for every single surrogate.\n\n        :arg int sample_range: length of sample\n        :arg int bins: number of bins for estimating MI\n        :arg int tau_max: maximum lag in both directions, including last lag\n        :arg str lag_mode: output mode\n        :rtype: 3D numpy array (float) [index, index, index]\n        :return: correlation matrix with different lag_mode choices\n        \"\"\"\n\n        if bins < 255:\n            dtype = 'uint8'\n        else:\n            dtype = 'int16'\n\n        perm = numpy.random.permutation(\n            range(tau_max, self.total_time - tau_max))[:sample_range]\n\n        # get the bin quantile steps\n        bin_edge = numpy.ceil(sample_range/float(bins))\n\n        symbolic_array = numpy.empty((2*tau_max + 1, self.N, sample_range),\n                                     dtype=dtype)\n\n        for t in range(2*tau_max + 1):\n            tau = t - tau_max\n\n            array = self.dataarray[:, perm + tau]\n\n            # get the lower edges of the bins for every time series\n            edges = numpy.sort(array, axis=1)[:, ::bin_edge]\n            bins = edges.shape[1]\n\n            # This gives the symbolic time series\n            symbolic_array[t] = \\\n                (array.reshape(self.N, sample_range, 1)\n                 >= edges.reshape(self.N, 1, bins)).sum(axis=2) - 1\n\n        return self._calculate_mi(symbolic_array, corr_range=sample_range,\n                                  bins=bins, tau_max=tau_max,\n                                  lag_mode=lag_mode)\n\n    # pylint: disable=too-many-positional-arguments\n    def _calculate_mi(self, array, corr_range, bins, tau_max, lag_mode):\n        \"\"\"\n        Returns the mi matrix.\n\n        :arg int bins: number of bins for estimating MI\n        :arg int tau_max: maximum lag in both directions, including last lag\n        :arg str lag_mode: output mode\n        :rtype: 3D numpy array (float) [index, index, index]\n        :return: correlation matrix with different lag_mode choices\n        \"\"\"\n        # pylint: disable=used-before-assignment\n\n        # lag_mode dict\n        mode = self.lag_modi[lag_mode]\n        only_tri = int(self.only_tri)\n\n        # Initialize\n        hist2D = numpy.zeros((bins, bins), dtype=\"int32\")\n        if lag_mode == 'all':\n            corrmat = numpy.zeros((2*tau_max + 1, self.N, self.N),\n                                  dtype='float32')\n        elif lag_mode == 'sum':\n            corrmat = numpy.zeros((2, self.N, self.N), dtype='float32')\n        elif lag_mode == 'max':\n            corrmat = numpy.zeros((2, self.N, self.N), dtype='float32')\n\n        # Precalculation of the log\n        gfunc = numpy.zeros(corr_range+1)\n        for t in range(1, corr_range + 1):\n            gfunc[t] = t*numpy.log(t)\n\n        # loop over all node pairs, NOT symmetric due to time shifts!\n        for i in range(self.N-only_tri):\n            for j in range((i+1)*only_tri, self.N):\n\n                if mode == 2:\n                    maxcross = 0.0\n                    argmax = 0\n\n                # loop over taus from -tau_max to tau_max INCLUDING the last\n                # tau value\n                for t in range(2*tau_max + 1):\n                    tau = t - tau_max\n\n                    # here the joint probability distribution is calculated\n                    for k in range(corr_range):\n                        indexi = array[tau_max, i, k]\n                        indexj = array[t, j, k]\n                        hist2D[indexi, indexj] += 1\n\n                    # here the joint entropy is calculated by summing over all\n                    # pattern combinations\n                    jointent = 0.0\n                    for m in range(bins):\n                        for n in range(bins):\n                            jointent -= gfunc[hist2D[m, n]]\n                            hist2D[m, n] = 0\n\n                    jointent /= float(corr_range)\n                    jointent += numpy.log(float(corr_range))\n\n                    # Mutual Information is...\n                    mi = 0.0\n                    mi = 2. * numpy.log(bins) - jointent\n\n                    # norm the mi\n                    mi /= numpy.log(bins)\n\n                    # fill in values in matrix depending on lag_mode\n                    if mode == 0:\n                        corrmat[t, i, j] = mi\n\n                    elif mode == 1:\n                        if t <= tau_max:\n                            corrmat[1, i, j] += mi\n                        if t >= tau_max:\n                            corrmat[0, i, j] += mi\n\n                    elif mode == 2:\n                        # calculate max and argmax by comparing to previous\n                        # value and storing max\n                        if mi > maxcross:\n                            maxcross = mi\n                            argmax = tau\n\n                if mode == 2:\n                    corrmat[0, i, j] = maxcross\n                    corrmat[1, i, j] = argmax\n\n        if self.only_tri:\n            if lag_mode == 'all':\n                corrmat = corrmat + corrmat.transpose(0, 2, 1)[::-1]\n            if lag_mode == 'sum':\n                corrmat[0] += corrmat[1].transpose()\n                corrmat[1] = corrmat[0].transpose()\n            elif lag_mode == 'max':\n                corrmat[0] += corrmat[0].transpose()\n                corrmat[1] -= corrmat[1].transpose()\n\n        return corrmat\n\n    #\n    # A subroutine for fourier surrogates (from J Donges)\n    #\n\n    def correlatedNoiseSurrogates(self, original):\n        \"\"\"\n        Generates surrogates by Fourier transforming the original time series,\n        randomizing the phases and then applying an inverse Fourier transform.\n        Correlated noise surrogates share their power spectrum and\n        autocorrelation function with the original time series.\n\n        :type original: 2D array\n        :arg original: dim. 0 is index of time series, dim. 1 is time\n        :return: surrogate time series (same dimensions as original)\n        \"\"\"\n\n        #  Calculate FFT of original time series\n        #  The FFT of the original data has to be calculated only once, so it\n        #  is stored in self.originalFFT\n        if self.has_fft:\n            surrogates = self.originalFFT\n        else:\n            surrogates = numpy.fft.fft(original, axis=1)\n            self.originalFFT = surrogates\n            self.has_fft = True\n\n        (nNodes, ntime) = original.shape\n\n        if (ntime % 2) == 0:\n            lenPhase = (ntime - 2) / 2\n        else:\n            lenPhase = (ntime - 1) / 2\n\n        #  Generate random phases uniformly distributed in the interval\n        #  [0, 2*Pi]. Guarantee that the phases for positive and negative\n        #  frquencies are the same to obtain real surrogates in the end!\n        phases = numpy.random.uniform(low=0, high=2 * numpy.pi,\n                                      size=(nNodes, lenPhase))\n\n        #  Add random phases uniformly distributed in the interval [0, 2*Pi]\n        surrogates[:, 1:lenPhase+1] *= numpy.exp(1j * phases)\n\n        #  Discriminate between even and uneven number of samples\n        #  Note that the output of fft has the following form:\n        #  - Even sample number: (mean, pos. freq, nyquist freq, neg. freq)\n        #  - Odd sample number: (mean, pos. freq, neg. freq)\n        if (ntime % 2) == 0:\n            surrogates[:, lenPhase+2:ntime] = \\\n                numpy.flipud(surrogates[:, 1:lenPhase+1].conjugate())\n        else:\n            surrogates[:, lenPhase+1:ntime] = \\\n                numpy.flipud(surrogates[:, 1:lenPhase+1].conjugate())\n\n        #  Calculate IFFT and take the real part, the remaining imaginary part\n        #  is due to numerical errors\n        return numpy.ascontiguousarray(numpy.real(\n            numpy.fft.ifft(surrogates, axis=1)))\n"
  },
  {
    "path": "src/pyunicorn/timeseries/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\ntimeseries\n==========\n\nProvides classes for the analysis of dynamical systems and time series based on\nrecurrence plots, including measures of recurrence quantification analysis\n(RQA) and recurrence network analysis.\n\nAlso contains methods to calculate the RQA (recurrence quantification analysis)\nmeasures of the recurrence plot.\n\nRelated Publications\n~~~~~~~~~~~~~~~~~~~~\nRecurrence plots, RQA, Recurrence Network Analysis\n--------------------------------------------------\n[Marwan2007]_, [Marwan2009]_, [Donner2010a]_, [Donner2010b]_, [Donner2011a]_,\n[Donner2011b]_, [Zou2010]_, [Donges2011b]_, [Donges2011c]_, [Donges2012]_,\n[Feldhoff2012]_, [Zou2012]_, [Feldhoff2013]_\n\nVisibility Graph Analysis of Geoscientific Time Series\n------------------------------------------------------\n[Donner2012]_\n\nTo do\n~~~~~\n  - Implement access to threshold_from_recurrence_rate_fast from\n    constructor of RecurrencePlot.\n  - Add more RQA measures and improve their documentation, including formulas.\n  - Add random node relabeling to Network class.\n\nKnown Bugs\n~~~~~~~~~~\n  - RQA measures are not yet calculated correctly for Eckmann recurrence plots.\n\n\"\"\"\n\nfrom .cross_recurrence_plot import CrossRecurrencePlot\nfrom .inter_system_recurrence_network import InterSystemRecurrenceNetwork\nfrom .joint_recurrence_network import JointRecurrenceNetwork\nfrom .joint_recurrence_plot import JointRecurrencePlot\nfrom .recurrence_network import RecurrenceNetwork\nfrom .recurrence_plot import RecurrencePlot\nfrom .surrogates import Surrogates\nfrom .visibility_graph import VisibilityGraph\n"
  },
  {
    "path": "src/pyunicorn/timeseries/_ext/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n"
  },
  {
    "path": "src/pyunicorn/timeseries/_ext/numerics.pyx",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\nfrom libc.math cimport sqrt, floor\n\nfrom datetime import datetime\nimport random\n\nimport numpy as np\nimport numpy.random as rd\ncimport numpy as cnp\nfrom numpy cimport ndarray\n\nfrom ...core._ext.types import MASK, NODE, LAG, FIELD, DFIELD\nfrom ...core._ext.types cimport \\\n    ADJ_t, MASK_t, NODE_t, DEGREE_t, LAG_t, FIELD_t, DFIELD_t\n\ncdef extern from \"src_numerics.c\":\n    void _test_pearson_correlation_fast(double *original_data,\n        double *surrogates, float *correlation, int n_time, int N, double norm)\n    void _test_mutual_information_fast(int N, int n_time, int n_bins,\n        double scaling, double range_min, double *original_data,\n        double *surrogates, int *symbolic_original, int *symbolic_surrogates,\n        int *hist_original, int *hist_surrogates, int * hist2d, float *mi)\n\n\n# cross_recurrence_plot =======================================================\n\n\ndef _manhattan_distance_matrix_crp(\n    int ntime_x, int ntime_y, int dim,\n    ndarray[DFIELD_t, ndim=2, mode='c'] x_embedded not None,\n    ndarray[DFIELD_t, ndim=2, mode='c'] y_embedded not None):\n\n    cdef:\n        int j, k, l\n        DFIELD_t sum\n        ndarray[DFIELD_t, ndim=2, mode='c'] distance = \\\n            np.zeros((ntime_x, ntime_y), dtype=DFIELD)\n\n    for j in range(ntime_x):\n        for k in range(ntime_y):\n            sum = 0\n            for l in range(dim):\n                diff = abs(x_embedded[j,l] - y_embedded[k,l])\n                sum += diff\n            distance[j, k] = sum\n    return distance\n\n\ndef _euclidean_distance_matrix_crp(\n    int ntime_x, int ntime_y, int dim,\n    ndarray[DFIELD_t, ndim=2, mode='c'] x_embedded not None,\n    ndarray[DFIELD_t, ndim=2, mode='c'] y_embedded not None):\n\n    cdef:\n        int j, k, l\n        DFIELD_t sum, diff\n        ndarray[DFIELD_t, ndim=2, mode='c'] distance = \\\n            np.zeros((ntime_x, ntime_y), dtype=DFIELD)\n\n    for j in range(ntime_x):\n        for k in range(ntime_y):\n            sum = 0\n            for l in range(dim):\n                diff = abs(x_embedded[j,l] - y_embedded[k,l])\n                sum += diff * diff\n            distance[j, k] = sqrt(sum)\n    return distance\n\n\ndef _supremum_distance_matrix_crp(\n    int ntime_x, int ntime_y, int dim,\n    ndarray[DFIELD_t, ndim=2, mode='c'] x_embedded not None,\n    ndarray[DFIELD_t, ndim=2, mode='c'] y_embedded not None):\n\n    cdef:\n        int j, k, l\n        DFIELD_t temp_diff, diff\n        ndarray[DFIELD_t, ndim=2, mode='c'] distance = \\\n            np.zeros((ntime_x, ntime_y), dtype=DFIELD)\n\n    for j in range(ntime_x):\n        for k in range(ntime_y):\n            diff = 0\n            for l in range(dim):\n                temp_diff = abs(x_embedded[j,l] - y_embedded[k,l])\n                if temp_diff > diff:\n                    diff = temp_diff\n            distance[j, k] = diff\n    return distance\n\n\n# surrogates ==================================================================\n\n\ndef _embed_time_series_array(\n    int n, int n_time, int dimension, int delay,\n    ndarray[DFIELD_t, ndim=2] time_series_array,\n    ndarray[DFIELD_t, ndim=3] embedding):\n\n    cdef:\n        int i, j, k, max_delay, len_embedded, index\n        int N = n, D = dimension\n\n    # Calculate the maximum delay\n    max_delay = (dimension - 1) * delay\n    # Calculate the length of the embedded time series\n    len_embedded = n_time - max_delay\n\n    for i in range(N):\n        for j in range(D):\n            index = j*delay\n            for k in range(len_embedded):\n                embedding[i, k, j] = time_series_array[i, index]\n                index += 1\n\n\ndef _recurrence_plot(\n    int n_time, int dimension, float threshold,\n    ndarray[DFIELD_t, ndim=2] embedding,\n    ndarray[ADJ_t, ndim=2] R):\n\n    cdef:\n        int j, k, l, T = n_time, D = dimension\n        DFIELD_t diff\n\n    for j in range(T):\n        # Ignore the main diagonal, since every sample is neighbor of itself\n        for k in range(j):\n            for l in range(D):\n                # Use supremum norm\n                diff = embedding[j, l] - embedding[k, l]\n\n                if abs(diff) > threshold:\n                    # j and k are not neighbors\n                    R[j, k] = R[k, j] = 0\n\n                    # Leave the loop\n                    break\n\n\ndef _twins_s(\n    int N, int n_time, int dimension, float threshold, int min_dist,\n    ndarray[DFIELD_t, ndim=3] embedding_array,\n    ndarray[ADJ_t, ndim=2] R, ndarray[DEGREE_t, ndim=1] nR,\n    twins):\n\n    cdef:\n        int i, j, k, l\n        DFIELD_t diff\n        object twins_i, twins_ij, twins_ik\n\n    for i in range(N):\n        # Initialize the recurrence matrix R and nR\n        for j in range(n_time):\n            for k in range(j+1):\n                R[j, k] = R[k, j] = 1\n            nR[j] = <DEGREE_t> n_time\n\n        # Calculate the recurrence matrix for time series i\n        for j in range(n_time):\n            # Ignore main diagonal, since every sample is neighbor of itself\n            for k in range(j):\n                for l in range(dimension):\n                    # Use maximum norm\n                    diff = embedding_array[i, j, l] - embedding_array[i, k, l]\n\n                    if abs(diff) > threshold:\n                        # j and k are not neighbors\n                        R[j, k] = R[k, j] = 0\n\n                        # Reduce neighbor count of j and k by one\n                        nR[j] -= 1\n                        nR[k] -= 1\n\n                        # Leave the for loop\n                        break\n\n        # Add list for twins in time series i\n        twins.append([])\n\n        # Find all twins in the recurrence matrix\n        for j in range(n_time):\n            twins_i = twins[i]\n            twins_i.append([])\n            twins_ij = twins_i[j]\n\n            # Respect a minimal temporal spacing between twins to avoid false\n            # twins due to the higher\n            # sample density in phase space along the trajectory\n            for k in range(j - min_dist):\n                # Continue only if both samples have the same number of\n                # neighbors and more than just one neighbor (themselves)\n                if nR[j] == nR[k] and nR[j] != 1:\n                    l = 0\n\n                    while R[j, l] == R[k, l]:\n                        l += 1\n\n                        # If l is equal to the length of the time series at\n                        # this point, j and k are twins\n                        if l == n_time:\n                            # Add the twins to the twin list\n                            twins_ik = twins_i[k]\n\n                            twins_ij.append(k)\n                            twins_ik.append(j)\n\n                            # Leave the while loop\n                            break\n\n\ndef _twin_surrogates_s(int n_surrogates, int N, twins,\n                       ndarray[DFIELD_t, ndim=2] original_data):\n    cdef:\n        int i, j, k, new_k, n_twins, rand\n        object twins_i, twins_ik\n        ndarray[DFIELD_t, ndim=2] surrogates = np.empty(\n            (n_surrogates, N), dtype=DFIELD)\n\n    for i in range(n_surrogates):\n        # Get the twin list for time series i\n        twins_i = twins[i]\n        # Randomly choose a starting point in the original trajectory\n        k = int(floor(random.random() * N))\n\n        j = 0\n        while j < N:\n            # Assign state vector of surrogate trajectory\n            surrogates[i,j] = original_data[i,k]\n            # Get the list of twins of state vector k in the original time\n            # series\n            twins_ik = twins_i[k]\n\n            # Get the number of twins of k\n            n_twins = int(len(twins_ik))\n            # If k has no twins, go to the next sample k+1, If k has twins at\n            # m, choose among m+1 and k+1 with equal probability\n            if n_twins == 0:\n                k += 1\n            else:\n                # Generate a random integer between 0 and n_twins\n                rand = int(floor(random.random() * (n_twins + 1)))\n\n                # If rand = n_twings go to smple k+1, otherwise jump to the\n                # future of one of the twins\n                if rand == n_twins:\n                    k += 1\n                else:\n                    k = twins_ik[rand]\n                    k += 1\n\n            # If the new k >= n_time, choose a new random starting point in the\n            # original time series\n            if k >= N:\n                while True:\n                    new_k = int(floor(random.random() * N))\n                    if new_k != k:\n                        break\n                k = new_k\n\n            j += 1\n\n    return surrogates\n\n\ndef _test_pearson_correlation(\n    ndarray[DFIELD_t, ndim=2, mode='c'] original_data not None,\n    ndarray[DFIELD_t, ndim=2, mode='c'] surrogates not None,\n    int N, int n_time):\n\n    cdef:\n        DFIELD_t norm = 1.0 / float(n_time)\n        #  Initialize Pearson correlation matrix\n        ndarray[FIELD_t, ndim=2, mode='c'] correlation = np.zeros(\n            (N, N), dtype=FIELD)\n\n    _test_pearson_correlation_fast(\n        <DFIELD_t*> cnp.PyArray_DATA(original_data),\n        <DFIELD_t*> cnp.PyArray_DATA(surrogates),\n        <FIELD_t*> cnp.PyArray_DATA(correlation),\n        n_time, N, norm)\n\n    return correlation\n\n\ndef _test_mutual_information(\n    ndarray[DFIELD_t, ndim=2, mode='c'] original_data not None,\n    ndarray[DFIELD_t, ndim=2, mode='c'] surrogates not None,\n    int N, int n_time, int n_bins):\n\n    cdef:\n        #  Get common range for all histograms\n        DFIELD_t range_min = np.min((original_data.min(), surrogates.min()))\n        DFIELD_t range_max = np.max((original_data.max(), surrogates.max()))\n        #  Rescale all time series to the interval [0,1], using the maximum\n        #  range of the whole dataset\n        DFIELD_t scaling = 1. / (range_max - range_min)\n        #  Create arrays to hold symbolic trajectories\n        ndarray[NODE_t, ndim=2, mode='c'] symbolic_original = \\\n            np.empty((N, n_time), dtype=NODE)\n        ndarray[NODE_t, ndim=2, mode='c'] symbolic_surrogates = \\\n            np.empty((N, n_time), dtype=NODE)\n        #  Initialize array to hold 1d-histograms of individual time series\n        ndarray[NODE_t, ndim=2, mode='c'] hist_original = \\\n            np.zeros((N, n_bins), dtype=NODE)\n        ndarray[NODE_t, ndim=2, mode='c'] hist_surrogates = \\\n            np.zeros((N, n_bins), dtype=NODE)\n        #  Initialize array to hold 2d-histogram for one pair of time series\n        ndarray[NODE_t, ndim=2, mode='c'] hist2d = \\\n            np.zeros((n_bins, n_bins), dtype=NODE)\n        #  Initialize mutual information array\n        ndarray[FIELD_t, ndim=2, mode='c'] mi = np.zeros((N, N), dtype=FIELD)\n\n    _test_mutual_information_fast(\n            N, n_time, n_bins, scaling, range_min,\n            <DFIELD_t*> cnp.PyArray_DATA(original_data),\n            <DFIELD_t*> cnp.PyArray_DATA(surrogates),\n            <int*> cnp.PyArray_DATA(symbolic_original),\n            <int*> cnp.PyArray_DATA(symbolic_surrogates),\n            <int*> cnp.PyArray_DATA(hist_original),\n            <int*> cnp.PyArray_DATA(hist_surrogates),\n            <int*> cnp.PyArray_DATA(hist2d),\n            <FIELD_t*> cnp.PyArray_DATA(mi))\n\n    return mi\n\n\n# recurrence plot =============================================================\n\n\ndef _embed_time_series(\n    int n_time, int dim, int tau,\n    ndarray[FIELD_t, ndim=1] time_series,\n    ndarray[FIELD_t, ndim=2] embedding):\n\n    cdef:\n        int j, max_delay, index, D = dim\n        int k, len_embedded\n\n    # Calculate the maximum delay\n    max_delay = (dim - 1) * tau\n    # Calculate the length of the embedded time series\n    len_embedded = n_time - max_delay\n\n    for j in range(D):\n        index = j * tau\n        for k in range(len_embedded):\n            embedding[k, j] = time_series[index]\n            index += 1\n\n\ndef _manhattan_distance_matrix_rp(\n    int n_time, int dim, ndarray[DFIELD_t, ndim=2] embedding):\n\n    cdef:\n        int j, k, l, T = n_time, D = dim\n        DFIELD_t sum\n        ndarray[DFIELD_t, ndim=2, mode='c'] distance = \\\n            np.zeros((n_time, n_time), dtype=DFIELD)\n\n    for j in range(T):\n        # Ignore the main diagonal, since every samle is neighbor of itself\n        for k in range(j):\n            sum = 0\n            for l in range(D):\n                # use manhattan norm\n                sum += abs(embedding[j, l] - embedding[k, l])\n            distance[j, k] = distance[k, j] = sum\n    return distance\n\n\ndef _euclidean_distance_matrix_rp(\n    int n_time, int dim, ndarray[DFIELD_t, ndim=2] embedding):\n\n    cdef:\n        int j, k, l, T = n_time, D = dim\n        DFIELD_t sum, diff\n        ndarray[DFIELD_t, ndim=2, mode='c'] distance = \\\n            np.zeros((n_time, n_time), dtype=DFIELD)\n\n    for j in range(T):\n        # Ignore the main diagonal, since every sample is neighbor of itself\n        for k in range(j):\n            sum = 0\n            for l in range(D):\n                # Use euclidean norm\n                diff = abs(embedding[j, l] - embedding[k, l])\n                sum += diff * diff\n            distance[j, k] = distance[k, j] = sqrt(sum)\n    return distance\n\n\ndef _supremum_distance_matrix_rp(\n    int n_time, int dim, ndarray[DFIELD_t, ndim=2] embedding):\n\n    cdef:\n        int j, k, l, T = n_time, D = dim\n        DFIELD_t temp_diff, diff\n        ndarray[DFIELD_t, ndim=2, mode='c'] distance = \\\n            np.zeros((n_time, n_time), dtype=DFIELD)\n\n    for j in range(T):\n        # Ignore the main diagonal, since every sample is neighbor of itself\n        for k in range(j):\n            diff = 0\n            for l in range(D):\n                # Use supremum norm\n                temp_diff = abs(embedding[j, l] - embedding[k, l])\n                if temp_diff > diff:\n                    diff = temp_diff\n            distance[j, k] = distance[k, j] = diff\n    return distance\n\n\ndef _set_adaptive_neighborhood_size(\n    int n_time, int adaptive_neighborhood_size,\n    ndarray[NODE_t, ndim=2] sorted_neighbors,\n    ndarray[NODE_t, ndim=1] order,\n    ndarray[LAG_t, ndim=2] recurrence):\n\n    cdef:\n        int i, j, k, l\n\n    for i in range(adaptive_neighborhood_size):\n        for j in range(n_time):\n            # Get the node index to be processed\n            l = order[j]\n\n            # Start with k = i + 1, since state vectors closer than the (i+1)th\n            # nearest neighbor are already connected to j at this stage\n            k = i + 1\n            while recurrence[l, sorted_neighbors[l, k]] == 1 and k < n_time:\n                k += 1\n            # add a \"new\" nearest neighbor of l to the recurrence plot\n            recurrence[l, sorted_neighbors[l, k]] = \\\n                recurrence[sorted_neighbors[l, k], l] = 1\n\n\ndef _bootstrap_distance_matrix_manhattan(\n    int n_time, int dim, ndarray[DFIELD_t, ndim=2] embedding,\n    ndarray[DFIELD_t, ndim=1] distances, int M):\n\n    cdef:\n        int i, l\n        ndarray[NODE_t, ndim=2] jk = rd.randint(n_time, size=(2,M))\n        double sum\n\n    for i in range(M):\n        #Compute their distance\n        sum = 0\n        for l in range(dim):\n            # Use Manhattan norm\n            sum += abs(embedding[jk[0, i], l] - embedding[jk[1, i], l])\n\n        distances[i] = sum\n\n\ndef _bootstrap_distance_matrix_euclidean(\n    int n_time, int dim, ndarray[DFIELD_t, ndim=2] embedding,\n    ndarray[DFIELD_t, ndim=1] distances, int M):\n\n    cdef:\n        int i, l\n        ndarray[NODE_t, ndim=2] jk = rd.randint(n_time, size=(2,M))\n        double sum, diff\n\n    for i in range(M):\n        #Compute their distance\n        sum = 0\n        for l in range(dim):\n            # Use Manhattan norm\n            diff = abs(embedding[jk[0, i], l] - embedding[jk[1, i], l])\n            sum += diff * diff\n\n        distances[i] = sqrt(sum)\n\n\ndef _bootstrap_distance_matrix_supremum(\n    int n_time, int dim, ndarray[DFIELD_t, ndim=2] embedding,\n    ndarray[DFIELD_t, ndim=1] distances, int M):\n\n    cdef:\n        int i, l\n        ndarray[NODE_t, ndim=2] jk = rd.randint(n_time, size=(2,M))\n        double temp_diff, diff\n\n    for i in range(M):\n        #Compute their distance\n        diff = 0\n        for l in range(dim):\n            # Use supremum norm\n            temp_diff = abs(embedding[jk[0, i], l] - embedding[jk[1, i], l])\n\n            if temp_diff > diff:\n                diff = temp_diff\n\n            distances[i] = diff\n\n\ndef _rejection_sampling(\n    ndarray[DFIELD_t, ndim=1] dist,\n    ndarray[NODE_t, ndim=1] resampled_dist, int N, int M):\n\n    cdef:\n        int i = 0, x\n\n    while i < M:\n        x = int(floor(random.random() * N))\n\n        if (random.random() < dist[x]):\n            resampled_dist[x] += 1\n            i += 1\n\n\ndef _twins_r(\n    int min_dist, int N, ndarray[LAG_t, ndim=2] R,\n    ndarray[NODE_t, ndim=1] nR, twins):\n\n    cdef:\n        int j, k, l\n        object twins_j, twins_k\n\n    twins.append([])\n\n    for j in range(N):\n        twins.append([])\n        twins_j = twins[j]\n\n        # Respect a minimal temporal spacing between twins to avoid false\n        # twins du to th higher sample density in phase space along the\n        # trajectory\n        for k in range(j - min_dist):\n            # Continue only if both samples have the same number of\n            # neighbors and more than just one neighbor (themselves)\n            if nR[j] == nR[k] and nR[j] != 1:\n                l = 0\n\n                while R[j, l] == R[k, l]:\n                    l = l + 1\n\n                    # If l is equal to the length of the time series at\n                    # this point, j and k are twins\n                    if l == N:\n                        # And the twins to the twin list\n                        twins_k = twins[k]\n\n                        twins_j.append(k)\n                        twins_k.append(j)\n                        break\n\n\ndef _twin_surrogates_r(int n_surrogates, int N, int dim, twins,\n                       ndarray[DFIELD_t, ndim=2] embedding):\n    cdef:\n        int i, j, k, new_k, n_twins, rand\n        object twins_k\n        ndarray[DFIELD_t, ndim=2] surrogates = np.empty(\n            (n_surrogates, N, dim), dtype=DFIELD)\n\n    # Initialize random number generator\n    random.seed(datetime.now())\n\n    for i in range(n_surrogates):\n        # Randomly choose a starting point in the original trajectory\n        k = int(floor(random.random() * N))\n\n        j = 0\n        while j < N:\n            # Assign state vector of surrogate trajectory\n            surrogates[i, j, :] = embedding[k, :]\n            # Get the list of twins of state vector k in the original time\n            # series\n            twins_k = twins[k]\n\n            # Get the number of twins of k\n            n_twins = int(len(twins_k))\n            # If k has no twins, go to the next sample k+1, If k has twins at\n            # m, choose among m+1 and k+1 with equal probability\n            if n_twins == 0:\n                k += 1\n            else:\n                # Generate a random integer between 0 and n_twins\n                rand = int(floor(random.random() * (n_twins + 1)))\n\n                # If rand = n_twings go to smple k+1, otherwise jump to the\n                # future of one of the twins\n                if rand == n_twins:\n                    k += 1\n                else:\n                    k = twins_k[rand]\n                    k += 1\n\n            # If the new k >= n_time, choose a new random starting point in the\n            # original time series\n            if k >= N:\n                while True:\n                    new_k = int(floor(random.random() * N))\n                    if new_k != k:\n                        break\n                k = new_k\n\n            j += 1\n\n    return surrogates\n\n\n\n# recurrence line distributions ===============================================\n\n\n# parameters for `_line_dist()`\nctypedef int     (*line_type_i2J) (int, int)\nctypedef int     (*line_type_ij2I)(int, int, int)\nctypedef DFIELD_t (*metric_type)(int, int, int, DFIELD_t[:,:])\n\ncdef:\n    inline int i2J_vertline(int i, int N): return N\n    inline int i2J_diagline(int i, int N): return i+1\n    inline int ij2I_vertline(int i, int j, int N): return i\n    inline int ij2I_diagline(int i, int j, int N): return N - i + j\n    metric_type metric_null = NULL\n    inline DFIELD_t metric_supremum(int I, int j, int dim, DFIELD_t[:,:] E):\n        cdef:\n            int l\n            DFIELD_t diff = 0, tmp_diff\n        for l in range(dim):\n            tmp_diff = abs(E[I, l] - E[j, l])\n            if tmp_diff > diff:\n                diff = tmp_diff\n        return diff\n\n\ncdef void _line_dist(\n    int n_time, ndarray[NODE_t, ndim=1] hist,\n    ndarray[LAG_t, ndim=2] R, ndarray[DFIELD_t, ndim=2] E, float eps, int dim,\n    metric_type metric, bint black,\n    ndarray[MASK_t, ndim=1, cast=True] M, bint missing_values,\n    line_type_i2J i2J, line_type_ij2I ij2I, bint skip_main):\n    \"\"\"\n    Recurrence line distributions, parametrised by the following arguments:\n\n      - `R` | `E (dim > 0)`: recurrence computation (cached vs. raw embedding)\n      - `metric`: embedding metric (currently only supremum)\n      - `black`: RQA colour (black vs. white)\n      - `M (missing_values == 1)`: missing input values (ignore vs. account)\n      - `line_type_*`, `skip_main`: line type (vertical vs. diagonal)\n    \"\"\"\n\n    cdef:\n        int i, I, j, k = 0, N = n_time\n        FIELD_t d\n        bint line, missing_flag = False\n\n    if skip_main:\n        # exclude main diagonal by skipping last outer loop iteration\n        N -= 1\n    for i in range(N):\n        for j in range(i2J(i, N)):\n            I = ij2I(i, j, N)\n\n            if dim == 0:\n                line = R[I, j] == black\n            else:\n                # compute distance between embedding vectors\n                d = metric(I, j, dim, E)\n                line = (d < eps) == black\n\n            if missing_values:\n                # check if current point in RP is a missing value\n                if M[I] or M[j]:\n                    missing_flag = True\n                    k = 0\n                # or if previous point was one, reset flag if not within line\n                elif missing_flag and not line:\n                    missing_flag = False\n\n                # only count line if it does not contain,\n                # directly follow or is followed by a missing value\n                if missing_flag:\n                    continue\n\n            if line:\n                # if within line, increment length\n                k += 1\n            elif k != 0:\n                # if end of line, count line and reset length\n                hist[k-1] += 1\n                k = 0\n\n        if k != 0 and not missing_flag:\n            # at end of subspace, count the last uncounted line and reset length\n            hist[k-1] += 1\n            k = 0\n        missing_flag = False\n\n\ndef _vertline_dist(\n        int n_time, ndarray[NODE_t, ndim=1] hist, ndarray[LAG_t, ndim=2] R):\n    cdef:\n        ndarray[DFIELD_t, ndim=2] E_null = np.array([[]], dtype=DFIELD)\n        ndarray[MASK_t, ndim=1] M_null = np.array([], dtype=MASK)\n    _line_dist(\n        n_time, hist, R, E_null, 0, 0, metric_null, True, M_null, False,\n        i2J_vertline, ij2I_vertline, False)\n\ndef _diagline_dist(\n        int n_time, ndarray[NODE_t, ndim=1] hist, ndarray[LAG_t, ndim=2] R):\n    cdef:\n        ndarray[DFIELD_t, ndim=2] E_null = np.array([[]], dtype=DFIELD)\n        ndarray[MASK_t, ndim=1] M_null = np.array([], dtype=MASK)\n    _line_dist(\n        n_time, hist, R, E_null, 0, 0, metric_null, True, M_null, False,\n        i2J_diagline, ij2I_diagline, True)\n\ndef _white_vertline_dist(\n        int n_time, ndarray[NODE_t, ndim=1] hist, ndarray[LAG_t, ndim=2] R):\n    cdef:\n        ndarray[DFIELD_t, ndim=2] E_null = np.array([[]], dtype=DFIELD)\n        ndarray[MASK_t, ndim=1] M_null = np.array([], dtype=MASK)\n    _line_dist(\n        n_time, hist, R, E_null, 0, 0, metric_null, False, M_null, False,\n        i2J_vertline, ij2I_vertline, False)\n\ndef _vertline_dist_sequential(\n        int n_time, ndarray[NODE_t, ndim=1] hist,\n        ndarray[DFIELD_t, ndim=2] E, float eps, int dim):\n    cdef:\n        ndarray[LAG_t, ndim=2] null_R = np.array([[]], dtype=LAG)\n        ndarray[MASK_t, ndim=1] M_null = np.array([], dtype=MASK)\n    _line_dist(\n        n_time, hist, null_R, E, eps, dim, metric_supremum, True, M_null, False,\n        i2J_vertline, ij2I_vertline, False)\n\ndef _diagline_dist_sequential(\n        int n_time, ndarray[NODE_t, ndim=1] hist,\n        ndarray[DFIELD_t, ndim=2] E, float eps, int dim):\n    cdef:\n        ndarray[LAG_t, ndim=2] null_R = np.array([[]], dtype=LAG)\n        ndarray[MASK_t, ndim=1] M_null = np.array([], dtype=MASK)\n    _line_dist(\n        n_time, hist, null_R, E, eps, dim, metric_supremum, True, M_null, False,\n        i2J_diagline, ij2I_diagline, True)\n\ndef _vertline_dist_missingvalues(\n        int n_time, ndarray[NODE_t, ndim=1] hist, ndarray[LAG_t, ndim=2] R,\n        ndarray[MASK_t, ndim=1, cast=True] M):\n    cdef:\n        ndarray[DFIELD_t, ndim=2] E_null = np.array([[]], dtype=DFIELD)\n    _line_dist(\n        n_time, hist, R, E_null, 0, 0, metric_null, True, M, True,\n        i2J_vertline, ij2I_vertline, False)\n\ndef _diagline_dist_missingvalues(\n        int n_time, ndarray[NODE_t, ndim=1] hist, ndarray[LAG_t, ndim=2] R,\n        ndarray[MASK_t, ndim=1, cast=True] M):\n    cdef:\n        ndarray[DFIELD_t, ndim=2] E_null = np.array([[]], dtype=DFIELD)\n    _line_dist(\n        n_time, hist, R, E_null, 0, 0, metric_null, True, M, True,\n        i2J_diagline, ij2I_diagline, True)\n\ndef _vertline_dist_sequential_missingvalues(\n        int n_time, ndarray[NODE_t, ndim=1] hist,\n        ndarray[MASK_t, ndim=1, cast=True] M,\n        ndarray[DFIELD_t, ndim=2] E, float eps, int dim):\n    cdef:\n        ndarray[LAG_t, ndim=2] null_R = np.array([[]], dtype=LAG)\n    _line_dist(\n        n_time, hist, null_R, E, eps, dim, metric_supremum, True, M, True,\n        i2J_vertline, ij2I_vertline, False)\n\ndef _diagline_dist_sequential_missingvalues(\n        int n_time, ndarray[NODE_t, ndim=1] hist,\n        ndarray[MASK_t, ndim=1, cast=True] M,\n        ndarray[DFIELD_t, ndim=2] E, float eps, int dim):\n    cdef:\n        ndarray[LAG_t, ndim=2] null_R = np.array([[]], dtype=LAG)\n    _line_dist(\n        n_time, hist, null_R, E, eps, dim, metric_supremum, True, M, True,\n        i2J_diagline, ij2I_diagline, True)\n\n\n# visibility graph =============================================================\n\n\ndef _visibility_relations_missingvalues(\n    ndarray[FIELD_t, ndim=1] x, ndarray[FIELD_t, ndim=1] t,\n    int N, ndarray[MASK_t, ndim=2] A,\n    ndarray[MASK_t, ndim=1, cast=True] mv_indices):\n\n    cdef:\n        int i, j, k\n        FIELD_t test\n\n    for i in range(N-2):\n        for j in range(i+2, N):\n            k = i + 1\n\n            test = (x[j] - x[i]) / (t[j] - t[i])\n\n            while not mv_indices[k] and\\\n                (x[k] - x[i]) / (t[k] - t[i]) < test and k < j:\n                k += 1\n\n            if k == j:\n                A[i, j] = A[j, i] = 1\n\n    # Add trivial connections of subsequent observations in time series\n    for i in range(N-1):\n        if not mv_indices[i] and not mv_indices[i+1]:\n            A[i, i+1] = A[i+1, i] = 1\n\n\ndef _visibility_relations_no_missingvalues(\n    ndarray[FIELD_t, ndim=1] x, ndarray[FIELD_t, ndim=1] t,\n    int N, ndarray[MASK_t, ndim=2] A):\n\n    cdef:\n        int i, j, k\n        FIELD_t test\n\n    for i in range(N-2):\n        for j in range(i+2, N):\n            k = i + 1\n\n            test = (x[j] - x[i]) / (t[j] - t[i])\n\n            while (x[k] - x[i]) / (t[k] - t[i]) < test and k < j:\n                k += 1\n\n            if k == j:\n                A[i, j] = A[j, i] = 1\n\n    # Add trivial connections of subsequent observations in time series\n    for i in range(N-1):\n        A[i, i+1] = A[i+1, i] = 1\n\n\ndef _visibility_relations_horizontal(\n    ndarray[FIELD_t, ndim=1] x, int N, ndarray[MASK_t, ndim=2] A):\n\n    cdef:\n        int i, j, k\n        FIELD_t minimum\n\n    for i in range(N-2):\n        for j in range(i+2, N):\n            k = i + 1\n            minimum = min(x[i], x[j])\n\n            while x[k] < minimum and k < j:\n                k += 1\n\n            if k == j:\n                A[i, j] = A[j, i] = 1\n\n    # Add trivial connections of subsequent observations in time series\n    for i in range(N-1):\n        A[i, i+1] = A[i+1, i] = 1\n\n\ndef _retarded_local_clustering(\n    int N, ndarray[ADJ_t, ndim=2] A,\n    ndarray[DFIELD_t, ndim=1] norm,\n    ndarray[DFIELD_t, ndim=1] retarded_clustering):\n\n    cdef:\n        int i, j, k\n        long counter\n\n    # Loop over all nodes\n    for i in range(N):\n        # Check if i has right degree larger than 1\n        if norm[i] != 0:\n            # Reset counter\n            counter = 0\n\n            # Loop over unique pairs of nodes in the past of i\n            for j in range(i):\n                for k in range(j):\n                    if A[i, j] == 1 and A[j, k] == 1 and A[k, i] == 1:\n                        counter += 1\n\n            retarded_clustering[i] = counter / norm[i]\n\n\ndef _advanced_local_clustering(\n    int N, ndarray[ADJ_t, ndim=2] A,\n    ndarray[DFIELD_t, ndim=1] norm,\n    ndarray[DFIELD_t, ndim=1] advanced_clustering):\n\n    cdef:\n        int i, j, k\n        long counter\n\n    # Loop over all nodes\n    for i in range(N-2):\n        # Check if i has right degree larger than 1\n        if norm[i] != 0:\n            # Reset counter\n            counter = 0\n\n            # Loop over unique pairs of nodes in the future of i\n            for j in range(i+1, N):\n                for k in range(i+1, j):\n                    if A[i, j] == 1 and A[j, k] == 1 and A[k, i] == 1:\n                        counter += 1\n\n            advanced_clustering[i] = counter / norm[i]\n"
  },
  {
    "path": "src/pyunicorn/timeseries/cross_recurrence_plot.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for the analysis of dynamical systems and time series based\non recurrence plots, including measures of recurrence quantification\nanalysis (RQA) and recurrence network analysis.\n\"\"\"\n\nimport numpy as np\n\nfrom ..core.cache import Cached\nfrom .recurrence_plot import RecurrencePlot\nfrom ..core._ext.types import to_cy, DFIELD\nfrom ._ext.numerics import _manhattan_distance_matrix_crp, \\\n    _euclidean_distance_matrix_crp, _supremum_distance_matrix_crp\n\n\nclass CrossRecurrencePlot(RecurrencePlot):\n    \"\"\"\n    Class CrossRecurrencePlot for generating and quantitatively analyzing\n    :index:`cross recurrence plots <single: cross recurrence plot>`.\n\n    The CrossRecurrencePlot class supports the construction of cross recurrence\n    plots from two multi-dimensional time series, optionally using embedding.\n    Currently, manhattan, euclidean and supremum norms are provided for\n    measuring distances in phase space.\n\n    Methods for calculating commonly used measures of :index:`recurrence\n    quantification analysis <pair: RQA; cross recurrence plot>` (RQA) are\n    provided, e.g., determinism, maximum diagonal line length and laminarity.\n    The definitions of these measures together with a review of the theory and\n    applications of cross recurrence plots are given in [Marwan2007]_.\n\n    **Examples:**\n\n     - Create an instance of CrossRecurrencePlot from time series x and y with\n       a fixed recurrence threshold and without embedding::\n\n           CrossRecurrencePlot(x, y, threshold=0.1)\n\n     - Create an instance of CrossRecurrencePlot at a fixed recurrence rate and\n       using time delay embedding::\n\n           CrossRecurrencePlot(x, y, dim=3, tau=2,\n                               recurrence_rate=0.05).recurrence_rate()\n    \"\"\"\n\n    #\n    #  Internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, x, y, metric=\"supremum\", normalize=False,\n                 sparse_rqa=False, silence_level=0, **kwds):\n        \"\"\"\n        Initialize an instance of CrossRecurrencePlot.\n\n        .. note::\n           For a cross recurrence plot, time series x and y generally do\n           **not** need to have the same length!\n\n        Either recurrence threshold ``threshold`` or recurrence rate\n        ``recurrence_rate`` have to be given as keyword arguments.\n\n        Embedding is only supported for scalar time series. If embedding\n        dimension ``dim`` and delay ``tau`` are **both** given as keyword\n        arguments, embedding is applied. Multidimensional time series are\n        processed as is by default. The same delay embedding is applied to both\n        time series x and y.\n\n        :type x: 2D array (time, dimension)\n        :arg x: One of the time series to be analyzed, can be scalar or\n            multi-dimensional.\n        :type y: 2D array (time, dimension)\n        :arg y: One of the time series to be analyzed, can be scalar or\n            multi-dimensional.\n        :arg str metric: The metric for measuring distances in phase space\n            (\"manhattan\", \"euclidean\", \"supremum\").\n        :arg bool normalize: Decide whether to normalize both time series to\n            zero mean and unit standard deviation.\n        :arg number silence_level: Inverse level of verbosity of the object.\n        :arg number threshold: The recurrence threshold keyword for generating\n            the cross recurrence plot using a fixed threshold.\n        :arg number recurrence_rate: The recurrence rate keyword for generating\n            the cross recurrence plot using a fixed recurrence rate.\n        :arg number dim: The embedding dimension.\n        :arg number tau: The embedding delay.\n        \"\"\"\n        threshold = kwds.get(\"threshold\")\n        recurrence_rate = kwds.get(\"recurrence_rate\")\n\n        RecurrencePlot.__init__(\n            self, np.empty((2, 0)), metric=metric, normalize=normalize,\n            sparse_rqa=sparse_rqa, silence_level=silence_level,\n            skip_recurrence=True)\n\n        self.CR = None\n        \"\"\"The cross recurrence matrix.\"\"\"\n        self.N = 0\n        \"\"\"The length of the embedded time series x.\"\"\"\n        self.M = 0\n        \"\"\"The length of the embedded time series y.\"\"\"\n\n        #  Store time series\n        self.x = x.copy()\n        \"\"\"The time series x.\"\"\"\n        self.y = y.copy()\n        \"\"\"The time series y.\"\"\"\n\n        #  Reshape time series\n        self.x.shape = (self.x.shape[0], -1)\n        self.y.shape = (self.y.shape[0], -1)\n\n        #  Normalize time series\n        if normalize:\n            self.normalize_time_series(self.x)\n            self.normalize_time_series(self.y)\n\n        #  Get embedding dimension and delay from **kwds\n        dim = kwds.get(\"dim\")\n        tau = kwds.get(\"tau\")\n\n        self._mut_embedding: int = 0\n        if (dim is not None) and (tau is not None):\n            #  Embed the time series\n            self.x_embedded = self.embed_time_series(self.x, dim, tau)\n            self.y_embedded = self.embed_time_series(self.y, dim, tau)\n        else:\n            self.x_embedded = self.x\n            self.y_embedded = self.y\n\n        #  construct recurrence plot accordingly to threshold / recurrence rate\n        if threshold is not None:\n            #  Calculate the recurrence matrix R using the radius of\n            #  neighborhood threshold\n            CrossRecurrencePlot.set_fixed_threshold(self, threshold)\n        elif recurrence_rate is not None:\n            #  Calculate the recurrence matrix R using a fixed recurrence rate\n            CrossRecurrencePlot.\\\n                set_fixed_recurrence_rate(self, recurrence_rate)\n        else:\n            raise NameError(\"Please give either threshold or recurrence_rate \\\n                            to construct the cross recurrence plot!\")\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation.\n        \"\"\"\n        return (\"CrossRecurrencePlot: \"\n                f\"time series shapes {self.x.shape}, {self.y.shape}.\\n\"\n                f\"Embedding dimension {self.dim if self.dim else 0}\\n\"\n                f\"Threshold {self.threshold}, {self.metric} metric\")\n\n    @property\n    def x_embedded(self) -> np.ndarray:\n        \"\"\"\n        The embedded time series x.\n        \"\"\"\n        return self._x_embedded\n\n    @x_embedded.setter\n    def x_embedded(self, embedding: np.ndarray):\n        self._x_embedded = to_cy(embedding, DFIELD)\n        self._mut_embedding += 1\n\n    @property\n    def y_embedded(self) -> np.ndarray:\n        \"\"\"\n        The embedded time series y.\n        \"\"\"\n        return self._y_embedded\n\n    @y_embedded.setter\n    def y_embedded(self, embedding: np.ndarray):\n        self._y_embedded = to_cy(embedding, DFIELD)\n        self._mut_embedding += 1\n\n    #\n    #  Service methods\n    #\n\n    def recurrence_matrix(self):\n        \"\"\"\n        Return the current cross recurrence matrix :math:`CR`.\n\n        :rtype: 2D square Numpy array\n        :return: the current cross recurrence matrix :math:`CR`.\n        \"\"\"\n        return self.CR\n\n    def distance_matrix(self, metric):\n        \"\"\"\n        Return phase space cross distance matrix :math:`D` according to the\n        chosen metric.\n\n        :arg str metric: The metric for measuring distances in phase space\n            (\"manhattan\", \"euclidean\", \"supremum\").\n        :rtype: 2D square array\n        :return: the phase space cross distance matrix :math:`D`\n        \"\"\"\n        assert metric in self._known_metrics, f\"unknown metric: {metric}\"\n        return getattr(self, f\"{metric}_distance_matrix\")()\n\n    #\n    #  Calculate recurrence plot\n    #\n\n    @Cached.method(name=\"the manhattan distance matrix\")\n    def manhattan_distance_matrix(self):\n        \"\"\"\n        Return the manhattan distance matrix from two (embedded) time series.\n\n        :type x_embedded: 2D Numpy array (time, embedding dimension)\n        :arg x_embedded: The phase space trajectory x.\n        :type y_embedded: 2D Numpy array (time, embedding dimension)\n        :arg y_embedded: The phase space trajectory y.\n        :rtype: 2D rectangular Numpy array\n        :return: the manhattan distance matrix.\n        \"\"\"\n        ntime_x = self.x_embedded.shape[0]\n        ntime_y = self.y_embedded.shape[0]\n        dim = self.x_embedded.shape[1]\n        return _manhattan_distance_matrix_crp(ntime_x, ntime_y, dim,\n                                              self.x_embedded, self.y_embedded)\n\n    @Cached.method(name=\"the euclidean distance matrix\")\n    def euclidean_distance_matrix(self):\n        \"\"\"\n        Return the euclidean distance matrix from two (embedded) time series.\n\n        :rtype: 2D rectangular Numpy array\n        :return: the euclidean distance matrix.\n        \"\"\"\n        ntime_x = self.x_embedded.shape[0]\n        ntime_y = self.y_embedded.shape[0]\n        dim = self.x_embedded.shape[1]\n        return _euclidean_distance_matrix_crp(ntime_x, ntime_y, dim,\n                                              self.x_embedded, self.y_embedded)\n\n    @Cached.method(name=\"the supremum distance matrix\")\n    def supremum_distance_matrix(self):\n        \"\"\"\n        Return the supremum distance matrix from two (embedded) time series.\n\n        :rtype: 2D rectangular Numpy array\n        :return: the supremum distance matrix.\n        \"\"\"\n        ntime_x = self.x_embedded.shape[0]\n        ntime_y = self.y_embedded.shape[0]\n        dim = self.x_embedded.shape[1]\n        return _supremum_distance_matrix_crp(ntime_x, ntime_y, dim,\n                                             self.x_embedded, self.y_embedded)\n\n    def set_fixed_threshold(self, threshold):\n        \"\"\"\n        Set the cross recurrence plot to a fixed threshold.\n\n        Modifies / sets the class variables :attr:`CR`, :attr:`N` and :attr:`M`\n        accordingly.\n\n        :arg number threshold: The recurrence threshold.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating cross recurrence plot at fixed threshold...\")\n\n        distance = self.distance_matrix(self.metric)\n        (N, M) = distance.shape\n        recurrence = np.zeros((N, M), dtype=\"int8\")\n        recurrence[distance < threshold] = 1\n        self.CR = recurrence\n        self.N = N\n        self.M = M\n\n    def set_fixed_recurrence_rate(self, recurrence_rate):\n        \"\"\"\n        Set the cross recurrence plot to a fixed recurrence rate.\n\n        Modifies / sets the class variables :attr:`CR`, :attr:`N` and :attr:`M`\n        accordingly.\n\n        :arg number recurrence_rate: The recurrence rate.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating cross recurrence plot at \"\n                  \"fixed recurrence rate...\")\n\n        distance = self.distance_matrix(self.metric)\n        (N, M) = distance.shape\n        threshold = self.threshold_from_recurrence_rate(distance,\n                                                        recurrence_rate)\n        recurrence = np.zeros((N, M), dtype=\"int8\")\n        recurrence[distance < threshold] = 1\n        self.CR = recurrence\n        self.N = N\n        self.M = M\n\n    #\n    #  Extended RQA measures\n    #\n\n    def recurrence_rate(self):\n        \"\"\"\n        Return cross recurrence rate.\n\n        Alias to :meth:`cross_recurrence_rate`, since\n        :meth:`RecurrencePlot.recurrence_rate` would give incorrect results\n        here.\n\n        :rtype: number (float)\n        :return: the cross recurrence rate.\n        \"\"\"\n        return self.cross_recurrence_rate()\n\n    def cross_recurrence_rate(self):\n        \"\"\"\n        Return cross recurrence rate.\n\n        :rtype: number (float)\n        :return: the cross recurrence rate.\n        \"\"\"\n        return float(self.CR.sum()) / (self.N * self.M)\n\n    def balance(self):\n        \"\"\"\n        Return balance of the cross recurrence plot.\n\n        Might be useful for detecting the direction of coupling between systems\n        using cross recurrence analysis.\n        \"\"\"\n        #  Get cross recurrence matrix\n        CR = self.recurrence_matrix()\n\n        #  Get sum of upper triangle of cross recurrence matrix, excluding the\n        #  main diagonal\n        upper_triangle_sum = np.triu(CR, k=1).sum()\n\n        #  Get sum of lower triangle of cross recurrence matrix, excluding the\n        #  main diagonal\n        lower_triangle_sum = np.tril(CR, k=-1).sum()\n\n        #  Return balance\n        return (upper_triangle_sum - lower_triangle_sum) / \\\n            float(upper_triangle_sum + lower_triangle_sum)\n\n    def diagline_dist(self):\n        \"\"\"Not implemented yet\"\"\"\n        raise NotImplementedError(\n            \"Line distributions are not yet \"\n            \"available for cross-recurrence plots\")\n\n    def vertline_dist(self):\n        \"\"\"Not implemented yet\"\"\"\n        raise NotImplementedError(\n            \"Line distributions are not yet \"\n            \"available for cross-recurrence plots\")\n\n    def white_vertline_dist(self):\n        \"\"\"Not implemented yet\"\"\"\n        raise NotImplementedError(\n            \"Line distributions are not yet \"\n            \"available for cross-recurrence plots\")\n"
  },
  {
    "path": "src/pyunicorn/timeseries/inter_system_recurrence_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for the analysis of dynamical systems and time series based\non recurrence plots, including measures of recurrence quantification\nanalysis (RQA) and recurrence network analysis.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable\n\n# array object and fast numerics\nimport numpy as np\n\nfrom ..core import InteractingNetworks\nfrom .recurrence_plot import RecurrencePlot\nfrom .cross_recurrence_plot import CrossRecurrencePlot\n\n\n#\n#  Class definitions\n#\n\nclass InterSystemRecurrenceNetwork(InteractingNetworks):\n\n    \"\"\"\n    Generating and quantitatively analyzing inter-system recurrence networks.\n\n    For a inter-system recurrence network, time series x and y do not need to\n    have the same length! Formally, nodes are identified with state vectors in\n    the common phase space of both time series. Hence, the time series need to\n    have the same number of dimensions and identical physical units.\n    Undirected links are added to describe recurrences within x and y as well\n    as cross-recurrences between x and y. Self-loops are excluded in this\n    undirected network representation.\n\n    More information on the theory and applications of inter system recurrence\n    networks can be found in [Feldhoff2012]_.\n\n    **Examples:**\n\n     - Create an instance of InterSystemRecurrenceNetwork with fixed\n       recurrence thresholds and without embedding::\n\n           InterSystemRecurrenceNetwork(x, y, threshold=(0.1, 0.2, 0.1))\n\n     - Create an instance of InterSystemRecurrenceNetwork at a fixed\n       recurrence rate and using time delay embedding::\n\n           InterSystemRecurrenceNetwork(\n               x, y, dim=3, tau=(2, 1), recurrence_rate=(0.05, 0.05, 0.02))\n    \"\"\"\n\n    #\n    #  Internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, x, y, metric=\"supremum\", normalize=False,\n                 silence_level=0, **kwds):\n        \"\"\"\n        Initialize an instance of InterSystemRecurrenceNetwork (ISRN).\n\n        .. note::\n           For an inter system recurrence network, time series x and y need to\n           have the same number of dimensions!\n\n        Creates an embedding of the given time series x and y, calculates a\n        inter system recurrence matrix from the embedding and then creates\n        an InteractingNetwork object from this matrix, interpreting the inter\n        system recurrence matrix as the adjacency matrix of an undirected\n        complex network.\n\n        Either recurrence thresholds ``threshold`` or\n        recurrence rates ``recurrence_rate`` have to be given as keyword\n        arguments.\n\n        Embedding is only supported for scalar time series. If embedding\n        dimension ``dim`` and delay ``tau`` are **both** given as keyword\n        arguments, embedding is applied. Multidimensional time series are\n        processed as is by default.\n\n        :type x: 2D Numpy array (time, dimension)\n        :arg x: The time series x to be analyzed, can be scalar or\n                multi-dimensional.\n        :type y: 2D Numpy array (time, dimension)\n        :arg y: The time series y to be analyzed, can be scalar or\n                multi-dimensional.\n        :type metric: tuple of string\n        :arg metric: The metric for measuring distances in phase space\n                     (\"manhattan\", \"euclidean\", \"supremum\").\n        :arg bool normalize: Decide whether to normalize the time series to\n                             zero mean and unit standard deviation.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        :arg kwds: Additional options.\n        :type threshold: tuple of number (three numbers)\n        :keyword threshold: The recurrence threshold keyword for generating\n                            the recurrence plot using fixed thresholds. Give\n                            for each time series and the cross recurrence plot\n                            separately.\n        :type recurrence_rate: tuple of number (three numbers)\n        :keyword recurrence_rate: The recurrence rate keyword for generating\n                                  the recurrence plot using a fixed recurrence\n                                  rate. Give separately for each time series.\n        :keyword int dim: The embedding dimension. Must be the same for both\n                          time series.\n        :type tau: tuple of int\n        :keyword tau: The embedding delay. Give separately for each time\n                      series.\n        \"\"\"\n        #  Store time series\n        self.x = x.copy().astype(\"float32\")\n        \"\"\"The time series x.\"\"\"\n        self.y = y.copy().astype(\"float32\")\n        \"\"\"The time series y.\"\"\"\n\n        #  Reshape time series\n        self.x.shape = (self.x.shape[0], -1)\n        self.y.shape = (self.y.shape[0], -1)\n\n        #  Get embedding dimension and delay from **kwds\n        dim = kwds.get(\"dim\")\n        tau = kwds.get(\"tau\")\n\n        #  Check for consistency\n        if self.x.shape[1] == self.y.shape[1]:\n            #  Set silence_level\n            self.silence_level = silence_level\n            \"\"\"The inverse level of verbosity of the object.\"\"\"\n\n            #  Get number of nodes in subnetwork x\n            self.N_x = self.x.shape[0]\n            \"\"\"Number of nodes in subnetwork x.\"\"\"\n\n            #  Get number of nodes in subnetwork y\n            self.N_y = self.y.shape[0]\n            \"\"\"Number of nodes in subnetwork y.\"\"\"\n\n            #  Get total number of nodes of ISRN\n            self.N = self.N_x + self.N_y\n            \"\"\"Total number of nodes of ISRN.\"\"\"\n\n            #  Store type of metric\n            self.metric = metric\n            \"\"\"The metric used for measuring distances in phase space.\"\"\"\n\n            #  Normalize time series\n            if normalize:\n                RecurrencePlot.normalize_time_series(self.x)\n                RecurrencePlot.normalize_time_series(self.y)\n\n            #  Embed time series if required\n            self.dim = dim\n            if dim is not None and tau is not None and self.x.shape[1] == 1:\n                self.x_embedded = \\\n                    RecurrencePlot.embed_time_series(self.x, dim, tau[0])\n                \"\"\"The embedded time series x.\"\"\"\n                self.y_embedded = \\\n                    RecurrencePlot.embed_time_series(self.y, dim, tau[1])\n                \"\"\"The embedded time series y.\"\"\"\n            else:\n                self.x_embedded = self.x\n                self.y_embedded = self.y\n\n            #  Get threshold or recurrence rate from **kwds, construct\n            #  ISRN accordingly\n            threshold = kwds.get(\"threshold\")\n            recurrence_rate = kwds.get(\"recurrence_rate\")\n            self.threshold = threshold\n\n            if threshold is not None:\n                #  Calculate the ISRN using the radius of neighborhood\n                #  threshold\n                ISRM = self.set_fixed_threshold(threshold)\n            elif recurrence_rate is not None:\n                #  Calculate the ISRN using a fixed recurrence rate\n                ISRM = self.set_fixed_recurrence_rate(recurrence_rate)\n            else:\n                raise NameError(\"Please give either threshold or \\\n                                recurrence_rate to construct the joint \\\n                                recurrence plot!\")\n\n            InteractingNetworks.__init__(self, adjacency=ISRM, directed=False,\n                                         silence_level=self.silence_level)\n            #  No treatment of missing values yet!\n            self.missing_values = False\n\n        else:\n            raise ValueError(\"Both time series x and y need to have the same \\\n                             dimension!\")\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation.\n        \"\"\"\n        return (\"InterSystemRecurrenceNetwork: \"\n                f\"time series shapes {self.x.shape}, {self.y.shape}.\\n\"\n                f\"Embedding dimension {self.dim if self.dim else 0}\\n\"\n                f\"Threshold {self.threshold}, {self.metric} metric.\\n\"\n                f\"{InteractingNetworks.__str__(self)}\")\n\n    #\n    #  Service methods\n    #\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        return (self.rp_x, self.rp_x, self.crp_xy,)\n\n    #\n    #  Methods to handle inter system recurrence networks\n    #\n\n    def inter_system_recurrence_matrix(self):\n        \"\"\"\n        Return the current inter system recurrence matrix :math:`ISRM`.\n\n        :rtype: 2D square Numpy array\n        :return: the current inter system recurrence matrix :math:`ISRM`.\n        \"\"\"\n        #  Shortcuts\n        N = self.N\n        N_x = self.N_x\n\n        #  Init\n        ISRM = np.zeros((N, N))\n\n        #  Combine to inter system recurrence matrix\n        ISRM[:N_x, :N_x] = self.rp_x.recurrence_matrix()\n        ISRM[:N_x, N_x:N] = self.crp_xy.recurrence_matrix()\n        ISRM[N_x:N, :N_x] = self.crp_xy.recurrence_matrix().transpose()\n        ISRM[N_x:N, N_x:N] = self.rp_y.recurrence_matrix()\n\n        return ISRM\n\n    def set_fixed_threshold(self, threshold):\n        \"\"\"\n        Create a inter system recurrence network at fixed thresholds.\n\n        :type threshold: tuple of number (three numbers)\n        :arg threshold: The three threshold parameters. Give for each\n                        time series and the cross recurrence plot separately.\n        \"\"\"\n        #  Compute recurrence matrices of x and y\n        self.rp_x = RecurrencePlot(time_series=self.x_embedded,\n                                   threshold=threshold[0],\n                                   metric=self.metric,\n                                   silence_level=self.silence_level)\n        self.rp_y = RecurrencePlot(time_series=self.y_embedded,\n                                   threshold=threshold[1],\n                                   metric=self.metric,\n                                   silence_level=self.silence_level)\n\n        #  Compute cross-recurrence matrix of x and y\n        self.crp_xy = CrossRecurrencePlot(x=self.x_embedded, y=self.y_embedded,\n                                          threshold=threshold[2],\n                                          metric=self.metric,\n                                          silence_level=self.silence_level)\n\n        #  Get combined ISRM\n        ISRM = self.inter_system_recurrence_matrix()\n\n        #  Set diagonal of ISRM to zero to avoid self-loops\n        ISRM.flat[::self.N + 1] = 0\n        return ISRM\n\n    def set_fixed_recurrence_rate(self, density):\n        \"\"\"\n        Create a inter system recurrence network at fixed link densities (\n        recurrence rates).\n\n        :type density: tuple of number (three numbers)\n        :arg density: The three recurrence rate parameters. Give for each\n                        time series and the cross recurrence plot separately.\n        \"\"\"\n        #  Compute recurrence matrices of x and y\n        self.rp_x = RecurrencePlot(time_series=self.x_embedded,\n                                   recurrence_rate=density[0],\n                                   metric=self.metric,\n                                   silence_level=self.silence_level)\n        self.rp_y = RecurrencePlot(time_series=self.y_embedded,\n                                   recurrence_rate=density[1],\n                                   metric=self.metric,\n                                   silence_level=self.silence_level)\n\n        #  Compute cross-recurrence matrix of x and y\n        self.crp_xy = CrossRecurrencePlot(x=self.x_embedded, y=self.y_embedded,\n                                          recurrence_rate=density[2],\n                                          metric=self.metric,\n                                          silence_level=self.silence_level)\n\n        #  Get combined ISRM\n        ISRM = self.inter_system_recurrence_matrix()\n\n        #  Set diagonal of ISRM to zero to avoid self-loops\n        ISRM.flat[::self.N + 1] = 0\n        return ISRM\n\n    #\n    #  Methods to quantify inter system recurrence networks\n    #\n\n    def internal_recurrence_rates(self):\n        \"\"\"\n        Return internal recurrence rates of subnetworks x and y.\n\n        :rtype: tuple of number (float)\n        :return: the internal recurrence rates of subnetworks x and y.\n        \"\"\"\n        return (self.rp_x.recurrence_rate(),\n                self.rp_y.recurrence_rate())\n\n    def cross_recurrence_rate(self):\n        \"\"\"\n        Return cross recurrence rate between subnetworks x and y.\n\n        :rtype: number (float)\n        :return: the cross recurrence rate between subnetworks x and y.\n        \"\"\"\n        return self.crp_xy.cross_recurrence_rate()\n\n    def cross_global_clustering_xy(self):\n        \"\"\"\n        Return cross global clustering of x with respect to y.\n\n        See [Feldhoff2012]_ for definition, further explanation and\n        applications.\n\n        :rtype: number (float)\n        :return: the cross global clustering of x with respect to y.\n        \"\"\"\n        return self.cross_global_clustering(np.arange(self.N_x),\n                                            np.arange(self.N_x, self.N))\n\n    def cross_global_clustering_yx(self):\n        \"\"\"\n        Return cross global clustering of y with respect to x.\n\n        See [Feldhoff2012]_ for definition, further explanation and\n        applications.\n\n        :rtype: number (float)\n        :return: the cross global clustering of y with respect to x.\n        \"\"\"\n        return self.cross_global_clustering(np.arange(self.N_x, self.N),\n                                            np.arange(self.N_x))\n\n    def cross_transitivity_xy(self):\n        \"\"\"\n        Return cross transitivity of x with respect to y.\n\n        See [Feldhoff2012]_ for definition, further explanation and\n        applications.\n\n        :rtype: number (float)\n        :return: the cross transitivity of x with respect to y.\n        \"\"\"\n        return self.cross_transitivity(np.arange(self.N_x),\n                                       np.arange(self.N_x, self.N))\n\n    def cross_transitivity_yx(self):\n        \"\"\"\n        Return cross transitivity of y with respect to x.\n\n        See [Feldhoff2012]_ for definition, further explanation and\n        applications.\n\n        :rtype: number (float)\n        :return: the cross transitivity of y with respect to x.\n        \"\"\"\n        return self.cross_transitivity(np.arange(self.N_x, self.N),\n                                       np.arange(self.N_x))\n"
  },
  {
    "path": "src/pyunicorn/timeseries/joint_recurrence_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for the analysis of dynamical systems and time series based\non recurrence plots, including measures of recurrence quantification\nanalysis (RQA) and recurrence network analysis.\n\"\"\"\n\n# array object and fast numerics\nimport numpy as np\n\nfrom ..core import Network\nfrom .joint_recurrence_plot import JointRecurrencePlot\n\n\n#\n#  Class definitions\n#\n\nclass JointRecurrenceNetwork(JointRecurrencePlot, Network):\n\n    \"\"\"\n    Class JointRecurrenceNetwork for generating and quantitatively analyzing\n    joint recurrence networks.\n\n    For a joint recurrence network, time series x and y need to have the same\n    length! Formally, nodes are identified with sampling points in time, while\n    an undirected link (i,j) is introduced if x at time i is recurrent to x at\n    time j and also y at time i is recurrent to y at time j. Self-loops are\n    excluded in this undirected network representation.\n\n    More information on the theory and applications of joint recurrence\n    networks can be found in [Feldhoff2013]_.\n\n    **Examples:**\n\n     - Create an instance of JointRecurrenceNetwork with a fixed recurrence\n       threshold and without embedding::\n\n           JointRecurrenceNetwork(x, y, threshold=(0.1,0.2))\n\n     - Create an instance of JointRecurrenceNetwork with a fixed recurrence\n       threshold in units of STD and without embedding::\n\n           JointRecurrenceNetwork(x, y, threshold_std=(0.03,0.05))\n\n     - Create an instance of JointRecurrenceNetwork at a fixed recurrence rate\n       and using time delay embedding::\n\n           JointRecurrenceNetwork(\n               x, y, dim=(3,5), tau=(2,1),\n               recurrence_rate=(0.05,0.04)).recurrence_rate()\n    \"\"\"\n\n    #\n    #  Internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, x, y, metric=(\"supremum\", \"supremum\"),\n                 normalize=False, lag=0, silence_level=0, **kwds):\n        \"\"\"\n        Initialize an instance of JointRecurrenceNetwork.\n\n        .. note::\n           For a joint recurrence network, time series x and y need to have the\n           same length!\n\n        Creates an embedding of the given time series x and y, calculates a\n        joint recurrence plot from the embedding and then creates a Network\n        object from the joint recurrence plot, interpreting the joint\n        recurrence matrix as the adjacency matrix of an undirected complex\n        network.\n\n        Either recurrence thresholds ``threshold``/``threshold_std`` or\n        recurrence rates ``recurrence_rate`` have to be given as keyword\n        arguments.\n\n        Embedding is only supported for scalar time series. If embedding\n        dimension ``dim`` and delay ``tau`` are **both** given as keyword\n        arguments, embedding is applied. Multidimensional time series are\n        processed as is by default.\n\n        :type x: 2D Numpy array (time, dimension)\n        :arg x: The time series x to be analyzed, can be scalar or\n            multi-dimensional.\n        :type y: 2D Numpy array (time, dimension)\n        :arg y: The time series y to be analyzed, can be scalar or\n            multi-dimensional.\n        :type metric: tuple of string\n        :arg metric: The metric for measuring distances in phase space\n            (\"manhattan\", \"euclidean\", \"supremum\").  Give separately for each\n            time series.\n        :type normalize: tuple of bool\n        :arg normalize: Decide whether to normalize the time series to zero\n            mean and unit standard deviation. Give separately for each time\n            series.\n        :arg number lag: To create a delayed version of the JRP.\n        :arg number silence_level: Inverse level of verbosity of the object.\n        :type threshold: tuple of number\n        :keyword threshold: The recurrence threshold keyword for generating the\n            recurrence plot using a fixed threshold.  Give separately for each\n            time series.\n        :type threshold_std: tuple of number\n        :keyword threshold_std: The recurrence threshold keyword for generating\n            the recurrence plot using a fixed threshold in units of the time\n            series' STD. Give separately for each time series.\n        :type recurrence_rate: tuple of number\n        :keyword recurrence_rate: The recurrence rate keyword for generating\n            the recurrence plot using a fixed recurrence rate. Give separately\n            for each time series.\n        :type dim: tuple of number\n        :keyword dim: The embedding dimension. Give separately for each time\n            series.\n        :type tau: tuple of number\n        :keyword tau: The embedding delay. Give separately for each time\n            series.\n        \"\"\"\n        #  Check for consistency\n        if np.abs(lag) < x.shape[0]:\n            if x.shape[0] == y.shape[0]:\n                #  Initialize the underlying RecurrencePlot object\n                JointRecurrencePlot.__init__(self, x, y, metric, normalize,\n                                             lag, silence_level, **kwds)\n\n                #  Set diagonal of JR to zero to avoid self-loops in the joint\n                #  recurrence network\n                A = self.JR - np.eye((self.N-np.abs(lag)), dtype=\"int8\")\n\n                #  Create a Network object interpreting the recurrence matrix\n                #  as the graph adjacency matrix. Joint recurrence networks\n                #  are undirected by definition.\n                Network.__init__(self, A, directed=False,\n                                 silence_level=silence_level)\n            else:\n                raise ValueError(\"Both time series x and y need to have the \\\n                                 same length!\")\n        else:\n            raise ValueError(\"Delay value (lag) must not exceed length of \\\n                             time series!\")\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation.\n        \"\"\"\n        return (\"JointRecurrenceNetwork:\\n\"\n                f\"{JointRecurrencePlot.__str__(self)}\\n\"\n                f\"{Network.__str__(self)}\")\n\n    #\n    #  Methods to handle recurrence networks\n    #\n    def set_fixed_threshold(self, threshold):\n        \"\"\"\n        Create a joint recurrence network at fixed thresholds.\n\n        :type threshold: tuple of number\n        :arg threshold: The threshold. Give for each time series separately.\n        \"\"\"\n        #  Set fixed threshold on recurrence plot level\n        JointRecurrencePlot.set_fixed_threshold(self, threshold)\n\n        #  Set diagonal of JR to zero to avoid self-loops in the joint\n        #  recurrence network\n        A = self.JR.copy()\n        A.flat[::self.N+1] = 0\n\n        #  Create a Network object interpreting the recurrence matrix as the\n        #  graph adjacency matrix. Joint recurrence networks are undirected by\n        #  definition.\n        Network.__init__(self, A, directed=False,\n                         silence_level=self.silence_level)\n\n    def set_fixed_threshold_std(self, threshold_std):\n        \"\"\"\n        Create a joint recurrence network at fixed thresholds in units of the\n        standard deviation of the time series.\n\n        :type threshold_std: tuple of number\n        :arg threshold_std: The threshold in units of standard deviation. Give\n            for each time series separately.\n        \"\"\"\n        #  Set fixed threshold on recurrence plot level\n        JointRecurrencePlot.set_fixed_threshold_std(self, threshold_std)\n\n        #  Set diagonal of JR to zero to avoid self-loops in the joint\n        #  recurrence network\n        A = self.JR.copy()\n        A.flat[::self.N+1] = 0\n\n        #  Create a Network object interpreting the recurrence matrix as the\n        #  graph adjacency matrix. Joint recurrence networks are undirected by\n        #  definition.\n        Network.__init__(self, A, directed=False,\n                         silence_level=self.silence_level)\n\n    def set_fixed_recurrence_rate(self, recurrence_rate):\n        \"\"\"\n        Create a joint recurrence network at fixed link densities (recurrence\n        rates).\n\n        :type recurrence_rate: tuple of number\n        :arg recurrence_rate: The link density / recurrence rate.\n            Give for each time series separately.\n        \"\"\"\n        #  Set fixed recurrence rate on recurrence plot level\n        JointRecurrencePlot.set_fixed_recurrence_rate(self, recurrence_rate)\n\n        #  Set diagonal of JR to zero to avoid self-loops in the joint\n        #  recurrence network\n        A = self.JR.copy()\n        A.flat[::self.N+1] = 0\n\n        #  Create a Network object interpreting the recurrence matrix as the\n        #  graph adjacency matrix. Joint recurrence networks are undirected by\n        #  definition.\n        Network.__init__(self, A, directed=False,\n                         silence_level=self.silence_level)\n"
  },
  {
    "path": "src/pyunicorn/timeseries/joint_recurrence_plot.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for the analysis of dynamical systems and time series based\non recurrence plots, including measures of recurrence quantification\nanalysis (RQA) and recurrence network analysis.\n\"\"\"\n\nimport numpy as np\n\nfrom .recurrence_plot import RecurrencePlot\n\n\nclass JointRecurrencePlot(RecurrencePlot):\n\n    \"\"\"\n    Class JointRecurrencePlot for generating and quantitatively analyzing\n    :index:`joint recurrence plots <single: joint recurrence plot>`.\n\n    The JointRecurrencePlot class supports the construction of joint recurrence\n    plots from two multi-dimensional time series, optionally using embedding.\n    Currently, manhattan, euclidean and supremum norms are provided for\n    measuring distances in phase space.\n\n    Methods for calculating commonly used measures of :index:`recurrence\n    quantification analysis <pair: RQA; joint recurrence plot>` (RQA) are\n    provided, e.g., determinism, maximum diagonal line length and laminarity.\n    The definitions of these measures together with a review of the theory and\n    applications of joint recurrence plots are given in [Marwan2007]_.\n\n    **Examples:**\n\n     - Create an instance of JointRecurrencePlot with a fixed recurrence\n       threshold and without embedding::\n\n           JointRecurrencePlot(x, y, threshold=(0.1,0.2))\n\n     - Create an instance of JointRecurrencePlot with a fixed recurrence\n       threshold in units of STD and without embedding::\n\n           JointRecurrencePlot(x, y, threshold_std=(0.03,0.05))\n\n     - Create an instance of JointRecurrencePlot at a fixed recurrence rate and\n       using time delay embedding::\n\n           JointRecurrencePlot(\n               x, y, dim=(3,5), tau=(2,1),\n               recurrence_rate=(0.05,0.04)).recurrence_rate()\n    \"\"\"\n\n    #\n    #  Internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, x, y, metric=(\"supremum\", \"supremum\"),\n                 normalize=False, lag=0, silence_level=0, **kwds):\n        \"\"\"\n        Initialize an instance of JointRecurrencePlot.\n\n        .. note::\n           For a joint recurrence plot, time series x and y need to have the\n           same length!\n\n        Either recurrence thresholds ``threshold``/``threshold_std`` or\n        recurrence rates ``recurrence_rate`` have to be given as keyword\n        arguments.\n\n        Embedding is only supported for scalar time series. If embedding\n        dimension ``dim`` and delay ``tau`` are **both** given as keyword\n        arguments, embedding is applied. Multidimensional time series are\n        processed as is by default.\n\n        :type x: 2D array (time, dimension)\n        :arg x: Time series x to be analyzed (scalar/multi-dimensional).\n        :type y: 2D array (time, dimension)\n        :arg y: Time series y to be analyzed (scalar/multi-dimensional).\n        :type metric: tuple of string\n        :arg metric: The metric for measuring distances in phase space\n            (\"manhattan\", \"euclidean\", \"supremum\"). Give separately for each\n            time series.\n        :type normalize: tuple of bool\n        :arg normalize: Decide whether to normalize the time series to zero\n            mean and unit standard deviation. Give separately for each time\n            series.\n        :arg number lag: To create a delayed version of the JRP.\n        :arg number silence_level: Inverse level of verbosity of the object.\n        :type threshold: tuple of number\n        :keyword threshold: The recurrence threshold keyword for generating the\n            recurrence plot using a fixed threshold.  Give separately for each\n            time series.\n        :type threshold_std: tuple of number\n        :keyword threshold_std: The recurrence threshold keyword for generating\n            the recurrence plot using a fixed threshold in units of the time\n            series' STD. Give separately for each time series.\n        :type recurrence_rate: tuple of number\n        :keyword recurrence_rate: The recurrence rate keyword for generating\n            the recurrence plot using a fixed recurrence rate. Give separately\n            for each time series.\n        :type dim: tuple of number\n        :keyword dim: Embedding dimension. Give separately for each time\n            series.\n        :type tau: tuple of number\n        :keyword tau: Embedding delay. Give separately for each time series.\n        \"\"\"\n        threshold = kwds.get(\"threshold\")\n        threshold_std = kwds.get(\"threshold_std\")\n        recurrence_rate = kwds.get(\"recurrence_rate\")\n\n        assert len(metric) == 2\n        assert all(m in (\"manhattan\", \"euclidean\", \"supremum\") for m in metric)\n\n        # initialise base class using dummy values (bad OO design)\n        RecurrencePlot.__init__(\n            self, np.empty((2, 0)), metric=metric[0], normalize=normalize,\n            threshold=threshold[0] if threshold else 0,\n            recurrence_rate=recurrence_rate, silence_level=silence_level)\n\n        #  Store type of metric\n        self.metric = metric\n\n        self.JR = None\n        \"\"\"The joint recurrence matrix.\"\"\"\n        self.N = 0\n        \"\"\"The length of both embedded time series x and y.\"\"\"\n\n        #  Check for consistency: x and y need to have the same length\n        if x.shape[0] == y.shape[0]:\n\n            #  Store time series\n            self.x = x.copy().astype(\"float32\")\n            \"\"\"The time series x.\"\"\"\n            self.y = y.copy().astype(\"float32\")\n            \"\"\"The time series y.\"\"\"\n\n            #  Reshape time series\n            self.x.shape = (self.x.shape[0], -1)\n            self.y.shape = (self.y.shape[0], -1)\n\n            #  Normalize time series\n            if normalize:\n                self.normalize_time_series(self.x)\n                self.normalize_time_series(self.y)\n\n            #  Store lag\n            self.lag = lag\n            \"\"\"Used to create a delayed JRP.\"\"\"\n\n            #  Get embedding dimension and delay from **kwds\n            dim = kwds.get(\"dim\")\n            tau = kwds.get(\"tau\")\n\n            if dim is not None and tau is not None:\n                #  Embed the time series\n                self.x_embedded = \\\n                    self.embed_time_series(self.x, dim[0], tau[0])\n                \"\"\"The embedded time series x.\"\"\"\n                self.y_embedded = \\\n                    self.embed_time_series(self.y, dim[1], tau[1])\n                \"\"\"The embedded time series y.\"\"\"\n            else:\n                self.x_embedded = self.x\n                self.y_embedded = self.y\n\n            #  Prune embedded time series to same length\n            #  (number of state vectors)\n            min_N = min(self.x_embedded.shape[0], self.y_embedded.shape[0])\n            self.x_embedded = self.x_embedded[:min_N, :]\n            self.y_embedded = self.y_embedded[:min_N, :]\n\n            #  construct recurrence plot accordingly to\n            #  threshold / recurrence rate\n            if np.abs(lag) > x.shape[0]:\n                #  Lag must be smaller than size of recurrence plot\n                raise ValueError(\"Delay value (lag) must not exceed length of \"\n                                 \"time series!\")\n            if threshold is not None:\n                #  Calculate the recurrence matrix R using the radius of\n                #  neighborhood threshold\n                JointRecurrencePlot.set_fixed_threshold(self, threshold)\n            elif threshold_std is not None:\n                #  Calculate the recurrence matrix R using the radius of\n                #  neighborhood threshold in units of the time series' STD\n                JointRecurrencePlot.\\\n                    set_fixed_threshold_std(self, threshold_std)\n            elif recurrence_rate is not None:\n                #  Calculate the recurrence matrix R using a fixed recurrence\n                #  rate\n                JointRecurrencePlot.\\\n                    set_fixed_recurrence_rate(self, recurrence_rate)\n            else:\n                raise NameError(\"Please give either threshold or \"\n                                \"recurrence_rate to construct the joint \"\n                                \"recurrence plot!\")\n\n            #  No treatment of missing values yet!\n            self.missing_values = False\n\n        else:\n            raise ValueError(\"Both time series x and y need to have the same \"\n                             \"length!\")\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation.\n        \"\"\"\n        return (\"JointRecurrencePlot: \"\n                f\"time series shapes {self.x.shape}.\\n\"\n                f\"Embedding dimension {self.dim if self.dim else 0}\\n\"\n                f\"Threshold {self.threshold}, {self.metric} metric\")\n\n    #\n    #  Service methods\n    #\n\n    def recurrence_matrix(self):\n        \"\"\"\n        Return the current joint recurrence matrix :math:`JR`.\n\n        :rtype: 2D square Numpy array\n        :return: the current joint recurrence matrix :math:`JR`.\n        \"\"\"\n        return self.JR\n\n    #\n    #  Calculate recurrence plot\n    #\n\n    def set_fixed_threshold(self, threshold):\n        \"\"\"\n        Set the joint recurrence plot to fixed thresholds.\n\n        Modifies / sets the class variables :attr:`JR` and :attr:`N`\n        accordingly.\n\n        :type threshold: tuple of number\n        :arg threshold: The recurrence threshold. Give for both time series\n            separately.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating joint recurrence plot at fixed threshold...\")\n\n        self.embedding = self.x_embedded\n        distance = self.distance_matrix(self.metric[0])\n        N = distance.shape[0]\n        recurrence_x = np.zeros((N, N), dtype=\"int8\")\n        recurrence_x[distance < threshold[0]] = 1\n        del distance\n\n        self.embedding = self.y_embedded\n        distance = self.distance_matrix(self.metric[1])\n        recurrence_y = np.zeros((N, N), dtype=\"int8\")\n        recurrence_y[distance < threshold[1]] = 1\n        del distance\n\n        if self.lag >= 0:\n            self.JR = recurrence_x[:N-self.lag, :N-self.lag] * \\\n                recurrence_y[self.lag:N, self.lag:N]\n        else:\n            # self.JR = recurrence_x[-self.lag:N, -self.lag:N] * \\\n            #     recurrence_y[:N+self.lag, :N+self.lag]\n            self.JR = recurrence_y[:N+self.lag, :N+self.lag] * \\\n                recurrence_x[-self.lag:N, -self.lag:N]\n        self.N = N\n\n    def set_fixed_threshold_std(self, threshold_std):\n        \"\"\"\n        Set the joint recurrence plot to fixed thresholds in units of the\n        standard deviation of the time series.\n\n        Calculates the absolute thresholds and calls\n        :meth:`set_fixed_threshold`.\n\n        :type threshold_std: tuple of number\n        :arg threshold_std: The recurrence threshold in units of the standard\n            deviation of the time series. Give for both time series separately.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating recurrence plot at fixed threshold \"\n                  \"in units of time series STD...\")\n\n        threshold_x = threshold_std[0] * self.x.std()\n        threshold_y = threshold_std[1] * self.y.std()\n        JointRecurrencePlot.\\\n            set_fixed_threshold(self, (threshold_x, threshold_y))\n\n    def set_fixed_recurrence_rate(self, recurrence_rate):\n        \"\"\"\n        Set the joint recurrence plot to fixed recurrence rates.\n\n        Modifies / sets the class variables :attr:`JR` and :attr:`N`\n        accordingly.\n\n        :type recurrence_rate: tuple of number\n        :arg recurrence_rate: The recurrence rate. Give for both time series\n            separately.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating joint recurrence plot at \"\n                  \"fixed recurrence rate...\")\n\n        self.embedding = self.x_embedded\n        distance = self.distance_matrix(self.metric[0])\n        N = distance.shape[0]\n        threshold_x = self.\\\n            threshold_from_recurrence_rate(distance, recurrence_rate[0])\n        recurrence_x = np.zeros((N, N), dtype=\"int8\")\n        recurrence_x[distance < threshold_x] = 1\n        del distance\n\n        self.embedding = self.y_embedded\n        distance = self.distance_matrix(self.metric[1])\n        threshold_y = self.\\\n            threshold_from_recurrence_rate(distance, recurrence_rate[1])\n        recurrence_y = np.zeros((N, N), dtype=\"int8\")\n        recurrence_y[distance < threshold_y] = 1\n        del distance\n\n        if self.lag >= 0:\n            self.JR = recurrence_x[:N-self.lag, :N-self.lag] * \\\n                recurrence_y[self.lag:N, self.lag:N]\n        else:\n            # self.JR = recurrence_x[-self.lag:N, -self.lag:N] * \\\n            #     recurrence_y[:N+self.lag, :N+self.lag]\n            self.JR = recurrence_y[:N+self.lag, :N+self.lag] * \\\n                recurrence_x[-self.lag:N, -self.lag:N]\n        self.N = N\n"
  },
  {
    "path": "src/pyunicorn/timeseries/recurrence_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for the analysis of dynamical systems and time series based\non recurrence plots, including measures of recurrence quantification\nanalysis (RQA) and recurrence network analysis.\n\"\"\"\n\n# array object and fast numerics\nimport numpy as np\n\nfrom ..core import Network\nfrom .recurrence_plot import RecurrencePlot\n\n\n#\n#  Class definitions\n#\n\nclass RecurrenceNetwork(RecurrencePlot, Network):\n\n    \"\"\"\n    Class RecurrenceNetwork for generating and quantitatively analyzing\n    recurrence networks.\n\n    More information on the theory and applications of recurrence networks can\n    be found in [Marwan2009]_, [Donner2010b]_.\n\n    Examples:\n\n     - Create an instance of RecurrenceNetwork with a fixed recurrence\n       threshold and without embedding::\n\n           RecurrenceNetwork(time_series, threshold=0.1)\n\n     - Create an instance of RecurrenceNetwork at a fixed (global) recurrence\n       rate and using time delay embedding::\n\n           RecurrenceNetwork(time_series, dim=3, tau=2,\n                             recurrence_rate=0.05).recurrence_rate()\n    \"\"\"\n\n    #\n    #  Internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, time_series, metric=\"supremum\", normalize=False,\n                 missing_values=False, silence_level=0, **kwds):\n        \"\"\"\n        Initialize an instance of RecurrenceNetwork.\n\n        Creates an embedding of the given time series, calculates a recurrence\n        plot from the embedding and then creates a Network object from the\n        recurrence plot, interpreting the recurrence matrix as the adjacency\n        matrix of a complex network.\n\n        Either recurrence threshold ``threshold``/``threshold_std``, recurrence\n        rate ``recurrence_rate`` or local recurrence rate\n        ``local_recurrence_rate`` have to be given as keyword arguments.\n\n        Embedding is only supported for scalar time series. If embedding\n        dimension ``dim`` and delay ``tau`` are **both** given as keyword\n        arguments, embedding is applied. Multidimensional time series are\n        processed as is by default.\n\n        :type time_series: 2D array (time, dimension)\n        :arg time_series: The time series to be analyzed, can be scalar or\n            multi-dimensional.\n        :arg str metric: The metric for measuring distances in phase space\n            (\"manhattan\", \"euclidean\", \"supremum\").\n        :arg bool normalize: Decide whether to normalize the time series to\n            zero mean and unit standard deviation.\n        :arg bool missing_values: Toggle special treatment of missing values in\n            :attr:`.RecurrencePlot.time_series`.\n        :arg number silence_level: Inverse level of verbosity of the object.\n        :arg number threshold: The recurrence threshold keyword for generating\n            the recurrence network using a fixed threshold.\n        :arg number threshold_std: The recurrence threshold keyword for\n            generating the recurrence plot using a fixed threshold in units of\n            the time series' STD.\n        :arg number recurrence_rate: The recurrence rate keyword for generating\n            the recurrence network using a fixed recurrence rate.\n        :arg number local_recurrence_rate: The local recurrence rate keyword\n            for generating the recurrence plot using a fixed local recurrence\n            rate (same number of recurrences for each state vector).\n        :arg number adaptive_neighborhood_size: The adaptive neighborhood size\n            parameter for generating recurrence plots based on the algorithm in\n            [Xu2008]_.\n        :arg number dim: The embedding dimension.\n        :arg number tau: The embedding delay.\n        :type node_weights: 1D array (time)\n        :arg node_weights: The sequence of weights associated with each\n            node for calculating n.s.i. network measures.\n        \"\"\"\n        #  Initialize the underlying RecurrencePlot object\n        RecurrencePlot.__init__(self, time_series=time_series, metric=metric,\n                                normalize=normalize,\n                                missing_values=missing_values,\n                                silence_level=silence_level, **kwds)\n\n        #  Set diagonal of R to zero to avoid self-loops in the recurrence\n        #  network\n        A = self.R.copy()\n        A.flat[::self.N+1] = 0\n\n        #  Get keywords\n        local_recurrence_rate = kwds.get(\"local_recurrence_rate\")\n        node_weights = kwds.get(\"node_weights\")\n\n        #  Assign to each embedded state vector the weight of the earliest\n        #  sample contained in it (too simple!)\n        if node_weights is not None:\n            node_weights = node_weights[:self.N]\n\n        #  Remove state vectors containing missing values\n        if missing_values:\n            A = np.delete(A, np.where(self.missing_value_indices), axis=0)\n            A = np.delete(A, np.where(self.missing_value_indices), axis=1)\n\n        #  Create a Network object interpreting the recurrence matrix as the\n        #  graph adjacency matrix.\n        if local_recurrence_rate is not None:\n            #  A recurrence network with fixed local recurrence rate (Eckmann\n            #  definition of a recurrence plot) is directed by definition.\n            Network.__init__(self, A, directed=True, node_weights=node_weights,\n                             silence_level=silence_level)\n        else:\n            #  Create a Network object interpreting the recurrence matrix as\n            #  the graph adjacency matrix. Recurrence networks are undirected\n            #  by definition.\n            Network.__init__(self, A, directed=False,\n                             node_weights=node_weights,\n                             silence_level=silence_level)\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation.\n        \"\"\"\n        return (f\"RecurrenceNetwork:\\n\"\n                f\"{RecurrencePlot.__str__(self)}\\n\"\n                f\"{Network.__str__(self)}\")\n\n    #\n    #  Methods to handle recurrence networks\n    #\n    def set_fixed_threshold(self, threshold):\n        \"\"\"\n        Create a recurrence network at a fixed threshold.\n\n        :arg number threshold: The threshold.\n        \"\"\"\n        #  Set fixed threshold on recurrence plot level\n        RecurrencePlot.set_fixed_threshold(self, threshold)\n\n        #  Set diagonal of R to zero to avoid self-loops in the recurrence\n        #  network\n        A = self.R.copy()\n        A.flat[::self.N+1] = 0\n\n        #  Create a Network object interpreting the recurrence matrix as the\n        #  graph adjacency matrix. Recurrence networks are undirected by\n        #  definition.\n        Network.__init__(self, A, directed=False,\n                         silence_level=self.silence_level)\n\n    def set_fixed_threshold_std(self, threshold_std):\n        \"\"\"\n        Set the recurrence network to a fixed threshold in units of the\n        standard deviation of the time series.\n\n        :arg number threshold_std: The recurrence threshold in units of the\n            standard deviation of the time series.\n        \"\"\"\n        #  Set fixed threshold in units of STD on recurrence plot level\n        RecurrencePlot.set_fixed_threshold_std(self, threshold_std)\n\n        #  Set diagonal of R to zero to avoid self-loops in the recurrence\n        #  network\n        A = self.R.copy()\n        A.flat[::self.N+1] = 0\n\n        #  Create a Network object interpreting the recurrence matrix as the\n        #  graph adjacency matrix. Recurrence networks are undirected by\n        #  definition.\n        Network.__init__(self, A, directed=False,\n                         silence_level=self.silence_level)\n\n    def set_fixed_recurrence_rate(self, recurrence_rate):\n        \"\"\"\n        Create a recurrence network at a fixed link density (recurrence rate).\n\n        :arg number recurrence_rate: The link density / recurrence rate.\n        \"\"\"\n        #  Set fixed recurrence rate on recurrence plot level\n        RecurrencePlot.set_fixed_recurrence_rate(self, recurrence_rate)\n\n        #  Set diagonal of R to zero to avoid self-loops in the recurrence\n        #  network\n        A = self.R.copy()\n        A.flat[::self.N+1] = 0\n\n        #  Create a Network object interpreting the recurrence matrix as the\n        #  graph adjacency matrix. Recurrence networks are undirected by\n        #  definition.\n        Network.__init__(self, A, directed=False,\n                         silence_level=self.silence_level)\n\n    def set_fixed_local_recurrence_rate(self, local_recurrence_rate):\n        \"\"\"\n        Create a recurrence network at a fixed local recurrence rate.\n\n        This leads to a directed recurrence network with identical out-degree\n        :math:`int(N * local_recurrence_rate)`, but variable in-degree. The\n        associated recurrence plot coincides with the original Eckmann\n        definition.\n\n        :arg number local_recurrence_rate: The local recurrence rate.\n        \"\"\"\n        #  Set fixed local recurrence rate on recurrence plot level\n        RecurrencePlot.\\\n            set_fixed_local_recurrence_rate(self, local_recurrence_rate)\n\n        #  Create a Network object interpreting the recurrence matrix as the\n        #  graph adjacency matrix. Set diagonal of R to zero to avoid\n        #  self-loops in the recurrence network\n        A = self.R.copy()\n        A.flat[::self.N+1] = 0\n\n        #  A recurrence network with fixed local recurrence rate (Eckmann\n        #  definition of a recurrence plot) is directed by definition.\n        Network.__init__(self, A, directed=True,\n                         silence_level=self.silence_level)\n\n    def set_adaptive_neighborhood_size(self, adaptive_neighborhood_size,\n                                       order=None):\n        \"\"\"\n        Create a recurrence network using the :index:`adaptive neighborhood\n        size <single: adaptive neighborhood size; recurrence network>`\n        algorithm used in [Xu2008]_.\n\n        The exact algorithm was deduced from private correspondence with the\n        authors.  It leads to an undirected network with mean degree\n        :math:`<k> = 2 * m`, where m is the adaptive_neighborhood_size.\n        The degree :math:`k_v` of single nodes may vary, but :math:`k_v >= m`\n        holds!\n\n        :arg number adaptive_neighborhood_size: The number of adaptive nearest\n            neighbors (recurrences) assigned to each state vector.\n        :type order: 1D array (int32)\n        :arg order: The indices of state vectors in the order desired for\n            processing by the algorithm.\n        \"\"\"\n        #  Set adaptive neighborhood size on recurrence plot level\n        RecurrencePlot.set_adaptive_neighborhood_size(\n            self, adaptive_neighborhood_size, order)\n\n        #  Create a Network object interpreting the recurrence matrix as the\n        #  graph adjacency matrix. Set diagonal of R to zero to avoid\n        #  self-loops in the recurrence network\n        A = self.R.copy()\n        A.flat[::self.N+1] = 0\n\n        #  A recurrence network with fixed local recurrence rate (Eckmann\n        #  definition of a recurrence plot) is directed by definition.\n        Network.__init__(self, A, directed=False,\n                         silence_level=self.silence_level)\n\n    def transitivity_dim_single_scale(self):\n        \"\"\"\n        Return transitivity dimension for a single scale.\n\n        The single scale transitivity dimension can be interpreted as a global\n        measure of the dimensionality of the set of points underlying the\n        recurrence network ([Donner2011b]_.). The scale is determined by the\n        chosen recurrence threshold. Note that the maxima and minima of the\n        single scale transitivity dimension when varying the scale give a\n        more meaningful measure of dimensionality as is explained in\n        [Donner2011b]_.\n\n        **Attention:** currently only works correctly for supremum norm.\n\n        :rtype: float\n        :return: the single scale transitivity dimension.\n        \"\"\"\n        return np.log(self.transitivity()) / np.log(3. / 4.)\n\n    def local_clustering_dim_single_scale(self):\n        \"\"\"\n        Return local clustering dimension for a single scale.\n\n        The single scale local clustering dimension can be interpreted as a\n        local measureof the dimensionality of the set of points underlying the\n        recurrence network ([Donner2011b]_.). The scale is determined by the\n        chosen recurrence threshold. Note that the maxima and minima of the\n        single scale local clustering dimension when varying the scale give a\n        more meaningful measure of dimensionality as is explained in\n        [Donner2011b]_.\n\n        **Attention:**\n        currently only works correctly for supremum norm.\n\n        :rtype: 1d numpy array [node] of float\n        :return: the single scale transitivity dimension.\n        \"\"\"\n        return np.log(self.local_clustering()) / np.log(3. / 4.)\n"
  },
  {
    "path": "src/pyunicorn/timeseries/recurrence_plot.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for the analysis of dynamical systems and time series based\non recurrence plots, including measures of recurrence quantification\nanalysis (RQA) and recurrence network analysis.\n\"\"\"\n\nfrom math import factorial\nfrom typing import Tuple\nfrom collections.abc import Hashable\n\nimport numpy as np\nfrom numpy.typing import NDArray\n\nfrom ..core.cache import Cached\nfrom ..core._ext.types import to_cy, NODE, LAG, FIELD, DFIELD\nfrom ._ext.numerics import _embed_time_series, _manhattan_distance_matrix_rp, \\\n    _euclidean_distance_matrix_rp, _supremum_distance_matrix_rp, \\\n    _set_adaptive_neighborhood_size, _bootstrap_distance_matrix_manhattan, \\\n    _bootstrap_distance_matrix_euclidean, \\\n    _bootstrap_distance_matrix_supremum, \\\n    _diagline_dist_missingvalues, _diagline_dist, \\\n    _diagline_dist_sequential_missingvalues, _diagline_dist_sequential, \\\n    _vertline_dist_missingvalues, _vertline_dist, \\\n    _vertline_dist_sequential_missingvalues, _vertline_dist_sequential, \\\n    _rejection_sampling, _white_vertline_dist, _twins_r, _twin_surrogates_r\n\n\nclass RecurrencePlot(Cached):\n    \"\"\"\n    Class RecurrencePlot for generating and quantitatively analyzing\n    :index:`recurrence plots <single: recurrence plot>`.\n\n    The RecurrencePlot class supports the construction of recurrence plots\n    from multi-dimensional time series, optionally using embedding. Currently,\n    manhattan, euclidean and supremum norms are provided for measuring\n    distances in phase space.\n\n    Methods for calculating commonly used measures of :index:`recurrence\n    quantification analysis <pair: RQA; recurrence plot>` (RQA) are provided,\n    e.g., determinism, maximum diagonal line length and laminarity. The\n    definitions of these measures together with a review of the theory and\n    applications of recurrence plots are given in [Marwan2007]_.\n\n    **Examples:**\n\n     - Create an instance of RecurrencePlot with a fixed recurrence threshold\n       and without embedding::\n\n           RecurrencePlot(time_series, threshold=0.1)\n\n     - Create an instance of RecurrencePlot with a fixed recurrence threshold\n       in units of STD and without embedding::\n\n           RecurrencePlot(time_series, threshold_std=0.03)\n\n     - Create an instance of RecurrencePlot at a fixed (global) recurrence rate\n       and using time delay embedding::\n\n           RecurrencePlot(time_series, dim=3, tau=2,\n                          recurrence_rate=0.05).recurrence_rate()\n    \"\"\"\n\n    #\n    #  Internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, time_series: NDArray, metric: str = \"supremum\",\n                 normalize: bool = False, missing_values: bool = False,\n                 sparse_rqa: bool = False, silence_level: int = 0,\n                 **kwargs):\n        \"\"\"\n        Initialize an instance of RecurrencePlot.\n\n        Either recurrence threshold ``threshold``/``threshold_std``, recurrence\n        rate ``recurrence_rate`` or local recurrence rate\n        ``local_recurrence_rate`` have to be given as keyword arguments.\n\n        Embedding is only supported for scalar time series. If embedding\n        dimension ``dim`` and delay ``tau`` are **both** given as keyword\n        arguments, embedding is applied. Multidimensional time series are\n        processed as is by default.\n\n        :attention: The sparse_rqa feature is experimental and currently only\n                    works for fixed threshold and the supremum metric.\n\n        :type time_series: 2D array (time, dimension)\n        :arg time_series: The time series to be analyzed, can be scalar or\n            multi-dimensional.\n        :arg str metric: The metric for measuring distances in phase space\n            (\"manhattan\", \"euclidean\", \"supremum\").\n        :arg bool normalize: Decide whether to normalize the time series to\n            zero mean and unit standard deviation.\n        :arg bool missing_values: Toggle special treatment of missing values in\n            :attr:`.RecurrencePlot.time_series`.\n        :arg bool sparse_rqa: Toggles sequential RQA computation using less\n            memory for use with long time series.\n        :arg bool skip_recurrence: Skip calculation of recurrence matrix within\n            RP class (e.g. when overloading respective methods in child class)\n        :arg int silence_level: Inverse level of verbosity of the object.\n        :arg number threshold: The recurrence threshold keyword for generating\n            the recurrence plot using a fixed threshold.\n        :arg number threshold_std: The recurrence threshold keyword for\n            generating the recurrence plot using a fixed threshold in units of\n            the time series' STD.\n        :arg number recurrence_rate: The recurrence rate keyword for generating\n            the recurrence plot using a fixed recurrence rate.\n        :arg number local_recurrence_rate: The local recurrence rate keyword\n            for generating the recurrence plot using a fixed local recurrence\n            rate (same number of recurrences for each state vector).\n        :arg number adaptive_neighborhood_size: The adaptive neighborhood size\n            parameter for generating recurrence plots based on the algorithm in\n            [Xu2008]_.\n        :arg number dim: The embedding dimension.\n        :arg number tau: The embedding delay.\n        \"\"\"\n        #  Set silence_level\n        self.silence_level = silence_level\n        \"\"\"The inverse level of verbosity of the object.\"\"\"\n\n        #  Set missing_values flag\n        self.missing_values = missing_values\n        \"\"\"Controls special treatment of missing values in\n           :attr:`.RecurrencePlot.time_series`.\"\"\"\n\n        #  Set sparse RQA flag\n        self.sparse_rqa = sparse_rqa\n        \"\"\"Controls sequential calculation of RQA measures.\"\"\"\n\n        #  Store time series\n        self.time_series = to_cy(time_series, FIELD)\n        \"\"\"The time series from which the recurrence plot is constructed.\"\"\"\n\n        #  Reshape time series\n        self.time_series.shape = (self.time_series.shape[0], -1)\n\n        #  Store type of metric\n        self._known_metrics = (\"manhattan\", \"euclidean\", \"supremum\")\n        assert metric in self._known_metrics\n        self.metric = metric\n        \"\"\"The metric used for measuring distances in phase space.\"\"\"\n\n        # minimal denominator for numerical stability\n        self._epsilon = 1e-08\n\n        #  Normalize time series\n        if normalize:\n            self.normalize_time_series(self.time_series)\n\n        #  Get embedding dimension and delay from **kwargs\n        self.dim = kwargs.get(\"dim\")\n        self.tau = kwargs.get(\"tau\")\n\n        self.N: int = 0\n        \"\"\"The number of state vectors (number of lines and rows) of the RP.\"\"\"\n        self.R = None\n        \"\"\"The recurrence matrix.\"\"\"\n\n        self._mut_embedding: int = 0\n        if (self.dim is not None) and (self.tau is not None):\n            #  Embed the time series\n            self.embedding = self.embed_time_series(\n                self.time_series, self.dim, self.tau)\n        else:\n            self.embedding = self.time_series\n\n        #  Get missing value indices\n        if self.missing_values:\n            self.missing_value_indices = \\\n                np.isnan(self.embedding).sum(axis=1) != 0\n\n        #  Get threshold or recurrence rate from **kwargs, construct recurrence\n        #  plot accordingly\n        self.threshold = kwargs.get(\"threshold\")\n        self.threshold_std = kwargs.get(\"threshold_std\")\n        #  Make sure not to overwrite the method recurrence_rate()\n        recurrence_rate = kwargs.get(\"recurrence_rate\")\n        self.local_recurrence_rate = kwargs.get(\"local_recurrence_rate\")\n        self.adaptive_neighborhood_size = \\\n            kwargs.get(\"adaptive_neighborhood_size\")\n\n        #  Precompute recurrence matrix only if sequential RQA is switched off,\n        #  and not calling from child class with respective overriding methods.\n        skip_recurrence = kwargs.get(\"skip_recurrence\")\n\n        if not sparse_rqa and not skip_recurrence:\n            if self.threshold is not None:\n                #  Calculate the recurrence matrix R using the radius of\n                #  neighborhood threshold\n                RecurrencePlot.set_fixed_threshold(self, self.threshold)\n            elif self.threshold_std is not None:\n                #  Calculate the recurrence matrix R using the radius of\n                #  neighborhood threshold in units of the time series' STD\n                RecurrencePlot.set_fixed_threshold_std(\n                    self, self.threshold_std)\n            elif recurrence_rate is not None:\n                #  Calculate the recurrence matrix R using a fixed recurrence\n                #  rate\n                RecurrencePlot.set_fixed_recurrence_rate(\n                    self, recurrence_rate)\n            elif self.local_recurrence_rate is not None:\n                #  Calculate the recurrence matrix R using a fixed local\n                #  recurrence rate\n                RecurrencePlot.set_fixed_local_recurrence_rate(\n                    self, self.local_recurrence_rate)\n            elif self.adaptive_neighborhood_size is not None:\n                #  Calculate the recurrence matrix R using the adaptive\n                #  neighborhood size algorithm in [Xu2008]_\n                RecurrencePlot.set_adaptive_neighborhood_size(\n                    self, self.adaptive_neighborhood_size)\n            else:\n                raise NameError(\"Please give either threshold or \\\n                                recurrence_rate to construct the recurrence \\\n                                plot!\")\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        return (self._mut_embedding,)\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation.\n        \"\"\"\n        return (\"RecurrencePlot: \"\n                f\"time series shape {self.time_series.shape}.\\n\"\n                f\"Embedding dimension {self.dim if self.dim else 0}\\n\"\n                f\"Threshold {self.threshold}, {self.metric} metric\")\n\n    @property\n    def embedding(self) -> np.ndarray:\n        \"\"\"\n        The embedded time series / phase space trajectory\n        (time, embedding dimension).\n        \"\"\"\n        return self._embedding\n\n    @embedding.setter\n    def embedding(self, embedding: np.ndarray):\n        self._embedding = to_cy(embedding, DFIELD)\n        self.N = self._embedding.shape[0]\n        self._mut_embedding += 1\n\n    #\n    #  Service methods\n    #\n\n    def recurrence_matrix(self):\n        \"\"\"\n        Return the current recurrence matrix :math:`R`.\n\n        :rtype: 2D square Numpy array\n        :return: the current recurrence matrix :math:`R`.\n        \"\"\"\n        if not self.sparse_rqa:\n            return self.R\n        else:\n            print(\"Exception: Sequential RQA mode is enabled. \"\n                  \"Recurrence matrix is not stored in memory.\")\n            return None\n\n    def distance_matrix(self, metric: str):\n        \"\"\"\n        Return phase space distance matrix :math:`D` according to the chosen\n        metric.\n\n        :arg str metric: The metric for measuring distances in phase space\n            (\"manhattan\", \"euclidean\", \"supremum\").\n        :rtype: 2D square array\n        :return: the phase space distance matrix :math:`D`\n        \"\"\"\n        assert metric in self._known_metrics, f\"unknown metric: {metric}\"\n        return getattr(RecurrencePlot, f\"{metric}_distance_matrix\")(self)\n\n    #\n    #  Time series handling methods\n    #\n\n    @staticmethod\n    def normalize_time_series(time_series):\n        \"\"\"\n        :index:`Normalize <pair: normalize; time series>` each component of a\n        time series **in place**.\n\n        Works also for complex valued time series.\n\n        .. note::\n           Modifies the given array in place!\n\n        :type time_series: 2D array (time, dimension)\n        :arg time_series: The time series to be normalized.\n        \"\"\"\n        #  Get number of components of time_series\n        dim = time_series.shape[1]\n\n        mean = time_series.mean(axis=0)\n        std = time_series.std(axis=0)\n\n        #  Normalize all components separately\n        for i in range(dim):\n            time_series[:, i] -= mean[i]\n            if std[i] != 0:\n                time_series[:, i] /= std[i]\n\n    # Heitzig:\n    @staticmethod\n    def legendre_coordinates(x, dim=3, t=None, p=None, tau_w=\"est\"):\n        \"\"\"\n        Return a phase space trajectory reconstructed using orthogonal\n        polynomial filters.\n\n        The reconstructed state vector components are the zero-th to (dim-1)-th\n        derivatives of the (possibly irregularly spaced) time series x\n        as estimated by folding with the orthogonal polynomial filters that\n        correspond to the sequence of measurement time points t.\n\n        This is a generalization for irregularly spaced time series\n        of the \"Legendre coordinates\" introduced in Gibson et al. (1992).\n\n        :arg array-like x: Time series values\n        :arg int dim: Dimension > 0 of reconstructed phase space. Default: 3\n        :type t: array-like or None\n        :arg t: Optional array of measurement time points corresponding to the\n            values in x. Default: [0,...,x.size-1]\n        :type p: int > 0 or None\n        :arg p: No. of past and future time points to use for the estimation.\n            Default: dim or determined by tau_w if given\n        :type tau_w: float > 0 or \"est\" or None\n        :arg tau_w: Optional (average) window width to use in determining p\n            when p = None. Following Gibson et al. (1992), this should be about\n            sqrt(3/< x**2 >) * std(x), or about a quarter period.  If \"est\",\n            this is estimated iteratively, starting with\n            4 * (max(t)-min(t)) / (N-1) and estimating x' from that.\n        :rtype:  2D array [observation index, dimension index]\n        :return: Estimated derivatives. Rows are reconstructed state vectors.\n        \"\"\"\n        x = np.array(x).flatten()\n        N = x.size\n\n        # time points:\n        if t is None:\n            t = np.arange(N)\n\n        if p is None:\n            if tau_w == \"est\":\n                tau_w = 4 * (t.max() - t.min()) / (N-1)\n                for i in range(5):\n                    y0 = RecurrencePlot.legendre_coordinates(x, dim=2, t=t,\n                                                             tau_w=tau_w)\n                    tau_w = np.sqrt(3*x.var()/(y0[:, 1]**2).mean())\n                print(\"tau_w set to\", tau_w)\n            if tau_w is None:\n                p = dim\n            else:\n                p = 1\n                while (t[2*p+1:] - t[:-(2*p+1)]).mean() < tau_w and p < N/4:\n                    p += 1\n                print(\"p set to\", p)\n\n        m = 2*p + 1\n        N1 = N - m + 1\n\n        # time differences:\n        dt = np.zeros((N1, m))\n        for i in range(N1):\n            dt[i, :] = t[i:i+m] - t[i+p]\n\n        # filter weights\n        # = recursively computed values of orthogonal polynomials:\n        r = np.zeros((N1, dim, m))\n        for j in range(dim):\n            r[:, j, :] = dt**j - (\n                r[:, :j, :] * ((dt**j).reshape((N1, 1, m)) * r[:, :j, :]).sum(\n                    axis=2).reshape((N1, j, 1))).sum(axis=1)\n            r[:, j, :] /= np.sqrt((r[:, j, :]**2).sum(axis=1)).reshape((N1, 1))\n        for j in range(dim):\n            r[:, j, :] *= factorial(j) / \\\n                (r[:, j, :] * dt**j).sum(axis=1).reshape((-1, 1))\n\n        # reconstructed state vectors = filtered time series values:\n        y = np.zeros((N1, dim))\n        for i in range(N1):\n            y[i, :] = (r[i, :, :]*x[i:i+m].reshape((1, m))).sum(axis=1)\n\n        return y\n\n    @staticmethod\n    def embed_time_series(time_series, dim, tau):\n        \"\"\"\n        Return a time series' delay embedding.\n\n        Returns a Numpy array containing a delay embedding of the time series\n        using embedding dimension dim and time delay tau.\n\n        :type time_series: 1D array\n        :arg time_series: The scalar time series to be embedded.\n        :arg int dim: The embedding dimension.\n        :arg int tau: The embedding delay.\n        :rtype: 2D array (time, dimension)\n        :return: the embedded phase space trajectory.\n        \"\"\"\n        #  Make sure that dim and tau are Python integers\n        dim = int(dim)\n        tau = int(tau)\n        time_series = to_cy(time_series, FIELD)\n        if time_series.ndim > 1:\n            time_series = time_series.squeeze(axis=-1)\n        assert time_series.ndim == 1\n        n_time = time_series.shape[0]\n\n        embedding = np.empty((n_time - (dim - 1) * tau, dim), dtype=FIELD)\n        _embed_time_series(n_time, dim, tau, time_series, embedding)\n        return embedding\n\n    def permutation_entropy(self, normalize=True):\n        \"\"\"\n        Returns the permutation entropy for an embedded time series.\n        An embedding of 3 <= embedding dimension <= 7 is recommended for this\n        method.\n\n        Reference: [Bandt2002]_\n\n        :rtype: double\n        :return: Permutation entropy of the embedded time series\n        \"\"\"\n        if self.dim is None or self.tau is None:\n            raise ValueError(\"Permutation Entropy only works for \"\n                             \"one-dimensional embedded time series!\")\n\n        # Calculate order from embedding\n        temp = self.embedding.argsort(axis=1)\n        ranks = temp.argsort(axis=1)\n\n        # Calculate probability distribution\n        P = np.unique(ranks, return_counts=True, axis=0)[1]\n        P = P / ranks.shape[0]\n\n        entropy = abs(-(P*np.log2(P)).sum())\n        if normalize:\n            entropy = entropy / np.log2(factorial(self.dim))\n\n        return entropy\n\n    def complexity_entropy(self):\n        \"\"\"\n        Returns the complexity entropy for each dimension of the time series.\n\n        Reference: [Ribeiro2011]_\n\n        :rtype: double\n        :return: Complexity entropy of the embedded time series\n        \"\"\"\n\n        if self.dim is None or self.tau is None:\n            raise ValueError(\"Complexity Entropy only works for \"\n                             \"one-dimensional embedded time series!\")\n\n        # Calculate ranks from embedding\n        temp = self.embedding.argsort(axis=1)\n        ranks = temp.argsort(axis=1)\n\n        # Calculate probability distribution\n        P = np.unique(ranks, return_counts=True, axis=0)[1]\n        P = P / ranks.shape[0]\n\n        # Calculate factorial of embedding dimension\n        d_fac = factorial(self.dim)\n\n        # Calculate permutation entropy\n        S_P = abs(-(P*np.log2(P)).sum())\n\n        # Initialize unit probability distribution\n        P_e = np.ones(d_fac) / d_fac\n\n        # Calculate permutation entropy of unit probability distribution\n        S_Pe = abs(-(P_e*np.log2(P_e)).sum())\n\n        # Calculate combined probability distribution\n        P_comb = np.zeros(d_fac)\n        P_comb[:len(P)] = P\n        P_comb = (P_comb + P_e) / 2\n\n        # Calculate permutation entropy of combinded probability distribution\n        S_PPe = abs(-(P_comb*np.log2(P_comb)).sum())\n\n        # Calculation of maximum Q split into several steps for\n        # readability\n        Q_max = (d_fac + 1) / d_fac * np.log2(d_fac + 1)\n        Q_max = Q_max - 2*np.log2(2*d_fac) + np.log2(d_fac)\n        Q_max = - Q_max / 2\n\n        Q = (S_PPe - S_P/2 - S_Pe/2) / Q_max\n\n        complexity_entropy = Q * S_P / np.log2(d_fac)\n\n        return complexity_entropy\n\n    #\n    #  Calculate recurrence plot\n    #\n\n    @Cached.method(name=\"the manhattan distance matrix\")\n    def manhattan_distance_matrix(self):\n        \"\"\"\n        Return the manhattan distance matrix from an embedding of a time\n        series.\n\n        :rtype: 2D square array\n        :return: the manhattan distance matrix.\n        \"\"\"\n        (n_time, dim) = self.embedding.shape\n        return _manhattan_distance_matrix_rp(n_time, dim, self.embedding)\n\n    @Cached.method(name=\"the euclidean distance matrix\")\n    def euclidean_distance_matrix(self):\n        \"\"\"\n        Return the euclidean distance matrix from an embedding of a time\n        series.\n\n        :rtype: 2D square array\n        :return: the euclidean distance matrix.\n        \"\"\"\n        (n_time, dim) = self.embedding.shape\n        return _euclidean_distance_matrix_rp(n_time, dim, self.embedding)\n\n    @Cached.method(name=\"the supremum distance matrix\")\n    def supremum_distance_matrix(self):\n        \"\"\"\n        Return the supremum distance matrix from an embedding of a time series.\n\n        :rtype: 2D square Numpy array\n        :return: the supremum distance matrix.\n        \"\"\"\n        (n_time, dim) = self.embedding.shape\n        return _supremum_distance_matrix_rp(n_time, dim, self.embedding)\n\n    def set_fixed_threshold(self, threshold):\n        \"\"\"\n        Set the recurrence plot to a fixed threshold.\n\n        Modifies / sets the class variables :attr:`R` and :attr:`N`\n        accordingly.\n\n        :arg number threshold: The recurrence threshold.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating recurrence plot at fixed threshold...\")\n\n        distance = RecurrencePlot.distance_matrix(self, self.metric)\n        n_time = distance.shape[0]\n        recurrence = np.zeros((n_time, n_time), dtype=\"int8\")\n        recurrence[distance < threshold] = 1\n        if self.missing_values:\n            #  Write missing value lines and rows to recurrence matrix\n            #  NaN flag is not supported by int8 data format -> use 0 here\n            recurrence[self.missing_value_indices, :] = 0\n            recurrence[:, self.missing_value_indices] = 0\n\n        self.R = recurrence\n\n    def set_fixed_threshold_std(self, threshold_std):\n        \"\"\"\n        Set the recurrence plot to a fixed threshold in units of the standard\n        deviation of the time series.\n\n        Calculates the absolute threshold and calls\n        :meth:`set_fixed_threshold`.\n\n        :arg number threshold_std: The recurrence threshold in units of the\n            standard deviation of the time series.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating recurrence plot at fixed threshold in units of \"\n                  \"time series STD...\")\n\n        threshold = threshold_std * self.time_series.std()\n        RecurrencePlot.set_fixed_threshold(self, threshold)\n\n    def set_fixed_recurrence_rate(self, recurrence_rate):\n        \"\"\"\n        Set the recurrence plot to a fixed recurrence rate.\n\n        Modifies / sets the class variables :attr:`R` and :attr:`N`\n        accordingly.\n\n        :arg number recurrence_rate: The recurrence rate.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating recurrence plot at fixed recurrence rate...\")\n\n        distance = RecurrencePlot.distance_matrix(self, self.metric)\n        n_time = distance.shape[0]\n        threshold = self.threshold_from_recurrence_rate(distance,\n                                                        recurrence_rate)\n        recurrence = np.zeros((n_time, n_time), dtype=\"int8\")\n        recurrence[distance < threshold] = 1\n        self.R = recurrence\n\n    def set_fixed_local_recurrence_rate(self, local_recurrence_rate):\n        \"\"\"\n        Set the recurrence plot to a fixed local recurrence rate.\n\n        This results in a fixed number of recurrences for each state vector,\n        i.e., all state vectors have the same number of recurrences.  Modifies\n        / sets the class variables :attr:`R` and :attr:`N` accordingly.\n\n        .. note::\n           The resulting recurrence matrix :math:`R` is generally asymmetric!\n\n        :arg number local_recurrence_rate: The local recurrence rate.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating recurrence plot at fixed \"\n                  \"local recurrence rate...\")\n\n        distance = RecurrencePlot.distance_matrix(self, self.metric)\n        n_time = distance.shape[0]\n        recurrence = np.zeros((n_time, n_time), dtype=\"int8\")\n        for i in range(n_time):\n            #  Get threshold for state vector i to obtain fixed local\n            #  recurrence rate\n            local_threshold = self.threshold_from_recurrence_rate(\n                distance[i, :], local_recurrence_rate)\n            #  Thresholding the distance matrix for column i\n            recurrence[i, distance[i, :] < local_threshold] = 1\n        self.R = recurrence\n\n    def set_adaptive_neighborhood_size(self, adaptive_neighborhood_size,\n                                       order=None):\n        \"\"\"\n        Construct recurrence plot using the :index:`adaptive neighborhood\n        size <single: adaptive neighborhood size; recurrence plot>` algorithm\n        introduced in [Xu2008]_.\n\n        The exact algorithm was deduced from private correspondence with the\n        authors, as the description given in the above mentioned is not correct\n        or at least ambiguous.\n\n        Modifies / sets the class variables :attr:`R` and :attr:`N`\n        accordingly.\n\n        :arg number adaptive_neighborhood_size: The number of adaptive nearest\n            neighbors (recurrences) assigned to each state vector.\n        :type order: 1D array of int32\n        :arg order: The indices of state vectors in the order desired for\n            processing by the algorithm. The standard order is :math:`1,...,N`.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating recurrence plot using the \"\n                  \"adaptive neighborhood size algorithm...\")\n\n        distance = RecurrencePlot.distance_matrix(self, self.metric)\n\n        #  Get indices that would sort the distance matrix.\n        #  sorted_neighbors[i,j] contains the index of the jth nearest neighbor\n        #  of i. Sorting order is very important here!\n        sorted_neighbors = to_cy(distance.argsort(axis=1), NODE)\n\n        n_time = distance.shape[0]\n        recurrence = np.zeros((n_time, n_time), dtype=LAG)\n\n        #  Set processing order of state vectors\n        if order is None:\n            order = np.arange(n_time, dtype=NODE)\n        else:\n            order = to_cy(order, NODE)\n\n        _set_adaptive_neighborhood_size(n_time, adaptive_neighborhood_size,\n                                        sorted_neighbors, order, recurrence)\n        self.R = recurrence\n\n    @staticmethod\n    def threshold_from_recurrence_rate(distance, recurrence_rate: float):\n        \"\"\"\n        Return the threshold for recurrence plot construction given the\n        recurrence rate.\n\n        Be aware, that the returned threshold can only approximately give the\n        desired recurrence rate. The accuracy depends on the distribution of\n        values in the given distance matrix :math:`D`.\n\n        :type distance: 2D square array.\n        :arg distance: The phase space distance matrix :math:`D`.\n        :arg number recurrence_rate: The desired recurrence rate.\n        :return number: the recurrence threshold corresponding to the desired\n            recurrence rate.\n        \"\"\"\n        #  Flatten and sort distance matrix\n        flat_distance = distance.flatten()\n        flat_distance.sort()\n\n        #  Get threshold\n        assert 0 <= recurrence_rate <= 1\n        N = len(flat_distance)\n        threshold = flat_distance[int(recurrence_rate * (N - 1))]\n\n        #  Clean up\n        del flat_distance\n\n        return threshold\n\n    @staticmethod\n    def threshold_from_recurrence_rate_fast(distance, recurrence_rate,\n                                            rr_precision=0.001):\n        \"\"\"\n        Return the threshold for recurrence plot construction given the\n        recurrence rate.\n\n        The threshold yielding a given recurrence_rate is approximated using a\n        randomly selected rr_precision percent of the distance matrix' entries.\n        Hence, the expected accuracy is lower than that achieved by using\n        :index:`threshold_from_recurrence_rate`.\n\n        :type distance: 2D square array.\n        :arg distance: The phase space distance matrix :math:`D`.\n        :arg number recurrence_rate: The desired recurrence rate.\n        :arg number rr_precision: The desired precision of recurrence rate\n            estimation.\n        :return number: the recurrence threshold corresponding to the desired\n            recurrence rate.\n        \"\"\"\n        #  Get number of distances to be randomly chosen\n        n_samples = int(rr_precision * distance.size)\n\n        #  Get number of phase space points\n        n_time = distance.shape[0]\n\n        # vectorized version\n        i = np.random.randint(n_time, size=n_samples)\n        j = np.random.randint(n_time, size=n_samples)\n        samples = distance[i, j]\n\n        #  Sort and get threshold\n        samples.sort()\n        threshold = samples[int(recurrence_rate * n_samples)]\n        return threshold\n\n    @staticmethod\n    def bootstrap_distance_matrix(embedding, metric, M):\n        \"\"\"\n        Return bootstrap samples from distance matrix.\n\n        :type embedding: 2D array (time, embedding dimension)\n        :arg embedding: The phase space trajectory.\n        :arg str metric: The metric for measuring distances in phase space\n            (\"manhattan\", \"euclidean\", \"supremum\").\n        :arg int M: Number of bootstrap samples\n        :rtype: 1D array (\"float32\")\n        :return: the bootstrap samples from distance matrix.\n        \"\"\"\n        #  Prepare\n        M = int(M)\n        embedding = to_cy(embedding, DFIELD)\n        distances = np.zeros(M, dtype=DFIELD)\n        (n_time, dim) = embedding.shape\n\n        if metric == \"manhattan\":\n            _bootstrap_distance_matrix_manhattan(n_time, dim, embedding,\n                                                 distances, M)\n\n        elif metric == \"euclidean\":\n            _bootstrap_distance_matrix_euclidean(n_time, dim, embedding,\n                                                 distances, M)\n\n        elif metric == \"supremum\":\n            _bootstrap_distance_matrix_supremum(n_time, dim, embedding,\n                                                distances, M)\n        return distances\n\n    #\n    #  Recurrence quantification analysis (RQA)\n    #\n\n    def rqa_summary(self, l_min=2, v_min=2):\n        \"\"\"\n        Return a selection of RQA measures.\n\n        The selection consists of the recurrence rate :math:`RR`, the\n        determinism :math:`DET`, the average diagonal line length :math:`L` and\n        the laminarity :math:`LAM`.\n\n        :arg int l_min: The minimum diagonal line length.\n        :arg int v_min: The minimum vertical line length.\n        :rtype: Python dictionary\n        :return: a selection of RQA measures.\n        \"\"\"\n        RR = self.recurrence_rate()\n        DET = self.determinism(l_min)\n        L = self.average_diaglength(l_min)\n        LAM = self.laminarity(v_min)\n\n        return {\"RR\": RR, \"DET\": DET, \"L\": L, \"LAM\": LAM}\n\n    def recurrence_rate(self):\n        \"\"\"\n        Return the :index:`recurrence rate` :math:`RR`.\n\n        RR gives the percentage of black dots in the recurrence plot.\n\n        :return number: the recurrence rate :math:`RR`.\n        \"\"\"\n        N = self.N\n        if not self.sparse_rqa:\n            R = self.recurrence_matrix()\n            RR = R.sum() / N ** 2\n        elif self.metric == \"supremum\":\n            RR = (self.vertline_dist() * np.arange(1, N + 1)).sum() / N ** 2\n        else:\n            raise NotImplementedError(\n                \"Sequential RQA is currently only available for \"\n                \"fixed threshold and the supremum metric.\")\n        return RR\n\n    def recurrence_probability(self, lag=0):\n        \"\"\"\n        Return the recurrence probability. This is the probability, that\n        the trajectory is recurrent after 'lag' time steps.\n\n        Contributed by Jan H. Feldhoff.\n\n        :return number: the recurrence probability\n        \"\"\"\n        R = self.recurrence_matrix()\n        N = self.N\n        SUM = np.sum(np.diag(R, lag))\n\n        return SUM / float(N-lag)\n\n    #\n    #  RQA measures based on black diagonal lines\n    #\n\n    @Cached.method(attrs=(\n        \"metric\", \"threshold\", \"missing_values\", \"sparse_rqa\"))\n    def diagline_dist(self):\n        \"\"\"\n        Return the :index:`frequency distribution of diagonal line lengths\n        <triple: frequency distribution; diagonal; line length>`\n        :math:`P(l-1)`.\n\n        Note that entry :math:`P(l-1)` contains the number of\n        :index:`diagonal lines <pair: diagonal; lines>` of length :math:`l`.\n        Thus, :math:`P(0)` counts lines of length :math:`1`,\n        :math:`P(1)` counts lines of length :math:`2`, asf.\n        The main diagonal is not counted,\n        hence :math:`P(N)` will always be :math:`0`.\n\n        .. note::\n           Experimental handling of missing values. Diagonal lines\n           touching lines and blocks of missing entries in the\n           recurrence matrix are not counted.\n\n        :rtype: 1D array (int32)\n        :return: the frequency distribution of diagonal line lengths\n            :math:`P(l-1)`.\n        \"\"\"\n        #  Prepare\n        n_time = self.N\n        diagline = np.zeros(n_time, dtype=NODE)\n\n        if not self.sparse_rqa:\n            #  Get recurrence matrix\n            recmat = self.recurrence_matrix()\n\n            if self.missing_values:\n                mv_indices = self.missing_value_indices\n                _diagline_dist_missingvalues(\n                    n_time, diagline, recmat, mv_indices)\n            else:\n                _diagline_dist(n_time, diagline, recmat)\n\n        #  Calculations for sequential RQA\n        elif self.metric == \"supremum\" and self.threshold is not None:\n            #  Get embedding\n            embedding = self.embedding\n            #  Get time series dimension\n            dim = embedding.shape[1]\n            #  Get threshold\n            eps = float(self.threshold)\n\n            if self.missing_values:\n                mv_indices = self.missing_value_indices\n                _diagline_dist_sequential_missingvalues(\n                    n_time, diagline, mv_indices, embedding, eps, dim)\n            else:\n                _diagline_dist_sequential(\n                    n_time, diagline, embedding, eps, dim)\n\n        else:\n            raise NotImplementedError(\n                \"Sequential RQA is currently only available for \"\n                \"fixed threshold and the supremum metric.\")\n\n        #  Function just runs over the upper triangular matrix\n        return 2 * diagline\n\n    @staticmethod\n    def rejection_sampling(dist, M):\n        \"\"\"\n        Rejection sampling of discrete frequency distribution.\n\n        Use simple rejection sampling algorithm for computing a resampled\n        version of a given frequency distribution with discrete support.\n\n        :type dist: 1D array (integer)\n        :arg dist: discrete frequency distribution\n        :arg int M: number of resamplings\n        :rtype: 1D array (integer)\n        :return: the resampled frequency distribution.\n        \"\"\"\n        #  Get number of support points\n        N = len(dist)\n\n        #  Prepare\n        resampled_dist = np.zeros(N, dtype=NODE)\n\n        #  Prescribed distribution\n        dist = to_cy(dist, DFIELD)\n        #  Normalize distribution\n        dist /= dist.sum()\n\n        _rejection_sampling(dist, resampled_dist, N, M)\n        return resampled_dist\n\n    def resample_diagline_dist(self, M):\n        \"\"\"\n        Return resampled frequency distribution of diagonal lines.\n\n        The resampled frequency distribution can be used for obtaining\n        confidence bounds on diagonal line based RQA measures. This is\n        described in detail in [Schinkel2009]_.\n\n        Concerning the choice of the number of resamplings, Schinkel et al.\n        write: \"The number of resamplings is not generally agreed upon but\n        common guidelines suggest values between 800 and 1500.\"\n\n        :arg int M: number of resamplings\n        :rtype: 1D array (integer)\n        :return: the resampled frequency distribution of diagonal lines.\n        \"\"\"\n        #  Get original distribution of diagonal lines\n        diagline = self.diagline_dist()\n\n        #  Get maximal diagonal line length\n        L_max = self.max_diaglength()\n\n        #  Get resampled distribution\n        if L_max == 0:\n            resampled_dist = diagline\n        else:\n            resampled_dist = np.zeros(len(diagline), dtype=NODE)\n            resampled_dist[:L_max] = RecurrencePlot.\\\n                rejection_sampling(diagline[:L_max], M)\n\n        return resampled_dist\n\n    def max_diaglength(self):\n        \"\"\"\n        Return diagonal line-based RQA measure :index:`maximum diagonal line\n        length <triple: maximum; diagonal; line length>` :math:`L_max`.\n\n        :math:`L_max` is defined as the maximal length of a diagonal line in\n        the recurrence matrix.\n\n        :return number: the maximal diagonal line length :math:`L_max`.\n        \"\"\"\n        return 1 + np.nonzero(self.diagline_dist())[0].max(initial=-1)\n\n    def determinism(self, l_min=2, resampled_dist=None):\n        \"\"\"\n        Return diagonal line-based RQA measure :index:`determinism <pair: RQA;\n        determinism>` :math:`DET`.\n\n        :math:`DET` is defined as the ratio of recurrence points that form\n        diagonal structures (of at least length :math:`l_min`) to all\n        recurrence points.\n\n        :arg number l_min: The minimum diagonal line length.\n        :type resampled_dist: 1D array (integer)\n        :arg resampled_dist: resampled frequency distribution of diagonal lines\n        :return number: the determinism :math:`DET`.\n        \"\"\"\n        #  Use resampled distribution of diagonal lines if provided\n        diagline = (self.diagline_dist() if resampled_dist is None\n                    else resampled_dist)\n        n_time = self.N\n\n        #  Number of recurrence points that form diagonal structures (of at\n        #  least length l_min)\n        partial_sum = np.arange(l_min, n_time+1) @ diagline[l_min-1:]\n\n        #  Number of all recurrence points that form diagonal lines (except\n        #  the main diagonal)\n        full_sum = np.arange(1, n_time+1) @ diagline\n\n        return partial_sum / float(full_sum + self._epsilon)\n\n    def average_diaglength(self, l_min=2, resampled_dist=None):\n        \"\"\"\n        Return diagonal line-based RQA measure :index:`average diagonal line\n        length <triple: average; diagonal; line length>` :math:`L`.\n\n        :math:`L` is defined as the average length of diagonal lines (of at\n        least length :math:`l_min`).\n\n        :arg number l_min: The minimum diagonal line length.\n        :type resampled_dist: 1D array (integer)\n        :arg resampled_dist: resampled frequency distribution of diagonal lines\n        :return number: the average diagonal line length :math:`L`.\n        \"\"\"\n        #  Use resampled distribution of diagonal lines if provided\n        diagline = (self.diagline_dist() if resampled_dist is None\n                    else resampled_dist)\n        n_time = self.N\n\n        #  Number of recurrence points that form diagonal structures (of at\n        #  least length l_min)\n        partial_sum = np.arange(l_min, n_time+1) @ diagline[l_min-1:]\n\n        #  Total number of diagonal lines of at least length l_min\n        number_diagline = diagline[l_min-1:].sum()\n\n        return partial_sum / float(number_diagline + self._epsilon)\n\n    def diag_entropy(self, l_min=2, resampled_dist=None):\n        \"\"\"\n        Return diagonal line-based RQA measure :index:`diagonal line entropy\n        <pair: diagonal; line entropy>` :math:`ENTR`.\n\n        :math:`ENTR` is defined as the entropy of the probability to find a\n        diagonal line of exactly length l in the RP - reflects the complexity\n        of the RP with respect to diagonal lines.\n\n        :arg number l_min: The minimal diagonal line length.\n        :type resampled_dist: 1D array (integer)\n        :arg resampled_dist: resampled frequency distribution of diagonal lines\n        :return number: the diagonal line-based entropy :math:`ENTR`.\n        \"\"\"\n        #  Use resampled distribution of diagonal lines if provided\n        diagline = (self.diagline_dist() if resampled_dist is None\n                    else resampled_dist)\n\n        #  Creates a reduced array of the values (not 0) of the diagonal line\n        #  length (langer than l_min)\n        diagline = diagline[l_min-1:]\n        diagline = np.extract(diagline != 0, diagline)\n\n        #  Normalized array of the number of all diagonal lines = probability\n        #  of diagonal line length\n        diagnorm = diagline / float(diagline.sum() + self._epsilon)\n\n        return -(diagnorm * np.log(diagnorm)).sum()\n\n    #\n    #  RQA measures based on black vertical lines\n    #\n\n    @Cached.method(attrs=(\n        \"metric\", \"threshold\", \"missing_values\", \"sparse_rqa\"))\n    def vertline_dist(self):\n        \"\"\"\n        Return the :index:`frequency distribution of vertical line lengths\n        <triple: frequency distribution; vertical; line length>`\n        :math:`P(v-1)`.\n\n        Note that entry :math:`P(v-1)` contains the number of\n        :index:`vertical lines <pair: vertical; lines>` of length :math:`v`.\n        Thus, :math:`P(0)` counts lines of length :math:`1`,\n        :math:`P(1)` counts lines of length :math:`2`, asf.\n\n        :rtype: 1D array (int32)\n        :return: the frequency distribution of vertical line lengths\n            :math:`P(v-1)`.\n        \"\"\"\n        #  Prepare\n        n_time = self.N\n        vertline = np.zeros(n_time, dtype=NODE)\n\n        if not self.sparse_rqa:\n            #  Get recurrence matrix\n            recmat = self.recurrence_matrix()\n\n            if self.missing_values:\n                mv_indices = self.missing_value_indices\n                _vertline_dist_missingvalues(\n                    n_time, vertline, recmat, mv_indices)\n            else:\n                _vertline_dist(n_time, vertline, recmat)\n\n        #  Calculations for sequential RQA\n        elif self.metric == \"supremum\" and self.threshold is not None:\n            #  Get embedding\n            embedding = self.embedding\n            #  Get time series dimension\n            dim = embedding.shape[1]\n            #  Get threshold\n            eps = float(self.threshold)\n\n            if self.missing_values:\n                mv_indices = self.missing_value_indices\n                _vertline_dist_sequential_missingvalues(\n                    n_time, vertline, mv_indices, embedding, eps, dim)\n\n            else:\n                _vertline_dist_sequential(\n                    n_time, vertline, embedding, eps, dim)\n\n        else:\n            raise NotImplementedError(\n                \"Sequential RQA is currently only available for \"\n                \"fixed threshold and the supremum metric.\")\n\n        #  Function covers the whole recurrence matrix\n        return vertline\n\n    def resample_vertline_dist(self, M):\n        \"\"\"\n        Return resampled frequency distribution of vertical lines.\n\n        The resampled frequency distribution can be used for obtaining\n        confidence bounds on vertical line based RQA measures. This is\n        described in detail in [Schinkel2009]_.\n\n        Concerning the choice of the number of resamplings, Schinkel et al.\n        write: \"The number of resamplings is not generally agreed upon but\n        common guidelines suggest values between 800 and 1500.\"\n\n        :arg int M: number of resamplings\n        :rtype: 1D array (integer)\n        :return: the resampled frequency distribution of vertical lines.\n        \"\"\"\n        #  Get original distribution of vertical lines\n        vertline = self.vertline_dist()\n\n        #  Get maximal vertical line length\n        L_max = self.max_vertlength()\n\n        #  Get resampled distribution\n        if L_max == 0:\n            resampled_dist = vertline\n        else:\n            resampled_dist = np.zeros(len(vertline), dtype=NODE)\n            resampled_dist[:L_max] = RecurrencePlot.\\\n                rejection_sampling(vertline[:L_max], M)\n\n        return resampled_dist\n\n    def max_vertlength(self):\n        \"\"\"\n        Return vertical line-based RQA measure :index:`maximal vertical line\n        length <triple: maximum; vertical; line length>` :math:`V_max`.\n\n        :math:`V_max` is defined as the maximal length of a vertical line of\n        the recurrence matrix.\n\n        :return number: the maximal vertical line length :math:`V_max`.\n        \"\"\"\n        return 1 + np.nonzero(self.vertline_dist())[0].max(initial=-1)\n\n    def laminarity(self, v_min=2, resampled_dist=None):\n        \"\"\"\n        Return vertical line-based RQA measure :index:`laminarity` :math:`LAM`.\n\n        :math:`LAM` is defined as the ratio of recurrence points that form\n        vertical structures (of at least length :math:`v_min`) to all\n        recurrence points.\n\n        :arg number v_min: The minimal vertical line length.\n        :type resampled_dist: 1D array (integer)\n        :arg resampled_dist: resampled frequency distribution of vertical lines\n        :return number: the laminarity :math:`LAM`.\n        \"\"\"\n        #  Use resampled distribution of vertical lines if provided\n        vertline = (self.vertline_dist() if resampled_dist is None\n                    else resampled_dist)\n        n_time = self.N\n\n        #  Number of recurrence points that form vertical structures (of at\n        #  least length v_min)\n        partial_sum = np.arange(v_min, n_time+1) @ vertline[v_min-1:]\n\n        #  Number of all recurrence points that form vertical lines\n        full_sum = np.arange(1, n_time+1) @ vertline\n\n        return partial_sum / float(full_sum + self._epsilon)\n\n    def average_vertlength(self, v_min=2, resampled_dist=None):\n        \"\"\"\n        Return vertical line-based RQA measure :index:`average vertical line\n        length <triple: average; vertical; line length>` :math:`TT`.\n\n        :math:`TT` is defined as the average vertical line length (of at least\n        length :math:`v_min`) and is also called :index:`trapping time`\n        :math:`TT`.\n\n        :arg number v_min: The minimal vertical line length.\n        :type resampled_dist: 1D array (integer)\n        :arg resampled_dist: resampled frequency distribution of vertical lines\n        :return number: the trapping time :math:`TT`.\n        \"\"\"\n        #  Use resampled distribution of vertical lines if provided\n        vertline = (self.vertline_dist() if resampled_dist is None\n                    else resampled_dist)\n        n_time = self.N\n\n        #  Number of recurrence points that form vertical structures (of at\n        #  least length v_min)\n        partial_sum = np.arange(v_min, n_time+1) @ vertline[v_min-1:]\n\n        #  Total number of vertical lines of at least length v_min\n        number_vertline = vertline[v_min-1:].sum()\n\n        return partial_sum / (float(number_vertline) + self._epsilon)\n\n    def trapping_time(self, v_min=2, resampled_dist=None):\n        \"\"\"\n        Alias for :meth:`average_vertlength` (see description there).\n        \"\"\"\n        return self.average_vertlength(v_min, resampled_dist)\n\n    def vert_entropy(self, v_min=2, resampled_dist=None):\n        \"\"\"\n        Return vertical line-based RQA measure :index:`vertical line entropy\n        <pair: vertical; line entropy>`.\n\n        It is defined as the entropy of the probability to find a vertical line\n        of exactly length l in the RP - reflects the complexity of the RP with\n        respect to vertical lines.\n\n        :arg int v_min: The minimal vertical line length.\n        :type resampled_dist: 1D array (integer)\n        :arg resampled_dist: resampled frequency distribution of vertical lines\n        :return number: the vertical line-based entropy.\n        \"\"\"\n        #  Use resampled distribution of vertical lines if provided\n        if resampled_dist is None:\n            vertline = self.vertline_dist()\n        else:\n            vertline = resampled_dist\n\n        #  Creates a reduced array of the values (not 0) of the vertical line\n        #  length (langer than v_min)\n        vertline = vertline[v_min-1:]\n        vertline = np.extract(vertline != 0, vertline)\n\n        #  Normalized array of the number of all vertical lines = probability\n        #  of vertical line length\n        vertline_normed = vertline / float(vertline.sum() + self._epsilon)\n\n        return -(vertline_normed * np.log(vertline_normed)).sum()\n\n    #\n    #  RQA measures based on white vertical lines\n    #\n\n    def white_vertline_dist(self):\n        \"\"\"\n        Return the :index:`frequency distribution of white vertical line\n        lengths <triple: frequency distribution; white vertical; line length>`\n        :math:`P(w-1)`.\n\n        Note that entry :math:`P(w-1)` contains the number of\n        :index:`white vertical lines <pair: white vertical; lines>` of length\n        :math:`w`. Thus, :math:`P(0)` counts lines of length :math:`1`,\n        :math:`P(1)` counts lines of length :math:`2`, asf.\n\n        The length of a white vertical line in a recurrence plot corresponds to\n        the time the system takes to return close to an earlier state.\n\n        :rtype: 1D array (int32)\n        :return: the frequency distribution of white vertical line lengths\n            :math:`P(w-1)`.\n        \"\"\"\n        R = self.recurrence_matrix()\n        n_time = self.N\n        white_vertline = np.zeros(n_time, dtype=NODE)\n        _white_vertline_dist(n_time, white_vertline, R)\n\n        #  Function covers the whole recurrence matrix\n        return white_vertline\n\n    def max_white_vertlength(self):\n        \"\"\"\n        Return white vertical line-based RQA measure :index:`maximal white\n        vertical line length <triple: maximum; white vertical; line length>`.\n\n        It is defined as the maximal length of a white vertical line of\n        the recurrence matrix and corresponds to the maximum recurrence time\n        occuring in the time series.\n\n        :return number: the maximal white vertical line length.\n        \"\"\"\n        return 1 + np.nonzero(self.white_vertline_dist())[0].max(initial=-1)\n\n    def average_white_vertlength(self, w_min=1):\n        \"\"\"\n        Return white vertical line-based RQA measure :index:`average white\n        vertical line length <triple: average; white vertical; line length>`.\n\n        It is defined as the average white vertical line length (of at least\n        length :math:`w_min`) and is also called :index:`mean recurrence time`.\n\n        Reference: [Ngamga2007]_.\n\n        :arg number w_min: The minimal white vertical line length.\n        :return number: the mean recurrence time.\n        \"\"\"\n        white_vertline = self.white_vertline_dist()\n        n_time = self.N\n\n        #  Number of recurrence points that form white vertical structures\n        #  (of at least length w_min)\n        partial_sum = np.arange(w_min, n_time+1) @ white_vertline[w_min-1:]\n\n        #  Total number of white vertical lines of at least length v_min\n        number_white_vertline = white_vertline[w_min-1:].sum()\n\n        return partial_sum / float(number_white_vertline + self._epsilon)\n\n    def mean_recurrence_time(self, w_min=1):\n        \"\"\"\n        Alias for :meth:`average_white_vertlength` (see description there).\n        \"\"\"\n        return self.average_white_vertlength(w_min)\n\n    def white_vert_entropy(self, w_min=1):\n        \"\"\"\n        Return white vertical line-based RQA measure :index:`white vertical\n        line entropy <pair: white vertical; line entropy>`.\n\n        It is defined as the entropy of the probability to find a white\n        vertical line of exactly length l in the RP - reflects the complexity\n        of the RP with respect to white vertical lines (recurrence times).\n\n        :arg int w_min: Minimal white vertical line length (recurrence time).\n        :return number: the white vertical line-based entropy.\n        \"\"\"\n        #  Creates a reduced array of the values (not 0) of the vertical line\n        #  length (langer than v_min)\n        white_vertline = self.white_vertline_dist()\n        white_vertline = white_vertline[w_min-1:]\n        white_vertline = np.extract(white_vertline != 0, white_vertline)\n\n        #  Normalized array of the number of all vertical lines = probability\n        #  of vertical line length\n        white_vertline_normed = white_vertline / float(\n            white_vertline.sum() + self._epsilon)\n\n        return -(white_vertline_normed * np.log(white_vertline_normed)).sum()\n\n    #\n    #  Methods for recurrence-based surrogates\n    #\n\n    def twins(self, min_dist=7):\n        \"\"\"\n        Return list of the :index:`twins <pair: twins; recurrence plot>` of\n        each state vector based on the recurrence matrix.\n\n        Two state vectors are said to be twins if they share the same\n        recurrences, i.e., if the corresponding rows or columns in the\n        recurrence plot are identical.\n\n        References: [Thiel2006]_, [Marwan2007]_.\n\n        :arg number min_dist: The minimum temporal distance for twins.\n        :return [[number]]: the list of twins for each state vector in the time\n            series.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Finding twins based on recurrence matrix...\")\n\n        #  Initialize\n        twins = []\n        N = self.N\n\n        #  Get current recurrence matrix\n        R = self.recurrence_matrix()\n        #  Get number of neighbors for each state vector\n        nR = R.sum(axis=0)\n\n        _twins_r(min_dist, N, R, nR, twins)\n        return twins\n\n    def twin_surrogates(self, n_surrogates=1, min_dist=7):\n        \"\"\"\n        Generate surrogates based on the current (embedded) time series\n        :attr:`embedding` using the :index:`twin surrogate` method.\n\n        The twins surrogates have the same dimensionality as the (embedded)\n        trajectory used for constructing the recurrence plot. If scalar\n        surrogate time series are desired, any component of the twin surrogate\n        trajectory may be isolated.\n\n        Twin surrogates share linear and nonlinear properties with the original\n        time series, since they correspond to realizations of trajectories of\n        the same dynamical systems with different initial conditions.\n\n        References: [Thiel2006]_ [*], [Marwan2007]_.\n\n        :arg number min_dist: The minimum temporal distance for twins.\n        :arg int n_surrogates: The number of twin surrogate trajectories to be\n            returned.\n        :rtype: 3D array (surrogate number, time, dimension)\n        :return: the twin surrogate trajectories.\n        \"\"\"\n        #  The algorithm proceeds in two steps:\n        #  1. Use the algorithm proposed in [*] to find twins\n        #  2. Reconstruct one-dimensional twin surrogate time series\n        if self.silence_level <= 1:\n            print(\"Generating twin surrogates...\")\n\n        #  Collect\n        N = self.N\n        embedding = self.embedding\n        dim = embedding.shape[1]\n        twins = self.twins(min_dist)\n\n        return _twin_surrogates_r(n_surrogates, N, dim, twins, embedding)\n"
  },
  {
    "path": "src/pyunicorn/timeseries/surrogates.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for analyzing spatially embedded complex networks, handling\nmultivariate data and generating time series surrogates.\n\"\"\"\n\nfrom typing import Tuple\nfrom collections.abc import Hashable\n\n# array object and fast numerics\nimport numpy as np\nfrom numpy import random\n\n# easy progress bar handling\nfrom tqdm import trange\n\nfrom ..core.cache import Cached\n\nfrom ..core._ext.types import to_cy, ADJ, DEGREE, DFIELD\nfrom ._ext.numerics import _embed_time_series_array, _recurrence_plot, \\\n    _twins_s, _twin_surrogates_s, _test_pearson_correlation, \\\n    _test_mutual_information\n\n#\n#  Define class Surrogates\n#\n\n\nclass Surrogates(Cached):\n\n    \"\"\"\n    Encapsulates structures and methods related to surrogate time series.\n\n    Provides data structures and methods to generate surrogate data sets from a\n    set of time series and to evaluate the significance of various correlation\n    measures using these surrogates.\n\n    More information on time series surrogates can be found in [Schreiber2000]_\n    and [Kantz2006]_.\n    \"\"\"\n\n    #\n    #  Define internal methods\n    #\n    def __init__(self, original_data, silence_level=1):\n        \"\"\"\n        Initialize an instance of Surrogates.\n\n        .. note::\n           The order of array dimensions is different from the standard of\n           ``core``. Here it is [index, time] for reasons of computational\n           speed!\n\n        :type original_data: 2D array [index, time]\n        :arg original_data: The original time series for surrogate generation.\n        :arg int silence_level: The inverse level of verbosity of the object.\n        \"\"\"\n        if silence_level <= 1:\n            print(\"Generated an instance of the Surrogates class.\")\n\n        #  Set class variables\n        self.original_data = original_data\n        \"\"\"The original time series for surrogate generation.\"\"\"\n        self.silence_level = silence_level\n        \"\"\"(string) - The inverse level of verbosity of the object.\"\"\"\n\n        (self.N, self.n_time) = self.original_data.shape\n\n        self._mut_embedding: int = 0\n        self._embedding = None\n        \"\"\"The embedded times series\"\"\"\n\n        #  Set flags\n        self._normalized = False\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation.\n        \"\"\"\n        return f\"Surrogates: time series shape {self.original_data.shape}.\"\n\n    def __cache_state__(self) -> Tuple[Hashable, ...]:\n        return (self._mut_embedding,)\n\n    @property\n    def embedding(self) -> np.ndarray:\n        \"\"\"\n        The embedded time series / phase space trajectory\n        (time, embedding dimension).\n        \"\"\"\n        return self._embedding\n\n    @embedding.setter\n    def embedding(self, embedding: np.ndarray):\n        self._embedding = to_cy(embedding, DFIELD)\n        self._mut_embedding += 1\n\n    #\n    #  Methods for testing purposes\n    #\n\n    @staticmethod\n    def SmallTestData():\n        \"\"\"\n        Return Surrogates instance representing test a data set of 6 time\n        series.\n\n        :rtype: Surrogates instance\n        :return: a Surrogates instance for testing purposes.\n        \"\"\"\n        #  Create time series\n        ts = np.zeros((6, 200))\n\n        for i in range(6):\n            ts[i, :] = np.sin(np.arange(200)*np.pi/15. + i*np.pi/2.) + \\\n                np.sin(np.arange(200) * np.pi / 30.)\n\n        return Surrogates(original_data=ts, silence_level=2)\n\n    #\n    #  Define methods to normalize and analyze the data\n    #\n\n    @staticmethod\n    def embed_time_series_array(time_series_array, dimension, delay,\n                                silence_level=1):\n        \"\"\"\n        Return a :index:`delay embedding` of all time series.\n\n        **Example:**\n\n        >>> ts = Surrogates.SmallTestData().original_data\n        >>> Surrogates.embed_time_series_array(\n        ...     time_series_array=ts, dimension=3, delay=2)[0,:6,:]\n        array([[ 0.        ,  0.61464833,  1.14988147],\n               [ 0.31244015,  0.89680225,  1.3660254 ],\n               [ 0.61464833,  1.14988147,  1.53884177],\n               [ 0.89680225,  1.3660254 ,  1.6636525 ],\n               [ 1.14988147,  1.53884177,  1.73766672],\n               [ 1.3660254 ,  1.6636525 ,  1.76007351]])\n\n        :type time_series_array: 2D array [index, time]\n        :arg time_series_array: The time series array to be normalized.\n        :arg int dimension: The embedding dimension.\n        :arg int delay: The embedding delay.\n        :rtype: 3D array [index, time, dimension]\n        :return: the embedded time series.\n        \"\"\"\n        if silence_level <= 1:\n            print(f\"Embedding all time series in dimension {dimension} \"\n                  f\"and with lag {delay} ...\")\n        (N, n_time) = time_series_array.shape\n\n        embedding = np.empty(\n            (N, n_time - (dimension - 1)*delay, dimension), dtype=DFIELD)\n\n        _embed_time_series_array(\n            N, n_time, dimension, delay,\n            to_cy(time_series_array, DFIELD), embedding)\n        return embedding\n\n    def normalize_original_data(self):\n        \"\"\"\n        :index:`Normalize <pair: normalize; time series array>` the original\n        data to zero mean and unit variance individually for each\n        individual time series.\n\n        **Examples:**\n\n        >>> ts = Surrogates.SmallTestData()\n        >>> ts.normalize_original_data()\n        >>> r(ts.original_data.mean(axis=1))\n        array([ 0., 0., 0., 0., 0., 0.])\n        >>> r(ts.original_data.std(axis=1))\n        array([ 1., 1., 1., 1., 1., 1.])\n        \"\"\"\n        mean = self.original_data.mean(axis=1)\n        std = self.original_data.std(axis=1)\n\n        for i in range(self.N):\n            #  Remove mean value from time series at each node (grid point)\n            self.original_data[i, :] -= mean[i]\n            #  Normalize the standard deviation of anomalies to one\n            if std[i] != 0:\n                self.original_data[i, :] /= std[i]\n\n        self._normalized = True\n\n    @staticmethod\n    def recurrence_plot(embedding, threshold, silence_level=1):\n        \"\"\"\n        Return the :index:`recurrence plot <pair: recurrence plot; time\n        series>` from an embedding of a time series.\n\n        Uses supremum norm.\n\n        **Example:**\n\n        >>> ts = Surrogates.SmallTestData().original_data\n        >>> embedding = Surrogates. \\\n        ...     embed_time_series_array(ts, dimension=3, delay=2)\n        >>> Surrogates.recurrence_plot(embedding[0], threshold=.8)[:5, :5]\n        array([[1, 1, 0, 0, 0],\n               [1, 1, 1, 0, 0],\n               [0, 1, 1, 1, 0],\n               [0, 0, 1, 1, 1],\n               [0, 0, 0, 1, 1]], dtype=int8)\n\n        :type embedding: 2D array [time, dimension]\n        :arg embedding: The embedded time series.\n        :arg float threshold: The recurrence threshold.\n        :rtype: 2D array [time, time]\n        :return: the recurrence matrix.\n        \"\"\"\n        if silence_level <= 1:\n            print(\"Calculating the recurrence plot...\")\n\n        n_time = embedding.shape[0]\n        dimension = embedding.shape[1]\n        R = np.ones((n_time, n_time), dtype=ADJ)\n\n        _recurrence_plot(n_time, dimension, threshold,\n                         to_cy(embedding, DFIELD), R)\n        return R\n\n    @Cached.method(name=\"twins\", attrs=(\"_mut_embedding\", \"_normalized\"))\n    def twins(self, threshold, min_dist=7):\n        \"\"\"\n        Return list of the :index:`twins <pair: twins; surrogates>` of each\n        state vector for all time series.\n\n        Two state vectors are said to be twins if they share the same\n        recurrences, i.e., if the corresponding rows or columns in the\n        recurrence plot are identical.\n\n        References: [Thiel2006]_, [Marwan2007]_.\n\n        :type embedding_array: 3D array [index, time, dimension]\n        :arg  embedding_array: The embedded time series array.\n        :arg float threshold: The recurrence threshold.\n        :arg number min_dist: The minimum temporal distance for twins.\n        :rtype: [[number]]\n        :return: the list of twins for each state vector in the time series.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Finding twins...\")\n\n        N = self.embedding.shape[0]\n        n_time = self.embedding.shape[1]\n        dimension = self.embedding.shape[2]\n        twins = []\n\n        #  Initialize the R matrix with ones\n        R = np.empty((n_time, n_time), dtype=ADJ)\n        #  Initialize array to store the number of neighbors for each sample\n        nR = np.empty(n_time, dtype=DEGREE)\n\n        _twins_s(N, n_time, dimension, threshold, min_dist,\n                 to_cy(self.embedding, DFIELD), R, nR, twins)\n\n        return twins\n\n    #\n    #  Define methods to generate sets of surrogate time series\n    #\n\n    @Cached.method(name=\"original data fft\", attrs=(\"_normalized\",))\n    def original_data_fft(self):\n        \"\"\"\n        Return one-dimensional discrete Fourier Transform via numpy.fft.rfft()\n\n        :rtype: 2D array [index, frequency]\n        :return: The original time series' FFT.\n        \"\"\"\n        return np.fft.rfft(self.original_data, axis=1)\n\n    def white_noise_surrogates(self):\n        \"\"\"\n        Return a shuffled copy of a time series array.\n\n        Each time series is shuffled individually. The surrogates correspond to\n        realizations of white noise consistent with the :attr:`original_data`\n        time series' amplitude distribution.\n\n        **Example** (Distributions of white noise surrogates should the same as\n        for the original data):\n\n        >>> ts = Surrogates.SmallTestData().original_data\n        >>> surrogates = Surrogates.\\\n        ...     SmallTestData().white_noise_surrogates()\n        >>> np.allclose(np.histogram(ts[0,:])[0],\n        ...             np.histogram(surrogates[0,:])[0])\n        True\n\n        :rtype: 2D array [index, time]\n        :return: The surrogate time series.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Generating white noise surrogates by random shuffling...\")\n\n        #  Generate reference to shuffle function\n        shuffle = random.shuffle\n\n        surrogates = self.original_data.copy()\n\n        for i in range(surrogates.shape[0]):\n            shuffle(surrogates[i, :])\n\n        return surrogates\n\n    def correlated_noise_surrogates(self):\n        \"\"\"\n        Return Fourier surrogates.\n\n        Generate surrogates by Fourier transforming the :attr:`original_data`\n        time series (assumed to be real valued), randomizing the phases and\n        then applying an inverse Fourier transform. Correlated noise surrogates\n        share their power spectrum and autocorrelation function with the\n        original_data time series.\n\n        .. note::\n           The amplitudes are not adjusted here, i.e., the\n           individual amplitude distributions are not conserved!\n\n        **Examples:**\n\n        The power spectrum is conserved up to small numerical deviations:\n\n        >>> ts = Surrogates.SmallTestData()\n        >>> surrogates = ts.correlated_noise_surrogates()\n        >>> all(np.abs(np.fft.fft(\n        ...         ts.original_data, axis=1))[0,1:10]).round(4) ==\n        ...     np.abs(np.fft.fft(\n        ...         surrogates,       axis=1))[0,1:10]).round(4))\n        True\n\n        However, the time series amplitude distributions differ:\n\n        >>> all(np.histogram(ts[0,:])[0] == np.histogram(surrogates[0,:])[0])\n        False\n\n        :type original_data: 2D array [index, time]\n        :arg original_data: The original time series.\n        :rtype: 2D array [index, time]\n        :return: The surrogate time series.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Generating correlated noise surrogates...\")\n\n        #  Calculate FFT of original_data time series\n        surrogates = self.original_data_fft()\n\n        #  Get shapes\n        len_phase = surrogates.shape[1]\n\n        #  Generate random phases uniformly distributed in the\n        #  interval [0, 2*Pi]\n        phases = random.uniform(\n            low=0, high=2 * np.pi, size=(self.N, len_phase))\n\n        #  Add random phases uniformly distributed in the interval [0, 2*Pi]\n        surrogates *= np.exp(1j * phases)\n\n        #  Calculate IFFT and take the real part, the remaining imaginary part\n        #  is due to numerical errors.\n        return np.ascontiguousarray(\n            np.real(np.fft.irfft(surrogates, n=self.n_time, axis=1)))\n\n    def AAFT_surrogates(self):\n        \"\"\"\n        Return surrogates using the amplitude adjusted Fourier transform\n        method.\n\n        Reference: [Schreiber2000]_\n\n        :rtype: 2D array [index, time]\n        :return: The surrogate time series.\n        \"\"\"\n        #  Create sorted Gaussian reference series\n        gaussian = random.randn(self.N, self.n_time)\n        gaussian.sort(axis=1)\n\n        #  Rescale data to Gaussian distribution\n        ranks = self.original_data.argsort(axis=1).argsort(axis=1)\n        rescaled_data = np.zeros((self.N, self.n_time))\n\n        for i in range(self.N):\n            rescaled_data[i, :] = gaussian[i, ranks[i, :]]\n\n        #  Phase randomize rescaled data\n        phase_randomized_data = Surrogates(\n            original_data=rescaled_data, silence_level=2\n            ).correlated_noise_surrogates()\n\n        #  Rescale back to amplitude distribution of original data\n        sorted_original = self.original_data.copy()\n        sorted_original.sort(axis=1)\n\n        ranks = phase_randomized_data.argsort(axis=1).argsort(axis=1)\n\n        for i in range(self.N):\n            rescaled_data[i, :] = sorted_original[i, ranks[i, :]]\n\n        return rescaled_data\n\n    def refined_AAFT_surrogates(self, n_iterations, output=\"true_amplitudes\"):\n        \"\"\"\n        Return surrogates using the iteratively refined amplitude adjusted\n        Fourier transform method.\n\n        A set of AAFT surrogates (:meth:`AAFT_surrogates`) is iteratively\n        refined to produce a closer match of both amplitude distribution and\n        power spectrum of surrogate and original data.\n\n        Reference: [Schreiber2000]_\n\n        :arg int n_iterations: Number of iterations / refinement steps\n        :arg str output: Type of surrogate to return. \"true_amplitudes\":\n            surrogates with correct amplitude distribution, \"true_spectrum\":\n            surrogates with correct power spectrum, \"both\": return both outputs\n            of the algorithm.\n        :rtype: 2D array [index, time]\n        :return: The surrogate time series.\n        \"\"\"\n        #  Get Fourier transform of original data\n        fourier_transform = self.original_data_fft()\n\n        #  Get Fourier amplitudes\n        original_fourier_amps = np.abs(fourier_transform)\n\n        #  Get sorted copy of original data\n        sorted_original = self.original_data.copy()\n        sorted_original.sort(axis=1)\n\n        #  Get starting point / initial conditions for R surrogates\n        # (see [Schreiber2000]_)\n        R = self.AAFT_surrogates()\n\n        #  Start iteration\n        for _ in range(n_iterations):\n            #  Get Fourier phases of R surrogate\n            r_fft = np.fft.rfft(R, axis=1)\n            r_phases = r_fft / np.abs(r_fft)\n\n            #  Transform back, replacing the actual amplitudes by the desired\n            #  ones, but keeping the phases exp(iψ(i)\n            s = np.fft.irfft(original_fourier_amps * r_phases,\n                             n=self.n_time, axis=1)\n\n            #  Rescale to desired amplitude distribution\n            ranks = s.argsort(axis=1).argsort(axis=1)\n\n            for j in range(self.N):\n                R[j, :] = sorted_original[j, ranks[j, :]]\n\n        if output == \"true_amplitudes\":\n            return R\n        elif output == \"true_spectrum\":\n            return s\n        elif output == \"both\":\n            return (R, s)\n        else:\n            return (R, s)\n\n    def twin_surrogates(self, dimension, delay, threshold, min_dist=7):\n        \"\"\"\n        Return surrogates using the twin surrogate method.\n\n        Scalar twin surrogates are created by isolating the first component\n        (dimension) of the twin surrogate trajectories.\n\n        Twin surrogates share linear and nonlinear properties with the original\n        time series, since they correspond to realizations of trajectories of\n        the same dynamical systems with different initial conditions.\n\n        References: [Thiel2006]_ [*], [Marwan2007]_.\n\n        :arg int dimension: The embedding dimension.\n        :arg int delay: The embedding delay.\n        :arg float threshold: The recurrence threshold.\n        :arg number min_dist: The minimum temporal distance for twins.\n        :rtype: 2D array [index, time]\n        :return: the twin surrogates.\n        \"\"\"\n        #  The algorithm proceeds in several steps:\n        #  1. Embed the original_data time series, using time delay embedding\n        #     for simplicity. Use the same dimension and time delay delay for\n        #     all time series for simplicity. Determine delay using time\n        #     delayed mutual information and d using false nearest neighbors\n        #     methods.\n        #  2. Use the algorithm proposed in [*] to find twins\n        #  3. Reconstruct one-dimensional twin surrogate time series\n\n        n_time = self.n_time - (dimension-1)*delay\n\n        self.embedding = \\\n            self.embed_time_series_array(self.original_data, dimension, delay)\n        twins = self.twins(threshold, min_dist)\n\n        return _twin_surrogates_s(self.N, n_time, twins,\n                                  to_cy(self.original_data, DFIELD))\n\n    #\n    #  Defines methods to generate correlation measure matrices based on\n    #  original_data and surrogate data for significance testing.\n    #\n\n    @staticmethod\n    def eval_fast_code(function, original_data, surrogates):\n        \"\"\"\n        Evaluate performance of fast and slow versions of algorithms.\n\n        Designed for evaluating fast and dirty C code against cleaner code\n        using Blitz arrays. Does some profiling and returns the total error\n        between the results.\n\n        :type function: Python function\n        :arg function: The function to be evaluated.\n        :type original_data: 2D array [index, time]\n        :arg original_data: The original time series.\n        :type surrogates: 2D array [index, time]\n        :arg surrogates: The surrogate time series.\n        :return float: The total squared difference between resulting matrices.\n        \"\"\"\n        #  Some profiling\n        # profile.run(\"fastResult = function(original_data, surrogates,\n        #             fast=True)\")\n        # profile.run(\"slowResult = function(original_data, surrogates,\n        #             fast=False)\")\n\n        fast_result = function(original_data, surrogates, fast=True)\n        slow_result = function(original_data, surrogates, fast=False)\n\n        #  Return error\n        return np.sqrt(((fast_result - slow_result)**2).sum())\n\n    @staticmethod\n    def test_pearson_correlation(original_data, surrogates):\n        \"\"\"\n        Return a test matrix of the Pearson correlation coefficient (zero lag).\n\n        The test matrix's entry :math:`(i,j)` contains the Pearson correlation\n        coefficient between original time series i and surrogate time series j\n        at lag zero. The resulting matrix is useful for significance tests\n        based on the Pearson correlation matrix of the original data.\n\n        .. note::\n           Assumes, that original_data and surrogates are already normalized.\n\n        :type original_data: 2D array [index, time]\n        :arg original_data: The original time series.\n        :type surrogates: 2D array [index, time]\n        :arg surrogates: The surrogate time series.\n        :rtype: 2D array [index, index]\n        :return: the Pearson correlation test matrix.\n        \"\"\"\n        (N, n_time) = original_data.shape\n        return _test_pearson_correlation(to_cy(original_data, DFIELD),\n                                         to_cy(surrogates, DFIELD),\n                                         N, n_time)\n\n    @staticmethod\n    def test_mutual_information(original_data, surrogates, n_bins=32):\n        \"\"\"\n        Return a test matrix of mutual information (zero lag).\n\n        The test matrix's entry :math:`(i,j)` contains the mutual information\n        between original time series i and surrogate time series j at zero lag.\n        The resulting matrix is useful for significance tests based on the\n        mutual information matrix of the original data.\n\n        .. note::\n           Assumes, that original_data and surrogates are already normalized.\n\n        :type original_data: 2D array [index, time]\n        :arg original_data: The original time series.\n        :type surrogates: 2D Numpy array [index, time]\n        :arg surrogates: The surrogate time series.\n        :arg int n_bins: Number of bins for estimating prob. distributions.\n        :rtype: 2D array [index, index]\n        :return: the mutual information test matrix.\n        \"\"\"\n        (N, n_time) = original_data.shape\n        #  Calculate symbolic time series and histograms\n        #  Calculate 2D histograms and mutual information\n        #  mi[i,j] gives the mutual information between the ith original_data\n        #  time series and the jth surrogate time series.\n        return _test_mutual_information(to_cy(original_data, DFIELD),\n                                        to_cy(surrogates, DFIELD),\n                                        N, n_time, n_bins)\n\n    #\n    #  Define methods to perform significance tests on correlation measures\n    #  based on surrogates.\n    #\n\n    def original_distribution(self, test_function, n_bins=100):\n        \"\"\"\n        Return a normalized histogram of a similarity measure matrix.\n\n        The absolute value of the similarity measure is used, since only the\n        degree of similarity was of interest originally.\n\n        :type test_function: Python function\n        :arg test_function: The function implementing the similarity measure.\n        :arg int n_bins: The number of bins for estimating prob. distributions.\n        :rtype: tuple of 1D arrays ([bins],[bins])\n        :return: the similarity measure histogram and lower bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Estimating probability density distribution of \"\n                  \"original_data ...\")\n\n        #  Normalize original_data time series to zero mean and unit variance\n        if not self._normalized:\n            self.normalize_original_data()\n\n        correlation_measure = np.abs(test_function(self.original_data,\n                                                   self.original_data))\n        (hist, lbb) = np.histogram(correlation_measure, n_bins, density=True)\n        #  Normalize\n        hist /= hist.sum()\n\n        lbb = lbb[:-1]\n\n        return (hist, lbb)\n\n    # pylint: disable=too-many-positional-arguments\n    def test_threshold_significance(self, surrogate_function, test_function,\n                                    realizations=1, n_bins=100,\n                                    interval=(-1, 1)):\n        \"\"\"\n        Return a test distribution for a similarity measure.\n\n        Perform a significance test on the values of a correlation measure\n        based on original_data time series and surrogate data. Returns a\n        density estimate (histogram) of the absolute value of the correlation\n        measure over all realizations.\n\n        The resulting distribution of the values of similarity measure from\n        original and surrogate time series is of use for testing the\n        statistical significance of a selected threshold value for climate\n        network generation.\n\n        :type surrogate_function: Python function\n        :arg surrogate_function: The function implementing the surrogates.\n        :type test_function: Python function\n        :arg test_function: The function implementing the similarity measure.\n        :arg int realizations: The number of surrogates to be created for each\n            time series.\n        :arg int n_bins: The number of bins for estimating probability\n            distribution of test similarity measure.\n        :type interval: (float, float)\n        :arg interval: The range over which to estimate similarity measure\n            distribution.\n        :rtype: tuple of 1D arrays ([bins],[bins])\n        :return: similarity measure test histogram and lower bin boundaries.\n        \"\"\"\n        if self.silence_level <= 1:\n            print(f\"Starting significance test based on {realizations} \"\n                  \"realizations of surrogates...\")\n\n        self.original_data_fft.cache_clear()\n        self.twins.cache_clear()\n\n        #  Normalize original_data time series to zero mean and unit variance\n        if not self._normalized:\n            self.normalize_original_data()\n\n        #  Initialize density estimate\n        density_estimate = np.zeros(n_bins)\n\n        for _ in trange(realizations, disable=self.silence_level > 2):\n            #  Get the surrogate\n            #  Mean and variance are conserved by all surrogates\n            surrogates = surrogate_function(self)\n\n            #  Get the correlation measure test matrix\n            correlation_measure_test = np.abs(test_function(self.original_data,\n                                                            surrogates))\n\n            #  Test if correlation measure values are outside range\n            if correlation_measure_test.min() < interval[0]:\n                print(\"Warning! Correlation measure value left of range.\")\n            if correlation_measure_test.max() > interval[1]:\n                print(\"Warning! Correlation measure value right of range.\")\n\n            #  Estimate density of current realization\n            (hist, lbb) = np.histogram(correlation_measure_test, n_bins,\n                                       interval, density=True)\n\n            #  Add to density estimate over all realizations\n            density_estimate += hist\n\n            #  Clean up (should be done automatically by Python,\n            #  but you never know...)\n            del surrogates, correlation_measure_test\n\n        #  Normalize density estimate\n        density_estimate /= density_estimate.sum()\n\n        lbb = lbb[:-1]\n\n        return (density_estimate, lbb)\n"
  },
  {
    "path": "src/pyunicorn/timeseries/visibility_graph.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nProvides classes for the analysis of dynamical systems and time series based\non recurrence plots, including measures of recurrence quantification\nanalysis (RQA) and recurrence network analysis.\n\"\"\"\n\n# array object and fast numerics\nimport numpy as np\n\nfrom ..core import InteractingNetworks\n\nfrom ..core._ext.types import to_cy, ADJ, MASK, FIELD\nfrom ._ext.numerics import _visibility_relations_missingvalues, \\\n    _visibility_relations_no_missingvalues, _visibility_relations_horizontal, \\\n    _retarded_local_clustering, _advanced_local_clustering\n\n#\n#  Class definitions\n#\n\n\nclass VisibilityGraph(InteractingNetworks):\n    \"\"\"\n    Class VisibilityGraph for generating and analyzing visibility graphs of\n    time series.\n\n    Visibility graphs were initially applied for time series analysis by\n    [Lacasa2008]_.\n    \"\"\"\n\n    #\n    #  Internal methods\n    #\n\n    # pylint: disable=too-many-positional-arguments\n    def __init__(self, time_series, timings=None, missing_values=False,\n                 horizontal=False, silence_level=0):\n        \"\"\"\n        Missing values are handled as infinite values, effectively separating\n        the visibility graph into different disconnected components.\n\n        .. note::\n           Missing values have to be marked by the Numpy NaN flag!\n\n        :type time_series: 1D array\n        :arg time_series: The (scalar) time series to be analyzed.\n        :arg str timings: Timings of the observations in :attr:`time_series`.\n        :arg bool missing_values: Toggle special treatment of missing values in\n            :attr:`time_series`.\n        :arg bool horizontal: Indicates whether a horizontal visibility\n            relation is used.\n        :arg number silence_level: Inverse level of verbosity of the object.\n        \"\"\"\n        #  Set silence_level\n        self.silence_level = silence_level\n        \"\"\"The inverse level of verbosity of the object.\"\"\"\n\n        #  Set missing_values flag\n        self.missing_values = missing_values\n        \"\"\"Controls special treatment of missing values in\n           :attr:`time_series`.\"\"\"\n\n        #  Store time series\n        self.time_series = to_cy(time_series, FIELD)\n        \"\"\"The time series from which the visibility graph is constructed.\"\"\"\n\n        if timings is not None:\n            timings = to_cy(timings, FIELD)\n        else:\n            timings = np.arange(len(time_series), dtype=FIELD)\n\n        #  Store timings\n        self.timings = timings\n        \"\"\"The timimgs of the time series data points.\"\"\"\n\n        #  Get missing value indices\n        if self.missing_values:\n            self.missing_value_indices = np.isnan(self.time_series)\n\n        #  Determine visibility relations\n        if not horizontal:\n            A = self.visibility_relations()\n        else:\n            A = self.visibility_relations_horizontal()\n\n        #  Initialize Network object\n        InteractingNetworks.__init__(self, A, directed=False,\n                                     silence_level=silence_level)\n\n    def __str__(self):\n        \"\"\"\n        Returns a string representation.\n        \"\"\"\n        return (\"VisibilityGraph: \"\n                f\"time series shape {self.time_series.shape}.\\n\"\n                f\"{InteractingNetworks.__str__(self)}\")\n\n    #\n    #  Visibility methods\n    #\n\n    def visibility_relations(self):\n        \"\"\"\n        Returns visibility between all nodes of self.timeseries\n        :rtype: 2D array of MASK\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating visibility relations...\")\n\n        #  Prepare\n        x = self.time_series\n        t = self.timings\n        N = len(self.time_series)\n        A = np.zeros((N, N), dtype=MASK)\n\n        if self.missing_values:\n            mv_indices = self.missing_value_indices\n            _visibility_relations_missingvalues(x, t, N, A, mv_indices)\n\n        else:\n            _visibility_relations_no_missingvalues(x, t, N, A)\n\n        return A\n\n    # FIXME: There is no option for missing values\n    def visibility_relations_horizontal(self):\n        \"\"\"\n        Returns horizontal visibility between all nodes of self.timeseries\n        :rtype: 2D array of MASK\n        \"\"\"\n        if self.silence_level <= 1:\n            print(\"Calculating horizontal visibility relations...\")\n\n        #  Prepare\n        x = self.time_series\n        N = len(self.time_series)\n        A = np.zeros((N, N), dtype=MASK)\n\n        _visibility_relations_horizontal(x, N, A)\n        return A\n\n    #\n    #  Specific measures for visibility graphs\n    #\n\n    def visibility(self, node1, node2):\n        \"\"\"\n        Returns the visibility between node 1 and 2 as boolean.\n        :arg int node1: node index of node 1\n        :arg int node2: node index of node 2\n        :rtype: bool\n        \"\"\"\n        return self.adjacency[node1, node2]\n\n    def visibility_single(self, node):\n        \"\"\"\n        Returns the visibility between all nodes of self.time_series and node\n        as array of booleans.\n        :arg int node: node index of the node\n        :rtype: 1D array of bool\n        \"\"\"\n        return self.adjacency[node, :]\n\n    def retarded_degree(self):\n        \"\"\"Return number of neighbors in the past of a node.\"\"\"\n        #  Prepare\n        retarded_degree = np.zeros(self.N)\n        A = self.adjacency\n\n        for i in range(self.N):\n            retarded_degree[i] = A[i, :i].sum()\n\n        return retarded_degree\n\n    def advanced_degree(self):\n        \"\"\"Return number of neighbors in the future of a node.\"\"\"\n        #  Prepare\n        advanced_degree = np.zeros(self.N)\n        A = self.adjacency\n\n        for i in range(self.N):\n            advanced_degree[i] = A[i, i:].sum()\n\n        return advanced_degree\n\n    def retarded_local_clustering(self):\n        \"\"\"\n        Return probability that two neighbors of a node in its past are\n        connected.\n        \"\"\"\n        #  Prepare\n        retarded_clustering = np.zeros(self.N)\n\n        #  Get full adjacency matrix\n        A = self.adjacency\n        #  Get number of nodes\n        N = self.N\n\n        #  Get left degree\n        retarded_degree = self.retarded_degree()\n        #  Prepare normalization factor\n        norm = retarded_degree * (retarded_degree - 1) / 2.\n\n        _retarded_local_clustering(N, to_cy(A, ADJ), norm, retarded_clustering)\n        return retarded_clustering\n\n    def advanced_local_clustering(self):\n        \"\"\"\n        Return probability that two neighbors of a node in its future are\n        connected.\n        \"\"\"\n        #  Prepare\n        advanced_clustering = np.zeros(self.N)\n\n        #  Get full adjacency matrix\n        A = self.adjacency\n        #  Get number of nodes\n        N = self.N\n\n        #  Get right degree\n        advanced_degree = self.advanced_degree()\n        #  Prepare normalization factor\n        norm = advanced_degree * (advanced_degree - 1) / 2.\n\n        _advanced_local_clustering(N, to_cy(A, ADJ), norm, advanced_clustering)\n        return advanced_clustering\n\n    def retarded_closeness(self):\n        \"\"\"Return average path length to nodes in the past of a node.\"\"\"\n        #  Prepare\n        retarded_closeness = np.zeros(self.N)\n        path_lengths = self.path_lengths()\n\n        for i in range(self.N):\n            retarded_closeness[i] = path_lengths[i, :i].mean() ** (-1)\n\n        return retarded_closeness\n\n    def advanced_closeness(self):\n        \"\"\"Return average path length to nodes in the future of a node.\"\"\"\n        #  Prepare\n        advanced_closeness = np.zeros(self.N)\n        path_lengths = self.path_lengths()\n\n        for i in range(self.N):\n            advanced_closeness[i] = path_lengths[i, i+1:].mean() ** (-1)\n\n        return advanced_closeness\n\n    def retarded_betweenness(self):\n        \"\"\"\n        Return betweenness of a node with respect to all pairs of nodes in its\n        past.\n        \"\"\"\n        #  Prepare\n        retarded_betweenness = np.zeros(self.N)\n\n        for i in range(self.N):\n            retarded_indices = np.arange(i)\n            retarded_betweenness[i] = self.nsi_betweenness(\n                sources=retarded_indices, targets=retarded_indices)[i]\n\n        return retarded_betweenness\n\n    def advanced_betweenness(self):\n        \"\"\"\n        Return betweenness of a node with respect to all pairs of nodes in its\n        future.\n        \"\"\"\n        #  Prepare\n        advanced_betweenness = np.zeros(self.N)\n\n        for i in range(self.N):\n            advanced_indices = np.arange(i+1, self.N)\n            advanced_betweenness[i] = self.nsi_betweenness(\n                sources=advanced_indices, targets=advanced_indices)[i]\n\n        return advanced_betweenness\n\n    def trans_betweenness(self):\n        \"\"\"\n        Return betweenness of a node with respect to all pairs of nodes\n        with one node the past and one node in the future, respectively.\n        \"\"\"\n        #  Prepare\n        trans_betweenness = np.zeros(self.N)\n\n        for i in range(self.N):\n            retarded_indices = np.arange(i)\n            advanced_indices = np.arange(i+1, self.N)\n            trans_betweenness[i] = self.nsi_betweenness(\n                sources=retarded_indices, targets=advanced_indices)[i]\n\n        return trans_betweenness\n\n    #\n    #  Measures corrected for boundary effects\n    #\n\n    def boundary_corrected_degree(self):\n        \"\"\"Return a weighted degree corrected for trivial boundary effects.\"\"\"\n        #  Prepare\n        N_past = np.arange(self.N)\n        N_future = N_past[::-1]\n\n        cdegree = (self.retarded_degree() * N_past\n                   + self.advanced_degree() * N_future) / float(self.N - 1)\n\n        return cdegree\n\n    def boundary_corrected_closeness(self):\n        \"\"\"\n        Return a weighted closeness corrected for trivial boundary effects.\n        \"\"\"\n        #  Prepare\n        N_past = np.arange(self.N)\n        N_future = N_past[::-1]\n\n        ccloseness = (self.N - 1) * (self.retarded_closeness() / N_past\n                                     + self.advanced_closeness() / N_future)\n\n        return ccloseness\n"
  },
  {
    "path": "src/pyunicorn/utils/__init__.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nutils\n=====\n\n\"\"\"\n\n__all__ = ['mpi']\n"
  },
  {
    "path": "src/pyunicorn/utils/mpi.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nModule for parallelization using mpi4py.\n\nAllows for easy parallelization in master/slaves mode with one master\nsubmitting function or method calls to slaves.\nUses mpi4py if available, otherwise processes calls sequentially in one\nprocess.\n\nExamples:\n=========\n\nSave the following lines in ``demo_mpi.py`` and run::\n\n    > mpirun -n 10 python demo_mpi.py\n\n1. Use master/slaves parallelization with the Network class:\n\n   .. literalinclude::\n        ../../../../docs/source/examples/modules/mpi/network_large.py\n\n2. Do a Monte Carlo simulation as master/slaves:\n\n   .. literalinclude::\n        ../../../../docs/source/examples/modules/mpi/network_mc.py\n\n3. Do a parameter scan without communication with a master, and just save\n   the results in files:\n\n   .. literalinclude::\n        ../../../../docs/source/examples/modules/mpi/network_scan_no_comm.py\n\n\"\"\"\n\n#\n#  Imports\n#\n\nimport sys\nimport time\nimport traceback\n\nimport numpy\n\n\n# try to get the communicator object to see whether mpi is available:\ntry:\n    from mpi4py import MPI\n    comm = MPI.COMM_WORLD\n    \"\"\"(mpi4py.MPI.Comm instance) MPI communicator.\"\"\"\n    available = True\n    \"\"\"(bool) indicates that slaves are available.\"\"\"\nexcept ImportError:\n    available = False\n\n\nclass MPIException(Exception):\n    def __init__(self, value):\n        Exception.__init__()\n        self.value = value\n\n    def __str__(self):\n        return repr(self.value)\n\n\n# initialize:\n\nif available:\n    size = comm.size\n    \"\"\"(int) number of MPI nodes (master and slaves).\"\"\"\n    rank = comm.rank\n    \"\"\"(int) rank of this MPI node (0 is the master).\"\"\"\n    am_master = (rank == 0)\n    \"\"\"(bool) indicates that this MPI node is the master.\"\"\"\n    if size < 2:\n        available = False\nelse:\n    size = 1\n    rank = 0\n    am_master = True\n\nam_slave = not am_master\n\"\"\"(bool) indicates that this MPI node is a slave.\"\"\"\nn_slaves = size - 1\n\"\"\"(int) no. of slaves available.\"\"\"\nstart_time = time.time()\n\"\"\"(float) starting time of this MPI node.\"\"\"\nstats = []\n\"\"\"\n(list of dictionaries)\nstats[id] contains processing statistics for the last call with this id. Keys:\n\n  - \"id\": id of the call\n  - \"rank\": MPI node who processed the call\n  - \"this_time\": wall time for processing the call\n  - \"time_over_est\": quotient of actual over estimated wall time\n  - \"n_processed\": no. of calls processed so far by that slave, including this\n  - \"total_time\": total wall time until this call was finished\n\"\"\"\n\n# initialization on master with slaves:\n\nif am_master:\n\n    total_time_est = numpy.zeros(size)\n    \"\"\"\n    (numpy array of ints)\n    total_time_est[i] is the current estimate of the total time\n    MPI slave i will work on already submitted calls.\n    On slave i, only total_time_est[i] is available.\n    \"\"\"\n    total_time_est[0] = numpy.inf\n    queue = []\n    \"\"\"(list) ids of submitted calls\"\"\"\n    assigned = {}\n    \"\"\"\n    (dictionary)\n    assigned[id] is the slave assigned to the call with that id.\n    \"\"\"\n    slave_queue = [[] for i in range(0, size)]\n    \"\"\"\n    (list of lists)\n    slave_queue[i] contains the ids of calls assigned to slave i.\n    \"\"\"\n    n_processed = numpy.zeros(size).astype(\"int\")\n    \"\"\"\n    (list of ints)\n    n_processed[rank] is the total number of calls processed by MPI node rank.\n    On slave i, only total_time[i] is available.\n    \"\"\"\n    total_time = numpy.zeros(size)\n    \"\"\"\n    (list of floats)\n    total_time[rank] is the total wall time until that node finished its last\n    call.  On slave i, only total_time[i] is available.\n    \"\"\"\n\n    if not available:\n        # dictionary for results:\n        results = {}\n        \"\"\"\n        (dictionary)\n        if mpi is not available, the result of submit_call(..., id=a) will be\n        cached in results[a] until get_result(a).\n        \"\"\"\n\n    def submit_call(name_to_call, args=(), kwargs={},\n                    module=\"__main__\", time_est=1, id=None, slave=None):\n        \"\"\"\n        Submit a call for parallel execution.\n\n        If called by the master and slaves are available, the call is submitted\n        to a slave for asynchronous execution.\n\n        If called by a slave or if no slaves are available, the call is instead\n        executed synchronously on this MPI node.\n\n        **Examples:**\n\n            1. Provide ids and time estimate explicitly:\n\n               .. code-block:: python\n\n                  for n in range(0,10):\n                      mpi.submit_call(\"doit\", (n,A[n]), id=n, time_est=n**2)\n\n                  for n in range(0,10):\n                      result[n] = mpi.get_result(n)\n\n            2. Use generated ids stored in a list:\n\n               .. code-block:: python\n\n                  for n in range(0,10):\n                      ids.append(mpi.submit_call(\"doit\", (n,A[n])))\n\n                  for n in range(0,10):\n                      results.append(mpi.get_result(ids.pop()))\n\n            3. Ignore ids altogether:\n\n               .. code-block:: python\n\n                  for n in range(0,10):\n                      mpi.submit_call(\"doit\", (n,A[n]))\n\n                  for n in range(0,10):\n                      results.append(mpi.get_next_result())\n\n            4. Call a module function and use keyword arguments:\n\n               .. code-block:: python\n\n                  mpi.submit_call(\"solve\", (), {\"a\":a, \"b\":b},\n                      module=\"numpy.linalg\")\n\n            5. Call a static class method from a package:\n\n               .. code-block:: python\n\n                  mpi.submit_call(\"Network._get_histogram\", (values, n_bins),\n                      module=\"pyunicorn\")\n\n              Note that it is module=\"pyunicorn\" and not\n              module=\"pyunicorn.network\" here.\n\n        :arg str name_to_call: name of callable object (usually a function or\n            static method of a class) as contained in the namespace specified\n            by module.\n        :arg tuple args: the positional arguments to provide to the callable\n            object.  Tuples of length 1 must be written (arg,).  Default: ()\n        :arg dict kwargs: the keyword arguments to provide to the callable\n            object.  Default: {}\n        :arg str module: optional name of the imported module or submodule in\n            whose namespace the callable object is contained. For objects\n            defined on the script level, this is \"__main__\", for objects\n            defined in an imported package, this is the package name. Must be a\n            key of the dictionary sys.modules (check there after import if in\n            doubt).  Default: \"__main__\"\n        :arg float time_est: estimated relative completion time for this call;\n            used to find a suitable slave. Default: 1\n        :type id: object or None\n        :arg  id: unique id for this call. Must be a possible dictionary key.\n            If None, a random id is assigned and returned. Can be re-used after\n            get_result() for this is. Default: None\n        :type slave: int > 0 and < mpi.size, or None\n        :arg  slave: optional no. of slave to assign the call to. If None, the\n            call is assigned to the slave with the smallest current total time\n            estimate. Default: None\n        :return object: id of call, to be used in get_result().\n        \"\"\"\n        if id is None:\n            id = numpy.random.uniform()\n        if id in assigned:\n            raise MPIException(\"id \", str(id), \" already in queue!\")\n        if slave is not None and am_slave:\n            raise MPIException(\n                \"only the master can use slave= in submit_call()\")\n        if slave is None or slave < 1 or slave >= size:\n            # find slave with least estimated total time:\n            slave = numpy.argmin(total_time_est)\n        if available:\n            # send name to call, args, time_est to slave:\n            if _verbose:\n                print(f\"MPI master : assigning call with id {id} to slave \"\n                      f\"{slave}: {name_to_call} {args} {kwargs} ...\")\n            comm.send((name_to_call, args, kwargs, module, time_est),\n                      dest=slave)\n        else:\n            # do it myself right now:\n            slave = 0\n            if _verbose:\n                print(f\"MPI master : calling {name_to_call} {args} {kwargs} \"\n                      \"...\")\n            try:\n                object_to_call = eval(name_to_call,\n                                      sys.modules[module].__dict__)\n            except NameError:\n                sys.stderr.write(str(sys.modules[module].__dict__.keys()))\n                raise\n            call_time = time.time()\n            results[id] = object_to_call(*args, **kwargs)\n            this_time = time.time() - call_time\n            n_processed[0] += 1\n            total_time[0] = time.time() - start_time\n            stats.append({\"id\": id, \"rank\": 0,\n                          \"this_time\": this_time,\n                          \"time_over_est\": this_time / time_est,\n                          \"n_processed\": n_processed[0],\n                          \"total_time\": total_time[0]})\n\n        total_time_est[slave] += time_est\n        queue.append(id)\n        slave_queue[slave].append(id)\n        assigned[id] = slave\n        return id\n\n    def get_result(id):\n        \"\"\"\n        Return result of earlier submitted call.\n\n        Can only be called by the master.\n\n        If the call is not yet finished, waits for it to finish.\n        Results should be collected in the same order as calls were submitted.\n        For each slave, the results of calls assigned to that slave must be\n        collected in the same order as those calls were submitted.\n        Can only be called once per call.\n\n        :type id: object\n        :arg  id: id of an earlier submitted call, as provided to or returned\n                  by submit_call().\n\n        :rtype:  object\n        :return: return value of call.\n        \"\"\"\n        source = assigned[id]\n        if available:\n            if slave_queue[source][0] != id:\n                raise MPIException(\"get_result(\" + str(id)\n                                   + \") called before get_result(\"\n                                   + str(slave_queue[source][0]) + \")!\")\n            if _verbose:\n                print(f\"MPI master : retrieving result for call with id {id} \"\n                      f\"from slave {source} ...\")\n            (result, this_stats) = comm.recv(source=source)\n            stats.append(this_stats)\n            n_processed[source] = this_stats[\"n_processed\"]\n            total_time[source] = this_stats[\"total_time\"]\n        else:\n            if _verbose:\n                print(f\"MPI master : returning result for call with id {id} \"\n                      \"...\")\n            result = results[id]\n            # TODO: rather return a copy and del the original?\n        queue.remove(id)\n        slave_queue[source].remove(id)\n        assigned.pop(id)\n        return result\n\n    def get_next_result():\n        \"\"\"\n        Return result of next earlier submitted call whose result has not yet\n        been got.\n\n        Can only be called by the master.\n\n        If the call is not yet finished, waits for it to finish.\n\n        :rtype:  object\n        :return: return value of call, or None of there are no more calls in\n                 the queue.\n        \"\"\"\n        if len(queue) > 0:\n            id = queue[0]\n            return get_result(id)\n        else:\n            return None\n\n    def info():\n        \"\"\"\n        Print processing statistics.\n\n        Can only be called by the master.\n        \"\"\"\n\n        call_times = numpy.array([s[\"this_time\"] for s in stats])\n        call_quotients = numpy.array([s[\"time_over_est\"] for s in stats])\n\n        if available:\n            slave_quotients = total_time/total_time_est\n            print(\"\\n\"\n                  \"MPI: processing statistics\\n\"\n                  \"     =====================\\n\"\n                  \"     results collected:         \"\n                  f\"{n_processed[1:].sum()}\\n\"\n                  \"     results not yet collected: \"\n                  f\"{len(queue)}\\n\"\n                  \"     total reported time:       \"\n                  f\"{call_times.sum()}\\n\"\n                  \"     mean time per call:        \"\n                  f\"{call_times.mean()}\\n\"\n                  \"     std.dev. of time per call: \"\n                  f\"{call_times.std()}\\n\"\n                  \"     coeff. of var. of actual over estd. time per call: \"\n                  f\"{call_quotients.std()/call_quotients.mean()}\\n\"\n                  \"     slaves:                      \"\n                  f\"{n_slaves}\\n\"\n                  \"     mean calls per slave:        \"\n                  f\"{n_processed[1:].mean()}\\n\"\n                  \"     std.dev. of calls per slave: \"\n                  f\"{n_processed[1:].std()}\\n\"\n                  \"     min calls per slave:         \"\n                  f\"{n_processed[1:].min()}\\n\"\n                  \"     max calls per slave:         \"\n                  f\"{n_processed[1:].max()}\\n\"\n                  \"     mean time per slave:        \"\n                  f\"{total_time.mean()}\\n\"\n                  \"     std.dev. of time per slave: \"\n                  f\"{total_time.std()}\\n\"\n                  \"     coeff. of var. of actual over estd. time per slave: \"\n                  f\"{slave_quotients.std()/slave_quotients.mean()}\\n\")\n        else:\n            print(\"\\n\"\n                  \"MPI: processing statistics\\n\"\n                  \"     =====================\\n\"\n                  \"     results collected:         \"\n                  f\"{n_processed[0]}\\n\"\n                  \"     results not yet collected: \"\n                  f\"{len(queue)}\\n\"\n                  \"     total reported time:       \"\n                  f\"{call_times.sum()}\\n\"\n                  \"     mean time per call:        \"\n                  f\"{call_times.mean()}\\n\"\n                  \"     std.dev. of time per call: \"\n                  f\"{call_times.std()}\\n\"\n                  \"     coeff. of var. of actual over estd. time per call: \"\n                  f\"{call_quotients.std()/call_quotients.mean()}\\n\")\n\n    def terminate():\n        \"\"\"\n        Tell all slaves to terminate.\n\n        Can only be called by the master.\n        \"\"\"\n        global available\n        if available:\n            # tell slaves to terminate:\n            for slave in range(1, size):\n                if _verbose:\n                    print(f\"MPI master : telling slave {slave} \"\n                          \"to terminate...\")\n                comm.send((\"terminate\", (), {}, \"\", 0), dest=slave)\n            available = False\n\n    def abort():\n        \"\"\"\n        Abort execution on all MPI nodes immediately.\n\n        Can be called by master and slaves.\n        \"\"\"\n        traceback.print_exc()\n        if _verbose:\n            print(\"MPI master : aborting...\")\n        comm.Abort()\n\nelse:  # am_slave and available:\n\n    total_time_est = numpy.zeros(size)*numpy.nan\n    total_time_est[rank] = 0\n    n_processed = numpy.zeros(size)*numpy.nan\n    n_processed[rank] = 0\n    total_time = numpy.zeros(size)*numpy.nan\n    total_time[rank] = 0\n\n    def serve():\n        \"\"\"\n        Serve submitted calls until told to finish.\n\n        Can only be called by slaves.\n\n        Call this function from inside your definition of slave() if slaves\n        need to perform initializations different from the master, like this:\n\n        >>> def slave():\n        >>>     do = whatever + initialization - is * necessary\n        >>>     mpi.serve()\n        >>>     do = whatever + cleanup - is * necessary\n\n        If you don't define slave(), serve() will be called automatically by\n        mpi.run().\n        \"\"\"\n        if _verbose:\n            print(\"MPI slave \", rank, \": waiting for calls.\")\n        # wait for orders:\n        while True:\n            # get next task from queue:\n            (name_to_call, args, kwargs, module, time_est) = \\\n                comm.recv(source=0)\n            # TODO: add some timeout and check whether master lives!\n            if name_to_call == \"terminate\":\n                if _verbose:\n                    print(\"MPI slave\", rank, \": terminating...\")\n                break\n            if _verbose:\n                print(f\"MPI slave {rank}: calling {name_to_call} {args} ...\")\n            try:\n                object_to_call = eval(name_to_call,\n                                      sys.modules[module].__dict__)\n            except NameError:\n                sys.stderr.write(str(sys.modules[module].__dict__.keys()))\n                raise\n            total_time_est[rank] += time_est\n            call_time = time.time()\n            result = object_to_call(*args, **kwargs)\n            this_time = time.time() - call_time\n            n_processed[rank] += 1\n            stats.append({\"id\": id, \"rank\": rank,\n                          \"this_time\": this_time,\n                          \"time_over_est\": this_time / time_est,\n                          \"n_processed\": n_processed[rank],\n                          \"total_time\": time.time() - start_time})\n            if _verbose:\n                print(\"MPI slave\", rank, \": sending result...\")\n            comm.send((result, stats[-1]), dest=0)\n\n    def abort():\n        traceback.print_exc()\n        if _verbose:\n            print(\"MPI slave\", rank, \": aborting...\")\n        comm.Abort()\n\n    # TODO: update total_time_est at return time\n\n_verbose = False\n\n\ndef run(verbose=False):\n    \"\"\"\n    Run in master/slaves mode until master() finishes.\n\n    Must be called on all MPI nodes after function master() was defined.\n\n    On the master, run() calls master() and returns when master() returns.\n\n    On each slave, run() calls slave() if that is defined, or calls serve()\n    otherwise, and returns when slave() returns, or when master() returns on\n    the master, or when master calls terminate().\n\n    :arg bool verbose: whether processing information should be printed.\n    \"\"\"\n\n    # transfer verbose into global environment:\n    global _verbose\n    _verbose = verbose\n    \"\"\"\n    (bool) indicated whether processing information should be printed.\n    \"\"\"\n\n    _globals = sys.modules['__main__'].__dict__\n\n    if available:  # run in mpi mode\n        if am_master:  # I'm master\n            if verbose:\n                print(\"MPI master : started, using\", size-1, \"slaves.\")\n            try:  # put everything in a try block to be able to terminate!\n                if \"master\" in _globals:\n                    _globals[\"master\"]()\n                else:\n                    print(\"MPI master : function master() not found!\")\n            except ValueError:\n                abort()\n            terminate()\n            if verbose:\n                print(\"MPI master : finished.\")\n        else:  # I'm slave\n            if \"slave\" in _globals:\n                _globals[\"slave\"]()\n            else:\n                serve()\n    else:  # run as single processor\n        if verbose:\n            print(\"MPI master : not available, running as a single process.\")\n        if \"master\" in _globals:\n            _globals[\"master\"]()\n        else:\n            print(\"MPI master : function master() not found!\")\n        if verbose:\n            print(\"MPI master : finished.\")\n"
  },
  {
    "path": "src/pyunicorn/version.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\nfrom importlib import metadata\n\n__version__ = metadata.version('pyunicorn')\n"
  },
  {
    "path": "tests/conftest.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\nfrom pathlib import Path\n\nimport requests\nimport pytest\n\n\n@pytest.fixture(scope=\"session\",\n                params=[\"supremum\", \"euclidean\", \"manhattan\"])\ndef metric(request) -> str:\n    '''\n    A fixture for creating parametrized fixtures of classes that have a\n    `metric` argument, as in `RecurrencePlot` and its child classes.\n    '''\n    return request.param\n\n\n@pytest.fixture(scope=\"session\")\ndef reanalysis_data() -> Path:\n    \"\"\"\n    Locate, and potentially download, a small NOAA dataset. Currently used in:\n    - `tests/test_climate/test_map_plot.py`\n    - `docs/source/examples/tutorials/ClimateNetworks.ipynb`\n    \"\"\"\n    data_name = \"air.mon.mean.nc\"\n    url = \"https://downloads.psl.noaa.gov/Datasets/\" \\\n        f\"ncep.reanalysis/Monthlies/surface/{data_name}\"\n\n    data_dir = Path(\"./docs/source/examples/tutorials/data\")\n    data_file = data_dir / data_name\n\n    if not data_dir.is_dir():\n        data_dir.mkdir(parents=True)\n    if not data_file.exists():\n        res = requests.get(url, timeout=(30, 30))\n        res.raise_for_status()\n        with open(data_file, 'wb') as f:\n            f.write(res.content)\n\n    return data_file\n"
  },
  {
    "path": "tests/test_climate/__init__.py",
    "content": ""
  },
  {
    "path": "tests/test_climate/test_climate_data.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nSimple tests for the ClimateData class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.core.data import Data\nfrom pyunicorn.climate.climate_data import ClimateData\n\n# -----------------------------------------------------------------------------\n# Class member tests\n# -----------------------------------------------------------------------------\n\n\ndef test_SmallTestData():\n    res = Data.SmallTestData().observable()\n    exp = np.array([[0., 1., 0., -1., -0., 1.],\n                    [0.309, 0.9511, -0.309, -0.9511, 0.309, 0.9511],\n                    [0.5878, 0.809, -0.5878, -0.809, 0.5878, 0.809],\n                    [0.809, 0.5878, -0.809, -0.5878, 0.809, 0.5878],\n                    [0.9511, 0.309, -0.9511, -0.309, 0.9511, 0.309],\n                    [1., 0., -1., -0., 1., 0.],\n                    [0.9511, -0.309, -0.9511, 0.309, 0.9511, -0.309],\n                    [0.809, -0.5878, -0.809, 0.5878, 0.809, -0.5878],\n                    [0.5878, -0.809, -0.5878, 0.809, 0.5878, -0.809],\n                    [0.309, -0.9511, -0.309, 0.9511, 0.309, -0.9511]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_phase_indices():\n    res = ClimateData.SmallTestData().phase_indices()\n    exp = np.array([[0, 5], [1, 6], [2, 7], [3, 8], [4, 9]])\n    assert (res == exp).all()\n\n\ndef test_indices_selected_phases():\n    res = ClimateData.SmallTestData().indices_selected_phases([0, 1, 4])\n    exp = np.array([0, 1, 4, 5, 6, 9])\n    assert (res == exp).all()\n\n\ndef test_phase_mean():\n    res = ClimateData.SmallTestData().phase_mean()\n    exp = np.array([[0.5, 0.5, -0.5, -0.5, 0.5, 0.5],\n                    [0.63, 0.321, -0.63, -0.321, 0.63, 0.321],\n                    [0.6984, 0.1106, -0.6984, -0.1106, 0.6984, 0.1106],\n                    [0.6984, -0.1106, -0.6984, 0.1106, 0.6984, -0.1106],\n                    [0.63, -0.321, -0.63, 0.321, 0.63, -0.321]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_anomaly():\n    res = ClimateData.SmallTestData().anomaly()[:, 0]\n    exp = np.array([-0.5, -0.321, -0.1106, 0.1106, 0.321,\n                    0.5, 0.321, 0.1106, -0.1106, -0.321])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_shuffled_anomaly():\n    res = ClimateData.SmallTestData().anomaly().std(axis=0)\n    exp = np.array([0.31, 0.6355, 0.31, 0.6355, 0.31, 0.6355])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = ClimateData.SmallTestData().shuffled_anomaly().std(axis=0)\n    exp = np.array([0.31, 0.6355, 0.31, 0.6355, 0.31, 0.6355])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_window():\n    data = ClimateData.SmallTestData()\n    data.set_window(window={\"time_min\": 0., \"time_max\": 0.,\n                            \"lat_min\": 10., \"lat_max\": 20.,\n                            \"lon_min\": 5., \"lon_max\": 10.})\n    res = data.anomaly()\n    exp = np.array([[0.5, -0.5], [0.321, -0.63], [0.1106, -0.6984],\n                    [-0.1106, -0.6984], [-0.321, -0.63], [-0.5, 0.5],\n                    [-0.321, 0.63], [-0.1106, 0.6984], [0.1106, 0.6984],\n                    [0.321, 0.63]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_set_global_window():\n    data = ClimateData.SmallTestData()\n    data.set_window(window={\"time_min\": 0., \"time_max\": 4.,\n                            \"lat_min\": 10., \"lat_max\": 20.,\n                            \"lon_min\": 5., \"lon_max\": 10.})\n    res = data.grid.grid()[\"lat\"]\n    exp = np.array([10., 15.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n    data.set_global_window()\n    res = data.grid.grid()[\"lat\"]\n    exp = np.array([0., 5., 10., 15., 20., 25.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_climate/test_climate_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nSimple tests for the ClimateNetwork class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.climate.climate_network import ClimateNetwork\n\n\ndef test_str(capsys):\n    print(ClimateNetwork.SmallTestNetwork())\n    out = capsys.readouterr()[0]\n    out_ref = \"ClimateNetwork:\\n\" + \\\n              \"GeoNetwork:\\n\" + \\\n              \"SpatialNetwork:\\n\" + \\\n              \"Network: undirected, 6 nodes, 7 links, link density 0.467.\" + \\\n              \"\\nGeographical boundaries:\\n\" + \\\n              \"         time     lat     lon\\n\" + \\\n              \"   min    0.0    0.00    2.50\\n\" + \\\n              \"   max    9.0   25.00   15.00\\n\" + \\\n              \"Threshold: 0.5\\n\" + \\\n              \"Local connections filtered out: False\\n\"\n    assert out == out_ref\n\n\ndef test_SmallTestNetwork():\n    res = ClimateNetwork.SmallTestNetwork().adjacency\n    exp = np.array([[0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 1, 0],\n                    [0, 1, 0, 0, 1, 0], [1, 1, 0, 0, 0, 0],\n                    [1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_link_density_function():\n    res = ClimateNetwork.SmallTestNetwork().link_density_function(5)\n    exp = (np.array([0., 0.2778, 0.4444, 0.6111, 0.7222]),\n           np.array([0.1, 0.28, 0.46, 0.64, 0.82, 1.]))\n\n    assert np.allclose(res[0], exp[0], atol=1e-04)\n    assert np.allclose(res[1], exp[1], atol=1e-04)\n\n\ndef test_threshold_from_link_density():\n    res = ClimateNetwork.SmallTestNetwork().\\\n        threshold_from_link_density(link_density=0.5)\n    exp = 0.4\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_similarity_measure():\n    res = ClimateNetwork.SmallTestNetwork().similarity_measure()[0, :]\n    exp = np.array([1., 0.1, 0.2, 0.6, 0.7, 0.55])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_non_local():\n    res = ClimateNetwork.SmallTestNetwork().non_local()\n    exp = False\n    assert res == exp\n\n\ndef test_set_non_local():\n    net = ClimateNetwork.SmallTestNetwork()\n    net.set_non_local(non_local=True)\n\n    res = net.adjacency\n    exp = np.array([[0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 1, 0],\n                    [0, 0, 0, 0, 1, 0], [1, 1, 0, 0, 0, 0],\n                    [1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_threshold():\n    res = ClimateNetwork.SmallTestNetwork().threshold()\n    exp = 0.5\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_set_threshold():\n    net = ClimateNetwork.SmallTestNetwork()\n\n    res = net.n_links\n    exp = 7\n    assert res == exp\n\n    net.set_threshold(threshold=0.7)\n    res = net.n_links\n    exp = 3\n    assert res == exp\n\n\ndef test_set_link_density():\n    net = ClimateNetwork.SmallTestNetwork()\n\n    res = net.link_density\n    exp = 0.4667\n    assert np.isclose(res, exp, atol=1e-04)\n\n    net.set_link_density(link_density=0.7)\n    res = net.link_density\n    exp = 0.6667\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_correlation_distance():\n    res = ClimateNetwork.SmallTestNetwork().correlation_distance().round(2)\n    exp = np.array([[0., 0.01, 0.04, 0.18, 0.27, 0.27],\n                    [0.01, 0., 0.05, 0.18, 0.29, 0.12],\n                    [0.04, 0.05, 0., 0.02, 0.16, 0.03],\n                    [0.18, 0.18, 0.01, 0., 0.01, 0.06],\n                    [0.27, 0.29, 0.16, 0.01, 0., 0.04],\n                    [0.27, 0.12, 0.03, 0.06, 0.04, 0.]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_correlation_distance_weighted_closeness():\n    res = ClimateNetwork.SmallTestNetwork().\\\n        correlation_distance_weighted_closeness()\n    exp = np.array([0.1646, 0.1351, 0.0894, 0.1096, 0.1659, 0.1102])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_local_correlation_distance_weighted_vulnerability():\n    res = ClimateNetwork.SmallTestNetwork().\\\n        local_correlation_distance_weighted_vulnerability()\n    exp = np.array([0.4037, 0.035, -0.1731, -0.081, 0.3121, -0.0533])\n    assert np.allclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_climate/test_coupled_climate_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nSimple tests for the CoupledClimateNetwork class.\n\"\"\"\n\nfrom pyunicorn.climate import ClimateData, CoupledTsonisClimateNetwork\n\n\ndef test_internal_link_density():\n    cd = ClimateData.SmallTestData()\n    tsonis_ccn = CoupledTsonisClimateNetwork(cd, cd, threshold=.2)\n    res = tsonis_ccn.internal_link_density()\n    assert isinstance(res, tuple) and all(isinstance(d, float) for d in res)\n    assert all(0 <= d <= 1 for d in res)\n"
  },
  {
    "path": "tests/test_climate/test_eventseries_climatenetwork.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nTests for the EventSeriesClimateNetwork class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.core.data import Data\nfrom pyunicorn.climate.eventseries_climatenetwork import\\\n EventSeriesClimateNetwork\n\n\ndef test_str(capsys):\n    data = EventSeriesClimateNetwork.SmallTestData()\n    print(EventSeriesClimateNetwork(data, method='ES',\n                                    threshold_method='quantile',\n                                    threshold_values=0.8, taumax=16,\n                                    threshold_types='above'))\n    out = capsys.readouterr()[0]\n    out_ref = \"Extracting network adjacency matrix by thresholding...\\n\" + \\\n              \"Setting area weights according to type surface ...\\n\" + \\\n              \"Setting area weights according to type surface ...\\n\" + \\\n              \"EventSeriesClimateNetwork:\\n\" + \\\n              \"EventSeries: 6 variables, 10 timesteps, taumax: 16.0, \" \\\n              \"lag: 0.0\" + \\\n              \"\\nClimateNetwork:\\n\" + \\\n              \"GeoNetwork:\\n\" + \\\n              \"SpatialNetwork:\\n\" + \\\n              \"Network: directed, 6 nodes, 0 links, link density 0.000.\\n\" + \\\n              \"Geographical boundaries:\\n\" + \\\n              \"         time     lat     lon\\n\" + \\\n              \"   min    0.0    0.00    2.50\\n\" + \\\n              \"   max    9.0   25.00   15.00\\n\" + \\\n              \"Threshold: 0\\n\" + \\\n              \"Local connections filtered out: False\\n\" + \\\n              \"Type of event series measure to construct \" + \\\n              \"the network: directedES\\n\"\n    assert out == out_ref\n\n\ndef test_SmallTestData():\n    res = Data.SmallTestData().observable()\n    exp = np.array([[0., 1., 0., -1., -0., 1.],\n                    [0.309, 0.9511, -0.309, -0.9511, 0.309, 0.9511],\n                    [0.5878, 0.809, -0.5878, -0.809, 0.5878, 0.809],\n                    [0.809, 0.5878, -0.809, -0.5878, 0.809, 0.5878],\n                    [0.9511, 0.309, -0.9511, -0.309, 0.9511, 0.309],\n                    [1., 0., -1., -0., 1., 0.],\n                    [0.9511, -0.309, -0.9511, 0.309, 0.9511, -0.309],\n                    [0.809, -0.5878, -0.809, 0.5878, 0.809, -0.5878],\n                    [0.5878, -0.809, -0.5878, 0.809, 0.5878, -0.809],\n                    [0.309, -0.9511, -0.309, 0.9511, 0.309, -0.9511]])\n    assert np.allclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_climate/test_map_plot.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\nfrom pathlib import Path\n\nimport matplotlib\nimport matplotlib.pyplot as plt\n\nfrom pyunicorn.climate.climate_data import ClimateData\nfrom pyunicorn.climate.tsonis import TsonisClimateNetwork\nfrom pyunicorn.climate.map_plot import MapPlot\n\nmatplotlib.use('Agg')\n\n\n# pylint: disable=too-few-public-methods\nclass TestMapPlot:\n    \"\"\"\n    Simple tests for the `MapPlot` class.\n    \"\"\"\n\n    @staticmethod\n    def test_plot(reanalysis_data: Path):\n        \"\"\"\n        Check error-free execution.\n        \"\"\"\n        # prepare ClimateNetwork fixture\n        # (select subset of data to speed up loading and calculation)\n        title = \"ncep_ncar_reanalysis\"\n        window = {\n            \"time_min\": 0., \"time_max\": 0.,\n            \"lat_min\": 30, \"lon_min\": 0,\n            \"lat_max\": 50, \"lon_max\": 30}\n        data = ClimateData.Load(\n            file_name=str(reanalysis_data), observable_name=\"air\",\n            file_type=\"NetCDF\", window=window, time_cycle=12)\n        net = TsonisClimateNetwork(data, threshold=.05, winter_only=False)\n\n        # create MapPlot\n        map_plot = MapPlot(data.grid, title)\n        assert map_plot.title == title\n\n        # plot\n        map_plot.plot(net.degree(), \"Degree\")\n        assert plt.gca().get_title() == title\n        plt.close()\n"
  },
  {
    "path": "tests/test_climate/test_tsonis.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nTests for the TsonisClimateNetwork class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.climate.climate_data import ClimateData\nfrom pyunicorn.climate.tsonis import TsonisClimateNetwork\n\n\ndef test_str(capsys):\n    print(TsonisClimateNetwork.SmallTestNetwork())\n    out = capsys.readouterr()[0]\n    out_ref = \"TsonisClimateNetwork:\\n\" + \\\n              \"ClimateNetwork:\\n\" + \\\n              \"GeoNetwork:\\n\" + \\\n              \"SpatialNetwork:\\n\" + \\\n              \"Network: undirected, 6 nodes, 6 links, link density 0.400.\" + \\\n              \"\\nGeographical boundaries:\\n\" + \\\n              \"         time     lat     lon\\n\" + \\\n              \"   min    0.0    0.00    2.50\\n\" + \\\n              \"   max    9.0   25.00   15.00\\n\" + \\\n              \"Threshold: 0.5\\n\" + \\\n              \"Local connections filtered out: False\\n\" + \\\n              \"Use only data points from winter months: False\\n\"\n    assert out == out_ref\n\n\ndef test_SmallTestNetwork():\n    res = TsonisClimateNetwork.SmallTestNetwork().adjacency\n    exp = np.array([[0, 0, 1, 0, 1, 0], [0, 0, 0, 1, 0, 1],\n                    [1, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 1],\n                    [1, 0, 1, 0, 0, 0], [0, 1, 0, 1, 0, 0]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_calculate_similarity_measure():\n    res = TsonisClimateNetwork.SmallTestNetwork().calculate_similarity_measure(\n        anomaly=ClimateData.SmallTestData().anomaly())\n    exp = np.array([[1., -0.2538, -1., 0.2538, 1., -0.2538],\n                    [-0.2538, 1., 0.2538, -1., -0.2538, 1.],\n                    [-1., 0.2538, 1., -0.2538, -1., 0.2538],\n                    [0.2538, -1., -0.2538, 1., 0.2538, -1.],\n                    [1., -0.2538, -1., 0.2538, 1., -0.2538],\n                    [-0.2538, 1., 0.2538, -1., -0.2538, 1.]],\n                   dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_correlation():\n    res = TsonisClimateNetwork.SmallTestNetwork().correlation()\n    exp = np.array([[1., 0.25377226, 1., 0.25377226, 1., 0.25377226],\n                    [0.25377226, 1., 0.25377226, 1., 0.25377226, 1.],\n                    [1., 0.25377226, 1., 0.25377226, 1., 0.25377226],\n                    [0.25377226, 1., 0.25377226, 1., 0.25377226, 1.],\n                    [1., 0.25377226, 1., 0.25377226, 1., 0.25377226],\n                    [0.25377226, 1., 0.25377226, 1., 0.25377226, 1.]],\n                   dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_winter_only():\n    res = TsonisClimateNetwork.SmallTestNetwork().winter_only()\n    exp = False\n    assert res == exp\n\n\ndef test_set_winter_only():\n    net = TsonisClimateNetwork.SmallTestNetwork()\n    net.set_winter_only(winter_only=False)\n\n    res = net.n_links\n    exp = 6\n    assert res == exp\n\n\ndef test_correlation_weighted_average_path_length():\n    res = TsonisClimateNetwork.SmallTestNetwork().\\\n            correlation_weighted_average_path_length()\n    exp = 1.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_correlation_weighted_closeness():\n    res = TsonisClimateNetwork.SmallTestNetwork().\\\n                correlation_weighted_closeness()\n    exp = np.array([0.25, 0.25, 0.25, 0.25, 0.25, 0.25])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_local_correlation_weighted_vulnerability():\n    res = TsonisClimateNetwork.SmallTestNetwork().\\\n                local_correlation_weighted_vulnerability()\n    exp = np.array([0., 0., 0., 0., 0., 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_core/ResistiveNetwork_utils.py",
    "content": "# Copyright (C) 2014 SWIPO Project\n#\n# Authors (this file):\n#   Stefan Schinkel <stefan.schinkel@gmail.com>\n\n\"\"\"\nUtils needed for Unit Tests in resistive networks\n\"\"\"\nimport numpy as np\n\n\ndef makeNW(idI, idJ, val=None):\n    \"\"\"Construct NW from edges\n    \"\"\"\n\n    # idI and IdJ must be lists!\n    idI = list(idI)\n    idJ = list(idJ)\n\n    # get N\n    N = max(list(idI)+list(idJ))\n\n    # empty matrix\n    nw = np.zeros((N+1, N+1))\n\n    # fill values or ones\n    if val is None:\n        val = [1] * len(idI)\n    elif len(val) == 1:\n        val = val*len(idI)\n\n    for i, j, v in zip(idI, idJ, val):\n        nw[i, j] = v\n        nw[j, i] = v\n\n    return nw\n\n\ndef parallelCopy(nw, a, b):\n    \"\"\" copy a graph of N nodes with a given adjacency\n    matrix and attach the copy linking node them at node\n    a and b (parallel circuit)\n    \"\"\"\n\n    if sum(np.diag(nw)) > 0:\n        print(\"Graph has selfloops\")\n        print(\"doesn't work yet\")\n        raise NotImplementedError\n\n        # at this point, have to copy the diagonal\n        # and fill that to the copy\n        # np.fill_diagonal(nw,0)\n\n    # get size of NW\n    N = len(nw)\n\n    # get the current adjacency and values\n    # of the upper triangle only (has to be symmetric)\n    i0, j0 = np.nonzero(np.triu(nw))\n    val = []\n    for ii, jj in zip(i0, j0):\n        val.append(nw[ii, jj])\n\n    # increment i indeces and remap\n    ti = i0+N\n    ti[ti == a+N] = a\n    ii = np.append(i0, ti)\n\n    # same for j\n    tj = j0+N\n    tj[tj == b+N] = b\n    jj = np.append(j0, tj)\n\n    # compute return value and adjust\n    # the values for direct links\n    nw2 = makeNW(ii, jj, val*2)\n    if nw[a, b] != 0:\n        nw2[a, b] = nw[a, b]/2\n        nw2[b, a] = nw[a, b]/2\n\n    return nw2\n\n\ndef serialCopy(nw):\n    \"\"\" Copy a graph and attach a copy to\n    the end (serial circuit)\n    \"\"\"\n\n    # get size of NW\n    N = len(nw)\n\n    # get the current adjacency and values\n    # of the upper triangle only (has to be symmetric)\n    i0, j0 = np.nonzero(np.triu(nw))\n    val = []\n    for ii, jj in zip(i0, j0):\n        val.append(nw[ii, jj])\n\n    # increment indeces by N and append\n    ti = i0+N-1\n    ii = np.append(i0, ti)\n\n    # same for j\n    tj = j0+N-1\n    jj = np.append(j0, tj)\n\n    return makeNW(ii, jj, val*2)\n\n\ndef nx2nw(G):\n    \"\"\"Convert networkx Graph to a plain matrix\n    (ndarray)\n    \"\"\"\n    i = []\n    j = []\n    for edge in G.edges():\n        i.append(edge[0])\n        j.append(edge[1])\n\n    return makeNW(i, j)\n"
  },
  {
    "path": "tests/test_core/TestResistiveNetwork-circuits.py",
    "content": "# Copyright (C) 2014 SWIPO Project\n#\n# Authors (this file):\n#   Stefan Schinkel <stefan.schinkel@gmail.com>\n\"\"\"\nProvides sanity checks for basic for parallel and serial circiuts.\n\"\"\"\nimport numpy as np\nimport networkx as nx\n\n\nfrom pyunicorn import ResNetwork\nfrom .ResistiveNetwork_utils import \\\n    makeNW, parallelCopy, serialCopy, nx2nw\n\ndebug = 0\n\"\"\" Test for basic sanity, parallel and serial circiuts\n\"\"\"\n\n\ndef testParallelTrivial():\n    r\"\"\" Trivial parallel case:\n    a)  0 --- 1 --- 2\n\n        /---- 3 ---\\\n    b)  0 --- 1 --- 2\n\n    c)  /---- 3 ---\\\n        0 --- 1 --- 2\n        \\____ 4 ___/\n\n    ER(a) = 2*ER(b) = 3*ER(c)\n    \"\"\"\n    nws = []\n    # construct nw1\n    idI, idJ = [0, 1], [1, 2]\n    nws.append(makeNW(idI, idJ, [.1]))\n\n    # construct nw2\n    idI += [0, 3]\n    idJ += [3, 2]\n    nws.append(makeNW(idI, idJ, [.1]))\n\n    # nw3\n    idI += [0, 4]\n    idJ += [4, 2]\n    nws.append(makeNW(idI, idJ, [.1]))\n\n    ER = []\n    for nw in nws:\n        rnw = ResNetwork(nw)\n        ER.append(rnw.effective_resistance(0, 2))\n\n    assert abs(ER[0]/2-ER[1]) < .1E-6\n    assert abs(ER[0]/3-ER[2]) < .1E-6\n\n\ndef testParallelLessTrivial():\n    \"\"\" Less Trivial Parallel Case:\n            |--- 1 --- 0\n        a) 2     |\n            |--- 3 ----4\n\n            |--- 1 --- 0 --- 5 --- |\n        b) 2     |           |     7\n            |--- 3 ----4 --- 6 --- |\n\n                      |---- 8 ----------- |\n                      |     |             |\n                      |     |----------|  |\n                      |                |  |\n           |--- 1 --- 0 --- 5 --- |    |  |\n        c) 2    |           |     7    |  9\n           |--- 3 ----4 --- 6 --- |    |  |\n                      |                |  |\n                      |      ----------|  |\n                      |      |            |\n                      |---- 10 -----------|\n    \"\"\"\n    nws = []\n\n    idI = [0, 1, 1, 2, 3]\n    idJ = [1, 2, 3, 3, 4]\n    nws.append(makeNW(idI, idJ, [1]*len(idI)))\n\n    idI.extend([0, 5, 5, 6, 6])\n    idJ.extend([5, 6, 7, 7, 4])\n    nws.append(makeNW(idI, idJ, [1]*len(idI)))\n\n    idI.extend([0, 8, 8, 9, 10])\n    idJ.extend([8, 9, 10, 10, 4])\n    nws.append(makeNW(idI, idJ, [1]*len(idI)))\n\n    ER = []\n    for nw in nws:\n        rnw = ResNetwork(nw)\n        ER.append(rnw.effective_resistance(0, 4))\n    #     Gs.append(nx.DiGraph(nw))\n    # # showGraphs(Gs)\n    # # s = ''\n    # # for i,e in enumerate(ER):\n    # #     s = s + \"NW{:d} {:.3f}\\t\".format(i,e)\n    # # print(\"Effective resistances (0,2)\\n %s\" % (s))\n\n    assert abs(ER[0]/2-ER[1]) < .1E-6\n    assert abs(ER[0]/3-ER[2]) < .1E-6\n\n    # \"\"\" Less Trivial Parallel Case:\n    #     /--- 1 --- 0\n    # a) 2     |\n    #     \\--- 3 ----4\n\n    #     /--- 1 --- 0 --- 5 --- \\\n    # b) 2     |           |      7\n    #     \\--- 3 ----4 --- 6 --- /\n\n    #               / --- 8 ----------- \\\n    #               |                    \\\n    #    /--- 1 --- 0 --- 5 --- \\         \\\n    # c) 2                       7        9\n    #    \\--- 3 ----4 --- 6 --- /         /\n    #               |                    /\n    #               \\ --- 10 -----------/\n    # \"\"\"\n    # nws =[]\n    # #construct nw1\n\n    # idI = [0,1,1,2,3]\n    # idJ = [1,2,3,3,4]\n    # val = [.1] * 5\n    # nws.append(makeNW(idI,idJ,[.1]*len(idI))[0])\n\n    # idI.extend([0,5,6,7])\n    # idJ.extend([5,6,7,4])\n    # val.extend( val * 6)\n    # nws.append(makeNW(idI,idJ,[.1]*len(idI))[0])\n\n    # idI.extend([0,8,9,10])\n    # idJ.extend([8,9,10,4])\n    # val.extend( val * 4)\n    # nws.append(makeNW(idI,idJ,val)[0])\n\n    # ER = []\n    # for nw in nws:\n    #     rnw = ResNetwork(nw)\n    #     ER.append( rnw.effective_resistance(0,4))\n\n    # s = ''\n    # for i,e in enumerate(ER):\n    #     s = s + \"NW{:d} {:.3f}\\t\".format(i,e)\n    # print(\"Effective resistances (0,2)\\n %s\" % (s))\n\n    # assert abs(ER[0]/2-ER[1]) < .1E-6\n    # assert abs(ER[0]/3-ER[2]) < .1E-6\n\n\ndef testParallelRandom():\n    \"\"\" 50 random parallel cases\n    \"\"\"\n\n    N = 10\n    p = .7\n\n    runs = 0\n    while runs < 50:\n\n        G = nx.fast_gnp_random_graph(N, p)\n        a = 0\n        b = G.number_of_nodes()-1\n\n        try:\n            nx.shortest_path(G, source=a, target=b)\n        except RuntimeError:\n            continue\n\n        i, j = [], []\n        for xx in G.edges():\n            i.append(xx[0])\n            j.append(xx[1])\n\n        # %.1f values for resistance\n        val = np.round(np.random.rand(len(i))*100)/10\n\n        # and test\n        nw1 = makeNW(i, j, val)\n        nw2 = parallelCopy(nw1, a, b)\n        ER1 = ResNetwork(nw1).effective_resistance(a, b)\n        ER2 = ResNetwork(nw2).effective_resistance(a, b)\n\n        # assertion\n        assert (ER1/2-ER2) < 1E-6\n\n        # increment runs\n        runs += 1\n\n\ndef testSerialTrivial():\n    \"\"\"Trivial serial test case\n\n    a) 0 --- 1 --- 2\n\n    b) 0 --- 1 --- 2 --- 3 --- 4\n\n    ER(a)/2 = ER(b)\n    \"\"\"\n\n    # construct nw1\n    idI = [0, 1]\n    idJ = [1, 2]\n    val = [1, 1]\n\n    nw1 = np.zeros((3, 3))\n    for i, j, v in zip(idI, idJ, val):\n        nw1[i, j] = v\n        nw1[j, i] = v\n\n    # construct nw2\n    idI = idI + [2, 3]\n    idJ = idJ + [3, 4]\n    val = val + [1, 1]\n\n    nw2 = np.zeros((5, 5))\n    for i, j, v in zip(idI, idJ, val):\n        nw2[i, j] = v\n        nw2[j, i] = v\n\n    # init ResNetworks\n    rnw1 = ResNetwork(nw1)\n    rnw2 = ResNetwork(nw2)\n\n    ER1 = rnw1.effective_resistance(0, 2)\n    ER2 = rnw2.effective_resistance(0, 4)\n\n    print(\"Effective resistances (0,2)\")\n    print(f\"NW1 {ER1:.3f}\\tNW2 {ER2:.3f}\\t 2*NW1 = {(2*ER1):.3f}\")\n\n    assert (ER1*2-ER2) < 1E-6\n\n\ndef testSerialRandom():\n    \"\"\" 50 Random serial test cases\n    \"\"\"\n\n    N = 10\n    p = .7\n    runs = 50\n    for _ in range(0, runs):\n\n        # a random graph\n        G = nx.fast_gnp_random_graph(N, p)\n        try:\n            nx.shortest_path(G, source=0, target=N-1)\n        except RuntimeError:\n            continue\n        except nx.NetworkXNoPath:\n            pass\n        # convert to plain ndarray\n        nw1 = nx2nw(G)\n\n        # copy and join network\n        nw2 = serialCopy(nw1)\n\n        # compute effective resistance\n        ER1 = ResNetwork(\n            nw1, silence_level=3).effective_resistance(0, len(nw1)-1)\n        ER2 = ResNetwork(\n            nw2, silence_level=3).effective_resistance(0, len(nw2)-1)\n\n        # assertion\n        # print(ER1*2-ER2)\n        assert (ER1*2-ER2) < 1E-6\n"
  },
  {
    "path": "tests/test_core/TestResistiveNetwork-complexInput.py",
    "content": "# Copyright (C) 2014 SWIPO Project\n#\n# Authors (this file):\n#   Stefan Schinkel <stefan.schinkel@gmail.com>\n\"\"\"\nProvides Simple test for the treatment of complex admittances\nin resistive networks.\n\"\"\"\n\nimport numpy as np\n\nfrom pyunicorn import ResNetwork\n\n\nres = ResNetwork.SmallTestNetwork()\nresC = ResNetwork.SmallComplexNetwork()\n# a symmetric one too\nr = np.zeros((5, 5), dtype=complex)\nr.real = [[0, 2, 0, 0, 0],\n          [2, 0, 8, 2, 0],\n          [0, 8, 0, 8, 0],\n          [0, 2, 8, 0, 10],\n          [0, 0, 0, 10, 0]]\nr.imag = r.real\nresCsym = ResNetwork(r)\n\n\ndef testComplexAdmittance():\n    # Ensure that the sum of real and imaginary\n    # admittance values in resc is zeros\n\n    sumAdm = resCsym.get_admittance().real + resCsym.get_admittance().imag\n    assert np.all(sumAdm == 0)\n\n\ndef testPinvSymmetry():\n    # test that the real and imag part of \"R\" are identical for\n    # the test network\n\n    assert np.allclose(resCsym.get_R().real, resCsym.get_R().imag)\n\n\ndef testAdmittiveDegree():\n\n    sumAD = resCsym.admittive_degree().real + resCsym.admittive_degree().imag\n    assert np.all(sumAD == 0)\n"
  },
  {
    "path": "tests/test_core/TestResistiveNetwork-cython.py",
    "content": "# Copyright (C) 2014 SWIPO Project\n#\n# Authors (this file):\n#   Stefan Schinkel <stefan.schinkel@gmail.com>\n\"\"\"\nWeave tests to check that python and weave implementations give the same\nresults\n\"\"\"\n\nimport numpy as np\nfrom pyunicorn import ResNetwork\n\n\nres = ResNetwork.SmallTestNetwork()\nresC = ResNetwork.SmallComplexNetwork()\n\n\ndef testVCFB():\n    for i in range(5):\n        admittance = res.get_admittance()\n        R = res.get_R()\n        # set params\n        Is = It = np.float32(1.0)\n        # alloc output\n        vcfbPython = np.float32(0)\n        for t in range(res.N):\n            for s in range(t):\n                K = 0.0\n                if i in (t, s):\n                    pass\n                else:\n                    for j in range(res.N):\n                        K += admittance[i][j] * np.abs(\n                            Is*(R[i][s]-R[j][s]) + It*(R[j][t]-R[i][t]))/2.\n                vcfbPython += 2.*K/(res.N*(res.N-1))\n\n        vcfbCython = res.vertex_current_flow_betweenness(i)\n        assert round(vcfbPython, 4) == round(vcfbCython, 4)\n\n\ndef testECFB():\n    # set currents\n    Is = It = np.float32(1)\n    # alloc output\n    if res.flagComplex:\n        dtype = complex\n    else:\n        dtype = float\n    ecfbPython = np.zeros([res.N, res.N], dtype=dtype)\n    # the usual\n    admittance = res.get_admittance()\n    R = res.get_R()\n    for i in range(res.N):\n        for j in range(res.N):\n            K = 0\n            for t in range(res.N):\n                for s in range(t):\n                    K += admittance[i][j] * np.abs(\n                        Is*(R[i][s]-R[j][s])+It*(R[j][t]-R[i][t]))\n            # Lets try to compute the in\n            ecfbPython[i][j] = 2*K/(res.N*(res.N-1))\n\n    ecfbCython = res.edge_current_flow_betweenness()\n    L = len(ecfbPython)\n    for i in range(L):\n        for j in range(L):\n            assert round((ecfbPython[i][j].astype('float32')), 4) == \\\n                   round((ecfbCython[i][j].astype('float32')), 4)\n"
  },
  {
    "path": "tests/test_core/TestResistiveNetwork-types.py",
    "content": "# Copyright (C) 2014 SWIPO Project\n#\n# Authors (this file):\n#   Stefan Schinkel <stefan.schinkel@gmail.com>\n\"\"\"\nProvides simple type check for resistive networks\n\"\"\"\n\nimport numpy as np\n\nfrom pyunicorn import ResNetwork\n\n\nres = ResNetwork.SmallTestNetwork()\n\n\ndef testAdmittiveDegreeType():\n    print(\"testing types\")\n    assert isinstance(res.admittive_degree(), np.ndarray)\n"
  },
  {
    "path": "tests/test_core/__init__.py",
    "content": ""
  },
  {
    "path": "tests/test_core/test_cache.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nConsistency checks for the method caching mix-in.\n\"\"\"\n\nfrom gc import get_referrers\nfrom weakref import getweakrefcount\n\nimport pytest\nimport numpy as np\n\nfrom pyunicorn.core.cache import Cached\n\n\ndef check_wrefc(referent: object, count: int):\n    \"\"\"\n    Check the number of weak references to `referent`.\n    \"\"\"\n    assert getweakrefcount(referent) == count\n\n\ndef check_srefc(referent: object, count: int):\n    \"\"\"\n    Check the number of strong references to `referent`.\n    \"\"\"\n    assert len(get_referrers(referent)) == count\n\n\ndef check_single_sref(referent: object, obj: object, attr: str):\n    \"\"\"\n    Check that there is one strong reference to `referent`, namely `obj.attr`.\n    \"\"\"\n    assert getattr(obj, attr) is referent\n    srefs = get_referrers(referent)\n    assert len(srefs) == 1\n    match srefs[0]:\n        # either return type can occur, depending on runtime internals\n        case dict() as r:\n            assert r[attr] is referent\n        case r:\n            assert r is obj\n\n\n# pylint: disable=no-member,disallowed-name\nclass TestCached:\n\n    # increase for testing purposes\n    Cached.lru_params_local[\"maxsize\"] = 8\n\n    class Foo(Cached):\n        silence_level = 1\n\n        def __cache_state__(self):\n            return ()\n\n        @Cached.method()\n        def foo1(self, a: int):\n            \"\"\"Foo1\"\"\"\n            return a\n\n        @Cached.method(name=\"foo2\")\n        def foo2(self, *args):\n            \"\"\"Foo2\"\"\"\n            return sum(args, start=0)\n\n        @Cached.method()\n        def bar(self):\n            \"\"\"Bar\"\"\"\n            return True\n\n    class Bar(Cached):\n        def __init__(self):\n            self.counter = 0\n\n        def __cache_state__(self):\n            return (self.counter,)\n\n    @classmethod\n    def test_args(cls, capfd: pytest.CaptureFixture):\n        \"\"\"\n        Dependence on method arguments.\n        \"\"\"\n        gs = Cached.lru_params_global[\"maxsize\"]\n        ls = Cached.lru_params_local[\"maxsize\"]\n        b = 5\n\n        # immutable instance\n        X = cls.Foo()\n\n        # wrapped method metadata\n        methods = [\"foo1\", \"foo2\", \"bar\"]\n        assert all(getattr(X, m).__doc__ == m.capitalize() for m in methods)\n\n        # method calls\n        for _ in range(3):\n            X.cache_clear()\n\n            for g in range(1, gs + 3):\n                g_ = min(g, gs)\n                X = cls.Foo()\n\n                r1, o1 = [], []\n                for _ in range(ls + 1):\n                    r1.append(X.foo1(1))\n                    o1.append(cls.Foo.foo1.__wrapped__(X, 1))\n                r1.append(X.foo1(1.0))\n                assert all(r == r1[0] for r in r1)\n                assert all(r == o for r, o in zip(r1, o1))\n\n                r2, o2 = [], []\n                for i in range(2 * ls):\n                    r2.append(X.foo2(*range(i)))\n                    o2.append(cls.Foo.foo2.__wrapped__(X, *range(i)))\n                assert (np.diff(r2) == range(2 * ls - 1)).all()\n                assert all(r == o for r, o in zip(r2, o2))\n\n                r3, o3 = [], []\n                for i in range(b):\n                    r3.append(X.bar())\n                    o3.append(cls.Foo.bar.__wrapped__(X))\n                assert all(r and isinstance(r, bool) for r in r3)\n                assert all(r == o for r, o in zip(r3, o3))\n\n                # global cache lookups\n                gc1, gc2, gc3 = (getattr(X, m).cache_info() for m in methods)\n                assert gc1.maxsize == gc2.maxsize == gs\n                assert (gc1.currsize, gc1.misses, gc1.hits) == (\n                    g_, g, g * (ls + 1))\n                assert (gc2.currsize, gc2.misses, gc2.hits) == (\n                    g_, g, g * (2 * ls - 1))\n                assert (gc3.currsize, gc3.misses, gc3.hits) == (\n                    g_, g, g * (b - 1))\n\n                # local cache lookups\n                lc1, lc2, lc3 = (\n                    getattr(X, f\"__cached_{m}__\").cache_info()\n                    for m in methods)\n                assert lc1.maxsize == lc2.maxsize == lc3.maxsize == ls\n                assert (lc1.currsize, lc1.misses, lc1.hits) == (2, 2, ls)\n                assert (lc2.currsize, lc2.misses, lc2.hits) == (ls, 2 * ls, 0)\n                assert (lc3.currsize, lc3.misses, lc3.hits) == (1, 1, 4)\n\n            # cache clearing\n            X.cache_clear(prefix=\"foo\")\n            gc1, gc2, gc3 = (getattr(X, m).cache_info() for m in methods)\n            assert (gc1.currsize, gc1.misses, gc1.hits) == (0, 0, 0)\n            assert (gc2.currsize, gc2.misses, gc2.hits) == (0, 0, 0)\n            assert (gc3.currsize, gc3.misses, gc3.hits) == (gs, g, g * 4)\n\n            # logging behaviour\n            capture = capfd.readouterr()\n            assert capture.err == \"\"\n            msg2 = \"Calculating foo2...\"\n            assert capture.out.split(\"\\n\")[:-1] == [msg2] * (g * 2 * ls)\n\n    @classmethod\n    def test_instance_immutable(cls):\n        \"\"\"\n        Dependence on immutable instance attributes.\n        \"\"\"\n        ls = Cached.lru_params_local[\"maxsize\"]\n\n        # immutable instances\n        X, Y = cls.Foo(), cls.Foo()\n\n        # method calls\n        for i in range(ls):\n            assert X.foo1(i) == Y.foo1(i) == i\n        Y.foo1(ls-1)\n\n        # global cache lookups\n        gx, gy = (o.foo1.cache_info() for o in [X, Y])\n        assert gx == gy\n        assert (gx.currsize, gx.misses, gx.hits) == (2, 2, 2 * (ls - 1) + 1)\n\n        # local cache lookups\n        lx, ly = (o.__cached_foo1__.cache_info() for o in [X, Y])\n        assert (lx.currsize, lx.misses, lx.hits) == (ls, ls, 0)\n        assert (ly.currsize, ly.misses, ly.hits) == (ls, ls, 1)\n\n        # cache clearing\n        X.cache_clear()\n        gx, gy = (o.foo1.cache_info() for o in [X, Y])\n        assert gx == gy\n        assert (gx.currsize, gx.misses, gx.hits) == (0, 0, 0)\n\n    @classmethod\n    def test_instance_mutable(cls):\n        \"\"\"\n        Dependence on mutable instance attributes.\n        \"\"\"\n        ls = Cached.lru_params_local[\"maxsize\"]\n\n        # mutable instances\n        class Baz(cls.Bar):\n            @Cached.method()\n            def baz(self):\n                self.counter += 1\n                return self.counter\n\n        X, Y = Baz(), Baz()\n\n        # method calls\n        k, n = 3, ls // 2\n        assert k < n < ls\n        for i in range(n):\n            assert X.baz() == Y.baz() == i + 1\n        Y.counter = 0\n        for _ in range(k):\n            Y.baz()\n\n        # global cache lookups\n        gx, gy = (o.baz.cache_info() for o in [X, Y])\n        assert gx == gy\n        assert (gx.currsize, gx.misses, gx.hits) == (2, 2, 2 * (n - 1) + k)\n\n        # local cache lookups\n        lx, ly = (o.__cached_baz__.cache_info() for o in [X, Y])\n        assert (lx.currsize, lx.misses, lx.hits) == (n, n, 0)\n        assert (ly.currsize, ly.misses, ly.hits) == (n, n, k)\n\n        # cache clearing\n        X.cache_clear()\n        gx, gy = (o.baz.cache_info() for o in [X, Y])\n        assert gx == gy\n        assert (gx.currsize, gx.misses, gx.hits) == (0, 0, 0)\n\n    @classmethod\n    def test_instance_rec(cls):\n        \"\"\"\n        Dependence on owned `Cached` instances.\n        \"\"\"\n        ls = Cached.lru_params_local[\"maxsize\"]\n\n        # mutable instances\n        class BarFoo(cls.Bar):\n            def __init__(self, foo: cls.Foo):\n                self.foo = foo\n                cls.Bar.__init__(self)\n\n            def __cache_state__(self):\n                return cls.Bar.__cache_state__(self) + (self.foo,)\n\n            @Cached.method()\n            def baz(self, a: int):\n                f = self.foo.foo1(a)\n                self.counter += 1\n                return f\n\n        # method calls\n        X = BarFoo(cls.Foo())\n        for i in range(ls):\n            assert X.baz(i) == i\n        assert X.counter == ls\n        for i in range(ls):\n            assert X.baz(i) == i\n        assert X.counter == 2 * ls\n\n        # global cache lookups\n        gx, gy = (m.cache_info() for m in [X.baz, X.foo.foo1])\n        assert gx == gy\n        assert (gx.currsize, gx.misses, gx.hits) == (1, 1, 2 * ls - 1)\n\n        # local cache lookups\n        lx, ly = (m.cache_info()\n                  for m in [X.__cached_baz__, X.foo.__cached_foo1__])\n        assert (lx.currsize, lx.misses, lx.hits) == (ls, 2 * ls, 0)\n        assert (ly.currsize, ly.misses, ly.hits) == (ls, ls, ls)\n\n        # cache clearing\n        X.cache_clear()\n        gx, gy = (m.cache_info() for m in [X.baz, X.foo.foo1])\n        assert gx == gy\n        assert (gx.currsize, gx.misses, gx.hits) == (0, 0, 0)\n\n    @classmethod\n    def test_attributes(cls):\n        \"\"\"\n        Dependence on method-specific attributes.\n        \"\"\"\n        ls = Cached.lru_params_local[\"maxsize\"]\n\n        # mutable instances\n        class FooBaz(cls.Foo):\n            def __init__(self):\n                self.secret = 0\n\n            @Cached.method(attrs=(\"secret\",))\n            def baz(self):\n                \"\"\"FooBaz\"\"\"\n                self.secret += 1\n                return self.secret\n\n        class BarBaz(cls.Bar):\n            def __init__(self):\n                cls.Bar.__init__(self)\n                self.secret = 0\n\n            @Cached.method(attrs=(\"secret\",))\n            def baz(self):\n                \"\"\"BarBaz\"\"\"\n                self.counter += 1\n                self.secret += 1\n                return self.counter + self.secret\n\n        X, Y = FooBaz(), BarBaz()\n\n        # wrapped method metadata\n        assert all(o.baz.__doc__ == type(o).__name__ for o in [X, Y])\n\n        # method calls\n        k, n = 3, ls // 2\n        assert k < n < ls\n        for i in range(n):\n            assert X.baz() == i + 1\n            assert Y.baz() == 2 * (i + 1)\n        X.secret = 0\n        Y.secret = 0\n        for i in range(n):\n            assert X.baz() == 1\n            assert Y.baz() == n + 2 * (i + 1)\n        X.secret = 0\n        Y.secret = 0\n        Y.counter = 0\n        for i in range(k):\n            assert X.baz() == 1\n            assert Y.baz() == 2\n\n        # global cache lookups\n        gx1, gy1 = (o.baz.cache_info() for o in [X, Y])\n        assert (gx1.currsize, gx1.misses, gx1.hits) == (1, 1, 2 * n + k - 1)\n        assert gy1 == gx1\n\n        # local cache lookups\n        lx1, ly1 = (o.__cached_baz__.cache_info() for o in [X, Y])\n        assert (lx1.currsize, lx1.misses, lx1.hits) == (n, n, n + k)\n        assert (ly1.currsize, ly1.misses, ly1.hits) == (2 * n, 2 * n, k)\n\n        # cache clearing\n        X.cache_clear()\n        gx2, gy2 = (o.baz.cache_info() for o in [X, Y])\n        assert (gx2.currsize, gx2.misses, gx2.hits) == (0, 0, 0)\n        assert gy2 == gy1\n        assert not hasattr(X, \"__cached_baz__\")\n        ly2 = Y.__cached_baz__.cache_info()\n        assert ly2 == ly1\n        Y.cache_clear()\n        gx3, gy3 = (o.baz.cache_info() for o in [X, Y])\n        assert gx3 == gx2\n        assert gy3 == gx3\n        assert not hasattr(Y, \"__cached_baz__\")\n\n    @classmethod\n    def test_disable(cls):\n        \"\"\"\n        Dependence on the global switch.\n        \"\"\"\n        Cached.cache_enable = False\n        ls = Cached.lru_params_local[\"maxsize\"]\n\n        class Baz(cls.Bar):\n            def __init__(self):\n                cls.Bar.__init__(self)\n                self.undeclared_counter = 0\n\n            @Cached.method()\n            def baz(self):\n                \"\"\"Baz\"\"\"\n                self.undeclared_counter += 1\n\n        Cached.cache_enable = True\n        X = Baz()\n\n        # wrapped method metadata\n        assert X.baz.__doc__ == \"Baz\"\n\n        # method calls\n        for _ in range(2 * ls):\n            X.baz()\n\n        # no caching\n        assert X.counter == 0\n        assert X.undeclared_counter == 2 * ls\n        assert not hasattr(X.baz, \"cache_info\")\n\n        # no-op\n        X.cache_clear()\n\n    @classmethod\n    def test_refcount(cls):\n        \"\"\"\n        Interaction with the garbage collector.\n        \"\"\"\n        ls = Cached.lru_params_local[\"maxsize\"]\n        b = 5\n\n        class FooBar(cls.Foo):\n            def __init__(self, referent: cls.Bar):\n                self.referent = referent\n\n            @Cached.method()\n            def bar(self) -> cls.Bar:\n                return self.referent\n\n            def __del__(self):\n                self.referent.counter += 1\n\n        # tracked instance\n        Z = cls.Bar()\n        X = FooBar(Z)\n        check_single_sref(Z, X, \"referent\")\n        check_wrefc(Z, 0)\n\n        # global cache parametrisation\n        methods = [\"foo1\", \"foo2\", \"bar\"]\n        for m in methods:\n            assert getattr(X, m).__wrapped__ is getattr(FooBar, m).__wrapped__\n            assert getattr(X, m).cache_clear is getattr(FooBar, m).cache_clear\n            assert getattr(X, m).cache_parameters() == Cached.lru_params_global\n\n        # sequence designed to cover the case of dead local caches\n        for del_instance in [False, True]:\n\n            # empty cache\n            r = 0\n            check_srefc(X, 0)\n            check_wrefc(X, r)\n\n            # method calls\n            for i in range(ls + b):\n                if i == 0:\n                    # expect new `ref(X)` in global cache\n                    r += 1\n                for m in methods:\n                    match m:\n                        case \"foo1\":\n                            assert X.foo1(i) == i\n                        case \"foo2\":\n                            assert X.foo2() == 0\n                        case \"bar\":\n                            assert X.bar() is Z\n                    check_srefc(Z, 1 if (i == 0 and not m == \"bar\") else 2)\n                    check_wrefc(X, r)\n\n            # populated global/local caches\n            for m in methods:\n                assert getattr(FooBar, m).cache_info().currsize == 1\n                assert (getattr(X, f\"__cached_{m}__\").cache_info().currsize\n                        == (ls if m == \"foo1\" else 1))\n            check_srefc(X, 0)\n\n            if not del_instance:\n                # clear global and local caches, but keep instance\n                X.cache_clear()\n                check_srefc(X, 0)\n                check_wrefc(X, 0)\n                check_single_sref(Z, X, \"referent\")\n                check_wrefc(Z, 0)\n                assert Z.counter == 0\n                for m in methods:\n                    assert getattr(FooBar, m).cache_info().currsize == 0\n            else:\n                # delete instance, but keep global cache\n                del X\n                check_srefc(Z, 0)\n                check_wrefc(Z, 0)\n                assert Z.counter == 1\n                for m in methods:\n                    assert getattr(FooBar, m).cache_info().currsize == 1\n"
  },
  {
    "path": "tests/test_core/test_data.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nSimple tests for the Data class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.core.data import Data\n\n\ndef test_observable():\n    obs = Data.SmallTestData().observable()\n    obs_ref = np.array([[0.00000000e+00, 1.00000000e+00, 1.22464680e-16,\n                         -1.00000000e+00, -2.44929360e-16, 1.00000000e+00],\n                        [3.09016994e-01, 9.51056516e-01, -3.09016994e-01,\n                         -9.51056516e-01, 3.09016994e-01, 9.51056516e-01],\n                        [5.87785252e-01, 8.09016994e-01, -5.87785252e-01,\n                         -8.09016994e-01, 5.87785252e-01, 8.09016994e-01],\n                        [8.09016994e-01, 5.87785252e-01, -8.09016994e-01,\n                         -5.87785252e-01, 8.09016994e-01, 5.87785252e-01],\n                        [9.51056516e-01, 3.09016994e-01, -9.51056516e-01,\n                         -3.09016994e-01, 9.51056516e-01, 3.09016994e-01],\n                        [1.00000000e+00, 1.22464680e-16, -1.00000000e+00,\n                         -2.44929360e-16, 1.00000000e+00, 3.67394040e-16],\n                        [9.51056516e-01, -3.09016994e-01, -9.51056516e-01,\n                         3.09016994e-01, 9.51056516e-01, -3.09016994e-01],\n                        [8.09016994e-01, -5.87785252e-01, -8.09016994e-01,\n                         5.87785252e-01, 8.09016994e-01, -5.87785252e-01],\n                        [5.87785252e-01, -8.09016994e-01, -5.87785252e-01,\n                         8.09016994e-01, 5.87785252e-01, -8.09016994e-01],\n                        [3.09016994e-01, -9.51056516e-01, -3.09016994e-01,\n                         9.51056516e-01, 3.09016994e-01, -9.51056516e-01]])\n\n    isequal = np.allclose(obs, obs_ref)\n    assert isequal\n\n\ndef test_window():\n    lon_min = Data.SmallTestData().window()[\"lon_min\"]\n    lon_max = Data.SmallTestData().window()[\"lon_max\"]\n    lon_min_ref = 2.5\n    lon_max_ref = 15.0\n    isequal = np.allclose(lon_min, lon_min_ref) and \\\n        np.allclose(lon_max, lon_max_ref)\n    assert isequal\n\n\ndef test_set_window():\n    data = Data.SmallTestData()\n    data.set_window(window={\"time_min\": 0., \"time_max\": 4., \"lat_min\": 10.,\n                            \"lat_max\": 20., \"lon_min\": 5., \"lon_max\": 10.})\n    obs = data.observable()\n    obs_ref = np.array([[1.22464680e-16, -1.00000000e+00],\n                        [-3.09016994e-01, -9.51056516e-01],\n                        [-5.87785252e-01, -8.09016994e-01],\n                        [-8.09016994e-01, -5.87785252e-01],\n                        [-9.51056516e-01, -3.09016994e-01]])\n\n    isequal = np.allclose(obs, obs_ref)\n    assert isequal\n\n\ndef test_set_global_window():\n    data = Data.SmallTestData()\n    data.set_window(window={\"time_min\": 0., \"time_max\": 4.,\n                            \"lat_min\": 10., \"lat_max\": 20., \"lon_min\": 5.,\n                            \"lon_max\": 10.})\n\n    lat1 = data.grid.grid()[\"lat\"]\n    data.set_global_window()\n    lat2 = data.grid.grid()[\"lat\"]\n\n    lat1_ref = np.array([10., 15.], dtype=np.float32)\n    lat2_ref = np.array([0., 5., 10., 15., 20., 25.], dtype=np.float32)\n\n    isequal = np.allclose(lat1, lat1_ref) and np.allclose(lat2, lat2_ref)\n    assert isequal\n\n\ndef test_normalize_time_series_array():\n    ts = np.arange(16).reshape(4, 4).astype(\"float\")\n    Data.normalize_time_series_array(ts)\n\n    mean = ts.mean(axis=0)\n    std = ts.std(axis=0)\n    ts = ts[:, 0]\n\n    mean_ref = np.array([0., 0., 0., 0.])\n    std_ref = np.array([1., 1., 1., 1.])\n    ts_ref = np.array([-1.34164079, -0.4472136, 0.4472136, 1.34164079])\n\n    isequal = np.allclose(mean, mean_ref) and np.allclose(std, std_ref) and \\\n        np.allclose(ts, ts_ref)\n    assert isequal\n\n\ndef test_next_power_2():\n    isequal = np.allclose(Data.next_power_2(253), 256)\n    assert isequal\n\n\ndef test_zero_pad_data():\n    ts = np.arange(20).reshape(5, 4)\n    zpd = Data.zero_pad_data(ts)\n\n    zpd_ref = np.array([[0., 0., 0., 0.], [0., 1., 2., 3.],\n                        [4., 5., 6., 7.], [8., 9., 10., 11.],\n                        [12., 13., 14., 15.], [16., 17., 18., 19.],\n                        [0., 0., 0., 0.], [0., 0., 0., 0.]])\n\n    isequal = np.allclose(zpd, zpd_ref)\n    assert isequal\n\n\ndef test_cos_window():\n    ts = np.arange(24).reshape(12, 2)\n    cw = Data.cos_window(data=ts, gamma=0.75)\n    cw_ref = np.array([[0., 0.], [0.14644661, 0.14644661],\n                       [0.5, 0.5], [0.85355339, 0.85355339],\n                       [1., 1.], [1., 1.],\n                       [1., 1.], [1., 1.],\n                       [0.85355339, 0.85355339], [0.5, 0.5],\n                       [0.14644661, 0.14644661], [0., 0.]])\n\n    isequal = np.allclose(cw, cw_ref)\n    assert isequal\n"
  },
  {
    "path": "tests/test_core/test_geo_grid.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nSimple tests for the GeoGrid class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.core.geo_grid import GeoGrid\n\n\ndef test_RegularGrid():\n    res = GeoGrid.RegularGrid(time_seq=np.arange(2),\n                              space_grid=(np.array([0., 5.]),\n                                          np.array([1., 2.])),\n                              silence_level=2).lat_sequence()\n    exp = np.array([0., 0., 5., 5.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = GeoGrid.RegularGrid(time_seq=np.arange(2),\n                              space_grid=(np.array([0., 5.]),\n                                          np.array([1., 2.])),\n                              silence_level=2).lon_sequence()\n    exp = np.array([1., 2., 1., 2.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_coord_sequence_from_rect_grid():\n    res = GeoGrid.coord_sequence_from_rect_grid(lat_grid=np.array([0., 5.]),\n                                                lon_grid=np.array([1., 2.]))\n    exp = (np.array([0., 0., 5., 5.]), np.array([1., 2., 1., 2.]))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_lat_sequence():\n    res = GeoGrid.SmallTestGrid().lat_sequence()\n    exp = np.array([0., 5., 10., 15., 20., 25.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_lon_sequence():\n    res = GeoGrid.SmallTestGrid().lon_sequence()\n    exp = np.array([2.5, 5., 7.5, 10., 12.5, 15.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_convert_lon_coordinates():\n    res = GeoGrid.SmallTestGrid().convert_lon_coordinates(\n        np.array([10., 350., 20., 340., 170., 190.]))\n    exp = np.array([10., -10., 20., -20., 170., -170.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_node_number2d():\n    res = GeoGrid.SmallTestGrid().node_number(lat_node=14., lon_node=9.)\n    exp = 3\n    assert res == exp\n\n\ndef test_cos_lat():\n    res = GeoGrid.SmallTestGrid().cos_lat()[:2]\n    exp = np.array([1., 0.9962])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_sin_lat():\n    res = GeoGrid.SmallTestGrid().sin_lat()[:2]\n    exp = np.array([0., 0.0872])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cos_lon():\n    res = GeoGrid.SmallTestGrid().cos_lon()[:2]\n    exp = np.array([0.999, 0.9962])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_sin_lon():\n    res = GeoGrid.SmallTestGrid().sin_lon()[:2]\n    exp = np.array([0.0436, 0.0872])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_angular_distance():\n    res = GeoGrid.SmallTestGrid().angular_distance().round(2)\n    exp = np.array([[0., 0.1, 0.19, 0.29, 0.39, 0.48],\n                    [0.1, 0., 0.1, 0.19, 0.29, 0.39],\n                    [0.19, 0.1, 0., 0.1, 0.19, 0.29],\n                    [0.29, 0.19, 0.1, 0., 0.1, 0.19],\n                    [0.39, 0.29, 0.19, 0.1, 0., 0.1],\n                    [0.48, 0.39, 0.29, 0.19, 0.1, 0.]], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_boundaries():\n    res = GeoGrid.SmallTestGrid().print_boundaries()\n    exp = \"         time     lat     lon\\n   min    0.0    0.00    2.50\\n\" + \\\n          \"   max    9.0   25.00   15.00\"\n    assert res == exp\n\n\ndef test_geometric_distance_distribution():\n    res = GeoGrid.SmallTestGrid().geometric_distance_distribution(3)[0]\n    exp = np.array([0.3333, 0.4667, 0.2])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = GeoGrid.SmallTestGrid().geometric_distance_distribution(3)[1]\n    exp = np.array([0., 0.1616, 0.3231, 0.4847])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_region_indices():\n    res = GeoGrid.SmallTestGrid().region_indices(\n        np.array([0., 0., 0., 11., 11., 11., 11., 0.])).astype(int)\n    exp = np.array([0, 1, 1, 0, 0, 0])\n    assert np.allclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_core/test_geo_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nSimple tests for the GeoNetwork class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.core.geo_network import GeoNetwork\nfrom pyunicorn.core.spatial_network import SpatialNetwork\nfrom pyunicorn.core.geo_grid import GeoGrid\n\n\ndef test_ErdosRenyi(capsys):\n    print(GeoNetwork.Model(\"ErdosRenyi\", grid=GeoGrid.SmallTestGrid(),\n                           n_nodes=6, n_links=5))\n    out = capsys.readouterr()[0]\n    out_ref = \"Generating Erdos-Renyi random graph with 6 nodes and 5 \" + \\\n              \"links...\\nSetting area weights according to type surface \" + \\\n              \"...\\nGeoNetwork:\\nSpatialNetwork:\\n\" + \\\n              \"Network: undirected, 6 nodes, 5 links, \" + \\\n              \"link density 0.333.\\nGeographical boundaries:\\n\" + \\\n              \"         time     lat     lon\\n\" + \\\n              \"   min    0.0    0.00    2.50\\n\" + \\\n              \"   max    9.0   25.00   15.00\\n\"\n    assert out == out_ref\n\n\ndef test_ConfigurationModel():\n    n = 0\n    while n != 7:\n        net = GeoNetwork.Model(\"Configuration\", grid=GeoGrid.SmallTestGrid(),\n                               degree=GeoNetwork.SmallTestNetwork().degree())\n        n = net.n_links\n    res = net.link_density\n    exp = 0.46666667\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_randomly_rewire_geomodel_I():\n    net = GeoNetwork.SmallTestNetwork()\n    net.randomly_rewire_geomodel_I(distance_matrix=net.grid.distance(),\n                                   iterations=100, inaccuracy=1.0)\n    res = net.degree()\n    exp = np.array([3, 3, 2, 2, 3, 1])\n    assert (res == exp).all()\n\n\ndef test_set_random_links_by_distance():\n    net = GeoNetwork.SmallTestNetwork()\n    while net.n_links != 5:\n        net.set_random_links_by_distance(a=0., b=-4.)\n    res = net.n_links\n    exp = 5\n    assert res == exp\n\n\ndef test_geographical_distribution():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.geographical_distribution(sequence=net.degree(), n_bins=3)[0]\n    exp = np.array([0.15645071, 0.33674395, 0.50680541])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_geographical_cumulative_distribution():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.geographical_cumulative_distribution(sequence=net.degree(),\n                                                   n_bins=3)[0]\n    exp = np.array([1.00000007, 0.84354936, 0.50680541])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_link_distance_distribution():\n    \"\"\"Check consistency of link distance distribution on spherical grid with\n    distribution on euclidean grid\"\"\"\n    net = SpatialNetwork.SmallTestNetwork()\n    geo_net = GeoNetwork.SmallTestNetwork()\n\n    res = geo_net.link_distance_distribution(n_bins=4,\n                                             geometry_corrected=False,\n                                             grid_type=\"spherical\")[0]\n    exp = net.link_distance_distribution(n_bins=4, geometry_corrected=False)[0]\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = geo_net.link_distance_distribution(n_bins=4, geometry_corrected=True,\n                                             grid_type=\"spherical\")[0]\n    exp = net.link_distance_distribution(n_bins=4, geometry_corrected=True)[0]\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_area_weighted_connectivity():\n    res = GeoNetwork.SmallTestNetwork().area_weighted_connectivity()\n    exp = np.array([0.48540673, 0.4989577, 0.33418113, 0.34459165, 0.51459336,\n                    0.17262428], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_inarea_weighted_connectivity():\n    res = GeoNetwork.SmallTestNetwork().inarea_weighted_connectivity()\n    exp = np.array([0.48540673, 0.4989577, 0.33418113, 0.34459165, 0.51459336,\n                    0.17262428], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_outarea_weighted_connectivity():\n    res = GeoNetwork.SmallTestNetwork().outarea_weighted_connectivity()\n    exp = np.array([0.4854067, 0.4989577, 0.33418113, 0.34459165, 0.51459336,\n                    0.17262428], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_area_weighted_connectivity_distribution():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.area_weighted_connectivity_distribution(n_bins=4)[0]\n    exp = np.array([0.15645071, 0.33674395, 0.34459165, 0.16221375])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_inarea_weighted_connectivity_distribution():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.inarea_weighted_connectivity_distribution(n_bins=4)[0]\n    exp = np.array([0.15645071, 0.33674395, 0.34459165, 0.16221375])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_outarea_weighted_connectivity_distribution():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.outarea_weighted_connectivity_distribution(n_bins=4)[0]\n    exp = np.array([0.15645071, 0.33674395, 0.34459165, 0.16221375])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_area_weighted_connectivity_cumulative_distribution():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.area_weighted_connectivity_cumulative_distribution(n_bins=4)[0]\n    exp = np.array([1.00000007, 0.84354936, 0.50680541, 0.16221375])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_inarea_weighted_connectivity_cumulative_distribution():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.inarea_weighted_connectivity_cumulative_distribution(n_bins=4)[0]\n    exp = np.array([1.00000007, 0.84354936, 0.50680541, 0.16221375])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_outarea_weighted_connectivity_cumulative_distribution():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.outarea_weighted_connectivity_cumulative_distribution(\n        n_bins=4)[0]\n    exp = np.array([1.00000007, 0.84354936, 0.50680541, 0.16221375])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_average_neighbor_area_weighted_connectivity():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.average_neighbor_area_weighted_connectivity()\n    exp = np.array([0.3439364, 0.39778873, 0.5067755, 0.4921822, 0.4395152,\n                    0.48540673], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_max_neighbor_area_weighted_connectivity():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.max_neighbor_area_weighted_connectivity()\n    exp = np.array([0.51459336, 0.51459336, 0.51459336, 0.49895769, 0.49895769,\n                    0.48540673])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_average_link_distance():\n    net = GeoNetwork.SmallTestNetwork()\n\n    res = net.average_link_distance(geometry_corrected=False)\n    exp = np.array([0.3884563, 0.19434186, 0.14557932, 0.24325928, 0.29118925,\n                    0.48467883])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.average_link_distance(geometry_corrected=True)[:-1]\n    exp = np.array([1.5987561, 1.0920637, 1.00011046, 1.67081917, 1.63841055])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_inaverage_link_distance():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.inaverage_link_distance(geometry_corrected=False)\n    exp = np.array([0.3884563, 0.19434186, 0.14557932, 0.24325928, 0.29118925,\n                    0.48467883])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_outaverage_link_distance():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.outaverage_link_distance(geometry_corrected=False)\n    exp = np.array([0.3884563, 0.19434186, 0.14557932, 0.24325928, 0.29118925,\n                    0.48467883])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_total_link_distance():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.total_link_distance(geometry_corrected=False)\n    exp = np.array([0.1885593, 0.09696837, 0.04864986, 0.08382512, 0.14984406,\n                    0.08366733])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_intotal_link_distance():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.intotal_link_distance(geometry_corrected=False)\n    exp = np.array([0.1885593, 0.09696837, 0.04864986, 0.08382512, 0.14984406,\n                    0.08366733])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_outtotal_link_distance():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.outtotal_link_distance(geometry_corrected=False)\n    exp = np.array([0.18855929, 0.09696837, 0.04864986, 0.08382512, 0.14984406,\n                    0.08366733])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_connectivity_weighted_distance():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.connectivity_weighted_distance()\n    exp = np.array([0.0625227, 0.03207134, 0.02408994, 0.04192858, 0.0500332,\n                    0.08366733])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_inconnectivity_weighted_distance():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.inconnectivity_weighted_distance()\n    exp = np.array([0.0625227, 0.03207134, 0.02408994, 0.04192858, 0.0500332,\n                    0.08366733])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_outconnectivity_weighted_distance():\n    net = GeoNetwork.SmallTestNetwork()\n    res = net.outconnectivity_weighted_distance()\n    exp = np.array([0.0625227, 0.03207134, 0.02408994, 0.04192858, 0.0500332,\n                    0.08366733])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_max_link_distance():\n    res = GeoNetwork.SmallTestNetwork().max_link_distance()\n    exp = np.array([0.48467883, 0.2911402, 0.19376467, 0.2920272, 0.38866287,\n                    0.48467883], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_average_distance_weighted_path_length():\n    res = GeoNetwork.SmallTestNetwork().average_distance_weighted_path_length()\n    exp = 0.49846491\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_distance_weighted_closeness():\n    res = GeoNetwork.SmallTestNetwork().distance_weighted_closeness()\n    exp = np.array([2.23782229, 2.45008978, 2.23956348, 2.45008978, 2.2396005,\n                    1.19817005])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_local_distance_weighted_vulnerability():\n    res = GeoNetwork.SmallTestNetwork().local_distance_weighted_vulnerability()\n    exp = np.array([0.03252519, 0.3136603, 0.20562718, 0.02799094, -0.02828809,\n                    -0.28798557])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_local_geographical_clustering():\n    res = GeoNetwork.SmallTestNetwork().local_geographical_clustering()\n    exp = np.array([0., 0.0998, 0.1489, 0., 0.2842, 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_core/test_grid.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nSimple tests for the Grid class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.core.grid import Grid\n\n\ndef test_RegularGrid():\n    res = Grid.RegularGrid(time_seq=np.arange(2),\n                           space_grid=np.array([[0., 5.], [1., 2.]]),\n                           silence_level=2).sequence(0)\n    exp = np.array([0., 0., 5., 5.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = Grid.RegularGrid(time_seq=np.arange(2),\n                           space_grid=np.array([[0., 5.], [1., 2.]]),\n                           silence_level=2).sequence(1)\n    exp = np.array([1., 2., 1., 2.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_coord_sequence_from_rect_grid():\n    res = Grid.coord_sequence_from_rect_grid(space_grid=np.array([[0., 5.],\n                                                                  [1., 2.]]))\n    exp = (np.array([0., 0., 5., 5.]), np.array([1., 2., 1., 2.]))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_sequence():\n    res = Grid.SmallTestGrid().sequence(0)\n    exp = np.array([0., 5., 10., 15., 20., 25.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_node_number():\n    res = Grid.SmallTestGrid().node_number(x=(14., 9.))\n    exp = 3\n    assert res == exp\n\n\ndef test_node_coordinates():\n    res = Grid.SmallTestGrid().node_coordinates(3)\n    exp = (15.0, 10.0)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_grid():\n    res = Grid.SmallTestGrid().grid()[\"space\"][0]\n    exp = np.array([0., 5., 10., 15., 20., 25.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = Grid.SmallTestGrid().grid()[\"space\"][1]\n    exp = np.array([2.5, 5., 7.5, 10., 12.5, 15.], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_grid_size():\n    res = Grid.SmallTestGrid().print_grid_size()\n    exp = '     space    time\\n         6      10'\n    assert res == exp\n\n\ndef test_geometric_distance_distribution():\n    res = Grid.SmallTestGrid().geometric_distance_distribution(3)[0]\n    exp = np.array([0.3333, 0.4667, 0.2])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = Grid.SmallTestGrid().geometric_distance_distribution(3)[1]\n    exp = np.array([0., 9.317, 18.6339, 27.9509])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_euclidean_distance():\n    res = Grid.SmallTestGrid().euclidean_distance().round(2)\n    exp = np.array([[0., 5.59, 11.18, 16.77, 22.36, 27.95],\n                    [5.59, 0., 5.59, 11.18, 16.77, 22.36],\n                    [11.18, 5.59, 0., 5.59, 11.18, 16.77],\n                    [16.77, 11.18, 5.59, 0., 5.59, 11.18],\n                    [22.36, 16.77, 11.18, 5.59, 0., 5.59],\n                    [27.95, 22.36, 16.77, 11.18, 5.59, 0.]], dtype=np.float32)\n    assert (res == exp).all()\n"
  },
  {
    "path": "tests/test_core/test_interacting_networks.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nSimple tests for the InteractingNetworks class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.core.interacting_networks import InteractingNetworks\n\n\ndef test_RandomlyRewireCrossLinks():\n    net = InteractingNetworks.SmallTestNetwork()\n    rewired_net = net.RandomlyRewireCrossLinks(network=net,\n                                               node_list1=[0, 3, 5],\n                                               node_list2=[1, 2, 4], swaps=10.)\n\n    res = rewired_net.degree()\n    exp = [3, 3, 2, 2, 3, 1]\n    assert (res == exp).all()\n\n    res = rewired_net.cross_degree(node_list1=[0, 3, 5], node_list2=[1, 2, 4])\n    exp = [1, 1, 0]\n    assert (res == exp).all()\n\n\ndef test_internal_adjacency():\n    net = InteractingNetworks.SmallTestNetwork()\n    res = net.internal_adjacency([0, 3, 5])\n    exp = np.array([[0, 1, 1], [1, 0, 0], [1, 0, 0]], dtype=np.int8)\n    assert (res == exp).all()\n\n    res = net.internal_adjacency([1, 2, 4])\n    exp = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]], dtype=np.int8)\n    assert (res == exp).all()\n\n\ndef test_cross_adjacency():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_adjacency([1, 2, 4], [0, 3, 5])\n    exp = np.array([[0, 1, 0], [0, 0, 0], [1, 0, 0]])\n    assert (res == exp).all()\n\n    res = net.cross_adjacency([1, 2, 3, 4], [0, 5])\n    exp = np.array([[0, 0], [0, 0], [1, 0], [1, 0]])\n    assert (res == exp).all()\n\n\ndef test_cross_adjacency_sparse():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_adjacency_sparse([1, 2, 4], [0, 3, 5])\n    exp = [[0, 1, 0], [0, 0, 0], [1, 0, 0]]\n    assert (res == exp).all()\n\n\ndef test_internal_link_attribute():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.internal_link_attribute(\"link_weights\", [1, 2, 3])\n    exp = np.array([[0., 2.3, 2.9],\n                    [2.3, 0., 0.],\n                    [2.9, 0., 0.]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cross_link_attribute():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_link_attribute(\"link_weights\", [1, 2, 3], [0, 4])\n    exp = np.array([[0., 2.7],\n                    [0., 1.5],\n                    [1.3, 0.]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_internal_path_lengths():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.internal_path_lengths([0, 3, 5], None)\n    exp = np.array([[0., 1., 1.], [1., 0., 2.], [1., 2., 0.]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.internal_path_lengths([1, 2, 4], None)\n    exp = np.array([[0., 1., 1.], [1., 0., 1.], [1., 1., 0.]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cross_path_lengths():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_path_lengths([0, 3, 5], [1, 2, 4], None)\n    exp = np.array([[2., 2., 1.], [1., 2., 2.], [3., 3., 2.]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.cross_path_lengths([0, 5], [1, 2, 3, 4], None)\n    exp = np.array([[2., 2., 1., 1.], [3., 3., 2., 2.]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_number_cross_links():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.number_cross_links([0, 3, 5], [1, 2, 4])\n    exp = 2\n    assert res == exp\n\n    res = net.number_cross_links([0, 5], [1, 2, 3, 4])\n    exp = 2\n    assert res == exp\n\n\ndef test_total_cross_degree():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.total_cross_degree([0, 3, 5], [1, 2, 4])\n    exp = 0.6667\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.total_cross_degree([0, 5], [1, 2, 3, 4])\n    exp = 1.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_number_internal_links():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.number_internal_links([0, 3, 5])\n    exp = 2\n    assert res == exp\n\n    res = net.number_internal_links([1, 2, 4])\n    exp = 3\n    assert res == exp\n\n\ndef test_cross_degree_density():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_degree_density([0, 3, 5], [1, 2, 4])\n    exp = np.array([0.33333333, 0.33333333, 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cross_link_density():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_link_density([0, 3, 5], [1, 2, 4])\n    exp = 0.2222\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_link_density([0, 5], [1, 2, 3, 4])\n    exp = 0.25\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_internal_link_density():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.internal_link_density([0, 3, 5])\n    exp = 0.6667\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.internal_link_density([1, 2, 3, 4])\n    exp = 0.6667\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_internal_global_clustering():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.internal_global_clustering([0, 3, 5])\n    exp = 0.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.internal_global_clustering([1, 2, 4])\n    exp = 0.5556\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_cross_global_clustering():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_global_clustering([0, 3, 5], [1, 2, 4])\n    exp = 0.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_global_clustering([2], [1, 3, 4])\n    exp = 1.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_global_clustering([3, 4], [1, 2])\n    exp = 0.5\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_cross_global_clustering_sparse():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_global_clustering_sparse([0, 3, 5], [1, 2, 4])\n    exp = 0.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_global_clustering_sparse([2], [1, 3, 4])\n    exp = 1.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_global_clustering_sparse([3, 4], [1, 2])\n    exp = 0.5\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_cross_transitivity():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_transitivity([0, 3, 5], [1, 2, 4])\n    exp = 0.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_transitivity([2], [1, 3, 4])\n    exp = 1.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_transitivity([3, 4], [1, 2])\n    exp = 1.0\n\n\ndef test_cross_transitivity_sparse():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_transitivity_sparse([0, 3, 5], [1, 2, 4])\n    exp = 0.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_transitivity_sparse([2], [1, 3, 4])\n    exp = 1.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_transitivity_sparse([3, 4], [1, 2])\n    exp = 1.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_cross_average_path_length():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_average_path_length([0, 3, 5], [1, 2, 4], None)\n    exp = 2.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.cross_average_path_length([0, 5], [1, 2, 3, 4], None)\n    exp = 2.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_internal_average_path_length():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.internal_average_path_length([0, 3, 5], None)\n    exp = 1.3333\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.internal_average_path_length([1, 2, 4], None)\n    exp = 1.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_average_cross_closeness():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.average_cross_closeness([0, 5], [1, 2, 3, 4])\n    exp = 0.5333\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_global_efficiency():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.global_efficiency([0, 5], [1, 2, 3, 4])\n    exp = 1.7143\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_cross_degree():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_degree([0, 3, 5], [1, 2, 4])\n    exp = np.array([1, 1, 0])\n    assert (res == exp).all()\n\n    res = net.cross_degree([1, 2, 4], [0, 3, 5])\n    exp = np.array([1, 0, 1])\n    assert (res == exp).all()\n\n    res = net.cross_degree([1, 2, 3, 4], [0, 5])\n    exp = np.array([0, 0, 1, 1])\n    assert (res == exp).all()\n\n\ndef test_cross_indegree():\n    net = InteractingNetworks.SmallDirectedTestNetwork()\n\n    res = net.cross_indegree([1, 2], [0, 3, 4])\n    exp = np.array([2, 1])\n    assert (res == exp).all()\n\n\ndef test_cross_outdegree():\n    net = InteractingNetworks.SmallDirectedTestNetwork()\n\n    res = net.cross_outdegree([1, 2], [0, 3, 4])\n    exp = np.array([1, 0])\n    assert (res == exp).all()\n\n\ndef test_internal_degree():\n    net = InteractingNetworks.SmallDirectedTestNetwork()\n\n    res = net.internal_degree([0, 3, 5])\n    exp = np.array([2, 1, 1])\n    assert (res == exp).all()\n\n    res = net.internal_degree([1, 2, 4])\n    exp = np.array([2, 2, 2])\n    assert (res == exp).all()\n\n\ndef test_internal_indegree():\n    net = InteractingNetworks.SmallDirectedTestNetwork()\n\n    res = net.internal_indegree([0, 1, 3])\n    exp = np.array([0, 2, 1])\n    assert (res == exp).all()\n\n\ndef test_internal_outdegree():\n    net = InteractingNetworks.SmallDirectedTestNetwork()\n\n    res = net.internal_outdegree([0, 1, 3])\n    exp = np.array([2, 0, 1])\n    assert (res == exp).all()\n\n\ndef test_cross_local_clustering():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_local_clustering([0, 3, 5], [1, 2, 4])\n    exp = np.array([0., 0., 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.cross_local_clustering([2], [1, 3, 4])\n    exp = np.array([1.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.cross_local_clustering([3, 4], [1, 2])\n    exp = np.array([0., 1.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cross_local_clustering_sparse():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_local_clustering_sparse([0, 3, 5], [1, 2, 4])\n    exp = np.array([0., 0., 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.cross_local_clustering_sparse([2], [1, 3, 4])\n    exp = np.array([1.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.cross_local_clustering_sparse([3, 4], [1, 2])\n    exp = np.array([0., 1.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cross_closeness():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_closeness([0, 3, 5], [1, 2, 4], None)\n    exp = np.array([0.6, 0.6, 0.375])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.cross_closeness([0, 5], [1, 2, 3, 4], None)\n    exp = np.array([0.66666667, 0.4])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_internal_closeness():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.internal_closeness([0, 3, 5], None)\n    exp = np.array([1., 0.66666667, 0.66666667])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.internal_closeness([1, 2, 4], None)\n    exp = np.array([1., 1., 1.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cross_betweenness():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.cross_betweenness([2], [3, 5])\n    exp = np.array([1., 1., 0., 0., 1., 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.cross_betweenness(range(0, 6), range(0, 6))\n    exp = np.array([9., 3., 0., 2., 6., 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_internal_betweenness():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.internal_betweenness(range(0, 6))\n    exp = np.array([9., 3., 0., 2., 6., 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_local_efficiency():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.local_efficiency([0, 5], [1, 2, 3, 4])\n    exp = np.array([0.75, 0.41666667])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_cross_degree():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_cross_degree([0, 1, 2], [3, 4, 5])\n    exp = np.array([4.2, 2.6, 1.4])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.nsi_cross_degree([0, 2, 5], [1, 4])\n    exp = np.array([1.4, 2.2, 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_cross_mean_degree():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_cross_mean_degree([0, 1, 2], [3, 4, 5])\n    exp = 2.5\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.nsi_cross_mean_degree([0, 2, 5], [1, 4])\n    exp = 0.95\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_internal_degree():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_internal_degree([0, 3, 5])\n    exp = np.array([3.4, 1.8, 2.2])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.nsi_internal_degree([0, 1, 3, 5])\n    exp = np.array([3.4, 2., 2.6, 2.2])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_cross_local_clustering():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_cross_local_clustering([0, 1, 2], [3, 4, 5])\n    exp = np.array([0.33786848, 0.50295858, 1.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.nsi_cross_local_clustering([0, 2, 5], [1, 4])\n    exp = np.array([1., 1., 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_cross_closeness_centrality():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_cross_closeness_centrality([0, 1, 2], [3, 4, 5])\n    exp = np.array([1., 0.56756757, 0.48837209])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.nsi_cross_closeness_centrality([0, 2, 5], [1, 4])\n    exp = np.array([0.73333333, 1., 0.42307692])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_internal_closeness_centrality():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_internal_closeness_centrality([0, 3, 5])\n    exp = np.array([1., 0.68, 0.73913043])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.nsi_internal_closeness_centrality([0, 1, 3, 5])\n    exp = np.array([0.84, 0.525, 0.72413793, 0.6])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_cross_global_clustering():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_cross_global_clustering([0, 1, 2], [3, 4, 5])\n    exp = 0.6688\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_internal_local_clustering():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_internal_local_clustering([1, 2, 3, 5])\n    exp = np.array([0.73333333, 1., 1., 1.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.nsi_internal_local_clustering([0, 2, 4])\n    exp = np.array([1., 1., 0.86666667])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_cross_betweenness():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_cross_betweenness([0, 4, 5], [1, 3])\n    exp = np.array([6.5333, 1.2, 0., 0.6769, 0.6769, 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.nsi_cross_betweenness([0, 1], [2, 3, 4, 5])\n    exp = np.array([2.1333, 0., 0., 0.4923, 0.9209, 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_cross_edge_density():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_cross_edge_density([1, 2, 3], [0, 5])\n    exp = 0.1091\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.nsi_cross_edge_density([0], [1, 4, 5])\n    exp = 0.7895\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_cross_transitivity():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_cross_transitivity([1, 2], [0, 3, 4, 5])\n    exp = 0.6352\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.nsi_cross_transitivity([0, 2, 3], [1])\n    exp = 1.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_nsi_cross_average_path_length():\n    net = InteractingNetworks.SmallTestNetwork()\n\n    res = net.nsi_cross_average_path_length([0, 5], [1, 2, 4])\n    exp = 3.3306\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.nsi_cross_average_path_length([1, 3, 4, 5], [2])\n    exp = 0.376\n    assert np.isclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_core/test_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nSimple tests for the Network class.\n\"\"\"\n\nfrom functools import partial\nfrom itertools import islice, product, repeat\nfrom multiprocessing import get_context, cpu_count\n\nimport pytest\nimport numpy as np\nimport scipy.sparse as sp\n\nfrom pyunicorn import Network\nfrom pyunicorn.core.network import r\n\n\n# -----------------------------------------------------------------------------\n# utilities\n# -----------------------------------------------------------------------------\n\n\ndef compare_results(desired, actual, rev_perm=None):\n    assert type(desired) is type(actual)\n    if isinstance(desired, dict):\n        _ = [compare_results(*rs, rev_perm=rev_perm)\n             for rs in zip(desired.values(), actual.values())]\n    else:\n        if sp.issparse(desired):\n            desired, actual = desired.toarray(), actual.toarray()\n        if isinstance(desired, np.ndarray):\n            actual = actual[rev_perm]\n            if len(actual.shape) == 2:\n                actual = actual[:, rev_perm]\n        assert np.allclose(desired, actual, atol=1e-06)\n\n\ndef compare_measures(orig, pnets, rev_perms, tasks):\n    for (measure, i) in tasks:\n        method, args = (measure, ()) if isinstance(measure, str) else measure\n        compare_results(getattr(orig, method)(*args),\n                        getattr(pnets[i], method)(*args), rev_perms[i])\n\n\ndef compare_permutations(net, permutations, measures):\n    pnets, rev_perms = zip(\n        *((net.permuted_copy(p), p.argsort()) for p in\n          map(np.random.permutation, repeat(net.N, permutations))))\n    tasks = list(product(measures, range(permutations)))\n    # attributes created by `@Cached.method` prevent serialisation\n    net.cache_clear()\n    cores = cpu_count()\n    with get_context(\"spawn\").Pool() as pool:\n        pool.map(partial(compare_measures, net, pnets, rev_perms),\n                 (list(islice(tasks, c, None, cores)) for c in range(cores)))\n        pool.close()\n        pool.join()\n\n\ndef compare_nsi(net, nsi_measures):\n    net_copies = [net.splitted_copy(node=i) for i in range(net.N)]\n    for nsi_measure in nsi_measures:\n        if isinstance(nsi_measure, tuple):\n            kwargs = nsi_measure[1]\n            nsi_measure = nsi_measure[0]\n        else:\n            kwargs = {}\n        print(nsi_measure)\n        for i, netc in enumerate(net_copies):\n            # test for invariance of old nodes\n            assert np.allclose(getattr(netc, nsi_measure)(**kwargs)[0:net.N],\n                               getattr(net, nsi_measure)(**kwargs))\n            # test for invariance of origianl and new splitted node\n            assert np.allclose(getattr(netc, nsi_measure)(**kwargs)[i],\n                               getattr(netc, nsi_measure)(**kwargs)[-1])\n\n\n# -----------------------------------------------------------------------------\n# stability\n# -----------------------------------------------------------------------------\n\n\ndef test_int_overflow():\n    \"\"\"\n    Avoid integer overflow in scipy.sparse representation.\n    \"\"\"\n    for n in [10, 200, 2000, 33000]:\n        adj = sp.lil_matrix((n, n), dtype=np.int8)\n        adj[0, 1:] = 1\n        deg = Network(adjacency=adj).degree()\n        assert (deg.min(), deg.max()) == (0, n - 1)\n\n\n# -----------------------------------------------------------------------------\n# consistency\n# -----------------------------------------------------------------------------\n\n\ndef test_permutations():\n    \"\"\"\n    Permutation invariance of topological information.\n    \"\"\"\n    compare_permutations(\n        Network.SmallTestNetwork(), 3, [\n            \"degree\", \"indegree\", \"outdegree\", \"nsi_degree\", \"nsi_indegree\",\n            \"nsi_outdegree\", \"nsi_average_neighbors_degree\",\n            \"nsi_max_neighbors_degree\", \"undirected_adjacency\", \"laplacian\",\n            \"nsi_laplacian\", \"local_clustering\", \"global_clustering\",\n            \"transitivity\", (\"higher_order_transitivity\", [4]),\n            (\"local_cliquishness\", [4]), (\"local_cliquishness\", [5]),\n            \"nsi_twinness\", \"assortativity\", \"nsi_local_clustering\",\n            \"nsi_global_clustering\", \"nsi_transitivity\",\n            \"nsi_local_soffer_clustering\", \"path_lengths\",\n            \"average_path_length\", \"nsi_average_path_length\", \"diameter\",\n            \"matching_index\", \"link_betweenness\", \"betweenness\",\n            \"eigenvector_centrality\", \"nsi_eigenvector_centrality\", \"pagerank\",\n            \"closeness\", \"nsi_closeness\", \"nsi_harmonic_closeness\",\n            \"nsi_exponential_closeness\", \"arenas_betweenness\",\n            \"nsi_arenas_betweenness\", \"newman_betweenness\",\n            \"nsi_newman_betweenness\", \"global_efficiency\",\n            \"nsi_global_efficiency\", \"distance_based_measures\",\n            \"local_vulnerability\", \"coreness\", \"msf_synchronizability\",\n            \"spreading\", \"nsi_spreading\"\n        ])\n\n\ndef test_nsi():\n    \"\"\"\n    Consistency of nsi measures with splitted network copies\n    \"\"\"\n    dnw = Network.SmallDirectedTestNetwork()\n    nw = Network.SmallTestNetwork()\n\n    nsi_measures = [\"nsi_degree\", \"nsi_indegree\", \"nsi_outdegree\",\n                    \"nsi_closeness\", \"nsi_harmonic_closeness\",\n                    \"nsi_exponential_closeness\", \"nsi_arenas_betweenness\",\n                    \"nsi_betweenness\", \"nsi_spreading\",\n                    \"nsi_local_cyclemotif_clustering\",\n                    \"nsi_local_midmotif_clustering\",\n                    \"nsi_local_inmotif_clustering\",\n                    \"nsi_local_outmotif_clustering\",\n                    (\"nsi_degree\", {\"link_attribute\": \"link_weights\"}),\n                    (\"nsi_indegree\", {\"link_attribute\": \"link_weights\"}),\n                    (\"nsi_outdegree\", {\"link_attribute\": \"link_weights\"}),\n                    (\"nsi_local_cyclemotif_clustering\",\n                     {\"link_attribute\": \"link_weights\"}),\n                    (\"nsi_local_midmotif_clustering\",\n                     {\"link_attribute\": \"link_weights\"}),\n                    (\"nsi_local_inmotif_clustering\",\n                     {\"link_attribute\": \"link_weights\"}),\n                    (\"nsi_local_outmotif_clustering\",\n                     {\"link_attribute\": \"link_weights\"})]\n\n    nsi_undirected_measures = [\"nsi_local_clustering\",\n                               \"nsi_average_neighbors_degree\",\n                               \"nsi_max_neighbors_degree\",\n                               \"nsi_eigenvector_centrality\",\n                               \"nsi_local_clustering\",\n                               \"nsi_local_soffer_clustering\",\n                               \"nsi_newman_betweenness\"]\n\n    compare_nsi(dnw, nsi_measures)\n    compare_nsi(nw, nsi_measures + nsi_undirected_measures)\n\n\n# -----------------------------------------------------------------------------\n# test doctest helpers\n# -----------------------------------------------------------------------------\n\n\ndef test_r():\n    arr = np.random.rand(3, 3)\n    assert r(arr).dtype == np.float64\n\n\ndef test_r_type_error():\n    arr = np.array(['one', 'two', 'three'])\n    with pytest.raises(TypeError, match='obj is of unsupported dtype kind.'):\n        r(arr)\n\n\n# -----------------------------------------------------------------------------\n# Class member tests with TestNetwork\n# -----------------------------------------------------------------------------\n\n\ndef test_init():\n    Network(adjacency=[[0, 1, 0, 0, 0, 0], [1, 0, 1, 0, 0, 1],\n                       [0, 1, 0, 1, 1, 0], [0, 0, 1, 0, 1, 0],\n                       [0, 0, 1, 1, 0, 1], [0, 1, 0, 0, 1, 0]])\n    assert True\n\n\ndef test_str(capsys):\n    print(Network.SmallTestNetwork())\n    out = capsys.readouterr()[0]\n    out_ref = \"Network: undirected, 6 nodes, 7 links, link density 0.467.\\n\"\n    assert out == out_ref\n\n\ndef test_len():\n    assert np.allclose(len(Network.SmallTestNetwork()), 6)\n\n\ndef test_undirected_copy(capsys):\n    net = Network(adjacency=[[0, 1], [0, 0]], directed=True)\n\n    print(net)\n    out1 = capsys.readouterr()[0]\n    out1_ref = \"Network: directed, 2 nodes, 1 links, link density 0.500.\\n\"\n    assert out1 == out1_ref\n\n    print(net.undirected_copy())\n    out2 = capsys.readouterr()[0]\n    out2_ref = \"Network: undirected, 2 nodes, 1 links, link density 1.000.\\n\"\n    assert out2 == out2_ref\n\n\ndef test_splitted_copy(capsys):\n    net = Network.SmallTestNetwork()\n    net2 = net.splitted_copy(node=5, proportion=0.2)\n    print(net2)\n    out = capsys.readouterr()[0]\n    out_ref = \"Network: undirected, 7 nodes, 9 links, link density 0.429.\\n\"\n    assert out == out_ref\n\n    nw1_ref = [1.5, 1.7, 1.9, 2.1, 2.3, 2.5]\n    nw2_ref = [1.5, 1.7, 1.9, 2.1, 2.3, 2., 0.5]\n\n    assert np.allclose(net.node_weights, nw1_ref)\n    assert np.allclose(net2.node_weights, nw2_ref)\n\n\ndef test_adjacency():\n    adj_ref = np.array([[0, 0, 0, 1, 1, 1], [0, 0, 1, 1, 1, 0],\n                        [0, 1, 0, 0, 1, 0], [1, 1, 0, 0, 0, 0],\n                        [1, 1, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0]])\n    assert np.array_equal(Network.SmallTestNetwork().adjacency, adj_ref)\n\n\ndef test_set_adjacency(capsys):\n    net = Network.SmallTestNetwork()\n    net.adjacency = [[0, 1], [1, 0]]\n    print(net)\n    out = capsys.readouterr()[0]\n    out_ref = \"Network: undirected, 2 nodes, 1 links, link density 1.000.\\n\"\n    assert out == out_ref\n\n\ndef test_set_node_weights():\n    net = Network.SmallTestNetwork()\n    nw_ref = [1.5, 1.7, 1.9, 2.1, 2.3, 2.5]\n    assert np.allclose(net.node_weights, nw_ref)\n\n    net.node_weights = [1, 1, 1, 1, 1, 1]\n    nw_ref = [1., 1., 1., 1., 1., 1.]\n    assert np.allclose(net.node_weights, nw_ref)\n\n\ndef test_ErdosRenyi(capsys):\n    print(Network.Model(\"ErdosRenyi\", n_nodes=10, n_links=18))\n    out = capsys.readouterr()[0]\n    out_ref = \"Generating Erdos-Renyi random graph with 10 \" + \\\n              \"nodes and 18 links...\\n\" + \\\n              \"Network: undirected, 10 nodes, 18 links, link density 0.400.\\n\"\n    assert out == out_ref\n\n\ndef test_BarabasiAlbert_igraph():\n    net = Network.Model(\"BarabasiAlbert_igraph\", n_nodes=100, n_links_each=1)\n    assert np.allclose(net.link_density, 0.02)\n\n\ndef test_BarabasiAlbert():\n    net = Network.Model(\"BarabasiAlbert\", n_nodes=100, n_links_each=1)\n    assert np.allclose(net.link_density, 0.02)\n\n\ndef test_ConfigurationModel():\n    net = Network.Model(\"Configuration\", degree=[3 for _ in range(0, 1000)])\n    assert int(round(net.degree().mean())) == 3\n\n\ndef test_WattsStrogatz():\n    net = Network.Model(\"WattsStrogatz\", N=100, k=2, p=0.1)\n    assert int(round(net.degree().mean())) == 4\n\n\ndef test_GrowWeights():\n    n_nodes = 10\n    weights = Network.GrowWeights(n_nodes=n_nodes)\n    assert len(weights) == n_nodes\n\n\ndef test_randomly_rewire(capsys):\n    net = Network.SmallTestNetwork()\n    net.randomly_rewire(iterations=10)\n    out = capsys.readouterr()[0]\n    out_ref = \"Randomly rewiring the network,preserving \" + \\\n              \"the degree sequence...\\n\"\n    assert out == out_ref\n    print(net)\n    out = capsys.readouterr()[0]\n    out_ref = \"Network: undirected, 6 nodes, 7 links, link density 0.467.\\n\"\n    assert out == out_ref\n\n\ndef test_edge_list():\n    edges = Network.SmallTestNetwork().edge_list()[:8]\n    edges_ref = [[0, 3], [0, 4], [0, 5], [1, 2],\n                 [1, 3], [1, 4], [2, 1], [2, 4]]\n    assert np.array_equal(edges, edges_ref)\n\n\ndef test_undirected_adjacency():\n    net = Network(adjacency=[[0, 1], [0, 0]], directed=True)\n    adj_ref = [[0, 1], [1, 0]]\n    assert np.array_equal(net.undirected_adjacency().toarray(), adj_ref)\n\n\ndef test_laplacian():\n    lap_ref = np.array([[3, 0, 0, -1, -1, -1], [0, 3, -1, -1, -1, 0],\n                        [0, -1, 2, 0, -1, 0], [-1, -1, 0, 2, 0, 0],\n                        [-1, -1, -1, 0, 3, 0], [-1, 0, 0, 0, 0, 1]])\n    assert np.allclose(Network.SmallTestNetwork().laplacian(), lap_ref)\n\n\ndef test_laplacian_value_error():\n    with pytest.raises(ValueError, match='direction must be \"in\" or \"out\".'):\n        Network.SmallDirectedTestNetwork().laplacian(direction='some_other')\n\n\ndef test_nsi_laplacian():\n    nsi_lap_ref = np.array([[6.9, 0., 0., -2.1, -2.3, -2.5],\n                            [0., 6.3, -1.9, -2.1, -2.3, 0.],\n                            [0., -1.7, 4., 0., -2.3, 0.],\n                            [-1.5, -1.7, 0., 3.2, 0., 0.],\n                            [-1.5, -1.7, -1.9, 0., 5.1, 0.],\n                            [-1.5, 0., 0., 0., 0., 1.5]])\n    assert np.allclose(Network.SmallTestNetwork().nsi_laplacian(), nsi_lap_ref)\n\n\ndef test_degree():\n    deg = Network.SmallTestNetwork().degree()\n    deg_ref = np.array([3, 3, 2, 2, 3, 1])\n    assert (deg == deg_ref).all()\n\n\n@pytest.mark.parametrize(\n    \"link_attribute, deg_ref\",\n    [(None, np.array([2, 2, 2, 1, 1, 0])),\n     (\"link_weights\", np.array([3.6, 4.3, 4.6, 2.5, 1., 0.]))]\n)\ndef test_indegree(link_attribute, deg_ref):\n    deg = Network.SmallDirectedTestNetwork()\\\n        .indegree(link_attribute=link_attribute)\n    assert np.allclose(deg, deg_ref)\n\n\n@pytest.mark.parametrize(\n    \"link_attribute, deg_ref\",\n    [(None, np.array([2, 2, 0, 1, 2, 1])),\n     (\"link_weights\", np.array([3.8, 2.9, 0., 3., 4.8, 1.5]))]\n)\ndef test_outdegree(link_attribute, deg_ref):\n    deg = Network.SmallDirectedTestNetwork()\\\n        .outdegree(link_attribute=link_attribute)\n    assert np.allclose(deg, deg_ref)\n\n\n@pytest.mark.parametrize(\n    \"link_attribute, deg_ref\",\n    [(None, np.array([0, 0, 0, 0, 0, 0], dtype=np.int16)),\n     (\"link_weights\", np.array([0, 0, 0, 0, 0, 0], dtype=np.int16))]\n)\ndef test_bildegree(link_attribute, deg_ref):\n    deg = Network.SmallDirectedTestNetwork()\\\n        .bildegree(link_attribute=link_attribute)\n    assert (deg == deg_ref).all()\n\n    net = Network.SmallTestNetwork()\n    assert (net.bildegree() == net.degree()).all()\n\n\ndef test_nsi_degree():\n    net = Network.SmallTestNetwork()\n\n    deg_ref = np.array([8.4, 8., 5.9, 5.3, 7.4, 4.])\n    assert np.allclose(net.nsi_degree(), deg_ref)\n\n    deg_ref = np.array([8.4, 8., 5.9, 5.3, 7.4, 4., 4.])\n    assert np.allclose(net.splitted_copy().nsi_degree(), deg_ref)\n\n    deg_ref = np.array([3.2, 3., 1.95, 1.65, 2.7, 1.])\n    assert np.allclose(net.nsi_degree(typical_weight=2.0), deg_ref)\n\n    deg_ref = np.array([3.2, 3., 1.95, 1.65, 2.7, 1., 1.])\n    assert np.allclose(net.splitted_copy().nsi_degree(typical_weight=2.0),\n                       deg_ref)\n\n\n@pytest.mark.parametrize(\"tw, exp, exp_split\", [\n    (None,\n     np.array([6.3, 5.3, 5.9, 3.6, 4., 2.5]),\n     np.array([6.3, 5.3, 5.9, 3.6, 4., 2.5, 2.5])),\n    (2.,\n     np.array([2.15, 1.65, 1.95, 0.8, 1., 0.25]),\n     np.array([2.15, 1.65, 1.95, 0.8, 1., 0.25, 0.25]))\n    ])\ndef test_nsi_indegree(tw, exp, exp_split):\n    net = Network.SmallDirectedTestNetwork()\n    assert np.allclose(net.nsi_indegree(typical_weight=tw), exp)\n    assert np.allclose(\n        net.splitted_copy().nsi_indegree(typical_weight=tw), exp_split)\n\n\n@pytest.mark.parametrize(\"tw, exp, exp_split\", [\n    (None,\n     np.array([5.3, 5.9, 1.9, 3.8, 5.7, 4.]),\n     np.array([5.3, 5.9, 1.9, 3.8, 5.7, 4., 4.])),\n    (2.,\n     np.array([1.65, 1.95, -0.05, 0.9, 1.85, 1.]),\n     np.array([1.65, 1.95, -0.05, 0.9, 1.85, 1., 1.]))\n    ])\ndef test_nsi_outdegree(tw, exp, exp_split):\n    net = Network.SmallDirectedTestNetwork()\n    assert np.allclose(net.nsi_outdegree(typical_weight=tw), exp)\n    assert np.allclose(net.splitted_copy().nsi_outdegree(typical_weight=tw),\n                       exp_split)\n\n\n@pytest.mark.parametrize(\"tw, exp, exp_split\", [\n    (None,\n     np.array([1.5, 1.7, 1.9, 2.1, 2.3, 2.5]),\n     np.array([1.5, 1.7, 1.9, 2.1, 2.3, 2.5, 2.5])),\n    (2.,\n     np.array([-0.25, -0.15, -0.05,  0.05,  0.15,  0.25]),\n     np.array([-0.25, -0.15, -0.05,  0.05,  0.15,  0.25,  0.25]))\n    ])\ndef test_nsi_bildegree(tw, exp, exp_split):\n    net = Network.SmallDirectedTestNetwork()\n    assert np.allclose(net.nsi_bildegree(typical_weight=tw), exp)\n    assert np.allclose(net.splitted_copy().nsi_bildegree(typical_weight=tw),\n                       exp_split)\n\n\ndef test_degree_distribution():\n    dist = Network.SmallTestNetwork().degree_distribution()\n    dist_ref = np.array([0.16666667, 0.33333333, 0.5])\n    assert np.allclose(dist, dist_ref)\n\n\ndef test_indegree_distribution():\n    dist = Network.SmallTestNetwork().indegree_distribution()\n    dist_ref = np.array([0.16666667, 0.33333333, 0.5])\n    assert np.allclose(dist, dist_ref)\n\n\ndef test_outdegree_distribution():\n    dist = Network.SmallTestNetwork().outdegree_distribution()\n    dist_ref = np.array([0.16666667, 0., 0.33333333, 0.5])\n    assert np.allclose(dist, dist_ref)\n\n\ndef test_degree_cdf():\n    cdf_ref = np.array([1., 0.83333333, 0.5])\n    assert np.allclose(Network.SmallTestNetwork().degree_cdf(), cdf_ref)\n\n\ndef test_indegree_cdf():\n    cdf_ref = np.array([1., 0.83333333, 0.83333333, 0.5])\n    assert np.allclose(Network.SmallTestNetwork().indegree_cdf(), cdf_ref)\n\n\ndef test_outdegree_cdf():\n    cdf_ref = np.array([1., 0.83333333, 0.83333333, 0.5])\n    assert np.allclose(Network.SmallTestNetwork().outdegree_cdf(), cdf_ref)\n\n\ndef test_nsi_degree_histogram():\n    hist = Network.SmallTestNetwork().nsi_degree_histogram()\n    hist_ref = (np.array([0.33333333, 0.16666667, 0.5]),\n                np.array([0.11785113, 0.16666667, 0.09622504]),\n                np.array([4., 5.46666667, 6.93333333]))\n    assert np.allclose(hist, hist_ref)\n\n\ndef test_nsi_degree_cumulative_histogram():\n    res = Network.SmallTestNetwork().nsi_degree_cumulative_histogram()\n    exp = (np.array([1., 0.66666667, 0.5]),\n           np.array([4., 5.46666667, 6.93333333]))\n    assert np.allclose(res, exp)\n\n\ndef test_average_neighbors_degree():\n    res = Network.SmallTestNetwork().average_neighbors_degree()\n    exp = np.array([2., 2.33333333, 3., 3., 2.66666667, 3.])\n    assert np.allclose(res, exp)\n\n\ndef test_max_neighbors_degree():\n    res = Network.SmallTestNetwork().max_neighbors_degree()\n    exp = np.array([3, 3, 3, 3, 3, 3])\n    assert (res == exp).all()\n\n\ndef test_nsi_average_neighbors_degree():\n    net = Network.SmallTestNetwork()\n\n    res = net.nsi_average_neighbors_degree()\n    exp = np.array([6.0417, 6.62, 7.0898, 7.0434, 7.3554, 5.65])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_average_neighbors_degree()\n    exp = np.array([6.0417, 6.62, 7.0898, 7.0434, 7.3554, 5.65, 5.65])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_max_neighbors_degree():\n    res = Network.SmallTestNetwork().nsi_max_neighbors_degree()\n    exp = np.array([8.4, 8., 8., 8.4, 8.4, 8.4])\n    assert np.allclose(res, exp)\n\n\ndef test_local_clustering():\n    res = Network.SmallTestNetwork().local_clustering()\n    exp = np.array([0., 0.33333333, 1., 0., 0.33333333, 0.])\n    assert np.allclose(res, exp)\n\n\ndef test_global_clustering():\n    res = Network.SmallTestNetwork().global_clustering()\n    exp = 0.27777777\n    assert np.allclose(res, exp)\n\n\ndef test_local_cyclemotif_clustering():\n    res = Network.SmallDirectedTestNetwork().local_cyclemotif_clustering()\n    exp = np.array([0.25, 0.25, 0., 0., 0.5, 0.])\n    assert np.allclose(res, exp)\n\n\ndef test_local_midmotif_clustering():\n    res = Network.SmallDirectedTestNetwork().local_midmotif_clustering()\n    exp = np.array([0., 0., 0., 1., 0.5, 0.])\n    assert np.allclose(res, exp)\n\n\ndef test_local_inmotif_clustering():\n    res = Network.SmallDirectedTestNetwork().local_inmotif_clustering()\n    exp = np.array([0., 0.5, 0.5, 0., 0., 0.])\n    assert np.allclose(res, exp)\n\n\ndef test_local_outmotif_clustering():\n    res = Network.SmallDirectedTestNetwork().local_outmotif_clustering()\n    exp = np.array([0.5, 0.5, 0., 0., 0., 0.])\n    assert np.allclose(res, exp)\n\n\n@pytest.mark.parametrize(\"tw, exp, exp_split\", [\n    (None,\n     np.array([0.18448637, 0.20275024, 0.3220339,\n               0.32236842, 0.34385965, 0.625]),\n     np.array([0.18448637, 0.20275024, 0.3220339,\n               0.32236842, 0.34385965, 0.625, 0.20275024])),\n    (2.,\n     np.array([0.3309814,  0.29011913,  0.05236908,\n               -0.0260989,  0.22417582, -0.13636364]),\n     np.array([0.3309814,  0.29011913,  0.05236908,\n               -0.0260989,  0.22417582, -0.13636364,  0.29011913]))\n    ])\ndef test_nsi_local_cyclemotif_clustering(tw, exp, exp_split):\n    net = Network.SmallDirectedTestNetwork()\n    assert np.allclose(net.nsi_local_cyclemotif_clustering(typical_weight=tw),\n                       exp)\n    assert np.allclose(\n        net.splitted_copy(node=1).nsi_local_cyclemotif_clustering(\n            typical_weight=tw),\n        exp_split)\n\n\ndef test_nsi_local_midmotif_clustering():\n    net = Network.SmallDirectedTestNetwork()\n\n    res = net.nsi_local_midmotif_clustering()\n    exp = np.array([0.45372866, 0.51646946, 1., 1., 0.88815789, 1.])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy(node=4).local_midmotif_clustering()\n    exp = np.array([0., 0., 0., 1., 0.8, 0., 0.8])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_local_inmotif_clustering():\n    net = Network.SmallDirectedTestNetwork()\n\n    res = net.nsi_local_inmotif_clustering()\n    exp = np.array([0.52884858, 0.66998932, 0.66934789, 0.75694444, 0.755625,\n                    1.])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy(node=1).nsi_local_inmotif_clustering()\n    exp = np.array([0.52884858, 0.66998932, 0.66934789, 0.75694444, 0.755625,\n                    1., 0.66998932])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_local_outmotif_clustering():\n    net = Network.SmallDirectedTestNetwork()\n\n    res = net.nsi_local_outmotif_clustering()\n    exp = np.array([0.66998932, 0.66934789, 1., 0.75277008, 0.58387196,\n                    0.765625])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy(node=1).nsi_local_outmotif_clustering()\n    exp = np.array([0.66998932, 0.66934789, 1., 0.75277008, 0.58387196,\n                    0.765625, 0.66934789])\n    assert np.allclose(res, exp)\n\n\ndef test_transitivity():\n    res = Network.SmallTestNetwork().transitivity()\n    exp = 0.27272727\n    assert np.allclose(res, exp)\n\n\ndef test_weighted_local_clustering():\n    res = Network.weighted_local_clustering(\n        weighted_A=[[0., 0., 0., 0.55, 0.65, 0.75],\n                    [0., 0., 0.63, 0.77, 0.91, 0.],\n                    [0., 0.63, 0., 0., 1.17, 0.],\n                    [0.55, 0.77, 0., 0., 0., 0.],\n                    [0.65, 0.91, 1.17, 0., 0., 0.],\n                    [0.75, 0., 0., 0., 0., 0.]])\n    exp = np.array([0., 0.21487603, 0.35388889, 0., 0.15384615, 0.])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_twinness():\n    net = Network.SmallDirectedTestNetwork()\n\n    res = net.nsi_twinness()\n    exp = np.array([[0.12931034, 0.45689655, 0., 0.31034483, 0., 0.],\n                    [0., 0.15178571, 0.52678571, 0., 0.35714286, 0.],\n                    [0., 0., 0.24358974, 0., 0., 0.],\n                    [0., 0.33928571, 0., 0.28378378, 0., 0.],\n                    [0.32758621, 0., 0.43298969, 0., 0.2371134, 0.],\n                    [0.34482759, 0., 0., 0., 0., 0.38461538]])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_twinness()\n    exp = np.array([[0.12931034, 0.45689655, 0., 0.31034483, 0., 0., 0.],\n                    [0., 0.15178571, 0.52678571, 0., 0.35714286, 0., 0.],\n                    [0., 0., 0.24358974, 0., 0., 0., 0.],\n                    [0., 0.33928571, 0., 0.28378378, 0., 0., 0.],\n                    [0.32758621, 0., 0.43298969, 0., 0.2371134, 0., 0.],\n                    [0.34482759, 0., 0., 0., 0., 0.38461538, 0.38461538],\n                    [0.34482759, 0., 0., 0., 0., 0.38461538, 0.38461538]])\n    assert np.allclose(res, exp)\n\n\ndef test_assortativity():\n    res = Network.SmallTestNetwork().assortativity()\n    exp = -0.47368421\n    assert np.allclose(res, exp)\n\n\n@pytest.mark.parametrize(\"tw, exp, exp_split\", [\n    (None,\n     np.array([0.55130385, 0.724375, 1., 0.81844073, 0.80277575, 1.]),\n     np.array([0.55130385, 0.724375, 1., 0.81844073, 0.80277575, 1., 1.])),\n    (3.,\n     np.array([-1.44290123, -0.764, 1., 4.16770186, -0.75324675, 1.]),\n     np.array([-1.44290123, -0.764, 1., 4.16770186, -0.75324675, 1., 1.]))\n    ])\ndef test_nsi_local_clustering(tw, exp, exp_split):\n    net = Network.SmallTestNetwork()\n\n    assert np.allclose(net.nsi_local_clustering(typical_weight=tw), exp)\n    assert np.allclose(\n        net.splitted_copy().nsi_local_clustering(typical_weight=tw),\n        exp_split)\n\n\ndef test_nsi_global_clustering():\n    res = Network.SmallTestNetwork().nsi_global_clustering()\n    exp = 0.83529192\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_local_soffer_clustering():\n    net = Network.SmallTestNetwork()\n\n    res = net.nsi_local_soffer_clustering()\n    exp = np.array([0.76650246, 0.87537764, 1., 0.81844073, 0.84685032, 1.])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_local_soffer_clustering()\n    exp = np.array([0.76650246, 0.87537764, 1., 0.81844073, 0.84685032, 1.,\n                    1.])\n    assert np.allclose(res, exp)\n\n\ndef test_path_lengths():\n    res = Network.SmallTestNetwork().path_lengths()\n    exp = np.array([[0., 2., 2., 1., 1., 1.],\n                    [2., 0., 1., 1., 1., 3.],\n                    [2., 1., 0., 2., 1., 3.],\n                    [1., 1., 2., 0., 2., 2.],\n                    [1., 1., 1., 2., 0., 2.],\n                    [1., 3., 3., 2., 2., 0.]])\n    assert np.allclose(res, exp)\n\n\ndef test_average_path_length():\n    res = Network.SmallTestNetwork().average_path_length()\n    exp = 1.66666667\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_average_path_length():\n    net = Network.SmallTestNetwork()\n\n    res = net.nsi_average_path_length()\n    exp = 1.60027778\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_average_path_length()\n    exp = 1.60027778\n    assert np.allclose(res, exp)\n\n\ndef test_diameter():\n    res = Network.SmallTestNetwork().diameter()\n    exp = 3\n    assert np.allclose(res, exp)\n\n\ndef test_matching_index():\n    res = Network.SmallTestNetwork().matching_index()\n    exp = np.array([[1., 0.5, 0.25, 0., 0., 0.],\n                    [0.5, 1., 0.25, 0., 0.2, 0.],\n                    [0.25, 0.25, 1., 0.33333333, 0.25, 0.],\n                    [0., 0., 0.33333333, 1., 0.66666667, 0.5],\n                    [0., 0.2, 0.25, 0.66666667, 1., 0.33333333],\n                    [0., 0., 0., 0.5, 0.33333333, 1.]])\n    assert np.allclose(res, exp)\n\n\ndef test_link_betweenness():\n    res = Network.SmallTestNetwork().link_betweenness()\n    exp = np.array([[0., 0., 0., 3.5, 5.5, 5.],\n                    [0., 0., 2., 3.5, 2.5, 0.],\n                    [0., 2., 0., 0., 3., 0.],\n                    [3.5, 3.5, 0., 0., 0., 0.],\n                    [5.5, 2.5, 3., 0., 0., 0.],\n                    [5., 0., 0., 0., 0., 0.]])\n    assert np.allclose(res, exp)\n\n\ndef test_edge_betweenness():\n    res = Network.SmallTestNetwork().edge_betweenness()\n    exp = np.array([[0., 0., 0., 3.5, 5.5, 5.],\n                    [0., 0., 2., 3.5, 2.5, 0.],\n                    [0., 2., 0., 0., 3., 0.],\n                    [3.5, 3.5, 0., 0., 0., 0.],\n                    [5.5, 2.5, 3., 0., 0., 0.],\n                    [5., 0., 0., 0., 0., 0.]])\n    assert np.allclose(res, exp)\n\n\ndef test_betweenness():\n    net = Network.SmallTestNetwork()\n\n    res = net.betweenness()\n    exp = np.array([4.5, 1.5, 0., 1., 3., 0.])\n    assert np.allclose(res, exp)\n\n    res = res = net.betweenness(link_attribute=\"link_weights\")\n    exp = np.array([5., 1., 0., 2., 2., 0.])\n    assert np.allclose(res, exp)\n\n\ndef test_interregional_betweenness():\n    net = Network.SmallTestNetwork()\n    res = net.interregional_betweenness(sources=[2], targets=[3, 5])\n    exp = np.array([1., 1., 0., 0., 1., 0.])\n    assert np.allclose(res, exp)\n\n    res = net.interregional_betweenness(sources=range(0, 6),\n                                        targets=range(0, 6))\n    exp = np.array([9., 3., 0., 2., 6., 0.])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_interregional_betweenness():\n    res = Network.SmallTestNetwork().nsi_interregional_betweenness(\n        sources=[2], targets=[3, 5])\n    exp = np.array([3.16666689, 2.34705893, 0., 0., 2.06521743, 0.])\n    assert np.allclose(res, exp)\n\n\n@pytest.mark.parametrize(\"parallelize\", [False, True])\ndef test_nsi_betweenness(parallelize):\n    # undirected network\n    res = Network.SmallTestNetwork().nsi_betweenness(parallelize=parallelize)\n    exp = np.array([29.68541738, 7.7128677, 0., 3.09090906, 9.69960462, 0.])\n    assert np.allclose(res, exp)\n    # directed network\n    res = Network.SmallDirectedTestNetwork() \\\n        .nsi_betweenness(parallelize=parallelize)\n    exp = np.array([21.54, 16.92352941, 0., 0., 4.03043478, 0.])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_betweenness_directed():\n    \"\"\"test consistency of pyunicorn and igraph implementations\"\"\"\n    net = Network.SmallDirectedTestNetwork()\n\n    res = net.nsi_betweenness(nsi=False)  # implemented in pyunicorn\n    exp = net.betweenness()  # resorts to igraph\n    assert np.allclose(res, exp)\n\n\ndef test_eigenvector_centrality():\n    res = Network.SmallTestNetwork().eigenvector_centrality()\n    exp = np.array([0.7895106, 0.97303126, 0.77694188, 0.69405519, 1.,\n                    0.31089413])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_eigenvector_centrality():\n    net = Network.SmallTestNetwork()\n\n    res = net.nsi_eigenvector_centrality()\n    exp = np.array([0.80454492, 1., 0.80931481, 0.61787145, 0.98666885,\n                    0.28035747])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_eigenvector_centrality()\n    exp = np.array([0.80454492, 1., 0.80931481, 0.61787145, 0.98666885,\n                    0.28035747, 0.28035747])\n    assert np.allclose(res, exp)\n\n\ndef test_pagerank():\n    res = Network.SmallTestNetwork().pagerank()\n    exp = np.array([0.21836231, 0.20440819, 0.14090543, 0.14478497, 0.20466978,\n                    0.08686932])\n    assert np.allclose(res, exp)\n\n\ndef test_closeness():\n    res = Network.SmallTestNetwork().closeness()\n    exp = np.array([0.71428571, 0.625, 0.55555556, 0.625, 0.71428571,\n                    0.45454545])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_closeness():\n    net = Network.SmallTestNetwork()\n\n    res = net.nsi_closeness()\n    exp = np.array([0.76923077, 0.64864865, 0.58252427, 0.64171123, 0.72289157,\n                    0.50847458])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_closeness()\n    exp = np.array([0.76923077, 0.64864865, 0.58252427, 0.64171123, 0.72289157,\n                    0.50847458, 0.50847458])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_harmonic_closeness():\n    net = Network.SmallTestNetwork()\n\n    res = net.nsi_harmonic_closeness()\n    exp = np.array([0.85, 0.79861111, 0.71111111, 0.72083333, 0.80833333,\n                    0.61666667])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_harmonic_closeness()\n    exp = np.array([0.85, 0.79861111, 0.71111111, 0.72083333, 0.80833333,\n                    0.61666667, 0.61666667])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_exponential_closeness():\n    net = Network.SmallTestNetwork()\n\n    res = net.nsi_exponential_closeness()\n    exp = np.array([0.425, 0.390625, 0.346875, 0.36041667, 0.40416667,\n                    0.29583333])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_exponential_closeness()\n    exp = np.array([0.425, 0.390625, 0.346875, 0.36041667, 0.40416667,\n                    0.29583333, 0.29583333])\n    assert np.allclose(res, exp)\n\n\ndef test_arenas_betweenness():\n    res = Network.SmallTestNetwork().arenas_betweenness()\n    exp = np.array([50.18181818, 50.18181818, 33.45454545, 33.45454545,\n                    50.18181818, 16.72727273])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_arenas_betweenness():\n    net = Network.SmallTestNetwork()\n\n    res = net.nsi_arenas_betweenness()\n    exp = np.array([20.58135241, 29.21033898, 27.00747741, 19.5433536,\n                    25.28490117, 24.84826305])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_arenas_betweenness()\n    exp = np.array([20.58135241, 29.21033898, 27.00747741, 19.5433536,\n                    25.28490117, 24.84826305, 24.84826305])\n    assert np.allclose(res, exp)\n\n    res = net.nsi_arenas_betweenness(exclude_neighbors=False)\n    exp = np.array([44.53512333, 37.40578733, 27.00747741, 21.77360559,\n                    31.32557606, 24.84826305])\n    assert np.allclose(res, exp)\n\n    res = net.nsi_arenas_betweenness(stopping_mode=\"twinness\")\n    exp = np.array([22.61533156, 41.23139296, 38.64105931, 28.61953314,\n                    38.58242175, 30.29941829])\n    assert np.allclose(res, exp)\n\n\ndef test_newman_betweenness():\n    res = Network.SmallTestNetwork().newman_betweenness()\n    exp = np.array([4.1818182, 3.41818185, 2.5090909, 3.0181818, 3.60000002,\n                    2.])\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_newman_betweenness():\n    net = Network.SmallTestNetwork()\n\n    res = net.nsi_newman_betweenness()\n    exp = np.array([0.40476082, 0., 0.85212808, 3.33573728, 1.36618345, 0.])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_newman_betweenness()\n    exp = np.array([0.40476082, 0., 0.85212808, 3.33573728, 1.36618345,\n                    0., 0.])\n    assert np.allclose(res, exp)\n\n    res = net.nsi_newman_betweenness(add_local_ends=True)\n    exp = np.array([131.44476082, 128., 107.64212808, 102.44573728,\n                    124.20618345, 80.])\n    assert np.allclose(res, exp)\n\n    res = net.splitted_copy().nsi_newman_betweenness(add_local_ends=True)\n    exp = np.array([131.44476082, 128., 107.64212808, 102.44573728,\n                    124.20618345, 80., 80.])\n    assert np.allclose(res, exp)\n\n\ndef test_global_efficiency():\n    res = Network.SmallTestNetwork().global_efficiency()\n    exp = 0.71111111\n    assert np.allclose(res, exp)\n\n\ndef test_nsi_global_efficiency():\n    res = Network.SmallTestNetwork().nsi_global_efficiency()\n    exp = 0.74152777\n    assert np.allclose(res, exp)\n\n\ndef test_local_vulnerability():\n    res = Network.SmallTestNetwork().local_vulnerability()\n    exp = np.array([0.296875, 0.0625, -0.03125, -0.0078125, 0.09765625,\n                    -0.125])\n    assert np.allclose(res, exp)\n\n\ndef test_coreness():\n    res = Network.SmallTestNetwork().coreness()\n    exp = np.array([2, 2, 2, 2, 2, 1])\n    assert (res == exp).all()\n\n\ndef test_msf_synchronizability():\n    res = Network.SmallTestNetwork().msf_synchronizability()\n    exp = 6.77842586\n    assert np.allclose(res, exp)\n"
  },
  {
    "path": "tests/test_core/test_resistive_networks.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nSimple tests for the ResNetwork class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn import ResNetwork\n\n# -----------------------------------------------------------------------------\n# Class member tests with TestNetwork\n# -----------------------------------------------------------------------------\n\n\ndef test_init(capsys):\n    print(ResNetwork.SmallTestNetwork())\n    out = capsys.readouterr()[0]\n    out_ref = \"ResNetwork:\\nGeoNetwork:\\nSpatialNetwork:\\n\" + \\\n              \"Network: undirected, 5 nodes, 5 links, link density 0.500.\" + \\\n              \"\\nGeographical boundaries:\\n\" + \\\n              \"         time     lat     lon\\n\" + \\\n              \"   min    0.0    0.00 -180.00\\n\" + \\\n              \"   max    9.0   90.00  180.00\\n\" + \\\n              \"Average resistance: 2.4\\n\"\n    assert out == out_ref\n\n\ndef test_SmallTestNetwork():\n    assert isinstance(ResNetwork.SmallTestNetwork(), ResNetwork)\n\n\ndef test_SmallComplexNetwork():\n    net = ResNetwork.SmallComplexNetwork()\n    assert net.flagComplex\n\n    adm = net.get_admittance()\n\n    res = adm.real\n    exp = [[0., 0.1, 0., 0., 0.],\n           [0.1, 0., 0.0625, 0.25, 0.],\n           [0., 0.0625, 0., 0.0625, 0.],\n           [0., 0.25, 0.0625, 0., 0.05],\n           [0., 0., 0., 0.05, 0.]]\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = adm.imag\n    exp = [[0., -0.2, 0., 0., 0.],\n           [-0.2, 0., -0.0625, -0.25, 0.],\n           [0., -0.0625, 0., -0.0625, 0.],\n           [0., -0.25, -0.0625, 0., -0.05],\n           [0., 0., 0., -0.05, 0.]]\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_update_resistances():\n    net = ResNetwork.SmallTestNetwork()\n    net.update_resistances(net.adjacency)\n\n    res = net.get_admittance()\n    exp = [[0., 1., 0., 0., 0.],\n           [1., 0., 1., 1., 0.],\n           [0., 1., 0., 1., 0.],\n           [0., 1., 1., 0., 1.],\n           [0., 0., 0., 1., 0.]]\n    assert (res == exp).all()\n\n    res = net.admittance_lapacian()\n    exp = [[1., -1., 0., 0., 0.],\n           [-1., 3., -1., -1., 0.],\n           [0., -1., 2., -1., 0.],\n           [0., -1., -1., 3., -1.],\n           [0., 0., 0., -1., 1.]]\n    assert (res == exp).all()\n\n\ndef test_update_admittance():\n    net = ResNetwork.SmallTestNetwork()\n    net.update_admittance()\n    assert True\n\n\ndef test_get_admittance():\n    net = ResNetwork.SmallTestNetwork()\n\n    res = net.get_admittance()\n    exp = [[0., 0.5, 0., 0., 0.],\n           [0.5, 0., 0.125, 0.5, 0.],\n           [0., 0.125, 0., 0.125, 0.],\n           [0., 0.5, 0.125, 0., 0.1],\n           [0., 0., 0., 0.1, 0.]]\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_update_R():\n    net = ResNetwork.SmallTestNetwork()\n    net.update_R()\n    assert True\n\n\ndef test_get_R():\n    res = ResNetwork.SmallTestNetwork().get_R()\n    exp = [[2.28444444, 0.68444444, -0.56, -0.20444444, -2.20444444],\n           [0.68444444, 1.08444444, -0.16, 0.19555556, -1.80444444],\n           [-0.56, -0.16, 3.04, -0.16, -2.16],\n           [-0.20444444, 0.19555556, -0.16, 1.08444444, -0.91555556],\n           [-2.20444444, -1.80444444, -2.16, -0.91555556, 7.08444444]]\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_admittance_laplacian():\n    res = ResNetwork.SmallTestNetwork().admittance_lapacian()\n    exp = [[0.5, -0.5, 0., 0., 0.],\n           [-0.5, 1.125, -0.125, -0.5, 0.],\n           [0., -0.125, 0.25, -0.125, 0.],\n           [0., -0.5, -0.125, 0.725, -0.1],\n           [0., 0., 0., -0.1, 0.1]]\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_admittive_degree():\n    res = ResNetwork.SmallTestNetwork().admittive_degree()\n    exp = [0.5, 1.125, 0.25, 0.725, 0.1]\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_average_neighbors_admittive_degree():\n    res = ResNetwork.SmallTestNetwork().average_neighbors_admittive_degree()\n    exp = [2.25, 1.31111111, 7.4, 2.03448276, 7.25]\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_local_admittive_clustering():\n    res = ResNetwork.SmallTestNetwork().local_admittive_clustering()\n    exp = [0., 0.00694444, 0.0625, 0.01077586, 0.]\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_global_admittive_clustering():\n    res = ResNetwork.SmallTestNetwork().global_admittive_clustering()\n    exp = 0.016\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_effective_resistance():\n    net = ResNetwork.SmallTestNetwork()\n\n    res = net.effective_resistance(1, 1)\n    exp = 0.0\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.effective_resistance(1, 2)\n    exp = 4.4444\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_average_effective_resistance():\n    res = ResNetwork.SmallTestNetwork().average_effective_resistance()\n    exp = 7.2889\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_diameter_effective_resistance():\n    res = ResNetwork.SmallTestNetwork().diameter_effective_resistance()\n    exp = 14.4444\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_effective_resistance_closeness_centrality():\n    net = ResNetwork.SmallTestNetwork()\n\n    res = net.effective_resistance_closeness_centrality(0)\n    exp = 0.1538\n    assert np.isclose(res, exp, atol=1e-04)\n\n    res = net.effective_resistance_closeness_centrality(4)\n    exp = 0.08\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_vertex_current_flow_betweenness():\n    net = ResNetwork.SmallTestNetwork()\n\n    res = net.vertex_current_flow_betweenness(1)\n    exp = 0.3889\n    assert np.isclose(res, exp, atol=1e-04)\n\n\ndef test_edge_current_flow_betweenness():\n    net = ResNetwork.SmallTestNetwork()\n\n    res = net.edge_current_flow_betweenness()\n    exp = [[0., 0.4, 0., 0., 0.],\n           [0.4, 0., 0.2444, 0.5333, 0.],\n           [0., 0.2444, 0., 0.2444, 0.],\n           [0., 0.5333, 0.2444, 0., 0.4],\n           [0., 0., 0., 0.4, 0.]]\n    assert np.allclose(res, exp, atol=1e-04)\n\n    net.update_resistances(net.adjacency)\n    res = net.edge_current_flow_betweenness()\n    exp = [[0., 0.4, 0., 0., 0.],\n           [0.4, 0., 0.3333, 0.4, 0.],\n           [0., 0.3333, 0., 0.3333, 0.],\n           [0., 0.4, 0.3333, 0., 0.4],\n           [0., 0., 0., 0.4, 0.]]\n    assert np.allclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_core/test_spatial_network.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\"\"\"\nSimple tests for the SpatialNetwork class.\n\"\"\"\nimport numpy as np\n\nfrom pyunicorn.core.geo_network import SpatialNetwork\n\n\ndef test_randomly_rewire_geomodel_I():\n    net = SpatialNetwork.SmallTestNetwork()\n    net.randomly_rewire_geomodel_I(distance_matrix=net.grid.distance(),\n                                   iterations=100, inaccuracy=100)\n    res = net.degree()\n    exp = np.array([3, 3, 2, 2, 3, 1])\n    assert (res == exp).all()\n\n\ndef test_set_random_links_by_distance():\n    net = SpatialNetwork.SmallTestNetwork()\n    while net.n_links != 5:\n        net.set_random_links_by_distance(a=0., b=-0.04)\n    res = net.n_links\n    exp = 5\n    assert res == exp\n\n\ndef test_link_distance_distribution():\n    net = SpatialNetwork.SmallTestNetwork()\n\n    res = net.link_distance_distribution(n_bins=4, geometry_corrected=False)[0]\n    exp = np.array([0.14285714, 0.28571429, 0.28571429, 0.28571429])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.link_distance_distribution(n_bins=4, geometry_corrected=True)[0]\n    exp = np.array([0.09836066, 0.24590164, 0.32786885, 0.32786885])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_average_link_distance():\n    net = SpatialNetwork.SmallTestNetwork()\n\n    res = net.average_link_distance(geometry_corrected=False)\n    exp = np.array([22.36067963, 11.18033981, 8.38525486, 13.97542477,\n                    16.77050908, 27.95084953])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = net.average_link_distance(geometry_corrected=True)[:-1]\n    exp = np.array([1.6, 1.09090909, 1., 1.66666667, 1.63636357])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_inaverage_link_distance():\n    net = SpatialNetwork.SmallTestNetwork()\n    res = net.inaverage_link_distance(geometry_corrected=False)\n    exp = np.array([22.36067963, 11.18033981, 8.38525486, 13.97542477,\n                    16.77050908, 27.95084953])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_outaverage_link_distance():\n    net = SpatialNetwork.SmallTestNetwork()\n    res = net.outaverage_link_distance(geometry_corrected=False)\n    exp = np.array([22.36067963, 11.18033981, 8.38525486, 13.97542477,\n                    16.77050908, 27.95084953])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_max_link_distance():\n    res = SpatialNetwork.SmallTestNetwork().max_link_distance()\n    exp = np.array([27.95085, 16.77051, 11.18034, 16.77051, 22.36068,\n                    27.95085], dtype=np.float32)\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_average_distance_weighted_path_length():\n    res = SpatialNetwork.SmallTestNetwork(). \\\n            average_distance_weighted_path_length()\n    exp = 28.69620552062988\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_distance_weighted_closeness():\n    res = SpatialNetwork.SmallTestNetwork().distance_weighted_closeness()\n    exp = np.array([0.03888814, 0.04259177, 0.03888814, 0.04259177, 0.03888814,\n                    0.02080063])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_local_distance_weighted_vulnerability():\n    res = SpatialNetwork.SmallTestNetwork(). \\\n            local_distance_weighted_vulnerability()\n    exp = np.array([0.03233506, 0.31442454, 0.20580213, 0.02843829,\n                    -0.02929477, -0.2883446])\n    assert np.allclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_eventseries/test_event_series.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nTests for the EventSeries class.\n\"\"\"\nimport numpy as np\nfrom pyunicorn.eventseries import EventSeries\n\n\ndef create_test_data():\n    N = 1000\n    tstamps = np.linspace(0.0, (N-1)*0.1, N)\n    data = np.zeros((N, 2))\n    for i in range(N):\n        data[i] = np.array([np.sin(tstamps[i]*np.pi),\n                            np.sin((tstamps[i]-0.2)*np.pi)])\n    return data, tstamps\n\n\ndef test_EventSeries_init():\n    data = np.random.randint(2, size=(1000, 3))\n    test_object1 = EventSeries(data)\n\n    assert np.all(test_object1.get_event_matrix() == data)\n\n\ndef test_make_event_matrix():\n    data = create_test_data()[0]\n\n    # Test 'value' method for first variable > 0.99 and second variable < 0.0\n    thresholds1 = np.array([0.99, 0.0])\n    test_object1 = EventSeries(data, threshold_method='value',\n                               threshold_values=thresholds1,\n                               threshold_types=np.array(['above', 'below']))\n    eventmatrix = np.zeros((data.shape[0], data.shape[1]))\n    for i in range(data.shape[0]):\n        if data[i][0] > thresholds1[0]:\n            eventmatrix[i][0] = 1\n        else:\n            eventmatrix[i][0] = 0\n\n        if data[i][1] < thresholds1[1]:\n            eventmatrix[i][1] = 1\n        else:\n            eventmatrix[i][1] = 0\n\n    assert np.all(test_object1.get_event_matrix() == eventmatrix)\n\n    # Test 'quantile' method for first variable < 0.3 quantile and\n    # second variable > 0.8 quantile\n    threshold_values2 = np.array([0.3, 0.8])\n    test_object2 = EventSeries(data, threshold_method='quantile',\n                               threshold_values=threshold_values2,\n                               threshold_types=['below', 'above'])\n    eventmatrix = np.zeros((data.shape[0], data.shape[1]))\n    thresholds2 = [np.quantile(data[:, 0], threshold_values2[0]),\n                   np.quantile(data[:, 1], threshold_values2[1])]\n    for i in range(data.shape[0]):\n        if data[i][0] < thresholds2[0]:\n            eventmatrix[i][0] = 1\n        else:\n            eventmatrix[i][0] = 0\n\n        if data[i][1] > thresholds2[1]:\n            eventmatrix[i][1] = 1\n        else:\n            eventmatrix[i][1] = 0\n\n    assert np.all(test_object2.get_event_matrix() == eventmatrix)\n\n\ndef eca_second_implementaion(eventseriesx, eventseriesy, *, ts1=None,\n                             ts2=None, deltaT=3, lag=0.0):\n    \"\"\"\n    Test implementation of event coincidence analysis\n\n    :type eventseriesx: 1D numpy array\n    :arg eventseriesx: Event series containing '0' and '1'\n    :type eventseriesy: 1D numpy array\n    :arg eventseriesy: Event series containing '0' and '1'\n    :type ts1: 1D numpy array\n    :arg ts1: time stamps of events in eventseriesx, not obligatory\n    :type ts2: 1D numpy array\n    :arg ts2: time stamps of events in eventseriesy, not obligatory\n    :type deltaT: float\n    :arg deltaT: time window defining if two events are considered precursor\n                 or trigger of the other\n    :type lag: float\n    :arg lag: delay between the two time series, eventseriesy is shifted\n    :rtype: list\n    :return:\n    \"\"\"\n\n    # Get time indices\n    if ts1 is None:\n        e1 = np.where(eventseriesx)[0]\n    else:\n        e1 = ts1[eventseriesx == 1]\n    if ts2 is None:\n        e2 = np.where(eventseriesy)[0]\n    else:\n        e2 = ts2[eventseriesy == 1]\n\n    # Number of events\n    l1 = len(e1)\n    l2 = len(e2)\n\n    # Find number of events which cannot be trigger or precursor events\n    s1p = len(e1[e1 <= (e1[0] + lag + deltaT)])\n    s2t = len(e2[e2 >= (e2[-1] - lag - deltaT)])\n    s1t = len(e1[e1 >= (e1[-1] - lag - deltaT)])\n    s2p = len(e2[e2 <= (e2[0] + lag + deltaT)])\n\n    precursorxy = 0.0\n    precursoryx = 0.0\n    triggerxy = 0.0\n    triggeryx = 0.0\n\n    for i1 in range(s1p, l1):\n        precursordummy = False\n        for j2 in range(l2):\n            if e1[i1] - lag - e2[j2] >= 0.0 and \\\n                    e1[i1] - lag - e2[j2] <= deltaT:\n                precursordummy = True\n        if precursordummy:\n            precursorxy = precursorxy + 1.0\n\n    for j2 in range(l2-s2t):\n        triggerdummy = False\n        for i1 in range(l1):\n            if e1[i1] - lag - e2[j2] >= 0.0 and \\\n                    e1[i1] - lag - e2[j2] <= deltaT:\n                triggerdummy = True\n        if triggerdummy:\n            triggerxy = triggerxy + 1.0\n\n    for i2 in range(s2p, l2):\n        precursordummy = False\n        for j1 in range(l1):\n            if e2[i2] - lag - e1[j1] >= 0.0 and \\\n                    e2[i2] - lag - e1[j1] <= deltaT:\n                precursordummy = True\n        if precursordummy:\n            precursoryx = precursoryx + 1.0\n\n    for j1 in range(l1-s1t):\n        triggerdummy = False\n        for i2 in range(l2):\n            if e2[i2] - lag - e1[j1] >= 0.0 and \\\n                    e2[i2] - lag - e1[j1] <= deltaT:\n                triggerdummy = True\n        if triggerdummy:\n            triggeryx = triggeryx + 1.0\n\n    return (precursorxy/(l1-s1p), triggerxy/(l2-s2t),\n            precursoryx/(l2-s2p), triggeryx/(l1-s1t))\n\n\ndef test_eca():\n    es1 = np.random.randint(2, size=100)\n    es2 = np.random.randint(2, size=100)\n    for tau in [0.0, 1.5]:\n        for window in [2, 5]:\n            for ts1, ts2 in [[None, None],\n                             [np.random.uniform(size=len(es1)).cumsum(),\n                              np.random.uniform(size=len(es1)).cumsum()]]:\n                eca_orig = \\\n                    EventSeries.event_coincidence_analysis(es1, es2, window,\n                                                           ts1=ts1,\n                                                           ts2=ts2,\n                                                           lag=tau)\n                eca_check = \\\n                    eca_second_implementaion(es1, es2, ts1=ts1, ts2=ts2,\n                                             deltaT=window, lag=tau)\n                assert np.allclose(np.array(eca_orig), np.array(eca_check),\n                                   atol=1e-04)\n\n\ndef eca_implementation_for_symmetric_window(es1, es2, *, ts1=None, ts2=None,\n                                            taumax=3.0, lag=0.0):\n    # Get time indices\n    if ts1 is None:\n        e1 = np.where(es1)[0]\n    else:\n        e1 = ts1[es1 == 1]\n    if ts2 is None:\n        e2 = np.where(es2)[0]\n    else:\n        e2 = ts2[es2 == 1]\n\n    # Number of events\n    l1 = len(e1)\n    l2 = len(e2)\n\n    # Find number of events which cannot be trigger or precursor events\n    if not (lag == 0 and taumax == 0):\n        s1start = len(e1[e1 <= (e1[0] + lag + taumax)])\n        s1end = len(e1[e1 >= (e1[-1] - lag - taumax)])\n        s2end = len(e2[e2 >= (e2[-1] - lag - taumax)])\n        s2start = len(e2[e2 <= (e2[0] + lag + taumax)])\n    else:\n        s1start, s1end, s2start, s2end = 0, 0, 0, 0\n\n    coincidence12, coincidence21 = 0.0, 0.0\n\n    for i in range(s1start, l1 - s1end):\n        for j in range(l2):\n            if np.abs(e1[i] - lag - e2[j]) <= taumax:\n                coincidence12 = coincidence12 + 1.0\n                break\n\n    for j in range(s2start, l2 - s2end):\n        for i in range(l1):\n            if np.abs(e2[j] - lag - e1[i]) <= taumax:\n                coincidence21 = coincidence21 + 1.0\n                break\n\n    return (coincidence12 / (l1 - s1start - s1end),\n            coincidence21 / (l2 - s2start - s2end))\n\n\ndef es_second_implementation(es1, es2, *, ts1=None, ts2=None, taumax=np.inf,\n                             lag=0.0):\n    \"\"\"\n    Calculates the directed event synchronization from two event series X\n    and Y.\n    :type es1: 1D Numpy array\n    :arg es1: Event series containing '0's and '1's\n    :type es2: 1D Numpy array\n    :arg es2: Event series containing '0's and '1's\n    :type ts1: 1D Numpy array\n    :arg ts1: Event time array containing time points when events of event\n               series 1 occur, not obligatory\n    :type ts2: 1D Numpy array\n    :arg ts2: Event time array containing time points when events of event\n               series 2 occur, not obligatory\n    :type taumax: float\n    :arg taumax: maximum distance of two events to be counted as\n                 synchronous\n    :type lag: float\n    :arg lag: delay between the two event series, the second event series\n                  is shifted by the value of lag\n    :rtype: list\n    :return: [Event synchronization XY, Event synchronization YX]\n    \"\"\"\n\n    # Get time indices\n    if ts1 is None:\n        ex = np.where(es1)[0]\n    else:\n        ex = ts1[es1 == 1]\n    if ts2 is None:\n        ey = np.where(es2)[0]\n    else:\n        ey = ts2[es2 == 1]\n\n    lx = len(ex)\n    ly = len(ey)\n\n    ey = ey + lag\n\n    Axy = np.zeros((lx, ly), dtype=bool)\n    Ayx = np.zeros((lx, ly), dtype=bool)\n    eqtime = np.zeros((lx, ly), dtype=bool)\n    for m in range(1, lx - 1):\n        for n in range(1, ly - 1):\n            dstxy = ex[m] - ey[n]\n\n            if abs(dstxy) > taumax:\n                continue\n            # finding the dynamical delay lag\n            tau = min([ex[m + 1] - ex[m], ex[m] - ex[m - 1],\n                       ey[n + 1] - ey[n], ey[n] - ey[n - 1]]) / 2\n\n            if dstxy > 0:\n                if dstxy <= tau:\n                    Axy[m, n] = True\n            if dstxy < 0:\n                if dstxy >= -tau:\n                    Ayx[m, n] = True\n            elif dstxy == 0:\n                eqtime[m, n] = True\n\n    # Loop over coincidences and determine number of double counts\n    # by checking at least one event of the pair is also coincided\n    # in other direction\n    countxydouble = countyxdouble = 0\n\n    for i, j in np.transpose(np.where(Axy)):\n        countxydouble += np.any(Ayx[i, :]) or np.any(Ayx[:, j])\n    for i, j in np.transpose(np.where(Ayx)):\n        countyxdouble += np.any(Axy[i, :]) or np.any(Axy[:, j])\n\n    countxy = np.sum(Axy) + 0.5 * np.sum(eqtime) - 0.5 * countxydouble\n    countyx = np.sum(Ayx) + 0.5 * np.sum(eqtime) - 0.5 * countyxdouble\n    norm = np.sqrt((lx - 2) * (ly - 2))\n    return countxy / norm, countyx / norm\n\n\ndef test_es():\n    es1 = np.random.binomial(1, 0.5, 100)\n    es2 = np.random.binomial(1, 0.5, 100)\n\n    for tau in [0.0, 1.5]:\n        for taumax in [np.inf, 5]:\n            for ts1, ts2 in [[None, None],\n                             [np.random.uniform(size=len(es1)).cumsum(),\n                              np.random.uniform(size=len(es1)).cumsum()]]:\n                es_orig = \\\n                    EventSeries.event_synchronization(es1, es2, ts1=ts1,\n                                                      ts2=ts2, taumax=taumax,\n                                                      lag=tau)\n                es_check = \\\n                    es_second_implementation(es1, es2, ts1=ts1, ts2=ts2,\n                                             taumax=taumax, lag=tau)\n\n                assert np.allclose(np.array(es_orig), np.array(es_check),\n                                   atol=1e-04)\n\n\ndef eca_matrix_second_implementation(eventmatrix, taumax,\n                                     eca_type):\n\n    if eca_type in ['advanced', 'retarded']:\n        N = eventmatrix.shape[1]\n        res_p, res_t = np.zeros((N, N)), np.zeros((N, N))\n\n        for i in np.arange(0, N):\n            for j in np.arange(i + 1, N):\n                res_p[i, j], res_t[i, j], res_p[j, i], res_t[j, i] = \\\n                    eca_second_implementaion(eventmatrix[:, i],\n                                             eventmatrix[:, j],\n                                             deltaT=taumax)\n\n        if eca_type == 'advanced':\n            return res_p\n\n        elif eca_type == 'retarded':\n            return res_t\n\n        else:\n            return None\n\n    elif eca_type == 'symmetric':\n        N = eventmatrix.shape[1]\n        res_s = np.zeros((N, N))\n        for i in np.arange(0, N):\n            for j in np.arange(i + 1, N):\n                res_s[i, j], res_s[j, i] = \\\n                    eca_implementation_for_symmetric_window(eventmatrix[:, i],\n                                                            eventmatrix[:, j],\n                                                            taumax=taumax)\n        return res_s\n\n    return None\n\n\ndef test_vectorized_eca():\n    # Create an event matrix of length 1000 with 3 variables\n    test_event_matrix = np.random.randint(2, size=(100, 3))\n\n    for eca_type in ['advanced', 'retarded', 'symmetric']:\n        for taumax in [1, 5, 16]:\n            eso = EventSeries(test_event_matrix, taumax=taumax)\n            directedeca_matrix = \\\n                eca_matrix_second_implementation(test_event_matrix,\n                                                 taumax, eca_type)\n            # directed, no symmetry\n            assert \\\n                np.allclose(directedeca_matrix,\n                            eso.event_series_analysis(\n                                method='ECA', symmetrization='directed',\n                                window_type=eca_type),\n                            atol=1e-04)\n            # Test for the various symmetry options\n            # mean\n            assert \\\n                np.allclose(np.mean([directedeca_matrix, directedeca_matrix.T],\n                                    axis=0),\n                            eso.event_series_analysis(method='ECA',\n                                                      symmetrization='mean',\n                                                      window_type=eca_type),\n                            atol=1e-04)\n            # max\n            assert \\\n                np.allclose(np.max([directedeca_matrix, directedeca_matrix.T],\n                                   axis=0),\n                            eso.event_series_analysis(method='ECA',\n                                                      symmetrization='max',\n                                                      window_type=eca_type),\n                            atol=1e-04)\n\n            # min\n            assert \\\n                np.allclose(np.min([directedeca_matrix, directedeca_matrix.T],\n                                   axis=0),\n                            eso.event_series_analysis(method='ECA',\n                                                      symmetrization='min',\n                                                      window_type=eca_type),\n                            atol=1e-04, equal_nan=True)\n\n\ndef es_matrix_second_implementation(eventmatrix, taumax):\n    N = eventmatrix.shape[1]\n    res = np.zeros((N, N))\n\n    for i in np.arange(0, N):\n        for j in np.arange(i + 1, N):\n            res[i, j], res[j, i] = \\\n                es_second_implementation(eventmatrix[:, i],\n                                         eventmatrix[:, j], taumax=taumax)\n    return res\n\n\ndef test_vectorized_es():\n    # Test if the vectorized implementation coincides with the straight forward\n    # one.\n\n    for taumax in [1, 5, 16, np.inf]:\n        length, N, eventprop = 1000, 2, 0.2\n        # equal event counts (normalization requirement)\n        eventcount = int(length * eventprop)\n        eventmatrix = np.zeros((length, N), dtype=int)\n        for v in range(N):\n            fills = np.random.choice(np.arange(length), eventcount,\n                                     replace=False)\n            eventmatrix[fills, v] = 1\n\n        esob = EventSeries(eventmatrix, taumax=taumax)\n        directedes_matrix = es_matrix_second_implementation(eventmatrix,\n                                                            taumax)\n        # directed, no symmetry\n        assert \\\n            np.allclose(directedes_matrix,\n                        esob.event_series_analysis(method='ES',\n                                                   symmetrization='directed'),\n                        atol=1e-04)\n\n        # Test for all symmetry options\n        # symmetric\n        assert \\\n            np.allclose(directedes_matrix + directedes_matrix.T,\n                        esob.event_series_analysis(method='ES',\n                                                   symmetrization='symmetric'),\n                        atol=1e-04)\n\n        # antisymmetric\n        assert \\\n            np.allclose(directedes_matrix - directedes_matrix.T,\n                        esob.event_series_analysis(method='ES',\n                                                   symmetrization='antisym'),\n                        atol=1e-04, equal_nan=True)\n\n        # mean\n        assert \\\n            np.allclose(np.mean([directedes_matrix, directedes_matrix.T],\n                                axis=0),\n                        esob.event_series_analysis(method='ES',\n                                                   symmetrization='mean'),\n                        atol=1e-04)\n\n        # max\n        assert \\\n            np.allclose(np.maximum(directedes_matrix, directedes_matrix.T),\n                        esob.event_series_analysis(method='ES',\n                                                   symmetrization='max'),\n                        atol=1e-04)\n\n        # min\n        assert \\\n            np.allclose(np.minimum(directedes_matrix, directedes_matrix.T),\n                        esob.event_series_analysis(method='ES',\n                                                   symmetrization='min'),\n                        atol=1e-04)\n\n\ndef test_significance():\n    n_surrs = 100\n    data, tstamps = create_test_data()\n\n    # Testing without symmetry\n    esob = EventSeries(data, timestamps=tstamps, threshold_method='value',\n                       threshold_values=np.array([0.98, 0.98]),\n                       threshold_types=np.array(['above', 'above']),\n                       taumax=np.inf, lag=0.0)\n\n    # Test Event Synchronization significance via surrogates\n    assert \\\n        np.allclose(esob.event_analysis_significance(method='ES',\n                                                     n_surr=n_surrs),\n                    np.array([[0., 0.], [1., 0.]]), atol=1e-04)\n    # Test ECA\n    esob = EventSeries(data, timestamps=tstamps, threshold_method='value',\n                       threshold_values=np.array([0.98, 0.98]),\n                       threshold_types=np.array(['above', 'above']),\n                       taumax=1.0, lag=0.0)\n\n    # Test precursor coincidence via surrogates\n    assert \\\n        np.allclose(esob.event_analysis_significance(method='ECA',\n                                                     surrogate='shuffle',\n                                                     n_surr=n_surrs,\n                                                     symmetrization='directed',\n                                                     window_type='advanced'),\n                    np.array([[0.0, 0.0], [1.0, 0.0]]), atol=1e-04)\n\n    # Test trigger coincidence via surrogates\n    assert \\\n        np.allclose(esob.event_analysis_significance(method='ECA',\n                                                     surrogate='shuffle',\n                                                     n_surr=n_surrs,\n                                                     symmetrization='directed',\n                                                     window_type='retarded'),\n                    np.array([[0.0, 0.0], [1.0, 0.0]]), atol=1e-04)\n    # Test trigger coincidence via binomial distribution\n    assert \\\n        np.allclose(esob.event_analysis_significance(method='ECA',\n                                                     surrogate='analytic',\n                                                     symmetrization='directed',\n                                                     window_type='retarded'),\n                    np.array([[0.0, 0.0], [1.0, 0.0]]), atol=1e-04)\n\n    # Test precursor coincidence via binomial distribution\n    assert \\\n        np.allclose(esob.event_analysis_significance(method='ECA',\n                                                     surrogate='analytic',\n                                                     symmetrization='directed',\n                                                     window_type='advanced'),\n                    np.array([[0.0, 0.0], [1.0, 0.0]]), atol=1e-04)\n\n    # Testing for symmetrization=mean\n    # Testing without symmetry\n    esob = EventSeries(data, timestamps=tstamps, threshold_method='value',\n                       threshold_values=np.array([0.98, 0.98]),\n                       threshold_types=np.array(['above', 'above']),\n                       taumax=np.inf, lag=0.0)\n\n    # Test Event Synchronization significance via surrogates\n    assert \\\n        np.allclose(esob.event_analysis_significance(method='ES',\n                                                     n_surr=n_surrs,\n                                                     symmetrization='mean'),\n                    np.array([[0., 1.0], [1.0, 0.]]), atol=1e-04)\n    # Test ECA\n    esob = EventSeries(data, timestamps=tstamps, threshold_method='value',\n                       threshold_values=np.array([0.98, 0.98]),\n                       threshold_types=np.array(['above', 'above']),\n                       taumax=1.0, lag=0.0)\n\n    # Test precursor coincidence via surrogates\n    assert \\\n        np.allclose(esob.event_analysis_significance(method='ECA',\n                                                     surrogate='shuffle',\n                                                     n_surr=n_surrs,\n                                                     symmetrization='mean',\n                                                     window_type='advanced'),\n                    np.array([[0.0, 1.0], [1.0, 0.0]]), atol=1e-04)\n\n    # Test trigger coincidence via surrogates\n    assert \\\n        np.allclose(esob.event_analysis_significance(method='ECA',\n                                                     surrogate='shuffle',\n                                                     n_surr=n_surrs,\n                                                     symmetrization='mean',\n                                                     window_type='retarded'),\n                    np.array([[0.0, 1.0], [1.0, 0.0]]), atol=1e-04)\n"
  },
  {
    "path": "tests/test_funcnet/test_coupling_analysis.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nSimple tests for the funcnet CouplingAnalysis class.\n\"\"\"\nimport numpy as np\nimport pytest\n\nfrom pyunicorn.core.data import Data\nfrom pyunicorn.funcnet import CouplingAnalysis\n\nfrom pyunicorn.core._ext.types import LAG, FIELD\n\n\ndef create_test_data():\n    # Create test time series\n    tdata = Data.SmallTestData().observable()\n    # subtract means form the input data\n    tdata -= np.mean(tdata, axis=1)[:, None]\n    # normalize the data\n    tdata /= np.sqrt(np.sum(tdata*tdata, axis=1))[:, None]\n    return tdata\n\n\ndef test_symmetrize_by_absmax():\n    # Test example\n    ca = CouplingAnalysis(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = ca.cross_correlation(tau_max=2)\n\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[1., 0.698, 0.7788, 0.7535],\n                     [0.4848, 1., 0.4507, 0.52],\n                     [0.6219, 0.5704, 1., 0.5996],\n                     [0.4833, 0.5503, 0.5002, 1.]]),\n           np.array([[0, 2, 1, 2], [0, 0, 0, 0],\n                     [0, 2, 0, 1], [0, 2, 0, 0]]))\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = ca.symmetrize_by_absmax(similarity_matrix, lag_matrix)\n    exp = (np.array([[1., 0.698, 0.7788, 0.7535],\n                     [0.698, 1., 0.5704, 0.5503],\n                     [0.7788, 0.5704, 1., 0.5996],\n                     [0.7535, 0.5503, 0.5996, 1.]]),\n           np.array([[0, 2, 1, 2], [-2, 0, -2, -2],\n                     [-1, 2, 0, 1], [-2, 2, -1, 0]]))\n    assert np.allclose(res, exp, atol=1e-04)\n\n    # Random consistency test\n    tdata = create_test_data()\n    n_index, n_times = tdata.shape\n    coup_ana = CouplingAnalysis(tdata)\n    similarity_matrix = np.random.rand(n_index, n_times).astype(FIELD)\n    lag_matrix = np.random.rand(n_index, n_times).astype(np.int8)\n    sm_new = coup_ana.symmetrize_by_absmax(similarity_matrix, lag_matrix)[0]\n    for i in range(n_index):\n        for j in range(n_times):\n            assert sm_new[i, j] >= similarity_matrix[i, j]\n\n\ndef test_cross_correlation_max():\n    coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = coup_ana.cross_correlation(\n        tau_max=5, lag_mode='max')\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[1., 0.7570, 0.7790, 0.7536],\n                     [0.4847, 1., 0.4502, 0.5197],\n                     [0.6219, 0.5844, 1., 0.5992],\n                     [0.4827, 0.5509, 0.4996, 1.]]),\n           np.array([[0, 4, 1, 2], [0, 0, 0, 0], [0, 3, 0, 1], [0, 2, 0, 0]]))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cross_correlation_all():\n    coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n    res = coup_ana.cross_correlation(tau_max=1, lag_mode='all')\n    exp = np.array(\n        [[[1., 0.8173], [0.4849, 0.5804], [0.6214, 0.7786], [0.4831, 0.6042]],\n         [[0.4849, 0.4101], [1., 0.9362], [0.4503, 0.3780], [0.5199, 0.4286]],\n         [[0.6214, 0.5178], [0.4503, 0.5376], [1., 0.4962], [0.5004, 0.5996]],\n         [[0.4831, 0.3762], [0.5199, 0.5404], [0.5004, 0.4092], [1., 0.4380]]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_mutual_information_knn():\n    coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = coup_ana.mutual_information(\n        tau_max=5, knn=10, estimator='knn')\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[4.6505, 0.4387, 0.4652, 0.4126],\n                     [0.147, 4.6505, 0.1065, 0.1639],\n                     [0.2483, 0.2126, 4.6505, 0.2204],\n                     [0.1209, 0.199, 0.1453, 4.6505]], dtype=FIELD),\n           np.array([[0, 4, 1, 2],\n                     [0, 0, 0, 0],\n                     [0, 2, 0, 1],\n                     [0, 2, 0, 0]], dtype=LAG))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_mutual_information_binning():\n    coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = coup_ana.mutual_information(\n        tau_max=5, bins=6, estimator='binning')\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[1.7828, 0.3765, 0.3551, 0.3288],\n                     [0.1326, 1.7828, 0.1140, 0.1498],\n                     [0.1951, 0.1784, 1.7828, 0.1918],\n                     [0.1139, 0.1681, 0.1266, 1.7828]], dtype=FIELD),\n           np.array([[0, 4, 1, 2],\n                     [0, 0, 0, 0],\n                     [0, 3, 0, 1],\n                     [0, 2, 0, 0]], dtype=LAG))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\n@pytest.mark.filterwarnings(\"ignore:divide by zero encountered in log\")\ndef test_mutual_information_gauss():\n    coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = coup_ana.mutual_information(\n        tau_max=5, estimator='gauss')\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[np.inf, 0.4255, 0.4668, 0.4196],\n                     [0.1339, np.inf, 0.1133, 0.1574],\n                     [0.2445, 0.2089, np.inf, 0.2224],\n                     [0.1326, 0.1808, 0.1436, np.inf]], dtype=FIELD),\n           np.array([[0, 4, 1, 2],\n                     [0, 0, 0, 0],\n                     [0, 3, 0, 1],\n                     [0, 2, 0, 0]], dtype=LAG))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_mutual_information_value_error():\n    with pytest.raises(ValueError,\n                       match='estimator must be \"knn\", \"binning\" or \"gauss\".'):\n        CouplingAnalysis(CouplingAnalysis.test_data()) \\\n            .mutual_information(estimator='some_other')\n\n\ndef test_information_transfer_knn():\n    coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = coup_ana.information_transfer(\n        tau_max=5, estimator='knn', knn=10)\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[0., 0.1544, 0.3261, 0.3047],\n                     [0.0218, 0., 0.0394, 0.0976],\n                     [0.0134, 0.0663, 0., 0.1502],\n                     [0.0066, 0.0694, 0.0401, 0.]]),\n           np.array([[0, 2, 1, 2], [5, 0, 0, 0], [5, 1, 0, 1], [5, 0, 0, 0]]))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\n@pytest.mark.filterwarnings(\"ignore:divide by zero encountered in log\")\ndef test_information_transfer_gauss():\n    coup_ana = CouplingAnalysis(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = coup_ana.information_transfer(\n        tau_max=5, estimator='gauss')\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[0., 0.1732, 0.3256, 0.3148],\n                     [0.0006, 0., 0.0324, 0.0755],\n                     [0.0012, 0.0754, 0., 0.1365],\n                     [0.0008, 0.0753, 0.0442, 0.]], dtype=FIELD),\n           np.array([[0, 2, 1, 2],\n                     [5, 0, 0, 0],\n                     [3, 1, 0, 1],\n                     [1, 0, 0, 0]], dtype=LAG))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_information_transfer_value_error():\n    with pytest.raises(ValueError,\n                       match='estimator must be \"knn\", \"binning\" or \"gauss\".'):\n        CouplingAnalysis(CouplingAnalysis.test_data()) \\\n            .information_transfer(estimator='some_other')\n"
  },
  {
    "path": "tests/test_funcnet/test_coupling_analysis_pure_python.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nSimple tests for the funcnet CouplingAnalysisPurePython class.\n\"\"\"\nimport numpy as np\nimport pytest\n\nfrom pyunicorn.funcnet import CouplingAnalysis, CouplingAnalysisPurePython\n\n\ndef test_cross_correlation_all():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    res = coup_ana.cross_correlation(tau_max=1, lag_mode='all')\n    exp = np.array([[[0.8181, 0.4121, 0.5183, 0.3773],\n                     [0.5802, 0.9359, 0.5377, 0.5395],\n                     [0.7786, 0.3763, 0.4961, 0.4081],\n                     [0.6041, 0.4265, 0.6000, 0.4368]],\n                    [[1., 0.4871, 0.6233, 0.4856],\n                     [0.4871, 1., 0.4486, 0.5180],\n                     [0.6233, 0.4486, 1., 0.4988],\n                     [0.4856, 0.5180, 0.4988, 1.]],\n                    [[0.8173, 0.5804, 0.7787, 0.6041],\n                     [0.4100, 0.9361, 0.3783, 0.4286],\n                     [0.5179, 0.5376, 0.4961, 0.5995],\n                     [0.3765, 0.5408, 0.4086, 0.4378]]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cross_correlation_sum():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    res = coup_ana.cross_correlation(\n        tau_max=1, lag_mode='sum')\n    exp = np.array([[[1.8173, 1.0676, 1.4021, 1.0898],\n                     [0.8972, 1.9361, 0.8270, 0.9466],\n                     [1.1413, 0.9863, 1.4961, 1.0984],\n                     [0.8622, 1.0588, 0.9075, 1.4378]],\n                    [[1.8181, 0.8993, 1.1417, 0.8630],\n                     [1.0674, 1.9359, 0.9864, 1.0575],\n                     [1.4020, 0.8250, 1.4961, 0.9069],\n                     [1.0898, 0.9445, 1.0988, 1.4368]]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_cross_correlation_max():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = coup_ana.cross_correlation(\n        tau_max=5, lag_mode='max')\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[1., 0.7559, 0.7803, 0.7520],\n                     [0.7569, 1., 0.5820, 0.5521],\n                     [0.7807, 0.5808, 1., 0.5999],\n                     [0.7521, 0.5501, 0.6005, 1.]]),\n           np.array([[0, 4, 1, 2], [-4, 0, -3, -2],\n                     [-1, 3, 0, 1], [-2, 2, -1, 0]]))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_shuffled_surrogate_for_cc_all():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    res = coup_ana.shuffled_surrogate_for_cc(tau_max=1, lag_mode='all')\n    exp = np.array([[[1., -0.0324, -0.0175,  0.0427],\n                     [-0.0324,  1.,  0.1045, 0.0211],\n                     [-0.0175,  0.1045,  1., 0.0298],\n                     [0.0427,   0.0211,  0.0298, 1.]],\n                    [[1., -0.0324, -0.0175,  0.0427],\n                     [-0.0324, 1.,  0.1045,  0.0211],\n                     [-0.0175, 0.1045,  1.,  0.0298],\n                     [0.0427,  0.0211,  0.0298,  1.]],\n                    [[1., -0.0324, -0.0175,  0.0427],\n                     [-0.0324, 1.,  0.1045,  0.0211],\n                     [-0.0175, 0.1045,  1.,  0.0298],\n                     [0.0427,  0.0211,  0.0298,  1.]]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_shuffled_surrogate_for_cc_sum():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    res = coup_ana.shuffled_surrogate_for_cc(tau_max=5, lag_mode='sum')\n    exp = np.array([[[6., 0.2227, 0.0897, 0.2644],\n                     [0.2227, 6., 0.6321, 0.1233],\n                     [0.0897, 0.6321, 6., 0.1810],\n                     [0.2644, 0.1233, 0.1810, 6.]],\n                    [[6., 0.2227, 0.0897, 0.2644],\n                     [0.2227, 6., 0.6321, 0.1233],\n                     [0.0897, 0.6321, 6., 0.1810],\n                     [0.2644, 0.1233, 0.1810, 6.]]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_shuffled_surrogate_for_cc_max():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = \\\n        coup_ana.shuffled_surrogate_for_cc(tau_max=5, lag_mode='max')\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[1., 0.0371, 0.0150, 0.0441],\n                     [0.0371, 1., 0.1054, 0.0206],\n                     [0.0150, 0.1054, 1., 0.0302],\n                     [0.0441, 0.0206, 0.0302, 1.]]),\n           np.array([[-4, -2, 0, -2],\n                     [3,  -2, 0,  0],\n                     [4,   5, 4, -5],\n                     [2,  -3, 0, -3]]))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_shuffled_surrogate_for_cc_value_error():\n    with pytest.raises(ValueError,\n                       match='lag_mode must be \"all\", \"sum\" or \"max\".'):\n        CouplingAnalysisPurePython(CouplingAnalysis.test_data()) \\\n            .shuffled_surrogate_for_cc(lag_mode='some_other')\n\n\ndef test_shuffled_surrogate_for_mi_all():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    res = coup_ana.shuffled_surrogate_for_mi(tau_max=1, lag_mode='all')\n    exp = np.array([[[1.0003, 0.0468, 0.0425, 0.0489],\n                     [0.0468, 1.0003, 0.0440, 0.0436],\n                     [0.0425, 0.0440, 1.0003, 0.0502],\n                     [0.0489, 0.0436, 0.0502, 1.0003]],\n                    [[1.0003, 0.0468, 0.0425, 0.0489],\n                     [0.0468, 1.0003, 0.0440, 0.0436],\n                     [0.0425, 0.0440, 1.0003, 0.0502],\n                     [0.0489, 0.0436, 0.0502, 1.0003]],\n                    [[1.0003, 0.0468, 0.0425, 0.0489],\n                     [0.0468, 1.0003, 0.0440, 0.0436],\n                     [0.0425, 0.0440, 1.0003, 0.0502],\n                     [0.0489, 0.0436, 0.0502, 1.0003]]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_shuffled_surrogate_for_mi_sum():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    res = coup_ana.shuffled_surrogate_for_mi(tau_max=5, lag_mode='sum')\n    exp = np.array([[[6.0001, 0.2598, 0.2194, 0.2690],\n                     [0.2598, 6.0001, 0.2851, 0.2505],\n                     [0.2194, 0.2851, 6.0001, 0.2861],\n                     [0.2690, 0.2505, 0.2861, 6.0001]],\n                    [[6.0001, 0.2598, 0.2194, 0.2690],\n                     [0.2598, 6.0001, 0.2851, 0.2505],\n                     [0.2194, 0.2851, 6.0001, 0.2861],\n                     [0.2690, 0.2505, 0.2861, 6.0001]]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_shuffled_surrogate_for_mi_max():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = \\\n        coup_ana.shuffled_surrogate_for_mi(tau_max=5, lag_mode='max')\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[1., 0.0433, 0.0366, 0.0448],\n                     [0.0433, 1., 0.0475, 0.0418],\n                     [0.0366, 0.0475, 1., 0.0477],\n                     [0.0448, 0.0418, 0.0477, 1.]]),\n           np.array([[-4, -2, 0, -2],\n                     [3,  -2, 0,  0],\n                     [4,   5, 4, -5],\n                     [2,  -3, 0, -3]]))\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_shuffled_surrogate_for_mi_value_error():\n    with pytest.raises(ValueError,\n                       match='lag_mode must be \"all\", \"sum\" or \"max\".'):\n        CouplingAnalysisPurePython(CouplingAnalysis.test_data()) \\\n            .shuffled_surrogate_for_mi(lag_mode='some_other')\n\n\ndef test_mutual_information_all():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    res = coup_ana.mutual_information(\n        tau_max=1, lag_mode='all')\n    exp = np.array([[[0.2128, 0.0767, 0.1049, 0.0706],\n                     [0.1153, 0.3755, 0.1001, 0.1007],\n                     [0.1952, 0.0735, 0.0910, 0.0722],\n                     [0.1166, 0.0804, 0.1236, 0.0807]],\n                    [[1.0003, 0.0974, 0.1309, 0.0858],\n                     [0.0974, 1.0003, 0.0782, 0.1042],\n                     [0.1309, 0.0782, 1.0003, 0.0944],\n                     [0.0858, 0.1042, 0.0944, 1.0003]],\n                    [[0.2129, 0.1158, 0.1959, 0.1162],\n                     [0.0766, 0.3756, 0.0760, 0.0806],\n                     [0.1047, 0.1002, 0.0906, 0.1237],\n                     [0.0686, 0.1019, 0.0716, 0.0812]]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_mutual_information_sum():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    res = coup_ana.mutual_information(\n        tau_max=5, lag_mode='sum')\n    exp = np.array([[[1.6146, 0.9180, 0.7181, 0.6732],\n                     [0.4027, 2.1516, 0.3861, 0.4253],\n                     [0.4756, 0.6212, 1.3498, 0.5132],\n                     [0.3866, 0.5948, 0.3683, 1.3113]],\n                    [[1.6117, 0.3971, 0.4783, 0.3916],\n                     [0.9158, 2.1477, 0.6197, 0.6002],\n                     [0.7116, 0.3791, 1.3447, 0.3708],\n                     [0.6632, 0.4233, 0.5123, 1.3074]]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef test_mutual_information_max():\n    coup_ana = CouplingAnalysisPurePython(CouplingAnalysis.test_data())\n    similarity_matrix, lag_matrix = coup_ana.mutual_information(\n        tau_max=5, lag_mode='max')\n    res = (similarity_matrix, lag_matrix)\n    exp = (np.array([[1., 0.1959, 0.1956, 0.1768],\n                     [0.2008, 1., 0.1169, 0.1093],\n                     [0.1972, 0.1170, 1., 0.1232],\n                     [0.1796, 0.1069, 0.1245, 1.]]),\n           np.array([[0, 4, 1, 2], [-4, 0, -2, -2],\n                     [-1, 2, 0, 1], [-2, 2, -1, 0]]))\n    assert np.allclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_generic.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nGeneric consistency checks.\n\"\"\"\n\nfrom pyunicorn import __version__, core, climate, timeseries, funcnet\n\n\ndef test_version():\n    \"\"\"\n    Valid version information.\n    \"\"\"\n    assert isinstance(__version__, str)\n\n\ndef test_init_str():\n    \"\"\"\n    Reasonable __init__ and __str__ for most classes.\n    \"\"\"\n    for i in simple_instances():\n        assert str(i).startswith(i.__class__.__name__)\n\n\ndef simple_instances():\n    \"\"\"\n    Minimally initialized instances for most classes.\n    \"\"\"\n    cd = climate.ClimateData.SmallTestData()\n    ca = funcnet.CouplingAnalysis.test_data()[:50]\n    ts = ca[:, 0]\n    t1, t2, t3 = [{'threshold': t} for t in [0.2, (0.2, 0.2), (0.2, 0.2, 0.2)]]\n    # es = 1-(np.random.rand(100, 10) > 0.4).astype(int)\n    # ec = climate.EventSynchronizationClimateNetwork.SmallTestData()\n    return [\n        core.Network.SmallTestNetwork(),\n        core.Grid.SmallTestGrid(),\n        core.SpatialNetwork.SmallTestNetwork(),\n        core.GeoGrid.SmallTestGrid(),\n        core.GeoNetwork.SmallTestNetwork(),\n        core.InteractingNetworks.SmallTestNetwork(),\n        core.ResNetwork.SmallTestNetwork(),\n        core.NetCDFDictionary(),\n        cd,\n        climate.ClimateNetwork.SmallTestNetwork(),\n        climate.HavlinClimateNetwork(cd, 0, **t1),\n        climate.HilbertClimateNetwork(cd, **t1),\n        climate.TsonisClimateNetwork.SmallTestNetwork(),\n        climate.PartialCorrelationClimateNetwork(cd, winter_only=False, **t1),\n        climate.RainfallClimateNetwork(cd, **t1),\n        climate.SpearmanClimateNetwork(cd, winter_only=False, **t1),\n        climate.MutualInfoClimateNetwork(cd, winter_only=False, **t1),\n        climate.CoupledTsonisClimateNetwork(cd, cd, **t1),\n        # climate.EventSynchronizationClimateNetwork(\n        #     ec, 0.8, 16, eventsynctype=\"directedES\"),\n        timeseries.RecurrencePlot(ts, **t1),\n        timeseries.RecurrenceNetwork(ts, **t1),\n        timeseries.JointRecurrencePlot(ts, ts, **t2),\n        timeseries.JointRecurrenceNetwork(ts, ts, **t2),\n        timeseries.CrossRecurrencePlot(ts, ts, **t1),\n        timeseries.InterSystemRecurrenceNetwork(ts, ts, **t3),\n        timeseries.Surrogates.SmallTestData(),\n        timeseries.VisibilityGraph(ts),\n        funcnet.CouplingAnalysis(ca),\n        funcnet.CouplingAnalysisPurePython(ca),\n        # funcnet.EventSynchronization(es, 16)\n    ]\n"
  },
  {
    "path": "tests/test_timeseries/test_joint_recurrence_plot.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nSimple tests for the JointRecurrencePlot class.\n\"\"\"\n\nimport numpy as np\n\nimport pytest\n\nfrom pyunicorn.timeseries import JointRecurrencePlot\nfrom pyunicorn.funcnet import CouplingAnalysis\n\n\n@pytest.mark.parametrize(\"n\", [2, 10, 50])\ndef test_recurrence(metric: str, n: int):\n    ts = CouplingAnalysis.test_data()[:n, 0]\n    jrp = JointRecurrencePlot(ts, ts, threshold=(.1, .1),\n                              metric=(metric, metric))\n    dist = {}\n    for i in \"xy\":\n        jrp.embedding = getattr(jrp, f\"{i}_embedded\")\n        dist[i] = jrp.distance_matrix(metric=metric)\n    assert all(d.shape == (n, n) for d in dist.values())\n    assert np.allclose(dist[\"x\"], dist[\"y\"])\n    assert jrp.recurrence_matrix().shape == (n, n)\n\n\ndef test_exceptions():\n    ts1 = CouplingAnalysis.test_data()[:10, 0]\n    ts2 = CouplingAnalysis.test_data()[:12, 0]\n    # provoke error for missing thresholding parameter\n    with pytest.raises(NameError):\n        JointRecurrencePlot(ts1, ts1)\n    # provoke error for mismatched timeseries lengths\n    with pytest.raises(ValueError):\n        JointRecurrencePlot(ts1, ts2)\n    # provoke error for given lag value too large\n    with pytest.raises(ValueError):\n        JointRecurrencePlot(ts1, ts1, lag=14)\n"
  },
  {
    "path": "tests/test_timeseries/test_recurrence_plot.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nSimple tests for the RecurrencePlot class.\n\"\"\"\n\nfrom itertools import chain, product\n\nimport pytest\nimport numpy as np\n\nfrom pyunicorn.core import Data\nfrom pyunicorn.core._ext.types import NODE, ADJ, DFIELD\nfrom pyunicorn.timeseries import RecurrencePlot\n\n\n# -----------------------------------------------------------------------------\n# test RecurrencePlot instantiation\n# -----------------------------------------------------------------------------\n\n# test non-default metrics\n\ndef test_RP_euclidean():\n    x = Data.SmallTestData().observable()\n    RP = RecurrencePlot(x[:, :-3], threshold=1.2, metric='euclidean')\n    res = RP.recurrence_matrix()\n    assert res.dtype == ADJ\n    exp = np.array([\n        [1, 1, 1, 0, 0, 0, 0, 0, 0, 0],\n        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n        [1, 1, 1, 1, 1, 1, 0, 0, 0, 0],\n        [0, 1, 1, 1, 1, 1, 1, 1, 0, 0],\n        [0, 1, 1, 1, 1, 1, 1, 1, 0, 0],\n        [0, 0, 1, 1, 1, 1, 1, 1, 1, 0],\n        [0, 0, 0, 1, 1, 1, 1, 1, 1, 1],\n        [0, 0, 0, 1, 1, 1, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]\n    ])\n    assert np.array_equal(res, exp)\n\n\ndef test_RP_manhattan():\n    x = Data.SmallTestData().observable()\n    RP = RecurrencePlot(x, threshold=3.5, metric='manhattan')\n    res = RP.recurrence_matrix()\n    assert res.dtype == ADJ\n    exp = np.array([\n        [1, 1, 1, 0, 0, 0, 0, 0, 0, 0],\n        [1, 1, 1, 1, 0, 0, 0, 0, 0, 0],\n        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n        [0, 1, 1, 1, 1, 1, 1, 0, 0, 0],\n        [0, 0, 1, 1, 1, 1, 1, 1, 0, 0],\n        [0, 0, 0, 1, 1, 1, 1, 1, 0, 0],\n        [0, 0, 0, 1, 1, 1, 1, 1, 1, 0],\n        [0, 0, 0, 0, 1, 1, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 0, 0, 1, 1, 1]\n    ])\n    assert np.array_equal(res, exp)\n\n\n# test thresholding variations\n\ndef test_RP_threshold_std():\n    x = Data.SmallTestData().observable()\n    RP = RecurrencePlot(x, threshold_std=.8)\n    res = RP.recurrence_matrix()\n    assert res.dtype == ADJ\n    exp = np.array([\n        [1, 1, 0, 0, 0, 0, 0, 0, 0, 0],\n        [1, 1, 1, 1, 0, 0, 0, 0, 0, 0],\n        [0, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n        [0, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n        [0, 0, 1, 1, 1, 1, 0, 0, 0, 0],\n        [0, 0, 0, 0, 1, 1, 1, 0, 0, 0],\n        [0, 0, 0, 0, 0, 1, 1, 1, 1, 0],\n        [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 0, 0, 1, 1, 1]\n    ])\n    assert np.array_equal(res, exp)\n\n\ndef test_RP_recurrence_rate():\n    x = Data.SmallTestData().observable()\n    RP = RecurrencePlot(x, recurrence_rate=.4)\n    res = RP.recurrence_matrix()\n    assert res.dtype == ADJ\n    exp = np.array([\n        [1, 1, 0, 0, 0, 0, 0, 0, 0, 0],\n        [1, 1, 1, 1, 0, 0, 0, 0, 0, 0],\n        [0, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n        [0, 1, 1, 1, 1, 1, 0, 0, 0, 0],\n        [0, 0, 1, 1, 1, 1, 0, 0, 0, 0],\n        [0, 0, 0, 1, 1, 1, 1, 0, 0, 0],\n        [0, 0, 0, 0, 0, 1, 1, 1, 1, 0],\n        [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 0, 0, 1, 1, 1]\n    ])\n    assert np.array_equal(res, exp)\n\n\ndef test_RP_local_recurrence_rate():\n    x = Data.SmallTestData().observable()\n    RP = RecurrencePlot(x, local_recurrence_rate=.6)\n    res = RP.recurrence_matrix()\n    assert res.dtype == ADJ\n    exp = np.array([\n        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n        [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n        [0, 1, 1, 1, 1, 1, 0, 0, 0, 0],\n        [0, 0, 1, 1, 1, 1, 1, 0, 0, 0],\n        [0, 0, 0, 1, 1, 1, 1, 1, 0, 0],\n        [0, 0, 0, 0, 1, 1, 1, 1, 1, 0],\n        [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],\n        [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]\n    ])\n    assert np.array_equal(res, exp)\n\n\n# -----------------------------------------------------------------------------\n# prepare fixtures\n# -----------------------------------------------------------------------------\n\n\n@pytest.fixture(scope=\"module\", name=\"recurrence_crit\", ids=str,\n                params=list(chain(product(np.arange(0, 1.7, .8), [None]),\n                                  product([None], np.arange(0, 1.1, .4)))))\ndef recurrence_crit_fixture(request):\n    threshold, rate = request.param\n    assert np.sum([threshold is None, rate is None]) == 1\n    return request.param\n\n\n@pytest.fixture(scope=\"module\", name=\"small_RP\")\ndef small_RP_fixture(metric, recurrence_crit):\n    \"\"\"\n    RP fixture, parametrized to cover various settings.\n    \"\"\"\n    x = Data.SmallTestData().observable()\n    threshold, rate = recurrence_crit\n    return RecurrencePlot(\n        x, threshold=threshold, recurrence_rate=rate, metric=metric)\n\n\n@pytest.fixture(scope=\"module\", name=\"small_RP_basic\", params=[False, True])\ndef small_RP_basic_fixture(request):\n    \"\"\"\n    RP fixture with single basic setting to test numerical results.\n    \"\"\"\n    sparse = request.param\n    x = Data.SmallTestData().observable()\n    RP = RecurrencePlot(x, threshold=.8, metric='supremum', sparse_rqa=sparse)\n    if not sparse:\n        res = RP.recurrence_matrix()\n        assert res.dtype == ADJ\n        exp = np.array([\n            [1, 1, 1, 0, 0, 0, 0, 0, 0, 0],\n            [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n            [1, 1, 1, 1, 1, 0, 0, 0, 0, 0],\n            [0, 1, 1, 1, 1, 1, 0, 0, 0, 0],\n            [0, 1, 1, 1, 1, 1, 1, 0, 0, 0],\n            [0, 0, 0, 1, 1, 1, 1, 1, 0, 0],\n            [0, 0, 0, 0, 1, 1, 1, 1, 1, 1],\n            [0, 0, 0, 0, 0, 1, 1, 1, 1, 1],\n            [0, 0, 0, 0, 0, 0, 1, 1, 1, 1],\n            [0, 0, 0, 0, 0, 0, 1, 1, 1, 1]\n        ])\n        assert np.array_equal(res, exp)\n    return RP\n\n\n# -----------------------------------------------------------------------------\n# test RecurrencePlot RQA\n# -----------------------------------------------------------------------------\n\n\n@pytest.mark.parametrize(\"measure\", [\"diag\", \"vert\", \"white_vert\"])\ndef test_line_dist(measure: str, small_RP):\n    res = getattr(small_RP, f\"{measure}line_dist\")()\n    assert res.dtype == NODE\n    assert res.shape[0] == small_RP.N\n    assert (0 <= res).all() and (res <= small_RP.N).all()\n\n\n@pytest.mark.parametrize(\n    \"measure, exp\",\n    [(\"diag\", [4, 0, 0, 0, 0, 0, 0, 2, 2, 0]),\n     (\"vert\", [0, 0, 1, 2, 5, 2, 0, 0, 0, 0]),\n     (\"white_vert\", [2, 1, 2, 2, 3, 2, 1, 0, 0, 0])])\ndef test_line_dist_numeric(measure: str, small_RP_basic, exp):\n    if small_RP_basic.sparse_rqa and measure == \"white_vert\":\n        return\n    res = getattr(small_RP_basic, f\"{measure}line_dist\")()\n    assert res.dtype == NODE\n    assert res.shape[0] == small_RP_basic.N\n    assert np.array_equal(res, exp)\n\n\n@pytest.mark.parametrize(\"sparse\", [False, True])\ndef test_line_dist_edgecases(sparse):\n    x = Data.SmallTestData().observable()\n\n    RP = RecurrencePlot(x, metric=\"supremum\", threshold=0., sparse_rqa=sparse)\n    assert RP.max_diaglength() == 0\n    assert RP.max_vertlength() == 0\n    if not sparse:\n        assert RP.max_white_vertlength() == RP.N\n\n    RP = RecurrencePlot(x, metric=\"supremum\", threshold=2., sparse_rqa=sparse)\n    assert RP.max_diaglength() == (RP.N - 1)\n    assert RP.max_vertlength() == RP.N\n    if not sparse:\n        assert RP.max_white_vertlength() == 0\n\n\ndef test_rqa_summary(small_RP):\n    res = small_RP.rqa_summary()\n    measures = ['RR', 'DET', 'L', 'LAM']\n    assert all(res[m].dtype == DFIELD for m in measures)\n\n\ndef test_rqa_summary_numeric(small_RP_basic):\n    res = small_RP_basic.rqa_summary()\n    exp = {'RR': 0.48, 'DET': 0.8947, 'L': 8.4999, 'LAM': 0.9999}\n    assert all(np.isclose(res[m], val, atol=1e-04)\n               for m, val in exp.items())\n\n\n@pytest.mark.parametrize('measure', ['diagline', 'vertline'])\n@pytest.mark.parametrize('M', np.arange(5, 90, 40).tolist())\ndef test_resample_line_dist(measure: str, M: int, small_RP):\n    res = getattr(small_RP, f\"resample_{measure}_dist\")(M)\n    assert res.dtype == NODE\n    assert res.shape[0] == small_RP.N\n    assert (0 <= res).all()\n\n\n@pytest.mark.parametrize(\n    \"var, exp\", [(\"trapping\", 4.7999), (\"mean_recurrence\", 3.9999)])\ndef test_time(small_RP_basic, var, exp):\n    if small_RP_basic.sparse_rqa and var == \"mean_recurrence\":\n        return\n    res = getattr(small_RP_basic, f\"{var}_time\")()\n    assert np.isclose(res, exp, atol=1e-04)\n\n\n# test entropy\n\n@pytest.mark.parametrize(\n    \"ts, measure, value\",\n    [(np.array([4, 7, 9, 10, 6, 11, 3]), m, v)\n     for m, v in [(\"permutation\", 0.5888), (\"complexity\", 0.29)]]\n    + [(np.arange(20), \"complexity\", 0.0)])\ndef test_entropy(ts: np.ndarray, measure: str, value: float):\n    rp = RecurrencePlot(ts[:, np.newaxis], threshold=1, dim=3, tau=1)\n    assert np.isclose(getattr(rp, f\"{measure}_entropy\")(), value, atol=1e-04)\n\n\n@pytest.mark.parametrize(\n    'measure, exp',\n    [('diag', 0.6931), ('vert', 1.2206), ('white_vert', 1.8848)])\ndef test_line_dist_entropy(measure: str, exp: float, small_RP_basic):\n    if small_RP_basic.sparse_rqa and measure == \"white_vert\":\n        return\n    res = getattr(small_RP_basic, f\"{measure}_entropy\")()\n    assert np.isclose(res, exp, atol=1e-04)\n"
  },
  {
    "path": "tests/test_timeseries/test_timeseries.py",
    "content": "# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\"\"\"\nSimple tests for the timeseries class.\n\"\"\"\n\nimport pytest\nimport numpy as np\nfrom numpy.testing import assert_array_almost_equal\n\nfrom pyunicorn.timeseries import RecurrencePlot, CrossRecurrencePlot, \\\n    RecurrenceNetwork, JointRecurrenceNetwork, InterSystemRecurrenceNetwork, \\\n    Surrogates, VisibilityGraph\nfrom pyunicorn.core.data import Data\nfrom pyunicorn.core._ext.types import DFIELD\n\n\ndef create_test_data():\n    # Create test time series\n    tdata = Data.SmallTestData().observable()\n    # subtract means form the input data\n    tdata -= np.mean(tdata, axis=1)[:, None]\n    # normalize the data\n    tdata /= np.sqrt(np.sum(tdata*tdata, axis=1))[:, None]\n    return tdata\n\n\n# -----------------------------------------------------------------------------\n# cross_recurrence_plot\n# -----------------------------------------------------------------------------\n\n\n@pytest.mark.parametrize(\"thresh, rr\", [(.2, None), (None, .2)])\ndef testCrossRecurrencePlot(thresh, rr, metric: str):\n    # create two instances of the same test dataset\n    tdata1 = create_test_data()\n    x1 = tdata1[:, 0]\n    y1 = tdata1[:, 1]\n    tdata2 = create_test_data()\n    x2 = tdata2[:, 0]\n    y2 = tdata2[:, 1]\n    # create CrossRecurrencePlot for both\n    crp1 = CrossRecurrencePlot(\n            x1, y1, threshold=thresh, recurrence_rate=rr, metric=metric)\n    crp2 = CrossRecurrencePlot(\n            x2, y2, threshold=thresh, recurrence_rate=rr, metric=metric)\n    # get respective distance matrices\n    dist_1 = crp1.distance_matrix(metric)\n    dist_2 = crp2.distance_matrix(metric)\n    # get respective recurrence matrices\n    CR1 = crp1.recurrence_matrix()\n    CR2 = crp2.recurrence_matrix()\n\n    assert np.allclose(dist_1, dist_2, atol=1e-04)\n    assert CR1.shape == CR2.shape\n    assert CR1.shape == (len(x1), len(y1))\n    assert CR1.dtype == CR2.dtype\n    assert CR1.dtype == np.int8\n\n\n# -----------------------------------------------------------------------------\n# recurrence_network\n# -----------------------------------------------------------------------------\n\n@pytest.mark.parametrize(\"thresh, rr\",\n                         [(.2, None), (None, .2)], ids=str)\ndef testRecurrenceNetwork(thresh, rr, metric: str):\n    # create two instances of the same test dataset\n    tdata1 = create_test_data()\n    tdata2 = create_test_data()\n    # create RecurrenceNetwork for both\n    rn1 = RecurrenceNetwork(\n            tdata1, threshold=thresh, recurrence_rate=rr, metric=metric)\n    rn2 = RecurrenceNetwork(\n            tdata2, threshold=thresh, recurrence_rate=rr, metric=metric)\n    # get respective adjacency matrices\n    A1 = rn1.adjacency\n    A2 = rn2.adjacency\n\n    assert np.array_equal(A1, A2)\n    assert A1.shape == A2.shape\n    assert A1.shape == (len(tdata1), len(tdata1))\n    assert A1.dtype == A2.dtype\n    assert A1.dtype == np.int16\n\n\ndef testRecurrenceNetwork_setters():\n    tdata = create_test_data()\n    rn = RecurrenceNetwork(tdata, threshold=.2)\n    # recalculate with different fixed threshold\n    rn.set_fixed_threshold(.3)\n    assert rn.adjacency.shape == (len(tdata), len(tdata))\n    # recalculate with fixed threshold in units of the ts' std\n    rn.set_fixed_threshold_std(.3)\n    assert rn.adjacency.shape == (len(tdata), len(tdata))\n    # recalculate with fixed recurrence rate\n    rn.set_fixed_recurrence_rate(.2)\n    assert rn.adjacency.shape == (len(tdata), len(tdata))\n    # recalculate with fixed local recurrence rate\n    rn.set_fixed_local_recurrence_rate(.2)\n    assert rn.adjacency.shape == (len(tdata), len(tdata))\n\n\n# -----------------------------------------------------------------------------\n# joint_recurrence_network\n# -----------------------------------------------------------------------------\n\n\ndef testJointRecurrenceNetwork(metric: str):\n    tdata = create_test_data()\n    x = tdata[:, 0]\n    y = tdata[:, 1]\n    n = len(tdata)\n    jrp = JointRecurrenceNetwork(x, y, threshold=(.1, .1),\n                                 metric=(metric, metric))\n    dist = {}\n    for i in \"xy\":\n        jrp.embedding = getattr(jrp, f\"{i}_embedded\")\n        dist[i] = jrp.distance_matrix(metric=metric)\n    assert all(d.shape == (n, n) for d in dist.values())\n    assert jrp.recurrence_matrix().shape == (n, n)\n\n\n# -----------------------------------------------------------------------------\n# inter_system_recurrence_network\n# -----------------------------------------------------------------------------\n\n\n@pytest.mark.parametrize(\"thresh, rr\",\n                         [((.2, .3, .2), None), (None, (.2, .3, .2))], ids=str)\ndef testInterSystemRecurrenceNetwork(thresh, rr, metric: str):\n    # create two instances of the same test dataset\n    tdata1 = create_test_data()\n    x1 = tdata1[:, 0]\n    y1 = tdata1[:, 1]\n    tdata2 = create_test_data()\n    x2 = tdata2[:, 0]\n    y2 = tdata2[:, 1]\n    # create InterSystemRecurrenceNetwork for both\n    isrn1 = InterSystemRecurrenceNetwork(\n            x1, y1, threshold=thresh, recurrence_rate=rr, metric=metric)\n    isrn2 = InterSystemRecurrenceNetwork(\n            x2, y2, threshold=thresh, recurrence_rate=rr, metric=metric)\n    # get respective adjacency matrices\n    A1 = isrn1.adjacency\n    A2 = isrn2.adjacency\n\n    assert np.array_equal(A1, A2)\n    assert A1.shape == A2.shape\n    assert A1.shape == (len(x1)*2, len(y1)*2)\n    assert A1.dtype == A2.dtype\n    assert A1.dtype == np.int16\n\n\n# -----------------------------------------------------------------------------\n# surrogates\n# -----------------------------------------------------------------------------\n\n\ndef testNormalizeOriginalData():\n    ts = Surrogates.SmallTestData()\n    ts.normalize_original_data()\n\n    res = ts.original_data.mean(axis=1)\n    exp = np.array([0., 0., 0., 0., 0., 0.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n    res = ts.original_data.std(axis=1)\n    exp = np.array([1., 1., 1., 1., 1., 1.])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef testEmbedTimeSeriesArray():\n    ts = Surrogates.SmallTestData()\n    res = Surrogates.embed_time_series_array(\n        time_series_array=ts.original_data,\n        dimension=3, delay=2)[0, :6, :]\n    exp = np.array([[0., 0.61464833, 1.14988147],\n                    [0.31244015, 0.89680225, 1.3660254],\n                    [0.61464833, 1.14988147, 1.53884177],\n                    [0.89680225, 1.3660254, 1.6636525],\n                    [1.14988147, 1.53884177, 1.73766672],\n                    [1.3660254, 1.6636525, 1.76007351]])\n    assert np.allclose(res, exp, atol=1e-04)\n\n\ndef testSurrogatesRecurrencePlot():\n    thresh = .2\n    dim = 3\n    tau = 2\n    # calculate Surrogates.recurrence_plot()\n    ts = Surrogates.SmallTestData()\n    embedding = Surrogates.\\\n        embed_time_series_array(ts.original_data, dimension=dim, delay=tau)\n    rp1 = Surrogates.recurrence_plot(embedding[0], threshold=thresh)\n    # compare to timeseries.RecurrencePlot\n    rp2 = RecurrencePlot(\n        ts.original_data[0], threshold=thresh, dim=dim, tau=tau).R\n    assert np.array_equal(rp1, rp2)\n\n\ndef testWhiteNoiseSurrogates():\n    ts = Surrogates.SmallTestData()\n    surrogates = ts.white_noise_surrogates()\n\n    assert np.allclose(np.histogram(ts.original_data[0, :])[0],\n                       np.histogram(surrogates[0, :])[0])\n\n\ndef testCorrelatedNoiseSurrogates():\n    ts = Surrogates.SmallTestData()\n    surrogates = ts.correlated_noise_surrogates()\n    assert np.allclose(np.abs(np.fft.fft(ts.original_data, axis=1))[0, 1:10],\n                       np.abs(np.fft.fft(surrogates, axis=1))[0, 1:10])\n\n\ndef testTwinSurrogates():\n    tdata = create_test_data()\n    ts = Surrogates(tdata)\n    tsurro = ts.twin_surrogates(1, 0, 0.2)\n    corrcoef = np.corrcoef(tdata, tsurro)[ts.N:, :ts.N]\n    for i in range(ts.N):\n        corrcoef[i, i] = 0.0\n    assert (corrcoef >= -1.0).all() and (corrcoef <= 1.0).all()\n\n\ndef testAAFTSurrogates():\n    ts = Surrogates.SmallTestData()\n    # also covers Surrogates.AAFT_surrogates(), which is used as starting point\n    surr_R, surr_s = ts.refined_AAFT_surrogates(n_iterations=3, output=\"both\")\n    # assert conserved amplitude distribution\n    assert all(np.histogram(ts.original_data[0, :])[0] ==\n               np.histogram(surr_R[0, :])[0])\n    # assert conserved power spectrum\n    assert np.allclose(np.abs(np.fft.fft(ts.original_data, axis=1))[0, 1:10],\n                       np.abs(np.fft.fft(surr_s, axis=1))[0, 1:10])\n\n\ndef testPearsonCorrelation():\n    tdata = create_test_data()\n    n_index, n_times = tdata.shape\n    norm = 1.0 / float(n_times)\n    c = Surrogates.test_pearson_correlation(tdata, tdata)\n    corrcoef = np.corrcoef(tdata, tdata)[n_index:, :n_index]*norm\n    for i in range(n_index):\n        corrcoef[i, i] = 0.0\n\n    assert c.shape == (n_index, n_index)\n    assert_array_almost_equal(c, corrcoef, decimal=5)\n\n\ndef testMutualInformation():\n    tdata = create_test_data()\n    test_mi = Surrogates.test_mutual_information(tdata[:1], tdata[-1:],\n                                                 n_bins=32)\n    assert (test_mi >= -1.0).all() and (test_mi <= 1.0).all()\n\n\ndef testOriginalDistribution():\n    nbins = 10\n    ts = Surrogates.SmallTestData()\n    hist, lbb = ts.original_distribution(\n        Surrogates.test_mutual_information, n_bins=nbins)\n\n    assert np.isclose(hist.sum(), 1) and len(lbb) == nbins\n\n\ndef testThresholdSignificance():\n    nbins = 10\n    ts = Surrogates.SmallTestData()\n    density_estimate, lbb = ts.test_threshold_significance(\n        Surrogates.white_noise_surrogates,\n        Surrogates.test_mutual_information,\n        realizations=5,\n        interval=[0, 2],\n        n_bins=nbins)\n\n    assert np.isclose(density_estimate.sum(), 1) and len(lbb) == nbins\n\n\n# -----------------------------------------------------------------------------\n# visibility_graph\n# -----------------------------------------------------------------------------\n\n\ndef create_test_timeseries():\n    \"\"\"\n    Return test time series including random values and timings\n    with 10 sampling points.\n\n    :rtype: 2D array\n    :return: a timeseries for testing purposes\n    \"\"\"\n    #  Create time series\n    ts = np.zeros((2, 10))\n\n    for i in range(2):\n        ts[i, :] = np.random.rand(10)\n\n    ts[1, :].sort()\n\n    return ts\n\n\n# def testVisibility():\n#     x, t = create_test_timeseries()\n#     n_times = len(t)\n#     vg = VisibilityGraph(x, timings=t)\n#     # Choose two different, not neighbouring random nodes i, j\n#     node1, node2 = 0, 0\n#     while (abs(node2-node1)<=1):\n#         node1 = np.int32(np.floor(np.random.rand()*n_times))\n#         node2 = np.int32(np.floor(np.random.rand()*n_times))\n\n#     # the following returns incorrect results, assertion therefore failing\n#     i, j = min(node1, node2), max(node1, node2)\n#     test = np.zeros((j-(i+1)))\n#     for k in range(i+1,j):\n#         test[k-(i+1)] = np.less((x[k]-x[i]) / (t[k]-t[i]),\n#                                 (x[j]-x[i]) / (t[j]-t[i]))\n\n#     assert np.invert(bool(np.sum(test))) == vg.visibility(node1, node2)\n\n\ndef testVisibility():\n    x, t = create_test_timeseries()\n    vg = VisibilityGraph(x, timings=t)\n    A = vg.adjacency\n\n    assert A.shape == (len(x), len(x))\n    assert A.dtype == np.int16\n\n\ndef testVisibilityHorizontal():\n    x, t = create_test_timeseries()\n    vg = VisibilityGraph(x, timings=t, horizontal=True)\n    A = vg.adjacency\n\n    assert A.shape == (len(x), len(x))\n    assert A.dtype == np.int16\n\n\ndef testRetardedLocalClustering():\n    x, t = create_test_timeseries()\n    vg = VisibilityGraph(x, timings=t)\n    C_ret = vg.retarded_local_clustering()\n\n    assert C_ret.shape == x.shape\n    assert C_ret.dtype == DFIELD\n\n\ndef testAdvancedLocalClustering():\n    x, t = create_test_timeseries()\n    vg = VisibilityGraph(x, timings=t)\n    C_adv = vg.advanced_local_clustering()\n\n    assert C_adv.shape == x.shape\n    assert C_adv.dtype == DFIELD\n"
  },
  {
    "path": "tools/update-copyright",
    "content": "#! /usr/bin/env bash\n#\n# This file is part of pyunicorn.\n# Copyright (C) 2008--2026 Jonathan F. Donges and pyunicorn authors\n# URL: <https://www.pik-potsdam.de/members/donges/software-2/software>\n# License: BSD (3-clause)\n#\n# Please acknowledge and cite the use of this software and its authors\n# when results are used in publications or published elsewhere.\n#\n# You can use the following reference:\n# J.F. Donges, J. Heitzig, B. Beronov, M. Wiedermann, J. Runge, Q.-Y. Feng,\n# L. Tupikina, V. Stolbova, R.V. Donner, N. Marwan, H.A. Dijkstra,\n# and J. Kurths, \"Unified functional network and nonlinear time series analysis\n# for complex systems science: The pyunicorn package\"\n\n\n# default configuration\nfirst_year=2008\nold_last_year=\"\"\nnew_last_year=\"\"\n\n# evaluate arguments\nif !(( $# == 1 || $# == 2 )); then\n    echo \"Expecting 1 or 2 arguments:\"\n    echo \"   old_last_year [new_last_year]\"\n    echo \"   (int)         (int)\"\n    exit 1\nfi;\nold_last_year=$(($1))\nif (( $# == 2 )); then\n    new_last_year=$(($2)); else\n    new_last_year=$(($old_last_year + 1))\nfi;\n\n# determine absolute path of repository\nrepo=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")/..\" && pwd)\"; cd $repo\n\n# update copyright notices\ngrep -rlIE --exclude-dir=\".git\" --exclude-dir=\".tox\" --exclude-dir=\"build\" \\\n    \"$first_year-+$old_last_year\" \\\n    | xargs sed -i\"\" -E -e \"s:($first_year-+)$old_last_year:\\1$new_last_year:g\"\n"
  }
]