Síntese da Execução

Para realizar a síntese da execução de um caso do DECOMP é necessário estar em um diretório no qual estão os principais arquivos de saída do modelo. Por exemplo, para se realizar a síntese de tempo de execução, é necessario o decomp.tim, para a síntese da convergência, o relato.rvX e, para a síntese de inviabilidades, o inviab_unic.rvX. Neste contexto, basta fazer:

$ sintetizador-decomp execucao

O sintetizador irá exibir o log da sua execução:

>>> 2025-04-07 21:02:55,581 INFO: # Realizando síntese da EXECUÇÃO #
>>> 2025-04-07 21:02:55,581 INFO: Realizando síntese de PROGRAMA
>>> 2025-04-07 21:02:55,586 INFO: Tempo para sintese de PROGRAMA: 0.00 s
>>> 2025-04-07 21:02:55,586 INFO: Realizando síntese de VERSAO
>>> 2025-04-07 21:02:55,586 INFO: Lendo arquivo dec_oper_sist.csv
>>> 2025-04-07 21:02:55,674 INFO: Tempo para sintese de VERSAO: 0.09 s
>>> 2025-04-07 21:02:55,674 INFO: Realizando síntese de TITULO
>>> 2025-04-07 21:02:55,684 INFO: Lendo arquivo dadger.rv0
>>> 2025-04-07 21:02:56,004 INFO: Tempo para sintese de TITULO: 0.33 s
>>> 2025-04-07 21:02:56,004 INFO: Realizando síntese de CONVERGENCIA
>>> 2025-04-07 21:02:56,004 INFO: Lendo arquivo relato.rv0
>>> 2025-04-07 21:02:56,692 INFO: Tempo para sintese de CONVERGENCIA: 0.69 s
>>> 2025-04-07 21:02:56,692 INFO: Realizando síntese de TEMPO
>>> 2025-04-07 21:02:56,692 INFO: Lendo arquivo decomp.tim
>>> 2025-04-07 21:02:56,697 INFO: Tempo para sintese de TEMPO: 0.01 s
>>> 2025-04-07 21:02:56,697 INFO: Realizando síntese de INVIABILIDADES
>>> 2025-04-07 21:02:56,697 INFO: Lendo arquivo inviab_unic.rv0
>>> 2025-04-07 21:02:56,705 INFO: Lendo arquivo hidr.dat
>>> 2025-04-07 21:02:58,220 INFO: Tempo para sintese de INVIABILIDADES: 1.52 s
>>> 2025-04-07 21:02:58,221 INFO: Realizando síntese de CUSTOS
>>> 2025-04-07 21:02:58,231 INFO: Tempo para sintese de CUSTOS: 0.01 s
>>> 2025-04-07 21:02:58,236 INFO: Tempo para sintese da execucao: 2.65 s
>>> 2025-04-07 21:02:58,236 INFO: # Fim da síntese #

Os arquivos serão salvos no subdiretório sintese. Para realizar o processamento, pode ser utilizado o próprio python:

import plotly.express as px
from datetime import timedelta
import pandas as pd

Para a síntese da execução é produzido um arquivo com as informações das sínteses que foram realizadas:

metadados = pd.read_parquet("sintese/METADADOS_EXECUCAO.parquet")
print(metadados)

# A leitura das sínteses realizadas pode ser feita da seguinte forma:
convergencia = pd.read_parquet("sintese/CONVERGENCIA.parquet")
custos = pd.read_parquet("sintese/CUSTOS.parquet")
tempo = pd.read_parquet("sintese/TEMPO.parquet")
            chave      nome_curto                          nome_longo
0        PROGRAMA        PROGRAMA                Modelo de Otimização
1          VERSAO          VERSAO                    Versão do Modelo
2          TITULO          TITULO                    Título do Estudo
3    CONVERGENCIA    CONVERGENCIA  Convergência do Processo Iterativo
4           TEMPO           TEMPO                   Tempo de Execução
5  INVIABILIDADES  INVIABILIDADES            Violações das Restrições
6          CUSTOS          CUSTOS     Composição de Custos da Solução

O formato dos dados de CONVERGÊNCIA:

print(convergencia.head(10))
   iteracao         zinf          zsup  ...  violacao_hm3    delta_zinf  execucao
0         1          NaN  1.956588e+09  ...           0.0           NaN         0
1         2          NaN  5.658944e+08  ...           0.0           NaN         0
2         3  533343777.1  5.465525e+08  ...           0.0           NaN         0
3         4  533343777.1  5.387266e+08  ...           0.0  0.000000e+00         0
4         5  533350638.4  5.357187e+08  ...           0.0  1.286469e-05         0
5         6  533370771.4  5.340916e+08  ...           0.0  3.774815e-05         0
6         7  533370989.3  5.339817e+08  ...           0.0  4.085338e-07         0
7         8  533371336.6  5.337387e+08  ...           0.0  6.511415e-07         0
8         9  533371360.9  5.337107e+08  ...           0.0  4.555925e-08         0
9        10  533372346.2  5.335950e+08  ...           0.0  1.847306e-06         0

[10 rows x 12 columns]

O formato dos dados de CUSTOS:

print(custos)
                              parcela  valor_esperado  desvio_padrao
0                     geracao_termica       459104.14            0.0
1              penalidade_intercambio            1.57            0.0
2           penalidade_vertimento_fio           14.89            0.0
3  penalidade_vertimento_reservatorio            2.79            0.0
4                     violacao_desvio            0.00            0.0
5           violacao_turbinamento_fio           34.30            0.0
6  violacao_turbinamento_reservatorio           13.67            0.0

O formato dos dados de TEMPO:

print(tempo)
              etapa  tempo  execucao
0  Leitura de Dados   12.0         0
1      Convergencia  412.0         0
2         Impressao   13.0         0

Cada arquivo pode ser visualizado de diferentes maneiras, a depender da aplicação. Por exemplo, é comum avaliar a convergência do modelo através da variação do gap.

fig = px.line(
    convergencia,
    x="iteracao",
    y="delta_zinf",
)
fig


Quando se analisam os custos de cada fonte, geralmente são feitos gráficos de barras empilhadas ou setores:

fig = px.pie(
    custos.loc[custos["valor_esperado"] > 0],
    values="valor_esperado",
    names="parcela",
)
fig


Uma abordagem semelhante é utilizada na análise do tempo de execução:

tempo["tempo"] = pd.to_timedelta(tempo["tempo"], unit="s") / timedelta(hours=1)
tempo["label"] = [str(timedelta(hours=d)) for d in tempo["tempo"].tolist()]
fig = px.bar(
    tempo,
    x="etapa",
    y="tempo",
    text="label",
    barmode="group",
)
fig


Total running time of the script: (0 minutes 0.902 seconds)

Gallery generated by Sphinx-Gallery