133 lines
2.7 KiB
C
133 lines
2.7 KiB
C
/*------------------------------------------------------------------------
|
|
*
|
|
* geqo_misc.c
|
|
* misc. printout and debug stuff
|
|
*
|
|
* Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* src/backend/optimizer/geqo/geqo_misc.c
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
|
|
/* contributed by:
|
|
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
|
|
* Martin Utesch * Institute of Automatic Control *
|
|
= = University of Mining and Technology =
|
|
* utesch@aut.tu-freiberg.de * Freiberg, Germany *
|
|
=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
|
|
*/
|
|
|
|
#include "postgres.h"
|
|
|
|
#include "optimizer/geqo_misc.h"
|
|
|
|
|
|
#ifdef GEQO_DEBUG
|
|
|
|
|
|
/*
|
|
* avg_pool
|
|
*/
|
|
static double
|
|
avg_pool(Pool *pool)
|
|
{
|
|
int i;
|
|
double cumulative = 0.0;
|
|
|
|
if (pool->size <= 0)
|
|
elog(ERROR, "pool_size is zero");
|
|
|
|
/*
|
|
* Since the pool may contain multiple occurrences of DBL_MAX, divide by
|
|
* pool->size before summing, not after, to avoid overflow. This loses a
|
|
* little in speed and accuracy, but this routine is only used for debug
|
|
* printouts, so we don't care that much.
|
|
*/
|
|
for (i = 0; i < pool->size; i++)
|
|
cumulative += pool->data[i].worth / pool->size;
|
|
|
|
return cumulative;
|
|
}
|
|
|
|
/* print_pool
|
|
*/
|
|
void
|
|
print_pool(FILE *fp, Pool *pool, int start, int stop)
|
|
{
|
|
int i,
|
|
j;
|
|
|
|
/* be extra careful that start and stop are valid inputs */
|
|
|
|
if (start < 0)
|
|
start = 0;
|
|
if (stop > pool->size)
|
|
stop = pool->size;
|
|
|
|
if (start + stop > pool->size)
|
|
{
|
|
start = 0;
|
|
stop = pool->size;
|
|
}
|
|
|
|
for (i = start; i < stop; i++)
|
|
{
|
|
fprintf(fp, "%d)\t", i);
|
|
for (j = 0; j < pool->string_length; j++)
|
|
fprintf(fp, "%d ", pool->data[i].string[j]);
|
|
fprintf(fp, "%g\n", pool->data[i].worth);
|
|
}
|
|
|
|
fflush(fp);
|
|
}
|
|
|
|
/* print_gen
|
|
*
|
|
* printout for chromosome: best, worst, mean, average
|
|
*/
|
|
void
|
|
print_gen(FILE *fp, Pool *pool, int generation)
|
|
{
|
|
int lowest;
|
|
|
|
/* Get index to lowest ranking gene in population. */
|
|
/* Use 2nd to last since last is buffer. */
|
|
lowest = pool->size > 1 ? pool->size - 2 : 0;
|
|
|
|
fprintf(fp,
|
|
"%5d | Best: %g Worst: %g Mean: %g Avg: %g\n",
|
|
generation,
|
|
pool->data[0].worth,
|
|
pool->data[lowest].worth,
|
|
pool->data[pool->size / 2].worth,
|
|
avg_pool(pool));
|
|
|
|
fflush(fp);
|
|
}
|
|
|
|
|
|
void
|
|
print_edge_table(FILE *fp, Edge *edge_table, int num_gene)
|
|
{
|
|
int i,
|
|
j;
|
|
|
|
fprintf(fp, "\nEDGE TABLE\n");
|
|
|
|
for (i = 1; i <= num_gene; i++)
|
|
{
|
|
fprintf(fp, "%d :", i);
|
|
for (j = 0; j < edge_table[i].unused_edges; j++)
|
|
fprintf(fp, " %d", edge_table[i].edge_list[j]);
|
|
fprintf(fp, "\n");
|
|
}
|
|
|
|
fprintf(fp, "\n");
|
|
|
|
fflush(fp);
|
|
}
|
|
|
|
#endif /* GEQO_DEBUG */
|