24 #include <lal/LALStdlib.h>
25 #include <lal/AVFactories.h>
26 #include <lal/LALRunningMedian.h>
53 else if (data1==data2)
70 else if (data1==data2)
84 const struct qsnode *A = elem1;
85 const struct qsnode *B = elem2;
87 if (B->value > A->value)
89 else if (A->value > B->value)
91 else if (A->index > B->index)
104 const struct qsnode *A = elem1;
105 const struct qsnode *B = elem2;
107 if (B->value > A->value)
109 else if (A->value > B->value)
111 else if (A->index > B->index)
131 struct node *next_sorted, *next_sequence, *prev_sorted;
139 struct node **checks = NULL;
140 struct node **node_addresses = NULL;
141 struct node *first_sequence = NULL;
142 struct node *last_sequence = NULL;
143 struct node *currentnode = NULL;
144 struct node *previousnode = NULL;
145 struct node *leftnode = NULL;
146 struct node *rightnode = NULL;
147 struct node *reuse_next_sorted = NULL;
148 struct node *reuse_prev_sorted = NULL;
149 struct node *dummy_node = NULL;
150 struct node *dummy_node1 = NULL;
151 struct node *dummy_node2 = NULL;
152 UINT4 ncheckpts,stepchkpts;
153 UINT4 nextchkptindx,*checks4shift;
154 UINT4 nearestchk,midpoint,offset,numberoffsets;
155 UINT4 samplecount,counter_chkpt,chkcount=0, shiftcounter=0;
157 REAL8 nextsample,deletesample,dummy;
158 INT4 shift,dummy_int;
160 REAL8 *sorted_indices;
187 index_block[k].
index=k;
193 if(!sorted_indices) {
199 sorted_indices[k]=index_block[k].
index;
210 checks = (
struct node **)
LALCalloc(ncheckpts,
sizeof(
struct node*));
239 nearestchk=floor(midpoint/stepchkpts);
240 offset=midpoint-nearestchk*stepchkpts;
253 first_sequence=(
struct node *)
LALCalloc(1,
sizeof(
struct node));
261 node_addresses[0]=first_sequence;
262 first_sequence->next_sequence=NULL;
263 first_sequence->next_sorted=NULL;
264 first_sequence->prev_sorted=NULL;
265 first_sequence->data=input->
data[0];
266 previousnode=first_sequence;
267 for(samplecount=1;samplecount<param.
blocksize;samplecount++){
268 currentnode=(
struct node *)
LALCalloc(1,
sizeof(
struct node));
277 node_addresses[samplecount]=currentnode;
278 previousnode->next_sequence=currentnode;
279 currentnode->next_sequence=NULL;
280 currentnode->prev_sorted=NULL;
281 currentnode->next_sorted=NULL;
282 currentnode->data=input->
data[samplecount];
283 previousnode=currentnode;
285 last_sequence=currentnode;
291 currentnode=node_addresses[(int)sorted_indices[0]];
293 checks[0]=currentnode;
294 nextchkptindx=stepchkpts;
296 for(samplecount=1;samplecount<param.
blocksize;samplecount++){
297 dummy_node=node_addresses[(int)sorted_indices[samplecount]];
298 currentnode->next_sorted=dummy_node;
299 currentnode->prev_sorted=previousnode;
300 previousnode=currentnode;
301 currentnode=dummy_node;
302 if(samplecount==nextchkptindx && counter_chkpt<ncheckpts){
303 checks[counter_chkpt]=currentnode;
304 nextchkptindx+=stepchkpts;
308 currentnode->prev_sorted=previousnode;
309 currentnode->next_sorted=NULL;
315 currentnode=checks[nearestchk];
316 for(k=1;k<=offset;k++){
317 currentnode=currentnode->next_sorted;
320 for(k=1;k<=numberoffsets;k++){
321 dummy+=currentnode->data;
322 currentnode=currentnode->next_sorted;
324 medians->
data[0]=dummy/numberoffsets;
329 for(samplecount=param.
blocksize;samplecount<input->length;samplecount++){
330 nextsample=input->
data[samplecount];
331 if(nextsample>=checks[0]->data){
332 for(chkcount=1;chkcount<ncheckpts;chkcount++){
333 if(nextsample>checks[chkcount]->data){
340 rightnode=checks[chkcount];
343 if(nextsample<rightnode->data){
347 rightnode=rightnode->next_sorted;
352 if(nextsample<checks[0]->data){
363 if(rightnode==first_sequence){
364 dummy_node=rightnode;
366 else if(leftnode==first_sequence){
370 dummy_node->data=nextsample;
371 first_sequence=first_sequence->next_sequence;
372 dummy_node->next_sequence=NULL;
373 last_sequence->next_sequence=dummy_node;
374 last_sequence=dummy_node;
378 reuse_next_sorted=rightnode;
379 reuse_prev_sorted=leftnode;
388 deletesample=first_sequence->data;
389 if(deletesample>nextsample){
391 for(k=chkcount;k<ncheckpts;k++){
392 dummy=checks[k]->data;
393 if(dummy>nextsample){
394 if(dummy<=deletesample){
395 checks4shift[shiftcounter]=k;
406 if(deletesample<nextsample){
408 for(k=chkcount;k>=0;k--){
409 dummy=checks[k]->data;
410 if(dummy>=deletesample){
411 checks4shift[shiftcounter]=k;
427 dummy_node=first_sequence;
428 first_sequence=dummy_node->next_sequence;
429 dummy_node->next_sequence=NULL;
430 last_sequence->next_sequence=dummy_node;
431 last_sequence=dummy_node;
432 dummy_node->data=nextsample;
433 dummy_node1=dummy_node->prev_sorted;
434 dummy_node2=dummy_node->next_sorted;
440 dummy_node2->prev_sorted=dummy_node1;
444 dummy_node1->next_sorted=dummy_node2;
447 dummy_node1->next_sorted=dummy_node2;
448 dummy_node2->prev_sorted=dummy_node1;
456 leftnode->next_sorted=dummy_node;
460 rightnode->prev_sorted=dummy_node;
463 leftnode->next_sorted=dummy_node;
464 rightnode->prev_sorted=dummy_node;
472 for(k=0;k<shiftcounter;k++){
473 dummy_int=checks4shift[k];
474 checks[dummy_int]=checks[dummy_int]->prev_sorted;
479 for(k=0;k<shiftcounter;k++){
480 dummy_int=checks4shift[k];
481 checks[dummy_int]=checks[dummy_int]->next_sorted;
488 dummy_node->next_sorted=reuse_next_sorted;
489 dummy_node->prev_sorted=reuse_prev_sorted;
495 currentnode=checks[nearestchk];
496 for(k=1;k<=offset;k++){
497 currentnode=currentnode->next_sorted;
500 for(k=1;k<=numberoffsets;k++){
501 dummy+=currentnode->data;
502 currentnode=currentnode->next_sorted;
504 medians->
data[samplecount-param.
blocksize+1]=dummy/numberoffsets;
512 currentnode=first_sequence;
514 previousnode=currentnode;
515 currentnode=currentnode->next_sequence;
539 struct node *next_sorted, *next_sequence, *prev_sorted;
547 struct node **checks = NULL;
548 struct node **node_addresses = NULL;
549 struct node *first_sequence = NULL;
550 struct node *last_sequence = NULL;
551 struct node *currentnode = NULL;
552 struct node *previousnode = NULL;
553 struct node *leftnode = NULL;
554 struct node *rightnode = NULL;
555 struct node *reuse_next_sorted = NULL;
556 struct node *reuse_prev_sorted = NULL;
557 struct node *dummy_node = NULL;
558 struct node *dummy_node1 = NULL;
559 struct node *dummy_node2 = NULL;
560 UINT4 ncheckpts,stepchkpts;
561 UINT4 nextchkptindx,*checks4shift;
562 UINT4 nearestchk,midpoint,offset,numberoffsets;
563 UINT4 samplecount,counter_chkpt,chkcount=0,shiftcounter=0;
565 REAL4 nextsample,deletesample,dummy;
566 INT4 shift,dummy_int;
568 REAL4 *sorted_indices;
596 index_block[k].
index=k;
602 if(!sorted_indices) {
608 sorted_indices[k]=index_block[k].
index;
619 checks = (
struct node **)
LALCalloc(ncheckpts,
sizeof(
struct node*));
648 nearestchk=floor(midpoint/stepchkpts);
649 offset=midpoint-nearestchk*stepchkpts;
662 first_sequence=(
struct node *)
LALCalloc(1,
sizeof(
struct node));
670 node_addresses[0]=first_sequence;
671 first_sequence->next_sequence=NULL;
672 first_sequence->next_sorted=NULL;
673 first_sequence->prev_sorted=NULL;
674 first_sequence->data=input->
data[0];
675 previousnode=first_sequence;
676 for(samplecount=1;samplecount<param.
blocksize;samplecount++){
677 currentnode=(
struct node *)
LALCalloc(1,
sizeof(
struct node));
686 node_addresses[samplecount]=currentnode;
687 previousnode->next_sequence=currentnode;
688 currentnode->next_sequence=NULL;
689 currentnode->prev_sorted=NULL;
690 currentnode->next_sorted=NULL;
691 currentnode->data=input->
data[samplecount];
692 previousnode=currentnode;
694 last_sequence=currentnode;
700 currentnode=node_addresses[(int)sorted_indices[0]];
702 checks[0]=currentnode;
703 nextchkptindx=stepchkpts;
705 for(samplecount=1;samplecount<param.
blocksize;samplecount++){
706 dummy_node=node_addresses[(int)sorted_indices[samplecount]];
707 currentnode->next_sorted=dummy_node;
708 currentnode->prev_sorted=previousnode;
709 previousnode=currentnode;
710 currentnode=dummy_node;
711 if(samplecount==nextchkptindx && counter_chkpt<ncheckpts){
712 checks[counter_chkpt]=currentnode;
713 nextchkptindx+=stepchkpts;
717 currentnode->prev_sorted=previousnode;
718 currentnode->next_sorted=NULL;
724 currentnode=checks[nearestchk];
725 for(k=1;k<=offset;k++){
726 currentnode=currentnode->next_sorted;
729 for(k=1;k<=numberoffsets;k++){
730 dummy+=currentnode->data;
731 currentnode=currentnode->next_sorted;
733 medians->
data[0]=dummy/numberoffsets;
738 for(samplecount=param.
blocksize;samplecount<input->length;samplecount++){
739 nextsample=input->
data[samplecount];
740 if(nextsample>=checks[0]->data){
741 for(chkcount=1;chkcount<ncheckpts;chkcount++){
742 if(nextsample>checks[chkcount]->data){
749 rightnode=checks[chkcount];
752 if(nextsample<rightnode->data){
756 rightnode=rightnode->next_sorted;
761 if(nextsample<checks[0]->data){
772 if(rightnode==first_sequence){
773 dummy_node=rightnode;
775 else if(leftnode==first_sequence){
779 dummy_node->data=nextsample;
780 first_sequence=first_sequence->next_sequence;
781 dummy_node->next_sequence=NULL;
782 last_sequence->next_sequence=dummy_node;
783 last_sequence=dummy_node;
787 reuse_next_sorted=rightnode;
788 reuse_prev_sorted=leftnode;
797 deletesample=first_sequence->data;
798 if(deletesample>nextsample){
800 for(k=chkcount;k<ncheckpts;k++){
801 dummy=checks[k]->data;
802 if(dummy>nextsample){
803 if(dummy<=deletesample){
804 checks4shift[shiftcounter]=k;
815 if(deletesample<nextsample){
817 for(k=chkcount;k>=0;k--){
818 dummy=checks[k]->data;
819 if(dummy>=deletesample){
820 checks4shift[shiftcounter]=k;
836 dummy_node=first_sequence;
837 first_sequence=dummy_node->next_sequence;
838 dummy_node->next_sequence=NULL;
839 last_sequence->next_sequence=dummy_node;
840 last_sequence=dummy_node;
841 dummy_node->data=nextsample;
842 dummy_node1=dummy_node->prev_sorted;
843 dummy_node2=dummy_node->next_sorted;
849 dummy_node2->prev_sorted=dummy_node1;
853 dummy_node1->next_sorted=dummy_node2;
856 dummy_node1->next_sorted=dummy_node2;
857 dummy_node2->prev_sorted=dummy_node1;
865 leftnode->next_sorted=dummy_node;
869 rightnode->prev_sorted=dummy_node;
872 leftnode->next_sorted=dummy_node;
873 rightnode->prev_sorted=dummy_node;
881 for(k=0;k<shiftcounter;k++){
882 dummy_int=checks4shift[k];
883 checks[dummy_int]=checks[dummy_int]->prev_sorted;
888 for(k=0;k<shiftcounter;k++){
889 dummy_int=checks4shift[k];
890 checks[dummy_int]=checks[dummy_int]->next_sorted;
897 dummy_node->next_sorted=reuse_next_sorted;
898 dummy_node->prev_sorted=reuse_prev_sorted;
904 currentnode=checks[nearestchk];
905 for(k=1;k<=offset;k++){
906 currentnode=currentnode->next_sorted;
909 for(k=1;k<=numberoffsets;k++){
910 dummy+=currentnode->data;
911 currentnode=currentnode->next_sorted;
913 medians->
data[samplecount-param.
blocksize+1]=dummy/numberoffsets;
921 currentnode=first_sequence;
923 previousnode=currentnode;
924 currentnode=currentnode->next_sequence;
960 const UINT4 nil = bsize;
964 struct qsnode* qsnodes;
966 UINT4 ncheckpts,stepchkpts;
977 REAL8 oldvalue,newvalue;
978 UINT4 oldlesser,oldgreater;
999 nodes = (
struct node*)
LALCalloc(bsize,
sizeof(
struct node));
1002 stepchkpts = sqrt(bsize);
1007 ncheckpts = ceil((
REAL4)bsize/(
REAL4)stepchkpts);
1010 midpoint = (bsize+(bsize&1)) / 2 - 1;
1012 mdnnearest = ceil((
REAL4)midpoint / (
REAL4)stepchkpts);
1022 qsnodes = (
struct qsnode*)
LALCalloc(bsize,
sizeof(
struct qsnode));
1027 for(i=0;i<bsize;i++) {
1028 qsnodes[i].value = input->
data[i];
1029 qsnodes[i].index = i;
1036 for(i=0;i<bsize;i++)
1037 nodes[i].value = input->
data[i];
1038 for(i=1;i<bsize-1;i++) {
1039 nodes[qsnodes[i-1].index].greater = qsnodes[i].index;
1040 nodes[qsnodes[i+1].index].lesser = qsnodes[i].index;
1042 nodes[qsnodes[0].index].lesser = nil;
1043 nodes[qsnodes[1].index].lesser = qsnodes[0].index;
1044 nodes[qsnodes[bsize-2].index].greater = qsnodes[bsize-1].index;
1045 nodes[qsnodes[bsize-1].index].greater = nil;
1051 for(i=0,j=0; (
UINT4)j<ncheckpts; i++,j++) {
1052 if ((
UINT4)j == mdnnearest) {
1053 checkpts[j] = qsnodes[midpoint].index;
1054 if (i*stepchkpts != midpoint)
1057 checkpts[j] = qsnodes[i*stepchkpts].index;
1064 nextnode = checkpts[mdnnearest];
1066 medians->
data[0] = nodes[nextnode].value;
1068 medians->
data[0] = (nodes[nextnode].value
1069 + nodes[nodes[nextnode].greater].value) / 2.0;
1075 for(nmedian=1; nmedian < medians->
length; nmedian++) {
1078 oldvalue = nodes[oldestnode].value;
1081 newvalue = input->
data[nmedian+bsize-1];
1087 for(rightcheckpt=0; rightcheckpt<ncheckpts; rightcheckpt++)
1088 if(newvalue <= nodes[checkpts[rightcheckpt]].value)
1093 if (rightcheckpt == 0)
1095 nextnode = checkpts[0];
1098 nextnode = checkpts[rightcheckpt-1];
1104 while((nextnode != nil) && (newvalue > nodes[nextnode].value)) {
1105 prevnode = nextnode;
1106 nextnode = nodes[nextnode].greater;
1118 if ((oldestnode != prevnode) && (oldestnode != nextnode)) {
1121 if (nodes[oldestnode].lesser == nil) {
1123 nodes[nodes[oldestnode].greater].lesser = nil;
1125 checkpts[0] = nodes[oldestnode].greater;
1126 }
else if (nodes[oldestnode].greater == nil)
1128 nodes[nodes[oldestnode].lesser].greater = nil;
1131 nodes[nodes[oldestnode].lesser].greater = nodes[oldestnode].greater;
1132 nodes[nodes[oldestnode].greater].lesser = nodes[oldestnode].lesser;
1135 oldgreater = nodes[oldestnode].greater;
1136 oldlesser = nodes[oldestnode].lesser;
1141 nodes[oldestnode].lesser = prevnode;
1142 nodes[oldestnode].greater = nextnode;
1143 if (prevnode != nil)
1144 nodes[prevnode].greater = oldestnode;
1145 if (nextnode != nil)
1146 nodes[nextnode].lesser = oldestnode;
1172 if (oldvalue < newvalue) {
1174 for(j=rightcheckpt-1; (j>0)&&(nodes[checkpts[j]].value >= oldvalue);j--)
1175 if (nodes[checkpts[j]].value > oldvalue)
1176 checkpts[j] = nodes[checkpts[j]].greater;
1177 else if (checkpts[j] == oldestnode)
1178 checkpts[j] = oldgreater;
1182 (i<ncheckpts) && (nodes[checkpts[i]].value <= oldvalue); i++)
1183 if (checkpts[i] == oldestnode)
1184 checkpts[i] = oldlesser;
1186 checkpts[i] = nodes[checkpts[i]].lesser;
1191 nodes[oldestnode].value = newvalue;
1195 if (newvalue == oldvalue)
1196 medians->
data[nmedian] = medians->
data[nmedian-1];
1198 nextnode = checkpts[mdnnearest];
1200 medians->
data[nmedian] = nodes[nextnode].value;
1202 medians->
data[nmedian] = (nodes[nextnode].value
1203 + nodes[nodes[nextnode].greater].value) / 2.0;
1207 oldestnode = (oldestnode + 1) % bsize;
1244 const UINT4 nil = bsize;
1245 const BOOLEAN isodd = bsize&1;
1248 struct qsnode* qsnodes;
1250 UINT4 ncheckpts,stepchkpts;
1261 REAL4 oldvalue,newvalue;
1262 UINT4 oldlesser,oldgreater;
1283 nodes = (
struct node*)
LALCalloc(bsize,
sizeof(
struct node));
1286 stepchkpts = sqrt(bsize);
1291 ncheckpts = ceil((
REAL4)bsize/(
REAL4)stepchkpts);
1294 midpoint = (bsize+(bsize&1)) / 2 - 1;
1296 mdnnearest = ceil((
REAL4)midpoint / (
REAL4)stepchkpts);
1306 qsnodes = (
struct qsnode*)
LALCalloc(bsize,
sizeof(
struct qsnode));
1311 for(i=0;i<bsize;i++) {
1312 qsnodes[i].value = input->
data[i];
1313 qsnodes[i].index = i;
1320 for(i=0;i<bsize;i++)
1321 nodes[i].value = input->
data[i];
1322 for(i=1;i<bsize-1;i++) {
1323 nodes[qsnodes[i-1].index].greater = qsnodes[i].index;
1324 nodes[qsnodes[i+1].index].lesser = qsnodes[i].index;
1326 nodes[qsnodes[0].index].lesser = nil;
1327 nodes[qsnodes[1].index].lesser = qsnodes[0].index;
1328 nodes[qsnodes[bsize-2].index].greater = qsnodes[bsize-1].index;
1329 nodes[qsnodes[bsize-1].index].greater = nil;
1335 for(i=0,j=0; (
UINT4)j<ncheckpts; i++,j++) {
1336 if ((
UINT4)j == mdnnearest) {
1337 checkpts[j] = qsnodes[midpoint].index;
1338 if (i*stepchkpts != midpoint)
1341 checkpts[j] = qsnodes[i*stepchkpts].index;
1348 nextnode = checkpts[mdnnearest];
1350 medians->
data[0] = nodes[nextnode].value;
1352 medians->
data[0] = (nodes[nextnode].value
1353 + nodes[nodes[nextnode].greater].value) / 2.0;
1359 for(nmedian=1; nmedian < medians->
length; nmedian++) {
1362 oldvalue = nodes[oldestnode].value;
1365 newvalue = input->
data[nmedian+bsize-1];
1371 for(rightcheckpt=0; rightcheckpt<ncheckpts; rightcheckpt++)
1372 if(newvalue <= nodes[checkpts[rightcheckpt]].value)
1377 if (rightcheckpt == 0)
1379 nextnode = checkpts[0];
1382 nextnode = checkpts[rightcheckpt-1];
1388 while((nextnode != nil) && (newvalue > nodes[nextnode].value)) {
1389 prevnode = nextnode;
1390 nextnode = nodes[nextnode].greater;
1402 if ((oldestnode != prevnode) && (oldestnode != nextnode)) {
1405 if (nodes[oldestnode].lesser == nil) {
1407 nodes[nodes[oldestnode].greater].lesser = nil;
1409 checkpts[0] = nodes[oldestnode].greater;
1410 }
else if (nodes[oldestnode].greater == nil)
1412 nodes[nodes[oldestnode].lesser].greater = nil;
1415 nodes[nodes[oldestnode].lesser].greater = nodes[oldestnode].greater;
1416 nodes[nodes[oldestnode].greater].lesser = nodes[oldestnode].lesser;
1419 oldgreater = nodes[oldestnode].greater;
1420 oldlesser = nodes[oldestnode].lesser;
1425 nodes[oldestnode].lesser = prevnode;
1426 nodes[oldestnode].greater = nextnode;
1427 if (prevnode != nil)
1428 nodes[prevnode].greater = oldestnode;
1429 if (nextnode != nil)
1430 nodes[nextnode].lesser = oldestnode;
1456 if (oldvalue < newvalue) {
1458 for(j=rightcheckpt-1; (j>0)&&(nodes[checkpts[j]].value >= oldvalue);j--)
1459 if (nodes[checkpts[j]].value > oldvalue)
1460 checkpts[j] = nodes[checkpts[j]].greater;
1461 else if (checkpts[j] == oldestnode)
1462 checkpts[j] = oldgreater;
1466 (i<ncheckpts) && (nodes[checkpts[i]].value <= oldvalue); i++)
1467 if (checkpts[i] == oldestnode)
1468 checkpts[i] = oldlesser;
1470 checkpts[i] = nodes[checkpts[i]].lesser;
1475 nodes[oldestnode].value = newvalue;
1479 if (newvalue == oldvalue)
1480 medians->
data[nmedian] = medians->
data[nmedian-1];
1482 nextnode = checkpts[mdnnearest];
1484 medians->
data[nmedian] = nodes[nextnode].value;
1486 medians->
data[nmedian] = (nodes[nextnode].value
1487 + nodes[nodes[nextnode].greater].value) / 2.0;
1491 oldestnode = (oldestnode + 1) % bsize;
#define ABORT(statusptr, code, mesg)
#define ATTATCHSTATUSPTR(statusptr)
#define ASSERT(assertion, statusptr, code, mesg)
#define DETATCHSTATUSPTR(statusptr)
#define INITSTATUS(statusptr)
#define RETURN(statusptr)
unsigned char BOOLEAN
Boolean logical type, see Headers LAL(Atomic)Datatypes.h for more details.
double REAL8
Double precision real floating-point number (8 bytes).
int64_t INT8
Eight-byte signed integer; on some platforms this is equivalent to long int instead.
uint32_t UINT4
Four-byte unsigned integer.
int32_t INT4
Four-byte signed integer.
float REAL4
Single precision real floating-point number (4 bytes).
LAL status structure, see The LALStatus structure for more details.
Vector of type REAL4, see DATATYPE-Vector types for more details.
REAL4 * data
Pointer to the data array.
UINT4 length
Number of elements in array.
Vector of type REAL8, see DATATYPE-Vector types for more details.
REAL8 * data
Pointer to the data array.
UINT4 length
Number of elements in array.