CSTR Simulator & Optimizer — simulação baseada em surrogate (MLP / RNN / CNN) e otimização multiobjetivo NSGA-II para reatores tanque-agitado (CSTR) com cinética, fouling e falhas operacionais.
- Dashboard Dash interativo em 5 abas (Simulation / Optimization / Training / Analytics / About) com 20+ visualizações Plotly.
- Surrogate ML — três arquiteturas (MLP, RNN-LSTM/GRU, CNN) treinadas com keras_tuner e pipeline
StandardScalerpersistido. - NSGA-II multiobjetivo (pymoo) com restrições físicas, TOPSIS, K-means e hypervolume.
- REST API opcional (FastAPI) sobre os mesmos serviços — ideal para integração com MLOps.
- Arquitetura em camadas (core / services / apps) com testes, type-hints e logging seguro em Windows/Python 3.13.
- Docker multi-stage +
docker-compose+ health-check/healthz. - CI/CD pronto: ruff, mypy, pytest em Linux + Windows.
┌────────────────────────────────────────────────────────────────────┐
│ UI (Dash + Plotly) │
│ apps/ (callbacks_main · bootstrap · styles · service_adapters)│
│ layouts/tabs · assets/ │
├────────────────────────────────────────────────────────────────────┤
│ REST API opcional (FastAPI) api/ │
├────────────────────────────────────────────────────────────────────┤
│ services/ │
│ SimulationService · OptimizationService · TrainingService │
│ ModelRegistry · DataFileService · keras_predict · model_ranking │
├────────────────────────────────────────────────────────────────────┤
│ Motores de domínio │
│ optimization/ (problem.py — NSGA-II/III com restrições; │
│ legacy_problem.py · decision_methods.py) │
│ training/ (keras_tuner + subprocess + hyperparameters/) │
│ surrogate_model/ (artefatos: .keras + scalers + manifesto) │
├────────────────────────────────────────────────────────────────────┤
│ core/ │
│ logging · settings · constants · exceptions · types · utils │
│ data_validation · feature_engineering · model_manifest │
│ safe_serialization · uncertainty · units · i18n │
└────────────────────────────────────────────────────────────────────┘
Pipelines offline (em `pipelines/`):
pipelines/data_generation/ → CSVs em simulacao_CSTR/
pipelines/hyperparameter_tuning/ → best_hps_*.json em output/
Ver docs/ARCHITECTURE.md para detalhes.
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -e ".[dev]" # core + dev tools
# ou, para a REST API:
pip install -e ".[dev,api]"make run # Linux/Mac
# ou
cd CSTRChemIA && python main.pyAcesse http://localhost:8051.
uvicorn CSTRChemIA.api.app:app --reload --port 8000
# Docs interativas: http://localhost:8000/docsdocker compose -f docker/docker-compose.yml up --build # só o dashboard
docker compose -f docker/docker-compose.yml --profile api up --build # dashboard + REST APIfrom services import SimulationService, OptimizationService, get_model_registry
# Listar modelos disponíveis (ordenados por MAE)
print(get_model_registry().list_models())
# Predição
sim = SimulationService()
targets = sim.predict_named({
"vazao_feed": 0.001, "CA0_feed": 1200, "CB0_feed": 1000,
"Tf_feed": 350, "T_amb_feed": 298, "T_obs": 345,
"valve_pos": 0.5, "w_j": 0.005,
"flag_falha_valvula": 0, "flag_manutencao": 0,
"flag_falha_sensor_T": 0, "flag_falha_comunicacao": 0,
}, model_name="MLP")
print(targets) # {'CA0': ..., 'X': ..., ...}
# Otimização (assíncrona)
opt = OptimizationService()
job_id = opt.submit(pop_size=80, n_gen=50, model_type="MLP")
job = opt.get_job(job_id)
print(job.status, job.progress_gen)# Via CLI
python -m training.train_surrogate --arch MLP
# Via UI — aba "Training", com streaming de logs ao vivo
make runO treinamento:
- Descobre automaticamente datasets em
pipelines/data_generation/(ouSimulacoes/legado). - Faz busca de hiperparâmetros com
keras_tunerempipelines/hyperparameter_tuning/, sincronizada paraCSTRChemIA/training/hyperparameters/antes do treino. - Persiste o melhor modelo em
CSTRChemIA/surrogate_model/CSTR_{ARCH}_Surrogate.keras. - Atualiza
models.json(manifesto rico com SHA-256) etraining_results.csv(métricas legadas) — ambos lidos peloModelRegistry.
| Comando | Ação |
|---|---|
make run |
Dashboard em dev |
make lint |
ruff check |
make format |
ruff format + autofix |
make typecheck |
mypy (core + services) |
make test |
pytest completo |
make test-fast |
Pula testes marcados slow |
make test-cov |
Cobertura HTML em htmlcov/ |
make precommit |
Instala hooks pre-commit |
make docker-build |
Build da imagem Docker |
make clean |
Limpa caches |
CSTRChemIA/ ← repositório
├── CSTRChemIA/ ← pacote-fonte (source root, no sys.path)
│ ├── main.py # Entry-point Dash + /healthz
│ ├── api/ # REST API (FastAPI)
│ ├── apps/ # Callbacks e bootstrap do Dash
│ │ ├── bootstrap.py # - inicialização do layout
│ │ ├── callbacks_main.py # - callbacks principais
│ │ ├── unit_callbacks.py # - troca de unidade
│ │ ├── styles.py # - dicionário de estilos
│ │ └── service_adapters.py # - adaptadores ↔ services
│ ├── assets/ # Estáticos (CSS, logo, html_help/)
│ ├── core/ # Infraestrutura transversal (sem deps domínio)
│ ├── layouts/tabs.py # Layouts das 6 abas
│ ├── optimization/ # problem.py · legacy_problem.py · decision_methods.py
│ ├── services/ # Fachada de aplicação
│ ├── surrogate_model/ # Artefatos: .keras + scalers + models.json
│ └── training/ # train_surrogate.py · models.py · sync_hyperparameters.py
│ └── hyperparameters/ # ↳ best_hps_{MLP,RNN,CNN}_values.json
│
├── pipelines/ ← Pipelines offline (não-runtime)
│ ├── data_generation/ # Geração de dados via ODE
│ └── hyperparameter_tuning/ # Busca de HPs (Hyperband + K-Fold)
│
├── docker/ ← Imagens e orquestração
│ ├── Dockerfile # Dash + gunicorn (produção)
│ ├── Dockerfile.api # FastAPI + uvicorn
│ └── docker-compose.yml
│
├── docs/ ← ARCHITECTURE · CONTRIBUTING · DEPLOYMENT
├── scripts/ ← Helpers shell (allrun.sh, allclean.sh)
├── tests/ ← pytest suite (unificada na raiz)
├── .github/workflows/ ← CI (lint, typecheck, test, docker)
│
├── pyproject.toml # Build + ruff + mypy + pytest
├── requirements.txt # Deps de produção
├── Makefile # Atalhos de desenvolvimento
├── Procfile · railway.toml · runtime.txt # Deploy (Heroku/Railway)
└── README.md · LICENSE
MIT — ver LICENSE.