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
22
49
70
76enum EOperacao { GRAVAR = 0, LER };
77
92
101
102
103// identificação de todos os indicadores definidos
104typedef struct SIndicador {
106 const char* nome;
108 const char* descricao;
112
135typedef struct SParametro {
137 const char* nome = "Indefinido";
139 int valor = 0;
141 int min = 0;
143 int max = 0;
145 const char* descricao = nullptr;
148 const char** nomeValores = nullptr;
152
153
161typedef struct SResultado {
163 TVector<int64_t> valor; // valor para cada indicador selecionado (fixos os EIndicadoresProcura, resultado, tempo, iterações)
165
166
179{
180public:
181 TProcura(void) {}
182 virtual ~TProcura(void) {}
183
209 virtual void Inicializar(void) {}
210
211
220 virtual int ExecutaAlgoritmo() { return -1; }
221
247 virtual int64_t Indicador(int id);
248
283 virtual void Debug(bool completo = true);
284
342 virtual void ResetParametros();
343
363 virtual bool Parar(void) {
365 }
366
402 virtual void TesteManual(const char* nome);
403
425 virtual void TesteEmpirico(TVector<int> instancias, char* ficheiro = NULL);
426
431
461 virtual void main(int argc, char* argv[], const char* nome);
462
464 virtual void LimparEstatisticas();
466 virtual void ExecucaoTerminada();
468 virtual void Explorar() {}
470 virtual void MostrarSolucao();
473
475 static TParametro instancia;
482 static char ficheiroInstancia[256];
489 static TVector<int> indAtivo; // lista por ordem dos indicadores a utilizar
493 static int resultado;
495 static double tempo;
497 static int iteracoes;
501 static bool memoriaEsgotada;
503 static int mpiID;
505 static int mpiCount;
508 static int modoMPI;
509
510
511
512 bool TempoExcedido() { return instanteFinal < clock(); }
516 // ler um número, ou retorna NAO_LIDO
517 static int NovoValor(const char* prompt);
518 // ler uma string
519 static char* NovoTexto(const char* prompt);
520
521 // retorna o valor do parametro, para facilidade de uso (leitura e escrita)
522 int Parametro(int id) const { return parametro[id].valor; }
523 int& Parametro(int id) { return parametro[id].valor; }
524 bool ParametroAtivo(int id, TVector<int>* valores = NULL) const {
525 if (parametro[id].dependencia.Empty())
526 return true;
527 int valor;
528 if (valores == NULL)
529 valor = Parametro(parametro[id].dependencia.First());
530 else
531 valor = (*valores)[parametro[id].dependencia.First()];
532 return parametro[id].dependencia.Find(valor, true, 1) >= 0;
533 }
534
550 static bool Debug(ENivelDebug tipo, bool exato, const char* fmt, ...) {
551 int nivel = parametro[NIVEL_DEBUG].valor;
552 if (exato ? nivel != tipo : nivel < tipo)
553 return false;
555 va_start(args, fmt); // último parâmetro fixo é 'fmt'
556 vprintf(fmt, args);
557 va_end(args);
558 return true;
559 }
560
562 static char *MostraTempo(double segundos);
563
564protected:
565
572 void ExecutaTarefa(TVector<TResultado>& resultados, int inst, int conf);
573
574
582
590
597 void Registo(TResultado& resultado, int id, int64_t valor);
598
605
609 void MostraIndicadores();
610
616 void MostrarConfiguracoes(int detalhe, int atual = -1);
617
622 bool EditarIndicadores();
623
627 void EditarParametros();
628
632 void EditarConfiguracoes();
633
640
647
654
662
668
674 void MostrarTorneio(TVector<TVector<int>>& torneio, bool jogo = false);
675
680 void BarraTorneio(bool nomes);
681
689
693 void SolicitaInstancia();
694
700
707
714
722
727 void AjudaUtilizacao(const char* programa);
728
736 static int Dominio(int& variavel, int min = INT_MIN, int max = INT_MAX);
737
739 static void InicializaMPI(int argc, char* argv[]);
741 static void FinalizaMPI();
742
744 void DebugTabela(ENivelDebug nivel, TVector<int>tabela, const char *tipo = "");
745
747 bool JuntarCSV(const char* ficheiro);
748
750 static double Cronometro(enum ECronometro id = CONT_ALGORITMO, bool inicialiar = false) {
751 static clock_t inicio[CONT_NUMERO] = { 0 }; // até 10 cronómetros
752 if (inicialiar)
753 inicio[id] = clock();
754 return (double)(clock() - inicio[id]) / CLOCKS_PER_SEC;
755 }
756};
ETagMPI
Define as tags MPI para comunicação entre processos.
Definition TProcura.h:96
@ TAG_TRABALHO
Definition TProcura.h:97
@ TAG_VALORES
Definition TProcura.h:99
@ TAG_CABECALHO
Definition TProcura.h:98
EOperacao
Define o sentido da operação de entrada/saída de dados.
Definition TProcura.h:76
@ GRAVAR
Definition TProcura.h:76
@ LER
Definition TProcura.h:76
EIndicadoresProcura
Definition TProcura.h:16
@ IND_TEMPO
tempo em milisegundos consumidos
Definition TProcura.h:18
@ IND_ITERACOES
número de iterações consumidas
Definition TProcura.h:19
@ IND_PROCURA
Marcador para permitir a extensão do enum em subclasses.
Definition TProcura.h:20
@ IND_RESULTADO
resultado do algoritmo
Definition TProcura.h:17
struct SResultado TResultado
constexpr int NAO_LIDO
Definition TProcura.h:14
ENivelDebug
Níveis de detalhamento para debug.
Definition TProcura.h:62
@ PASSOS
Exibe passos intermediários.
Definition TProcura.h:65
@ EXTRA_DEBUG
Nível extra para debug muito detalhado (uso interno).
Definition TProcura.h:68
@ ATIVIDADE
Apenas eventos principais.
Definition TProcura.h:64
@ COMPLETO
Mostra toda a execução detalhadamente.
Definition TProcura.h:67
@ NADA
Sem informações de debug.
Definition TProcura.h:63
@ DETALHE
Debug detalhada sobre estados e decisões.
Definition TProcura.h:66
struct SParametro TParametro
Estrutura para registo de um parâmetro.
ECronometro
Define os tipos de contadores de cronômetro.
Definition TProcura.h:83
@ CONT_NUMERO
Número de contadores disponíveis.
Definition TProcura.h:90
@ CONT_TESTE
Tempo total do teste (todas as execuções)
Definition TProcura.h:85
@ CONT_REPORTE
Tempo entre mensagens durante o teste.
Definition TProcura.h:86
@ CONT_CHECKPOINT
Tempo entre checkpoints ou estados internos.
Definition TProcura.h:89
@ CONT_ALGORITMO
Tempo da execução do algoritmo por instância.
Definition TProcura.h:84
@ CONT_FINALIZACAO
Tempo de encerramento/exportação.
Definition TProcura.h:88
@ CONT_PREPARACAO
Tempo de inicialização antes do teste.
Definition TProcura.h:87
EParametrosProcura
Identifica um parâmetro específico no código.
Definition TProcura.h:41
@ ALGORITMO
Algoritmo base a executar.
Definition TProcura.h:42
@ LIMITE_ITERACOES
Número máximo de iterações (0 significa sem limite).
Definition TProcura.h:46
@ SEMENTE
Semente aleatória para inicializar a sequência de números pseudo-aleatórios.
Definition TProcura.h:44
@ NIVEL_DEBUG
Nível de debug, de reduzido a completo.
Definition TProcura.h:43
@ PARAMETROS_PROCURA
Marcador para permitir a extensão do enum em subclasses.
Definition TProcura.h:47
@ LIMITE_TEMPO
Tempo limite em segundos.
Definition TProcura.h:45
struct SIndicador TIndicador
Vetor dinâmico genérico com operações de pilha, conjuntos e algoritmos úteis.
Classe base para todas as procuras.
Definition TProcura.h:179
virtual void MostrarSolucao()
definir para visualizar a solução
static bool memoriaEsgotada
Flag indicando problemas de memória esgotada.
Definition TProcura.h:501
virtual void Debug(bool completo=true)
Mostra o estado no ecrã, para debug.
Definition TProcura.cpp:93
int Parametro(int id) const
Definition TProcura.h:522
virtual int ExecutaAlgoritmo()
Executa o algoritmo com os parametros atuais.
Definition TProcura.h:220
static int Dominio(int &variavel, int min=INT_MIN, int max=INT_MAX)
Limita o domínio de um parâmetro inteiro.
static int modoMPI
Modo MPI.
Definition TProcura.h:508
static char * NovoTexto(const char *prompt)
virtual void Inicializar(void)
Coloca o objecto no estado inicial da procura.
Definition TProcura.h:209
virtual void TesteEmpiricoTrabalhador(TVector< int > instancias, char *ficheiro=NULL)
Teste empírico com modo mestre-escravo (este é o escravo)
Definition TProcura.cpp:714
static TVector< TVector< int > > configuracoes
Conjuntos de configurações para teste empírico.
Definition TProcura.h:491
static int resultado
Resultado retornado pelo algoritmo na última execução.
Definition TProcura.h:493
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.
Definition TProcura.cpp:764
void MostrarTorneio(TVector< TVector< int > > &torneio, bool jogo=false)
Mostra os resultados do torneio.
static int mpiID
MPI - rank do processo.
Definition TProcura.h:503
void MostrarConfiguracoes(int detalhe, int atual=-1)
Mostra as configurações disponíveis.
Definition TProcura.cpp:468
virtual int64_t Indicador(int id)
Retorna um indicador, após a execução do algoritmo.
Definition TProcura.cpp:80
virtual ~TProcura(void)
Definition TProcura.h:182
static char * MostraTempo(double segundos)
Mostra tempo num formato humano.
Definition TProcura.cpp:281
TVector< TResultado > ExtrairConfiguracao(TVector< TResultado > &resultados, int configuracao)
Extrai resultados de uma determinada configuração.
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:550
static int iteracoes
Número total de iterações realizadas na última execução.
Definition TProcura.h:497
static void FinalizaMPI()
Finaliza o ambiente MPI, se aplicável.
virtual void TesteManual(const char *nome)
Inicializa a interação com o utilizador.
Definition TProcura.cpp:110
static char ficheiroInstancia[256]
nome do ficheiro de uma instância - editado pelo utilizador (utilizar como prefixo, concatenando com ID...
Definition TProcura.h:482
int NovaConfiguracao(TVector< int > &parametros)
Adiciona uma nova configuração se ainda não existir.
Definition TProcura.cpp:252
void InserirConfiguracoes(char *str, TVector< int > &base)
Insere configurações a partir de uma string.
Definition TProcura.cpp:394
TVector< int > SolicitaInstancias()
Solicita ao utilizador uma lista de instâncias.
Definition TProcura.cpp:335
virtual void ResetParametros()
Inicializa os parametros, indicadores e instâncias.
Definition TProcura.cpp:47
void MostraParametros(int detalhe=1, TVector< int > *idParametros=NULL)
Mostra os parâmetros atuais.
Definition TProcura.cpp:159
TProcura(void)
Definition TProcura.h:181
bool IteracoesExcedido()
Definition TProcura.h:513
virtual bool Parar(void)
Verifica se a procura deve ser interrompida.
Definition TProcura.h:363
bool ParametroAtivo(int id, TVector< int > *valores=NULL) const
Definition TProcura.h:524
virtual void ExecucaoTerminada()
Chamar após a execução do algoritmo. Grava o tempo consumido.
void MostraRelatorio(TVector< TResultado > &resultados, bool ultimo=false)
Mostra um relatório dos resultados.
Definition TProcura.cpp:966
bool EditarIndicadores()
Permite ao utilizador editar os indicadores a utilizar.
Definition TProcura.cpp:193
static int mpiCount
MPI - número de processos.
Definition TProcura.h:505
static void InicializaMPI(int argc, char *argv[])
Inicializa o ambiente MPI, se aplicável.
static int NovoValor(const char *prompt)
void MostraIndicadores()
Mostra os indicadores definidos.
static TVector< TIndicador > indicador
Indicadores que podem ser calculados após a execução, quer com informação da instãncia, quer com resultado da ...
Definition TProcura.h:488
bool JuntarCSV(const char *ficheiro)
Juntar ficheiros CSV gerados por diferentes processos MPI em um único ficheiro.
virtual void main(int argc, char *argv[], const char *nome)
Inicializa a interação com o utilizador.
Definition TProcura.cpp:804
static clock_t instanteFinal
Instante final (deadline) da corrida atual.
Definition TProcura.h:499
int & Parametro(int id)
Definition TProcura.h:523
void EditarParametros()
Permite ao utilizador editar os parâmetros.
Definition TProcura.cpp:221
bool RelatorioCSV(TVector< TResultado > &resultados, char *ficheiro)
Gera um relatório CSV com os resultados.
Definition TProcura.cpp:915
void DebugTabela(ENivelDebug nivel, TVector< int >tabela, const char *tipo="")
Mostra uma tabela de inteiros, 10 elementos por linha, apenas se o nível de debug for igual ou superior...
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:468
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:269
static TVector< int > indAtivo
Definition TProcura.h:489
static TParametro instancia
ID da instância atual, a ser utilizado em SolucaoVazia().
Definition TProcura.h:24
virtual TVector< int64_t > CodificarSolucao()
retorna um vetor de inteiros com a codificação da solução (esta codificação será adicionada aos indicadores,...
Definition TProcura.h:472
void InserirRegisto(TVector< TResultado > &resultados, int inst, int conf)
Insere um novo registo de resultados.
Definition TProcura.cpp:313
static TVector< TParametro > parametro
Parâmetros a serem utilizados na configuração atual.
Definition TProcura.h:485
static double Cronometro(enum ECronometro id=CONT_ALGORITMO, bool inicialiar=false)
retorna o tempo em segundos desde que o cronómetro foi inicializado
Definition TProcura.h:750
void AjudaUtilizacao(const char *programa)
Mostra ajuda de utilização do programa.
Definition TProcura.cpp:892
void EditarConfiguracoes()
Permite ao utilizador editar as configurações.
Definition TProcura.cpp:350
int64_t Registo(TResultado &resultado, int id)
Procura um registo com determinado id.
Definition TProcura.cpp:322
virtual void LimparEstatisticas()
Chapar antes da execução do algoritmo. Limpa valores estatísticos, e fixa o instante limite de tempo para...
Definition TProcura.cpp:99
virtual void TesteEmpirico(TVector< int > instancias, char *ficheiro=NULL)
Executa testes empíricos, em todas as configurações guardadas, nas instâncias selecionadas.
Definition TProcura.cpp:498
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:495
bool TempoExcedido()
Definition TProcura.h:512
virtual void TesteEmpiricoGestor(TVector< int > instancias, char *ficheiro=NULL)
Teste empírico com modo mestre-escravo (este é o mestre)
Definition TProcura.cpp:579
int indice
indice onde aparece o indicador nos resultados, c.c. -1 para não aparecer
Definition TProcura.h:110
const char * nome
nome do indicador
Definition TProcura.h:106
const char * descricao
descrição do indicador, opcional
Definition TProcura.h:108
Estrutura para registo de um parâmetro.
Definition TProcura.h:135
const char * descricao
descrição do parametro, opcional
Definition TProcura.h:145
TVector< int > dependencia
dependência (indice do parametro, seguido de valores permitidos) - vazio não tem dependência
Definition TProcura.h:150
int valor
valor do parametro
Definition TProcura.h:139
const char * nome
nome do parametro, opcional mas aconselhado nos parâmetros específicos
Definition TProcura.h:137
int max
valor máximo que o parametro pode tomar
Definition TProcura.h:143
const char ** nomeValores
Nome associado a cada valor do parâmetro, útil para variáveis categóricas.
Definition TProcura.h:148
int min
valor mínimo que o parametro pode tomar
Definition TProcura.h:141
int configuracao
Definition TProcura.h:162
int instancia
Definition TProcura.h:162
TVector< int64_t > valor
Definition TProcura.h:163