1
/*------------------------------------------------------------------------
3
* Copyright (C) 1998-2000 Enpc/Jean-Philippe Chancelier
5
--------------------------------------------------------------------------*/
7
static void CNAME(ColSort,TYPE)();
8
static void CNAME(RowSort,TYPE)();
9
static void CNAME(GlobalSort,TYPE)();
10
static void CNAME(LexiRow,TYPE)();
11
static void CNAME(LexiCol,TYPE)();
12
static void CNAME(inita,TYPE)();
13
static void CNAME(afficher,TYPE)();
14
static void CNAME(sorttest,TYPE)();
17
/******************************************************
18
* Generic code for Sorting Matrices a[i+n*j]
19
* This code is inserted in gsort.c
20
* with TYPE == double or type = int
21
******************************************************/
23
static int CNAME(swapcode,TYPE)(parmi, parmj, n)
28
register TYPE *pi = (TYPE *) (parmi);
29
register TYPE *pj = (TYPE *) (parmj);
31
register TYPE t = *pi;
38
static int CNAME(compareC,TYPE)(i,j)
41
if ( *((TYPE *)i) > *((TYPE *)j))
43
if ( *((TYPE *)i) < *((TYPE *)j))
48
static int CNAME(compareD,TYPE)(i,j)
51
if ( *((TYPE *)i) < *((TYPE *)j))
53
if ( *((TYPE *)i) > *((TYPE *)j))
58
/******************************************************
59
* Column sort of a matrix
60
******************************************************/
62
static void CNAME(ColSort,TYPE)(a,ind,flag,n,p,dir)
71
for ( j= 0 ; j < p ; j++ )
73
for ( i = 0 ; i < n ; i++)
77
for ( j= 0 ; j < p ; j++ )
79
sciqsort((char *) (a+n*j),(char *) (ind+n*j),flag, n,
80
sizeof(TYPE),sizeof(int),
81
(dir == 'c' ) ? CNAME(compareC,TYPE) : CNAME(compareD,TYPE),
82
CNAME(swapcode,TYPE),swapcodeind);
86
/******************************************************
87
* Row sort of a matrix
88
******************************************************/
90
static void CNAME(RowSort,TYPE)(a,ind,flag,n,p,dir)
99
for ( i = 0 ; i < n ; i++)
101
for ( j= 0 ; j < p ; j++ )
107
for ( i = 0 ; i < n ; i++)
109
sciqsort((char *) (a+i),(char *) (ind+i),flag, p,
110
n*sizeof(TYPE),n*sizeof(int),
111
(dir == 'c' ) ? CNAME(compareC,TYPE):CNAME(compareD,TYPE),
112
CNAME(swapcode,TYPE),swapcodeind);
117
/******************************************************
118
* Global sort of a Matrix
119
******************************************************/
121
static void CNAME(GlobalSort,TYPE)(a,ind,flag,n,p,dir)
130
for ( i = 0 ; i < n*p ; i++)
133
sciqsort((char *) (a),(char *) (ind),flag, n*p,
134
sizeof(TYPE),sizeof(int),
135
(dir == 'c' ) ? CNAME(compareC,TYPE):CNAME(compareD,TYPE),
136
CNAME(swapcode,TYPE),swapcodeind);
139
/*******************************************************
140
* lexicographic order with Rows ind is of size n
141
* ind gives the permutation of the rows which is applied
143
******************************************************/
145
static int CNAME(lexicols,TYPE) =1;
146
static int CNAME(lexirows,TYPE) =1;
148
static int CNAME(setLexiSize,TYPE)(n,p)
151
CNAME(lexicols,TYPE) = p;
152
CNAME(lexirows,TYPE) = n;
155
static int CNAME(LexiRowcompareC,TYPE)(int *i, int *j)
158
for ( jc = 0 ; jc < CNAME(lexicols,TYPE) ; jc++)
164
i += CNAME(lexirows,TYPE);
165
j += CNAME(lexirows,TYPE);
169
static int CNAME(LexiRowcompareD,TYPE)(int *i, int *j)
172
for ( jc = 0 ; jc < CNAME(lexicols,TYPE) ; jc++)
178
i += CNAME(lexirows,TYPE);
179
j += CNAME(lexirows,TYPE);
184
static int CNAME(LexiRowswapcode,TYPE)(parmi, parmj, n)
189
register TYPE *pi = (TYPE *) (parmi);
190
register TYPE *pj = (TYPE *) (parmj);
191
if ( n!= 1) printf(" swapcode avec n != 1\n");
193
for ( j = 0 ; j < CNAME(lexicols,TYPE) ; j++)
195
register TYPE t = *(pi +CNAME(lexirows,TYPE)*j);
196
*(pi + CNAME(lexirows,TYPE)*j) = *(pj+CNAME(lexirows,TYPE)*j);
197
*(pj + CNAME(lexirows,TYPE)*j) = t;
206
static void CNAME(LexiRow,TYPE)(a,ind,flag,n,p,dir)
212
CNAME(setLexiSize,TYPE)(n,p);
215
for ( i = 0 ; i < n ; i++)
218
sciqsort((char *) (a),(char *) (ind),flag, n,
219
sizeof(TYPE),sizeof(int),
220
(dir == 'c' ) ? CNAME(LexiRowcompareC,TYPE):CNAME(LexiRowcompareD,TYPE),
221
CNAME(LexiRowswapcode,TYPE),swapcodeind);
224
/******************************************************
225
* lexicographic order with Cols ind is of size p
226
* ind gives the permutation of the column which is applied
228
******************************************************/
230
static int CNAME(LexiColcompareC,TYPE)(i,j)
234
for ( ic = 0 ; ic < CNAME(lexirows,TYPE) ; ic++)
245
static int CNAME(LexiColcompareD,TYPE)(i,j)
249
for ( ic = 0 ; ic < CNAME(lexirows,TYPE) ; ic++)
261
static int CNAME(LexiColswapcode,TYPE)(parmi, parmj, n)
266
register TYPE *pi = (TYPE *) (parmi);
267
register TYPE *pj = (TYPE *) (parmj);
268
if ( n!= 1) printf(" swapcode avec n != 1\n");
270
for ( ir = 0 ; ir < CNAME(lexirows,TYPE) ; ir++)
272
register TYPE t = *(pi +ir);
273
*(pi +ir) = *(pj+ir);
276
pi += CNAME(lexirows,TYPE) ;
277
pj += CNAME(lexirows,TYPE) ;
283
static void CNAME(LexiCol,TYPE)(a,ind,flag,n,p,dir)
290
CNAME(setLexiSize,TYPE)(n,p);
293
for ( i = 0 ; i < p ; i++)
296
sciqsort((char *) (a),(char *) (ind),flag, p,
297
n*sizeof(TYPE),sizeof(int),
298
(dir == 'c' ) ? CNAME(LexiColcompareC,TYPE):CNAME(LexiColcompareD,TYPE),
299
CNAME(LexiColswapcode,TYPE),
310
static TYPE CNAME(aa,TYPE)[4*4] = {4,4,1,1,6,7,2,1,3,4,5,2,9,8,7,6};
311
/*static TYPE aa[4*4] = {6,6,6,6,6,6,6,6,6,6,5,5,5,5,5,5}; */
313
static void CNAME(inita,TYPE)(a,n,p)
318
if ( n == 4 && p == 4 )
319
for (i=0; i < n*p; i++) a[i]=CNAME(aa,TYPE)[i];
321
for (i=0; i < n*p; i++) a[i]=n*p-i;
322
CNAME(afficher,TYPE)(a,"a",n,p,sizeof(TYPE));
326
static void CNAME(afficher,TYPE)(a,name,n,p)
332
printf("%s=\n",name);
333
for ( i = 0 ; i < n ; i++)
335
for ( j= 0 ; j < p ; j++ )
337
printf("%4.2f ", a[i+N*j]);
344
static void CNAME(sorttest,TYPE)()
352
/** Global sort example **/
353
CNAME(inita,TYPE)(a,n,p) ;
354
CNAME(GlobalSort,TYPE)(a,ind,flag,n,p,'c');
355
CNAME(afficher,TYPE)(a,"glob a",n,p);
356
afficherint(ind,"glob ind",n,p);
358
/** Column sort example **/
359
CNAME(inita,TYPE)(a,n,p) ;
360
CNAME(ColSort,TYPE)(a,ind,flag,n,p,'c');
361
CNAME(afficher,TYPE)(a,"col a",n,p);
362
afficherint(ind,"col ind",n,p);
364
/** Row sort example **/
365
CNAME(inita,TYPE)(a,n,p) ;
366
CNAME(RowSort,TYPE)(a,ind,flag,n,p,'c');
367
CNAME(afficher,TYPE)(a,"row a",n,p);
368
afficherint(ind,"row ind",n,p);
370
/** Lexicographic Col sort **/
371
CNAME(inita,TYPE)(a,n,p) ;
372
CNAME(LexiCol,TYPE)(a,ind,flag,n,p,'c');
373
CNAME(afficher,TYPE)(a,"lexico col a",n,p);
374
afficherint(ind,"lexico col ind",1,p);
376
/** Lexicographic Row sort **/
377
CNAME(inita,TYPE)(a,n,p) ;
378
CNAME(LexiRow,TYPE)(a,ind,flag,n,p,'c');
379
CNAME(afficher,TYPE)(a,"lexico Row a",n,p);
380
afficherint(ind,"lexico Row ind",n,1);