IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 26399


Ignore:
Timestamp:
Dec 14, 2009, 2:22:19 PM (16 years ago)
Author:
eugene
Message:

add some error checks and cleanup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Ohana/src/addstar/src/build_links.c

    r17192 r26399  
    11# include "addstar.h"
     2
     3/*
     4
     5There are two modes for the measure table: sorted and unsorted.
     6
     7In sorted mode, all measures associated with a given average are in a single block.  The block
     8is pointed to by average->measureOffset and the range is average->Nmeasure
     9
     10In unsorted mode, it is not possible to go directly from average to measure without scanning.
     11In this case, it is necessary to use the value measure->averef to find the corresponding
     12average entry. 
     13
     14Note that average->measureOffset and measure->averef are only valid for a given load of the
     15data: they refer to the sequence number in the data blocks.
     16
     17next_meas is a list of the equivalent sequence of the measure block as if it were sorted.
     18
     19to find the sequence of measurements for a given average:
     20n_0 = average->measureOffset
     21n_1 = next_meas[n_0]
     22n_i = next_meas[n_i-1]
     23
     24*/
    225
    326/* build the initial links assuming the table is sorted,
     
    3154}
    3255
     56/* construct measure links which are valid FOR THIS LOAD
     57 * - if we have a full load, we will get links which can
     58 *   be used by other programs (eg, relphot, etc)
     59 * - if we have a partial load, the links are only valid
     60 *   for that partial load
     61 */
     62
     63int *build_measure_links (Average *average, int Naverage, Measure *measure, int Nmeasure) {
     64
     65  int i, m, k, Nm, averef;
     66  int *next;
     67
     68  ALLOCATE (next, int, Nmeasure);
     69
     70  /* reset the Nm, offset values for average */
     71  for (i = 0; i < Naverage; i++) {
     72    average[i].measureOffset = -1;
     73    average[i].Nmeasure     =  0;
     74  }
     75
     76  for (Nm = 0; Nm < Nmeasure; Nm++) {
     77    averef = measure[Nm].averef;
     78    m = average[averef].measureOffset; 
     79    next[Nm] = -1;
     80
     81    if (m == -1) { /* no links yet for source */
     82      average[averef].measureOffset = Nm;
     83      average[averef].Nmeasure     = 1;
     84      continue;
     85    }
     86
     87    for (k = 0; next[m] != -1; k++) {
     88      m = next[m];
     89      if (m >= Nmeasure) {
     90        fprintf (stderr, "WARNING: m out of bounds (1)\n");
     91      }
     92    }
     93
     94    average[averef].Nmeasure = k + 2;
     95    next[m] = Nm;
     96    if (m >= Nmeasure) {
     97      fprintf (stderr, "WARNING: m out of bounds (2)\n");
     98    }
     99  }
     100  return (next);
     101}
     102
     103/* average[].measureOffset, average[].Nmeasure are valid within an addstar run */
     104int add_meas_link (Average *average, int *next, int Nmeasure, int NMEASURE) {
     105
     106  int k, m;
     107
     108  /* if we have trouble, check validity of next[m] : m < Nmeasure */
     109  m = average[0].measureOffset; 
     110
     111  for (k = 0; k < average[0].Nmeasure - 1; k++)  {
     112    m = next[m];
     113    if (m >= NMEASURE) {
     114      fprintf (stderr, "WARNING: m out of bounds (3)\n");
     115    }
     116  }
     117
     118  /* set up references */
     119  next[Nmeasure] = -1;
     120  if (Nmeasure >= NMEASURE) {
     121    fprintf (stderr, "WARNING: Nmeasure out of bounds (1)\n");
     122  }
     123
     124  if (m == -1) {
     125    average[0].measureOffset = Nmeasure;
     126  } else {
     127    next[m] = Nmeasure;
     128    if (m >= NMEASURE) {
     129      fprintf (stderr, "WARNING: m out of bounds (4)\n");
     130    }
     131  }
     132
     133  return (TRUE);
     134}
     135
     136/* Missing does not carry enough information to reconstruct the links
     137   we must always save the missing table, if it exists */
     138
     139Measure *sort_measure (Average *average, int Naverage, Measure *measure, int Nmeasure, int *next) {
     140
     141  int i, k, n, N;
     142  Measure *tmpmeasure;
     143
     144  /* fix order of Measure (memory intensive, but fast) */
     145  N = 0;
     146  ALLOCATE (tmpmeasure, Measure, Nmeasure);
     147  for (i = 0; i < Naverage; i++) {
     148    n = average[i].measureOffset;
     149    average[i].measureOffset = N;
     150    for (k = 0; k < average[i].Nmeasure; k++, N++) {
     151      if (n == -1) abort();
     152      tmpmeasure[N] = measure[n];
     153      if (measure[n].averef != i) abort();
     154      tmpmeasure[N].averef = i;
     155      n = next[n];
     156    }
     157  }
     158  free (measure);
     159  return (tmpmeasure);
     160}
     161
    33162/* build the initial links assuming the table is sorted */
    34163int *init_missing_links (Average *average, int Naverage, Missing *missing, int Nmissing) {
     
    57186}
    58187
    59 /* average[].measureOffset, average[].Nmeasure are valid within an addstar run */
    60 int add_meas_link (Average *average, int *next, int Nmeasure, int NMEASURE) {
    61 
    62   int k, m;
    63 
    64   /* if we have trouble, check validity of next[m] : m < Nmeasure */
    65   m = average[0].measureOffset; 
    66 
    67   for (k = 0; k < average[0].Nmeasure - 1; k++)  {
    68     m = next[m];
    69     if (m >= NMEASURE) {
    70       fprintf (stderr, "WARNING: m out of bounds (3)\n");
    71     }
    72   }
    73 
    74   /* set up references */
    75   next[Nmeasure] = -1;
    76   if (Nmeasure >= NMEASURE) {
    77     fprintf (stderr, "WARNING: Nmeasure out of bounds (1)\n");
    78   }
    79 
    80   if (m == -1) {
    81     average[0].measureOffset = Nmeasure;
    82   } else {
    83     next[m] = Nmeasure;
    84     if (m >= NMEASURE) {
    85       fprintf (stderr, "WARNING: m out of bounds (4)\n");
    86     }
    87   }
    88 
    89   return (TRUE);
    90 }
    91 
    92188int add_miss_link (Average *average, int *next, int Nmissing) {
    93189
     
    109205}
    110206
    111 /* construct measure links which are valid FOR THIS LOAD
    112  * - if we have a full load, we will get links which can
    113  *   be used by other programs (eg, relphot, etc)
    114  * - if we have a partial load, the links are only valid
    115  *   for that partial load
    116  */
    117 
    118 int *build_measure_links (Average *average, int Naverage, Measure *measure, int Nmeasure) {
    119 
    120   int i, m, k, Nm, averef;
    121   int *next;
    122 
    123   ALLOCATE (next, int, Nmeasure);
    124 
    125   /* reset the Nm, offset values for average */
    126   for (i = 0; i < Naverage; i++) {
    127     average[i].measureOffset = -1;
    128     average[i].Nmeasure     =  0;
    129   }
    130 
    131   for (Nm = 0; Nm < Nmeasure; Nm++) {
    132     averef = measure[Nm].averef;
    133     m = average[averef].measureOffset; 
    134     next[Nm] = -1;
    135 
    136     if (m == -1) { /* no links yet for source */
    137       average[averef].measureOffset = Nm;
    138       average[averef].Nmeasure     = 1;
    139       continue;
    140     }
    141 
    142     for (k = 0; next[m] != -1; k++) {
    143       m = next[m];
    144       if (m >= Nmeasure) {
    145         fprintf (stderr, "WARNING: m out of bounds (1)\n");
    146       }
    147     }
    148 
    149     average[averef].Nmeasure = k + 2;
    150     next[m] = Nm;
    151     if (m >= Nmeasure) {
    152       fprintf (stderr, "WARNING: m out of bounds (2)\n");
    153     }
    154   }
    155   return (next);
    156 }
    157 
    158 /* Missing does not carry enough information to reconstruct the links
    159    we must always save the missing table, if it exists */
    160 
    161 Measure *sort_measure (Average *average, int Naverage, Measure *measure, int Nmeasure, int *next) {
    162 
    163   int i, k, n, N;
    164   Measure *tmpmeasure;
    165 
    166   /* fix order of Measure (memory intensive, but fast) */
    167   N = 0;
    168   ALLOCATE (tmpmeasure, Measure, Nmeasure);
    169   for (i = 0; i < Naverage; i++) {
    170     n = average[i].measureOffset;
    171     average[i].measureOffset = N;
    172     for (k = 0; k < average[i].Nmeasure; k++, N++) {
    173       tmpmeasure[N] = measure[n];
    174       tmpmeasure[N].averef = i;
    175       n = next[n];
    176     }
    177   }
    178   free (measure);
    179   return (tmpmeasure);
    180 }
    181 
    182207Missing *sort_missing (Average *average, int Naverage, Missing *missing, int Nmissing, int *next) {
    183208
     
    199224  return (tmpmissing);
    200225}
     226
Note: See TracChangeset for help on using the changeset viewer.