IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Mar 29, 2015, 6:52:41 AM (11 years ago)
Author:
eugene
Message:

merge changes from ipp-20150112

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/Ohana

    • Property svn:mergeinfo deleted
  • trunk/Ohana/src/opihi/lib.shell/stack_math.c

    r36528 r38062  
    8080      break;                                                            \
    8181    }                                                                   \
     82    if ((V1->vector->type == OPIHI_FLT) && (V2->vector->type == OPIHI_FLT) && (V3->vector->type == OPIHI_INT)) { \
     83      CopyVector (OUT[0].vector, V1[0].vector);                         \
     84      opihi_flt *M1  =  V1[0].vector[0].elements.Flt;                   \
     85      opihi_flt *M2  =  V2[0].vector[0].elements.Flt;                   \
     86      opihi_int *M3  =  V3[0].vector[0].elements.Int;                   \
     87      opihi_flt *out = OUT[0].vector[0].elements.Flt;                   \
     88      for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) {               \
     89        *out = OP;                                                      \
     90      }                                                                 \
     91      break;                                                            \
     92    }                                                                   \
     93    if ((V1->vector->type == OPIHI_FLT) && (V2->vector->type == OPIHI_INT) && (V3->vector->type == OPIHI_FLT)) { \
     94      CopyVector (OUT[0].vector, V1[0].vector);                         \
     95      opihi_flt *M1  =  V1[0].vector[0].elements.Flt;                   \
     96      opihi_int *M2  =  V2[0].vector[0].elements.Int;                   \
     97      opihi_flt *M3  =  V3[0].vector[0].elements.Flt;                   \
     98      opihi_flt *out = OUT[0].vector[0].elements.Flt;                   \
     99      for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) {               \
     100        *out = OP;                                                      \
     101      }                                                                 \
     102      break;                                                            \
     103    }                                                                   \
     104    if ((V1->vector->type == OPIHI_FLT) && (V2->vector->type == OPIHI_INT) && (V3->vector->type == OPIHI_INT)) { \
     105      CopyVector (OUT[0].vector, V2[0].vector);                         \
     106      opihi_flt *M1  =  V1[0].vector[0].elements.Flt;                   \
     107      opihi_int *M2  =  V2[0].vector[0].elements.Int;                   \
     108      opihi_int *M3  =  V3[0].vector[0].elements.Int;                   \
     109      opihi_int *out = OUT[0].vector[0].elements.Int;                   \
     110      for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) {               \
     111        *out = OP;                                                      \
     112      }                                                                 \
     113      break;                                                            \
     114    }                                                                   \
     115    if ((V1->vector->type == OPIHI_INT) && (V2->vector->type == OPIHI_FLT) && (V3->vector->type == OPIHI_FLT)) { \
     116      CopyVector (OUT[0].vector, V2[0].vector);                         \
     117      opihi_int *M1  =  V1[0].vector[0].elements.Int;                   \
     118      opihi_flt *M2  =  V2[0].vector[0].elements.Flt;                   \
     119      opihi_flt *M3  =  V3[0].vector[0].elements.Flt;                   \
     120      opihi_flt *out = OUT[0].vector[0].elements.Flt;                   \
     121      for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) {               \
     122        *out = OP;                                                      \
     123      }                                                                 \
     124      break;                                                            \
     125    }                                                                   \
     126    if ((V1->vector->type == OPIHI_INT) && (V2->vector->type == OPIHI_FLT) && (V3->vector->type == OPIHI_INT)) { \
     127      CopyVector (OUT[0].vector, V2[0].vector);                         \
     128      opihi_int *M1  =  V1[0].vector[0].elements.Int;                   \
     129      opihi_flt *M2  =  V2[0].vector[0].elements.Flt;                   \
     130      opihi_int *M3  =  V3[0].vector[0].elements.Int;                   \
     131      opihi_flt *out = OUT[0].vector[0].elements.Flt;                   \
     132      for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) {               \
     133        *out = OP;                                                      \
     134      }                                                                 \
     135      break;                                                            \
     136    }                                                                   \
     137    if ((V1->vector->type == OPIHI_INT) && (V2->vector->type == OPIHI_INT) && (V3->vector->type == OPIHI_FLT)) { \
     138      CopyVector (OUT[0].vector, V3[0].vector);                         \
     139      opihi_int *M1  =  V1[0].vector[0].elements.Int;                   \
     140      opihi_int *M2  =  V2[0].vector[0].elements.Int;                   \
     141      opihi_flt *M3  =  V3[0].vector[0].elements.Flt;                   \
     142      opihi_flt *out = OUT[0].vector[0].elements.Flt;                   \
     143      for (i = 0; i < Nx; i++, out++, M1++, M2++, M3++) {               \
     144        *out = OP;                                                      \
     145      }                                                                 \
     146      break;                                                            \
     147    }                                                                   \
    82148    if ((V1->vector->type == OPIHI_INT) && (V2->vector->type == OPIHI_INT) && (V3->vector->type == OPIHI_INT)) { \
    83149      CopyVector (OUT[0].vector, V1[0].vector);                         \
     
    127193int MMM_trinary (StackVar *OUT, StackVar *V1, StackVar *V2, StackVar *V3, char *op) {
    128194
    129   int i, Nx, Ny;
     195  int i;
    130196  float *out, *M1, *M2, *M3;
    131197  char line[512]; // this is only used to report an error
    132198 
    133   Nx = V1[0].buffer[0].matrix.Naxis[0];
    134   Ny = V1[0].buffer[0].matrix.Naxis[1];
    135 
     199  int Npix = gfits_npix_matrix (&V1[0].buffer[0].matrix);
     200 
    136201  if (V1[0].type == ST_MATRIX_TMP) {  /** use V1 as temp buffer **/
    137202    OUT[0].buffer = V1[0].buffer;
     
    154219
    155220# define MMM_FUNC(OP)                                   \
    156   for (i = 0; i < Nx*Ny; i++, out++, M1++, M2++, M3++) {        \
     221  for (i = 0; i < Npix; i++, out++, M1++, M2++, M3++) { \
    157222    *out = OP;                                          \
    158223  }                                                     \
     
    531596}
    532597
    533 // the vector is applied to each column
     598// the vector is applied to each column (currently only valid for 2D matrix)
    534599int MV_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) {
    535600
     
    626691}
    627692
    628 // the vector is applied to each row
     693// the vector is applied to each row (currently only valid for 2D matrix)
    629694int VM_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) {
    630695
     
    722787int MM_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) {
    723788
    724   int i, Nx, Ny;
     789  int i;
    725790  float *out, *M1, *M2;
    726791  char line[512]; // this is only used to report an error
    727792 
    728   Nx = V1[0].buffer[0].matrix.Naxis[0];
    729   Ny = V1[0].buffer[0].matrix.Naxis[1];
    730 
     793  int Npix = gfits_npix_matrix (&V1[0].buffer[0].matrix);
     794 
    731795  if (V1[0].type == ST_MATRIX_TMP) {  /** use V1 as temp buffer **/
    732796    OUT[0].buffer = V1[0].buffer;
     
    748812
    749813# define MM_FUNC(OP)                                    \
    750   for (i = 0; i < Nx*Ny; i++, out++, M1++, M2++) {      \
     814  for (i = 0; i < Npix; i++, out++, M1++, M2++) {       \
    751815    *out = OP;                                          \
    752816  }                                                     \
     
    803867int MS_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) {
    804868
    805   int i, Nx, Ny;
     869  int i;
    806870  char line[512]; // this is only used to report an error
    807871 
    808   Nx = V1[0].buffer[0].matrix.Naxis[0];
    809   Ny = V1[0].buffer[0].matrix.Naxis[1];
     872  int Npix = gfits_npix_matrix (&V1[0].buffer[0].matrix);
    810873
    811874  /* if possible, use V1 as temp buffer, otherwise create new one */
     
    825888    if (V2->type == ST_SCALAR_FLT)  {                           \
    826889      opihi_flt M2 = V2[0].FltValue;                    \
    827       for (i = 0; i < Nx*Ny; i++, out++, M1++) {        \
     890      for (i = 0; i < Npix; i++, out++, M1++) { \
    828891        *out = OP;                                      \
    829892      }                                                 \
     
    832895    if (V2->type == ST_SCALAR_INT)  {                           \
    833896      opihi_int M2 = V2[0].IntValue;                    \
    834       for (i = 0; i < Nx*Ny; i++, out++, M1++) {        \
     897      for (i = 0; i < Npix; i++, out++, M1++) { \
    835898        *out = OP;                                      \
    836899      }                                                 \
     
    881944int SM_binary (StackVar *OUT, StackVar *V1, StackVar *V2, char *op) {
    882945
    883   int i, Nx, Ny;
     946  int i;
    884947  char line[512]; // this is only used to report an error
    885948 
    886   Nx = V2[0].buffer[0].matrix.Naxis[0];
    887   Ny = V2[0].buffer[0].matrix.Naxis[1];
    888 
     949  int Npix = gfits_npix_matrix (&V2[0].buffer[0].matrix);
     950 
    889951  if (V2[0].type == ST_MATRIX_TMP) {  /* V2[0] is NOT temporary, we can't use it for storage */
    890952    OUT[0].buffer = V2[0].buffer;
     
    902964    if (V1->type == ST_SCALAR_FLT)  {                           \
    903965      opihi_flt M1 = V1[0].FltValue;                    \
    904       for (i = 0; i < Nx*Ny; i++, out++, M2++) {        \
     966      for (i = 0; i < Npix; i++, out++, M2++) { \
    905967        *out = OP;                                      \
    906968      }                                                 \
     
    909971    if (V1->type == ST_SCALAR_INT)  {                           \
    910972      opihi_int M1 = V1[0].IntValue;                    \
    911       for (i = 0; i < Nx*Ny; i++, out++, M2++) {        \
     973      for (i = 0; i < Npix; i++, out++, M2++) { \
    912974        *out = OP;                                      \
    913975      }                                                 \
     
    12401302  if (!strcmp (op, "xramp"))  V_FUNC(i, ST_SCALAR_INT);
    12411303  if (!strcmp (op, "yramp"))  V_FUNC(0, ST_SCALAR_INT);
    1242   /* xramp and yramp above only make sense for matrices. for vectors, xramp = ramp, yramp = zero */
     1304  if (!strcmp (op, "zramp"))  V_FUNC(0, ST_SCALAR_INT);
     1305  /* xramp, yramp, zramp above only make sense for matrices. for vectors, xramp = ramp, yramp = zero */
    12431306
    12441307# undef V_FUNC
     
    12591322int M_unary (StackVar *OUT, StackVar *V1, char *op) {
    12601323
    1261   int i, j, Nx, Ny;
     1324  int i, j, k;
    12621325  float *out, *M1;
    12631326 
    1264   Nx = V1[0].buffer[0].matrix.Naxis[0];
    1265   Ny = V1[0].buffer[0].matrix.Naxis[1];
    1266 
     1327  int Npix = gfits_npix_matrix (&V1[0].buffer[0].matrix);
     1328 
    12671329  if (V1[0].type == ST_MATRIX_TMP) {
    12681330    OUT[0].buffer = V1[0].buffer;
     
    12771339
    12781340  if (!strcmp (op, "="))     { }
    1279   if (!strcmp (op, "abs"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = fabs(*M1);         }}
    1280   if (!strcmp (op, "int"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = (opihi_flt)(long long)(*M1); }}
    1281 
    1282   if (!strcmp (op, "floor")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = floor (*M1); }}
    1283   if (!strcmp (op, "ceil"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = ceil (*M1); }}
    1284   // if (!strcmp (op, "rint"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = nearbyint (*M1); }}
    1285 
    1286   if (!strcmp (op, "exp"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = exp(*M1);          }}
    1287   if (!strcmp (op, "ten"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = pow(10.0,*M1);     }}
    1288   if (!strcmp (op, "log"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = log10(*M1);        }}
    1289   if (!strcmp (op, "ln"))    { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = log(*M1);          }}
    1290   if (!strcmp (op, "sqrt"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = sqrt(*M1);         }}
    1291   if (!strcmp (op, "erf"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = erf(*M1);          }}
    1292 
    1293   if (!strcmp (op, "sinh"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = sinh(*M1);         }}
    1294   if (!strcmp (op, "cosh"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = cosh(*M1);         }}
    1295   if (!strcmp (op, "asinh")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = asinh(*M1);        }}
    1296   if (!strcmp (op, "acosh")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = acosh(*M1);        }}
    1297   if (!strcmp (op, "lgamma")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = lgamma(*M1);      }}
    1298 
    1299   if (!strcmp (op, "sin"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = sin(*M1);          }}
    1300   if (!strcmp (op, "cos"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = cos(*M1);          }}
    1301   if (!strcmp (op, "tan"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = tan(*M1);          }}
    1302   if (!strcmp (op, "dsin"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = sin(*M1*RAD_DEG);  }}
    1303   if (!strcmp (op, "dcos"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = cos(*M1*RAD_DEG);  }}
    1304   if (!strcmp (op, "dtan"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = tan(*M1*RAD_DEG);  }}
    1305   if (!strcmp (op, "asin"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = asin(*M1);         }}
    1306   if (!strcmp (op, "acos"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = acos(*M1);         }}
    1307   if (!strcmp (op, "atan"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = atan(*M1);         }}
    1308   if (!strcmp (op, "dasin")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = asin(*M1)*DEG_RAD; }}
    1309   if (!strcmp (op, "dacos")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = acos(*M1)*DEG_RAD; }}
    1310   if (!strcmp (op, "datan")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = atan(*M1)*DEG_RAD; }}
    1311   if (!strcmp (op, "not"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = !(*M1);            }}
    1312   if (!strcmp (op, "--"))    { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = -(*M1);            }}
    1313   if (!strcmp (op, "rnd"))   { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = drand48();         }}
    1314   if (!strcmp (op, "ramp"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = i;                 }}
    1315   if (!strcmp (op, "zero"))  { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = 0;                 }}
    1316   if (!strcmp (op, "isinf")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = !finite(*M1);      }}
    1317   if (!strcmp (op, "isnan")) { for (i = 0; i < Nx*Ny; i++, out++, M1++) { *out = isnan(*M1);        }}
    1318 
    1319   /* xrm and yrm only make sense in for matrices. see special meaning for vectors */
     1341  if (!strcmp (op, "abs"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = fabs(*M1);         }}
     1342  if (!strcmp (op, "int"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = (opihi_flt)(long long)(*M1); }}
     1343
     1344  if (!strcmp (op, "floor")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = floor (*M1); }}
     1345  if (!strcmp (op, "ceil"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = ceil (*M1); }}
     1346  // if (!strcmp (op, "rint"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = nearbyint (*M1); }}
     1347
     1348  if (!strcmp (op, "exp"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = exp(*M1);          }}
     1349  if (!strcmp (op, "ten"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = pow(10.0,*M1);     }}
     1350  if (!strcmp (op, "log"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = log10(*M1);        }}
     1351  if (!strcmp (op, "ln"))    { for (i = 0; i < Npix; i++, out++, M1++) { *out = log(*M1);          }}
     1352  if (!strcmp (op, "sqrt"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = sqrt(*M1);         }}
     1353  if (!strcmp (op, "erf"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = erf(*M1);          }}
     1354
     1355  if (!strcmp (op, "sinh"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = sinh(*M1);         }}
     1356  if (!strcmp (op, "cosh"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = cosh(*M1);         }}
     1357  if (!strcmp (op, "asinh")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = asinh(*M1);        }}
     1358  if (!strcmp (op, "acosh")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = acosh(*M1);        }}
     1359  if (!strcmp (op, "lgamma")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = lgamma(*M1);      }}
     1360
     1361  if (!strcmp (op, "sin"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = sin(*M1);          }}
     1362  if (!strcmp (op, "cos"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = cos(*M1);          }}
     1363  if (!strcmp (op, "tan"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = tan(*M1);          }}
     1364  if (!strcmp (op, "dsin"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = sin(*M1*RAD_DEG);  }}
     1365  if (!strcmp (op, "dcos"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = cos(*M1*RAD_DEG);  }}
     1366  if (!strcmp (op, "dtan"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = tan(*M1*RAD_DEG);  }}
     1367  if (!strcmp (op, "asin"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = asin(*M1);         }}
     1368  if (!strcmp (op, "acos"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = acos(*M1);         }}
     1369  if (!strcmp (op, "atan"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = atan(*M1);         }}
     1370  if (!strcmp (op, "dasin")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = asin(*M1)*DEG_RAD; }}
     1371  if (!strcmp (op, "dacos")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = acos(*M1)*DEG_RAD; }}
     1372  if (!strcmp (op, "datan")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = atan(*M1)*DEG_RAD; }}
     1373  if (!strcmp (op, "not"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = !(*M1);            }}
     1374  if (!strcmp (op, "--"))    { for (i = 0; i < Npix; i++, out++, M1++) { *out = -(*M1);            }}
     1375  if (!strcmp (op, "rnd"))   { for (i = 0; i < Npix; i++, out++, M1++) { *out = drand48();         }}
     1376  if (!strcmp (op, "ramp"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = i;                 }}
     1377  if (!strcmp (op, "zero"))  { for (i = 0; i < Npix; i++, out++, M1++) { *out = 0;                 }}
     1378  if (!strcmp (op, "isinf")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = !finite(*M1);      }}
     1379  if (!strcmp (op, "isnan")) { for (i = 0; i < Npix; i++, out++, M1++) { *out = isnan(*M1);        }}
     1380
     1381  /* xrm and yrm only make sense for 2D matrices. see special meaning for vectors */
    13201382  if (!strcmp (op, "xramp")) {
    1321     for (j = 0; j < Ny; j++) {
    1322       for (i = 0; i < Nx; i++, out++, M1++) {
    1323         *out = i;
     1383    int Nx = V1[0].buffer[0].matrix.Naxis[0];
     1384    int Ny = V1[0].buffer[0].matrix.Naxis[1];
     1385    int Nz = MAX (1, V1[0].buffer[0].matrix.Naxis[2]);
     1386    for (k = 0; k < Nz; k++) {
     1387      for (j = 0; j < Ny; j++) {
     1388        for (i = 0; i < Nx; i++, out++, M1++) {
     1389          *out = i;
     1390        }
    13241391      }
    13251392    }
    13261393  }
    13271394  if (!strcmp (op, "yramp")) {
    1328     for (j = 0; j < Ny; j++) {
    1329       for (i = 0; i < Nx; i++, out++, M1++) {
    1330         *out = j;
     1395    int Nx = V1[0].buffer[0].matrix.Naxis[0];
     1396    int Ny = V1[0].buffer[0].matrix.Naxis[1];
     1397    int Nz = MAX (1, V1[0].buffer[0].matrix.Naxis[2]);
     1398    for (k = 0; k < Nz; k++) {
     1399      for (j = 0; j < Ny; j++) {
     1400        for (i = 0; i < Nx; i++, out++, M1++) {
     1401          *out = j;
     1402        }
     1403      }
     1404    }
     1405  }
     1406  if (!strcmp (op, "zramp")) {
     1407    int Nx = V1[0].buffer[0].matrix.Naxis[0];
     1408    int Ny = V1[0].buffer[0].matrix.Naxis[1];
     1409    int Nz = MAX (1, V1[0].buffer[0].matrix.Naxis[2]);
     1410    for (k = 0; k < Nz; k++) {
     1411      for (j = 0; j < Ny; j++) {
     1412        for (i = 0; i < Nx; i++, out++, M1++) {
     1413          *out = k;
     1414        }
    13311415      }
    13321416    }
Note: See TracChangeset for help on using the changeset viewer.