3
3
* geqo_erx.c
4
4
* edge recombination crossover [ER]
5
5
*
6
- * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_erx.c,v 1.20 2005/10/15 02:49:19 momjian Exp $
6
+ * $PostgreSQL: pgsql/src/backend/optimizer/geqo/geqo_erx.c,v 1.21 2009/07/16 20:55:44 tgl Exp $
7
7
*
8
8
*-------------------------------------------------------------------------
9
9
*/
36
36
#include "optimizer/geqo_random.h"
37
37
38
38
39
- static int gimme_edge (Gene gene1 , Gene gene2 , Edge * edge_table );
40
- static void remove_gene (Gene gene , Edge edge , Edge * edge_table );
41
- static Gene gimme_gene (Edge edge , Edge * edge_table );
39
+ static int gimme_edge (PlannerInfo * root , Gene gene1 , Gene gene2 , Edge * edge_table );
40
+ static void remove_gene (PlannerInfo * root , Gene gene , Edge edge , Edge * edge_table );
41
+ static Gene gimme_gene (PlannerInfo * root , Edge edge , Edge * edge_table );
42
42
43
- static Gene edge_failure (Gene * gene , int index , Edge * edge_table , int num_gene );
43
+ static Gene edge_failure (PlannerInfo * root , Gene * gene , int index , Edge * edge_table , int num_gene );
44
44
45
45
46
46
/* alloc_edge_table
@@ -50,7 +50,7 @@ static Gene edge_failure(Gene *gene, int index, Edge *edge_table, int num_gene);
50
50
*/
51
51
52
52
Edge *
53
- alloc_edge_table (int num_gene )
53
+ alloc_edge_table (PlannerInfo * root , int num_gene )
54
54
{
55
55
Edge * edge_table ;
56
56
@@ -70,7 +70,7 @@ alloc_edge_table(int num_gene)
70
70
*
71
71
*/
72
72
void
73
- free_edge_table (Edge * edge_table )
73
+ free_edge_table (PlannerInfo * root , Edge * edge_table )
74
74
{
75
75
pfree (edge_table );
76
76
}
@@ -89,7 +89,8 @@ free_edge_table(Edge *edge_table)
89
89
*
90
90
*/
91
91
float
92
- gimme_edge_table (Gene * tour1 , Gene * tour2 , int num_gene , Edge * edge_table )
92
+ gimme_edge_table (PlannerInfo * root , Gene * tour1 , Gene * tour2 ,
93
+ int num_gene , Edge * edge_table )
93
94
{
94
95
int i ,
95
96
index1 ,
@@ -121,11 +122,11 @@ gimme_edge_table(Gene *tour1, Gene *tour2, int num_gene, Edge *edge_table)
121
122
* twice per edge
122
123
*/
123
124
124
- edge_total += gimme_edge (tour1 [index1 ], tour1 [index2 ], edge_table );
125
- gimme_edge (tour1 [index2 ], tour1 [index1 ], edge_table );
125
+ edge_total += gimme_edge (root , tour1 [index1 ], tour1 [index2 ], edge_table );
126
+ gimme_edge (root , tour1 [index2 ], tour1 [index1 ], edge_table );
126
127
127
- edge_total += gimme_edge (tour2 [index1 ], tour2 [index2 ], edge_table );
128
- gimme_edge (tour2 [index2 ], tour2 [index1 ], edge_table );
128
+ edge_total += gimme_edge (root , tour2 [index1 ], tour2 [index2 ], edge_table );
129
+ gimme_edge (root , tour2 [index2 ], tour2 [index1 ], edge_table );
129
130
}
130
131
131
132
/* return average number of edges per index */
@@ -147,7 +148,7 @@ gimme_edge_table(Gene *tour1, Gene *tour2, int num_gene, Edge *edge_table)
147
148
* 0 if edge was already registered and edge_table is unchanged
148
149
*/
149
150
static int
150
- gimme_edge (Gene gene1 , Gene gene2 , Edge * edge_table )
151
+ gimme_edge (PlannerInfo * root , Gene gene1 , Gene gene2 , Edge * edge_table )
151
152
{
152
153
int i ;
153
154
int edges ;
@@ -189,13 +190,13 @@ gimme_edge(Gene gene1, Gene gene2, Edge *edge_table)
189
190
*
190
191
*/
191
192
int
192
- gimme_tour (Edge * edge_table , Gene * new_gene , int num_gene )
193
+ gimme_tour (PlannerInfo * root , Edge * edge_table , Gene * new_gene , int num_gene )
193
194
{
194
195
int i ;
195
196
int edge_failures = 0 ;
196
197
197
- new_gene [ 0 ] = ( Gene ) geqo_randint ( num_gene , 1 ); /* choose int between 1
198
- * and num_gene */
198
+ /* choose int between 1 and num_gene */
199
+ new_gene [ 0 ] = ( Gene ) geqo_randint ( root , num_gene , 1 );
199
200
200
201
for (i = 1 ; i < num_gene ; i ++ )
201
202
{
@@ -204,18 +205,18 @@ gimme_tour(Edge *edge_table, Gene *new_gene, int num_gene)
204
205
* table
205
206
*/
206
207
207
- remove_gene (new_gene [i - 1 ], edge_table [(int ) new_gene [i - 1 ]], edge_table );
208
+ remove_gene (root , new_gene [i - 1 ], edge_table [(int ) new_gene [i - 1 ]], edge_table );
208
209
209
210
/* find destination for the newly entered point */
210
211
211
212
if (edge_table [new_gene [i - 1 ]].unused_edges > 0 )
212
- new_gene [i ] = gimme_gene (edge_table [(int ) new_gene [i - 1 ]], edge_table );
213
+ new_gene [i ] = gimme_gene (root , edge_table [(int ) new_gene [i - 1 ]], edge_table );
213
214
214
215
else
215
216
{ /* cope with fault */
216
217
edge_failures ++ ;
217
218
218
- new_gene [i ] = edge_failure (new_gene , i - 1 , edge_table , num_gene );
219
+ new_gene [i ] = edge_failure (root , new_gene , i - 1 , edge_table , num_gene );
219
220
}
220
221
221
222
/* mark this node as incorporated */
@@ -235,7 +236,7 @@ gimme_tour(Edge *edge_table, Gene *new_gene, int num_gene)
235
236
*
236
237
*/
237
238
static void
238
- remove_gene (Gene gene , Edge edge , Edge * edge_table )
239
+ remove_gene (PlannerInfo * root , Gene gene , Edge edge , Edge * edge_table )
239
240
{
240
241
int i ,
241
242
j ;
@@ -277,7 +278,7 @@ remove_gene(Gene gene, Edge edge, Edge *edge_table)
277
278
*
278
279
*/
279
280
static Gene
280
- gimme_gene (Edge edge , Edge * edge_table )
281
+ gimme_gene (PlannerInfo * root , Edge edge , Edge * edge_table )
281
282
{
282
283
int i ;
283
284
Gene friend ;
@@ -340,7 +341,7 @@ gimme_gene(Edge edge, Edge *edge_table)
340
341
341
342
342
343
/* random decision of the possible candidates to use */
343
- rand_decision = ( int ) geqo_randint (minimum_count - 1 , 0 );
344
+ rand_decision = geqo_randint (root , minimum_count - 1 , 0 );
344
345
345
346
346
347
for (i = 0 ; i < edge .unused_edges ; i ++ )
@@ -368,7 +369,7 @@ gimme_gene(Edge edge, Edge *edge_table)
368
369
*
369
370
*/
370
371
static Gene
371
- edge_failure (Gene * gene , int index , Edge * edge_table , int num_gene )
372
+ edge_failure (PlannerInfo * root , Gene * gene , int index , Edge * edge_table , int num_gene )
372
373
{
373
374
int i ;
374
375
Gene fail_gene = gene [index ];
@@ -401,7 +402,7 @@ edge_failure(Gene *gene, int index, Edge *edge_table, int num_gene)
401
402
if (four_count != 0 )
402
403
{
403
404
404
- rand_decision = ( int ) geqo_randint (four_count - 1 , 0 );
405
+ rand_decision = geqo_randint (root , four_count - 1 , 0 );
405
406
406
407
for (i = 1 ; i <= num_gene ; i ++ )
407
408
{
@@ -423,7 +424,7 @@ edge_failure(Gene *gene, int index, Edge *edge_table, int num_gene)
423
424
else if (remaining_edges != 0 )
424
425
{
425
426
/* random decision of the gene with remaining edges */
426
- rand_decision = ( int ) geqo_randint (remaining_edges - 1 , 0 );
427
+ rand_decision = geqo_randint (root , remaining_edges - 1 , 0 );
427
428
428
429
for (i = 1 ; i <= num_gene ; i ++ )
429
430
{
0 commit comments