IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Dec 7, 2008, 3:31:01 PM (18 years ago)
Author:
eugene
Message:

big update from eam_branch_20081124 with updates to Opihi math

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/opihi/cmd.data/sort.c

    r7917 r20936  
    11# include "data.h"
    22
     3void fsortindex (opihi_flt *X, int *IDX, int N) {
     4
     5# define SWAPFUNC(A,B){ opihi_flt tmp; int itmp;        \
     6  tmp = X[A]; X[A] = X[B]; X[B] = tmp; \
     7  itmp = IDX[A]; IDX[A] = IDX[B]; IDX[B] = itmp; \
     8}
     9# define COMPARE(A,B)(X[A] < X[B])
     10
     11  OHANA_SORT (N, COMPARE, SWAPFUNC);
     12
     13# undef SWAPFUNC
     14# undef COMPARE
     15
     16}
     17
     18void isortindex (opihi_int *X, int *IDX, int N) {
     19
     20# define SWAPFUNC(A,B){ opihi_int tmp; int itmp;        \
     21  tmp = X[A]; X[A] = X[B]; X[B] = tmp; \
     22  itmp = IDX[A]; IDX[A] = IDX[B]; IDX[B] = itmp; \
     23}
     24# define COMPARE(A,B)(X[A] < X[B])
     25
     26  OHANA_SORT (N, COMPARE, SWAPFUNC);
     27
     28# undef SWAPFUNC
     29# undef COMPARE
     30
     31}
     32
     33// XXX add an option to NOT sort, but return an index instead?
    334int sort_vectors (int argc, char **argv) {
    435 
    536  int i, j, Nvec, Nval;
    6   float *temp, *index, *T, *V, *I;
     37  opihi_flt *ftemp;
     38  opihi_int *itemp;
     39  int *index, *I;
    740  Vector **vec;
    841
     
    3568  }
    3669 
    37   /* create index (use float to use sortpair) */
    38   ALLOCATE (index, float, Nval);
     70  /* create index */
     71  ALLOCATE (index, int, Nval);
    3972  for (i = 0; i < Nval; i++) index[i] = i;
    4073
    4174  /* sort key & index */
    42   fsortpair (vec[0][0].elements, index, Nval);
     75  if (vec[0][0].type == OPIHI_FLT) {
     76    fsortindex (vec[0][0].elements.Flt, index, Nval);
     77  } else {
     78    isortindex (vec[0][0].elements.Int, index, Nval);
     79  }
    4380
    44   ALLOCATE (temp, float, Nval);
     81  ALLOCATE (ftemp, opihi_flt, Nval);
     82  ALLOCATE (itemp, opihi_int, Nval);
     83
    4584  for (i = 1; i < Nvec; i++) {
    46     T = temp;
    47     V = vec[i][0].elements;
    48     I = index;
    49     for (j = 0; j < Nval; j++, T++, I++) {
    50       *T = V[(int)(*I)];
     85    if (vec[i][0].type == OPIHI_FLT) {
     86      opihi_flt *T = ftemp;
     87      opihi_flt *V = vec[i][0].elements.Flt;
     88      I = index;
     89      for (j = 0; j < Nval; j++, T++, I++) {
     90        *T = V[*I];
     91      }
     92      /* swap .elements.Flt (== V) and ftemp */
     93      vec[i][0].elements.Flt = ftemp;
     94      ftemp = V;
     95    } else {
     96      opihi_int *T = itemp;
     97      opihi_int *V = vec[i][0].elements.Int;
     98      I = index;
     99      for (j = 0; j < Nval; j++, T++, I++) {
     100        *T = V[*I];
     101      }
     102      /* swap .elements.Flt (== V) and itemp */
     103      vec[i][0].elements.Int = itemp;
     104      itemp = V;
    51105    }
    52     /* swap .elements (== V) and temp */
    53     vec[i][0].elements = temp;
    54     temp = V;
    55106  }
    56   free (temp);
     107  free (itemp);
     108  free (ftemp);
    57109  free (vec);
    58110  free (index);
     
    61113
    62114}
    63 
    64 
Note: See TracChangeset for help on using the changeset viewer.