  Mathematical models allow us to gain a deeper understanding of real-world
dynamical systems. One of the most powerful mathematical frameworks for
modeling real-world phenomena are systems of differential equations. In the
majority of fields that use differential equations, numerical methods are
essential for conducting model-based research. Although many software solutions
are available for the numerical study of differential equation systems, a
common framework for implementing differential equation systems is lacking.
This hinders progress in dynamical systems research and limits the shareability
and reproducibility of results.
  PyRates is a Python-based software for modeling and analyzing dynamical
systems. It provides a user-friendly interface for defining models, which is
based on a graph-based, hierarchical structure that mirrors the modular
organization of real-world dynamical systems. This design allows users to
leverage the hierarchical structure of their systems and create their models
with minimal effort.
  Importantly, the core of PyRates is a versatile code-generation system, which
can translate user-defined models into "backend" implementations in various
languages, including Python, Fortran, and Julia. This allows users to access a
wide range of analysis methods for dynamical systems, eliminating the need for
manual translation between code bases.
  We demonstrate PyRates's capabilities in three use cases, where it generates
NumPy code for numerical simulations, Fortran code for bifurcation analysis,
and PyTorch code for neural network optimization. Finally, PyRates can be used
as a model definition interface for the creation of new dynamical systems
tools. We developed two such software packages, PyCoBi and RectiPy, as
extensions of PyRates for specific dynamical systems modeling applications.
