summaryrefslogtreecommitdiffstats
path: root/src/backend/optimizer/geqo/geqo_misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/optimizer/geqo/geqo_misc.c')
-rw-r--r--src/backend/optimizer/geqo/geqo_misc.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/src/backend/optimizer/geqo/geqo_misc.c b/src/backend/optimizer/geqo/geqo_misc.c
new file mode 100644
index 0000000..890ac36
--- /dev/null
+++ b/src/backend/optimizer/geqo/geqo_misc.c
@@ -0,0 +1,132 @@
+/*------------------------------------------------------------------------
+ *
+ * geqo_misc.c
+ * misc. printout and debug stuff
+ *
+ * Portions Copyright (c) 1996-2022, 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 */