PostgreSQL Source Code git master
Loading...
Searching...
No Matches
geqo_erx.c File Reference
Include dependency graph for geqo_erx.c:

Go to the source code of this file.

Functions

static int gimme_edge (PlannerInfo *root, Gene gene1, Gene gene2, Edge *edge_table)
 
static void remove_gene (PlannerInfo *root, Gene gene, Edge edge, Edge *edge_table)
 
static Gene gimme_gene (PlannerInfo *root, Edge edge, Edge *edge_table)
 
static Gene edge_failure (PlannerInfo *root, Gene *gene, int index, Edge *edge_table, int num_gene)
 
Edgealloc_edge_table (PlannerInfo *root, int num_gene)
 
void free_edge_table (PlannerInfo *root, Edge *edge_table)
 
float gimme_edge_table (PlannerInfo *root, Gene *tour1, Gene *tour2, int num_gene, Edge *edge_table)
 
int gimme_tour (PlannerInfo *root, Edge *edge_table, Gene *new_gene, int num_gene)
 

Function Documentation

◆ alloc_edge_table()

Edge * alloc_edge_table ( PlannerInfo root,
int  num_gene 
)

Definition at line 58 of file geqo_erx.c.

59{
61
62 /*
63 * palloc one extra location so that nodes numbered 1..n can be indexed
64 * directly; 0 will not be used
65 */
66
68
69 return edge_table;
70}
#define palloc_array(type, count)
Definition fe_memutils.h:91
static int fb(int x)

References fb(), and palloc_array.

Referenced by geqo().

◆ edge_failure()

static Gene edge_failure ( PlannerInfo root,
Gene gene,
int  index,
Edge edge_table,
int  num_gene 
)
static

Definition at line 381 of file geqo_erx.c.

382{
383 int i;
385 int remaining_edges = 0;
386 int four_count = 0;
387 int rand_decision;
388
389
390 /*
391 * how many edges remain? how many gene with four total (initial) edges
392 * remain?
393 */
394
395 for (i = 1; i <= num_gene; i++)
396 {
397 if ((edge_table[i].unused_edges != -1) && (i != (int) fail_gene))
398 {
400
401 if (edge_table[i].total_edges == 4)
402 four_count++;
403 }
404 }
405
406 /*
407 * random decision of the gene with remaining edges and whose total_edges
408 * == 4
409 */
410
411 if (four_count != 0)
412 {
413
415
416 for (i = 1; i <= num_gene; i++)
417 {
418
419 if ((Gene) i != fail_gene &&
420 edge_table[i].unused_edges != -1 &&
421 edge_table[i].total_edges == 4)
422 {
423
424 four_count--;
425
427 return (Gene) i;
428 }
429 }
430
431 elog(LOG, "no edge found via random decision and total_edges == 4");
432 }
433 else if (remaining_edges != 0)
434 {
435 /* random decision of the gene with remaining edges */
437
438 for (i = 1; i <= num_gene; i++)
439 {
440
441 if ((Gene) i != fail_gene &&
442 edge_table[i].unused_edges != -1)
443 {
444
446
448 return i;
449 }
450 }
451
452 elog(LOG, "no edge found via random decision with remaining edges");
453 }
454
455 /*
456 * edge table seems to be empty; this happens sometimes on the last point
457 * due to the fact that the first point is removed from the table even
458 * though only one of its edges has been determined
459 */
460
461 else
462 { /* occurs only at the last point in the tour;
463 * simply look for the point which is not yet
464 * used */
465
466 for (i = 1; i <= num_gene; i++)
467 if (edge_table[i].unused_edges >= 0)
468 return (Gene) i;
469
470 elog(LOG, "no edge found via looking for the last unused point");
471 }
472
473
474 /* ... should never be reached */
475 elog(ERROR, "no edge found");
476 return 0; /* to keep the compiler quiet */
477}
#define LOG
Definition elog.h:32
#define ERROR
Definition elog.h:40
#define elog(elevel,...)
Definition elog.h:228
int Gene
Definition geqo_gene.h:33
int geqo_randint(PlannerInfo *root, int upper, int lower)
Definition geqo_random.c:35
int i
Definition isn.c:77
tree ctl root
Definition radixtree.h:1857
Definition type.h:97

References elog, ERROR, fb(), geqo_randint(), i, LOG, and root.

Referenced by gimme_tour().

◆ free_edge_table()

void free_edge_table ( PlannerInfo root,
Edge edge_table 
)

Definition at line 79 of file geqo_erx.c.

80{
82}
void pfree(void *pointer)
Definition mcxt.c:1619

References fb(), and pfree().

Referenced by geqo().

◆ gimme_edge()

static int gimme_edge ( PlannerInfo root,
Gene  gene1,
Gene  gene2,
Edge edge_table 
)
static

Definition at line 159 of file geqo_erx.c.

160{
161 int i;
162 int edges;
163 int city1 = (int) gene1;
164 int city2 = (int) gene2;
165
166
167 /* check whether edge city1->city2 already exists */
168 edges = edge_table[city1].total_edges;
169
170 for (i = 0; i < edges; i++)
171 {
172 if ((Gene) abs(edge_table[city1].edge_list[i]) == city2)
173 {
174
175 /* mark shared edges as negative */
176 edge_table[city1].edge_list[i] = 0 - city2;
177
178 return 0;
179 }
180 }
181
182 /* add city1->city2; */
183 edge_table[city1].edge_list[edges] = city2;
184
185 /* increment the number of edges from city1 */
186 edge_table[city1].total_edges++;
187 edge_table[city1].unused_edges++;
188
189 return 1;
190}

References fb(), and i.

Referenced by gimme_edge_table().

◆ gimme_edge_table()

float gimme_edge_table ( PlannerInfo root,
Gene tour1,
Gene tour2,
int  num_gene,
Edge edge_table 
)

Definition at line 99 of file geqo_erx.c.

101{
102 int i,
103 index1,
104 index2;
105 int edge_total; /* total number of unique edges in two genes */
106
107 /* at first clear the edge table's old data */
108 for (i = 1; i <= num_gene; i++)
109 {
110 edge_table[i].total_edges = 0;
111 edge_table[i].unused_edges = 0;
112 }
113
114 /* fill edge table with new data */
115
116 edge_total = 0;
117
118 for (index1 = 0; index1 < num_gene; index1++)
119 {
120 /*
121 * presume the tour is circular, i.e. 1->2, 2->3, 3->1 this operation
122 * maps n back to 1
123 */
124
125 index2 = (index1 + 1) % num_gene;
126
127 /*
128 * edges are bidirectional, i.e. 1->2 is same as 2->1 call gimme_edge
129 * twice per edge
130 */
131
132 edge_total += gimme_edge(root, tour1[index1], tour1[index2], edge_table);
133 gimme_edge(root, tour1[index2], tour1[index1], edge_table);
134
135 edge_total += gimme_edge(root, tour2[index1], tour2[index2], edge_table);
136 gimme_edge(root, tour2[index2], tour2[index1], edge_table);
137 }
138
139 /* return average number of edges per index */
140 return ((float) (edge_total * 2) / (float) num_gene);
141}
static int gimme_edge(PlannerInfo *root, Gene gene1, Gene gene2, Edge *edge_table)
Definition geqo_erx.c:159

References fb(), gimme_edge(), i, and root.

Referenced by geqo().

◆ gimme_gene()

static Gene gimme_gene ( PlannerInfo root,
Edge  edge,
Edge edge_table 
)
static

Definition at line 290 of file geqo_erx.c.

291{
292 int i;
293 Gene friend;
294 int minimum_edges;
295 int minimum_count = -1;
296 int rand_decision;
297
298 /*
299 * no point has edges to more than 4 other points thus, this contrived
300 * minimum will be replaced
301 */
302
303 minimum_edges = 5;
304
305 /* consider candidate destination points in edge list */
306
307 for (i = 0; i < edge.unused_edges; i++)
308 {
309 friend = (Gene) edge.edge_list[i];
310
311 /*
312 * give priority to shared edges that are negative; so return 'em
313 */
314
315 /*
316 * negative values are caught here so we need not worry about
317 * converting to absolute values
318 */
319 if (friend < 0)
320 return (Gene) abs(friend);
321
322
323 /*
324 * give priority to candidates with fewest remaining unused edges;
325 * find out what the minimum number of unused edges is
326 * (minimum_edges); if there is more than one candidate with the
327 * minimum number of unused edges keep count of this number
328 * (minimum_count);
329 */
330
331 /*
332 * The test for minimum_count can probably be removed at some point
333 * but comments should probably indicate exactly why it is guaranteed
334 * that the test will always succeed the first time around. If it can
335 * fail then the code is in error
336 */
337
338
339 if (edge_table[(int) friend].unused_edges < minimum_edges)
340 {
341 minimum_edges = edge_table[(int) friend].unused_edges;
342 minimum_count = 1;
343 }
344 else if (minimum_count == -1)
345 elog(ERROR, "minimum_count not set");
346 else if (edge_table[(int) friend].unused_edges == minimum_edges)
348 } /* for (i=0; i<edge.unused_edges; i++) */
349
350
351 /* random decision of the possible candidates to use */
353
354
355 for (i = 0; i < edge.unused_edges; i++)
356 {
357 friend = (Gene) edge.edge_list[i];
358
359 /* return the chosen candidate point */
360 if (edge_table[(int) friend].unused_edges == minimum_edges)
361 {
363
365 return friend;
366 }
367 }
368
369 /* ... should never be reached */
370 elog(ERROR, "neither shared nor minimum number nor random edge found");
371 return 0; /* to keep the compiler quiet */
372}

References elog, ERROR, fb(), geqo_randint(), i, and root.

Referenced by gimme_tour().

◆ gimme_tour()

int gimme_tour ( PlannerInfo root,
Edge edge_table,
Gene new_gene,
int  num_gene 
)

Definition at line 202 of file geqo_erx.c.

203{
204 int i;
205 int edge_failures = 0;
206
207 /* choose int between 1 and num_gene */
209
210 for (i = 1; i < num_gene; i++)
211 {
212 /*
213 * as each point is entered into the tour, remove it from the edge
214 * table
215 */
216
218
219 /* find destination for the newly entered point */
220
221 if (edge_table[new_gene[i - 1]].unused_edges > 0)
223
224 else
225 { /* cope with fault */
227
229 }
230
231 /* mark this node as incorporated */
232 edge_table[(int) new_gene[i - 1]].unused_edges = -1;
233 } /* for (i=1; i<num_gene; i++) */
234
235 return edge_failures;
236}
static Gene gimme_gene(PlannerInfo *root, Edge edge, Edge *edge_table)
Definition geqo_erx.c:290
static Gene edge_failure(PlannerInfo *root, Gene *gene, int index, Edge *edge_table, int num_gene)
Definition geqo_erx.c:381
static void remove_gene(PlannerInfo *root, Gene gene, Edge edge, Edge *edge_table)
Definition geqo_erx.c:247

References edge_failure(), fb(), geqo_randint(), gimme_gene(), i, remove_gene(), and root.

Referenced by geqo().

◆ remove_gene()

static void remove_gene ( PlannerInfo root,
Gene  gene,
Edge  edge,
Edge edge_table 
)
static

Definition at line 247 of file geqo_erx.c.

248{
249 int i,
250 j;
251 int possess_edge;
252 int genes_remaining;
253
254 /*
255 * do for every gene known to have an edge to input gene (i.e. in
256 * edge_list for input edge)
257 */
258
259 for (i = 0; i < edge.unused_edges; i++)
260 {
261 possess_edge = abs(edge.edge_list[i]);
263
264 /* find the input gene in all edge_lists and delete it */
265 for (j = 0; j < genes_remaining; j++)
266 {
267
268 if ((Gene) abs(edge_table[possess_edge].edge_list[j]) == gene)
269 {
270
271 edge_table[possess_edge].unused_edges--;
272
273 edge_table[possess_edge].edge_list[j] =
275
276 break;
277 }
278 }
279 }
280}
int j
Definition isn.c:78

References fb(), i, and j.

Referenced by gimme_tour().