Skip to content

Rafalexandre-code/CSTRChemIA

Repository files navigation

CSTRChemIA

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.

CI Python Dash TensorFlow License: MIT


Destaques

  • 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 StandardScaler persistido.
  • 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.

Arquitetura

┌────────────────────────────────────────────────────────────────────┐
│                          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.


Início rápido

1. Instalação (dev)

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]"

2. Rodar o dashboard

make run                    # Linux/Mac
# ou
cd CSTRChemIA && python main.py

Acesse http://localhost:8051.

3. Rodar a REST API (opcional)

uvicorn CSTRChemIA.api.app:app --reload --port 8000
# Docs interativas: http://localhost:8000/docs

4. Docker

docker compose -f docker/docker-compose.yml up --build              # só o dashboard
docker compose -f docker/docker-compose.yml --profile api up --build # dashboard + REST API

Uso programático (Python)

from 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)

Treinamento

# Via CLI
python -m training.train_surrogate --arch MLP

# Via UI — aba "Training", com streaming de logs ao vivo
make run

O treinamento:

  1. Descobre automaticamente datasets em pipelines/data_generation/ (ou Simulacoes/ legado).
  2. Faz busca de hiperparâmetros com keras_tuner em pipelines/hyperparameter_tuning/, sincronizada para CSTRChemIA/training/hyperparameters/ antes do treino.
  3. Persiste o melhor modelo em CSTRChemIA/surrogate_model/CSTR_{ARCH}_Surrogate.keras.
  4. Atualiza models.json (manifesto rico com SHA-256) e training_results.csv (métricas legadas) — ambos lidos pelo ModelRegistry.

Comandos de desenvolvimento

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

Estrutura do repositório

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

Documentação


Licença

MIT — ver LICENSE.