From 9e033d244ff2a4f62318f8aada1e9fc0e6ba058d Mon Sep 17 00:00:00 2001 From: ewerlopes Date: Wed, 22 Feb 2017 12:39:22 +0100 Subject: [PATCH 1/5] mSWAB addition --- .idea/misc.xml | 4 + .idea/modules.xml | 8 + .idea/simple-segment.iml | 12 ++ .idea/vcs.xml | 6 + .idea/workspace.xml | 367 +++++++++++++++++++++++++++++++++++++++ example.py | 52 +++--- fit.pyc | Bin 0 -> 1246 bytes segment.py | 69 +++++++- segment.pyc | Bin 0 -> 5168 bytes wrappers.pyc | Bin 0 -> 908 bytes 10 files changed, 488 insertions(+), 30 deletions(-) create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/simple-segment.iml create mode 100644 .idea/vcs.xml create mode 100644 .idea/workspace.xml create mode 100644 fit.pyc create mode 100644 segment.pyc create mode 100644 wrappers.pyc diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..a80ede4 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..1822fdf --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/simple-segment.iml b/.idea/simple-segment.iml new file mode 100644 index 0000000..6f63a63 --- /dev/null +++ b/.idea/simple-segment.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..efdc840 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,367 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + step + seq_range + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1487617799181 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/example.py b/example.py index 8a6da58..3435633 100644 --- a/example.py +++ b/example.py @@ -24,41 +24,49 @@ def draw_segments(segments): max_error = 0.005 #sliding window with regression -figure() -segments = segment.slidingwindowsegment(data, fit.regression, fit.sumsquared_error, max_error) -draw_plot(data,"Sliding window with regression") -draw_segments(segments) +#figure() +#segments = segment.slidingwindowsegment(data, fit.regression, fit.sumsquared_error, max_error) +#draw_plot(data,"Sliding window with regression") +#draw_segments(segments) #bottom-up with regression -figure() -segments = segment.bottomupsegment(data, fit.regression, fit.sumsquared_error, max_error) -draw_plot(data,"Bottom-up with regression") -draw_segments(segments) +#figure() +#segments = segment.bottomupsegment(data, fit.regression, fit.sumsquared_error, max_error) +#draw_plot(data,"Bottom-up with regression") +#draw_segments(segments) #top-down with regression -figure() -segments = segment.topdownsegment(data, fit.regression, fit.sumsquared_error, max_error) -draw_plot(data,"Top-down with regression") -draw_segments(segments) +#figure() +#segments = segment.topdownsegment(data, fit.regression, fit.sumsquared_error, max_error) +#draw_plot(data,"Top-down with regression") +#draw_segments(segments) #sliding window with simple interpolation -figure() -segments = segment.slidingwindowsegment(data, fit.interpolate, fit.sumsquared_error, max_error) -draw_plot(data,"Sliding window with simple interpolation") -draw_segments(segments) +#figure() +#segments = segment.slidingwindowsegment(data, fit.interpolate, fit.sumsquared_error, max_error) +#draw_plot(data,"Sliding window with simple interpolation") +#draw_segments(segments) #bottom-up with simple interpolation -figure() -segments = segment.bottomupsegment(data, fit.interpolate, fit.sumsquared_error, max_error) -draw_plot(data,"Bottom-up with simple interpolation") -draw_segments(segments) +#figure() +#segments = segment.bottomupsegment(data, fit.interpolate, fit.sumsquared_error, max_error) +#draw_plot(data,"Bottom-up with simple interpolation") +#print segments +#draw_segments(segments) #top-down with simple interpolation +#figure() +#segments = segment.topdownsegment(data, fit.interpolate, fit.sumsquared_error, max_error) +#draw_plot(data,"Top-down with simple interpolation") +#draw_segments(segments) + +#swab with simple interpolation figure() -segments = segment.topdownsegment(data, fit.interpolate, fit.sumsquared_error, max_error) -draw_plot(data,"Top-down with simple interpolation") +segments = segment.m_swab(data, fit.interpolate, fit.sumsquared_error, max_error) +draw_plot(data, "Swab with simple interpolation") +print segments draw_segments(segments) diff --git a/fit.pyc b/fit.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fcee5cf4f23369ba3f21397ce6f1085b78f68095 GIT binary patch literal 1246 zcmbu8&2G~`5XZ+Gr%4KxDkwsM%N~tXaB|>=5K=iJ4n~zwRH?G!O|azH?#{YRq~ru| z!;^950pLFyrzsK_sFR(Y*^imo-|TjN9v%L8{r&Tl+E1Z>hsH5PhJQc>(ITKpKtZPH z8_`5j*6~V*vd}9bWnKCd9bixX3ttpKbB`ekld|KhCbfo(yfm}iO(jMjEkrv*<1xfK zpo@?;iZ&hEKwRsHuHrky_v$eYD_sbK1PBN6iLEP#BR>@yy15_Inr|E zyVbT^jNuIUqLi%(fDC7l?pvC8GEXU@?*rKWp$M4Ox5zWS&FY3a)Y%`0I?5ld^ zj#;9eTs7y`lKEO&jU|b%v-`KjFxAxBk55CFG@TFed$ibR5W~w3f!5&$bP0P zrSf~Q1{x;UU7CfcNC#2)9HOmAv>ctTMyJd1>1zB!K%)pd?5=|KSLnLoyqx=$snyoZ zadkMa${da<7n*m 0: - mergesegments[idx-1] = create_segment(sequence,(segments[idx-1][0],segments[idx][2])) - mergecosts[idx-1] = compute_error(sequence,mergesegments[idx-1]) + merge_seg = create_segment(sequence, (segments[idx - 1][0], segments[idx][2])) + mergecosts[idx - 1] = compute_error(sequence, merge_seg) - if idx+1 < len(mergecosts): - mergesegments[idx+1] = create_segment(sequence,(segments[idx][0],segments[idx+1][2])) - mergecosts[idx+1] = compute_error(sequence,mergesegments[idx]) + if idx + 1 < len(mergecosts): + merge_seg = create_segment(sequence, (segments[idx][0], segments[idx + 1][2])) + mergecosts[idx] = compute_error(sequence, merge_seg) - del mergesegments[idx] del mergecosts[idx] return segments @@ -111,3 +113,54 @@ def topdownsegment(sequence, create_segment, compute_error, max_error, seq_range rightsegs = topdownsegment(sequence, create_segment, compute_error, max_error, (bestidx,seq_range[1])) return leftsegs + rightsegs + + +def m_swab(sequence, create_segment, compute_error, max_error, buffer_size=80): + segs = [] + win_left = 0 + win_right = buffer_size-1 + + seq_range = (0, len(sequence)-1) + + while True: #while new data: + swabbuf = sequence[win_left:win_right] + # Bottom-Up segmentation of buffer + T = bottomupsegment(swabbuf, create_segment, compute_error, max_error) + #cleanT = [] + + #for line in T: + # cleanT.append((win_left+line[0], line[1], win_left + line[2], line[3])) + + # add left-most segment from BU: + segs.append(T[0]) + n = len(segs) + + # merge last segments if slope is equal + if n > 2: + last_slope = (segs[-1][3] - segs[-1][1]) // (segs[-1][2] - segs[-1][0]) + b_last_slope = (segs[-2][3] - segs[-2][1]) // (segs[-2][2] - segs[-2][0]) + if last_slope == b_last_slope: + # merge segments + new_segs = segs[:-2] + merged = create_segment(sequence, (segs[-2][0], segs[-1][2])) + new_segs.append(merged) + segs = new_segs + n -= 1 + + # shift left of buffer window: + win_left += segs[-1][0] + # shift right of buffer window: + if win_right < seq_range[1]: + i = win_right + 1 + # get sign of the slope + s = np.sign(sequence[i] - sequence[i-1]) + while np.sign(sequence[i] - sequence[i-1]) == s: + i += 1 + if i >= seq_range[1]: + i -= 1 + break + win_right = i + else: + # all done, flush buffer segments: + segs += T[1:] + return segs \ No newline at end of file diff --git a/segment.pyc b/segment.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27f1a43d4337d76f68f18ecf2b5f9ef560e71247 GIT binary patch literal 5168 zcmeI0&5s*J8pf;IUo#%hMLbq{-3Y0rCGao!8!Kj4hSY45=Eyj5*`k^mCQ1t~M_>Z(@_p>HnMc4^IF6URU|Q0OvpAm)}Iv!=cqssrNNAy+D1c)%zvYE2&RWS(eJOR8~|E zM^*Aw*57H@;357Fe+S(PvUU8{@p}Wm{2L^*vdS;9sYPC?htff_AEuQFh zq>i=9{-I`Tbb0cQx{cqx6~BSX{;Os+HNf!P$-1DB!d=Pt*<6XPqAuRSblqu}IqX}Q z-g=0?jU(}V-Er)d~vgNYkZyKwl*(q9%O19QcVHIw#(;**>3NMP(&+=Trs z9fkea+Qm#SdS1PWoUX@$m8eG1w1|ieP>e^DQ5X$}>1lK{D)${mEKL#6PKCECqr926t;mz*5u0yTFFS-$S6tj-y^sGmmE*xzBx77FddtG|4s9; zVJ_Rx z95bQx27dV$upS^f93YUu00bh0vNskS1t%fH(fPfqZ`miIs%X!qSlEhw)nf6*VXjA#*EME43)$J z>;9)vd{E|d;OcQ{zEN}s>}{x)bSYUxcCoeWdfreo9CGP~JF&%07{TVatg>V6124>* zE8bQ;Z59!4GGc^6AAxG#Ak8IvkrOSUGw#pNI9_r3Xoyd8EKa41n+BpwR} z1&AG7awHzbiB#joYo={Nr$f6AQPm-bI($w$RV1Ft?yYY{BACJNip;Bm?*+Sh zH@E@>Zv+i}MZXYSKzbqA2t)>+Lp#2S1j69#PsuN*?M$IO0It)rQ=Z2KahvaVUfV= z57WpB+78mhbf`8(GTL;E4NBr+(k35%n3uFVf}k9lKDI7U^$tkB#`_SrY?Z}>`@Y$Z zHh?Ra^k=+;9#gpAYjcee_L>n#9Di`_|9p+DgzMYrg z{cXnZYa~wbJ`c594fb>kdY8ZRdXxV^ZzI_AX?z>4g}%=r!hTJC$ zEt*iOC_lC-UsKaBHPD-Vr^zQYuc==FXOwgxO~I>&ATh96Q4d6olCyxfrn?F;PGP!` zmbWx2sYUVepjBkCuWuH43T58{j+!q}t)g6AS}<3KRMw_v(@CpoKw?xf3(HyoDAYC4QrTPC(v>Dt|}_~%wKs8S8ktt zrg7Xu3x3SlXOMXR!0ys@jskiamG^qef2lcG?kZ!-6(@bDS>kW;4W~`H;ubSy%H3>Y zIxS=@>+z+68$g;RV_D*PJV@Gn*q*eMWzif>`hAlf=J6-SS#ZH{^<3{K8@w+JRjx=@MCnC z-$0_UA+73qa3NU7qTH>W(~VL?zl#3`HmjGhRI7TY^c*&+_280jLp33%*YtX6OUoBD zk&?+|g#GSs;I8u`6OLV`Ux?6o9mOSHB=@s-)p8GRjMCm@X#T){a!y_&XzZQ>UUI+mr7{UoPgfSrY$eFn0{d@Cho2NBuA`6p=~ws#|`m*fR?|EfN|5!6TI(GgK62_Z->5XQti zV@`H46UO&h@^n;BKn2+@;-+^o^#kgM)NfHgqV*1SxFJ~dV|r8VQH-lyPRM>GAw-7G zF;#*tI*b_eu=9kk?%o1Y<6B!P|G}sRT9n2c>y)lCWvs2OTEMg_jCNkRRjaLWs>my& z7P(jTLP09!%(6692sMILYpS`)F`RN1F=y${mK^g+wg4%6DOXdjLJH`N8LaN2sI^bS z3$fs@s?1!!WHJedegyb^h#%hu?{8m`=Uqd1qIJO2fKBKE@jPoa9+O`f{g!aUjBdwOMcgS0zr)_xZ|gIXK0SSv`y zXS(|Uk_Y0EI1mqDk=PO2Vj|9hB!NiPmd*NaaqeJSC>&y%E|x)?^d7Q*DE}|-5vHA# Rb=DT Date: Wed, 22 Feb 2017 13:28:47 +0100 Subject: [PATCH 2/5] cleaning --- .gitignore | 3 +++ .idea/workspace.xml | 56 ++++++++++++++++++++++++++++++++++---------- example.py | 1 - fit.pyc | Bin 1246 -> 0 bytes segment.py | 21 +++++++++++++---- segment.pyc | Bin 5168 -> 0 bytes wrappers.pyc | Bin 908 -> 0 bytes 7 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 .gitignore delete mode 100644 fit.pyc delete mode 100644 segment.pyc delete mode 100644 wrappers.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..751d2a9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.pyc +*~ +.idea diff --git a/.idea/workspace.xml b/.idea/workspace.xml index efdc840..fda7227 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -21,8 +21,8 @@ - - + + @@ -32,7 +32,7 @@ - + @@ -40,6 +40,16 @@ + + + + + + + + + + @@ -115,6 +125,20 @@