From fb20596fba919222b32c297d8c91920464c21b8d Mon Sep 17 00:00:00 2001 From: Lucas Tadeu Marculino Date: Mon, 17 Nov 2025 19:52:44 -0300 Subject: [PATCH] initial --- .gitignore | 49 ++ config.xml | 11 + package.json | 27 + www/assets/Variac.svg | 435 ++++++++++++ www/assets/dados.json | 62 ++ www/assets/equations/Aiba.svg | 579 ++++++++++++++++ www/assets/equations/Andrews.svg | 740 ++++++++++++++++++++ www/assets/equations/Bergter.svg | 510 ++++++++++++++ www/assets/equations/Contois.svg | 351 ++++++++++ www/assets/equations/Monod.svg | 310 +++++++++ www/assets/equations/Moser.svg | 355 ++++++++++ www/assets/equations/Pirt.svg | 306 +++++++++ www/assets/equations/Tessier.svg | 1039 ++++++++++++++++++++++++++++ www/assets/equations/eq.pdf | Bin 0 -> 85642 bytes www/assets/equations/eq.svg | 1101 ++++++++++++++++++++++++++++++ www/assets/equations/eq.tex | 37 + www/assets/exemplo.ods | Bin 0 -> 7859 bytes www/assets/favicon.svg | 61 ++ www/assets/gerarDados.ipynb | 335 +++++++++ www/assets/simples.ods | Bin 0 -> 8175 bytes www/favicon.ico | Bin 0 -> 1393 bytes www/index.css | 389 +++++++++++ www/index.html | 615 +++++++++++++++++ www/package.json | 7 + www/src/Objective.js | 131 ++++ www/src/PSO.js | 93 +++ www/src/conhecidos.js | 49 ++ www/src/consulta/model.js | 13 + www/src/consulta/modelos.js | 170 +++++ www/src/jquery.jslatex.js | 69 ++ www/src/rrandom.js | 4 + www/src/runge-kutta.js | 70 ++ www/src/search.js | 559 +++++++++++++++ www/src/solve.js | 45 ++ www/tests/demo.mjs | 50 ++ www/tests/synthetic-search.mjs | 107 +++ 36 files changed, 8679 insertions(+) create mode 100644 .gitignore create mode 100644 config.xml create mode 100644 package.json create mode 100644 www/assets/Variac.svg create mode 100644 www/assets/dados.json create mode 100644 www/assets/equations/Aiba.svg create mode 100644 www/assets/equations/Andrews.svg create mode 100644 www/assets/equations/Bergter.svg create mode 100644 www/assets/equations/Contois.svg create mode 100644 www/assets/equations/Monod.svg create mode 100644 www/assets/equations/Moser.svg create mode 100644 www/assets/equations/Pirt.svg create mode 100644 www/assets/equations/Tessier.svg create mode 100644 www/assets/equations/eq.pdf create mode 100644 www/assets/equations/eq.svg create mode 100644 www/assets/equations/eq.tex create mode 100644 www/assets/exemplo.ods create mode 100644 www/assets/favicon.svg create mode 100644 www/assets/gerarDados.ipynb create mode 100644 www/assets/simples.ods create mode 100644 www/favicon.ico create mode 100644 www/index.css create mode 100644 www/index.html create mode 100644 www/package.json create mode 100644 www/src/Objective.js create mode 100644 www/src/PSO.js create mode 100644 www/src/conhecidos.js create mode 100644 www/src/consulta/model.js create mode 100644 www/src/consulta/modelos.js create mode 100644 www/src/jquery.jslatex.js create mode 100644 www/src/rrandom.js create mode 100644 www/src/runge-kutta.js create mode 100644 www/src/search.js create mode 100644 www/src/solve.js create mode 100644 www/tests/demo.mjs create mode 100644 www/tests/synthetic-search.mjs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0daec5c --- /dev/null +++ b/.gitignore @@ -0,0 +1,49 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +.DS_Store + +# Generated by package manager +node_modules/ + +# Generated by Cordova +/plugins/ +/platforms/ + +.DS_Store +.log/ +.idea +tmp/ +*.tern-port +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +*.tsbuildinfo +.npm +.eslintcache +.auctex*/ +package-lock.json +*.aux +*.log +*.toc +*.out +*.synctex.gz +*.fdb_latexmk +*.fls +*.ipynb_checkpoints* \ No newline at end of file diff --git a/config.xml b/config.xml new file mode 100644 index 0000000..e31442d --- /dev/null +++ b/config.xml @@ -0,0 +1,11 @@ + + + BioLab + BioLab Parameter Explorer + + Apache Cordova Team + + + + + diff --git a/package.json b/package.json new file mode 100644 index 0000000..febfa77 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "com.tadeu.biolab", + "displayName": "BioLab", + "version": "1.0.0", + "description": "A sample Apache Cordova application for BioLab.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Lucas Tadeu Marculino", + "license": "MIT", + "devDependencies": { + "cordova-electron": "^4.0.0", + "electron": "^39.2.1", + "electron-builder": "^26.0.12" + }, + "cordova": { + "platforms": [ + "electron" + ] + }, + "win": { + "target": [ + "nsis" + ] + } +} diff --git a/www/assets/Variac.svg b/www/assets/Variac.svg new file mode 100644 index 0000000..33c2f43 --- /dev/null +++ b/www/assets/Variac.svg @@ -0,0 +1,435 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/dados.json b/www/assets/dados.json new file mode 100644 index 0000000..1961a33 --- /dev/null +++ b/www/assets/dados.json @@ -0,0 +1,62 @@ +[ + { + "tempo_h":0.0, + "substrato_S_gL":3.0, + "celulas_X_gL":0.05 + }, + { + "tempo_h":2.0, + "substrato_S_gL":2.9589957891, + "celulas_X_gL":0.1578767505 + }, + { + "tempo_h":4.0, + "substrato_S_gL":2.9641782139, + "celulas_X_gL":0.1276852512 + }, + { + "tempo_h":6.0, + "substrato_S_gL":2.8651038957, + "celulas_X_gL":0.1231016961 + }, + { + "tempo_h":8.0, + "substrato_S_gL":2.7382748156, + "celulas_X_gL":0.2362213241 + }, + { + "tempo_h":10.0, + "substrato_S_gL":2.6079841083, + "celulas_X_gL":0.1876996896 + }, + { + "tempo_h":12.0, + "substrato_S_gL":2.4234159844, + "celulas_X_gL":0.4493149032 + }, + { + "tempo_h":14.0, + "substrato_S_gL":2.1069816449, + "celulas_X_gL":0.5927647867 + }, + { + "tempo_h":16.0, + "substrato_S_gL":1.6667082549, + "celulas_X_gL":0.7867908379 + }, + { + "tempo_h":18.0, + "substrato_S_gL":1.1347389178, + "celulas_X_gL":1.1979622182 + }, + { + "tempo_h":20.0, + "substrato_S_gL":0.4681884477, + "celulas_X_gL":1.5379116343 + }, + { + "tempo_h":22.0, + "substrato_S_gL":0.0321180338, + "celulas_X_gL":1.8565788779 + } +] \ No newline at end of file diff --git a/www/assets/equations/Aiba.svg b/www/assets/equations/Aiba.svg new file mode 100644 index 0000000..89a454f --- /dev/null +++ b/www/assets/equations/Aiba.svg @@ -0,0 +1,579 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/equations/Andrews.svg b/www/assets/equations/Andrews.svg new file mode 100644 index 0000000..8691b0d --- /dev/null +++ b/www/assets/equations/Andrews.svg @@ -0,0 +1,740 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/equations/Bergter.svg b/www/assets/equations/Bergter.svg new file mode 100644 index 0000000..136c400 --- /dev/null +++ b/www/assets/equations/Bergter.svg @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/equations/Contois.svg b/www/assets/equations/Contois.svg new file mode 100644 index 0000000..5c60c11 --- /dev/null +++ b/www/assets/equations/Contois.svg @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/equations/Monod.svg b/www/assets/equations/Monod.svg new file mode 100644 index 0000000..451b449 --- /dev/null +++ b/www/assets/equations/Monod.svg @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/equations/Moser.svg b/www/assets/equations/Moser.svg new file mode 100644 index 0000000..caba053 --- /dev/null +++ b/www/assets/equations/Moser.svg @@ -0,0 +1,355 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/equations/Pirt.svg b/www/assets/equations/Pirt.svg new file mode 100644 index 0000000..348d795 --- /dev/null +++ b/www/assets/equations/Pirt.svg @@ -0,0 +1,306 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/equations/Tessier.svg b/www/assets/equations/Tessier.svg new file mode 100644 index 0000000..4d15279 --- /dev/null +++ b/www/assets/equations/Tessier.svg @@ -0,0 +1,1039 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/equations/eq.pdf b/www/assets/equations/eq.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9c88fd0aa831fb49a681ab1e898ee7370bfd7682 GIT binary patch literal 85642 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 RTo$HAMh0A}s;>TSTma_DvpoO+ literal 0 HcmV?d00001 diff --git a/www/assets/equations/eq.svg b/www/assets/equations/eq.svg new file mode 100644 index 0000000..4555ef8 --- /dev/null +++ b/www/assets/equations/eq.svg @@ -0,0 +1,1101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/www/assets/equations/eq.tex b/www/assets/equations/eq.tex new file mode 100644 index 0000000..6eecaf6 --- /dev/null +++ b/www/assets/equations/eq.tex @@ -0,0 +1,37 @@ +\documentclass{article} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{amsfonts} + +\begin{document} + + +pirt: +\[ q_{S} = \frac{\mu}{Y_{X/S}} + m_{S} \] + +monod: +\[ \mu(S) = \frac{\mu_{\max} S}{K_{S} + S} \] + +moser: +\[ \mu(S) = \frac{\mu_{\max} S^n}{K_{S}^n + S^n} \] + +contois: +\[ \mu(S,X) = \frac{\mu_{\max} S}{K_{S} X + S} \] + +bergter: +\[ \mu(S,t) = \frac{\mu_{\max} S}{K_{S} + S} \left(1 - e^{-t/T}\right) \] + +Aiba: +\[ \mu(S) = \mu_{\max} \frac{S}{K_S + S} e^{-K_I S} \] + +Andrews: +\[ \mu(S) = \mu_{\max} \frac{S}{K_S + S + \frac{S^2}{K_I}} \] + +Tessier: +\[ \mu(S) = \mu_{\max} \left(1 - e^{-S/K_S}\right) \] + +Equações de Massas: + +\[ \frac{dX}{dt} = \mu X \] +\[ \frac{dS}{dt} = -q_{S} X \] +\[ \frac{dP}{dt} = \mu_{P} X \] diff --git a/www/assets/exemplo.ods b/www/assets/exemplo.ods new file mode 100644 index 0000000000000000000000000000000000000000..b1d8a97766a649ad2f73de25ad9a3b92406e9bb3 GIT binary patch literal 7859 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 +erlenmeyer_flaskerlenmeyer_flask diff --git a/www/assets/gerarDados.ipynb b/www/assets/gerarDados.ipynb new file mode 100644 index 0000000..c9157cd --- /dev/null +++ b/www/assets/gerarDados.ipynb @@ -0,0 +1,335 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "66755e2e-daeb-4e9c-bedf-e72787095e54", + "metadata": {}, + "source": [ + "# Origem dos parâmetros utilizados\n", + "\n", + "## Rebnegger et al. (2016), *Pichia pastoris* em glicose\n", + "- **Parâmetros de Pirt**: $Y_{X/S,\\max}=0.584\\ \\text{gX/gS},\\ m_S=0.0031\\ \\text{gS/gX/h}$ vêm diretamente do artigo de **Rebnegger et al. (2016, *Applied and Environmental Microbiology*)**, estimados em retentostat e chemostato. \n", + "\n", + "- **Crescimento (Monod)**: $\\mu_{\\max}=0.18\\ \\text{h}^{-1},\\ K_S=0.11\\ \\text{g/L}$ foram adotados como **valores plausíveis para leveduras em glicose**, conservadores em relação a máximos (~0.2–0.3 h⁻¹). \n", + "\n", + "- **Condições iniciais**: $X_0=0.05\\ \\text{g/L},\\ S_0=3.0\\ \\text{g/L}$ simulam uma batelada com glicose abundante, típica de ensaios laboratoriais.\n", + " \n", + "\n", + "🔗 Artigo: [Rebnegger et al., 2016 — *Applied and Environmental Microbiology*](https://doi.org/10.1128/AEM.00638-16)\n", + "\n", + "---\n", + "\n", + "**Resumo**: cada conjunto de parâmetros combina **valores reportados nos artigos** com **ajustes plausíveis baseados na literatura**, garantindo perfis de crescimento e consumo biologicamente realistas.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "25799689-cad4-4442-8ae8-717481ee5606", + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt\n", + "from scipy.integrate import solve_ivp\n", + "from IPython.display import display\n", + "\n", + "# =========================\n", + "# Modelos\n", + "# =========================\n", + "def mu_haldane(S, mu_max, Ks, Ki):\n", + " S = np.clip(np.asarray(S), 0, None)\n", + " return mu_max * S / (Ks + S + (S**2)/Ki)\n", + "\n", + "def mu_monod(S, mu_max, Ks):\n", + " S = np.clip(np.asarray(S), 0, None)\n", + " return mu_max * S / (Ks + S)\n", + "\n", + "def qS_pirt(mu, Yxs, mS):\n", + " return mu / Yxs + mS\n", + "\n", + "def rhs_batch(t, y, mu_fun, mu_params, Yxs, mS):\n", + " X, S = y\n", + " S = max(S, 0.0)\n", + " mu = mu_fun(S, **mu_params)\n", + " dXdt = mu * X\n", + " dSdt = -qS_pirt(mu, Yxs, mS) * X\n", + " return [dXdt, dSdt]\n", + "\n", + "# =========================\n", + "\n", + "t_span = (0.0, 22.0)\n", + "t_eval = np.linspace(*t_span, 600)\n", + "\n", + "reb_params_mu = dict(mu_max=0.18, Ks=0.11) # h^-1, g/L\n", + "reb_Yxs = 0.584\n", + "reb_mS = 0.0031\n", + "X0_reb, S0_reb = 0.05, 3.00 # g/L\n", + "\n", + "sol_reb = solve_ivp(\n", + " rhs_batch, t_span, [X0_reb, S0_reb],\n", + " args=(lambda S, **p: mu_monod(S, **p), reb_params_mu, reb_Yxs, reb_mS),\n", + " t_eval=t_eval, rtol=1e-7, atol=1e-9\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8981bf23-87ed-4156-ba33-8e473abac249", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\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", + "
Rebnegger 2016 — Monod + Pirttempo_hsubstrato_S_gLcelulas_X_gL
00.0000003.00000.0500
12.0000002.96410.0708
24.0000002.91330.1001
36.0000002.84150.1416
48.0000002.74010.2002
\n" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "def tabela_por_hora(sol, titulo, t_max=22):\n", + " # tempos inteiros dentro do intervalo da simulação\n", + " t_horas = np.arange(0, min(t_max, sol.t[-1]) + 1, 2.0)\n", + "\n", + " # interpolação sobre o grid t_eval já calculado\n", + " X_interp = np.interp(t_horas, sol.t, sol.y[0])\n", + " S_interp = np.interp(t_horas, sol.t, sol.y[1])\n", + "\n", + " df = pd.DataFrame({\n", + " \"tempo_h\": t_horas,\n", + " \"substrato_S_gL\": S_interp,\n", + " \"celulas_X_gL\": X_interp,\n", + " })\n", + " df = df[[\"tempo_h\", \"substrato_S_gL\", \"celulas_X_gL\"]].copy()\n", + " df.columns.name = titulo\n", + " return df\n", + "\n", + "df_reb = tabela_por_hora(sol_reb, \"Rebnegger 2016 — Monod + Pirt\", t_max=22)\n", + "\n", + "display(df_reb.head().style.format({\"substrato_S_gL\": \"{:.4f}\", \"celulas_X_gL\": \"{:.4f}\"}))\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f46812ea-e972-4906-bf76-8891cf2405e5", + "metadata": {}, + "outputs": [], + "source": [ + "# Parâmetros do ruído\n", + "mean = 0.0 # média do ruído\n", + "std_X = 0.05 # desvio padrão para X\n", + "std_S = 0.05 # desvio padrão para S\n", + "\n", + "# Copiar o DataFrame para não sobrescrever o original\n", + "df_noisy = df_reb.copy()\n", + "\n", + "# Adicionar ruído gaussiano às colunas de interesse\n", + "idx = df_reb.index[1:]\n", + "\n", + "df_noisy.loc[idx, \"celulas_X_gL\"] = df_reb.loc[idx, \"celulas_X_gL\"] + np.random.normal(mean, std_X, size=len(idx))\n", + "df_noisy.loc[idx, \"substrato_S_gL\"] = df_reb.loc[idx, \"substrato_S_gL\"] + np.random.normal(mean, std_S, size=len(idx))\n", + "\n", + "df_noisy = df_noisy.clip(lower=0)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "311fda7a-5189-4549-8735-730e6609ac32", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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kv3793ves2DBAoYMGcKSJUtITk4mPDyc66+/3usWo8vlYtGiRXTv3h273c6QIUNYsWLFKX+WDz/8kODgYEaOHNlo26ZNm0hLSyM8PJxRo0Z5BU+AyZMn8/bbb1NeXt7G36SI+DOFMhEJaB999BE33ngjc+fOZdeuXSxZsoTly5fz0EMPee33wAMPcPPNN7N161b69u3LtGnTuO2225g3bx4bN24E4I477vB6z759+3jzzTd57733WLFiBVu3buX222/3bH/yySd57LHHePTRR9m2bRvjx49n8uTJ7N27t9l616xZQ1paWpPb7rvvPh577DE2btxIcHAwM2bM8NqelpZGdXU169evb9XvSEQChCEiEkCWLVtmOBwOz/KYMWOMxYsXe+3zt7/9zUhMTPQsA8bvf/97z/K6desMwFi6dKln3euvv26EhoZ6lufPn28EBQUZBw8e9Kz78MMPDavVauTk5BiGYRhJSUnGQw895PXZI0aMMObMmdNs/ddcc40xY8YMr3WrVq0yAOOTTz7xrPvggw8MwCgvL/fat3Pnzsby5cubPb6IBC71KRORgLZp0yY2bNjgdWWstraWiooKysrKCA8PB+DCCy/0bI+Pjwdg0KBBXusqKipwOp1ER0cDkJKSQvfu3T37jBw5EpfLxZ49ewgPD+fw4cOMHj3aq57Ro0fz9ddfN1tveXk5oaGhTW47ucbExEQA8vLySElJ8awPCwujrKys2eOLSOBSKBORgOZyuVi4cCFTpkxptO3k8GOz2TyvLRZLs+tcLlezn1W/T/1zw9cAhmE0Wney2NhYCgsLm9zWknoKCgro2rVrs8cXkcClPmUiEtCGDRvGnj176NWrV6OH1Xpmf+Kys7M5fPiwZ3ndunVYrVb69OlDdHQ0SUlJjYaoWLt2Lf369Wv2mEOHDmXXrl1tqmf//v1UVFQwdOjQNr1fRPybrpSJSEC7//77ufrqq0lOTub666/HarWybds2tm/fzoMPPnhGxw4NDWX69Ok8+uijOJ1O5s6dyw033EBCQgIAv/vd75g/fz49e/ZkyJAhLFu2jK1bt/Lqq682e8zx48czb948CgsL6dy5c6vq+fzzzzn//PPp2bPnGf1cIuKfFMpEJKCNHz+e999/n0WLFvHII49gs9no27cvM2fOPONj9+rViylTpjBx4kQKCgqYOHEizz77rGf73LlzcTqd/Pa3vyUvL4/+/fvz7rvv0rt372aPOWjQINLS0njzzTe57bbbWlXP66+/zqxZs9r884iIf7MYhmGYXYSIiL9ZsGABb7/9Nlu3bm33Y2dmZnL33XezY8eOFt9i3bFjB1dccQXffvstDoej3WsSEfPpSpmISAebOHEie/fu5dChQyQnJ7foPYcPH+bll19WIBM5iymUiYiY4De/+U2r9k9PT/dRJSLiL3T7UkRERMQPaEgMERERET+gUCYiIiLiBxTKRERERPyAQpmIiIiIH1AoExEREfEDCmUiIiIifkChTERERMQPKJSJiIiI+IH/Axhc3chE4Y1TAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.figure(figsize=(7,5))\n", + "plt.scatter(df_noisy[\"tempo_h\"], df_noisy[\"celulas_X_gL\"], label=\"X ruidoso\")\n", + "plt.plot(sol_reb.t, sol_reb.y[0], lw=2, label=\"X modelado\")\n", + "\n", + "plt.scatter(df_noisy[\"tempo_h\"], df_noisy[\"substrato_S_gL\"], label=\"S Ruidoso\")\n", + "plt.plot(sol_reb.t, sol_reb.y[1], lw=2, label=\"S modelado\")\n", + "\n", + "plt.xlabel(\"Tempo (h)\")\n", + "plt.ylabel(\"Concentração (g/L)\")\n", + "plt.title(\"Curvas modeladas e dados com ruido arificial\")\n", + "plt.grid(True); plt.legend(); plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "75dbf5b1-b6cd-47f0-8a19-edf03311649d", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\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", + "
Rebnegger 2016 — Monod + Pirttempo_hsubstrato_S_gLcelulas_X_gL
00.03.0000000.050000
12.03.1214290.001534
24.02.9714750.108785
36.02.9046320.186982
48.02.8132560.225855
\n", + "
" + ], + "text/plain": [ + "Rebnegger 2016 — Monod + Pirt tempo_h substrato_S_gL celulas_X_gL\n", + "0 0.0 3.000000 0.050000\n", + "1 2.0 3.121429 0.001534\n", + "2 4.0 2.971475 0.108785\n", + "3 6.0 2.904632 0.186982\n", + "4 8.0 2.813256 0.225855" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_noisy.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "b9ee85c0-b95d-46e2-bacd-8503e83ab504", + "metadata": {}, + "outputs": [], + "source": [ + "df_noisy.to_json(\"dados.json\", orient=\"records\", indent=2)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (SciPy + Matplotlib)", + "language": "python", + "name": "python3-sci" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/www/assets/simples.ods b/www/assets/simples.ods new file mode 100644 index 0000000000000000000000000000000000000000..a2ebc6f43394afd382d919f094b51914586fd8f0 GIT binary patch literal 8175 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 CznMG$ literal 0 HcmV?d00001 diff --git a/www/index.css b/www/index.css new file mode 100644 index 0000000..d871704 --- /dev/null +++ b/www/index.css @@ -0,0 +1,389 @@ +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap"); + +:root { + --bg-start: #f5f7fa; + --bg-end: #c3cfe2; + --primary: #4a90e2; + --secondary: #e1e8ed; + --container-bg: #ffffff; + --box-bg: #f0f4f8; + --border: #d0d8e0; + --text: #333333; +} + +body { + font-family: "Poppins", sans-serif; + margin: 0; + padding: 20px; + text-align: center; /* Centraliza o texto da página */ + background-image: linear-gradient(-45deg, var(--bg-start), var(--bg-end)); + color: var(--text); +} + +.container { + max-width: 960px; /* Define a largura máxima do container */ + margin: 0 auto; /* Centraliza o container na tela */ + padding: 20px; /* Adiciona espaço interno ao container */ + background-color: var( + --container-bg + ); /* Define a cor de fundo do container */ + border: 1px solid var(--border); /* Define a borda do container */ + border-radius: 12px; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05); +} + +.hero { + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; + margin-bottom: 24px; +} + +.hero__text { + max-width: 720px; + text-align: left; +} + +.hero__text p { + margin: 0 0 12px; +} + +.hero__figure { + margin: 0; +} + +.hero__figure img { + width: 100%; + max-width: 280px; + height: auto; +} + +.hidden { + display: none !important; +} + +h1 { + font-size: 2em; + font-weight: 600; + margin-bottom: 10px; +} + +p { + line-height: 1.5; +} + +.text { + max-width: 600px; + margin-left: auto; + margin-right: auto; +} + +/* Form styles */ +form { + display: flex; + flex-direction: column; + align-items: center; +} + +#input { + width: 500px; + margin-bottom: 10px; +} + +/* Plot styles */ +#Plot1, +#Plot2, +#Plot3, +#Plot4, +#Plot5, +#Plot6, +#Plot7 { + background-color: var(--box-bg); + border: 1px solid var(--border); + width: 600px; + height: 450px; + display: flex; + align-items: center; +} + +.box { + background-color: var(--box-bg); + padding: 10px; + border: 1px solid var(--border); + margin: 10px; + border-radius: 8px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.05); +} + +button { + background-color: var(--primary); + color: #fff; + border: none; + padding: 10px 20px; + border-radius: 4px; + cursor: pointer; + transition: background-color 0.3s ease; + width: 180px; +} + +button:hover { + background-color: #357abd; +} + +.table-actions button { + margin-bottom: 4px; +} + +.table-actions { + display: flex; + justify-content: center; + gap: 12px; + flex-wrap: wrap; + margin: 10px auto 0; + max-width: 600px; +} + +/* Link styles */ +a { + color: var(--primary); + text-decoration: none; + font-weight: bold; /* Torna o link mais visível */ +} + +a:hover { + text-decoration: underline; +} + +.abnt-table { + width: 100%; + max-width: 600px; + margin: 12px auto; + border-collapse: collapse; + border-top: 2px solid #000; + border-bottom: 2px solid #000; + background-color: transparent; + font-size: 0.95rem; + line-height: 1.4; +} + +.abnt-table thead th { + padding: 8px; + text-align: left; + font-weight: 600; + border-bottom: 2px solid #000; +} + +.abnt-table tbody td { + padding: 6px 8px; + text-align: left; +} + +.table-numbered thead th:first-child, +.table-numbered tbody td:first-child { + width: 80px; + text-align: center; +} + +.table-numbered thead th:last-child, +.table-numbered tbody td:last-child { + text-align: right; + padding-left: 18px; +} + +.table-numbered tbody td:first-child, +.table-numbered tbody td:last-child { + font-family: "Courier New", Courier, monospace; + font-variant-numeric: tabular-nums; +} + +#dataTable { + table-layout: fixed; +} + +#dataTable thead th, +#dataTable tbody td { + text-align: center; +} + +#dataTable tbody td { + font-family: "Courier New", Courier, monospace; + font-variant-numeric: tabular-nums; +} + +#dataTable input, +.bounds-table input, +.alg-table input { + width: 100%; + max-width: 100%; + padding: 4px 6px; + border: 1px solid var(--border); + border-radius: 4px; + background-color: #ffffff; + text-align: center; + box-sizing: border-box; +} + +#progressBar { + width: 100%; + max-width: 650px; + height: 18px; + margin: 10px auto; + display: none; + box-sizing: border-box; +} + +#references { + text-align: left; +} + +#references p { + text-align: justify; +} + +#dataInput, +#algParams, +#bounds { + width: 100%; +} + +#dataInputBox, +#algParamsBox, +#boundsBox { + width: 100%; + max-width: 650px; + margin-left: auto; + margin-right: auto; + align-self: stretch; +} + +#dataInput summary, +#algParams summary, +#bounds summary { + cursor: pointer; + font-weight: 600; + font-size: 1.5em; +} + +.alg-table { + max-width: 420px; +} + +.alg-table thead th:first-child, +.alg-table tbody td:first-child { + text-align: left; +} + +.alg-table tbody td:first-child { + width: 65%; +} + +.alg-table thead th:nth-child(2), +.alg-table tbody td:nth-child(2) { + text-align: center; + width: 35%; +} + +.model-params { + max-width: 600px; + margin: 12px auto 0; + text-align: left; + border: 1px solid var(--border); + border-radius: 8px; + background-color: transparent; + padding: 12px 16px; + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.03); +} + +.model-params .param-label { + font-weight: 600; + margin-bottom: 4px; + padding-bottom: 6px; + border-bottom: 1px solid var(--border); +} + +.model-params .param-list { + list-style: none; + margin: 0; + padding: 0; + display: grid; + grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); + gap: 6px; +} + +.model-params .param-list li { + background: none; + border-radius: 0; + padding: 4px 6px; + display: flex; + align-items: center; +} + +.model-params .param-list .katex { + font-size: 0.95rem; + overflow-wrap: anywhere; +} + +#bounds .bounds-grid { + display: flex; + flex-direction: column; + gap: 16px; +} + +.bounds-block { + border: 1px solid var(--border); + padding: 12px 16px; + border-radius: 8px; + background-color: transparent; + display: flex; + flex-direction: column; + gap: 8px; + min-width: 0; + height: 100%; +} + +.bounds-block h3 { + margin-top: 0; + margin-bottom: 4px; + font-size: 1.1rem; +} + +.bounds-table { + width: 100%; + max-width: 100%; + margin: 0; + table-layout: fixed; +} + +.bounds-table thead th:nth-child(2), +.bounds-table thead th:nth-child(3), +.bounds-table tbody td:nth-child(2), +.bounds-table tbody td:nth-child(3) { + text-align: center; + width: 5.5rem; + font-family: "Courier New", Courier, monospace; + font-variant-numeric: tabular-nums; +} + +.bounds-table tbody td:first-child { + text-align: left; +} + +.bounds-table tbody td:last-child { + text-align: left; + white-space: nowrap; +} + +.bounds-table input { + max-width: 4.75rem; +} + +.param-unit { + font-size: 0.85rem; + color: var(--text); + white-space: nowrap; +} + +.param-unit--dimensionless { + color: #666666; +} diff --git a/www/index.html b/www/index.html new file mode 100644 index 0000000..3fb1053 --- /dev/null +++ b/www/index.html @@ -0,0 +1,615 @@ + + + + + + + BioLab Parameter Explorer + + + + + + + + + + + + + +
+
+

BioLab Parameter Explorer

+
+

+ Parameter Search estimates kinetic parameters for microbial growth + and substrate consumption models by fitting time-course + measurements of biomass and residual substrate. +

+

+ Fill the experimental table with the sampling times (in hours) and + the measured concentrations (g/L). Use the algorithm controls to + tune the particle swarm optimization (PSO) strategy—adjust the + swarm size, cognitive and social weights, inertia factor, and + iteration limit to reflect the variability of your dataset. Model + bounds let you constrain feasible ranges for each kinetic + parameter before running the search. +

+

+ After clicking Run search, the tool evaluates all + supported kinetic expressions, displays the PSO progress, and plots + the simulated curves against your data. Each card lists the + optimized coefficients together with the maintenance term derived + from Pirt (1965), so you can compare how + different formulations reproduce the experiment without leaving the + page. +

+
+
+ Differential balances for biomass growth and substrate uptake +
+
+
+
+
+ Experimental data + + + + + + + + + +
Time (h)Substrate (g/L)Cells (g/L)
+
+ + +
+
+
+ +
+
+ Algorithm parameters + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ParameterValue
+ +
+ +
+ +
+
+
+ +
+
+ Model bounds +
+
+
+ + + + + +
+

References

+

+ AIBA, S.; SHODA, M.; NAGATANI, M. Kinetics of product inhibition in + alcohol fermentation. Biotechnology and Bioengineering, + v. 10, n. 6, pp. 845-864, Nov. 1968. +

+

+ ANDREWS, John F. A mathematical model for the continuous culture of + microorganisms utilizing inhibitory substrates. Biotechnology + and Bioengineering, v. 10, n. 6, pp. 707-723, Nov. 1968. +

+

+ BERGTER, F. Kinetic model of mycelial growth. Zeitschrift für + allgemeine Mikrobiologie, v. 18, n. 2, pp. 143-145, Jan. 1978. +

+

+ CONTOIS, D. E. Kinetics of bacterial growth: relationship between + population density and specific growth rate of continuous cultures. + Journal of General Microbiology, v. 21, n. 1, + pp. 40-50, Aug. 1959. +

+

+ MONOD, Jacques. The growth of bacterial cultures. Annual + Review of Microbiology, v. 3, n. 1, pp. 371-394, 1949. +

+

+ MOSER, H. The dynamics of bacterial populations maintained in + the chemostat. Washington, D.C.: Carnegie Institution of + Washington, 1958. +

+

+ PIRT, S. J. The maintenance energy of bacteria in growing cultures. + Proceedings of the Royal Society of London. Series B. + Biological Sciences, v. 163, n. 991, p. 224-231, 1965. +

+

+ TESSIER, G. Les lois quantitatives de la croissance. Annales + de Physiologie et de Physiochimie Biologique, v. 12, + pp. 527-571, 1936. +

+
+ + +
+
+ + diff --git a/www/package.json b/www/package.json new file mode 100644 index 0000000..f99c1cc --- /dev/null +++ b/www/package.json @@ -0,0 +1,7 @@ +{ + "name": "biolab", + "type": "module", + "scripts": { + "test": "node tests/demo.mjs && node tests/synthetic-search.mjs" + } +} diff --git a/www/src/Objective.js b/www/src/Objective.js new file mode 100644 index 0000000..514b0d9 --- /dev/null +++ b/www/src/Objective.js @@ -0,0 +1,131 @@ +import { RK4, RK4getvalue } from "./runge-kutta.js"; +export class Objective { + constructor(exper, f, res, mSize) { + /* + * res: a resolução utilizada para a resolução com RK4 + * mSize: numero de variáveis do modelo atual + * exper: tabela de valores obtidos experimentalmente + */ + this.exper = exper; + this.sampleSize = exper.length; + // Tamanho da amostra obtida experimentalmente (número de pontos) + this.f = f; + // Função f(t) a ser utilizada para o ajuste + // Vetor de tempos para resolução numérica + let tf = exper[this.sampleSize - 1][0]; + this.timeArray = []; + for (let i = 0; i <= res; i++) { + this.timeArray[i] = (i * tf) / res; + } + // valor inicial é o primeiro ponto experimental + this.y0 = [exper[1][2], exper[1][1]]; + + // Se o número de variaveis na tabela (descontando a coluna tempo) + // for maior que o numero de variáveis do modelo, + // a função objetivo é calculada com o número de variáveis do modelo. + // Caso contrário, ela é calculada com o numero de variáveis da tabela. + if (exper[1].length - 1 >= mSize) { + this.nVar = mSize; + } else { + this.nVar = exper[1].length - 1; + } + + const headerRow = Array.isArray(exper[0]) ? exper[0] : []; + const normalizedHeaders = headerRow.map((value) => { + if (typeof value !== "string") { + return ""; + } + return value + .normalize("NFD") + .replace(/[\u0300-\u036f]/g, "") + .toLowerCase(); + }); + + const dataColumns = exper[1] ? exper[1].length : 0; + const maxValidIndex = Math.max(1, dataColumns - 1); + const clampColumnIndex = (candidate) => { + if (!Number.isFinite(candidate) || candidate < 1 || candidate >= dataColumns) { + return Math.min(Math.max(1, candidate || 1), maxValidIndex); + } + return candidate; + }; + + const findColumnIndex = (keywords, fallback) => { + const idx = normalizedHeaders.findIndex((name, columnIndex) => { + if (columnIndex === 0) { + return false; + } + return keywords.some((keyword) => name.includes(keyword)); + }); + const candidate = idx > 0 ? idx : fallback; + return clampColumnIndex(candidate); + }; + + this.stateColumnIndex = []; + if (this.nVar >= 1) { + const fallbackCells = Math.min(2, maxValidIndex); + this.stateColumnIndex[0] = findColumnIndex( + ["celula", "celulas", "celula", "cell", "cells", "biomassa", "biomass", "x"], + fallbackCells, + ); + } + if (this.nVar >= 2) { + this.stateColumnIndex[1] = findColumnIndex([ + "substrato", + "substrate", + "substrat", + "s", + ], 1); + } + for (let j = 2; j < this.nVar; j++) { + this.stateColumnIndex[j] = clampColumnIndex(Math.min(j + 1, maxValidIndex)); + } + + // Média das colunas para normalização + this.mean = new Array(this.nVar).fill(0); + for (let i = 1; i < this.sampleSize; i++) { + for (let j = 0; j < this.nVar; j++) { + const columnIndex = this.stateColumnIndex[j]; + if (columnIndex < exper[i].length) { + this.mean[j] += exper[i][columnIndex]; + } + } + } + for (let j = 0; j < this.nVar; j++) { + this.mean[j] /= this.sampleSize - 1; + } + } + objective(params) { + // Resolve o modelo pelo método RK4 + let sol = RK4(this.f, this.timeArray, this.y0, params); + + // Pega predições pontuais do modelo + let pSol = []; + for (let i = 1; i < this.sampleSize; i++) { + pSol[i - 1] = RK4getvalue( + sol, + this.timeArray, + this.exper[i][0], + this.f, + params, + ); + } + + // Cálculo da função objetivo + let obj = 0; + for (let i = 2; i < this.sampleSize; i++) { + for (let j = 0; j < this.nVar; j++) { + const columnIndex = this.stateColumnIndex[j]; + if (columnIndex >= this.exper[i].length) { + continue; + } + const observed = this.exper[i][columnIndex]; + const predicted = pSol[i - 1][j]; + const denom = this.mean[j] !== 0 ? this.mean[j] : 1; + obj += ((predicted - observed) / denom) ** 2; + } + } + // console.log(obj) + return obj; + } +} diff --git a/www/src/PSO.js b/www/src/PSO.js new file mode 100644 index 0000000..a81ce14 --- /dev/null +++ b/www/src/PSO.js @@ -0,0 +1,93 @@ +import { rrandom } from "./rrandom.js"; +export class PSO { + constructor(obj, n, bounds) { + /* + obj: função objetivo a ser minimizada + n: numero de iterações a serem performadas + bounds: vetor com os mínimos e maximos dos parametros da busca + */ + this.obj = obj; + this.n = n; + this.bounds = bounds; + this.pos = []; + this.vel = []; + this.err = []; + this.pos_best = []; + this.err_best = []; + + this.dimensions = bounds.length; // número de dimensões da busca (parâmetros) + + for (var i = 0; i < this.n; i++) { + /* + inicia o vetor vel com valores aleatórios entre -1 e 1 + inicia o vetor pos com posições aleatórias dentro dos limites especificados + */ + var v = []; + var x = []; + for (var j = 0; j < this.dimensions; j++) { + v.push(rrandom(-1, 1)); + x.push(rrandom(bounds[j][0], bounds[j][1])); + } + + this.vel.push(v.slice()); + this.pos.push(x.slice()); + this.pos_best.push(x.slice()); // inicia a melhor posição como a posiçaõ atual (aleatória) + this.err_best.push(Infinity); + } + + this.err_best_g = Infinity; + // inicia o melhor erro global como infinito (quanto menor melhor) + this.pos_best_g = this.pos[0].slice(); + // inicia a melhor posição global como a posição da particula 0 + } + + run(c1, c2, w, iteration) { + for (let i = 0; i < iteration; i++) { + this.update(c1, c2, w); + // console.log(i, "/", iteration, "\t", this.err_best_g); + } + + console.log(this.pos_best_g); + // console.log(this.err_best_g) + // console.table(this.pos) + } + + update(c1, c2, w) { + for (let i = 0; i < this.n; i++) { + for (let j = 0; j < this.dimensions; j++) { + let r1 = rrandom(0, 1); + let r2 = rrandom(0, 1); + + let vel_cognitive = c1 * r1 * (this.pos_best[i][j] - this.pos[i][j]); + let vel_social = c2 * r2 * (this.pos_best_g[j] - this.pos[i][j]); + const updatedVelocity = w * this.vel[i][j] + vel_cognitive + vel_social; + let candidatePosition = this.pos[i][j] + updatedVelocity; + + if (candidatePosition > this.bounds[j][1]) { + candidatePosition = this.bounds[j][1]; + this.vel[i][j] = 0; + } else if (candidatePosition < this.bounds[j][0]) { + candidatePosition = this.bounds[j][0]; + this.vel[i][j] = 0; + } else { + this.vel[i][j] = updatedVelocity; + } + + this.pos[i][j] = candidatePosition; + } + + // Update error value + this.err[i] = this.obj.objective(this.pos[i]); + + // Update global values + if (this.err[i] < this.err_best[i]) { + this.pos_best[i] = this.pos[i].slice(); + this.err_best[i] = this.err[i]; + if (this.err[i] < this.err_best_g) { + this.pos_best_g = this.pos[i].slice(); + this.err_best_g = this.err[i]; + } + } + } + } +} diff --git a/www/src/conhecidos.js b/www/src/conhecidos.js new file mode 100644 index 0000000..efd45d7 --- /dev/null +++ b/www/src/conhecidos.js @@ -0,0 +1,49 @@ +// MONOD, 1942 +export function monod(S, mu_max, K_S) { + return (mu_max * S) / (K_S + S); +} + +// MOSER, 1958 +export function moser(S, mu_max, K_S, n) { + return (mu_max * S ** n) / (K_S + S ** n); +} + +// CONTOIS, 1959 +export function contois(S, X, mu_max, K_S) { + return (mu_max * S) / (K_S * X + S); +} + +// BERGTER, 1983 +export function bergter(S, t, mu_max, K_S, T) { + return ((mu_max * S) / (K_S + S)) * (1 - Math.exp(-t / T)); +} + +// TESSIER, 1942 +export function tessier(S, mu_max, K_S) { + return mu_max * (1 - Math.exp(-S / K_S)); +} + +// ANDREWS, 1968 +export function andrews(S, mu_max, K_S, K_I) { + return (mu_max * S) / (K_S + S + (S ** 2) / K_I); +} + +// AIBA; SHODA; NAGATANI, 1968 +export function aiba(S, mu_max, K_S, K_I) { + return ((mu_max * S) / (K_S + S)) * Math.exp(-K_I * S); +} + +// Morte celular + +// SINCLAIR; KRISTIANSEN, 1987 +export function death(K_d) { + return -K_d; +} + +// Consumo do substrato limitante para manutenção + +// PIRT, 1965 + +export function pirt(mu, Y_XS, m_S) { + return (1 / Y_XS) * mu + m_S; +} diff --git a/www/src/consulta/model.js b/www/src/consulta/model.js new file mode 100644 index 0000000..5ecb9fa --- /dev/null +++ b/www/src/consulta/model.js @@ -0,0 +1,13 @@ +function model(time, y, params) { + let K_S = params[0]; + let mu_max = params[1]; + let m_S = params[2]; + let Y_XS = params[3]; + let X = y[0]; + let S = y[1]; + let dmu = monod(S, mu_max, K_S); + let dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + let dS = -qS * X; + return [dX, dS]; +} diff --git a/www/src/consulta/modelos.js b/www/src/consulta/modelos.js new file mode 100644 index 0000000..97a09cf --- /dev/null +++ b/www/src/consulta/modelos.js @@ -0,0 +1,170 @@ +// Crescimento num único substrato limitante: + +// MONOD, 1942 + +class monod { + constructor() { + this.nPar = 2; + this.parName = ["mu_max", "K_S"] + this.varName = ["Substrato"] + this.varUsed = [1, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + this.equation = "\\mu_{X} = \\frac{\\mu_{max} S}{Ks + S}" + this.name = "MONOD, 1942" + } + model(variavel, parametros) { + return (parametros[0] * variavel[0]) / (parametros[1] + variavel[0]) + } +} + +// MOSER, 1958 +class moser { + constructor() { + this.nPar = 3; + this.parName = ["mu_max", "K_S", "n"] + this.varName = ["Substrato"] + this.varUsed = [1, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + this.equation = "\\mu_{X} = \\frac{\\mu_{max} S^n}{Ks + S^n}" + this.name = "MOSER, 1958" + } + model(variavel, parametros) { + // moser(S, mu_max, K_S, n) { + return (parametros[0] * variavel[0] ** parametros[2]) / (parametros[1] + variavel[0] ** parametros[2]) + } +} + +// CONTOIS, 1959 +class contois { + constructor() { + this.nPar = 2; + this.parName = ["mu_max", "K_S"] + this.varName = ["Substrato", "Células"] + this.varUsed = [1, 0, 1, 0, 0] // sub1, sub2, cel, prod, tempo + } + model(variavel, parametros) { + // model(S, X, mu_max, K_S) { + return (parametros[0] * variavel[0]) / (parametros[1] * variavel[1] + variavel[0]) + } +} + +// BERGTER, 1983 +class bergter { + constructor() { + this.nPar = 3; + this.parName = ["mu_max", "K_S", "T"] + this.varName = ["Substrato", "tempo"] + this.varUsed = [1, 0, 0, 0, 1] // sub1, sub2, cel, prod, tempo + } + model(variavel, parametros) { + // (S, t, mu_max, K_S, T) { + return ((parametros[0] * variavel[0]) / (parametros[1] + variavel[0])) * (1 - Math.exp(-variavel[1] / parametros[2])) + } +} + +// Morte celular + +// SINCLAIR; KRISTIANSEN, 1987 +class death { + constructor() { + this.nPar = 1; + this.parName = ["k_d"] + this.varName = [] + this.varUsed = [0, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + } + model(parametros) { + return -parametros[0] + } +} + +// Crescimento em um único substrato limitante e inibidor + +// AIBA; SHODA; NAGATANI; 1968 +class asn { + constructor() { + this.nPar = 3 + this.parName = ["mu_max", "K_S", "K_i"] + this.varName = ["Substrato"] + this.varUsed = [1, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + } + model(variavel, parametros) { + return ((parametros[0] * variavel[0]) / (parametros[1] + variavel[0])) * Math.exp(-variavel[0] / parametros[2]) + } +} + +// HALDANE, 1930 +class haldane { + constructor() { + this.nPar = 3 + this.parName = ["mu_xa", "K_S", "K_i"] + this.varName = ["Substrato"] + this.varUsed = [1, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + } + model(variavel, parametros) { + return (parametros[0] * variavel[0]) / (1 + parametros[1] / variavel[0] + variavel[0] / parametros[2]) + } +} + +// ANDREWS, 1968 +class andrews { + constructor() { + this.nPar = 3 + this.parName = ["mu_xa", "K_S", "K_i"] + this.varName = ["Substrato"] + this.varUsed = [1, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + } + model(variavel, parametros) { + return (parametros[0] * variavel[0]) / (variavel[0] + parametros[1] + (variavel[0] ** 2 / parametros[2])) + } +} + +// EDWARDS, 1970 +class edwards { + constructor() { + this.nPar = 3 + this.parName = ["mu_xa", "K_S", "K_i"] + this.varName = ["Substrato"] + this.varUsed = [1, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + } + model(variavel, parametros) { + return (parametros[0] * variavel[0]) / (variavel[0] + parametros[1] + (variavel[0] ** 2 / parametros[2]) + (1 + variavel[0] / parametros[1])) + } +} + +// WEBB, 1963 +class webb { + constructor() { + this.nPar = 3 + this.parName = ["mu_xa", "K_S", "K_i"] + this.varName = ["Substrato"] + this.varUsed = [1, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + } + model(variavel, parametros) { + return (parametros[0] * variavel[0] * (1 + variavel[0] / parametros[2])) / (variavel[0] + parametros[1] + (variavel[0] ** 2 / parametros[2])) + } +} + +// TEISSIER, 1942 +class teissier { + constructor() { + this.nPar = 3 + this.parName = ["mu_max", "K_S", "K_i"] + this.varName = ["Substrato"] + this.varUsed = [1, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + } + model(variavel, parametros) { + return parametros[0] * (Math.exp(-variavel[0] / parametros[1]) - Math.exp(-variavel[0] / parametros[2])) + } +} + +// WU et al., 1988 +class wu { + constructor() { + this.nPar = 4 + this.parName = ["mu_xa", "K_S", "K_i", "n"] + this.varName = ["Substrato"] + this.varUsed = [1, 0, 0, 0, 0] // sub1, sub2, cel, prod, tempo + } + model(variavel, parametros) { + // return mu_xa / (1 + K_S / S + (S / K_i) ** n) + return parametros[0] / (1 + parametros[1] / variavel[0] + (variavel[0] / parametros[2]) ** parametros[3]) + } +} diff --git a/www/src/jquery.jslatex.js b/www/src/jquery.jslatex.js new file mode 100644 index 0000000..e04d149 --- /dev/null +++ b/www/src/jquery.jslatex.js @@ -0,0 +1,69 @@ +/* + * jsLaTeX v1.2 - jQuery plugin + * + * Copyright (c) 2009 Andreas Grech + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + * http://knowledge-aholic.blogspot.com + */ + +(function ($) { + var attachToImage = function () { + return $("").attr({ + src: this.src + }); + }, + formats = { + 'gif': attachToImage, + 'png': attachToImage, + 'swf': function () { + return $("").attr({ + src: this.src, + type: 'application/x-shockwave-flash' + }); + } + }, + sections = { + '{f}': 'format', + '{e}': 'equation' + }, + escapes = { + '+': '2B', + '=': '3D' + }; + + $.fn.latex = function (opts) { + opts = $.extend({}, + $.fn.latex.defaults, opts); + opts.format = formats[opts.format] ? opts.format : 'gif'; + return this.each(function () { + var $this = $(this), + format, s, element, url = opts.url; + opts.equation = $.trim($this.text()); + for (s in sections) { + if (sections.hasOwnProperty(s) && (format = url.indexOf(s)) >= 0) { + url = url.replace(s, opts[sections[s]]); + } + } + for (s in escapes) { + if (escapes.hasOwnProperty(s) && (format = url.indexOf(s)) >= 0) { + url = url.replace(s, '%' + escapes[s]); + } + } + opts.src = url; + element = formats[opts.format].call(opts); + $this.html('').append(element); + if (opts.callback) { + opts.callback.call(element); + } + }); + }; + + $.fn.latex.defaults = { + format: 'gif', + url: 'https://latex.codecogs.com/{f}.latex?{e}' + }; +}(jQuery)); diff --git a/www/src/rrandom.js b/www/src/rrandom.js new file mode 100644 index 0000000..d71318f --- /dev/null +++ b/www/src/rrandom.js @@ -0,0 +1,4 @@ +export function rrandom(min, max) { + // cria um número aleatório dentro do intervalo + return Math.random() * (max - min) + min; +} diff --git a/www/src/runge-kutta.js b/www/src/runge-kutta.js new file mode 100644 index 0000000..3ff81bd --- /dev/null +++ b/www/src/runge-kutta.js @@ -0,0 +1,70 @@ +export function RK4(f, t, Y0, params) { + /* + * f: trata-se da função f(t) ser integrada + * t: trata-se do vetor de pontos no tempo + * Y0: trata-se do vetor de condições iniciais + * params: paremetros passados para o modelo de crescimento + */ + + let resolution = t.length; // resolução é o numero de pontos amostrados + let h = t[1]; // h é o tamanho do passo de integração + + let y = []; // inicializa o vetor que será devolvido como eixo y + + y[0] = Y0; //inicializa o vetor com as condições iniciais + + for (let i = 0; i < resolution; i++) { + y[i + 1] = RK4step(f, t[i], y[i], h, params); + } + + return y; +} + +function RK4step(f, t, y0, h, params) { + // Algorítimo Runge-kutta 4 + + let s = []; + let y = []; + let nVar = y0.length; + + const k1 = f(t, y0, params); + for (let i = 0; i < nVar; i++) { + s[i] = y0[i] + (k1[i] * h) / 2; + } + const k2 = f(t + h / 2, s, params); + + for (let i = 0; i < nVar; i++) { + s[i] = y0[i] + (k2[i] * h) / 2; + } + const k3 = f(t + h / 2, s, params); + + for (let i = 0; i < nVar; i++) { + s[i] = y0[i] + k3[i] * h; + } + const k4 = f(t + h, s, params); + + for (let i = 0; i < nVar; i++) { + s[i] = y0[i] + k3[i] * h; + y[i] = y0[i] + (k1[i] / 6 + k2[i] / 3 + k3[i] / 3 + k4[i] / 6) * h; + } + + return y; +} + +export function RK4getvalue(sol, timearray, time, f, params) { + /* A partir de uma solução gerada pela função RK4, + * esta função permite pegar o valor de y para um ponto arbitrário de tempo, + * para tal, é pego o valor mais próximo do ponto desejado + * e calculado com um passo de Runge-kutta para o valor exato de tempo desejado + */ + + let stepsize = timearray[1]; + // o tamanho do passo é igual o ponto 1 do vetor tempo (ponto 0 é igual a 0) + let h = time % stepsize; + // o passo dado é igual ao modulo entre o tempo arbitrário e o passo na resolução original + let y0 = sol[Math.floor(time / stepsize)]; + // inicia-se no ponto da curva imediatamente anterior ao ponto desejado + let y = RK4step(f, time, y0, h, params); + // calcula-se o y com um único passo RK4 a partir do ponto anterior + return y; +} diff --git a/www/src/search.js b/www/src/search.js new file mode 100644 index 0000000..d57c1ad --- /dev/null +++ b/www/src/search.js @@ -0,0 +1,559 @@ +import { PSO } from "./PSO.js"; +import { RK4, RK4getvalue } from "./runge-kutta.js"; +import { Objective } from "./Objective.js"; +import { + monod, + moser, + contois, + bergter, + tessier, + andrews, + aiba, + pirt, +} from "./conhecidos.js"; +import "https://cdn.plot.ly/plotly-2.29.1.min.js"; + +const parameterCatalog = { + K_S: { + latex: "K_S", + unitText: "g/L", + unitLatex: "\\mathrm{g\\,L^{-1}}", + overrides: { + contois: { + unitText: "g_S/g_X", + unitLatex: "\\frac{\\mathrm{g}_{S}}{\\mathrm{g}_{X}}", + }, + }, + }, + mu_max: { + latex: "\\mu_{max}", + unitText: "h⁻¹", + unitLatex: "\\mathrm{h^{-1}}", + }, + K_I: { + latex: "K_I", + unitText: "g/L", + unitLatex: "\\mathrm{g\\,L^{-1}}", + overrides: { + aiba: { + unitText: "L/g", + unitLatex: "\\mathrm{L\\,g^{-1}}", + }, + }, + }, + m_S: { + latex: "m_S", + unitText: "g_S/(g_X·h)", + unitLatex: "\\frac{\\mathrm{g}_{S}}{\\mathrm{g}_{X}\\,\\mathrm{h}}", + }, + Y_XS: { + latex: "Y_{XS}", + unitText: "g_X/g_S", + unitLatex: "\\frac{\\mathrm{g}_{X}}{\\mathrm{g}_{S}}", + }, + T: { + latex: "T", + unitText: "h", + unitLatex: "\\mathrm{h}", + }, + n: { + latex: "n", + unitText: null, + unitLatex: null, + }, +}; + +const modelParameters = { + aiba: [ + { key: "K_S", bounds: [0.005, 2] }, + { key: "mu_max", bounds: [0.05, 0.9] }, + { key: "K_I", bounds: [0.01, 1] }, + { key: "m_S", bounds: [0.0015, 0.05] }, + { key: "Y_XS", bounds: [0.3, 0.7] }, + ], + andrews: [ + { key: "K_S", bounds: [0.005, 2] }, + { key: "mu_max", bounds: [0.05, 0.9] }, + { key: "K_I", bounds: [5, 150] }, + { key: "m_S", bounds: [0.0015, 0.05] }, + { key: "Y_XS", bounds: [0.3, 0.7] }, + ], + bergter: [ + { key: "K_S", bounds: [0.005, 2] }, + { key: "mu_max", bounds: [0.05, 0.9] }, + { key: "T", bounds: [5, 80] }, + { key: "m_S", bounds: [0.0015, 0.05] }, + { key: "Y_XS", bounds: [0.3, 0.7] }, + ], + contois: [ + { key: "K_S", bounds: [0.005, 2] }, + { key: "mu_max", bounds: [0.05, 0.9] }, + { key: "m_S", bounds: [0.0015, 0.05] }, + { key: "Y_XS", bounds: [0.3, 0.7] }, + ], + monod: [ + { key: "K_S", bounds: [0.005, 2] }, + { key: "mu_max", bounds: [0.05, 0.9] }, + { key: "m_S", bounds: [0.0015, 0.05] }, + { key: "Y_XS", bounds: [0.3, 0.7] }, + ], + moser: [ + { key: "K_S", bounds: [0.005, 2] }, + { key: "mu_max", bounds: [0.05, 0.9] }, + { key: "n", bounds: [0.8, 2.5] }, + { key: "m_S", bounds: [0.0015, 0.05] }, + { key: "Y_XS", bounds: [0.3, 0.7] }, + ], + tessier: [ + { key: "K_S", bounds: [0.005, 2] }, + { key: "mu_max", bounds: [0.2, 0.9] }, + { key: "m_S", bounds: [0.005, 0.05] }, + { key: "Y_XS", bounds: [0.3, 0.7] }, + ], +}; + +function getParamDisplayInfo(paramKey, modelKey) { + const baseInfo = parameterCatalog[paramKey]; + if (!baseInfo) { + throw new Error(`Unknown parameter: ${paramKey}`); + } + const override = baseInfo.overrides?.[modelKey]; + if (!override) { + return baseInfo; + } + return { ...baseInfo, ...override }; +} + +function getDefaultBounds(modelKey) { + return modelParameters[modelKey].map((param) => param.bounds.slice()); +} + +function getParamDetails(modelKey) { + return modelParameters[modelKey].map((param) => { + const { latex, unitText, unitLatex } = getParamDisplayInfo( + param.key, + modelKey, + ); + return { + key: param.key, + latex, + unitText, + unitLatex, + }; + }); +} + +function monodPirt(_, y, params) { + let K_S = params[0]; + let mu_max = params[1]; + //pirt: + let m_S = params[2]; + let Y_XS = params[3]; + let X = y[0]; + let S = y[1]; + let dmu = monod(S, mu_max, K_S); + let dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + let dS = -qS * X; + return [dX, dS]; +} + +function moserPirt(_, y, params) { + let K_S = params[0]; + let mu_max = params[1]; + let n = params[2]; + //pirt: + let m_S = params[3]; + let Y_XS = params[4]; + let X = y[0]; + let S = y[1]; + let dmu = moser(S, mu_max, K_S, n); + let dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + let dS = -qS * X; + return [dX, dS]; +} + +function contoisPirt(_, y, params) { + let K_S = params[0]; + let mu_max = params[1]; + let m_S = params[2]; + let Y_XS = params[3]; + let X = y[0]; + let S = y[1]; + let dmu = contois(S, X, mu_max, K_S); + let dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + let dS = -qS * X; + return [dX, dS]; +} + +function bergterPirt(time, y, params) { + let K_S = params[0]; + let mu_max = params[1]; + let T = params[2]; + // pirt: + let m_S = params[3]; + let Y_XS = params[4]; + let X = y[0]; + let S = y[1]; + let dmu = bergter(S, time, mu_max, K_S, T); + let dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + let dS = -qS * X; + return [dX, dS]; +} + +function tessierPirt(_, y, params) { + let K_S = params[0]; + let mu_max = params[1]; + // pirt: + let m_S = params[2]; + let Y_XS = params[3]; + let X = y[0]; + let S = y[1]; + let dmu = tessier(S, mu_max, K_S); + let dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + let dS = -qS * X; + return [dX, dS]; +} + +function andrewsPirt(_, y, params) { + let K_S = params[0]; + let mu_max = params[1]; + let K_I = params[2]; + // pirt: + let m_S = params[3]; + let Y_XS = params[4]; + let X = y[0]; + let S = y[1]; + let dmu = andrews(S, mu_max, K_S, K_I); + let dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + let dS = -qS * X; + return [dX, dS]; +} + +function aibaPirt(_, y, params) { + let K_S = params[0]; + let mu_max = params[1]; + let K_I = params[2]; + // pirt: + let m_S = params[3]; + let Y_XS = params[4]; + let X = y[0]; + let S = y[1]; + let dmu = aiba(S, mu_max, K_S, K_I); + let dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + let dS = -qS * X; + return [dX, dS]; +} + +export async function main(input, options = {}) { + const alg = options.alg || { + particles: 50, + c1: 1.49618, + c2: 1.49618, + w: 0.7298, + iterations: 150, + }; + const boundsOpt = options.bounds || {}; + const onProgress = options.onProgress || (() => {}); + + const time = []; + const subs = []; + const cels = []; + for (let i = 1; i < input.length; i++) { + time[i] = input[i][0]; + subs[i] = input[i][1]; + cels[i] = input[i][2]; + } + + const basePlot = [ + { + x: time, + y: subs, + name: "Experimental substrate", + mode: "markers", + marker: { size: 10, color: "#4a90e2" }, + type: "scatter", + }, + { + x: time, + y: cels, + name: "Experimental cells", + mode: "markers", + marker: { size: 10, color: "#50e3c2" }, + type: "scatter", + }, + ]; + + function calculateAIC(obj, sol, params) { + let sse = 0; + let count = 0; + + for (let i = 1; i < input.length; i++) { + const timePoint = input[i][0]; + const prediction = RK4getvalue( + sol, + obj.timeArray, + timePoint, + obj.f, + params, + ); + + const cellResidual = prediction[0] - input[i][2]; + const substrateResidual = prediction[1] - input[i][1]; + + sse += cellResidual ** 2 + substrateResidual ** 2; + count += 2; + } + + const n = count; + const k = params.length; + const meanSquaredError = n > 0 ? sse / n : 0; + const safeMSE = Math.max(meanSquaredError, Number.EPSILON); + + return { + aic: 2 * k + n * Math.log(safeMSE), + mse: meanSquaredError, + }; + } + + function runModel(cfg) { + const obj = new Objective(input, cfg.ode, 500, 2); + const optim = new PSO(obj, alg.particles, cfg.bounds); + optim.run(alg.c1, alg.c2, alg.w, alg.iterations); + + const sol = RK4(obj.f, obj.timeArray, obj.y0, optim.pos_best_g); + const celsM = sol.map((row) => row[0]); + const subsM = sol.map((row) => row[1]); + + const { aic, mse } = calculateAIC(obj, sol, optim.pos_best_g); + + let objectiveText = "MSE: N/A"; + if (Number.isFinite(mse)) { + const absValue = Math.abs(mse); + const formatted = + absValue !== 0 && (absValue >= 1e3 || absValue < 1e-2) + ? mse.toExponential(4) + : mse.toFixed(8); + objectiveText = `MSE: ${formatted}`; + } + + Plotly.newPlot( + document.getElementById(cfg.plotId), + [ + ...basePlot, + { + x: obj.timeArray, + y: subsM, + name: "Model fit for the substrate", + mode: "lines", + line: { color: "#4a90e2" }, + }, + { + x: obj.timeArray, + y: celsM, + name: "Model fit for the cells", + mode: "lines", + line: { color: "#50e3c2" }, + }, + ], + { + margin: { t: 10, b: 30 }, + paper_bgcolor: "#f0f4f8", + plot_bgcolor: "#f0f4f8", + xaxis: { + title: { text: "Time (h)" }, + }, + yaxis: { + title: { text: "Concentration (g/L)" }, + }, + legend: { + orientation: "h", + yanchor: "top", + y: -0.2, + xanchor: "left", + x: 0, + font: { size: 10 }, + }, + annotations: [ + { + text: objectiveText, + x: 1, + y: 1, + xref: "paper", + yref: "paper", + xanchor: "right", + yanchor: "top", + showarrow: false, + font: { size: 12, color: "#1f2933" }, + bordercolor: "#d9e2ef", + borderwidth: 1, + borderpad: 6, + }, + ], + }, + ); + + const params = optim.pos_best_g.map((p) => p.toFixed(3)); + const paramContainer = document.getElementById(cfg.paramDiv); + paramContainer.classList.add("model-params"); + paramContainer.innerHTML = ""; + + const label = document.createElement("div"); + label.className = "param-label"; + label.textContent = "Parameters:"; + paramContainer.appendChild(label); + + const list = document.createElement("ul"); + list.className = "param-list"; + + params.forEach((value, i) => { + const detail = cfg.paramDetails[i]; + const item = document.createElement("li"); + const mathSpan = document.createElement("span"); + const latexUnit = detail.unitLatex; + const latexExpression = latexUnit + ? `${detail.latex} = ${value}\\,${latexUnit}` + : `${detail.latex} = ${value}`; + + if (typeof katex !== "undefined") { + katex.render(latexExpression, mathSpan, { throwOnError: false }); + } else { + mathSpan.textContent = latexUnit + ? `${detail.latex} = ${value} ${detail.unitText || ""}` + : `${detail.latex} = ${value}`; + } + + item.appendChild(mathSpan); + list.appendChild(item); + }); + + paramContainer.appendChild(list); + + return { title: cfg.title, aic, key: cfg.key }; + } + + const models = [ + { + key: "aiba", + ode: aibaPirt, + bounds: boundsOpt.aiba || getDefaultBounds("aiba"), + plotId: "Plot1", + paramDiv: "AibaParam", + title: "Pirt-Aiba", + paramDetails: getParamDetails("aiba"), + container: document.getElementById("Plot1")?.closest(".box"), + }, + { + key: "andrews", + ode: andrewsPirt, + bounds: boundsOpt.andrews || getDefaultBounds("andrews"), + plotId: "Plot2", + paramDiv: "AndrewsParam", + title: "Pirt-Andrews", + paramDetails: getParamDetails("andrews"), + container: document.getElementById("Plot2")?.closest(".box"), + }, + { + key: "bergter", + ode: bergterPirt, + bounds: boundsOpt.bergter || getDefaultBounds("bergter"), + plotId: "Plot3", + paramDiv: "BergterParam", + title: "Pirt-Bergter", + paramDetails: getParamDetails("bergter"), + container: document.getElementById("Plot3")?.closest(".box"), + }, + { + key: "contois", + ode: contoisPirt, + bounds: boundsOpt.contois || getDefaultBounds("contois"), + plotId: "Plot4", + paramDiv: "ContoisParam", + title: "Pirt-Contois", + paramDetails: getParamDetails("contois"), + container: document.getElementById("Plot4")?.closest(".box"), + }, + { + key: "monod", + ode: monodPirt, + bounds: boundsOpt.monod || getDefaultBounds("monod"), + plotId: "Plot5", + paramDiv: "MonodParam", + title: "Pirt-Monod", + paramDetails: getParamDetails("monod"), + container: document.getElementById("Plot5")?.closest(".box"), + }, + { + key: "moser", + ode: moserPirt, + bounds: boundsOpt.moser || getDefaultBounds("moser"), + plotId: "Plot6", + paramDiv: "MoserParam", + title: "Pirt-Moser", + paramDetails: getParamDetails("moser"), + container: document.getElementById("Plot6")?.closest(".box"), + }, + { + key: "tessier", + ode: tessierPirt, + bounds: boundsOpt.tessier || getDefaultBounds("tessier"), + plotId: "Plot7", + paramDiv: "TessierParam", + title: "Pirt-Tessier", + paramDetails: getParamDetails("tessier"), + container: document.getElementById("Plot7")?.closest(".box"), + }, + ]; + + const modelByKey = new Map(models.map((model) => [model.key, model])); + + const results = []; + for (let idx = 0; idx < models.length; idx++) { + const cfg = models[idx]; + const res = runModel(cfg); + results.push(res); + onProgress(idx + 1, models.length); + await new Promise((resolve) => setTimeout(resolve, 0)); + } + + results.sort((a, b) => a.aic - b.aic); + const comparisonBox = document.getElementById("comparison"); + const chartParent = models[0]?.container?.parentElement; + + if (comparisonBox && chartParent) { + results.forEach((result) => { + const modelCfg = modelByKey.get(result.key); + if (!modelCfg?.container) { + return; + } + chartParent.insertBefore(modelCfg.container, comparisonBox); + }); + } + + const compDiv = document.getElementById("comparison"); + compDiv.innerHTML = + `

Model comparison

+ + + + + + + + + ` + + results + .map((r, index) => { + return ``; + }) + .join("") + + "
#ModelAkaike Information Criterion
${index + 1}${r.title}${r.aic.toFixed( + 2, + )}
"; +} diff --git a/www/src/solve.js b/www/src/solve.js new file mode 100644 index 0000000..2b49f7d --- /dev/null +++ b/www/src/solve.js @@ -0,0 +1,45 @@ +function solve(tf, Ks, mu_max, m_S, Y_XS, X0, S0) { + let res = 5000; + let timeArray = []; + for (let i = 0; i <= res; i++) { + timeArray[i] = (i * tf) / res; + } + + let sol = RK4(model, timeArray, [X0, S0], [Ks, mu_max, m_S, Y_XS]); + let cels = []; + let subs = []; + for (let i = 0; i < sol.length; i++) { + cels[i] = sol[i][0]; + subs[i] = sol[i][1]; + } + + TESTER = document.getElementById("tester"); + Plotly.newPlot( + TESTER, + [ + { + x: timeArray, + y: subs, + name: "Calculated substrate", + line: { color: "#4a90e2" }, + }, + { + x: timeArray, + y: cels, + name: "Calculated cells", + line: { color: "#50e3c2" }, + }, + ], + { + margin: { t: 10, b: 30 }, + paper_bgcolor: "#f0f4f8", + plot_bgcolor: "#f0f4f8", + legend: { + orientation: "h", + yanchor: "top", + y: -0.2, + font: { size: 10 }, + }, + }, + ); +} diff --git a/www/tests/demo.mjs b/www/tests/demo.mjs new file mode 100644 index 0000000..2e80d99 --- /dev/null +++ b/www/tests/demo.mjs @@ -0,0 +1,50 @@ +import assert from 'assert'; +import { Objective } from '../src/Objective.js'; +import { PSO } from '../src/PSO.js'; +import { monod, pirt } from '../src/conhecidos.js'; + +function monodPirt(_, y, params) { + const K_S = params[0]; + const mu_max = params[1]; + const m_S = params[2]; + const Y_XS = params[3]; + const X = y[0]; + const S = y[1]; + const dmu = monod(S, mu_max, K_S); + const dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + const dS = -qS * X; + return [dX, dS]; +} + +const demoData = [ + ['tempo', 'substrato', 'celulas'], + [0, 3.0, 0.05], + [1, 2.9835, 0.0595], + [2, 2.964, 0.0708], + [3, 2.9406, 0.0843], + [4, 2.9129, 0.1003], + [5, 2.8799, 0.1194], + [6, 2.8407, 0.1421], + [7, 2.794, 0.1691], + [8, 2.7385, 0.2011], + [9, 2.6725, 0.2393], + [10, 2.5942, 0.2846], + [11, 2.501, 0.3384], + [12, 2.3905, 0.4023], + [13, 2.2594, 0.478], + [14, 2.104, 0.5678], + [15, 1.9202, 0.674], +]; + +const obj = new Objective(demoData, monodPirt, 100, 2); +const optim = new PSO(obj, 30, [ + [0.005, 2], + [0.05, 0.9], + [0.0015, 0.05], + [0.3, 0.7], +]); +optim.run(1.49618, 1.49618, 0.7298, 30); + +assert(Number.isFinite(optim.err_best_g)); +console.log('Final error', optim.err_best_g); diff --git a/www/tests/synthetic-search.mjs b/www/tests/synthetic-search.mjs new file mode 100644 index 0000000..b193c3d --- /dev/null +++ b/www/tests/synthetic-search.mjs @@ -0,0 +1,107 @@ +import assert from 'assert'; +import { Objective } from '../src/Objective.js'; +import { PSO } from '../src/PSO.js'; +import { monod, pirt } from '../src/conhecidos.js'; +import { RK4, RK4getvalue } from '../src/runge-kutta.js'; + +function monodPirt(_, y, params) { + const K_S = params[0]; + const mu_max = params[1]; + const m_S = params[2]; + const Y_XS = params[3]; + const X = y[0]; + const S = y[1]; + const dmu = monod(S, mu_max, K_S); + const dX = X * dmu; + const qS = pirt(dmu, Y_XS, m_S); + const dS = -qS * X; + return [dX, dS]; +} + +function generateDataset(params, options) { + const { + initialCells, + initialSubstrate, + timeFinal, + sampleCount, + resolution, + } = options; + + const y0 = [initialCells, initialSubstrate]; + const timeArray = Array.from({ length: resolution + 1 }, (_, i) => (i * timeFinal) / resolution); + const solution = RK4(monodPirt, timeArray, y0, params); + + const rows = [['tempo', 'substrato', 'celulas']]; + for (let i = 0; i <= sampleCount; i++) { + const timePoint = (i * timeFinal) / sampleCount; + const [cells, substrate] = RK4getvalue(solution, timeArray, timePoint, monodPirt, params); + rows.push([timePoint, substrate, cells]); + } + + return rows; +} + +function createDeterministicRandom(seed) { + let state = seed >>> 0; + return function random() { + state = (state * 1664525 + 1013904223) >>> 0; + return state / 0x100000000; + }; +} + +const trueParams = [160, 0.45, 1.5, 0.5]; +const dataset = generateDataset(trueParams, { + initialCells: 1.2, + initialSubstrate: 120, + timeFinal: 12, + sampleCount: 12, + resolution: 240, +}); + +const bounds = [ + [140, 200], + [0.3, 0.6], + [1.0, 2.5], + [0.3, 0.7], +]; + +const objective = new Objective(dataset, monodPirt, 240, 2); +const originalRandom = Math.random; +Math.random = createDeterministicRandom(12345); + +let optim; +try { + optim = new PSO(objective, 50, bounds); + optim.run(1.49618, 1.49618, 0.7298, 150); +} finally { + Math.random = originalRandom; +} + +const defaultGuess = bounds.map(([min, max]) => (min + max) / 2); +const defaultError = objective.objective(defaultGuess); + +assert( + optim.err_best_g < defaultError, + 'Swarm should reduce the error compared to the midpoint default parameters', +); + +const bestError = optim.err_best_g; +assert( + bestError < 1e-3, + `Best error ${bestError} should approach the synthetic optimum with the default hyperparameters`, +); + +const boundaryMargin = optim.pos_best_g.map((value, index) => { + const [min, max] = bounds[index]; + const distanceToEdge = Math.min(value - min, max - value); + return distanceToEdge; +}); + +boundaryMargin.forEach((margin, index) => { + assert( + margin > 1e-3, + `Parameter ${index} is clamped to the boundary, default configuration should explore the interior`, + ); +}); + +console.log('Synthetic dataset best parameters', optim.pos_best_g);