diff options
Diffstat (limited to 'src/backend/optimizer/geqo/geqo_main.c')
-rw-r--r-- | src/backend/optimizer/geqo/geqo_main.c | 325 |
1 files changed, 0 insertions, 325 deletions
diff --git a/src/backend/optimizer/geqo/geqo_main.c b/src/backend/optimizer/geqo/geqo_main.c deleted file mode 100644 index 198eb6167b8..00000000000 --- a/src/backend/optimizer/geqo/geqo_main.c +++ /dev/null @@ -1,325 +0,0 @@ -/*------------------------------------------------------------------------ - * - * geqo_main.c - * solution of the query optimization problem - * by means of a Genetic Algorithm (GA) - * - * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * $Id: geqo_main.c,v 1.31 2002/06/20 20:29:29 momjian Exp $ - * - *------------------------------------------------------------------------- - */ - -/* contributed by: - =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= - * Martin Utesch * Institute of Automatic Control * - = = University of Mining and Technology = - * utesch@aut.tu-freiberg.de * Freiberg, Germany * - =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*= - */ - -/* -- parts of this are adapted from D. Whitley's Genitor algorithm -- */ - -#include "postgres.h" - -#include <time.h> -#include <math.h> - -#include "optimizer/geqo.h" -#include "optimizer/geqo_misc.h" -#include "optimizer/geqo_pool.h" -#include "optimizer/geqo_selection.h" - - -/* - * Configuration options - */ -int Geqo_pool_size; -int Geqo_effort; -int Geqo_generations; -double Geqo_selection_bias; -int Geqo_random_seed; - - -static int gimme_pool_size(int nr_rel); -static int gimme_number_generations(int pool_size, int effort); - - -/* define edge recombination crossover [ERX] per default */ -#if !defined(ERX) && \ - !defined(PMX) && \ - !defined(CX) && \ - !defined(PX) && \ - !defined(OX1) && \ - !defined(OX2) -#define ERX -#endif - - -/* - * geqo - * solution of the query optimization problem - * similar to a constrained Traveling Salesman Problem (TSP) - */ - -RelOptInfo * -geqo(Query *root, int number_of_rels, List *initial_rels) -{ - int generation; - Chromosome *momma; - Chromosome *daddy; - Chromosome *kid; - Pool *pool; - int pool_size, - number_generations, - status_interval; - Gene *best_tour; - RelOptInfo *best_rel; - -#if defined(ERX) - Edge *edge_table; /* list of edges */ - int edge_failures = 0; - float difference; -#endif -#if defined(CX) || defined(PX) || defined(OX1) || defined(OX2) - City *city_table; /* list of cities */ -#endif -#if defined(CX) - int cycle_diffs = 0; - int mutations = 0; -#endif - -/* set GA parameters */ - pool_size = gimme_pool_size(number_of_rels); - number_generations = gimme_number_generations(pool_size, Geqo_effort); - status_interval = 10; - -/* seed random number generator */ -/* XXX why is this done every time around? */ - if (Geqo_random_seed >= 0) - srandom((unsigned int) Geqo_random_seed); - else - srandom((unsigned int) time(NULL)); - -/* allocate genetic pool memory */ - pool = alloc_pool(pool_size, number_of_rels); - -/* random initialization of the pool */ - random_init_pool(root, initial_rels, pool, 0, pool->size); - -/* sort the pool according to cheapest path as fitness */ - sort_pool(pool); /* we have to do it only one time, since - * all kids replace the worst individuals - * in future (-> geqo_pool.c:spread_chromo - * ) */ - -/* allocate chromosome momma and daddy memory */ - momma = alloc_chromo(pool->string_length); - daddy = alloc_chromo(pool->string_length); - -#if defined (ERX) - elog(LOG, "geqo_main: using edge recombination crossover [ERX]"); -/* allocate edge table memory */ - edge_table = alloc_edge_table(pool->string_length); -#elif defined(PMX) - elog(LOG, "geqo_main: using partially matched crossover [PMX]"); -/* allocate chromosome kid memory */ - kid = alloc_chromo(pool->string_length); -#elif defined(CX) - elog(LOG, "geqo_main: using cycle crossover [CX]"); -/* allocate city table memory */ - kid = alloc_chromo(pool->string_length); - city_table = alloc_city_table(pool->string_length); -#elif defined(PX) - elog(LOG, "geqo_main: using position crossover [PX]"); -/* allocate city table memory */ - kid = alloc_chromo(pool->string_length); - city_table = alloc_city_table(pool->string_length); -#elif defined(OX1) - elog(LOG, "geqo_main: using order crossover [OX1]"); -/* allocate city table memory */ - kid = alloc_chromo(pool->string_length); - city_table = alloc_city_table(pool->string_length); -#elif defined(OX2) - elog(LOG, "geqo_main: using order crossover [OX2]"); -/* allocate city table memory */ - kid = alloc_chromo(pool->string_length); - city_table = alloc_city_table(pool->string_length); -#endif - - -/* my pain main part: */ -/* iterative optimization */ - - for (generation = 0; generation < number_generations; generation++) - { - - /* SELECTION */ - geqo_selection(momma, daddy, pool, Geqo_selection_bias); /* using linear bias - * function */ - - - -#if defined (ERX) - /* EDGE RECOMBINATION CROSSOVER */ - difference = gimme_edge_table(momma->string, daddy->string, pool->string_length, edge_table); - - /* let the kid grow in momma's womb (storage) for nine months ;-) */ - /* sleep(23328000) -- har har har */ - kid = momma; - - /* are there any edge failures ? */ - edge_failures += gimme_tour(edge_table, kid->string, pool->string_length); -#elif defined(PMX) - /* PARTIALLY MATCHED CROSSOVER */ - pmx(momma->string, daddy->string, kid->string, pool->string_length); -#elif defined(CX) - /* CYCLE CROSSOVER */ - cycle_diffs = cx(momma->string, daddy->string, kid->string, pool->string_length, city_table); - /* mutate the child */ - if (cycle_diffs == 0) - { - mutations++; - geqo_mutation(kid->string, pool->string_length); - } -#elif defined(PX) - /* POSITION CROSSOVER */ - px(momma->string, daddy->string, kid->string, pool->string_length, city_table); -#elif defined(OX1) - /* ORDER CROSSOVER */ - ox1(momma->string, daddy->string, kid->string, pool->string_length, city_table); -#elif defined(OX2) - /* ORDER CROSSOVER */ - ox2(momma->string, daddy->string, kid->string, pool->string_length, city_table); -#endif - - - /* EVALUATE FITNESS */ - kid->worth = geqo_eval(root, initial_rels, - kid->string, pool->string_length); - - /* push the kid into the wilderness of life according to its worth */ - spread_chromo(kid, pool); - - -#ifdef GEQO_DEBUG - if (status_interval && !(generation % status_interval)) - print_gen(stdout, pool, generation); -#endif - - } /* end of iterative optimization */ - - -#if defined(ERX) && defined(GEQO_DEBUG) - if (edge_failures != 0) - elog(LOG, "[GEQO] failures: %d, average: %d", - edge_failures, (int) generation / edge_failures); - else - elog(LOG, "[GEQO] No edge failures detected."); -#endif - - -#if defined(CX) && defined(GEQO_DEBUG) - if (mutations != 0) - elog(LOG, "[GEQO] mutations: %d, generations: %d", mutations, generation); - else - elog(LOG, "[GEQO] No mutations processed."); -#endif - - -#ifdef GEQO_DEBUG - print_pool(stdout, pool, 0, pool_size - 1); -#endif - - -/* got the cheapest query tree processed by geqo; - first element of the population indicates the best query tree */ - - best_tour = (Gene *) pool->data[0].string; - -/* root->join_rel_list will be modified during this ! */ - best_rel = gimme_tree(root, initial_rels, - best_tour, pool->string_length, - 0, NULL); - -/* DBG: show the query plan -print_plan(best_plan, root); - DBG */ - -/* ... free memory stuff */ - free_chromo(momma); - free_chromo(daddy); - -#if defined (ERX) - free_edge_table(edge_table); -#elif defined(PMX) - free_chromo(kid); -#elif defined(CX) - free_chromo(kid); - free_city_table(city_table); -#elif defined(PX) - free_chromo(kid); - free_city_table(city_table); -#elif defined(OX1) - free_chromo(kid); - free_city_table(city_table); -#elif defined(OX2) - free_chromo(kid); - free_city_table(city_table); -#endif - - free_pool(pool); - - return best_rel; -} - - - -/* - * Return either configured pool size or - * a good default based on query size (no. of relations) - * = 2^(QS+1) - * also constrain between 128 and 1024 - */ -static int -gimme_pool_size(int nr_rel) -{ - double size; - - if (Geqo_pool_size != 0) - { - if (Geqo_pool_size < MIN_GEQO_POOL_SIZE) - return MIN_GEQO_POOL_SIZE; - else if (Geqo_pool_size > MAX_GEQO_POOL_SIZE) - return MAX_GEQO_POOL_SIZE; - else - return Geqo_pool_size; - } - - size = pow(2.0, nr_rel + 1.0); - - if (size < MIN_GEQO_POOL_SIZE) - return MIN_GEQO_POOL_SIZE; - else if (size > MAX_GEQO_POOL_SIZE) - return MAX_GEQO_POOL_SIZE; - else - return (int) ceil(size); -} - - - -/* - * Return either configured number of generations or - * some reasonable default calculated on the fly. - * = Effort * Log2(PoolSize) - */ -static int -gimme_number_generations(int pool_size, int effort) -{ - if (Geqo_generations <= 0) - return effort * (int) ceil(log((double) pool_size) / log(2.0)); - else - return Geqo_generations; -} |