annotate region_motif_lib/regions.cpp @ 0:5c044273554d draft

initial commit
author jeremyjliu
date Tue, 05 Aug 2014 13:56:22 -0400
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
1 #include <iostream>
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
2 #include <vector>
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
3 #include <algorithm>
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
4 using namespace std;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
5
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
6 extern "C" {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
7 typedef pair <int,int> Se_t;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
8 bool se_lt (const Se_t &l,const Se_t &r) { return l.first < r.first; }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
9
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
10 void merge_regions(int *regions, int*nregionsR,int *merge_sepR) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
11 int nregs=nregionsR[0];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
12 if(nregs==0) return;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
13 int sep=merge_sepR[0];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
14 if(sep<1) sep=1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
15 vector<Se_t> reg(nregs);
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
16 for(int ireg=0;ireg<nregs;ireg++) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
17 reg[ireg]=make_pair(regions[ireg*2],regions[ireg*2+1]);
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
18 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
19 sort(reg.begin(),reg.end(),se_lt);
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
20 int *reg_index = new int[nregs];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
21 for(int ireg=1;ireg<nregs;ireg++) reg_index[ireg]=-1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
22 reg_index[0]=0;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
23 int last_ireg=0;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
24 int counter=1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
25 for(int ireg=1;ireg<nregs;ireg++) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
26 if(reg[ireg].first<=reg[last_ireg].second+sep) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
27 if(reg[ireg].second>reg[last_ireg].second) reg[last_ireg].second=reg[ireg].second;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
28 } else {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
29 last_ireg=ireg;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
30 reg_index[counter]=ireg;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
31 counter++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
32 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
33 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
34 for(int ireg=0;ireg<counter;ireg++) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
35 regions[ireg*2] = reg[reg_index[ireg]].first;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
36 regions[ireg*2+1] = reg[reg_index[ireg]].second;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
37 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
38 nregionsR[0]=counter;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
39 delete [] reg_index;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
40 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
41 void region_minus_region(int *regions, int*nregionsR,int *region2s, int*nregion2sR,int *updatedregions) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
42 int sep=1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
43 merge_regions(regions,nregionsR,&sep);
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
44 merge_regions(region2s,nregion2sR,&sep);
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
45 int nregs=nregionsR[0];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
46 int nreg2s=nregion2sR[0];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
47 for(int i=0;i<2*(nregs+nreg2s);i++) updatedregions[i]=-1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
48 if(nregs==0) return;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
49 int ireg = 0;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
50 int iregout = 0;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
51 for(int ireg2=0; ireg2<nreg2s;ireg2++) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
52 if(ireg==nregs) break;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
53 if(region2s[ireg2*2+1] < regions[2*ireg]) continue;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
54 if(region2s[ireg2*2] > regions[2*ireg+1]) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
55 updatedregions[2*iregout] = regions[2*ireg];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
56 updatedregions[2*iregout+1] = regions[2*ireg+1];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
57 ireg++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
58 ireg2--;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
59 iregout++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
60 continue;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
61 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
62 int s = regions[ireg*2];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
63 int e = regions[ireg*2+1];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
64 int s2 = region2s[ireg2*2];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
65 int e2 = region2s[ireg2*2+1];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
66 if(s2<=s && e2>=e) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
67 ireg++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
68 ireg2--;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
69 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
70 else if(s2<=s) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
71 regions[ireg*2] = e2+1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
72 continue;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
73 } else if(e2>=e) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
74 updatedregions[2*iregout] = s;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
75 updatedregions[2*iregout+1] = s2-1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
76 ireg2--;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
77 iregout++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
78 ireg++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
79 } else {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
80 updatedregions[2*iregout] = s;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
81 updatedregions[2*iregout+1] = s2-1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
82 regions[ireg*2] = e2+1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
83 iregout++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
84 ireg2--;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
85 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
86 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
87 while(ireg<nregs) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
88 updatedregions[2*iregout] = regions[2*ireg];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
89 updatedregions[2*iregout+1] = regions[2*ireg+1];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
90 ireg++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
91 iregout++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
92 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
93 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
94 void intersection_of_regions(int *regions, int*nregionsR,int *region2s, int*nregion2sR,int *updatedregions) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
95 int sep=1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
96 merge_regions(regions,nregionsR,&sep);
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
97 merge_regions(region2s,nregion2sR,&sep);
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
98 int nregs=nregionsR[0];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
99 int nreg2s=nregion2sR[0];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
100 for(int i=0;i<2*(nregs+nreg2s);i++) updatedregions[i]=-1;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
101 if(nregs==0) return;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
102 if(nreg2s==0) return;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
103 int ireg2 = 0;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
104 int iregout = 0;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
105 for(int ireg=0; ireg<nregs;ireg++) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
106 if(ireg2==nreg2s) return;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
107 if(regions[ireg*2+1] < region2s[2*ireg2]) continue;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
108 if(regions[ireg*2] > region2s[2*ireg2+1]) {ireg2++; ireg--; continue;}
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
109
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
110 int s = regions[ireg*2];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
111 if(s<region2s[ireg2*2]) s = region2s[ireg2*2];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
112 int e = regions[ireg*2+1];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
113 if(e>region2s[ireg2*2+1]) {
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
114 e = region2s[ireg2*2+1];
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
115 ireg2++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
116 ireg--;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
117 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
118 updatedregions[2*iregout] = s;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
119 updatedregions[2*iregout+1] = e;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
120 iregout++;
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
121 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
122 }
5c044273554d initial commit
jeremyjliu
parents:
diff changeset
123 }