3 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2007 Thomas Walter, Brian Gough
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 3 of the License, or (at
8 * your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 void TYPE (test_sort_vector) (size_t N, size_t stride);
21 void FUNCTION (my, initialize) (TYPE (gsl_vector) * v);
22 void FUNCTION (my, randomize) (TYPE (gsl_vector) * v);
23 int FUNCTION (my, check) (TYPE (gsl_vector) * data, TYPE (gsl_vector) * orig);
24 int FUNCTION (my, pcheck) (gsl_permutation * p, TYPE (gsl_vector) * data, TYPE (gsl_vector) * orig);
25 int FUNCTION (my, scheck) (BASE * x, size_t k, TYPE (gsl_vector) * data);
26 int FUNCTION (my, lcheck) (BASE * x, size_t k, TYPE (gsl_vector) * data);
27 int FUNCTION (my, sicheck) (size_t * p, size_t k, gsl_permutation * perm,
28 TYPE (gsl_vector) * data);
29 int FUNCTION (my, licheck) (size_t * p, size_t k, gsl_permutation * perm,
30 TYPE (gsl_vector) * data);
33 TYPE (test_sort_vector) (size_t N, size_t stride)
38 TYPE (gsl_block) * b1 = FUNCTION (gsl_block, calloc) (N * stride);
39 TYPE (gsl_block) * b2 = FUNCTION (gsl_block, calloc) (N * stride);
40 TYPE (gsl_block) * b3 = FUNCTION (gsl_block, calloc) (N * stride);
42 TYPE (gsl_vector) * orig = FUNCTION (gsl_vector, alloc_from_block) (b1, 0, N, stride);
43 TYPE (gsl_vector) * data = FUNCTION (gsl_vector, alloc_from_block) (b2, 0, N, stride);
44 TYPE (gsl_vector) * data2 = FUNCTION (gsl_vector, alloc_from_block) (b3, 0, N, stride);
46 BASE * small = malloc(k * sizeof(BASE));
47 BASE * large = malloc(k * sizeof(BASE));
48 size_t * index = malloc(k * sizeof(size_t));
50 gsl_permutation *p = gsl_permutation_alloc (N);
52 FUNCTION (my, initialize) (orig);
55 FUNCTION (gsl_vector, memcpy) (data, orig);
57 status = FUNCTION (gsl_sort_vector, index) (p, data);
58 status |= FUNCTION (my, pcheck) (p, data, orig);
59 gsl_test (status, "indexing " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
61 TYPE (gsl_sort_vector) (data);
62 status = FUNCTION (my, check) (data, orig);
63 gsl_test (status, "sorting, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
65 FUNCTION (gsl_sort_vector, smallest) (small, k, data);
66 status = FUNCTION (my, scheck) (small, k, orig);
67 gsl_test (status, "smallest, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
69 FUNCTION (gsl_sort_vector, largest) (large, k, data);
70 status = FUNCTION (my, lcheck) (large, k, orig);
71 gsl_test (status, "largest, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
73 FUNCTION (gsl_sort_vector, smallest_index) (index, k, data);
74 status = FUNCTION (my, sicheck) (index, k, p, data);
75 gsl_test (status, "smallest index, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
77 FUNCTION (gsl_sort_vector, largest_index) (index, k, data);
78 status = FUNCTION (my, licheck) (index, k, p, data);
79 gsl_test (status, "largest index, " NAME (gsl_vector) ", n = %u, stride = %u, ordered", N, stride);
81 /* Reverse the data */
83 FUNCTION (gsl_vector, memcpy) (data, orig);
84 FUNCTION (gsl_vector, reverse) (data);
86 status = FUNCTION (gsl_sort_vector, index) (p, data);
87 status |= FUNCTION (my, pcheck) (p, data, orig);
88 gsl_test (status, "indexing " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
90 TYPE (gsl_sort_vector) (data);
91 status = FUNCTION (my, check) (data, orig);
92 gsl_test (status, "sorting, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
94 FUNCTION (gsl_vector, memcpy) (data, orig);
95 FUNCTION (gsl_vector, reverse) (data);
97 FUNCTION (gsl_sort_vector, smallest) (small, k, data);
98 status = FUNCTION (my, scheck) (small, k, orig);
99 gsl_test (status, "smallest, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
101 FUNCTION (gsl_sort_vector, largest) (large, k, data);
102 status = FUNCTION (my, lcheck) (large, k, orig);
103 gsl_test (status, "largest, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
105 FUNCTION (gsl_sort_vector, smallest_index) (index, k, data);
106 status = FUNCTION (my, sicheck) (index, k, p, data);
107 gsl_test (status, "smallest index, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
109 FUNCTION (gsl_sort_vector, largest_index) (index, k, data);
110 status = FUNCTION (my, licheck) (index, k, p, data);
111 gsl_test (status, "largest index, " NAME (gsl_vector) ", n = %u, stride = %u, reversed", N, stride);
113 /* Perform some shuffling */
115 FUNCTION (gsl_vector, memcpy) (data, orig);
116 FUNCTION (my, randomize) (data);
117 FUNCTION (gsl_vector, memcpy) (data2, data);
119 status = FUNCTION (gsl_sort_vector, index) (p, data);
120 status |= FUNCTION (my, pcheck) (p, data, orig);
121 gsl_test (status, "indexing " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
123 TYPE (gsl_sort_vector) (data);
124 status = FUNCTION (my, check) (data, orig);
125 gsl_test (status, "sorting, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
127 FUNCTION (gsl_vector, memcpy) (data, data2);
129 FUNCTION (gsl_sort_vector, smallest) (small, k, data);
130 status = FUNCTION (my, scheck) (small, k, orig);
131 gsl_test (status, "smallest, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
133 FUNCTION (gsl_sort_vector, largest) (large, k, data);
134 status = FUNCTION (my, lcheck) (large, k, orig);
135 gsl_test (status, "largest, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
137 FUNCTION (gsl_sort_vector, smallest_index) (index, k, data);
138 status = FUNCTION (my, sicheck) (index, k, p, data);
139 gsl_test (status, "smallest index, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
141 FUNCTION (gsl_sort_vector, largest_index) (index, k, data);
142 status = FUNCTION (my, licheck) (index, k, p, data);
143 gsl_test (status, "largest index, " NAME (gsl_vector) ", n = %u, stride = %u, randomized", N, stride);
145 FUNCTION (gsl_vector, free) (orig);
146 FUNCTION (gsl_vector, free) (data);
147 FUNCTION (gsl_vector, free) (data2);
148 FUNCTION (gsl_block, free) (b1);
149 FUNCTION (gsl_block, free) (b2);
150 FUNCTION (gsl_block, free) (b3);
151 gsl_permutation_free (p);
159 FUNCTION (my, initialize) (TYPE (gsl_vector) * v)
165 /* Must be sorted initially */
167 for (i = 0; i < v->size; i++)
171 /* Prevent overflow */
173 FUNCTION (gsl_vector, set) (v, i, k);
178 FUNCTION (my, randomize) (TYPE (gsl_vector) * v)
182 for (i = 0; i < v->size; i++)
184 size_t j = urand (v->size);
185 FUNCTION (gsl_vector, swap_elements) (v, i, j);
190 FUNCTION (my, check) (TYPE (gsl_vector) * data, TYPE (gsl_vector) * orig)
194 for (i = 0; i < data->size; i++)
196 if (FUNCTION (gsl_vector, get) (data, i) != FUNCTION (gsl_vector, get) (orig, i))
200 for (j = 0 ; j < data->size; j++) {
201 printf("%u: " OUT_FORMAT " " OUT_FORMAT " %c\n", j,
202 FUNCTION (gsl_vector, get) (data, j),
203 FUNCTION (gsl_vector, get) (orig, j),
204 (i == j) ? '*' : ' ');
216 FUNCTION (my, pcheck) (gsl_permutation * p, TYPE (gsl_vector) * data, TYPE (gsl_vector) * orig)
220 for (i = 0; i < p->size; i++)
222 if (FUNCTION (gsl_vector, get) (data, p->data[i]) != FUNCTION (gsl_vector, get) (orig, i))
232 FUNCTION (my, scheck) (BASE * x, size_t k, TYPE (gsl_vector) * data)
236 for (i = 0; i < k; i++)
238 if (x[i] != FUNCTION (gsl_vector, get) (data, i))
250 FUNCTION (my, lcheck) (BASE * x, size_t k, TYPE (gsl_vector) * data)
254 for (i = 0; i < k; i++)
256 if (x[i] != FUNCTION (gsl_vector, get) (data, data->size - i - 1))
267 FUNCTION (my, sicheck) (size_t * p1, size_t k, gsl_permutation * p,
268 TYPE (gsl_vector) * data)
272 for (i = 0; i < k; i++)
274 if (FUNCTION(gsl_vector,get)(data,p1[i])
275 != FUNCTION(gsl_vector,get)(data, p->data[i]))
285 FUNCTION (my, licheck) (size_t * p1, size_t k, gsl_permutation * p,
286 TYPE (gsl_vector) * data)
290 for (i = 0; i < k; i++)
292 if (FUNCTION(gsl_vector,get)(data,p1[i])
293 != FUNCTION(gsl_vector,get)(data, p->data[p->size - i - 1]))