MIDAPACK - MIcrowave Data Analysis PACKage  1.1b
Parallel software tools for high performance CMB DA analysis
als.c
Go to the documentation of this file.
1 
29 int card(int *A, int nA) {
30  int i;
31  int tmp = A[0];
32  int c = 1;
33  for (i = 1; i < nA; i++) {
34  if (A[i] != tmp) {
35  c++;
36  tmp = A[i];
37  }
38  }
39  return c;
40 }
41 
42 
51 void merge(int *A, int nA, int *B) {
52  int i = 0, j = 0;
53  B[0] = A[0];
54  for (i = 1; i < nA; i++) {
55  if (A[i] != B[j]) {
56  j++;
57  B[j] = A[i];
58  }
59  }
60 }
61 
62 
72 int card_or(int *A1, int n1, int *A2, int n2) {
73  int i = 0, j = 0, k = 0;
74  while ((i < n1) || (j < n2)) {
75  if ((i == n1) || (j == n2)) {
76  if (i == n1) {
77  j++;
78  } else {
79  i++;
80  }
81  } else if (A1[i] < A2[j]) {
82  if (i < n1) {
83  i++;
84  } else {
85  j++;
86  }
87  } else if (A1[i] > A2[j]) {
88  if (j < n2) {
89  j++;
90  } else {
91  i++;
92  }
93  } else {
94  if (i < n1) { i++; }
95  if (j < n2) { j++; }
96  }
97  k++;
98  }
99  return k;
100 }
101 
111 int card_and(int *A1, int n1, int *A2, int n2) {
112  int i = 0, j = 0, k = 0;
113  while (i < n1 && j < n2) {
114  if (A1[i] < A2[j]) {
115  i++;
116  } else if (A1[i] > A2[j]) {
117  j++;
118  } else {
119  k++;
120  i++;
121  j++;
122  }
123  }
124  return k;
125 }
126 
138 int set_or(int *A1, int n1, int *A2, int n2, int *A1orA2) {
139  int i = 0, j = 0, k = 0;
140  while ((i < n1) || (j < n2)) {
141  if ((i == n1) || (j == n2)) {
142  if (i == n1) {
143  A1orA2[k] = A2[j];
144  j++;
145  } else {
146  A1orA2[k] = A1[i];
147  i++;
148  }
149  } else if (A1[i] < A2[j]) {
150  if (i < n1) {
151  A1orA2[k] = A1[i];
152  i++;
153  } else {
154  A1orA2[k] = A2[j];
155  j++;
156  }
157  } else if (A1[i] > A2[j]) {
158  if (j < n2) {
159  A1orA2[k] = A2[j];
160  j++;
161  } else {
162  A1orA2[k] = A1[i];
163  i++;
164  }
165  } else {
166  A1orA2[k] = A1[i];
167  i++;
168  j++;
169  }
170  k++;
171  }
172  return k;
173 }
174 
186 int set_and(int *A1, int n1, int *A2, int n2, int *A1andA2) {
187  int i = 0, j = 0, k = 0;
188  while (i < n1 && j < n2) {
189  if (A1[i] < A2[j]) {
190  i++;
191  } else if (A1[i] > A2[j]) {
192  j++;
193  } else {
194  A1andA2[k] = A1[i];
195  k++;
196  i++;
197  j++;
198  }
199  }
200  return k;
201 }
202 
210 int map_and(int *A1, int n1, int *A2, int n2, int *mapA1andA2) {
211  int i = 0, j = 0, k = 0;
212  while (i < n1 && j < n2) {
213  if (A1[i] < A2[j]) {
214  i++;
215  } else if (A1[i] > A2[j]) {
216  j++;
217  } else {
218  mapA1andA2[k] = i;
219  k++;
220  i++;
221  j++;
222  }
223  }
224  return k;
225 }
226 
227 
237 void subset2map(int *A, int nA, int *subA, int nsubA) {
238  int i = 0, j = 0;
239  while (i < nA && j < nsubA) {
240  if (A[i] < subA[j]) {
241  i++;
242  } else {
243  subA[j] = i;
244  i++;
245  j++;
246  }
247  }
248 }
int set_or(int *A1, int n1, int *A2, int n2, int *A1orA2)
Definition: als.c:138
int set_and(int *A1, int n1, int *A2, int n2, int *A1andA2)
Definition: als.c:186
int card_or(int *A1, int n1, int *A2, int n2)
Definition: als.c:72
int card_and(int *A1, int n1, int *A2, int n2)
Definition: als.c:111
int map_and(int *A1, int n1, int *A2, int n2, int *mapA1andA2)
Compute map A1 and A2 / A1.
Definition: als.c:210
int card(int *A, int nA)
Definition: als.c:29
void merge(int *A, int nA, int *B)
Definition: als.c:51
void subset2map(int *A, int nA, int *subA, int nsubA)
Definition: als.c:237