Changeset 26399
- Timestamp:
- Dec 14, 2009, 2:22:19 PM (16 years ago)
- File:
-
- 1 edited
-
trunk/Ohana/src/addstar/src/build_links.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Ohana/src/addstar/src/build_links.c
r17192 r26399 1 1 # include "addstar.h" 2 3 /* 4 5 There are two modes for the measure table: sorted and unsorted. 6 7 In sorted mode, all measures associated with a given average are in a single block. The block 8 is pointed to by average->measureOffset and the range is average->Nmeasure 9 10 In unsorted mode, it is not possible to go directly from average to measure without scanning. 11 In this case, it is necessary to use the value measure->averef to find the corresponding 12 average entry. 13 14 Note that average->measureOffset and measure->averef are only valid for a given load of the 15 data: they refer to the sequence number in the data blocks. 16 17 next_meas is a list of the equivalent sequence of the measure block as if it were sorted. 18 19 to find the sequence of measurements for a given average: 20 n_0 = average->measureOffset 21 n_1 = next_meas[n_0] 22 n_i = next_meas[n_i-1] 23 24 */ 2 25 3 26 /* build the initial links assuming the table is sorted, … … 31 54 } 32 55 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 63 int *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 */ 104 int 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 139 Measure *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 33 162 /* build the initial links assuming the table is sorted */ 34 163 int *init_missing_links (Average *average, int Naverage, Missing *missing, int Nmissing) { … … 57 186 } 58 187 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 92 188 int add_miss_link (Average *average, int *next, int Nmissing) { 93 189 … … 109 205 } 110 206 111 /* construct measure links which are valid FOR THIS LOAD112 * - if we have a full load, we will get links which can113 * be used by other programs (eg, relphot, etc)114 * - if we have a partial load, the links are only valid115 * for that partial load116 */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 links159 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 182 207 Missing *sort_missing (Average *average, int Naverage, Missing *missing, int Nmissing, int *next) { 183 208 … … 199 224 return (tmpmissing); 200 225 } 226
Note:
See TracChangeset
for help on using the changeset viewer.
