geqo_misc.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:5k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*------------------------------------------------------------------------
  2.  *
  3.  * geqo_misc.c
  4.  *    misc. printout and debug stuff
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  * $Id: geqo_misc.c,v 1.19.2.1 1999/08/02 05:57:05 scrappy Exp $
  9.  *
  10.  *-------------------------------------------------------------------------
  11.  */
  12. /* contributed by:
  13.    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  14.    *  Martin Utesch  * Institute of Automatic Control    *
  15.    =  = University of Mining and Technology =
  16.    *  utesch@aut.tu-freiberg.de  * Freiberg, Germany    *
  17.    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
  18.  */
  19. #include "postgres.h"
  20. #include "optimizer/geqo_misc.h"
  21. static float avg_pool(Pool *pool);
  22. /* avg_pool
  23.  *
  24.  */
  25. static float
  26. avg_pool(Pool *pool)
  27. {
  28. int i;
  29. double cumulative = 0.0;
  30. if (pool->size == 0)
  31. elog(ERROR, "avg_pool: pool_size of zero");
  32. for (i = 0; i < pool->size; i++)
  33. cumulative = cumulative + pool->data[i].worth;
  34. return (float) cumulative / pool->size;
  35. }
  36. /* print_pool
  37.  */
  38. void
  39. print_pool(FILE *fp, Pool *pool, int start, int stop)
  40. {
  41. int i,
  42. j;
  43. /* be extra careful that start and stop are valid inputs */
  44. if (start < 0)
  45. start = 0;
  46. if (stop > pool->size)
  47. stop = pool->size;
  48. if (start + stop > pool->size)
  49. {
  50. start = 0;
  51. stop = pool->size;
  52. }
  53. for (i = start; i < stop; i++)
  54. {
  55. fprintf(fp, "%d)t", i);
  56. for (j = 0; j < pool->string_length; j++)
  57. fprintf(fp, "%d ", pool->data[i].string[j]);
  58. fprintf(fp, "%fn", pool->data[i].worth);
  59. }
  60. }
  61. /* print_gen
  62.  *
  63.  *  printout for chromosome: best, worst, mean, average
  64.  *
  65.  */
  66. void
  67. print_gen(FILE *fp, Pool *pool, int generation)
  68. {
  69. int lowest;
  70. /* Get index to lowest ranking gene in poplulation. */
  71. /* Use 2nd to last since last is buffer. */
  72. lowest = pool->size > 1 ? pool->size - 2 : 0;
  73. fprintf(fp,
  74. "%5d | Bst: %f  Wst: %f  Mean: %f  Avg: %fn",
  75. generation,
  76. pool->data[0].worth,
  77. pool->data[lowest].worth,
  78. pool->data[pool->size / 2].worth,
  79. avg_pool(pool));
  80. }
  81. void
  82. print_edge_table(FILE *fp, Edge *edge_table, int num_gene)
  83. {
  84. int i,
  85. j;
  86. fprintf(fp, "nEDGE TABLEn");
  87. for (i = 1; i <= num_gene; i++)
  88. {
  89. fprintf(fp, "%d :", i);
  90. for (j = 0; j < edge_table[i].unused_edges; j++)
  91. fprintf(fp, " %d", edge_table[i].edge_list[j]);
  92. fprintf(fp, "n");
  93. }
  94. fprintf(fp, "n");
  95. }
  96. /*************************************************************
  97.  Debug output subroutines
  98.  *************************************************************/
  99. void
  100. geqo_print_joinclauses(Query *root, List *clauses)
  101. {
  102. List    *l;
  103. extern void print_expr(Node *expr, List *rtable); /* in print.c */
  104. foreach(l, clauses)
  105. {
  106. RestrictInfo *c = lfirst(l);
  107. print_expr((Node *) c->clause, root->rtable);
  108. if (lnext(l))
  109. printf(" ");
  110. }
  111. }
  112. void
  113. geqo_print_path(Query *root, Path *path, int indent)
  114. {
  115. char    *ptype = NULL;
  116. JoinPath   *jp;
  117. bool join = false;
  118. int i;
  119. for (i = 0; i < indent; i++)
  120. printf("t");
  121. switch (nodeTag(path))
  122. {
  123. case T_Path:
  124. ptype = "SeqScan";
  125. join = false;
  126. break;
  127. case T_IndexPath:
  128. ptype = "IdxScan";
  129. join = false;
  130. break;
  131. case T_NestPath:
  132. ptype = "Nestloop";
  133. join = true;
  134. break;
  135. case T_MergePath:
  136. ptype = "MergeJoin";
  137. join = true;
  138. break;
  139. case T_HashPath:
  140. ptype = "HashJoin";
  141. join = true;
  142. break;
  143. default:
  144. break;
  145. }
  146. if (join)
  147. {
  148. int size = path->parent->size;
  149. jp = (JoinPath *) path;
  150. printf("%s size=%d cost=%fn", ptype, size, path->path_cost);
  151. switch (nodeTag(path))
  152. {
  153. case T_MergePath:
  154. case T_HashPath:
  155. for (i = 0; i < indent + 1; i++)
  156. printf("t");
  157. printf("   clauses=(");
  158. geqo_print_joinclauses(root, ((JoinPath *) path)->pathinfo);
  159. printf(")n");
  160. if (nodeTag(path) == T_MergePath)
  161. {
  162. MergePath  *mp = (MergePath *) path;
  163. if (mp->outersortkeys || mp->innersortkeys)
  164. {
  165. for (i = 0; i < indent + 1; i++)
  166. printf("t");
  167. printf("   sortouter=%d sortinner=%dn",
  168.    ((mp->outersortkeys) ? 1 : 0),
  169.    ((mp->innersortkeys) ? 1 : 0));
  170. }
  171. }
  172. break;
  173. default:
  174. break;
  175. }
  176. geqo_print_path(root, jp->outerjoinpath, indent + 1);
  177. geqo_print_path(root, jp->innerjoinpath, indent + 1);
  178. }
  179. else
  180. {
  181. int size = path->parent->size;
  182. int relid = lfirsti(path->parent->relids);
  183. printf("%s(%d) size=%d cost=%f",
  184.    ptype, relid, size, path->path_cost);
  185. if (nodeTag(path) == T_IndexPath)
  186. {
  187. List    *k,
  188.    *l;
  189. printf(" pathkeys=");
  190. foreach(k, path->pathkeys)
  191. {
  192. printf("(");
  193. foreach(l, lfirst(k))
  194. {
  195. Var    *var = lfirst(l);
  196. printf("%d.%d", var->varnoold, var->varoattno);
  197. if (lnext(l))
  198. printf(", ");
  199. }
  200. printf(")");
  201. if (lnext(k))
  202. printf(", ");
  203. }
  204. }
  205. printf("n");
  206. }
  207. }
  208. void
  209. geqo_print_rel(Query *root, RelOptInfo *rel)
  210. {
  211. List    *l;
  212. printf("______________________________n");
  213. printf("(");
  214. foreach(l, rel->relids)
  215. printf("%d ", lfirsti(l));
  216. printf("): size=%d width=%dn", rel->size, rel->width);
  217. printf("tpath list:n");
  218. foreach(l, rel->pathlist)
  219. geqo_print_path(root, lfirst(l), 1);
  220. printf("tcheapest path:n");
  221. geqo_print_path(root, rel->cheapestpath, 1);
  222. }