From 810d7e1e32359f7b363d039ffdb190e8629b9d32 Mon Sep 17 00:00:00 2001 From: JM Rohwer Date: Tue, 7 May 2024 21:48:53 +0200 Subject: [PATCH 1/7] Fix matching of symbols in assignment rules for 'data_sim_string' mod._CVODE_extra_output is obtained by getting data from mod.data_sim. Some symbol replacements were incorrect due to substring matching, leading to garbage code, e.g. when a symbol was a substring of a model parameter that also featured in the assignment rule. --- pysces/PyscesModel.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/pysces/PyscesModel.py b/pysces/PyscesModel.py index 22c671e..6bf175b 100644 --- a/pysces/PyscesModel.py +++ b/pysces/PyscesModel.py @@ -33,6 +33,7 @@ ''' import os, copy, time +import re import pickle import warnings try: @@ -4814,14 +4815,21 @@ def _update_assignment_rule_code(self, rule): or s in self.__rules__ or s in self.__species__ ): - # catch any _init so it doesn't get replaced - replacements.append((s + '_init', '_zzzz_')) + # deal with substrings in symbols + partialmatches = [] + for sym in rule['symbols']: + if not re.fullmatch(s, sym) and re.search(s, sym): + partialmatches.append(sym) + # catch any partial matches so they don't get replaced + for e in enumerate(partialmatches): + replacements.append((e[1], '_zzzz_' + str(e[0]) + '_z')) # replace symbol to get sim data replacements.append( ('self.' + s, 'self.data_sim.getSimData("' + s + '")[p:q,1]') ) - # revert the _init - replacements.append(('_zzzz_', s + '_init')) + # revert the partial match symbol + for e in enumerate(partialmatches): + replacements.append(('_zzzz_' + str(e[0]) + '_z', e[1])) for old, new in replacements: rule['data_sim_string'] = rule['data_sim_string'].replace(old, new) From 47d52519da4a2638021f791dc1f81f5e44c3b01c Mon Sep 17 00:00:00 2001 From: JM Rohwer Date: Tue, 7 May 2024 21:59:58 +0200 Subject: [PATCH 2/7] Remove 'Error 766' error message --- pysces/PyscesStoich.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pysces/PyscesStoich.py b/pysces/PyscesStoich.py index 80dfb9d..6da4e26 100644 --- a/pysces/PyscesStoich.py +++ b/pysces/PyscesStoich.py @@ -753,19 +753,12 @@ def PLUfactorize(self, a_in): ## except Exception, e: ## print "CLAPACK error", e - if a.shape[0] >= 500 or a.shape[1] >= 500: - print('\nMatrix {} using SciPy version: {} on {}'.format(a.shape, scipy.__version__, os.sys.platform)) - print('Error 766 error detector: only report this if your Python crashes now ...') - if Using_FLAPACK == 1: ## results = getrf(numpy.transpose(a)) # brett 20041226 results = getrf(a) # brett 201106 results = list(results) - if a.shape[0] >= 500 or a.shape[1] >= 500: - print('766 error did not occur please continue as normal {} ...'.format(a.shape)) - if results[2] < 0: print('Argument ', results['info'], ' had an illegal value') raise LinAlgError From bcc6a664726c597960ecd48f91f3f59e9fec5766 Mon Sep 17 00:00:00 2001 From: JM Rohwer Date: Thu, 9 May 2024 21:51:15 +0200 Subject: [PATCH 3/7] use f-strings for data_sim_string bug fix --- pysces/PyscesModel.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pysces/PyscesModel.py b/pysces/PyscesModel.py index 6bf175b..20f7e4e 100644 --- a/pysces/PyscesModel.py +++ b/pysces/PyscesModel.py @@ -4822,14 +4822,14 @@ def _update_assignment_rule_code(self, rule): partialmatches.append(sym) # catch any partial matches so they don't get replaced for e in enumerate(partialmatches): - replacements.append((e[1], '_zzzz_' + str(e[0]) + '_z')) + replacements.append((e[1], f'_zzzz_{e[0]}_z')) # replace symbol to get sim data replacements.append( - ('self.' + s, 'self.data_sim.getSimData("' + s + '")[p:q,1]') + (f'self.{s}', f'self.data_sim.getSimData("{s}")[p:q,1]') ) # revert the partial match symbol for e in enumerate(partialmatches): - replacements.append(('_zzzz_' + str(e[0]) + '_z', e[1])) + replacements.append((f'_zzzz_{e[0]}_z', e[1])) for old, new in replacements: rule['data_sim_string'] = rule['data_sim_string'].replace(old, new) From 89192995393e99894eb206777065a03a2d925d5d Mon Sep 17 00:00:00 2001 From: JM Rohwer Date: Thu, 9 May 2024 21:59:12 +0200 Subject: [PATCH 4/7] update version to 1.2.1 --- .zenodo.json | 4 ++-- CITATION.cff | 8 ++++---- pysces/version.txt | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.zenodo.json b/.zenodo.json index 2272d73..97b589e 100644 --- a/.zenodo.json +++ b/.zenodo.json @@ -3,9 +3,9 @@ "license": "BSD-3-Clause", "title": "The Python Simulator for Cellular Systems: PySCeS", "notes": "If you use this software, please cite it using the information provided in this metadata.", - "version": "1.2.0", + "version": "1.2.1", "upload_type": "software", - "publication_date": "2024-02-14", + "publication_date": "2024-05-10", "creators": [{ "orcid": "0000-0002-5293-5321", "affiliation": "Vrije Universiteit Amsterdam", diff --git a/CITATION.cff b/CITATION.cff index 520c8ce..bb00637 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -1,6 +1,6 @@ # YAML 1.2 --- -cff-version: "1.2.0" +cff-version: "1.2.1" message: "If you use this software, please cite it using the information provided in this metadata." authors: - @@ -14,9 +14,9 @@ authors: affiliation: "Stellenbosch University" orcid: "https://orcid.org/0000-0001-6288-8904" title: "The Python Simulator for Cellular Systems: PySCeS" -version: "1.2.0" -repository-code: "https://github.com/PySCeS/pysces/tree/1.2.0" -date-released: 2024-02-14 +version: "1.2.1" +repository-code: "https://github.com/PySCeS/pysces/tree/1.2.1" +date-released: 2024-05-10 doi: "10.5281/zenodo.2600905" license: "BSD-3-Clause" url: https://pysces.github.io diff --git a/pysces/version.txt b/pysces/version.txt index 26aaba0..6085e94 100644 --- a/pysces/version.txt +++ b/pysces/version.txt @@ -1 +1 @@ -1.2.0 +1.2.1 From f9b56f546ef0066db72c8dc74bb3513e718feb57 Mon Sep 17 00:00:00 2001 From: JM Rohwer Date: Thu, 9 May 2024 22:24:07 +0200 Subject: [PATCH 5/7] Update changelog. --- CHANGES.md | 234 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 145 insertions(+), 89 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 3362a09..3235a2f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,15 +1,100 @@ # PySCeS changes (per GitHub release) +## PySCeS release 1.2.1 (May 2024) + +We are pleased to announce the release of the Python Simulator for Cellular Systems: +PySCeS (https://pysces.github.io/) version 1.2.1. This is a bugfix release. + +### Fixes + +- Fixed a bug in model evaluation where a model has events and assignment rules, and the + assignment rule contains a variable name and a parameter with the variable a + substring match of the parameter (e.g. `E1` and `E1tot`). Previously, this led to + garbage code during string replacements. +- Cleaned up various error messages. + +## PySCeS release 1.2.0 (Feb 2024) + +We are pleased to announce the release of the Python Simulator for Cellular Systems: +PySCeS (https://pysces.github.io/) version 1.2.0. This is the first release in the 1.2 +series and contains some new features and various bug fixes. + +### New features + +There have been major changes in the build system for PySCeS. This release +implements [meson-python](https://meson-python.readthedocs.io/), +a [PEP 517](https://peps.python.org/pep-0517/) compliant Python build backend that +is suitable for building C and Fortran extension modules by implementing +the [meson build system](https://mesonbuild.com/). There is no more `setup.py` and +project build options and metadata are now in `pyproject.toml`. + +The main **motivation** for this has been support for Python 3.12, which deprecated +the use of `distutils`, and consequently `numpy` dropped `numpy.distutils`. The +previous build system had relied on `numpy.distutils` for building Fortran extension +modules, which would no longer work on Python 3.12. In the mean time, `scipy`, `numpy`, +as well as a number of other packages in the scientific Python ecosystem have moved +their build systems to `meson-python`. This version thus brings PySCeS in line with +the other packages. + +In addition, **binary wheels for macOS on Apple silicon** (*arm64*) are provided +for the first time (Python 3.11 and 3.12). + +### What has changed? + +- From a regular user perspective, not much. Installation is still via `pip` or `conda`. + +- From a developer perspective: there is no longer a `setup.py`. Metadata has been + migrated to `pyproject.toml`. Build settings are spread between `pyproject.toml` and + various `meson.build` files. The build is straightforward using one of: + ```bash + $ pip wheel -w dist . + $ python -m build . + ``` + as long as the relevant compiler toolchain is installed (gcc and gfortran on Linux and + macOS, RTools on Windows). Installation can be done with + ```bash + $ pip install . + or + $ pip install --no-build-isolation -e . (for an editable install) + ``` + Refer to [INSTALL.md](https://github.com/PySCeS/pysces/blob/main/INSTALL.md). + +- `Numpy` version >=1.26 is required for the build, as older versions of `f2py` (which + is distributed with `numpy`) are not compatible. At runtime, any `numpy` version > + =1.23 is supported, older versions don't work due to ABI incompatibility. +- Binaries (wheels) are distributed for Python versions 3.9-3.12. Python 3.8 support is + dropped as the latest `numpy` and `scipy` versions also no longer support it. +- Documentation has been updated to reflect these changes. + +### Bug fixes + +- Fixed a bug with assignment rule evaluation when one species was an exact substring of + another species. +- Use vectorised functions `numpy.log`, `numpy.log10`, `numpy.exp` instead of + their `math.*` counterparts to support their application to arrays in e.g. assignment + rules. +- Removed a bunch of deprecated `scipy.*` functions that have moved to the `numpy.*` + namespace. +- Cleaned up unused imports. + ## PySCeS release 1.1.1 (Jul 2023) -We are pleased to announce the release of the Python Simulator for Cellular Systems: -PySCeS (https://pysces.github.io/) version 1.1.1. This is the first release in the 1.1 +We are pleased to announce the release of the Python Simulator for Cellular Systems: +PySCeS (https://pysces.github.io/) version 1.1.1. This is the first release in the 1.1 series and contains some new features and various bug fixes. ### New features -- When used in a notebook environment, the `ipympl` backend for matplotlib is now enabled if installed. This allows use in JupyterLab (as opposed to classic notebook). If `ipympl` is not installed, fallback is to the standard `nbAgg`, which is part of matplotlib. -- Simulation results (`mod.sim` object) can now be returned as a pandas DataFrame if pandas is installed, otherwise a numpy recarray is returned as before. This option is configurable with `custom_datatype = pandas` in the user and system configuration files (see https://pyscesdocs.readthedocs.io/en/latest/userguide_doc.html#configuration), and can be enabled or disabled per session or per model: +- When used in a notebook environment, the `ipympl` backend for matplotlib is now + enabled if installed. This allows use in JupyterLab (as opposed to classic notebook). + If `ipympl` is not installed, fallback is to the standard `nbAgg`, which is part of + matplotlib. +- Simulation results (`mod.sim` object) can now be returned as a pandas DataFrame if + pandas is installed, otherwise a numpy recarray is returned as before. This option is + configurable with `custom_datatype = pandas` in the user and system configuration + files ( + see https://pyscesdocs.readthedocs.io/en/latest/userguide_doc.html#configuration), and + can be enabled or disabled per session or per model: ```python pysces.enablePandas() pysces.enablePandas(False) @@ -19,156 +104,134 @@ series and contains some new features and various bug fixes. ### Bug fixes -- Fixed a bug in simulations with `RateRules` using Assimulo, where a wrong solver variable was being assigned internally. +- Fixed a bug in simulations with `RateRules` using Assimulo, where a wrong solver + variable was being assigned internally. - Fixed SBML export when assignment rules were evaluating reaction rates. -- Enabled assignment rules (forcing functions) to track parameter changes when using CVODE. This is needed in case events change parameters during the course of the simulation. - -README: https://github.com/PySCeS/pysces/blob/master/README.md - -DOCUMENTATION: https://pyscesdocs.readthedocs.io/en/latest/ +- Enabled assignment rules (forcing functions) to track parameter changes when using + CVODE. This is needed in case events change parameters during the course of the + simulation. ## PySCeS release 1.1.0 (Apr 2023) -We are pleased to announce a new minor release (version 1.1.0) of the Python -Simulator for Cellular Systems: PySCeS (https://pysces.github.io/). This is the +We are pleased to announce a new minor release (version 1.1.0) of the Python +Simulator for Cellular Systems: PySCeS (https://pysces.github.io/). This is the first release in the 1.1 series. ### What's new? -The most significant new feature in Version 1.1 is a major upgrade in the way -**PySCeS handles events in simulations**. The definition of events follows the -framework described in the SBML Level 3 Version 2 specification, thus making the -event handling SBML-compliant. Specifically, event **persistence** (for events with -a delay) is now handled correctly, and simultaneous events can be executed +The most significant new feature in Version 1.1 is a major upgrade in the way +**PySCeS handles events in simulations**. The definition of events follows the +framework described in the SBML Level 3 Version 2 specification, thus making the +event handling SBML-compliant. Specifically, event **persistence** (for events with +a delay) is now handled correctly, and simultaneous events can be executed according to their assigned **priorities**. The new **event specification** in the PySCeS input file reads: + ``` Event: , , { } ``` -To achieve this, three new optional keyword arguments have been added as a -comma-separated list to the event specification. The general syntax for these +To achieve this, three new optional keyword arguments have been added as a +comma-separated list to the event specification. The general syntax for these arguments is `=`. The keywords are: -- *delay* (float): specifies a delay between when the trigger is fired (and the - assignments are evaluated) and the eventual assignment to the model. If this +- *delay* (float): specifies a delay between when the trigger is fired (and the + assignments are evaluated) and the eventual assignment to the model. If this keyword is not specified, a value of `0.0` is assumed. -- *priority* (integer or None): specifies a priority for events that trigger at the - same simulation time. Events with a higher priority are executed before those - with a lower priority, while events without a priority (`None`) are executed in - random positions in the sequence. If this keyword is not specified, a value of +- *priority* (integer or None): specifies a priority for events that trigger at the + same simulation time. Events with a higher priority are executed before those + with a lower priority, while events without a priority (`None`) are executed in + random positions in the sequence. If this keyword is not specified, a value of `None` is assumed. -- *persistent* (boolean): is only relevant to events with a delay, where the - situation may occur that the trigger condition no longer holds by the time the - delay in the simulation has passed. The persistent attribute specifies how to - deal with this situation: if `True`, the event executes nevertheless; if `False`, - the event does not execute if the trigger condition is no longer valid. If the +- *persistent* (boolean): is only relevant to events with a delay, where the + situation may occur that the trigger condition no longer holds by the time the + delay in the simulation has passed. The persistent attribute specifies how to + deal with this situation: if `True`, the event executes nevertheless; if `False`, + the event does not execute if the trigger condition is no longer valid. If the keyword is not specified, a default of `True` is assumed. -The following event illustrates the use of a delay of ten time units with a +The following event illustrates the use of a delay of ten time units with a non-persistent trigger and a priority of 3: + ``` Event: event2, geq(_TIME_, 15.0), delay=10.0, persistent=False, priority=3 { V3 = V3*vfact2 } ``` + The legacy event syntax is still supported. ### Other changes -- A new setting has been added to the settings dictionary of the `PysMod` class +- A new setting has been added to the settings dictionary of the `PysMod` class with the following default: `mod.__settings__["cvode_access_solver"] = True` - This specifies if the Assimulo solver object is available from within the - `PysMod` instance to make low-level changes to the integration algorithm. The - current default emulates previous behaviour, but the setting can be changed to - `False`, which facilitates serialization of the `PysMod` class in e.g. parallel - computations. Previously, the attached Assimulo solver object would prevent + This specifies if the Assimulo solver object is available from within the + `PysMod` instance to make low-level changes to the integration algorithm. The + current default emulates previous behaviour, but the setting can be changed to + `False`, which facilitates serialization of the `PysMod` class in e.g. parallel + computations. Previously, the attached Assimulo solver object would prevent serialization. Thanks @c-barry - Documentation has been updated to reflect the changes to the event syntax. -- Various bug fixes, including dealing with deprecations for Numpy 1.24.x +- Various bug fixes, including dealing with deprecations for Numpy 1.24.x compatibility. -README: https://github.com/PySCeS/pysces/blob/master/README.md - -DOCUMENTATION: https://pyscesdocs.readthedocs.io/en/latest/ - -© Brett Olivier and Johann Rohwer, April 2023. - - ## PySCeS release 1.0.3 (Sep 2022) -We are pleased to announce the release of the Python Simulator for Cellular -Systems: PySCeS (https://pysces.github.io/) version 1.0.3. This is the third +We are pleased to announce the release of the Python Simulator for Cellular +Systems: PySCeS (https://pysces.github.io/) version 1.0.3. This is the third release in the 1.0 series. ### What's new? -- The build-system has been adapted to make use of `scikit-build`. This gets rid of -the `distutils` and `numpy.distutils` dependencies, which are deprecated and will -be removed with the release of Python 3.12. + +- The build-system has been adapted to make use of `scikit-build`. This gets rid of + the `distutils` and `numpy.distutils` dependencies, which are deprecated and will + be removed with the release of Python 3.12. ### Bug Fixes: + - Fixed CVODE defaults and set default tolerances to more sane levels - Fixed string replacement in parsing and construction of `PieceWise` functions -README: https://github.com/PySCeS/pysces/blob/master/README.md - -DOCUMENTATION: https://pyscesdocs.readthedocs.io/en/latest/ - -© Brett Olivier and Johann Rohwer, September 2022. - - ## PySCeS release 1.0.2 (May 2022) -We are pleased to announce the release of the Python Simulator for Cellular Systems: -PySCeS (https://pysces.github.io/) version 1.0.2. +We are pleased to announce the release of the Python Simulator for Cellular Systems: +PySCeS (https://pysces.github.io/) version 1.0.2. This is the second bug-fix release in the 1.0 series. ### Fixes: - Fixed a number of bugs with `RateRule` execution with CVODE -- Reintroduced the functionality to track additional items such as Assignment Rules +- Reintroduced the functionality to track additional items such as Assignment Rules during a simulation with CVODE -- The Assimulo `CVODE` implementation has been updated, and legacy PySUNDIALS CVODE +- The Assimulo `CVODE` implementation has been updated, and legacy PySUNDIALS CVODE code removed -- The `RateRule` and `AssignmentRule` implementations have been checked against the +- The `RateRule` and `AssignmentRule` implementations have been checked against the SBML Test Suite -README: https://github.com/PySCeS/pysces/blob/master/README.md - -DOCUMENTATION: https://pyscesdocs.readthedocs.io/en/latest/ - -© Brett Olivier and Johann Rohwer, May 2022. - ## PySCeS release 1.0.1 (Feb 2022) -We are pleased to announce the release of the Python Simulator for Cellular Systems: -PySCeS (https://pysces.github.io/) version 1.0.1. This is the first bug-fix release +We are pleased to announce the release of the Python Simulator for Cellular Systems: +PySCeS (https://pysces.github.io/) version 1.0.1. This is the first bug-fix release in the 1.0 series. ### Fixes: - Fixed references to numpy/scipy - Fixed a bug in `mod.Simulate(userinit=1)` with CVODE -- Fixed bug where the maximal number of steps in LSODA would not be honoured from the +- Fixed bug where the maximal number of steps in LSODA would not be honoured from the `mod.__settings__["lsoda_mxstep"]` dictionary entry - General cleanup of license files, version files, and the way requirements are handled -README: https://github.com/PySCeS/pysces/blob/master/README.md - -DOCUMENTATION: https://pyscesdocs.readthedocs.io/en/latest/ - -© Brett Olivier and Johann Rohwer, February 2022. - ## PySCeS release 1.0.0 (Sep 2021) -We are pleased to announce the release of the Python Simulator for Cellular +We are pleased to announce the release of the Python Simulator for Cellular Systems: PySCeS (https://pysces.github.io/) version 1.0.0. **What's new in this release:** -- Re-introduced support for CVODE as integrator under Python 3 (via Assimulo), +- Re-introduced support for CVODE as integrator under Python 3 (via Assimulo), which brings back support of events in models - Improved import and export of SBML - Automatic installation of optional dependencies with `pip install "pysces @@ -176,13 +239,6 @@ Systems: PySCeS (https://pysces.github.io/) version 1.0.0. - Extensive update of documentation - Numerous bug fixes -**README:** https://github.com/PySCeS/pysces/blob/master/README.md - -**DOCUMENTATION:** https://pyscesdocs.readthedocs.io/en/latest/ - -© Brett Olivier and Johann Rohwer, September 2021. - - ## PySCeS release 0.9.8 (May 2020) We are pleased to announce the release of the Python Simulator for Cellular Systems: @@ -191,7 +247,7 @@ PySCeS (http://pysces.sourceforge.net) version 0.9.8 **What's new in this release:** * The main change from a user perspective is that the default model directory and output - directory on Windows have moved to `%USERPROFILE%\Pysces` and subfolders + directory on Windows have moved to `%USERPROFILE%\Pysces` and subfolders (e.g. `C:\Users\\Pysces`). These folders are created by default on a fresh install. The previous default location was `C:\Pysces`. This change brings the Windows version in line with the Linux and macOS versions, and moreover allows multiple users @@ -273,7 +329,7 @@ cycles), bugfixes (assignment rules) and updates (SED-ML and COMBINE archive exp ## PySCeS releases 2004 - 2016 These releases are available for download -from [SourceForge] (https://sourceforge.net/projects/pysces/files/pysces) +from [SourceForge](https://sourceforge.net/projects/pysces/files/pysces) -© Brett G. Olivier & Johann M. Rohwer, August 2021 +© Brett G. Olivier & Johann M. Rohwer, 2004-2024 From 0fb3afc173bb54eda9c6f0c66963a6ad68ae2e6d Mon Sep 17 00:00:00 2001 From: JM Rohwer Date: Fri, 10 May 2024 10:42:06 +0200 Subject: [PATCH 6/7] update docs submodule --- docs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs b/docs index 2d6fac2..805f37a 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 2d6fac2f2a950e7acac7b04329ed9cf73ad0a650 +Subproject commit 805f37aa597acacd1f8814e687c8ae3cc31c3b62 From 999deba070761ba7bd29eb82a512fabe811171b2 Mon Sep 17 00:00:00 2001 From: JM Rohwer Date: Fri, 10 May 2024 10:43:00 +0200 Subject: [PATCH 7/7] update install instructions for 1.2.1 --- INSTALL.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/INSTALL.md b/INSTALL.md index 08a4a69..b260742 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -2,20 +2,24 @@ Binary install packages for all three OSs and recent Python versions are provided. Anaconda packages are available for 64-bit Windows and Linux, as well as -macOS *x86_64* architecture. Apple Silicon (*arm64*) macOS users should install with -`pip` (see below). Anaconda users can conveniently install PySCeS with: +macOS *x86_64* and Apple Silicon (*arm64*) architectures. Anaconda users can +conveniently install PySCeS with: ```bash $ conda install -c conda-forge -c pysces pysces ``` Any dependencies will be installed automatically, including the optional dependencies -*Assimulo*, *ipyparallel* and *libSBML*. +*Assimulo*, *ipyparallel* and *libSBML*. +> **NOTE:** Anaconda packages are only provided for Python versions 3.9-3.11. The +> reason is that Assimulo has not been ported to Python 3.12 and still depends on +> `numpy.distutils`. As soon as this has happened, PySCeS Anaconda packages for 3.12 +> will be built. Alternatively, you can use *pip* to -install PySCeS from PyPI. Core dependencies will be installed automatically. Wheels -are available for 64-bit Windows and Linux, as well as macOS architectures *x86_64* and -*arm64* (starting from PySCeS version 1.2.0). +install PySCeS from PyPI. Core dependencies will be installed automatically. Wheels +are available for 64-bit Windows and Linux, as well as macOS architectures *x86_64* and +*arm64* (starting from PySCeS version 1.2.0, supporting Python 3.11 and 3.12). ```bash $ pip install pysces