From 7e5a4a62ed314d7e954b9a366837de536ffc70c5 Mon Sep 17 00:00:00 2001 From: Mark Bonicillo Date: Fri, 2 Feb 2024 13:12:13 -0800 Subject: [PATCH 1/9] HYP-392 Update post-installation steps documentation --- docs/source/install.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/source/install.rst b/docs/source/install.rst index ca103f5d..da2690c7 100644 --- a/docs/source/install.rst +++ b/docs/source/install.rst @@ -87,6 +87,12 @@ Post-Installation Actions Running Tests ************** +To run all the tests, ensure that you first install the testing dependencies: + + >>> pip install -e .['testing'] + +Then try running all the tests: + >>> python -m pytest Interact with HyperNetX in a REPL From 40bc072bd3f3a96d44aa45223c9ec45fed48cea1 Mon Sep 17 00:00:00 2001 From: Mark Bonicillo Date: Fri, 2 Feb 2024 14:19:21 -0800 Subject: [PATCH 2/9] HYP-391 Update Contributing guide --- CONTRIBUTING.md | 67 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ccc6d8fa..0ce966d7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,39 +1,66 @@ -# Contributor orientation +# Contributing to HyperNetX -If you have ideas for improving this project, we would love to hear from you! +## Code of Conduct -## Orientation +We want this community to be friendly and respectful to each other. Please read [the full text](CODE_OF_CONDUCT.md) so that you can understand what actions will and will not be tolerated. + +## Requirements + +- Python >=3.8,<3.12 + +## Our Development Process + +### Development workflow + +> **Working on your first pull request?** You can learn how from this *free* series: [How to Contribute to an Open Source Project on GitHub](https://docs.github.com/en/get-started/exploring-projects-on-github/contributing-to-a-project). + +1. Fork the repo and create your branch from the `develop` branch. Here's a guide on [how to fork a repository](https://help.github.com/articles/fork-a-repo/). +1. Create a Python virtual environment. For convenience, our Makefile provides a target called 'venv' that will create a virtual environment for you. Run the following command: `make venv` +1. Activate the virtual environment. If you used the Makefile target in the previous step, activate the virtual environment by the running the following command: `source venv-hnx/bin/activate` +1. Install the library in development mode: `pip install -e .` +1. Install testing dependencies: `pip install -e .['testing'] ` +1. Do the changes you want and ensure all tests pass by running `python -m pytest` before sending a pull request. + +### Commit message convention + +Ensure that commit messages begin with a verb and are in the present tense. Write meaningful commit messages that concisely describes the changes in a commit. +Read this blog post, [How to Write a Git Commit Message](https://cbea.ms/git-commit/) for some guidance. + +### Linting and tests + + We use `pylint` and `black` for linting and formatting the code, and `pytest` for testing. + +We have included a pre-commit config file that can be used to install pre-commit hooks that will lint your code changes every time you create a commit. +To install pre-commit, you must first install the testing dependencies: `pip install -e .['testing']`. Then run: `pre-commit install`. + +Once installed, every time you create a new commit, the linters and formatters will run on the changed code. It is highly recommended to use these `pre-commit` hooks +because these same hooks are run in our CI/CD pipelines on every pull request. Catching pre-commit issues early will prevent CI/CD pipeline issues on your pull request. + +### Sending a pull request + +- Prefer small pull requests focused on one change. +- Verify that and all tests are passing. +- Verify all in-code documentation is correct (it will be used to generate API documentation). -The world of open source is wide; it can be a lot to take in! If this is your first time working with an open source project, then welcome! If you're an experienced contributor, then welcome back! Either way, this online resource might help you [get oriented, or brush up](https://opensource.guide/how-to-contribute/) on the process. ## Report an issue, bug, or feature request -Here are the [steps to creating an issue on github](https://docs.github.com/en/issues/tracking-your-work-with-issues/quickstart). When reporting a bug, +Here are the [steps to creating an issue on GitHub](https://docs.github.com/en/issues/tracking-your-work-with-issues/quickstart). When reporting a bug, -- search for related issues on Github. You might be able to get answer without the hassle of creating an issue +- search for related issues on GitHub. You might be able to get answer without the hassle of creating an issue - describe the current behavior and explain which behavior you expected to see instead and why. At this point you can also tell which alternatives do not work for you. - (if applicable) provide error messages - (if applicable) provide a step by step description of the problem; if possible include code that others can use to reproduce it - You may want to **include screenshots and animated GIFs** which help you demonstrate the steps or point out the part which the suggestion is related to. You can use [this tool](https://www.cockos.com/licecap/) to record GIFs on macOS and Windows, and [this tool](https://github.com/colinkeenan/silentcast) or [this tool](https://github.com/GNOME/byzanz) on Linux. - - provide clear, specific title + - provide a clear, specific title - include details on your setup (operating system, python version, etc.) -- use the most recent version of this library and the source language (e.g. Rust); that fixes a lot of problems +- use the most recent version of this library and the source language (e.g. Python); that fixes a lot of problems - here are [more details on getting the most out of issue reporting!](https://marker.io/blog/how-to-write-bug-report) -## Contribute new code - -Here is a [step-by-step guide to writing new code, and submiting it to the project](https://docs.github.com/en/get-started/quickstart/contributing-to-projects) - -The more you know about a software library, the easier it is to get started writing code. The best way to learn about this project is its the documentation! See `README.md` to get started. - ## Where can I go for help? If you're stuck or don't know where to begin, then you're in good company -- we've all been there! We're here to help, and we'd love to hear from you: -- open a issue report on Github -- email us at - -# Code of conduct - -Our shared values as software developers guide us in our day-to-day interactions and decision-making. Our open source projects are no exception. Trust, respect, collaboration and transparency are core values we believe should live and breathe within our projects. Our community welcomes participants from around the world with different experiences, unique perspectives, and great ideas to share. Our [code of conduct](CODE_OF_CONDUCT.md) describes these values, and our standards for contributing. +- open an issue report on [GitHub](https://github.com/pnnl/HyperNetX/issues) +- email us at [hypernetx@pnnl.gov](mailto:hypernetx@pnnl.gov) From fac0670a88c0980f071e06e06f2c6a91f81aa45d Mon Sep 17 00:00:00 2001 From: "Bonicillo, Mark A" Date: Thu, 1 Feb 2024 19:56:10 +0000 Subject: [PATCH 3/9] Pull request #137: Update installation instructions for widget Merge in HYP/hypernetx from HYP-384-hnx-widget-not-rendering-on-jupyter-lab to develop * commit '53dc408129d1fc2ea8bff3b9620589fe179c510c': Update installation instructions for widget --- docs/source/widget.rst | 72 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/docs/source/widget.rst b/docs/source/widget.rst index 3c5ffcdc..8776024d 100644 --- a/docs/source/widget.rst +++ b/docs/source/widget.rst @@ -11,17 +11,77 @@ Hypernetx-Widget Overview -------- -The HyperNetXWidget_ is an addon for HNX, which extends the built in visualization -capabilities of HNX to a JavaScript based interactive visualization. The tool has two main interfaces, +The HyperNetXWidget is an addon for HNX, which extends the built-in visualization +capabilities of HNX to a JavaScript based interactive visualization. The tool has two main interfaces, the hypergraph visualization and the nodes & edges panel. -You may `demo the widget here `_ +You may `demo the widget here `_. + +The HypernetxWidget is open source and +available on `GitHub `_ It is also `published on PyPi +`_ Installation ------------ -The HypernetxWidget_ is available on `GitHub `_ and may be -installed using pip: - >>> pip install hnxwidget +HyperNetXWidget is currently in beta and will only work on Jupyter Notebook 6.5.x. It is not supported on Jupyter Lab; +support for Jupyter Lab are still in planning. + +In addition, HyperNetXWidget must be installed using the `Anaconda platform `_ so that the +widget can render on Jupyter notebook. It is highly recommended to use the base environment provided by Anaconda because +Anaconda's package management system, `conda`, will resolve dependencies when HyperNetX and HyperNetXWidget are +installed. For more information on `conda` environments, please see `their documentation here. +`_ + +**Do not use python's built-in venv module or virtualenv to create a virtual environment; the widget will not render on +Jupyter notebook.** + +Prerequisites +^^^^^^^^^^^^^ +* conda 23.11.x +* python 3.11.x +* jupyter notebook 6.5.4 +* ipywidgets 7.6.5 + + +Installation Steps +^^^^^^^^^^^^^^^^^^ + +Open a new shell and run the following commands:: + + # update conda + conda update conda + + # activate the base environment + conda activate + + # install hypernetx and hnxwidget + pip install hypernetx hnxwidget + + # install jupyter notebook and extensions + conda install -y -c anaconda notebook + conda install -y -c conda-forge jupyter_contrib_nbextensions + + # install and enable the hnxwidget on jupyter + jupyter nbextension install --py --symlink --sys-prefix hnxwidget + jupyter nbextension enable --py --sys-prefix hnxwidget + + # install ipykernel and use it to add the base environment to jupyter notebook + conda install -y -c anaconda ipykernel + python -m ipykernel install --user --name=base + + # start the notebook + jupyter-notebook + + +Gotchas +^^^^^^^ + +If the notebook runs into a `ModuleNotFoundError` for the HyperNetX or HyperNetXWidget packages, ensure that you set +your kernel to the conda base environment (i.e. `base`). This will ensure that your notebook has the right environment +to run the widget. For more information on setting the environment in Jupyter notebook, see +`How to add your Conda environment to your jupyter notebook in just 4 steps. +`_ + Using the Tool -------------- From 0f9c227b72ee13e4d18c3d4ad52e866e6f62f546 Mon Sep 17 00:00:00 2001 From: Mark Bonicillo Date: Fri, 2 Feb 2024 15:06:32 -0800 Subject: [PATCH 4/9] HYP-389 Fix optional dependencies; update documentation --- docs/source/install.rst | 16 ++++++++++++++++ hypernetx/algorithms/contagion.py | 8 ++++---- hypernetx/algorithms/hypergraph_modularity.py | 15 +++++++++------ setup.cfg | 2 +- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/docs/source/install.rst b/docs/source/install.rst index da2690c7..4ce55380 100644 --- a/docs/source/install.rst +++ b/docs/source/install.rst @@ -95,6 +95,22 @@ Then try running all the tests: >>> python -m pytest + +Dependencies for some Submodules +******************************** + +Two submodules in the library, ``hypernetx.algorithms.hypergraph_modularity`` and ``hypernetx.algorithms.contagion``, +require some additional dependencies. If you want to use those submodules, you will need to install those dependencies. + +For ``hypernetx.algorithms.hypergraph_modularity``, install the following: + + >>> pip install 'igraph>=0.10.4' + +For ``hypernetx.algorithms.contagion``, install the following: + + >>> pip install 'celluloid>=0.2.0' + + Interact with HyperNetX in a REPL ******************************************** diff --git a/hypernetx/algorithms/contagion.py b/hypernetx/algorithms/contagion.py index ec12acf4..74e628e7 100644 --- a/hypernetx/algorithms/contagion.py +++ b/hypernetx/algorithms/contagion.py @@ -68,10 +68,10 @@ def contagion_animation( try: from celluloid import Camera except ModuleNotFoundError as e: - print( - f" {e}. If you need to use {__name__}, please install additional packages by running the following command: pip install .['all']" - ) - raise + raise Exception( + f"If you need to use {__name__}, please install additional packages by running the " + f"following command: pip install .['all']" + ) from e nodeState = defaultdict(lambda: "S") diff --git a/hypernetx/algorithms/hypergraph_modularity.py b/hypernetx/algorithms/hypergraph_modularity.py index a5ea7c99..161661fd 100644 --- a/hypernetx/algorithms/hypergraph_modularity.py +++ b/hypernetx/algorithms/hypergraph_modularity.py @@ -18,12 +18,6 @@ import itertools from scipy.stats import binom -try: - import igraph as ig -except ModuleNotFoundError as e: - print( - f" {e}. If you need to use {__name__}, please install additional packages by running the following command: pip install .['all']" - ) ################################################################################ # we use 2 representations for partitions (0-based part ids): @@ -278,6 +272,15 @@ def two_section(HG): : igraph.Graph The 2-section graph built from HG """ + + try: + import igraph as ig + except ModuleNotFoundError as e: + raise Exception( + f" {e}. If you need to use {__name__}, please install additional packages by running the " + f"following command: pip install .['all']" + ) from e + s = [] for e in HG.edges: E = HG.edges[e] diff --git a/setup.cfg b/setup.cfg index 110d528b..6e3a021e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -93,7 +93,7 @@ testing = igraph>=0.10.4 tutorials = jupyter>=1.0 - python-igraph>=0.10.4 + igraph>=0.10.4 partition-igraph>=0.0.6 celluloid>=0.2.0 widget = From 4ebf35b97aab0120aaa9bab67369fae057c40634 Mon Sep 17 00:00:00 2001 From: Mark Bonicillo Date: Fri, 2 Feb 2024 15:26:28 -0800 Subject: [PATCH 5/9] HYP-389 Remove testing dependency; update test --- .../tests/test_hypergraph_by_setsystem.py | 17 ++++++++--------- setup.cfg | 1 - tox.ini | 1 - 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/hypernetx/classes/tests/test_hypergraph_by_setsystem.py b/hypernetx/classes/tests/test_hypergraph_by_setsystem.py index 7b4f0e81..6cc7fdcc 100644 --- a/hypernetx/classes/tests/test_hypergraph_by_setsystem.py +++ b/hypernetx/classes/tests/test_hypergraph_by_setsystem.py @@ -1,5 +1,4 @@ import pytest -from pytest_lazyfixture import lazy_fixture as lf from hypernetx import Hypergraph @@ -23,18 +22,18 @@ def test_(hyp: Hypergraph, expected): @pytest.mark.parametrize( - "hyp, expected", + "hypergraph_fixture", [ - (lf("hyp_no_props"), None), - (lf("hyp_df_with_props"), None), - (lf("hyp_dict_with_props"), None), - (lf("hyp_props_on_edges_nodes"), None), + ("hyp_no_props"), + ("hyp_df_with_props"), + ("hyp_dict_with_props"), + ("hyp_props_on_edges_nodes"), ], ) -def test_dual(hyp: Hypergraph, expected): - actual = hyp.dual() +def test_dual(hypergraph_fixture, request): + actual = request.getfixturevalue(hypergraph_fixture).dual() # assertions on the hypergraph assert isinstance(actual, Hypergraph) # assertions on the actual result compared to the expected result that was defined in the parameterize decorator - assert actual != expected + assert actual is not None diff --git a/setup.cfg b/setup.cfg index 6e3a021e..906181c0 100644 --- a/setup.cfg +++ b/setup.cfg @@ -80,7 +80,6 @@ linting = testing = pytest>=7.2.2 pytest-cov>=4.1.0 - pytest-lazy-fixture>=0.6.3 pytest-xdist>=3.2.1 pytest-env tox>=4.4.11 diff --git a/tox.ini b/tox.ini index 5c9608d1..e73113e8 100644 --- a/tox.ini +++ b/tox.ini @@ -17,7 +17,6 @@ deps = celluloid>=0.2.0 igraph>=0.10.4 nbmake>=1.4.1 - pytest-lazy-fixture>=0.6.3 pytest-xdist>=3.2.1 partition-igraph>=0.0.6 allowlist_externals = env From 894e700555e348675e5b5266983e7f28df9312e6 Mon Sep 17 00:00:00 2001 From: Mark Bonicillo Date: Mon, 12 Feb 2024 10:19:00 -0800 Subject: [PATCH 6/9] Update contributing authors --- LONG_DESCRIPTION.rst | 4 ++-- README.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/LONG_DESCRIPTION.rst b/LONG_DESCRIPTION.rst index 4de24045..1c7ed11e 100644 --- a/LONG_DESCRIPTION.rst +++ b/LONG_DESCRIPTION.rst @@ -12,11 +12,11 @@ Hypernets project as part of its High Performance Data Analytics (HPDA) program. PNNL is operated by Battelle Memorial Institute under Contract DE-ACO5-76RL01830. * Principal Developer and Designer: Brenda Praggastis -* Development Team: Madelyn Shapiro, Mark Bonicillo +* Development Team: Audun Myers, Mark Bonicillo * Visualization: Dustin Arendt, Ji Young Yun * Principal Investigator: Cliff Joslyn * Program Manager: Brian Kritzstein -* Principal Contributors (Design, Theory, Code): Sinan Aksoy, Dustin Arendt, Mark Bonicillo, Helen Jenne, Cliff Joslyn, Nicholas Landry, Audun Myers, Christopher Potvin, Brenda Praggastis, Emilie Purvine, Greg Roek, Madelyn Shapiro, Mirah Shi, Francois Theberge, Ji Young Yun +* Principal Contributors (Design, Theory, Code): Sinan Aksoy, Dustin Arendt, Mark Bonicillo, Helen Jenne, Cliff Joslyn, Nicholas Landry, Audun Myers, Christopher Potvin, Brenda Praggastis, Emilie Purvine, Greg Roek, Mirah Shi, Francois Theberge, Ji Young Yun The code in this repository is intended to support researchers modeling data as hypergraphs. We have a growing community of users and contributors. diff --git a/README.md b/README.md index e5098c1b..0d3ba470 100644 --- a/README.md +++ b/README.md @@ -16,11 +16,11 @@ Hypernets project as part of its High Performance Data Analytics (HPDA) program. PNNL is operated by Battelle Memorial Institute under Contract DE-ACO5-76RL01830. * Principal Developer and Designer: Brenda Praggastis -* Development Team: Madelyn Shapiro, Mark Bonicillo +* Development Team: Audun Myers, Mark Bonicillo * Visualization: Dustin Arendt, Ji Young Yun * Principal Investigator: Cliff Joslyn * Program Manager: Brian Kritzstein -* Principal Contributors (Design, Theory, Code): Sinan Aksoy, Dustin Arendt, Mark Bonicillo, Helen Jenne, Cliff Joslyn, Nicholas Landry, Audun Myers, Christopher Potvin, Brenda Praggastis, Emilie Purvine, Greg Roek, Madelyn Shapiro, Mirah Shi, Francois Theberge, Ji Young Yun +* Principal Contributors (Design, Theory, Code): Sinan Aksoy, Dustin Arendt, Mark Bonicillo, Helen Jenne, Cliff Joslyn, Nicholas Landry, Audun Myers, Christopher Potvin, Brenda Praggastis, Emilie Purvine, Greg Roek, Mirah Shi, Francois Theberge, Ji Young Yun The code in this repository is intended to support researchers modeling data as hypergraphs. We have a growing community of users and contributors. From 65be3afbc16f2caf989f27af05a7c599684c922e Mon Sep 17 00:00:00 2001 From: Mark Bonicillo Date: Mon, 12 Feb 2024 10:19:59 -0800 Subject: [PATCH 7/9] Add Discussions section --- CONTRIBUTING.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0ce966d7..5ed2fed4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,6 +57,13 @@ Here are the [steps to creating an issue on GitHub](https://docs.github.com/en/i - use the most recent version of this library and the source language (e.g. Python); that fixes a lot of problems - here are [more details on getting the most out of issue reporting!](https://marker.io/blog/how-to-write-bug-report) +## Start a Discussion + +If you want a forum to collaborate and discuss topics or questions in more depth, feel free to start a discussion on our +[Github Discussions page](https://github.com/pnnl/HyperNetX/discussions). GitHub Discussions is a collaborative +communication forum for the community. Community members can ask and answer questions, share updates, have open-ended +conversations, and follow along on decisions affecting the community's way of working. + ## Where can I go for help? From dbc189fab7accf2cbbb7a6f03f842b80fb061a4f Mon Sep 17 00:00:00 2001 From: Mark Bonicillo Date: Mon, 12 Feb 2024 10:20:15 -0800 Subject: [PATCH 8/9] Update widget instructions; add screnshot --- docs/source/images/notebook_ipykernel.png | Bin 0 -> 49878 bytes docs/source/index.rst | 1 - docs/source/widget.rst | 28 ++++++++++++++++------ 3 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 docs/source/images/notebook_ipykernel.png diff --git a/docs/source/images/notebook_ipykernel.png b/docs/source/images/notebook_ipykernel.png new file mode 100644 index 0000000000000000000000000000000000000000..fbdc6b953414694c3c595e3c5b560922185195bc GIT binary patch literal 49878 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 z%0D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 literal 0 HcmV?d00001 diff --git a/docs/source/index.rst b/docs/source/index.rst index 9b8d9c17..a4f74479 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -57,7 +57,6 @@ Contents Algorithms: Modularity and Clustering Publications license - long_description Indices and tables diff --git a/docs/source/widget.rst b/docs/source/widget.rst index 8776024d..5805827a 100644 --- a/docs/source/widget.rst +++ b/docs/source/widget.rst @@ -20,11 +20,14 @@ The HypernetxWidget is open source and available on `GitHub `_ It is also `published on PyPi `_ +**The HyperNetX widget is currently in beta with limitations on the Jupyter environment in which it may be used. +It is being actively worked on. Look for improvements and an expanded list of usable environments in a future release.** + Installation ------------ -HyperNetXWidget is currently in beta and will only work on Jupyter Notebook 6.5.x. It is not supported on Jupyter Lab; -support for Jupyter Lab are still in planning. +HyperNetXWidget is currently in beta and will only work on Jupyter Notebook 6.5.x. It is not supported on Jupyter Lab, +but support for Jupyter Lab is in planning. In addition, HyperNetXWidget must be installed using the `Anaconda platform `_ so that the widget can render on Jupyter notebook. It is highly recommended to use the base environment provided by Anaconda because @@ -73,14 +76,25 @@ Open a new shell and run the following commands:: jupyter-notebook -Gotchas -^^^^^^^ +Conda Environment +^^^^^^^^^^^^^^^^^ If the notebook runs into a `ModuleNotFoundError` for the HyperNetX or HyperNetXWidget packages, ensure that you set your kernel to the conda base environment (i.e. `base`). This will ensure that your notebook has the right environment -to run the widget. For more information on setting the environment in Jupyter notebook, see -`How to add your Conda environment to your jupyter notebook in just 4 steps. -`_ +to run the widget. + +On the notebook, click the "New" drop-down button and select "base" as the environment for your notebook. See the +following screenshot as an example: + +.. image:: images/notebook_ipykernel.png + :width: 300px + :align: center + + +| +| For more information on setting the environment in Jupyter notebook, see + `How to add your Conda environment to your jupyter notebook in just 4 steps. + `_ Using the Tool From 3c14988c6b93571fcab8696a324624d75c1a01e7 Mon Sep 17 00:00:00 2001 From: Mark Bonicillo Date: Wed, 14 Feb 2024 15:46:52 -0800 Subject: [PATCH 9/9] =?UTF-8?q?bump:=20version=202.1.3=20=E2=86=92=202.1.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cz.toml | 2 +- docs/source/conf.py | 2 +- hypernetx/__init__.py | 2 +- setup.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.cz.toml b/.cz.toml index 70ea04bb..5b677217 100644 --- a/.cz.toml +++ b/.cz.toml @@ -1,6 +1,6 @@ [tool.commitizen] name = "cz_conventional_commits" -version = "2.1.3" +version = "2.1.4" version_files = [ "setup.py", "docs/source/conf.py", diff --git a/docs/source/conf.py b/docs/source/conf.py index 4d9094dc..1a379266 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -19,7 +19,7 @@ import os -__version__ = "2.1.3" +__version__ = "2.1.4" # If extensions (or modules to document with autodoc) are in another directory, diff --git a/hypernetx/__init__.py b/hypernetx/__init__.py index e06e64ab..ce93dde7 100644 --- a/hypernetx/__init__.py +++ b/hypernetx/__init__.py @@ -11,4 +11,4 @@ from hypernetx.utils import * from hypernetx.utils.toys import * -__version__ = "2.1.3" +__version__ = "2.1.4" diff --git a/setup.py b/setup.py index 51888922..c5c02d7c 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,5 @@ from setuptools import setup -__version__ = "2.1.3" +__version__ = "2.1.4" setup(version=__version__)