From ab22b4fc766740e57b431aa8a311877bb07c94df Mon Sep 17 00:00:00 2001 From: Andrey Bychkov Date: Mon, 20 Mar 2023 17:10:14 +0300 Subject: [PATCH 1/7] Add documentation structure and update Quadratization section --- docs/source/articles_and_resources.rst | 4 ++ docs/source/conf.py | 3 +- docs/source/dimension_agnostic.rst | 4 ++ docs/source/index.rst | 6 ++ docs/source/inputs_and_parameters.rst | 4 ++ docs/source/numerical_integration.rst | 4 ++ docs/source/polynomialization.rst | 4 ++ docs/source/quadratization.rst | 93 ++++++++++++++++++++++++++ 8 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 docs/source/articles_and_resources.rst create mode 100644 docs/source/dimension_agnostic.rst create mode 100644 docs/source/inputs_and_parameters.rst create mode 100644 docs/source/numerical_integration.rst create mode 100644 docs/source/polynomialization.rst create mode 100644 docs/source/quadratization.rst diff --git a/docs/source/articles_and_resources.rst b/docs/source/articles_and_resources.rst new file mode 100644 index 0000000..4075bd8 --- /dev/null +++ b/docs/source/articles_and_resources.rst @@ -0,0 +1,4 @@ +Articles and resources +======================= + +Lorem inpus \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index 486ede3..8144996 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -34,7 +34,8 @@ "sphinx.ext.autodoc", "sphinx.ext.napoleon", "sphinx.ext.autosectionlabel", - "sphinx.ext.mathjax" + "sphinx.ext.mathjax", + "sphinx_math_dollar" ] # Add any paths that contain templates here, relative to this directory. diff --git a/docs/source/dimension_agnostic.rst b/docs/source/dimension_agnostic.rst new file mode 100644 index 0000000..59a1f8a --- /dev/null +++ b/docs/source/dimension_agnostic.rst @@ -0,0 +1,4 @@ +Dimension-Agnostic Quadratization +================================== + +Lorem ipsum \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index ecd4128..d6d63a4 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -31,4 +31,10 @@ Indices and tables :caption: Contents: installation + quadratization + inputs_and_parameters + polynomialization + dimension_agnostic + numerical_integration + articles_and_resources api \ No newline at end of file diff --git a/docs/source/inputs_and_parameters.rst b/docs/source/inputs_and_parameters.rst new file mode 100644 index 0000000..317f3d5 --- /dev/null +++ b/docs/source/inputs_and_parameters.rst @@ -0,0 +1,4 @@ +Inputs and Parameters +====================== + +Lorem ipsum \ No newline at end of file diff --git a/docs/source/numerical_integration.rst b/docs/source/numerical_integration.rst new file mode 100644 index 0000000..7775647 --- /dev/null +++ b/docs/source/numerical_integration.rst @@ -0,0 +1,4 @@ +Numerical Integration +====================== + +Lorem ipsum \ No newline at end of file diff --git a/docs/source/polynomialization.rst b/docs/source/polynomialization.rst new file mode 100644 index 0000000..636e675 --- /dev/null +++ b/docs/source/polynomialization.rst @@ -0,0 +1,4 @@ +Polynomialization +=================== + +Lorem ipsum \ No newline at end of file diff --git a/docs/source/quadratization.rst b/docs/source/quadratization.rst new file mode 100644 index 0000000..ea4d16e --- /dev/null +++ b/docs/source/quadratization.rst @@ -0,0 +1,93 @@ +Quadratization +================ + +Quadratization by example +------------------------- + +To better understand quadratization, let's consider the following example. We have a scalar ordinary differential equation (ODE) given by: +$$ +x' = x^5 +$$ +Then, introduce a new variable $y = x^4$, leading to an ODE with quadratic right-hand side: +$$ +x' = xy +$$ +However, this new equation does not provide any additional information. +To add up, we can differentiate the equation of y. +This results in a system of ODEs that is equivalent to the original equation: +$$ +\begin{array}{ll} +x' = xy \\ +y' = 4x^3 x' = 4x^8 = 4 y^2 +\end{array} +$$ + +Moreover, both equations have a quadratic right-hand side. +We refer to the set $\{y = x^4\}$ as a **quadratization**. +A formal definition of quadratization will be provided later. + +But now, let's use QBee to replicate the example: + +.. code-block:: python + + >>> from qbee import * + >>> x = functions("x") + >>> quadratize([(x, x**5)]).print() # input follows rule (x, p) => x' = p + Introduced variables: + w0 = x**4 + + x' = w0*x + w0' = 4*w0**2 + +Formal definition +-------------------- + +Consider a polynomial system of ODEs +$$ +\mathbf{\dot x} = \mathbf{p}(\mathbf{x}), +$$ +where $\mathbf{x} = \mathbf{x}(t) = [x_1(t), \dots, x_N(t)]^T$ and $\mathbf{p}(\mathbf{x}) = [p_1(\mathbf{x}),\dots, p_N(\mathbf{x})]^T$ +with $p_1,\dots, p_N \in \mathbb{C} [\mathbf{x}]$ (are polynomials in $\mathbb{C}$). + +Then an $l$-dimensional vector of new variables +$$ +\mathbf{w} = \mathbf{w}(\mathbf{x}) \quad \in \mathbb{C}[\mathbf{x}]^l +$$ +is said to be a **quadratization** of the given system if there exist vectors $\mathbf{q}_1(\mathbf{x}, \mathbf{w})$ +and $\mathbf{q}_2(\mathbf{x}, \mathbf{w})$ of dimension $N$ and $l$ respectively, with entries being polynomials +of total degree at most two (quadratic) such that +$$ +\dot{\mathbf{x}} = \mathbf{q}_1(\mathbf{x}, \mathbf{w}) \quad and \quad \dot{\mathbf{w}} = \mathbf{q}_2(\mathbf{x}, \mathbf{w}). +$$ + +The dimension $l$ of vector $\mathbf{w}$ is called **order of quadratization**. +A quadratization of the smallest possible order is called an **optimal quadratization**. + +In the example above $\mathbf{w} = [x^4],\ l = 1,\ \text{and}\ \mathbf{q}_1 = [w_0 x],\ \mathbf{q}_2 = [4w_0^2]$. +Since we introduced only one variable, the resulting quadratization is optimal. + + +Monomial quadratization +------------------------ + +If all the polynomials $w_1(\mathbf{x}),\dots,w_l(\mathbf{x})$ are +monomials, the quadratization is called a **monomial quadratization**. +Accordingly, if a monomial quadratization of a system has the smallest possible order among all +the monomial quadratizations of the system, it is called an **optimal monomial quadratization**. + +The quadratization in the first example is indeed an optimal monomial quadratization. + +The importance of monomial quadratizations is that optimal monomial quadratizations +always exist when there is no :ref:`input functions ` involved +and $w_1(\mathbf{x}),\dots,w_l(\mathbf{x})$ are non-negative monomials +(:ref:`Otherwise `, quadratization may have a smaller order +but we are not aware of algorithm to find an optimal quadratization in this case). + + +Laurent monomials +---------------------- + + + + + From 20f417377bfd3d613d0765946d853bd4b4180ae1 Mon Sep 17 00:00:00 2001 From: Andrey Bychkov Date: Tue, 28 Mar 2023 17:38:56 +0300 Subject: [PATCH 2/7] Try to replace images of equations in README with LaTeX for GitHub --- README.md | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 8029d46..b5fdb31 100644 --- a/README.md +++ b/README.md @@ -26,19 +26,34 @@ The problem of *quadratization* is, given a system of ODEs with polynomial right system with quadratic right-hand side by introducing as few new variables as possible. We will explain it using toy example. Consider the system -\begin{cases} x_1' = x_1 x_2 \\ x_2' = -x_1 x_2^3 \end{cases} +$$ +\begin{cases} +x_1' = x_1 x_2 \\ +x_2' = -x_1 x_2^3 +\end{cases} +$$ -An example of quadratization of this system will be a new variable +An example of quadratization of this system will be a singular vector of new variables -y = x_1 x_2^2 +$$ +[y' = x_2 y - 2y^2] +$$ leading to the following ODE -y' = x_2 y - 2y^2 +$$ +y' = x_2 y - 2y^2 +$$ Thus, we attained the system with quadratic right-hand side -\begin{cases} x_1' = x_1 x_2 \\ x_2' = -x_2 y \\ y' = x_2 y - 2y^2 \end{cases} +$$ +\begin{cases} +x_1' = x_1 x_2 \\ +x_2 ' = -x^2 y \\ +y' = x_2 y - 2y^2 +\end{cases} +$$ We used only one new variable, so we achieved an *optimal* quadratization. @@ -63,7 +78,14 @@ from qbee import * For example, we will take the **A1** system from [Swischuk et al.'2020](https://arxiv.org/abs/1908.03620) -{\color{DarkOrange} \begin{cases} c_1' = -A \exp(-E_a / (R_u T)) c_1 ^{0.2} c_2^{1.3}\\ c_2' = 2c_1' \\ c_3' = -c_1' \\ c_4' = -2 c_1' \end{cases}} +$$ +\begin{cases} +c_1' = -A \exp(-E_a / (R_u T)) c_1 ^{0.2} c_2^{1.3} \\ +c_2 ' = 2c_1' \\ +c_3' = -c_1' \\ +c_4' = -2 c_1' +\end{cases} +$$ The parameters in the system are `A, Ea and Ru`, and the others are either state variables or inputs. So, let's define them with the system in code: From ec8789419eafb8927c74ad34c7c8156794b24b21 Mon Sep 17 00:00:00 2001 From: Andrey Bychkov Date: Thu, 4 May 2023 19:52:06 +0300 Subject: [PATCH 3/7] Update monomial quadratization and Laurent monomials in doc --- docs/source/quadratization.rst | 68 ++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/docs/source/quadratization.rst b/docs/source/quadratization.rst index ea4d16e..b959fbf 100644 --- a/docs/source/quadratization.rst +++ b/docs/source/quadratization.rst @@ -83,11 +83,79 @@ and $w_1(\mathbf{x}),\dots,w_l(\mathbf{x})$ are non-negative monomials (:ref:`Otherwise `, quadratization may have a smaller order but we are not aware of algorithm to find an optimal quadratization in this case). +The polynomial quadratization, on the other hand, is generally of a lower order, as seen in the example below. +However, the general algorithm of finding polynomial quadratizations is unknown to us. +Nevertheless, shifting variables can help you to produce better order when using QBee. + +**Example**: The system +$$ +x' = (x + 1)^{10} +$$ +has a polynomial quadratization of order $1$: +$$ +\mathbf{w} = [(x+1)^9], +$$ +while its optimal monomial quadratization is +$$ +\mathbf{v} = [x^2, x^4, x^6, x^8, x^9]. +$$ +Replacing $x$ with $y = x+1$ will have a result similar to the polynomial case, yet reachable by using QBee: +$$ +y' = y^{10}, \quad \mathbf{v} = [x^9]. +$$ + +As a further read, we recommend an article by Foyez Allaudin "`Quadratization of ODEs: Monomial vs. Non-Monomial `_". + Laurent monomials ---------------------- +Laurent monomials are monomials that may be built with both positive and negative powers, for instance $m(x, y) = x^2 y^{-3}$. +By default, QBee introduces new variables as Laurent monomials, since it results in more optimal quadratizations than by using ordinary monomials. +**Example**: Let's quadratize the system below by using QBee: +$$ +x' = \exp(1/x). +$$ + +.. code-block:: python + >>> import sympy as sp + >>> from qbee import * + >>> x = functions("x") + >>> polynomialize_and_quadratize([(x, sp.exp(1/x))]).print() + Introduced variables: + w_0 = exp(1/x) + w_1 = w_0/x**2 <- It's a Laurent monomial; + w_2 = w_0/x**3 <- This one as well; + x' = w_0 + w_0' = -w_0*w_1 + w_1' = -2*w_0*w_2 - w_1**2 + w_2' = -3*w_1**2 - w_1*w_2 +**Note**: We first polynomialize the system to bring it to a polynomial form. Read about this technique in :ref:`Polynomialization section `. + +However, in some contexts, using Laurent monomials is undesirable or even forbidden. +For such cases, we can disable them: + +.. code-block:: python + + >>> import sympy as sp + >>> from qbee import * + >>> x = functions("x", laurent=False) # Forbid "x" to be of negative powers in monomials + >>> polynomialize_and_quadratize([(x, sp.exp(1/x))]).print() + Introduced variables: # Note that the quadratization order has grown; + w_0 = exp(1/x) + w_1 = 1/x <- We introduce 1/x to tackle with the lack of Laurent monomials; + w_2 = w_0*w_1**2 + w_3 = w_0*w_1**3 + + x' = w_0 + w_0' = -w_0*w_2 + w_1' = -w_2 + w_2' = -2*w_0*w_3 - w_2**2 + w_3' = -3*w_2**2 - w_2*w_3 + +For more details and context, check Remark 5.1 in +`Exact and optimal quadratization of nonlinear finite-dimensional non-autonomous dynamical systems `_. \ No newline at end of file From c37ced1cc714193bc6ebe057c9682c950c3c9065 Mon Sep 17 00:00:00 2001 From: Andrey Bychkov Date: Mon, 5 Jun 2023 17:44:50 +0300 Subject: [PATCH 4/7] Documentation update --- docs/source/articles_and_resources.rst | 13 +- docs/source/background.rst | 3 + docs/source/conf.py | 5 +- docs/source/images/Diff_operators.png | Bin 0 -> 91050 bytes docs/source/inputs_and_parameters.rst | 250 ++++++++++++++++++++++++- pyproject.toml | 1 + 6 files changed, 267 insertions(+), 5 deletions(-) create mode 100644 docs/source/background.rst create mode 100644 docs/source/images/Diff_operators.png diff --git a/docs/source/articles_and_resources.rst b/docs/source/articles_and_resources.rst index 4075bd8..c3aa544 100644 --- a/docs/source/articles_and_resources.rst +++ b/docs/source/articles_and_resources.rst @@ -1,4 +1,13 @@ -Articles and resources +Articles and Resources ======================= -Lorem inpus \ No newline at end of file +* **2023** -- `Exact and optimal quadratization of nonlinear finite-dimensional non-autonomous dynamical systems `_ +* **2021** -- `Optimal monomial quadratization for ODE systems `_ (`arxiv `_) + * `Talk at IWOCA 2021 `_, `slides `_ +* **2020** -- `Quadratization of ODEs: Monomial vs. Non-Monomial `_ + * `Talk at Young Mathematicians Conference 2020 `_ +* **2020** -- `Optimal monomial quadratization for ODE systems: extended abstract `_ + * `Talk at ISSAC 2020 `_, `slides `_ + + +#TODO: Add articles of Lifeware, Boris' group, etc. \ No newline at end of file diff --git a/docs/source/background.rst b/docs/source/background.rst new file mode 100644 index 0000000..357c418 --- /dev/null +++ b/docs/source/background.rst @@ -0,0 +1,3 @@ +Background +=================== + diff --git a/docs/source/conf.py b/docs/source/conf.py index 8144996..d480098 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -18,7 +18,7 @@ # -- Project information ----------------------------------------------------- project = 'QBee' -copyright = '2021, Andrey Bychkov, Gleb Pogudin' +copyright = '2023, Andrey Bychkov, Gleb Pogudin' author = 'Andrey Bychkov, Gleb Pogudin' # The full version, including alpha/beta/rc tags @@ -35,7 +35,8 @@ "sphinx.ext.napoleon", "sphinx.ext.autosectionlabel", "sphinx.ext.mathjax", - "sphinx_math_dollar" + "sphinx_math_dollar", + "sphinx_toolbox.collapse" ] # Add any paths that contain templates here, relative to this directory. diff --git a/docs/source/images/Diff_operators.png b/docs/source/images/Diff_operators.png new file mode 100644 index 0000000000000000000000000000000000000000..124ad5521be1d27988924bd83eb8306ed7e8ba16 GIT binary patch literal 91050 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 O9gz@`6)qFh_4_~P4vDk? literal 0 HcmV?d00001 diff --git a/docs/source/inputs_and_parameters.rst b/docs/source/inputs_and_parameters.rst index 317f3d5..d706e47 100644 --- a/docs/source/inputs_and_parameters.rst +++ b/docs/source/inputs_and_parameters.rst @@ -1,4 +1,252 @@ Inputs and Parameters ====================== -Lorem ipsum \ No newline at end of file +Differential equations may also contain not only state variables, but also parameters and input functions. +For instance, consider the system: +$$ +\begin{array}{l} +x' = c_1 y \cdot u(t) \\ +y' = c_2 x^3 +\end{array}, +$$ + +where $c_1, c_2 \in \mathbb{C}$ are parameters and $u(t)$ is an unknown input function. + +In QBee we introduce them in the following way: + +.. code-block:: python + + >>> from qbee import * + >>> c1, c2 = parameters("c1, c2") + >>> x, y, u = functions("x, y, u") + >>> system = [(x, c1*y*u), (y, c2*x**3)] # u is considered as input since it's not in the left-hand side; + >>> quadratize(system).print() + Introduced variables: + w0 = x**2 + w1 = x*y + w2 = y**2 + + x' = c1*u*y + y' = c2*w0*x + w0' = 2*c1*u*w1 + w1' = c1*u*w2 + c2*w0**2 + w2' = 2*c2*w0*w1 + + +Inputs' Derivatives +-------------------------- + +Note that we can introduce a derivative of an input function during quadratization. +Let's look at this with an example: +$$ +\begin{array}{ll} +x' = y^2 u(t) \\ +y' = x^2 +\end{array} +$$ + +.. code-block:: python + + >>> from qbee import * + >>> x, y, u = functions("x, y, u") + >>> system = [(x, y**2 * u), (y, x**2)] + >>> quadratize(system).print() + Introduced variables: + w0 = u*y + w1 = u*x + + x' = w0*y + y' = x**2 + w0' = u'*y + w1*x + w1' = u'*x + w0**2 + +It should be mentioned that sometimes the derivatives of the input functions are unknown or do not even exist! +To cover such cases, we can try to find an *input-free quadratization*, +i.e. quadratization contains no input functions and therefore does not introduce their derivatives. + +.. code-block:: python + + >>> from qbee import * + >>> x, y, u = functions("x, y, u") + >>> system = [(x, y**2 * u), (y, x**2)] + >>> quadratize(system, input_free=True).print() + Introduced variables: + w0 = y**2 + w1 = x**2 + w2 = x*y**2 + w3 = x*y + w4 = y**3 + w5 = y**4 + + x' = u*w0 + y' = w1 + w0' = 2*w1*y + w1' = 2*u*w2 + w2' = u*w5 + 2*w1*w3 + w3' = u*w4 + w1*x + w4' = 3*w3**2 + w5' = 4*w2*w3 + +It is clear that the order of quadratization in the input-free case has increased significantly. +This is not accidental: such quadratizations are indeed larger and do not even always exist! + +Existence of input-free quadratizations +--------------------------------------------------------- + +The existence from problem of input-free quadratization is thoroughly discussed in Section 3.2 of +`Exact and optimal quadratization of nonlinear finite-dimensional non-autonomous dynamical systems `_ . +Here, however, we will only give our results and helpful practices. + +Consider original system to be input-affine, that is, of the form +$$ +\mathbf{\dot{x}} = \mathbf{p_0}(\mathbf{x}) + \sum_{i=1}^r \mathbf{p_i}(\mathbf{x}) u_i. \tag{1} +$$ + +**Theorem 1**: if the system (1) is also a polynomial-bilinear, that is, the total degree of $\mathbf{p_i}(\mathbf{x})$ +is at most one for every $1 \le i \le r$, then there is an input-free quadratization. + + +It turns out that the existence of input-free quadratization can be characterized via +the properties of certain linear differential operators associated with inputs $\mathbf{u}(t)$. + +**Definition 1**: We introduce $r$ differential operators for the system (1): +$$ +D_i := \mathbf{p_i}(\mathbf{x})^T \cdot \frac{\partial}{\partial \mathbf{x}}, \quad 1 \le i \le r, +$$ +where $\frac{\partial}{\partial \mathbf{x}} = \Big[ \frac{\partial}{\partial x_1},\dots \frac{\partial}{\partial x_N} \Big]^T$ + +It is easier to imagine with an **example**. Consider the following system: +$$ +\begin{array}{l} +\mathbf{\dot{x_1}} = x_1 + x_1 y_1 \\ +\mathbf{\dot{x_2}} = x_1^2 u_1 + x_2 u_2 +\end{array}. +$$ + +Then we introduce two differential operators $D_1$ and $D_2$, associated with $u_1$ and $u_2$ accordingly: + +$$ +D_1 = [x_1, x_1^2] \cdot [\frac{\partial}{\partial x_1}, \frac{\partial}{\partial x_2}] +$$ +and +$$ +D_2 = [0, x_2] \cdot [\frac{\partial}{\partial x_1}, \frac{\partial}{\partial x_2}]. +$$ + +Below you can see how we build up these operators more visually: + +.. image:: images/Diff_operators.png + :alt: Differential operators construction + :width: 600 + +**Theorem 2**: Let $\mathcal{A}$ be a subalgebrra generated by $D_1,\dots, D_r$ in the algebra +$\mathbb{C}[\mathbf{x}, \mathbf{\frac{\partial}{\partial x}}]$ of all polynomial +differential operators in $\mathbf{x}$. +Then there is an input-free quadratization of (1) if and only if +$$ +dim\{ A(x_i)\ | \ A \in \mathcal{A}\} < \infty \quad \textit{for every } 1 \le i \le N. +$$ + +Let's use the example above to show how the theorem works. + +For $x_1$ we have +$$ +\begin{gather*} +D_1(x_1) = x_1, \quad D_2(x_1) = 0 \\ \Downarrow \\ +\{A(x_1)\ | \ A \in \mathcal(A)\} = \text{span}\{x_1\} +\end{gather*} +$$ + +For $x_2$ we have +$$ +\begin{gather*} +D_1(x_2) = x_1^2, \quad D_1^2(x_2) = D_1(x_1^2) = 2x_1^2,\quad D_2(x_2) = x_2\\ +\Downarrow \\ +\{A(x_2)\ | \ A \in \mathcal(A)\} = \text{span}\{x_2, x_1^2\} +\end{gather*} +$$ + +Therefore, Theorem 2 implies that the example system has an input-free quadratization. +And indeed: + +.. code-block:: python + + >>> x1, x2, u1, u2 = functions("x1, x2, u1, u2") + >>> system = [(x1, x1 + x1 * u1), (x2, x1**2 * u1 + x2 * u2)] + >>> quadratize(system, input_free=True).print() + Introduced variables: + w0 = x1**2 + + x1' = u1*x1 + x1 + x2' = u1*w0 + u2*x2 + w0' = 2*u1*w0 + 2*w0 + + +Now consider an **example** where there is no input-free quadratization. +$$ +\dot x = x^2 u +$$ + +Associated differential operator is $D = x^2 \frac{\partial}{\partial x}$ and the algebra $\mathcal{A}$ +spanned by +$$ +D(x) = x^2,\quad D^2(x) = D(x^2) = 2x^3,\quad D^3(x) = 6x^4, \dots +$$ +has infinite dimension. Thus, there is no input-free quadratization exists. + +.. code-block:: python + + >>> x, u = functions("x, u") + >>> system = [(x, x**2 * u)] + >>> upper_bound = partial(pruning_by_vars_number, nvars=100) # Max quadratization order = 100 + >>> res = quadratize(system, input_free=True, pruning_functions=[upper_bound, *default_pruning_rules]) + >>> print(res) + None + +.. collapse:: Why Theorem 2 is not in QBee yet + + The problem is that a complete algorithm for solving this kind of problem + has not yet been found in the general case (See **Remark 3.10** of the article above). + For the input-free quadratization problem specifically, there is some progress, + but we have not yet been able to fully prove the correctness of the proposed algorithm. + +| + +Setting up possible derivatives of inputs +---------------------------------------------------- + +Sometimes there are cases where input-free quadratizations are not required +and you know exactly how many derivatives your input functions have. + +You can use the ``input_ders_order`` parameter to denote +the maximum allowed order of derivatives for input functions. + +.. code-block:: python + + >>> x, y, u, v = functions("x, y, u, v") + >>> system = [(x, y**2 * u), (y, v * x**2)] + >>> quadratize(system, input_der_orders={v: 2, u: 0}).print() # v' and v'' are allowed + Introduced variables: + w0 = y**2 + w1 = v*x + w2 = v*y**2 + w3 = v*x*y + w4 = v'*x + w5 = v'*y**2 + w6 = v*x**2 + w7 = v*y**3 + w8 = v*x*y**2 + w9 = v*y**4 + + x' = u*w0 + y' = w6 + w0' = 2*w6*y + w1' = u*w2 + w4 + w2' = 2*w1*w3 + w5 + w3' = u*w7 + w1*w6 + w4*y + w4' = u*w5 + v''*x + w5' = v''*w0 + 2*w3*w4 + w6' = 2*u*w8 + w4*x + w7' = 3*w3**2 + w5*y + w8' = u*w9 + w0*w4 + 2*w3*w6 + w9' = w0*w5 + 4*w6*w7 \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 407d96c..6314fb2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -37,6 +37,7 @@ optional = true sphinx = ">=6.0" sphinx-rtd-theme = "*" sphinx-math-dollar = "*" +sphinx_toolbox = "*" [build-system] requires = ["poetry-core"] From 76dfc7f1e02e1a0dca45fa781cbfdca1a7b94915 Mon Sep 17 00:00:00 2001 From: Andrey Bychkov Date: Wed, 19 Jul 2023 12:05:54 +0300 Subject: [PATCH 5/7] Update numerical integration and polynomialization sections; add a script to build docs --- docs/build.py | 5 ++ docs/source/cheatsheet.rst | 3 + docs/source/index.rst | 1 + docs/source/numerical_integration.rst | 56 +++++++++++++++- docs/source/polynomialization.rst | 97 ++++++++++++++++++++++++++- examples/numerical_integration.py | 5 ++ pyproject.toml | 7 +- 7 files changed, 169 insertions(+), 5 deletions(-) create mode 100644 docs/build.py create mode 100644 docs/source/cheatsheet.rst diff --git a/docs/build.py b/docs/build.py new file mode 100644 index 0000000..407694b --- /dev/null +++ b/docs/build.py @@ -0,0 +1,5 @@ +import subprocess + + +def build_html(): + subprocess.run("sphinx-build -b html docs/source docs/build") diff --git a/docs/source/cheatsheet.rst b/docs/source/cheatsheet.rst new file mode 100644 index 0000000..3f60efd --- /dev/null +++ b/docs/source/cheatsheet.rst @@ -0,0 +1,3 @@ +Cheatsheet +=================== + diff --git a/docs/source/index.rst b/docs/source/index.rst index d6d63a4..f5bedc8 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -31,6 +31,7 @@ Indices and tables :caption: Contents: installation + cheatsheet quadratization inputs_and_parameters polynomialization diff --git a/docs/source/numerical_integration.rst b/docs/source/numerical_integration.rst index 7775647..82a636f 100644 --- a/docs/source/numerical_integration.rst +++ b/docs/source/numerical_integration.rst @@ -1,4 +1,58 @@ Numerical Integration ====================== -Lorem ipsum \ No newline at end of file +You can quickly check the quadratization numerically by using a function ``qbee.experimental.to_odeint`` +that turns the result into a numerical function that scipy understands. Let's look at the in the example: + +We define and quadratize a scalar system +$$ +x' = p \sin(x) + u(t) +$$ + +.. code-block:: python + + >>> import sympy as sp + >>> from qbee import * + >>> x, u = functions("x, u") + >>> p = parameters("p") + >>> system = [(x, p * sp.sin(x) + u)] + >>> res = polynomialize_and_quadratize(system, input_free=True) + >>> res.print(str_function=sp.latex) + Introduced variables: + w_{0} = \sin{\left(x \right)} + w_{1} = \cos{\left(x \right)} + + x' = p w_{0} + u + w_{0}' = p w_{0} w_{1} + u w_{1} + w_{1}' = - p w_{0}^{2} - u w_{0} + +Here we took advantage of the ability to both get a quadratic system in LaTeX and render it in the documentation. + +$$ +w_{0} = \sin{\left(x \right)}, w_{1} = \cos{\left(x \right)} +$$ +$$ +\begin{array}{l} +x' = p w_{0} + u \\ +w_{0}' = p w_{0} w_{1} + u w_{1} \\ +w_{1}' = - p w_{0}^{2} - u w_{0} +\end{array} +$$ + +Now we solve the system numerically for $t \in [0; 100]$, $p = 0.1$, $u(t) = \sin(t)$: + +.. code-block:: python + + >>> from qbee.experimental import to_odeint + >>> ts = np.linspace(0, 100, 10000) + >>> t = INDEPENDENT_VARIABLE + >>> my_odeint = to_odeint(system, {"x": 0.1}, {"p": 0.1}, {"u": sp.sin(t)}) + >>> my_odeint_quad = to_odeint(res, {"x": 0.1}, {"p": 0.1}, {"u": sp.sin(t)}) + + >>> num_res = my_odeint(ts, rtol=1e-10) + >>> num_res_quad = my_odeint_quad(ts, rtol=1e-10) + >>> print("L-infinity distance between numerical solutions of the original ODE and the quadratized one: ", + >>> np.linalg.norm(num_res[:, 0] - num_res_quad[:, 0], np.inf)) + L-infinity distance between numerical solutions of the original ODE and the quadratized one: 1.5569859268538266e-07 + + diff --git a/docs/source/polynomialization.rst b/docs/source/polynomialization.rst index 636e675..d9af394 100644 --- a/docs/source/polynomialization.rst +++ b/docs/source/polynomialization.rst @@ -1,4 +1,99 @@ Polynomialization =================== -Lorem ipsum \ No newline at end of file +Polynomialization by example +------------------------------ + +Polynomialization is extremely close in spirit to :ref:`quadratization `. +The difference is that this time we are converting systems with the right-hand side as elementary functions +to systems with polynomial right-hand sides. +Let's look at an example: +$$ +x' = x \sin(a x) + u(t) +$$ + +.. code-block:: python + + >>> import sympy as sp + >>> from qbee import * + >>> x, u = functions("x, u") + >>> a = parameters("a") + >>> system = [(x, x * sp.sin(a*x) + u)] # u is an input variable + >>> polynomialize(system).print() + Introduced variables: + w_0 = sin(a*x) + w_1 = cos(a*x) + + x' = u + w_0*x + w_0' = a*w_1*(u + w_0*x) + w_1' = -a*w_0*(u + w_0*x) + +Note that the right-hand side of the resulting system is polynomial. +We will call the set of introduced variables $\{\cos(a \cdot x), \sin(a \cdot x)\}$ a **polynomialization** of the system. + +Result of polynomialization can be natively combined with quadratization: + +.. code-block:: python + + >>> poly_res = polynomialize(system) + >>> quadratize(poly_res, new_vars_name="p_").print() + Introduced variables: + p_0 = w_1*x + p_1 = w_0*x + + x' = p_0 + u + w_0' = -a*p_0*w_1 - a*u*w_1 + w_1' = a*p_1*w_1 + a*u*w_0 + p_0' = a*p_0*p_1 + a*p_1*u + p_0*w_1 + u*w_1 + p_1' = -a*p_0**2 - a*p_0*u + p_1*w_1 + u*w_0 + +Nevertheless, there is a much simpler way to do it altogether: + +.. code-block:: python + + >>> polynomialize_and_quadratize(system).print() + Introduced variables: + w_0 = sin(a*x) + w_1 = cos(a*x) + w_2 = w_0*x + w_3 = w_1*x + + x' = u + w_2 + w_0' = a*u*w_1 + a*w_1*w_2 + w_1' = -a*u*w_0 - a*w_0*w_2 + w_2' = a*u*w_3 + a*w_2*w_3 + u*w_0 + w_0*w_2 + w_3' = -a*u*w_2 - a*w_2**2 + u*w_1 + w_1*w_2 + + +Polynomialization and Laurent monomials +--------------------------------------------- + +Consider the following example: + +.. code-block:: python + + >>> import sympy as sp + >>> from qbee import * + >>> x = functions("x") + >>> system = [(x, sp.sin(1 / x))] + >>> polynomialize(system).print() + Introduced variables: + w_0 = sin(1/x) + w_1 = cos(1/x) + + x' = w_0 + w_0' = -w_0*w_1/x**2 + w_1' = w_0**2/x**2 + +As you can see, the resulting system is polynomial in :ref:`Laurent sense `, i.e. +have variables with negative integer powers. +Although this form comes in handy for more optimal quadratization in the end +(see :ref:`this section `), +you may want to get a system with a polynomial right-hand side in the usual sense. +How to do this is shown in the :ref:`corresponding section `. + +Optional: Polynomialization of rational powers +---------------------------------------------- + +TODO, use my note + diff --git a/examples/numerical_integration.py b/examples/numerical_integration.py index 05de2a5..c6a90d1 100644 --- a/examples/numerical_integration.py +++ b/examples/numerical_integration.py @@ -22,3 +22,8 @@ num_res_quad = my_odeint_quad(ts, rtol=1e-10) print(f"L-infinity distance between numerical solutions of the original ODE and the quadratized one: " f"{np.linalg.norm(num_res[:, 0] - num_res_quad[:, 0], np.inf)}") + + import matplotlib.pyplot as plt + plt.plot(ts, np.abs(num_res - num_res_quad)) + plt.title("Absolute difference between solutions of original and quadratized systems") + plt.savefig("../docs/source/images/num_integration_abs_diff.png") diff --git a/pyproject.toml b/pyproject.toml index 6314fb2..38a9b08 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,10 +34,10 @@ pygal = "*" optional = true [tool.poetry.group.docs.dependencies] -sphinx = ">=6.0" +sphinx = "6.2.1" sphinx-rtd-theme = "*" sphinx-math-dollar = "*" -sphinx_toolbox = "*" +sphinx_toolbox = "3.4.0" [build-system] requires = ["poetry-core"] @@ -52,4 +52,5 @@ markers = [ [tool.poetry.scripts] tests = "tests:run_tests" -benchmarks = "tests:run_benchmarks" \ No newline at end of file +benchmarks = "tests:run_benchmarks" +docs = "docs.build:build_html" \ No newline at end of file From 3e7bf1fe65544b150fe9400f102807e7d8025a24 Mon Sep 17 00:00:00 2001 From: Andrey Bychkov Date: Wed, 19 Jul 2023 17:59:58 +0300 Subject: [PATCH 6/7] Fix #21 and add "Ctrl+C" hint to the progress bar --- qbee/polynomialization.py | 15 ++++++++------- qbee/quadratization.py | 14 +++++++++----- qbee/util.py | 2 +- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/qbee/polynomialization.py b/qbee/polynomialization.py index e00ceb5..546c132 100644 --- a/qbee/polynomialization.py +++ b/qbee/polynomialization.py @@ -13,7 +13,8 @@ from typing import Iterator, Collection, Iterable from ordered_set import OrderedSet from .printer import str_qbee -from .util import make_derivative_symbol, generate_derivatives, key_from_value, Parameter, progress_bar, monom2PolyElem +from .util import (make_derivative_symbol, generate_derivatives, key_from_value, + Parameter, progress_bar, monom2PolyElem) class VariablesHolder: @@ -303,15 +304,12 @@ def __len__(self): POLY_ALGORITHM_INTERRUPTED = False -def signal_handler(sig_num, frame): +def signal_handler_poly(sig_num, frame): global POLY_ALGORITHM_INTERRUPTED - print("The algorithm has been interrupted. Returning the current best.") + print("The polynomialization algorithm has been interrupted. Returning the current best...") POLY_ALGORITHM_INTERRUPTED = True -signal.signal(signal.SIGINT, signal_handler) - - def eq_list_to_eq_system(system: list[(sp.Symbol, sp.Expr)]) -> EquationSystem: lhs, rhs = zip(*system) # making constant right-hand sides symbolic expressions @@ -382,7 +380,9 @@ def polynomialize(system: EquationSystem | list[(sp.Symbol, sp.Expr)], upper_bou system = eq_list_to_eq_system(system) system.variables.base_var_name = new_vars_name system.variables.start_new_vars_with = start_new_vars_with + signal.signal(signal.SIGINT, signal_handler_poly) # Add Ctrl+C stopper nvars, opt_system, traversed = poly_algo_step(system, upper_bound, math.inf) + final_iter() return make_laurent(system, opt_system) @@ -426,7 +426,8 @@ def poly_algo_step(part_res: EquationSystem, upper_bound, best_nvars) -> (int, E @progress_bar(is_stop=True) def final_iter(): - pass + global POLY_ALGORITHM_INTERRUPTED + POLY_ALGORITHM_INTERRUPTED = False def next_gen(system: EquationSystem) -> Iterator[EquationSystem]: diff --git a/qbee/quadratization.py b/qbee/quadratization.py index f93e893..0fd1277 100644 --- a/qbee/quadratization.py +++ b/qbee/quadratization.py @@ -227,6 +227,8 @@ def quadratize_poly(polynomials: list[PolyElement], w0' = w0**2 + w0*w1 w1' = w0*w1 + 2*w1**2 """ + signal.signal(signal.SIGINT, signal_handler_quad) + if pruning_functions is None: pruning_functions = default_pruning_rules @@ -524,15 +526,12 @@ def _final_iter(self): QUAD_ALGORITHM_INTERRUPTED = False -def signal_handler(sig_num, frame): +def signal_handler_quad(sig_num, frame): global QUAD_ALGORITHM_INTERRUPTED - print("The algorithm has been interrupted. Returning the current best.") + print("The quadratization algorithm has been interrupted. Returning the current best...") QUAD_ALGORITHM_INTERRUPTED = True -signal.signal(signal.SIGINT, signal_handler) - - class BranchAndBound(Algorithm): def domination_upper_bound(self): @@ -583,6 +582,9 @@ def next_gen(self, part_res: PolynomialSystem): def _final_iter(self): self._nodes_traversed = 0 + global QUAD_ALGORITHM_INTERRUPTED + QUAD_ALGORITHM_INTERRUPTED = False + @dump_results def _save_results(self, opt_system): return [opt_system, ] @@ -646,9 +648,11 @@ def pruning_by_vars_number(_: Algorithm, system: PolynomialSystem, *args, nvars: return True return False + def is_var_bound(f): return type(f) == partial and f.func == pruning_by_vars_number + def pruning_by_best_nvars(a: Algorithm, part_res: PolynomialSystem, *args): """Branch-and-Bound default pruning """ best_nvars, *_ = args diff --git a/qbee/util.py b/qbee/util.py index b6c94c9..2aa7354 100644 --- a/qbee/util.py +++ b/qbee/util.py @@ -93,7 +93,7 @@ def repl(f): @parametrized def progress_bar(func, is_stop): - postfix_str = "Current best order = {}" + postfix_str = "Current best order = {}, To return current best press Ctrl+C" @wraps(func) def wrapper(*args, **kwargs): From 6faa8eb4e7172b22b906f489081478e529ce879c Mon Sep 17 00:00:00 2001 From: Andrey Bychkov Date: Wed, 19 Jul 2023 18:59:28 +0300 Subject: [PATCH 7/7] Update version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 38a9b08..1d13e1f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "qbee" -version = "0.8.1" +version = "0.8.2" description = "Quadratization of differential equations in python" authors = ["Andrey Bychkov, Gleb Pogudin"] license = "MIT"