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;
594
595
596
597 bool TempoExcedido() { return instanteFinal < clock(); }
601 // ler um número, ou retorna NAO_LIDO
602 static int NovoValor(TString prompt);
603 // ler uma string
605
606 // retorna o valor do parâmetro, para facilidade de uso (leitura e escrita)
607 int Parametro(int id) const { return parametro[id].valor; }
608 int& Parametro(int id) { return parametro[id].valor; }
609 bool ParametroAtivo(int id, TVector<int>* valores = NULL) const {
610 if (parametro[id].dependencia.Empty())
611 return true;
612 int valor;
613 if (valores == NULL)
614 valor = Parametro(parametro[id].dependencia.First());
615 else
616 valor = (*valores)[parametro[id].dependencia.First()];
617 return parametro[id].dependencia.Find(valor, true, 1) >= 0;
618 }
619
635 static bool Debug(ENivelDebug tipo, bool exato, const char* fmt, ...) {
636 int nivel = parametro[NIVEL_DEBUG].valor;
637 if (exato ? nivel != tipo : nivel < tipo)
638 return false;
640 va_start(args, fmt); // último parâmetro fixo é 'fmt'
641 vprintf(fmt, args);
642 va_end(args);
643 return true;
644 }
645
647 static TString MostraTempo(double segundos);
648
650 static void MostraCaixa(TString titulo, ECaixaParte parte, int largura = 70, bool aberta = true, int identacao = 0, const char* icon = "");
651 static void MostraCaixa(TVector<TString> textos, int largura = 70, bool aberta = true, int identacao = 0);
652 static void Mensagem(TString titulo, const char* fmt, ...);
653
654 static void MostraConjunto(TVector<int> valores, const char* etiqueta);
655
656
664 static void DebugHSL(float h = -1, float s = 1.0, float l = 0.2, bool fundo = true);
665
666protected:
667
674 void ExecutaTarefa(TVector<TResultado>& resultados, int inst, int conf);
675
676
684
692
699 void Registo(TResultado& resultado, int id, int64_t valor);
700
707 TString titulo = "");
708
712 void MostraIndicadores();
713
719 void MostrarConfiguracoes(int detalhe, int atual = -1);
720
725 bool EditarIndicadores();
726
730 void EditarParametros();
731
735 void EditarConfiguracoes();
736
743
750
757
765
771
777 void MostrarTorneio(TVector<TVector<int>>& torneio, bool jogo = false);
778
783 void BarraTorneio(bool nomes);
784
792
796 void SolicitaInstancia();
797
803
810
817
825
831
839 static int Dominio(int& variavel, int min = INT_MIN, int max = INT_MAX);
840
842 static void InicializaMPI(int argc, char* argv[]);
844 static void FinalizaMPI();
845
847 void DebugTabela(ENivelDebug nivel, TVector<int>tabela, TString tipo = "",
848 TString prefixo="", int modoCor=0, bool duplaColuna=false);
849
852
854 static double Cronometro(enum ECronometro id = CONT_ALGORITMO, bool inicializar = false) {
855 static clock_t inicio[CONT_NUMERO] = { 0 }; // até 10 cronómetros
856 if (inicializar)
857 inicio[id] = clock();
858 return (double)(clock() - inicio[id]) / CLOCKS_PER_SEC;
859 }
860
863 void TesteFim();
864
865};
866
867
873{
874public:
875
876 // variáveis necessárias redefinir após a construção
877 TString solver; // caminho para o executável
878 TParametro inst; // definição de instâncias existentes
879 TVector<TIndicador> ind; // indicadores específicos, a calcular após a execução do executável, com base na saída do executável
880 TVector<TString> indPrefixo = {"", "", ""}; // prefixo existente no output do programa, para cada indicador, de modo a extrair o valor do indicador
881 // considerar também os indicadores em TProcura (IND_RESULTADO, IND_TEMPO, IND_ITERACOES), que podem ser extraídos do output do programa
882 // string vazia para não extração desse indicador
883 TVector<TParametro> par; // parâmetros específicos, para configurar a execução
884 TVector<TString> parPrefixo = {"", "", "", "", ""}; // prefixo a dar nos argumentos do programa, para cada parâmetro, de modo a configurar a execução
885 // considerar também os parâmetros em TProcura (ALGORITMO, NIVEL_DEBUG, SEMENTE, LIMITE_TEMPO, LIMITE_ITERACOES)
886 // string vazia para não utilização desse parâmetro (se não há prefixo, apenas valor por ordem, utilizar um espaço)
887 // Nota: o parâmetro é colocado nos argumentos do programa, apenas se não for igual ao valor por omissão
888
889 // variáveis internas:
890 TVector<int64_t> indValores; // guarda os indicadores extraídos da última execução
891 TVector<int> omissao; // valores de todos os parâmetros por omissão
892
895
897 void ResetParametros();
898
900 int ExecutaAlgoritmo();
901
903 int64_t Indicador(int id);
904
905 void Debug(bool completo) {}
906};
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:873
TVector< int64_t > indValores
Definition TProcura.h:890
~TProcuraExecutavel(void)
Definition TProcura.h:894
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:905
int64_t Indicador(int id)
retorna indicadores após execução
TVector< TString > indPrefixo
Definition TProcura.h:880
TVector< int > omissao
Definition TProcura.h:891
TVector< TIndicador > ind
Definition TProcura.h:879
TVector< TString > parPrefixo
Definition TProcura.h:884
TVector< TParametro > par
Definition TProcura.h:883
TParametro inst
Definition TProcura.h:878
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:368
virtual void Debug(bool completo=true)
Mostra o estado no ecrã, para debug.
Definition TProcura.cpp:86
int Parametro(int id) const
Definition TProcura.h:607
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:293
static int modoMPI
Modo MPI.
Definition TProcura.h:590
virtual void Inicializar(void)
Coloca o objecto 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 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:934
void MostraParametros(int detalhe=1, TVector< int > *idParametros=NULL, TString titulo="")
Mostra os parâmetros atuais.
Definition TProcura.cpp:553
virtual int64_t Indicador(int id)
Retorna um indicador, após a execução do algoritmo.
Definition TProcura.cpp:73
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
Definition TProcura.cpp:987
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:635
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:160
int NovaConfiguracao(TVector< int > &parametros)
Adiciona uma nova configuração se ainda não existir.
Definition TProcura.cpp:723
TVector< int > SolicitaInstancias()
Solicita ao utilizador uma lista de instâncias.
Definition TProcura.cpp:801
virtual void ResetParametros()
Inicializa os parâmetros, indicadores e instâncias.
Definition TProcura.cpp:48
TProcura(void)
Definition TProcura.h:220
bool IteracoesExcedido()
Definition TProcura.h:598
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:609
virtual void TesteManual(TString nome)
Inicializa a interação com o utilizador.
Definition TProcura.cpp:103
static TString MostraTempo(double segundos)
Mostra tempo num formato humano.
Definition TProcura.cpp:752
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:646
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:502
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:608
void EditarParametros()
Permite ao utilizador editar os parâmetros.
Definition TProcura.cpp:674
void InserirConfiguracoes(TString str, TVector< int > &base)
Insere configurações a partir de uma string.
Definition TProcura.cpp:862
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:525
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:740
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:854
void InserirRegisto(TVector< TResultado > &resultados, int inst, int conf)
Insere um novo registo de resultados.
Definition TProcura.cpp:778
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:817
int64_t Registo(TResultado &resultado, int id)
Procura um registo com determinado id.
Definition TProcura.cpp:788
virtual void LimparEstatisticas()
Chamar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo ...
Definition TProcura.cpp:92
void SolicitaInstancia()
Solicita ao utilizador o ID da instância a utilizar, permitindo alterar também o prefixo do ficheiro.
static double tempo
tempo consumido na última execução.
Definition TProcura.h:577
bool TempoExcedido()
Definition TProcura.h:597
static void MostraConjunto(TVector< int > valores, const char *etiqueta)
Definition TProcura.cpp:969
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