TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
TProcura.h
Go to the documentation of this file.
1#pragma once
2
3#include "TVector.h"
4#include <time.h>
5#include <stdint.h>
6#include <limits.h>
7#include <stdio.h>
8#include <inttypes.h>
9#include <cstdarg>
10#include "compact.h"
11
12
13// código para número não lido (não deve ser utilizado num parâmetro)
14constexpr int NAO_LIDO = 1024;
15
16// códigos de resultados inválidos, para o indicador de resultado (custo, qualidade, etc.)
17constexpr int RES_IMPOSSIVEL = -1; // resultado impossível (prova de que não existe solução)
18constexpr int RES_NAO_RESOLVIDO = -2; // resultado não resolvido (e.g. tempo esgotado, ou limite de iterações atingido)
19constexpr int RES_INVALIDO = -3; // resultado do algoritmo inválido
20constexpr int RES_VAZIO = -4; // não existe resultado registado
21
22// macros para ativar/desativar cinzento (ANSI)
23#ifdef VPL_ATIVO
24
25#define COR_LEVE " "
26#define COR_RESET " "
27#define COR_ATIVO " "
28#define COR_INATIVO " "
29#define COR_ATIVO_LEVE " "
30#define COR_INATIVO_LEVE " "
31
32#else
33
34#define COR_LEVE "\x1b[90m"
35#define COR_RESET "\x1b[0m"
36#define COR_ATIVO "\x1b[92m"
37#define COR_INATIVO "\x1b[91m"
38#define COR_ATIVO_LEVE "\x1b[38;5;108m"
39#define COR_INATIVO_LEVE "\x1b[38;5;131m"
40
41#endif
42constexpr int COR_LEVE_TAM = 9; // bytes invisíveis (5 + 4), útil para alinhamento
43
50
77
98
104enum EOperacao { GRAVAR = 0, LER };
105
120
130
136enum class ECaixaParte {
137 Topo, // início da caixa
138 Separador, // linha de separação
139 Meio, // linha intermédia
140 Fundo // fecho da caixa
141};
142
143// identificação de todos os indicadores definidos
152
192
193
201typedef struct SResultado {
203 TVector<int64_t> valor; // valor para cada indicador selecionado (fixos os EIndicadoresProcura, resultado, tempo, iterações)
204 TVector<TString> solucao; // todas as ações da solução, se aplicável
206
207
218{
219public:
220 TProcura(void) {}
221 virtual ~TProcura(void) {}
222
248 virtual void Inicializar(void) { TRand::srand(Parametro(SEMENTE)); }
249
250 // chamado se -FG definido, para gravar a instância
251 virtual void Gravar(void) {}
252
253
262 virtual int ExecutaAlgoritmo() { return -1; }
263
289 virtual int64_t Indicador(int id);
290
325 virtual void Debug(bool completo = true);
326
384 virtual void ResetParametros();
385
405 virtual bool Parar(void) {
407 }
408
444 virtual void TesteManual(TString nome);
445
467
469
481 virtual bool Validar(TVector<TString> solucao) { return false; }
482
505
510
540 virtual void main(int argc, char* argv[], TString nome);
541
543 virtual void LimparEstatisticas();
545 virtual void ExecucaoTerminada();
547 virtual void Explorar() {}
549 virtual void MostrarSolucao();
553 virtual TVector<TString> Solucao() { return {}; }
554
556 static TParametro instancia;
571 static TVector<int> indAtivo; // lista por ordem dos indicadores a utilizar
575 static int resultado;
577 static double tempo;
579 static int iteracoes;
583 static bool memoriaEsgotada;
585 static int mpiID;
587 static int mpiCount;
590 static int modoMPI;
593 static int gravarSolucao;
596 static int modoKMGT;
597
598
599
600 bool TempoExcedido() { return instanteFinal < clock(); }
604 // ler um número, ou retorna NAO_LIDO
605 static int NovoValor(TString prompt);
606 // ler uma string
608
609 // retorna o valor do parâmetro, para facilidade de uso (leitura e escrita)
610 int Parametro(int id) const { return parametro[id].valor; }
611 int& Parametro(int id) { return parametro[id].valor; }
612 bool ParametroAtivo(int id, TVector<int>* valores = NULL) const {
613 if (parametro[id].dependencia.Empty())
614 return true;
615 int valor;
616 if (valores == NULL)
617 valor = Parametro(parametro[id].dependencia.First());
618 else
619 valor = (*valores)[parametro[id].dependencia.First()];
620 return parametro[id].dependencia.Find(valor, true, 1) >= 0;
621 }
622
638 static bool Debug(ENivelDebug tipo, bool exato, const char* fmt, ...) {
639 int nivel = parametro[NIVEL_DEBUG].valor;
640 if (exato ? nivel != tipo : nivel < tipo)
641 return false;
643 va_start(args, fmt); // último parâmetro fixo é 'fmt'
644 vprintf(fmt, args);
645 va_end(args);
646 return true;
647 }
648
650 static TString MostraTempo(double segundos);
652 static TString MostraInt(int64_t valor, bool cor = true);
653
655 static void MostraCaixa(TString titulo, ECaixaParte parte, int largura = 70, bool aberta = true, int identacao = 0, const char* icon = "");
656 static void MostraCaixa(TVector<TString> textos, int largura = 70, bool aberta = true, int identacao = 0);
657 static void Mensagem(TString titulo, const char* fmt, ...);
658
659 static void MostraConjunto(TVector<int> valores, const char* etiqueta);
660
661
669 static void DebugHSL(float h = -1, float s = 1.0, float l = 0.2, bool fundo = true);
670
671protected:
672
679 void ExecutaTarefa(TVector<TResultado>& resultados, int inst, int conf);
680
681
689
697
704 void Registo(TResultado& resultado, int id, int64_t valor);
705
712 TString titulo = "");
713
717 void MostraIndicadores();
718
724 void MostrarConfiguracoes(int detalhe, int atual = -1);
725
730 bool EditarIndicadores();
731
735 void EditarParametros();
736
740 void EditarConfiguracoes();
741
748
755
762
770
776
782 void MostrarTorneio(TVector<TVector<int>>& torneio, bool jogo = false);
783
788 void BarraTorneio(bool nomes);
789
797
801 void SolicitaInstancia();
802
808
815
822
830
836
844 static int Dominio(int& variavel, int min = INT_MIN, int max = INT_MAX);
845
847 static void InicializaMPI(int argc, char* argv[]);
849 static void FinalizaMPI();
850
852 void DebugTabela(ENivelDebug nivel, TVector<int>tabela, TString tipo = "",
853 TString prefixo="", int modoCor=0, bool duplaColuna=false);
854
857
859 static double Cronometro(enum ECronometro id = CONT_ALGORITMO, bool inicializar = false) {
860 static clock_t inicio[CONT_NUMERO] = { 0 }; // até 10 cronómetros
861 if (inicializar)
862 inicio[id] = clock();
863 return (double)(clock() - inicio[id]) / CLOCKS_PER_SEC;
864 }
865
868 void TesteFim();
869
870};
871
872
878{
879public:
880
881 // variáveis necessárias redefinir após a construção
882 TString solver; // caminho para o executável
883 TParametro inst; // definição de instâncias existentes
884 TVector<TIndicador> ind; // indicadores específicos, a calcular após a execução do executável, com base na saída do executável
885 TVector<TString> indPrefixo = {"", "", ""}; // prefixo existente no output do programa, para cada indicador, de modo a extrair o valor do indicador
886 // considerar também os indicadores em TProcura (IND_RESULTADO, IND_TEMPO, IND_ITERACOES), que podem ser extraídos do output do programa
887 // string vazia para não extração desse indicador
888 TVector<TParametro> par; // parâmetros específicos, para configurar a execução
889 TVector<TString> parPrefixo = {"", "", "", "", ""}; // prefixo a dar nos argumentos do programa, para cada parâmetro, de modo a configurar a execução
890 // considerar também os parâmetros em TProcura (ALGORITMO, NIVEL_DEBUG, SEMENTE, LIMITE_TEMPO, LIMITE_ITERACOES)
891 // string vazia para não utilização desse parâmetro (se não há prefixo, apenas valor por ordem, utilizar um espaço)
892 // Nota: o parâmetro é colocado nos argumentos do programa, apenas se não for igual ao valor por omissão
893
894 // variáveis internas:
895 TVector<int64_t> indValores; // guarda os indicadores extraídos da última execução
896 TVector<int> omissao; // valores de todos os parâmetros por omissão
897
900
902 void ResetParametros();
903
905 int ExecutaAlgoritmo();
906
908 int64_t Indicador(int id);
909
910 void Debug(bool completo) {}
911};
ETagMPI
Define as tags MPI para comunicação entre processos.
Definition TProcura.h:124
@ TAG_TRABALHO
Definition TProcura.h:125
@ TAG_JOGO
Definition TProcura.h:128
@ TAG_VALORES
Definition TProcura.h:127
@ TAG_CABECALHO
Definition TProcura.h:126
EOperacao
Define o sentido da operação de entrada/saída de dados.
Definition TProcura.h:104
@ GRAVAR
Definition TProcura.h:104
@ LER
Definition TProcura.h:104
constexpr int RES_INVALIDO
Definition TProcura.h:19
EIndicadoresProcura
Definition TProcura.h:44
@ IND_TEMPO
tempo em milissegundos consumidos
Definition TProcura.h:46
@ IND_ITERACOES
número de iterações consumidas
Definition TProcura.h:47
@ IND_PROCURA
Marcador para permitir a extensão do enum em subclasses.
Definition TProcura.h:48
@ IND_RESULTADO
resultado do algoritmo (>=0 custo da solução, -1 impossível, -2 não resolvido)
Definition TProcura.h:45
struct SResultado TResultado
constexpr int COR_LEVE_TAM
Definition TProcura.h:42
constexpr int NAO_LIDO
Definition TProcura.h:14
constexpr int RES_NAO_RESOLVIDO
Definition TProcura.h:18
constexpr int RES_VAZIO
Definition TProcura.h:20
ENivelDebug
Níveis de detalhamento para debug.
Definition TProcura.h:90
@ PASSOS
Exibe passos intermediários.
Definition TProcura.h:93
@ EXTRA_DEBUG
Nível extra para debug muito detalhado (uso interno).
Definition TProcura.h:96
@ ATIVIDADE
Apenas eventos principais.
Definition TProcura.h:92
@ COMPLETO
Mostra toda a execução detalhadamente.
Definition TProcura.h:95
@ NADA
Sem informações de debug.
Definition TProcura.h:91
@ DETALHE
Debug detalhada sobre estados e decisões.
Definition TProcura.h:94
constexpr int RES_IMPOSSIVEL
Definition TProcura.h:17
struct SParametro TParametro
Estrutura para registo de um parâmetro.
ECronometro
Define os tipos de contadores de cronômetro.
Definition TProcura.h:111
@ CONT_NUMERO
Número de contadores disponíveis.
Definition TProcura.h:118
@ CONT_TESTE
Tempo total do teste (todas as execuções)
Definition TProcura.h:113
@ CONT_REPORTE
Tempo entre mensagens durante o teste.
Definition TProcura.h:114
@ CONT_CHECKPOINT
Tempo entre checkpoints ou estados internos.
Definition TProcura.h:117
@ CONT_ALGORITMO
Tempo da execução do algoritmo por instância.
Definition TProcura.h:112
@ CONT_FINALIZACAO
Tempo de encerramento/exportação.
Definition TProcura.h:116
@ CONT_PREPARACAO
Tempo de inicialização antes do teste.
Definition TProcura.h:115
EParametrosProcura
Identifica um parâmetro específico no código.
Definition TProcura.h:69
@ ALGORITMO
Algoritmo base a executar.
Definition TProcura.h:70
@ LIMITE_ITERACOES
Número máximo de iterações (0 significa sem limite).
Definition TProcura.h:74
@ SEMENTE
Semente aleatória para inicializar a sequência de números pseudo-aleatórios.
Definition TProcura.h:72
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
Definition TProcura.h:71
@ PARAMETROS_PROCURA
Marcador para permitir a extensão do enum em subclasses.
Definition TProcura.h:75
@ LIMITE_TEMPO
Tempo limite em segundos.
Definition TProcura.h:73
struct SIndicador TIndicador
ECaixaParte
Define as partes de uma caixa de texto para exibição formatada.
Definition TProcura.h:136
Vetor dinâmico genérico com operações de pilha, conjuntos e algoritmos úteis.
Classe para utilizar TProcura em binários externos.
Definition TProcura.h:878
TVector< int64_t > indValores
Definition TProcura.h:895
~TProcuraExecutavel(void)
Definition TProcura.h:899
void ResetParametros()
Reset parâmetros, assumindo variáveis da classe definidas.
int ExecutaAlgoritmo()
Executa o algoritmo e extrai os indicadores.
void Debug(bool completo)
Mostra o estado no ecrã, para debug.
Definition TProcura.h:910
int64_t Indicador(int id)
retorna indicadores após execução
TVector< TString > indPrefixo
Definition TProcura.h:885
TVector< int > omissao
Definition TProcura.h:896
TVector< TIndicador > ind
Definition TProcura.h:884
TVector< TString > parPrefixo
Definition TProcura.h:889
TVector< TParametro > par
Definition TProcura.h:888
TParametro inst
Definition TProcura.h:883
Classe base para todas as procuras.
Definition TProcura.h:218
virtual void MostrarSolucao()
definir para visualizar a solução
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
Definition TProcura.h:583
static void MostraCaixa(TVector< TString > titulo, ECaixaParte parte, TVector< int > largura, bool aberta=true, int identacao=0)
Definition TProcura.cpp:372
virtual void Debug(bool completo=true)
Mostra o estado no ecrã, para debug.
Definition TProcura.cpp:89
int Parametro(int id) const
Definition TProcura.h:610
virtual int ExecutaAlgoritmo()
Executa o algoritmo com os parametros atuais.
Definition TProcura.h:262
static int Dominio(int &variavel, int min=INT_MIN, int max=INT_MAX)
Limita o domínio de um parâmetro inteiro.
virtual void RelatorioValidacao(TVector< TResultado > resultados, TVector< int > referencias)
Definition TProcura.cpp:296
static int modoMPI
Modo MPI.
Definition TProcura.h:590
virtual void Inicializar(void)
Coloca o objeto no estado inicial da procura.
Definition TProcura.h:248
static TVector< TVector< int > > configuracoes
Conjuntos de configurações para teste empírico.
Definition TProcura.h:573
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:575
void BarraTorneio(bool nomes)
Mostra a barra de progresso ou nomes do torneio.
void ExecutaTarefa(TVector< TResultado > &resultados, int inst, int conf)
Executa uma tarefa num teste empírico.
void AjudaUtilizacao(TString programa)
Mostra ajuda de utilização do programa.
void MostrarTorneio(TVector< TVector< int > > &torneio, bool jogo=false)
Mostra os resultados do torneio.
static TString ficheiroInstancia
prefixo do nome do ficheiro de uma instância - editado pelo utilizador Caso não seja nulo,...
Definition TProcura.h:562
static int mpiID
MPI - rank do processo.
Definition TProcura.h:585
void MostrarConfiguracoes(int detalhe, int atual=-1)
Mostra as configurações disponíveis.
Definition TProcura.cpp:977
void MostraParametros(int detalhe=1, TVector< int > *idParametros=NULL, TString titulo="")
Mostra os parâmetros atuais.
Definition TProcura.cpp:557
virtual int64_t Indicador(int id)
Retorna um indicador, após a execução do algoritmo.
Definition TProcura.cpp:76
virtual ~TProcura(void)
Definition TProcura.h:221
virtual TVector< TString > Solucao()
retorna uma solução no formato do TResultado, para ser gravada em ficheiro de soluções,...
Definition TProcura.h:553
static TString NovoTexto(TString prompt)
static int gravarSolucao
Gravar solução CSV (todas as ações)
Definition TProcura.h:593
static TString ficheiroGravar
prefixo do nome do ficheiro para gravar a instância para ficheiro (terá sido gerada)
Definition TProcura.h:564
TVector< TResultado > ExtrairConfiguracao(TVector< TResultado > &resultados, int configuracao)
Extrai resultados de uma determinada configuração.
virtual void Gravar(void)
Definition TProcura.h:251
void TesteInicio(TVector< int > &instancias, TVector< int > &configAtual)
arranque de teste, auxiliar aos Testes Empíricos
static bool Debug(ENivelDebug tipo, bool exato, const char *fmt,...)
Mostra uma informação de debug, se o nível de debug for suficiente.
Definition TProcura.h:638
static int iteracoes
Número total de iterações realizadas na última execução.
Definition TProcura.h:579
static void FinalizaMPI()
Finaliza o ambiente MPI, se aplicável.
virtual void TesteValidacao(TVector< int > instancias, TVector< int > impossiveis, TVector< int > referencias, TString fichSolucoes, TString fichResultados="")
Executa testes de validação, executando cada solução na instância respetiva, e verificando a sua vali...
Definition TProcura.cpp:163
int NovaConfiguracao(TVector< int > &parametros)
Adiciona uma nova configuração se ainda não existir.
Definition TProcura.cpp:736
static TString MostraInt(int64_t valor, bool cor=true)
Mostra inteiro grande num formato humano.
Definition TProcura.cpp:792
TVector< int > SolicitaInstancias()
Solicita ao utilizador uma lista de instâncias.
Definition TProcura.cpp:844
virtual void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
Definition TProcura.cpp:51
TProcura(void)
Definition TProcura.h:220
bool IteracoesExcedido()
Definition TProcura.h:601
virtual void TesteEmpiricoTrabalhador(TVector< int > instancias, TString ficheiro="")
Teste empírico com modo mestre-escravo (este é o escravo)
virtual bool Parar(void)
Verifica se a procura deve ser interrompida.
Definition TProcura.h:405
bool JuntarCSV(TString ficheiro)
Juntar ficheiros CSV gerados por diferentes processos MPI em um único ficheiro.
static int NovoValor(TString prompt)
bool ParametroAtivo(int id, TVector< int > *valores=NULL) const
Definition TProcura.h:612
virtual void TesteManual(TString nome)
Inicializa a interação com o utilizador.
Definition TProcura.cpp:106
static TString MostraTempo(double segundos)
Mostra tempo num formato humano.
Definition TProcura.cpp:765
virtual void ExecucaoTerminada()
Chamar após a execução do algoritmo. Grava o tempo consumido.
virtual void main(int argc, char *argv[], TString nome)
Inicializa a interação com o utilizador.
void MostraRelatorio(TVector< TResultado > &resultados, bool ultimo=false)
Mostra um relatório dos resultados.
bool EditarIndicadores()
Permite ao utilizador editar os indicadores a utilizar.
Definition TProcura.cpp:652
static int mpiCount
MPI - número de processos.
Definition TProcura.h:587
static void InicializaMPI(int argc, char *argv[])
Inicializa o ambiente MPI, se aplicável.
void MostraIndicadores()
Mostra os indicadores definidos.
static void Mensagem(TString titulo, const char *fmt,...)
Definition TProcura.cpp:506
static TVector< TIndicador > indicador
Indicadores que podem ser calculados após a execução, quer com informação da instância,...
Definition TProcura.h:570
virtual void TesteEmpiricoGestor(TVector< int > instancias, TString ficheiro="")
Teste empírico com modo mestre-escravo (este é o mestre)
void DebugTabela(ENivelDebug nivel, TVector< int >tabela, TString tipo="", TString prefixo="", int modoCor=0, bool duplaColuna=false)
Mostra uma tabela de inteiros, 10 elementos por linha, apenas se o nível de debug for igual ou superi...
bool RelatorioCSV(TVector< TResultado > &resultados, TString ficheiro, bool parametros=true)
Gera um relatório CSV com os resultados.
virtual bool Validar(TVector< TString > solucao)
Verifica a validade de uma solução para a instância atual.
Definition TProcura.h:481
void TesteFim()
static clock_t instanteFinal
Instante final (deadline) da corrida atual.
Definition TProcura.h:581
int & Parametro(int id)
Definition TProcura.h:611
void EditarParametros()
Permite ao utilizador editar os parâmetros.
Definition TProcura.cpp:687
void InserirConfiguracoes(TString str, TVector< int > &base)
Insere configurações a partir de uma string.
Definition TProcura.cpp:905
int MelhorResultado(TResultado base, TResultado alternativa)
Compara dois resultados para determinar o melhor.
virtual void Explorar()
definir para explorar manualmente os dados (não definido em TProcura, apenas em TProcuraConstrutiva)
Definition TProcura.h:547
static void DebugHSL(float h=-1, float s=1.0, float l=0.2, bool fundo=true)
Muda a cor (fundo/letra) com HSL.
Definition TProcura.cpp:529
void CalculaTorneio(TVector< TResultado > &resultados)
Calcula o torneio entre várias configurações.
void ConfiguracaoAtual(TVector< int > &parametros, int operacao)
Grava ou lê a configuração atual.
Definition TProcura.cpp:753
static TVector< int > indAtivo
Definition TProcura.h:571
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
Definition TProcura.h:22
virtual TVector< int64_t > CodificarSolucao()
retorna um vetor de inteiros com a codificação da solução (esta codificação será adicionada aos indic...
Definition TProcura.h:551
static double Cronometro(enum ECronometro id=CONT_ALGORITMO, bool inicializar=false)
retorna o tempo em segundos desde que o cronómetro foi inicializado
Definition TProcura.h:859
void InserirRegisto(TVector< TResultado > &resultados, int inst, int conf)
Insere um novo registo de resultados.
Definition TProcura.cpp:821
virtual void TesteEmpirico(TVector< int > instancias, TString ficheiro="")
Executa testes empíricos, em todas as configurações guardadas, nas instâncias selecionadas.
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
Definition TProcura.h:567
void EditarConfiguracoes()
Permite ao utilizador editar as configurações.
Definition TProcura.cpp:860
int64_t Registo(TResultado &resultado, int id)
Procura um registo com determinado id.
Definition TProcura.cpp:831
virtual void LimparEstatisticas()
Chamar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo ...
Definition TProcura.cpp:95
void SolicitaInstancia()
Solicita ao utilizador o ID da instância a utilizar, permitindo alterar também o prefixo do ficheiro.
static int modoKMGT
Modo KMGT - Kilo, Mega, Giga, Tera.
Definition TProcura.h:596
static double tempo
tempo consumido na última execução.
Definition TProcura.h:577
bool TempoExcedido()
Definition TProcura.h:600
static void MostraConjunto(TVector< int > valores, const char *etiqueta)
void srand(unsigned int seed, int seq)
Inicializa a semente da geração pseudo-aleatória.
Definition TRand.cpp:34
int indice
indice onde aparece o indicador nos resultados, c.c. -1 para não aparecer
Definition TProcura.h:150
TString nome
nome do indicador
Definition TProcura.h:146
TString descricao
descrição do indicador, opcional
Definition TProcura.h:148
Estrutura para registo de um parâmetro.
Definition TProcura.h:175
TString descricao
descrição do parÂmetro, opcional
Definition TProcura.h:185
TVector< int > dependencia
dependência (indice do parâmetro, seguido de valores permitidos) - vazio não tem dependência
Definition TProcura.h:190
int valor
valor do parâmetro
Definition TProcura.h:179
int max
valor máximo que o parâmetro pode tomar
Definition TProcura.h:183
int min
valor mínimo que o parÂmetro pode tomar
Definition TProcura.h:181
TString nome
nome do parâmetro, opcional mas aconselhado nos parâmetros específicos
Definition TProcura.h:177
TVector< TString > nomeValores
Nome associado a cada valor do parâmetro, útil para variáveis categóricas.
Definition TProcura.h:188
TVector< TString > solucao
Definition TProcura.h:204
int configuracao
Definition TProcura.h:202
int instancia
Definition TProcura.h:202
TVector< int64_t > valor
Definition TProcura.h:203