Initial project import
This commit is contained in:
103
scripts/00_main.py
Normal file
103
scripts/00_main.py
Normal file
@@ -0,0 +1,103 @@
|
||||
"""Orquestrador principal do Planejador Missao.
|
||||
|
||||
Entradas:
|
||||
Arquivos em dados/, argumentos opcionais de linha de comando e configuracoes
|
||||
centralizadas em scripts/01_config.py.
|
||||
|
||||
Saidas:
|
||||
Planejamento diario em resultados/, historico operacional atualizado,
|
||||
relatorios de validacao quando solicitado e logs em logs/execucao.log.
|
||||
|
||||
Papel no pipeline:
|
||||
Executa o fluxo completo: leitura de dados, preparacao, geracao de colunas
|
||||
candidatas, montagem/solucao do MILP, exportacao de resultados e validacao.
|
||||
|
||||
Exemplos:
|
||||
python scripts/00_main.py --data 2026-01-02 --modo diario
|
||||
python scripts/00_main.py --validacao 2025
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import argparse
|
||||
import importlib
|
||||
import time
|
||||
|
||||
import pandas as pd
|
||||
|
||||
config = importlib.import_module("01_config")
|
||||
io_utils = importlib.import_module("02_io_utils")
|
||||
|
||||
|
||||
def atualizar_data_planejamento(data: str) -> None:
|
||||
"""Atualiza dados/parametros_missao.csv com a data solicitada."""
|
||||
path = config.ARQUIVO_PARAMETROS
|
||||
df = pd.read_csv(path) if path.exists() else pd.DataFrame(columns=["parametro", "valor"])
|
||||
if "parametro" not in df.columns or "valor" not in df.columns:
|
||||
raise ValueError("Erro: parametros_missao.csv deve conter as colunas parametro,valor.")
|
||||
if (df["parametro"] == "data_planejamento").any():
|
||||
df.loc[df["parametro"] == "data_planejamento", "valor"] = data
|
||||
else:
|
||||
df = pd.concat([df, pd.DataFrame([{"parametro": "data_planejamento", "valor": data}])], ignore_index=True)
|
||||
df.to_csv(path, index=False)
|
||||
|
||||
|
||||
def executar_diario(args: argparse.Namespace, logger) -> dict:
|
||||
"""Executa o planejamento diario oficial em Python."""
|
||||
io_utils.configurar_ambiente()
|
||||
if args.data:
|
||||
atualizar_data_planejamento(args.data)
|
||||
logger.info("Data de planejamento ajustada para %s", args.data)
|
||||
if args.aeronave:
|
||||
logger.info("Filtro --aeronave recebido: %s. O modelo diario usa a disponibilidade em dados/aeronaves_disponiveis.csv.", args.aeronave)
|
||||
|
||||
from src.planejador_missao.main import executar_planejamento
|
||||
|
||||
inicio = time.perf_counter()
|
||||
resultado = executar_planejamento(config.PROJECT_ROOT)
|
||||
duracao = time.perf_counter() - inicio
|
||||
logger.info("Data planejada: %s", resultado["data_planejamento"])
|
||||
logger.info("Colunas candidatas: %s", resultado["total_candidatas"])
|
||||
logger.info("Escalas selecionadas: %s", resultado["total_selecionadas"])
|
||||
logger.info("Arquivo exportado: %s", resultado["arquivo_saida"])
|
||||
logger.info("Tempo de execucao: %.1f s", duracao)
|
||||
return resultado
|
||||
|
||||
|
||||
def executar_validacao(ano: str, logger) -> dict:
|
||||
"""Executa validacao retrospectiva suportada pelo projeto."""
|
||||
if str(ano) != "2025":
|
||||
raise ValueError("Erro: no momento a validacao disponivel e --validacao 2025.")
|
||||
validacao = importlib.import_module("07_validacao_2025")
|
||||
return validacao.executar_validacao_2025(importar=True, logger=logger)
|
||||
|
||||
|
||||
def parse_args() -> argparse.Namespace:
|
||||
parser = argparse.ArgumentParser(description="Executa o Planejador Missao em Python.")
|
||||
parser.add_argument("--data", help="Data do planejamento diario no formato AAAA-MM-DD.")
|
||||
parser.add_argument("--aeronave", choices=config.AERONAVES, help="Aeronave de referencia para diagnostico.")
|
||||
parser.add_argument("--modo", default="diario", choices=["diario"], help="Modo de execucao do planejamento.")
|
||||
parser.add_argument("--validacao", help="Ano da validacao retrospectiva. Exemplo: --validacao 2025.")
|
||||
return parser.parse_args()
|
||||
|
||||
|
||||
def main() -> None:
|
||||
args = parse_args()
|
||||
logger = io_utils.configurar_logger("main")
|
||||
if args.validacao:
|
||||
saida = executar_validacao(args.validacao, logger)
|
||||
print("\n=== Validacao concluida ===")
|
||||
for path in saida["arquivos"]:
|
||||
print(f"- {path}")
|
||||
return
|
||||
|
||||
resultado = executar_diario(args, logger)
|
||||
print("\n=== Planejamento diario concluido ===")
|
||||
print(f"Data: {resultado['data_planejamento']}")
|
||||
print(f"Arquivo: {resultado['arquivo_saida']}")
|
||||
print(f"Colunas candidatas: {resultado['total_candidatas']}")
|
||||
print(f"Escalas selecionadas: {resultado['total_selecionadas']}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user