Blame permutation/test.c

Packit 67cb25
/* permutation/test.c
Packit 67cb25
 * 
Packit 67cb25
 * Copyright (C) 2000, 2007 Brian Gough
Packit 67cb25
 * 
Packit 67cb25
 * This program is free software; you can redistribute it and/or modify
Packit 67cb25
 * it under the terms of the GNU General Public License as published by
Packit 67cb25
 * the Free Software Foundation; either version 3 of the License, or (at
Packit 67cb25
 * your option) any later version.
Packit 67cb25
 * 
Packit 67cb25
 * This program is distributed in the hope that it will be useful, but
Packit 67cb25
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 67cb25
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 67cb25
 * General Public License for more details.
Packit 67cb25
 * 
Packit 67cb25
 * You should have received a copy of the GNU General Public License
Packit 67cb25
 * along with this program; if not, write to the Free Software
Packit 67cb25
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit 67cb25
 */
Packit 67cb25
Packit 67cb25
#include <config.h>
Packit 67cb25
#include <stdlib.h>
Packit 67cb25
#include <stdio.h>
Packit 67cb25
#include <math.h>
Packit 67cb25
#include <gsl/gsl_permutation.h>
Packit 67cb25
#include <gsl/gsl_permute_double.h>
Packit 67cb25
#include <gsl/gsl_test.h>
Packit 67cb25
#include <gsl/gsl_ieee_utils.h>
Packit 67cb25
Packit 67cb25
unsigned int p5[120][5] = {
Packit 67cb25
  {0, 1, 2, 3, 4}, {0, 1, 2, 4, 3}, {0, 1, 3, 2, 4}, {0, 1, 3, 4, 2},
Packit 67cb25
  {0, 1, 4, 2, 3}, {0, 1, 4, 3, 2}, {0, 2, 1, 3, 4}, {0, 2, 1, 4, 3},
Packit 67cb25
  {0, 2, 3, 1, 4}, {0, 2, 3, 4, 1}, {0, 2, 4, 1, 3}, {0, 2, 4, 3, 1},
Packit 67cb25
  {0, 3, 1, 2, 4}, {0, 3, 1, 4, 2}, {0, 3, 2, 1, 4}, {0, 3, 2, 4, 1},
Packit 67cb25
  {0, 3, 4, 1, 2}, {0, 3, 4, 2, 1}, {0, 4, 1, 2, 3}, {0, 4, 1, 3, 2},
Packit 67cb25
  {0, 4, 2, 1, 3}, {0, 4, 2, 3, 1}, {0, 4, 3, 1, 2}, {0, 4, 3, 2, 1},
Packit 67cb25
  {1, 0, 2, 3, 4}, {1, 0, 2, 4, 3}, {1, 0, 3, 2, 4}, {1, 0, 3, 4, 2},
Packit 67cb25
  {1, 0, 4, 2, 3}, {1, 0, 4, 3, 2}, {1, 2, 0, 3, 4}, {1, 2, 0, 4, 3},
Packit 67cb25
  {1, 2, 3, 0, 4}, {1, 2, 3, 4, 0}, {1, 2, 4, 0, 3}, {1, 2, 4, 3, 0},
Packit 67cb25
  {1, 3, 0, 2, 4}, {1, 3, 0, 4, 2}, {1, 3, 2, 0, 4}, {1, 3, 2, 4, 0},
Packit 67cb25
  {1, 3, 4, 0, 2}, {1, 3, 4, 2, 0}, {1, 4, 0, 2, 3}, {1, 4, 0, 3, 2},
Packit 67cb25
  {1, 4, 2, 0, 3}, {1, 4, 2, 3, 0}, {1, 4, 3, 0, 2}, {1, 4, 3, 2, 0},
Packit 67cb25
  {2, 0, 1, 3, 4}, {2, 0, 1, 4, 3}, {2, 0, 3, 1, 4}, {2, 0, 3, 4, 1},
Packit 67cb25
  {2, 0, 4, 1, 3}, {2, 0, 4, 3, 1}, {2, 1, 0, 3, 4}, {2, 1, 0, 4, 3},
Packit 67cb25
  {2, 1, 3, 0, 4}, {2, 1, 3, 4, 0}, {2, 1, 4, 0, 3}, {2, 1, 4, 3, 0},
Packit 67cb25
  {2, 3, 0, 1, 4}, {2, 3, 0, 4, 1}, {2, 3, 1, 0, 4}, {2, 3, 1, 4, 0},
Packit 67cb25
  {2, 3, 4, 0, 1}, {2, 3, 4, 1, 0}, {2, 4, 0, 1, 3}, {2, 4, 0, 3, 1},
Packit 67cb25
  {2, 4, 1, 0, 3}, {2, 4, 1, 3, 0}, {2, 4, 3, 0, 1}, {2, 4, 3, 1, 0},
Packit 67cb25
  {3, 0, 1, 2, 4}, {3, 0, 1, 4, 2}, {3, 0, 2, 1, 4}, {3, 0, 2, 4, 1},
Packit 67cb25
  {3, 0, 4, 1, 2}, {3, 0, 4, 2, 1}, {3, 1, 0, 2, 4}, {3, 1, 0, 4, 2},
Packit 67cb25
  {3, 1, 2, 0, 4}, {3, 1, 2, 4, 0}, {3, 1, 4, 0, 2}, {3, 1, 4, 2, 0},
Packit 67cb25
  {3, 2, 0, 1, 4}, {3, 2, 0, 4, 1}, {3, 2, 1, 0, 4}, {3, 2, 1, 4, 0},
Packit 67cb25
  {3, 2, 4, 0, 1}, {3, 2, 4, 1, 0}, {3, 4, 0, 1, 2}, {3, 4, 0, 2, 1},
Packit 67cb25
  {3, 4, 1, 0, 2}, {3, 4, 1, 2, 0}, {3, 4, 2, 0, 1}, {3, 4, 2, 1, 0},
Packit 67cb25
  {4, 0, 1, 2, 3}, {4, 0, 1, 3, 2}, {4, 0, 2, 1, 3}, {4, 0, 2, 3, 1},
Packit 67cb25
  {4, 0, 3, 1, 2}, {4, 0, 3, 2, 1}, {4, 1, 0, 2, 3}, {4, 1, 0, 3, 2},
Packit 67cb25
  {4, 1, 2, 0, 3}, {4, 1, 2, 3, 0}, {4, 1, 3, 0, 2}, {4, 1, 3, 2, 0},
Packit 67cb25
  {4, 2, 0, 1, 3}, {4, 2, 0, 3, 1}, {4, 2, 1, 0, 3}, {4, 2, 1, 3, 0},
Packit 67cb25
  {4, 2, 3, 0, 1}, {4, 2, 3, 1, 0}, {4, 3, 0, 1, 2}, {4, 3, 0, 2, 1},
Packit 67cb25
  {4, 3, 1, 0, 2}, {4, 3, 1, 2, 0}, {4, 3, 2, 0, 1}, {4, 3, 2, 1, 0}
Packit 67cb25
} ;
Packit 67cb25
Packit 67cb25
unsigned int c5[120][5] = {
Packit 67cb25
  {4, 3, 2, 1, 0}, {3, 4, 2, 1, 0}, {4, 2, 3, 1, 0}, {2, 3, 4, 1, 0},
Packit 67cb25
  {2, 4, 3, 1, 0}, {3, 2, 4, 1, 0}, {4, 3, 1, 2, 0}, {3, 4, 1, 2, 0},
Packit 67cb25
  {4, 1, 2, 3, 0}, {1, 2, 3, 4, 0}, {1, 2, 4, 3, 0}, {3, 1, 2, 4, 0},
Packit 67cb25
  {4, 1, 3, 2, 0}, {1, 3, 4, 2, 0}, {4, 2, 1, 3, 0}, {2, 1, 3, 4, 0},
Packit 67cb25
  {2, 4, 1, 3, 0}, {1, 3, 2, 4, 0}, {1, 4, 3, 2, 0}, {3, 1, 4, 2, 0},
Packit 67cb25
  {2, 1, 4, 3, 0}, {3, 2, 1, 4, 0}, {1, 4, 2, 3, 0}, {2, 3, 1, 4, 0},
Packit 67cb25
  {4, 3, 2, 0, 1}, {3, 4, 2, 0, 1}, {4, 2, 3, 0, 1}, {2, 3, 4, 0, 1},
Packit 67cb25
  {2, 4, 3, 0, 1}, {3, 2, 4, 0, 1}, {4, 3, 0, 1, 2}, {3, 4, 0, 1, 2},
Packit 67cb25
  {4, 0, 1, 2, 3}, {0, 1, 2, 3, 4}, {0, 1, 2, 4, 3}, {3, 0, 1, 2, 4},
Packit 67cb25
  {4, 0, 1, 3, 2}, {0, 1, 3, 4, 2}, {4, 2, 0, 1, 3}, {2, 0, 1, 3, 4},
Packit 67cb25
  {2, 4, 0, 1, 3}, {0, 1, 3, 2, 4}, {0, 1, 4, 3, 2}, {3, 0, 1, 4, 2},
Packit 67cb25
  {2, 0, 1, 4, 3}, {3, 2, 0, 1, 4}, {0, 1, 4, 2, 3}, {2, 3, 0, 1, 4},
Packit 67cb25
  {4, 3, 0, 2, 1}, {3, 4, 0, 2, 1}, {4, 0, 2, 3, 1}, {0, 2, 3, 4, 1},
Packit 67cb25
  {0, 2, 4, 3, 1}, {3, 0, 2, 4, 1}, {4, 3, 1, 0, 2}, {3, 4, 1, 0, 2},
Packit 67cb25
  {4, 1, 0, 2, 3}, {1, 0, 2, 3, 4}, {1, 0, 2, 4, 3}, {3, 1, 0, 2, 4},
Packit 67cb25
  {4, 1, 3, 0, 2}, {1, 3, 4, 0, 2}, {4, 0, 2, 1, 3}, {0, 2, 1, 3, 4},
Packit 67cb25
  {0, 2, 4, 1, 3}, {1, 3, 0, 2, 4}, {1, 4, 3, 0, 2}, {3, 1, 4, 0, 2},
Packit 67cb25
  {0, 2, 1, 4, 3}, {3, 0, 2, 1, 4}, {1, 4, 0, 2, 3}, {0, 2, 3, 1, 4},
Packit 67cb25
  {4, 0, 3, 2, 1}, {0, 3, 4, 2, 1}, {4, 2, 0, 3, 1}, {2, 0, 3, 4, 1},
Packit 67cb25
  {2, 4, 0, 3, 1}, {0, 3, 2, 4, 1}, {4, 1, 0, 3, 2}, {1, 0, 3, 4, 2},
Packit 67cb25
  {4, 2, 1, 0, 3}, {2, 1, 0, 3, 4}, {2, 4, 1, 0, 3}, {1, 0, 3, 2, 4},
Packit 67cb25
  {4, 0, 3, 1, 2}, {0, 3, 4, 1, 2}, {4, 1, 2, 0, 3}, {1, 2, 0, 3, 4},
Packit 67cb25
  {1, 2, 4, 0, 3}, {0, 3, 1, 2, 4}, {0, 3, 1, 4, 2}, {1, 4, 0, 3, 2},
Packit 67cb25
  {1, 4, 2, 0, 3}, {0, 3, 2, 1, 4}, {2, 1, 4, 0, 3}, {2, 0, 3, 1, 4},
Packit 67cb25
  {0, 4, 3, 2, 1}, {3, 0, 4, 2, 1}, {2, 0, 4, 3, 1}, {3, 2, 0, 4, 1},
Packit 67cb25
  {0, 4, 2, 3, 1}, {2, 3, 0, 4, 1}, {1, 0, 4, 3, 2}, {3, 1, 0, 4, 2},
Packit 67cb25
  {2, 1, 0, 4, 3}, {3, 2, 1, 0, 4}, {1, 0, 4, 2, 3}, {2, 3, 1, 0, 4},
Packit 67cb25
  {0, 4, 3, 1, 2}, {3, 0, 4, 1, 2}, {1, 2, 0, 4, 3}, {3, 1, 2, 0, 4},
Packit 67cb25
  {0, 4, 1, 2, 3}, {1, 2, 3, 0, 4}, {1, 3, 0, 4, 2}, {0, 4, 1, 3, 2},
Packit 67cb25
  {0, 4, 2, 1, 3}, {1, 3, 2, 0, 4}, {2, 0, 4, 1, 3}, {2, 1, 3, 0, 4}
Packit 67cb25
} ;
Packit 67cb25
Packit 67cb25
unsigned int cycles[120] = {
Packit 67cb25
  5, 4, 4, 3, 3, 4, 4, 3, 3, 2,
Packit 67cb25
  2, 3, 3, 2, 4, 3, 3, 2, 2, 3,
Packit 67cb25
  3, 4, 2, 3, 4, 3, 3, 2, 2, 3,
Packit 67cb25
  3, 2, 2, 1, 1, 2, 2, 1, 3, 2,
Packit 67cb25
  2, 1, 1, 2, 2, 3, 1, 2, 3, 2,
Packit 67cb25
  2, 1, 1, 2, 4, 3, 3, 2, 2, 3,
Packit 67cb25
  3, 2, 2, 1, 1, 2, 2, 3, 1, 2,
Packit 67cb25
  2, 1, 2, 1, 3, 2, 2, 1, 3, 2,
Packit 67cb25
  4, 3, 3, 2, 2, 1, 3, 2, 2, 1,
Packit 67cb25
  1, 2, 2, 1, 3, 2, 1, 2, 2, 3,
Packit 67cb25
  1, 2, 2, 3, 3, 4, 2, 3, 1, 2,
Packit 67cb25
  2, 3, 1, 2, 2, 1, 1, 2, 2, 3
Packit 67cb25
} ;
Packit 67cb25
Packit 67cb25
unsigned int inversions[120] = {
Packit 67cb25
  0, 1, 1, 2, 2, 3, 1, 2, 2, 3,
Packit 67cb25
  3, 4, 2, 3, 3, 4, 4, 5, 3, 4,
Packit 67cb25
  4, 5, 5, 6, 1, 2, 2, 3, 3, 4,
Packit 67cb25
  2, 3, 3, 4, 4, 5, 3, 4, 4, 5,
Packit 67cb25
  5, 6, 4, 5, 5, 6, 6, 7, 2, 3,
Packit 67cb25
  3, 4, 4, 5, 3, 4, 4, 5, 5, 6,
Packit 67cb25
  4, 5, 5, 6, 6, 7, 5, 6, 6, 7,
Packit 67cb25
  7, 8, 3, 4, 4, 5, 5, 6, 4, 5,
Packit 67cb25
  5, 6, 6, 7, 5, 6, 6, 7, 7, 8,
Packit 67cb25
  6, 7, 7, 8, 8, 9, 4, 5, 5, 6,
Packit 67cb25
  6, 7, 5, 6, 6, 7, 7, 8, 6, 7,
Packit 67cb25
  7, 8, 8, 9, 7, 8, 8, 9, 9, 10
Packit 67cb25
} ;
Packit 67cb25
Packit 67cb25
int 
Packit 67cb25
main (void)
Packit 67cb25
{
Packit 67cb25
  gsl_ieee_env_setup ();
Packit 67cb25
Packit 67cb25
  {
Packit 67cb25
    int i = 0, j, status = 0;
Packit 67cb25
  
Packit 67cb25
    gsl_permutation * p ;
Packit 67cb25
    
Packit 67cb25
    p = gsl_permutation_alloc (5);
Packit 67cb25
    
Packit 67cb25
    gsl_permutation_init (p);
Packit 67cb25
    
Packit 67cb25
    do 
Packit 67cb25
      {
Packit 67cb25
        for (j = 0; j < 5; j++)
Packit 67cb25
          {
Packit 67cb25
            status |= (p->data[j] != p5[i][j]);
Packit 67cb25
          }
Packit 67cb25
        
Packit 67cb25
        i++;
Packit 67cb25
      }
Packit 67cb25
    while (gsl_permutation_next(p) == GSL_SUCCESS);
Packit 67cb25
    
Packit 67cb25
    gsl_test(status, "gsl_permutation_next, 5-th order permutation, 120 steps");
Packit 67cb25
Packit 67cb25
    do 
Packit 67cb25
      {
Packit 67cb25
        i--;
Packit 67cb25
        
Packit 67cb25
        for (j = 0; j < 5; j++)
Packit 67cb25
          {
Packit 67cb25
            status |= (p->data[j] != p5[i][j]);
Packit 67cb25
          }
Packit 67cb25
      }
Packit 67cb25
    while (gsl_permutation_prev(p) == GSL_SUCCESS);
Packit 67cb25
    
Packit 67cb25
    gsl_test(status, "gsl_permutation_prev, 5-th order permutation, 120 steps");
Packit 67cb25
    
Packit 67cb25
    gsl_permutation_free (p);
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
#ifdef JUNK
Packit 67cb25
  {
Packit 67cb25
    int i;
Packit 67cb25
    int status = 0 ;
Packit 67cb25
Packit 67cb25
    gsl_permutation * p1 = gsl_permutation_alloc (5);
Packit 67cb25
    gsl_permutation * p2 = gsl_permutation_alloc (5);
Packit 67cb25
    gsl_permutation * p = gsl_permutation_alloc (5);
Packit 67cb25
Packit 67cb25
    double v[5] = { 100.0, 101.0, 102.0, 103.0, 104.0 } ;
Packit 67cb25
Packit 67cb25
    gsl_permutation_init (p1);
Packit 67cb25
Packit 67cb25
    do 
Packit 67cb25
      {
Packit 67cb25
        gsl_permutation_init (p2);
Packit 67cb25
Packit 67cb25
        do 
Packit 67cb25
          {
Packit 67cb25
            double x[5], y[5];
Packit 67cb25
Packit 67cb25
            /* Compute x= p1 p2 v */
Packit 67cb25
            memcpy (x, v, 5 * sizeof(double));
Packit 67cb25
            gsl_permute (p2->data, x, 1, 5);
Packit 67cb25
            gsl_permute (p1->data, x, 1, 5);
Packit 67cb25
Packit 67cb25
            /* Compute P= p1 p2, y = P v */
Packit 67cb25
            gsl_permutation_mul (p, p1, p2);
Packit 67cb25
            memcpy (y, v, 5 * sizeof(double));
Packit 67cb25
            gsl_permute (p->data, y, 1, 5);
Packit 67cb25
Packit 67cb25
            for (i = 0; i < 5; i++) 
Packit 67cb25
              {
Packit 67cb25
                if (x[i] != y[i]) 
Packit 67cb25
                  status = 1;
Packit 67cb25
              }
Packit 67cb25
Packit 67cb25
            if (status == 1)
Packit 67cb25
              break;
Packit 67cb25
          }
Packit 67cb25
        while (gsl_permutation_next(p2) == GSL_SUCCESS);
Packit 67cb25
        
Packit 67cb25
        if (status == 1)
Packit 67cb25
          break;
Packit 67cb25
      }
Packit 67cb25
    while (gsl_permutation_next(p1) == GSL_SUCCESS);
Packit 67cb25
    
Packit 67cb25
    gsl_permutation_free (p1);
Packit 67cb25
    gsl_permutation_free (p2);
Packit 67cb25
    gsl_permutation_free (p);
Packit 67cb25
Packit 67cb25
    gsl_test(status, "gsl_permutation_mul, all 5-th order combinations");
Packit 67cb25
  }
Packit 67cb25
#endif
Packit 67cb25
Packit 67cb25
  /* testing cycles representations */
Packit 67cb25
  {
Packit 67cb25
    int i = 0, j, status = 0;
Packit 67cb25
Packit 67cb25
    gsl_permutation * p = gsl_permutation_alloc (5);
Packit 67cb25
Packit 67cb25
    gsl_permutation * plin = gsl_permutation_alloc (5);
Packit 67cb25
    gsl_permutation * pcan = gsl_permutation_alloc (5);
Packit 67cb25
    
Packit 67cb25
    gsl_permutation_init (p);
Packit 67cb25
    
Packit 67cb25
    do
Packit 67cb25
      {
Packit 67cb25
        gsl_permutation_memcpy (plin, p);
Packit 67cb25
Packit 67cb25
        for (j = 0; j < 5; j++)
Packit 67cb25
          {
Packit 67cb25
            pcan->data[j] = 0;
Packit 67cb25
          }
Packit 67cb25
Packit 67cb25
        gsl_permutation_linear_to_canonical (pcan, plin);
Packit 67cb25
Packit 67cb25
        for (j = 0; j < 5; j++)
Packit 67cb25
          {
Packit 67cb25
            status |= (pcan->data[j] != c5[i][j]);
Packit 67cb25
          }
Packit 67cb25
Packit 67cb25
        status |= (gsl_permutation_canonical_cycles (pcan) != cycles[i]);
Packit 67cb25
Packit 67cb25
        status |= (gsl_permutation_linear_cycles (plin) != cycles[i]);
Packit 67cb25
Packit 67cb25
        for (j = 0; j < 5; j++)
Packit 67cb25
          {
Packit 67cb25
            plin->data[j] = 0;
Packit 67cb25
          }
Packit 67cb25
Packit 67cb25
        gsl_permutation_canonical_to_linear (plin, pcan);
Packit 67cb25
                
Packit 67cb25
        for (j = 0; j < 5; j++)
Packit 67cb25
          {
Packit 67cb25
            status |= (plin->data[j] != p5[i][j]);
Packit 67cb25
          }
Packit 67cb25
Packit 67cb25
        i++;
Packit 67cb25
      }
Packit 67cb25
    while (gsl_permutation_next(p) == GSL_SUCCESS);
Packit 67cb25
Packit 67cb25
    gsl_permutation_free (p);
Packit 67cb25
    gsl_permutation_free (plin);
Packit 67cb25
    gsl_permutation_free (pcan);
Packit 67cb25
Packit 67cb25
    gsl_test (status, "gsl_permutation canonical conversion, 5-th order permutation, 120 steps");
Packit 67cb25
  }
Packit 67cb25
Packit 67cb25
  /* testing number of inversions */
Packit 67cb25
  {
Packit 67cb25
    int i = 0, status = 0;
Packit 67cb25
Packit 67cb25
    gsl_permutation * p = gsl_permutation_alloc (5);
Packit 67cb25
Packit 67cb25
    gsl_permutation_init (p);
Packit 67cb25
    
Packit 67cb25
    do 
Packit 67cb25
      { 
Packit 67cb25
        status |= gsl_permutation_inversions (p) != inversions[i];
Packit 67cb25
        i++;
Packit 67cb25
      }
Packit 67cb25
    while (gsl_permutation_next(p) == GSL_SUCCESS);
Packit 67cb25
    
Packit 67cb25
    gsl_permutation_free (p);
Packit 67cb25
Packit 67cb25
    gsl_test (status, "gsl_permutation_inversions, 5-th order permutation, 120 steps");
Packit 67cb25
  }
Packit 67cb25
  
Packit 67cb25
Packit 67cb25
  exit (gsl_test_summary());
Packit 67cb25
}
Packit 67cb25