LCOV - code coverage report
Current view: top level - src/backend/optimizer/geqo - geqo_recombination.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 100.0 % 9 9
Test Date: 2026-03-04 00:14:49 Functions: 100.0 % 1 1
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*------------------------------------------------------------------------
       2              : *
       3              : * geqo_recombination.c
       4              : *    misc recombination procedures
       5              : *
       6              : * src/backend/optimizer/geqo/geqo_recombination.c
       7              : *
       8              : *-------------------------------------------------------------------------
       9              : */
      10              : 
      11              : /* contributed by:
      12              :    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
      13              :    *  Martin Utesch              * Institute of Automatic Control      *
      14              :    =                             = University of Mining and Technology =
      15              :    *  utesch@aut.tu-freiberg.de  * Freiberg, Germany                   *
      16              :    =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=
      17              :  */
      18              : 
      19              : /* -- parts of this are adapted from D. Whitley's Genitor algorithm -- */
      20              : 
      21              : #include "postgres.h"
      22              : 
      23              : #include "optimizer/geqo_random.h"
      24              : #include "optimizer/geqo_recombination.h"
      25              : 
      26              : 
      27              : /*
      28              :  * init_tour
      29              :  *
      30              :  *   Randomly generates a legal "traveling salesman" tour
      31              :  *   (i.e. where each point is visited only once.)
      32              :  */
      33              : void
      34         1092 : init_tour(PlannerInfo *root, Gene *tour, int num_gene)
      35              : {
      36              :     int         i,
      37              :                 j;
      38              : 
      39              :     /*
      40              :      * We must fill the tour[] array with a random permutation of the numbers
      41              :      * 1 .. num_gene.  We can do that in one pass using the "inside-out"
      42              :      * variant of the Fisher-Yates shuffle algorithm.  Notionally, we append
      43              :      * each new value to the array and then swap it with a randomly-chosen
      44              :      * array element (possibly including itself, else we fail to generate
      45              :      * permutations with the last city last).  The swap step can be optimized
      46              :      * by combining it with the insertion.
      47              :      */
      48         1092 :     if (num_gene > 0)
      49         1092 :         tour[0] = (Gene) 1;
      50              : 
      51         2760 :     for (i = 1; i < num_gene; i++)
      52              :     {
      53         1668 :         j = geqo_randint(root, i, 0);
      54              :         /* i != j check avoids fetching uninitialized array element */
      55         1668 :         if (i != j)
      56          960 :             tour[i] = tour[j];
      57         1668 :         tour[j] = (Gene) (i + 1);
      58              :     }
      59         1092 : }
      60              : 
      61              : /* city table is used in these recombination methods: */
      62              : #if defined(CX) || defined(PX) || defined(OX1) || defined(OX2)
      63              : 
      64              : /* alloc_city_table
      65              :  *
      66              :  *   allocate memory for city table
      67              :  */
      68              : City *
      69              : alloc_city_table(PlannerInfo *root, int num_gene)
      70              : {
      71              :     City       *city_table;
      72              : 
      73              :     /*
      74              :      * palloc one extra location so that nodes numbered 1..n can be indexed
      75              :      * directly; 0 will not be used
      76              :      */
      77              :     city_table = palloc_array(City, num_gene + 1);
      78              : 
      79              :     return city_table;
      80              : }
      81              : 
      82              : /* free_city_table
      83              :  *
      84              :  *    deallocate memory of city table
      85              :  */
      86              : void
      87              : free_city_table(PlannerInfo *root, City * city_table)
      88              : {
      89              :     pfree(city_table);
      90              : }
      91              : 
      92              : #endif                          /* CX || PX || OX1 || OX2 */
        

Generated by: LCOV version 2.0-1