diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 35bf252..90d81ed 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -1,23 +1,12 @@ name: CI + on: push: branches: - main tags: '*' pull_request: + jobs: call: - strategy: - matrix: - version: - - '1.10' - - '1.11' - os: - - ubuntu-latest - arch: - - x64 uses: control-toolbox/CTActions/.github/workflows/ci.yml@main - with: - version: ${{ matrix.version }} - os: ${{ matrix.os }} - arch: ${{ matrix.arch }} \ No newline at end of file diff --git a/docs/src-literate/bistable.jl b/docs/src-literate/bistable.jl index 21ddc0b..2722f43 100644 --- a/docs/src-literate/bistable.jl +++ b/docs/src-literate/bistable.jl @@ -3,7 +3,7 @@ # # Bistable toggle switch -# The simplest GRN exhibiting bistability can be modeled through two variables $x_1$ and $x_2$ that mutually repress each othe. We suppose that the system can be externally controlled by a chemical inducer that targets the synthesis rates of both genes. The model is defined as +# The simplest GRN exhibiting bistability can be modeled through two variables $x_1$ and $x_2$ that mutually repress each other. We suppose that the system can be externally controlled by a chemical inducer that targets the synthesis rates of both genes. The model is defined as # ```math # \left\{ \begin{array}{l} # \dot{x}_1 = -\gamma_1 x_1 + u(t) k_1 s^{-}(x_2,\theta_2) , \\ diff --git a/docs/src-literate/oscillator.jl b/docs/src-literate/oscillator.jl index be2469e..7ba6e41 100644 --- a/docs/src-literate/oscillator.jl +++ b/docs/src-literate/oscillator.jl @@ -85,7 +85,7 @@ ocp = @def begin x₂(tf) == θ₂ uₘᵢₙ ≤ u(t) ≤ uₘₐₓ - tf ≥ 1 # Force the state out of the confort zone + tf ≥ 1 # Force the state out of the comfort zone ẋ(t) == [ - γ₁*x₁(t) + k₁*u(t)*(1 - s⁺(x₂(t), θ₂, regMethod)), diff --git a/docs/src/bistable.md b/docs/src/bistable.md index e1f3653..c6bba3f 100644 --- a/docs/src/bistable.md +++ b/docs/src/bistable.md @@ -7,7 +7,7 @@ EditURL = "../src-literate/bistable.jl" # Bistable toggle switch -The simplest GRN exhibiting bistability can be modeled through two variables $x_1$ and $x_2$ that mutually repress each othe. We suppose that the system can be externally controlled by a chemical inducer that targets the synthesis rates of both genes. The model is defined as +The simplest GRN exhibiting bistability can be modeled through two variables $x_1$ and $x_2$ that mutually repress each other. We suppose that the system can be externally controlled by a chemical inducer that targets the synthesis rates of both genes. The model is defined as ```math \left\{ \begin{array}{l} \dot{x}_1 = -\gamma_1 x_1 + u(t) k_1 s^{-}(x_2,\theta_2) , \\ diff --git a/docs/src/notebooks/bistable.ipynb b/docs/src/notebooks/bistable.ipynb index 71adfce..3955251 100644 --- a/docs/src/notebooks/bistable.ipynb +++ b/docs/src/notebooks/bistable.ipynb @@ -2,15 +2,16 @@ "cells": [ { "cell_type": "markdown", + "metadata": {}, "source": [ "# Bistable toggle switch" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ - "The simplest GRN exhibiting bistability can be modeled through two variables $x_1$ and $x_2$ that mutually repress each othe. We suppose that the system can be externally controlled by a chemical inducer that targets the synthesis rates of both genes. The model is defined as\n", + "The simplest GRN exhibiting bistability can be modeled through two variables $x_1$ and $x_2$ that mutually repress each other. We suppose that the system can be externally controlled by a chemical inducer that targets the synthesis rates of both genes. The model is defined as\n", "$$\n", "\\left\\{ \\begin{array}{l}\n", "\\dot{x}_1 = -\\gamma_1 x_1 + u(t) k_1 s^{-}(x_2,\\theta_2) , \\\\\n", @@ -34,35 +35,37 @@ "\\end{align}\n", "$$\n", "as shown in the following figure:" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "![Alt Text](bistable.png)" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "The control objective is to induce a transition between an initial point in $B_{10}$ and a final value of $x_2$ in $B_{01}$, which can be written through the initial and terminal constraints:\n", "$$\n", " x(0) = x_0 \\in B_{10}, \\qquad x_1(t_f) < \\theta_1, \\qquad x_2(t_f) = x_2^f\n", "$$\n", "for free final time $t_f > 0$ and for $x_2^f > \\theta_2$." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Problem definition" - ], - "metadata": {} + ] }, { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -162,27 +165,26 @@ ] } ], - "cell_type": "code", "source": [ "using Plots\n", "using Plots.PlotMeasures\n", "using OptimalControl\n", "using NLPModelsIpopt\n", "nothing # hide" - ], - "metadata": {}, - "execution_count": 1 + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "We define the regularization functions, where the method is decided through the argument `regMethod`." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], "source": [ "# Regularization of the PWL dynamics\n", "function s⁺(x, θ, regMethod)\n", @@ -204,20 +206,20 @@ " return out*(u - 1)\n", "end\n", "nothing # hide" - ], - "metadata": {}, - "execution_count": 2 + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Definition of the OCP:" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], "source": [ "# Constant definition\n", "k₁ = 1;\n", @@ -259,25 +261,26 @@ " ∫(λ*abs_m1(u(t), regMethod) + 1-λ) → min\n", "end\n", "nothing # hide" - ], - "metadata": {}, - "execution_count": 3 + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Resolution through Hill regularization" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "In order to ensure convergence of the solver, we solve the OCP by iteratively increasing the parameter $k$ while using the $i-1$-th solution as the initialization of the $i$-th iteration." - ], - "metadata": {} + ] }, { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -345,7 +348,6 @@ ] } ], - "cell_type": "code", "source": [ "regMethod = 1 # Hill regularization\n", "ki = 50 # Value of k for the first iteration\n", @@ -358,24 +360,95 @@ " global sol = solve(ocp; grid_size=N, init=sol, print_level=4*print_level)\n", "end\n", "nothing # hide" - ], - "metadata": {}, - "execution_count": 4 + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Plotting of the results:" - ], - "metadata": {} + ] }, { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { - "text/plain": "Plot{Plots.GRBackend() n=3}", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAyAAAAEsCAIAAAC0T0BtAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nO3dd1wUR/8H8Nm9PXpvKsUCoiI2FCvGhmJFxfZgLDE2lGhMMYoxUWNLrIn6aGJv0diw12iw90azxo6iSBHp3N3u/P7YJ/cjCMehB3t3fN4v/thd5va+eze3972Z2VmGUkoAAAAAQHdYqQMAAAAAMDZIsAAAAAB0DAkWAAAAgI4hwQIAAADQMSRYAAAAADqGBAsAAABAx5BgAQAAAOgYEiwAAAAAHUOCBQAAAKBjSLAAAAAAdEzvEqxJkyYplUqpowDQUzzPSx1CRbdq1aq7d+8W918jfoMEQZA6hDIhCIKx3jLOiGujQRya3iVYq1evzs7OljoKAD2Vk5MjdQgV3dGjR+/cuVPcf431DaKUGuuh5efnG8S39Xsw1reMGMih6V2CBQAAAGDokGABgNHKzc29dOnSzp073759q6GYIAi7d+++efNmuQUGAEYPCRYAGKf09HQ7O7tPP/30P//5T0JCgoaSK1asGDRo0Nq1a8stNgAwepzUAQAAlAkbG5vk5GQbGxuO03Sie/LkycqVK0NDQ8stMACoCNCCBQDGiWVZGxsbzWUopWFhYYsWLbKysiqfqACggkALFgBUXKtXr3Z1dQ0KCjpw4ICWD0lKStq1a9ft27fFVXNz8/DwcIZhxNX8/HwTE5MyiVVSlNL8/Hy5XC51ILqXn58vCIJRXkhY1rVx80MmKbfsdq9Jfj4xNVWU6VPYmZKR3sXO3yGXy1m2hCYqJFhgVFJTU588eSJ1FGUoJyfHwsJC6ig+iKWlZZ06daSOghBCEhMTFyxYcOHChVI9ilKanZ2dnp5eXAGe52NjY41vaqXc3Fxzc3OpoyiCpaVl7dq1pY6iwsnjyYQrTHgdaeq5QsWYlHEPnJnsQ/eABAuMyowZM/bv3+/s7Cx1IGWFUqpuLDFQsbGxCkXZ/vTU0saNG1mW/eyzzwgh4iWE33zzzYIFCzQ/qnLlykOGDAkJCSnyvwqFIjo6unPnzsb3la+3dS8mJuZDpqcWBEEul2seqGegFAqFqalpGe08JpnWtuUXtJCmUTMzM9/aWt+bio2wSkFFxvN8RETE2LFjpQ4EiiZ+mUkbQ3JyskqlqlKlSmhoaNOmTcWN//3vfymlffv2/fD98zzv5+d35syZD98VlIhSKpN9cFMDlN7NVOrnqI8Jt/5AggUARissLOzNmzeCIHz99de2trZr1661traeO3duYmLi9u3ba9SoUaNGDbHkvn37KKUtWrSQNmAAQ3Ezhfo5IcHSBAkWABit4ODg3Nzc/v37i6vigN/hw4fn5hYemjt8+PDyDg7AkD3OpCHVMRGBJkiwAMBo9ejR492N9evXf3ejn59f2YcDYDzyBR0MAzduSD8BAACgdJQCkSOD0AgvDwAAAJSOgicmaMHSCAkWAAAAlI4CLVglwcsDUB72798fHx//IXuIioq6fPnyh0eybdu2e/fuffh+wODcv39/165dH7KHxMTEjRs36iqe9xYfH79//36po6jolAIp66k+DR1eHoAycfLkySlTpqhX9+3b94EJVmRk5IkTJwptXL169dq1a0u1n0OHDj1+/LhUD5kzZ472d5IBvRIUFJSRkSEuf3iC9fjx4/nz5+sirn8ZMGDAs2fPtC9/5cqV9evX6zwMKBW0YJUIVxEClFqR9wxRqVQqlcrMzExcffXqlTg5uOjdNCgrK8vCwkK8m1Vubq6JiUmh+RIzMzOtra01R/LgwYN374fF83x2drZ4n2Oe5/Pz8wveXWfz5s3aHE52draFhYU4c3d8fLy9vb02jyKEpKen29nZaQ4bPlxxr39WVlbBG1efOHFCPct5jx49Cl1WqVAoBEEQKy3P8wqFotA+s7Ozzc3NS7znmrqwus6IxNsXvvvwQkGeOXMmOzv73QNkWVaciDw/P5/jOEwoqlfQglUivDwApbBp0yZ3d3cfHx8fH5+zZ8+KG319fb///vu6devWqFFjwIABOTk5z58//+KLL86cOePl5SXOFT506NCtW7cSQlatWjVw4MCgoKA6dep4eHjcuHFj1KhRderUcXZ2VrcSjRs3zsPDo0mTJlWrVt23b19xwRw7dmzVqlW//fabl5fXsGHDCCG1atWaOXNm9erV27RpQwjp2rVr9erV69evX7du3atXr4qP6t27t/hEKpUqIiKiatWqvr6+rVq1evTokVggMjKyZs2a9evXd3V1Xbdu3fr16w8ePDh9+nQvL69vv/2WEHL48GFPT08fH5/q1aurwwsKCpo6daqnp6e3t/d///vfoUOHquMcM2ZMifefAe3du3evefPmderUqVy58syZM8WN06dP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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], "text/html": [ "\n", "\n", @@ -448,84 +521,15 @@ "\n", "\n" ], - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "text/plain": [ + "Plot{Plots.GRBackend() n=3}" ] }, + "execution_count": 5, "metadata": {}, - "execution_count": 5 + "output_type": "execute_result" } ], - "cell_type": "code", "source": [ "plt1 = plot()\n", "plt2 = plot()\n", @@ -554,25 +558,26 @@ "yticks!(yticks)\n", "plot!(plt2, tspan, u; label=\"optimal control\", xlabel=\"t\")\n", "plot(plt1, plt2; layout=(1, 2), size=(800, 300))" - ], - "metadata": {}, - "execution_count": 5 + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Resolution through exponential regularization" - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "The same procedure for iteratively increasing $k$ is used." - ], - "metadata": {} + ] }, { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -658,7 +663,6 @@ ] } ], - "cell_type": "code", "source": [ "regMethod = 2 # Exponential regularization\n", "ki = 50 # Value of k for the first iteration\n", @@ -671,24 +675,95 @@ " global sol = solve(ocp; grid_size=N, init=sol, print_level=4*print_level)\n", "end\n", "nothing # hide" - ], - "metadata": {}, - "execution_count": 6 + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Plotting of the results:" - ], - "metadata": {} + ] }, { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, "outputs": [ { - "output_type": "execute_result", "data": { - "text/plain": "Plot{Plots.GRBackend() n=3}", "image/png": "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", + "image/svg+xml": [ + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + " \n", + " \n", + " \n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n", + "\n" + ], "text/html": [ "\n", "\n", @@ -761,84 +836,15 @@ "\n", "\n" ], - "image/svg+xml": [ - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - " \n", - " \n", - " \n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n", - "\n" + "text/plain": [ + "Plot{Plots.GRBackend() n=3}" ] }, + "execution_count": 7, "metadata": {}, - "execution_count": 7 + "output_type": "execute_result" } ], - "cell_type": "code", "source": [ "plt1 = plot()\n", "plt2 = plot()\n", @@ -867,33 +873,31 @@ "yticks!(yticks)\n", "plot!(plt2, tspan, u; label=\"optimal control\", xlabel=\"t\")\n", "plot(plt1, plt2; layout=(1, 2), size=(800, 300))" - ], - "metadata": {}, - "execution_count": 7 + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "---\n", "\n", "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" - ], - "metadata": {} + ] } ], - "nbformat_minor": 3, "metadata": { + "kernelspec": { + "display_name": "Julia 1.12.1", + "language": "julia", + "name": "julia-1.12" + }, "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.12.1" - }, - "kernelspec": { - "name": "julia-1.12", - "display_name": "Julia 1.12.1", - "language": "julia" } }, - "nbformat": 4 + "nbformat": 4, + "nbformat_minor": 3 } diff --git a/docs/src/notebooks/oscillator.ipynb b/docs/src/notebooks/oscillator.ipynb index 39b1c68..db508f7 100644 --- a/docs/src/notebooks/oscillator.ipynb +++ b/docs/src/notebooks/oscillator.ipynb @@ -142,7 +142,7 @@ " x₂(tf) == θ₂\n", "\n", " uₘᵢₙ ≤ u(t) ≤ uₘₐₓ\n", - " tf ≥ 1 # Force the state out of the confort zone\n", + " tf ≥ 1 # Force the state out of the comfort zone\n", "\n", " ẋ(t) == [\n", " - γ₁*x₁(t) + k₁*u(t)*(1 - s⁺(x₂(t), θ₂, regMethod)),\n", diff --git a/docs/src/oscillator.md b/docs/src/oscillator.md index e515924..53b34fc 100644 --- a/docs/src/oscillator.md +++ b/docs/src/oscillator.md @@ -94,7 +94,7 @@ ocp = @def begin x₂(tf) == θ₂ uₘᵢₙ ≤ u(t) ≤ uₘₐₓ - tf ≥ 1 # Force the state out of the confort zone + tf ≥ 1 # Force the state out of the comfort zone ẋ(t) == [ - γ₁*x₁(t) + k₁*u(t)*(1 - s⁺(x₂(t), θ₂, regMethod)), diff --git a/docs/src/scripts/oscillator.jl b/docs/src/scripts/oscillator.jl index 047f804..5a3258e 100644 --- a/docs/src/scripts/oscillator.jl +++ b/docs/src/scripts/oscillator.jl @@ -55,7 +55,7 @@ ocp = @def begin x₂(tf) == θ₂ uₘᵢₙ ≤ u(t) ≤ uₘₐₓ - tf ≥ 1 # Force the state out of the confort zone + tf ≥ 1 # Force the state out of the comfort zone ẋ(t) == [ - γ₁*x₁(t) + k₁*u(t)*(1 - s⁺(x₂(t), θ₂, regMethod)),