| 1 | /*------------------------------------------------------------------------ |
| 2 | * |
| 3 | * geqo_misc.c |
| 4 | * misc. printout and debug stuff |
| 5 | * |
| 6 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
| 7 | * Portions Copyright (c) 1994, Regents of the University of California |
| 8 | * |
| 9 | * src/backend/optimizer/geqo/geqo_misc.c |
| 10 | * |
| 11 | *------------------------------------------------------------------------- |
| 12 | */ |
| 13 | |
| 14 | /* contributed by: |
| 15 | =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= |
| 16 | * Martin Utesch * Institute of Automatic Control * |
| 17 | = = University of Mining and Technology = |
| 18 | * utesch@aut.tu-freiberg.de * Freiberg, Germany * |
| 19 | =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= |
| 20 | */ |
| 21 | |
| 22 | #include "postgres.h" |
| 23 | |
| 24 | #include "optimizer/geqo_misc.h" |
| 25 | |
| 26 | |
| 27 | #ifdef GEQO_DEBUG |
| 28 | |
| 29 | |
| 30 | /* |
| 31 | * avg_pool |
| 32 | */ |
| 33 | static double |
| 34 | avg_pool(Pool *pool) |
| 35 | { |
| 36 | int i; |
| 37 | double cumulative = 0.0; |
| 38 | |
| 39 | if (pool->size <= 0) |
| 40 | elog(ERROR, "pool_size is zero" ); |
| 41 | |
| 42 | /* |
| 43 | * Since the pool may contain multiple occurrences of DBL_MAX, divide by |
| 44 | * pool->size before summing, not after, to avoid overflow. This loses a |
| 45 | * little in speed and accuracy, but this routine is only used for debug |
| 46 | * printouts, so we don't care that much. |
| 47 | */ |
| 48 | for (i = 0; i < pool->size; i++) |
| 49 | cumulative += pool->data[i].worth / pool->size; |
| 50 | |
| 51 | return cumulative; |
| 52 | } |
| 53 | |
| 54 | /* print_pool |
| 55 | */ |
| 56 | void |
| 57 | print_pool(FILE *fp, Pool *pool, int start, int stop) |
| 58 | { |
| 59 | int i, |
| 60 | j; |
| 61 | |
| 62 | /* be extra careful that start and stop are valid inputs */ |
| 63 | |
| 64 | if (start < 0) |
| 65 | start = 0; |
| 66 | if (stop > pool->size) |
| 67 | stop = pool->size; |
| 68 | |
| 69 | if (start + stop > pool->size) |
| 70 | { |
| 71 | start = 0; |
| 72 | stop = pool->size; |
| 73 | } |
| 74 | |
| 75 | for (i = start; i < stop; i++) |
| 76 | { |
| 77 | fprintf(fp, "%d)\t" , i); |
| 78 | for (j = 0; j < pool->string_length; j++) |
| 79 | fprintf(fp, "%d " , pool->data[i].string[j]); |
| 80 | fprintf(fp, "%g\n" , pool->data[i].worth); |
| 81 | } |
| 82 | |
| 83 | fflush(fp); |
| 84 | } |
| 85 | |
| 86 | /* print_gen |
| 87 | * |
| 88 | * printout for chromosome: best, worst, mean, average |
| 89 | */ |
| 90 | void |
| 91 | print_gen(FILE *fp, Pool *pool, int generation) |
| 92 | { |
| 93 | int lowest; |
| 94 | |
| 95 | /* Get index to lowest ranking gene in population. */ |
| 96 | /* Use 2nd to last since last is buffer. */ |
| 97 | lowest = pool->size > 1 ? pool->size - 2 : 0; |
| 98 | |
| 99 | fprintf(fp, |
| 100 | "%5d | Best: %g Worst: %g Mean: %g Avg: %g\n" , |
| 101 | generation, |
| 102 | pool->data[0].worth, |
| 103 | pool->data[lowest].worth, |
| 104 | pool->data[pool->size / 2].worth, |
| 105 | avg_pool(pool)); |
| 106 | |
| 107 | fflush(fp); |
| 108 | } |
| 109 | |
| 110 | |
| 111 | void |
| 112 | print_edge_table(FILE *fp, Edge *edge_table, int num_gene) |
| 113 | { |
| 114 | int i, |
| 115 | j; |
| 116 | |
| 117 | fprintf(fp, "\nEDGE TABLE\n" ); |
| 118 | |
| 119 | for (i = 1; i <= num_gene; i++) |
| 120 | { |
| 121 | fprintf(fp, "%d :" , i); |
| 122 | for (j = 0; j < edge_table[i].unused_edges; j++) |
| 123 | fprintf(fp, " %d" , edge_table[i].edge_list[j]); |
| 124 | fprintf(fp, "\n" ); |
| 125 | } |
| 126 | |
| 127 | fprintf(fp, "\n" ); |
| 128 | |
| 129 | fflush(fp); |
| 130 | } |
| 131 | |
| 132 | #endif /* GEQO_DEBUG */ |
| 133 | |