From 2884e8d9e4528dba4ad7dafb12257e81ab2f6cce Mon Sep 17 00:00:00 2001 From: taivop Date: Fri, 25 Nov 2016 11:11:13 +0100 Subject: [PATCH] #166 intro and exp1 done --- report/milestone2.pdf | Bin 521875 -> 522278 bytes report/milestone2.tex | 36 ++++++++++++++++++------------------ 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/report/milestone2.pdf b/report/milestone2.pdf index a2335d155e993a0056c51046d0b20704d4f4db09..681992d19e6a0e8ef2f776517c26cd68cf0e10ff 100644 GIT binary patch delta 18911 zcmV)8K*qn5?H{J_AF$yK0x~j_aTX|ly;xa~+(Zz5-(O)NA$cUmaUZ@wJS1F#2PDWM z9zq@*yLZRJb`L(X3BR7Iu5MrJ*#Q!Gndzh4UFTQT6?*qx=zVt++W!}~H_yHmp~qw( zWX!$WJ1^m05~V>Vn0H%xul%poZy}RyHB`Fo4@Z$ie%_We=+!Wu53g^3c=j!Si#!$v zS(q_AB=n9Pj*K{+@qG*QLil-I<3RfA-T83jiLbhENyopfCW$igHO2(;pb#es+=Fcbw*7!gBoOtSfCEdUK+%aGp!Pew|SE{Qk? ztw~4JzwZat09O(7$F@`*4F}bK4|^&~6VUN=!*5{}zWn7D{uq45W54R@pVR?^rYg%? zJ)lDJ&aMsmUI9TzvxjOpZ9Xb=+p1zvr9DG6MPA?$Cs+ceydwjacq(8Zf=Fgo6xF>& zD%Fuyq~DG0f%)xZ32iO<%Ny7L%3-AW+o~JJ+*-M@cU7&j)~ec-k){8C{Lito_AY8Y zUNPm-n&k+ZkJx2fuFbTyWp@Cx=<)t^9(OGR-XC+}=+O|MAYvH@M&7Z(-#578qyBM2 z-_d`k{usgN(|7rRBkqHJX{jHJLiPRKSl92}C;i!+rQ6bdr$O~R6aIN|2?x)rhV^v= zgwSVXOv|~krPWSuHQ%Uzya!d6r1m$+{d>353cN#3+b-JOoUbQ88E>db*>{OwuxAU?)z*=ujOuMjv zHl(<*e5~T8YKwZbS0UWBlbWU9s=t}TqXqMeM0 zo>aNzf8IUq+Z z1+j7fC*XD=c=fJ00zTx?Rvd70DN^I)$k*)TICDGMg zK$v~!migYE)!c?dx!U!pIjK8BhAY`}X@c@2sOJhr##j`+a6DEt(){mF{6qYbW9!X&b7(rn`*|OJy5qvjF zqYsLI#$R_ui2`{IgU+3%2d3_v$4bN>5<6Kd5B+t9y>D)J^K-a#>bb(7A2o6=&0LLF z>-_42CJ`Tm(qHXr2=Y1;PittiquB6aPitR|PFSm-Ih*I6myt zj5LWGR6uI%-k8gjiwm4hRO{x=%!0B{m~|0p7&1ZFx)Krsj+ipq z_Hmi{9Xvy6{SK=^9Mt;$p7vofySC|`*fRh}DA_E_A}*ll4p(&;dt8SJc&Md+Qg|W^ zf$qsV43bx3ikVA=m^+JS0&=pwG7NVUVQl(gi((9OwUOo2Q3nvrX2siaAgck>oK=OX zBsN%u+iVL=uET*%a2c>{(_KYZ-%+FtB6u=Ctw#n=oH+G(8V5=AlonIlO1W6gx`V(T z@ubB4hFc&)w$hRdxS3FG#Amx5>gPbh|9} z>~bXlC3p-=J}3Zxo_o2bCzes6pqveGGU$Vff*D5b=9jvx8?tpQlq(|!EuqBu$)?0DKr6wKv&9$ zY^ZA8yRj`)i+t?ud5@aM_M2)M%dU7bJ#^T%@W)Y!_}8s%x3~!?_tNa#S{B9<)aiY2 z0b&q%tyGU?Q4kC4G{#wwI0RceD+K*tEL_?LlOZJ&lUWuO12Z`|myuloEPv#-5q_Uv z(Ju>YfN5EzNF4$4ki%WcTA;BHzCr?!JGUCOc)~)MR>hc-rN9m)jyPQ?)x(yZ=P$ey^0a(a-L;`f{JD zXuRC-)7(afQ`e5qr|US}|9|)J58g(_rM0w8vfFDD=QivThkbtd?F#EvP8*=%U}`#w!a%L~7U^r7l2fKZ{G_ zbsw`tO69Ru`C6jGeF5B~ECJ_8`KAIL>9RnKV+Ug#sf&00h<`fQMaggjH4Eaf%gGjw zKTl&rCc`a;<11ifD$bJZi@*S@Pts`$-rOd_;#{jQsuA|dwGLBi;Y%fZFzpucKw^=( zvfNG8qCQ`O7E`U`1P)ng5ww(+sb~o)v}roN7h}HgP_g#lkBDAv)h*3Dj-Vqxgs(Rs>L0%Xsg(*|Y-_ zb#nyM5A!>Bt*i4VZoJfR7E!LMY6JlqhF%*6NMV$U-VzKu9`-IUtO3_o;MaAI9q8a? z&aq`HtQ*H3`L&zFOHl#3smj?sV;8&UB7}!vp)fLXtACaitX$|X?HeWlBzU)#Z;qbl z)Z{0Dv5)sQi^%p>L8g9m=i_*G1Klso9Q(R?=3&R5fuMyy?Y^%oo(SFh0fLkmxw`e@ z;l5TE4k`hqiqWIy$!CK4i1Eoo1u($?7;+PTE~=K`Dbf&CwM5mQK5flcCTsE*|({*&?k%fqMGBBXT{c=O)I!T!9JO%ikTi4l1Lo1j# z(s&o>xVUAf)vo%CswKXG1(9aU$@1*$Xas|7eU>g7n&*~6B~WbCa4&Qw%vc*k23R_r zWRn|*Vb%`A+?c#!^}IF&Hr?ZKlwifsNQpN9LVxF)XTJsss}sgQgIwRUSk=_W`2mEzF9zP-cQCr+zkx z{&@wbMOIiCh}Wq`<-sqU1-}G^LIf=)#=Zn)QR0s^$JJ(?ZRjQ9pkG|552?ka?FXhf zYk$%Ro4S)t$i3d=Oe-d|&SIk$aX(EqqneI&V#2I4d9%!$bny91ckU>MZn(iY5qiNp zap1OtnZVk*xlNMNBF=7uA*f^Y7^n0U9?dDU&*1jmK$$5X30EWIbI5P>;Cq6Mxf=KTqyB5HPh|Bz#rEQDE6Su4bB@2n*U;2K$uzrgPA+UV1 z^64z%aWit@lFTsJkOY?ri2*SJ-I854+&Y7AcO52B*b-lxrSmS^50FeeZHBjuX%YpS zY;tc83zH5!oZ9hR@!H9rHcZqc8Gk&3%-8I+u#=C1T>7a!S90SD+_Y7za73w5d$~fa ztRy_NTSsSkoF?g)PX=;M`2UP{Q$%(h<)(xu00uM6ZO`{0D>1p=dZuL%W(xHOI7)b9 zisyCjmIpY6S{(2?^;w^0OGX8J zhjwshv~sODO9e&%kM(hoae50Q6`Y3~$uCWN6d`Xdqn~TA=b>$+sbnFT6dE+Q)+HgV zOLv*)f`6`G(z(XuJXvrwH0*S<<$ae*7g zPF^lXt{A2|;Hr^6zFz2@uh*=u7iF?4ywz_7IC(k?oa_{*fkyl|yzGyQPBiFZDFh|T z@M`?2o!(DAEZ}+@R_Kyo`>^&y<7G28g>oKxhDYmZ!HMg+K{6KtYk$Htbee=aMa-OW zRjg19(`Hs5wqz#&Ln1s$Zoo8M!=00FA}E?51dNCfh8!mKtTKBeZ+_^fdjd67+_ami zWtzmv?AhNZiQ4iBHnw^y$)Wff-Yn?X;Jv}m1atdLF!DwMhFazfUM_wZub7}wQCGxR zzV{@bw2)8UWC+U=r+>}YB~EBd`4y-so5BWiV8}?FOziwK6`~eX#i+5zJyC6ePw>1J z6^=;4a@L}Rfpb<8V@K6C-whicXpyX@>8m$8zwV~&3wj>IP>)!ypYa-NEIA-R5O4&= zRpkX+x9QVVyiw7&zMxVGDeId1RL1||aEEa%*(ogFs}z=Ky?;Ai?tZ<4JIkmznd}xM z4TUAr@%_7t+Woz~`xpF$p?yxd^RyrRzu=}U3FIj z2q`cmmW?D@J$_fB_^4wOdbEg8@1)#i4AR&lFZ$iPak(L25@M zl^yfX)JfA4Vrp~tf7Q>?;&jOtha2}NM^z@I!P&deD>Y7T4q>)b29SJVe~sj-DnZL< z1Lfr*6Of{CPWo_-jFTJV>@bf_k!=LFW!lEKsHU2?32&-2UHHFvh1Kwd_p^>m1sH>e zsu-lXMfLvxu_WS1lOZJ&vpye(Bm+4xHdB?@m*iR7gr$H5}pe)KwL>x z?AlH2#IEvMWk1+{z!H#zS`wfE&|3X{`k28%f!x(nPn-)qJ$=t~Q>^Y*V)gGU;eWrm zx%%pjOjc6FnaJeo=602)ai;CcCHM;?#p<`{yZU;qMH2P**D@-7yUjPgS$^1Gua%3+ zwtw1{^)pyP3U#+F3K>b{&?{ z@e^Ll1V-W-kwx7m-y*q<6w$V-%e+NQaps`{_EU>+!$ysSI_&U3@4N)?mw+TgD}P(& zK-+n&%@iM%h*-LS^v_EuOBuUVhb1I5&0$+G_{XZGChVBkJaohdMt7tj_5%fFx^i*m z1d~Qt5xc~#)>*6)&D$lo@apx=)t^@qP!KD*ayph7sE3lVkaD%zUH$flSQRk${Yu0J zMC*Z8?p7vN8X2-({e1P4*R<)50e_M-aiYAUX-}oOM#fU5D;+zlc-8Mh$R%1Ou~S(f zRZt-#qkrI!h@?|A;^c(q*qbO6^jM)#UXwKXPtXOJXTfbz)lvaet^DUj!{7UE-Sph( z^Y>o+uvd|=^bPm&%?6dSIe>Ny76ZRw1%TGW$r#3ojTB}jX1L6SUz zN2moWYO^IP3aCh8gotkL=@1^r@1~!Su#a$wPD;8Mgl0ykUH+lkc~Y!Z;-c=*^*QKx z!QH8zP`}|{Pc!Zm>;WW@Nq-t-Ue%K=!?|74mH`y%BeuL4VsjKa?2ST4s01snoC00; z7;P(-AlLv;CFbWLS<-sM4?B#5*2d$2V?pqtIT3t4^CU1A1Ru9rauZ1OL`D0yEGi;6 zbiBM$3-?WQbce1k-`{hOM2w~<&VZ-L`N34qKevZ^(^pN+z45z}8-I(oc3i2W&9*98 z$2?rp8ftA>L!0-$>&g1mBYKxWVw%|KO?7u@Y1t4ltbU^zc{CXP9c*hRqBh@G1^G5u zy< ztp({J>!nP@8Zp3uk$-L$03ensVVT5Pk1n(}&2GOfS^Vj{yg#&g55$wv9jL7_D*Bhl z)=$F>u4rn48qP;hC%7vR;~aN?V>BQbZ2h7Q#WOY3^~MB^}%bD!l64IaxI%#cH;$z8eIcr(Kq;!bi+ zDGRaS5LEX+fT&}Li2&}G4`4AqkZ1Xa@qshXBit=28GnS;bmsvAp#9I$b!NcQMMfHs z4Xr+fk(bC5<5O-*P&BZ)(Fv|f;A(ozRkV;`0)HA5NI5sejGgbInSfRreBLHMbbf@m zj*Id|DmxG*J49;Vo`}?}Py;8(rXav@ZR~iXoJa2~aNms8V5~7jDh{ z5?es!Eyio`aR}Wy@1s2Y0G*~d24%&;Symie5ERF;;^5H8t%+0errWbF9pcBpx|Hs) z^qaGGW0Ogk4lD<%R=ppY$VBS39UDiQOpL%+27hku+lG#^DZ6gUrE~~HJq{FXBAN@x zw0PxT_ieRba=Ufe54WSHea~)noA+hCdAtU{7hI@7Nz0N%1rL|OB}N4os!_Kg!g!5t zOUn@dYkKgQMp@x^b{~}j-DSEm7H;-W?xPxJ!hKX{u)<}-jdTG9C}j%#I|C#fWp=Ag zR)1NXS!GG5w2CtzkV%pl3=1Ff$0wIB?V|&2j^7C8$5Y0{7QlQaYG4ya)F66{WoqZB zjgJoF!Ynq)q$&2sP>;|ddJ>9FAI1rR_SHAHda zW6cQ&cV~p=+2>#8w>}T!6NE;AQb1&Sk5}fufSj{(&(`QA17#_oxXj7{ z$}TgPSvm00PJ)?|X{=NKVE^kizH_wiw@qH0v1~7}y%sW-*3P&8Z~5q-IPEvD*dPCb zk!QX=_*YP=QkYq=7g=ma+5dIP@P9$1YmdSp@x>WtKl_l&e8R_{%a|<`#CP&CW(y0q zbf7l;3gvIDKg^zm@Ws<4aGBU|E4X%0J|p)JxEderHa*-_PRqpSVR;nM+SrLBEZ;8i zQp84NN6eIGc=>GPmf4`pg;x@t35f07g)yxKie~^z!{N+XUgkx36y=Q2Nq_czCSr5; zL6DM3IY;bf!Qev6>6eOC)F*pHd3mg&FOOBMS*FN{#TgIud^Rn}V4B5gnqDZ#&Otz` zFB4=17S@5hq%zk2{`&U7aW%b~puztT5?%hayRZ1Q`?Ms#0A>(?#R3>K#Vq$1!flz; z%RJy_cOmKEv6Nr)M9A9dA%82;HQ_*;yj!|S4jg_q`pe8ow7HPOHUY9lCr3Y9T8GjN^K68)PT!_X@ zic_0%-_JhuWl;!0t}$qsqoVnZcA=z7Mz2oSFg@ItL4}%{GLoP=O*nocnU$ag$!$;a6eSMWlcO$e6F@Q;H&= z4kK4w!w>Ar%P9fck*s5Lv6g1K1G15x z!xOQzwXqatF3X-GSTI)k-+i0k?cm!D#DGcWDC>aZLse7#H$Q@DgNp0{bhsR+F50r_ zCN*#HJJj(YiLn-hT(gXZ+6*pN^Tlbo2hKJD8eP8gE%xcynk1y?_fTPreR^K>LD!;i;Ak?#!yY>YyEJHad!hpiU6rb7g?0`#?SkjGfXffNkos4JUR#C z>rohrU7t3xI|g{@sjO8U2U$Ew6c(X!2O10R0ksgA@qa6u4l&dbL5p*D-4P57g3$H| zuKl9D*KJ-OZ*{_T&?Kh0EB^(BS5K369BWO}s~M+1(NflTr0b5OP0W^2`V;FWLTwtZ z4~e(pu<>c#G*pJcY?1f5&oNevT*$JLQbVIC$EqRP?A~WoxndA4?}W_=bINA4H)r#1 zGUVNi&wsnUEjutF-KlbyNi_<56H8z2@&gsqX+_0!SmZJ(rlSIvv7qPUWiBV`tkNV> zOM~4#7bu~Sq)Ct+YL(o;Ts8YM8lBV@rPIpm6sY9`gOV*w!AlNA{v}(DIdiE#=E~CP z!;!WIFL4AoVCt0M#=L3`22e_skX);OWH5kqJGOLy<&DB0S

7g8NM^Azu@O6-yRp%E^ZH3nJ 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

3@7Y~@ZpS25wXHj)FEuZk(VB?oHH^eDCeE@ zKoB8eElSEIEJ#esWsfBokLN7Fv+{;fajbli1~%y_LK={%cd`Sj!H)RdgcMuY@; zWSliBNo5A>2xoyx=zmbks05*cQQ0L-n1z&JEP>P3SdfB**QPKG1EePWF5e2-L>fjY z2kE0C!ic4oU5CI}Yn)I_2yA@7o`k_BMCk*Ct-)d-AZjcOw4w|wJTuc8mdGM_PKB|k zc_FBgCxWNW^XHxF=-WlDsuzR7aMGzhTz;LD_K*F+e>>I7;eY739(^{@Q1hiasNPnu zKHJjhRPXEFM14+CGpHOaX@ldk(P;=g5bHn|qh6@z&sFt7Rd0qzLsjjmC*#YnV?5d) z4z$($RDJ(_2mg16#273sHXv&uN3cfQ%-f;3-9dp)YX_b2$>|K*vSDo<+BxXpZpX3$ zN81(vMb@5#J%6MF%!f~`O?C|dQ44^4)X9qqvW7CjGGz^`*$~hU*%Pfc@Eo2Q{1p#j zb%sR&7Hv|z8P5y}?VQ8jW}UznxD1_PCp=s2Ic?)G?UFKcC?@D)i9*mBw#3`0b7}yk z1+utII*NZVkPdv7aoTZiz!lo9Xcl-POpJsV<&azktbe9x+K^80I(Rsm7_>wN5eMjO zLpPz!p+aN;a3YNqE1-2o^x1k{3J zafG2kAb&VhbmSD;<)(OApb*1{ONKC4bYwdk=|n?7e&;@%8BrI4VB{J)N?PNv?b|H# z49V`5oZ-VIKbg63W}`O*T5}jJcyKllgGBr@4~|R$_RnsI(t<7#Jh=6=P;Lo~sS$U% z9T$!qPzS>cKuGF@GYtW?At88iBdI7k9Re36kAIC)25!Yykw@q$S1MDliF99^NZZNN z0upDibXa&zLK!xs3JWMLm^?Whhpe1})pD~!?2#_GMyJ$@*Cb@QNiLA)fZ)a*`G$a6 z;IV}pm)nZD*AxZIIW`2;g4eXjFr#=Y6HDrAv)9h0hJae&kcAsB_m4A8x5*-Z$PEGQ z-hXXcq`DFL0~0bn3q6BdcW#r{{96kNI6`uG1VY&7wcK=CCghv68HU?A48(YH(`#Y< zY?OOA7V~n(JI7j5HP91<=NSnTgQ=#F!?FC)p7g7!K5s` zkI~@r^of0zn_V|+$en7MH{=4AeQ98d>VI%F?0u-QK~){@?W^jj{&S+ftjg@Lds26* zS6HbYOvW&z@uj{r#Xm`=g%pdtDq_e>9%FI_-|& zIXl&l-C4uhI6ct4dfXfJFJwdV)~sy%^`JLA?hj5>^;>`NVleK{J38n%o}3m_8RcMa z|9>|%Y+>;+*IIY^7m1cy!LF}lR`8Tn%)GXYgl02IDVn~FNj@xnW`Q1*I2wK&^s)O| zg4bmlT%F042&W?bNB6wG@hI@!e)qh8_Dwxmbb}iEXWf%=IUX7Dvd~jKlXs}k%QYvG%{`j39Ee*fm> zvQhC3jgP-(d_smgZXbq-kYQrBjSI$V_I~R)FIkh@zAiE=9n$u7B{%k4rn7RNiGM*Q zuDm|Dk-c5Esw?5vk|h>H`swGd{}J~h^SwQ{k~u%f$VOT-ve7&+`U+FKFK^GMW!`19 zWo^;{^a~D|1If=Zw8>cokEqAo9OwMIe{wmhcbX9+amYv@Y+$+HmzUr2mI&z<&=74x zvCA|Vv@36+4MGd#b}V-ncFMwy7$Vl+PA`mNZsyZ(iI&#`WXXwU zUj6Mk2A3`y0X-s4j23$`w@(pk&+OLB!)M2LwpUjkzF4Ju_;@z?F81n%!f{?lcHZJd6&DKSu7mRY`oEtRcq2PPw} zljSF6r+r&D%1*K(sq0mFQ5DW;{=J zjJEV(dU%)dz1X#1HDygiRAZstsm9now_W#?V3Gn6jj}3l7sI!EPp(^ z>UMAbo#(0hvMz3}sz!&m>&ri$KTpJeUfedy1z#KC1u=i<|$ z|NGJLzxK=K=dxQh3P`M~JKdeDq6Q&ZepuW+NEv$4+$}qey1F5PNNE!h_W z^0TV7)#_CJjtm_a-78{~^2C<;Kk_uA|4;ilN27kqydHjmFr1vbmgvL1Jthc$Z&NR| z0V1cq{+~!nKyML#>J?;nPTOx=73eN8-czwLY1}if$IPSRx|}EkjO`WIRr3pbHt2>@ z>@|zaP7(}ZY$xSq8_^23VaTN#L#|Fq?B<|bG^@r|>#|ug0d?&(NSnO}OuL|m4FzA9 z?-V!tWp#PgO>aV9y5;q6uyH+qXg@(|KUK4Y(J-P<8e+iA!@LgBn9fK>HubbFTAdp@ zLX9uj4C_Mquogyk%g>!NEfni7V#8adq9aj{?MZpEND&l;E4+D)) zt|H&s+)OLvTa9kjZsl+CwNa`M{A08IF~7!OS?8U)0kCT2e-@t$Le5`R7Z=U)Z_vHdzP@R9oOtp4U$J&{j z2oHU$7LW6-!*~>A1*`{u!numGammp+iBQ1J#ZwA+PR+*?mOB}ydAjM&Z73*v=;;DR zeE(tCRRTpB*Y}%bd-_u&`k&@0N5egY&(f~sMXea~q9&~3MXeh1qCF;2?$m4Vys7z) zyy?rMv)zNeM|smY?oF**#ha2(>IEm0eCf15vGC8|dB)*iZ#VaUd%E|l{dHFGthC~& zceQ@9cby}hcl*0rTmQM2&c=4Tc`-voeu9X;LcsHw-|SE)VaUgZR@2_5asy$I2=M%X z zIveA&?W5hZqh*bMv5Q~B7>^pe$0RvxZHT>C$`BtOzxwUq*Od&hm*3J5&l>&8hS;k` ztkr}wu)c=a>qSVLrbKIOh`k*cVy9t^dx8QoYsMZq(8j_{iq0b{D@p2#9cQ&gMh zLfJ^V!to%GBL(D0NKYj)G`h=)9_ecQKc%PAO70_nOq?Ood!%YqSVMT&cToWIchMSSQ zj=<@z$7+o<+{{L%JX{GLrVFE)yxIvp&<&(sDeVn*EbR??m9#hbhiPx< zl@{n4?7K;GxAu>Yf8QT1TQrX9DP8yE6nDCdB^Ny@aw7aNh}bC8>S6WWc{FMH|ghi~@gtM@=2HA-Ce`BY-M#@oxtg{e-GDvyX z*{U9%{`&sK+hwh)e8S^8utsC{bhYB)!-G5BlHPwGF|esa<->8SKi7`Rg%0%uQLOKw zmV-mBt+X#^LUq|euUOeGEaRuC2xm}w(ERVe;-ai_Ks+D^{2ceq8Q`bCsZ)#WAC4`f?@PRzIDP$SYO|| z*oT$hUj@S$Id)lZoz4CS$6F9@moe`G6Nl{M0*CD51BdM61c&V71&8e82Dj|v2TKD5 zF)=VSIhQ==2Ob46F)%baw_oQ6wFgo)I5K|(e*K|?|^H%2r#GBPzbMKCo& zGC?&yAUriVI7B%_I7Br;LN+!*Lqak)Ml?7wGBq|uFf~FlK{Y;I3NK7$ZfA68ATc*L zG?Q@_D1RlFTWlUj8HV?p-T(jNB#sk1O&lkV6FWZSWXH+c&N_8$Cw3e=&iUXZj-690 z)LtZla;!k&hFqlzG*Y3zK;lpYTtFK{D}*`~Q4xqLa07^n7AS}wpp&-ZA}Z=dndgl! z9?$pA?Cihayx;6>lDO%QU6Q!OlFIe?F9};+;(w}}(F{1W0klnoDag=vqHQEBfihZw z)fp!{g9pOsQ7$3Vx&{_yrfhM#H+FHWZU=7*=v}QtKEm{rQ8bVF54s9Wt zE`QU_ThSJwH4*BEZ$Mj&rd#TvJJ4#;8VQxKF0|EX`ngK>CbTtZJdx8vZ9!{B)1z($ z-Dp}5vf+BbHZrqvq?-$fVl=aAUK4kT;XfT^r@e;3BvLE@N-iFSiV;T7Q0I zP_6PZn=i+27f)4taw;qKfvArPlj!PstDUH=~x)|#LgErj;aVb z7_nq-D0bZZn>w&)*aP;1VN1rYsRN$|);!Eu^2T%0&VWfvPBbaR76D&{DS#8hv?ZUq z7^nYqn}*=Ta0na$7%m*M~^dJ$6GwHkf_pNW8~qf1>HhGX+!P=+J?37 zZU)+Ix0?O*U5)ED``I&bf)`SSJ!XFzQcJsSFW7GG>iztk04Ld67STEjcA35PN%fur z<3NdE+bo6vn`JRCeUobQLX6<##=%1yOo>dQ=!Sa#*- zn$&?5WT0g3{aSUD&3}FH>p07Q+Z9$UUG`(O7JwSC(9+&m#OdQR>evPJj^ah{8!T=8 zhdP$y$&0k`u5Y%q`(<^osvd86y*@FuZvoiMueWs1RgG)4bZj`@X#86W+bn%#QY}sZ zz8zpQkHb7Z_1MgBw)A?P#%;0miPz!;HwG1Mwe;2qQESS|cb`$~fK_S|wWh7oIjYt{t4zGD)*-7r{;XPut@6Da zYUv<%nFCs4m49E+CjdFE>f@&ykdi7XsgjZ^IjHJLM{=rUqe?ca`ZUtFkPh4W+R^8Y yzGuirm26apt@2KHyxRvmlm7!}l;nE~Wo~41beC}U2Nw)7Ffuea3MC~)Peux3jI2oj delta 18559 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 K3MC~)Peux0A;>rY diff --git a/report/milestone2.tex b/report/milestone2.tex index 0d0ecd2..791dab2 100644 --- a/report/milestone2.tex +++ b/report/milestone2.tex @@ -56,12 +56,12 @@ \section*{Definitions and setup} \begin{itemize} \item The \emph{system under test} (SUT) is the middleware together with the connected memcached servers, running on Ubuntu virtual machines in the Azure cloud. -\item \emph{Throughput} is the number of requests the SUT successfully responds to, per unit of time, as measured by memaslap. +\item \emph{Throughput} is the number of requests that SUT successfully responds to, per unit of time, as measured by memaslap. \item \emph{Response time (memaslap)} is the time from sending to receiving the request to the SUT including any network latencies, as measured by the client (memaslap). \item \emph{Response time (middleware)} is the time from receiving the request in the middleware ($t_{created}$) to returning it to the client ($t_{returned}$), as measured by the middleware. This is the measurement used in most graphs here; the reasoning behind this is shown in \hyperref[sec:appb]{Appendix B}. \item $S$ denotes the number of memcached servers in SUT. \item $R$ denotes the replication factor. ``No replication'' means $R=1$, ``half'' or ``50\%'' replication means $R=\lceil\frac{S}{2}\rceil$, ``full replication'' means $R=S$. -\item $W$ denotes the proportion of \set{}s in the workload. +\item $W$ denotes the proportion of \set{} requests in the workload. \item $C$ denotes the total number of virtual clients (i.e. summed over all memaslap instances). \end{itemize} \vspace{1mm} @@ -69,10 +69,10 @@ \section*{Definitions and setup} \begin{itemize} \item The system was modified compared to the last milestone. The modifications and new trace results are shown in \hyperref[sec:appa]{Appendix A}. \item The middleware was run on Basic A4 instances, and both memaslap and memcached were run on Basic A2 instances. -\item The first 2 and last 2 minutes of each experiment were discarded from analyses as warm-up and cool-down time. -\item The request sampling rate for logging is set to $\frac{1}{100}$ in throughput experiments (Section~\ref{sec:exp1}) and $\frac{1}{10}$ in replication and write proportion experiments (Sections~\ref{sec:exp2} and \ref{sec:exp3}). -\item Response times inside the middleware were measured with a 1 millisecond accuracy. -\item The system can be considered closed because memaslap clients wait for a response before sending a new request. +\item The first 2 and last 2 minutes of each experiment were discarded from all analyses as warm-up and cool-down time. +\item The request sampling rate for logging was set to $\frac{1}{100}$ in throughput experiments (Section~\ref{sec:exp1}) and $\frac{1}{10}$ in replication and write proportion experiments (Sections~\ref{sec:exp2} and \ref{sec:exp3}). +\item Response times inside the middleware were measured with a minimal resolution of 1 millisecond. +\item The system can be considered closed because (memaslap) clients wait for a response before sending a new request. \end{itemize} @@ -86,19 +86,19 @@ \section{Maximum Throughput} \subsection{Experimental question} -In this section, I will run experiments to find out a) the maximum throughput of the SUT, b) the number of read threads ($T$) in the middleware that achieves this c) the number of virtual clients ($C$) that achieves this. +In this section, I will run experiments to find out a) the maximum sustained throughput of the SUT, b) the number of read threads ($T$) in the middleware that achieves this, and c) the number of virtual clients ($C$) that achieves this. -To this end, I will measure throughput as a function of $T$ and $C$, in 10-second time windows. I will find the maximum sustained throughput of the SUT, i.e. the throughput at which the response time does not increase rapidly with additional clients. For each parameter combination, I will run experiments until the 95\% confidence interval (calculated using a two-sided t-test) lies within 5\% of the mean throughput. +To this end, I will measure throughput as a function of $T$ and $C$ in 10-second time windows. I will find the maximum sustained throughput of the SUT, i.e. the throughput at which the response time does not increase rapidly with additional clients. For each parameter combination, I will run experiments until the 95\% confidence interval (calculated using a two-sided t-test) of throughput lies within 5\% of the mean. \subsection{Hypothesis} -I approximate that the maximum throughput will be 17200 requests per second using 50 read threads in the middleware at a load of 550 clients. The maximum sustained throughput will occur in a range of 200 clients. +I approximate that the maximum throughput will be 17200 requests per second using 50 read threads in the middleware at a load of 550 clients. The maximum sustained throughput will occur in a range of 200 clients with a similar amount of threads. See below for details. \subsubsection{Optimal number of threads} -Given that requests spend most of their time ($\sim90\%$ in the trace experiment) waiting in the queue, increasing $T$ will increase throughput. If we reduce the queueing time by a factor of 10, it will no longer be the bottleneck (then waiting for memcached's response -- which takes $\sim9\%$ of response time in the trace experiment -- becomes the bottleneck). Assuming the time spent in the queue scales linearly with the number of read threads, we should increase $T$ 10-fold, i.e. $T=50$ maximises throughput. +Given that requests spend most of their time ($\sim90\%$ in the trace experiment) waiting in the queue, increasing $T$ will increase throughput. If we reduce the queueing time by a factor of 10, it will no longer be the bottleneck (then waiting for memcached's response -- which takes $\sim9\%$ of response time in the trace experiment -- becomes the bottleneck). Assuming time spent in the queue scales down linearly with the number of read threads, we should increase $T$ 10-fold (compared to $T=5$ in the trace experiment), i.e. $T=50$ maximises throughput. \subsubsection{Optimal number of clients} -Throughput is maximised at roughly 110 virtual clients per memcached server, so 550 virtual clients in total. This is based on the fact that in the Milestone 1 baseline experiment, the throughput of a single memcached server without middleware saturated at around 110 virtual clients. However, the knee of the graph was at 40 to 50 clients per server, so we can expect the knee to occur at around 200 clients in our setup. The maximum sustained throughput will be in that region because after the knee, additional clients don't increase throughput much but significantly increase response time. +Throughput is maximised at roughly 110 virtual clients per memcached server, so 550 virtual clients in total. I predict this because in the Milestone 1 baseline experiment, the throughput of a single memcached server without middleware saturated at around 110 virtual clients, and here we have 5 servers. However, the knee of the graph was at roughly 40 clients per server, so we can expect the knee to occur at around $5 \cdot 40 = 200$ clients in our setup. The maximum sustained throughput will be in that region because after the knee, additional clients don't increase throughput much but significantly increase response time. \subsubsection{Throughput} @@ -109,12 +109,12 @@ \subsubsection{Throughput} \label{fig:exp1:hyp:throughput} \end{figure} -In the trace experiment the throughput was roughly 10300 requests per second so we have a lower bound for the expected throughput. Naively assuming that the throughput of \get{} requests scales linearly with the number of servers $S$ would yield an expected throughput of $\frac{5}{3} \cdot 10300 = 17200$ requests per second. However, this does not take into account that we will also increase the number of threads (from $T=5$ in the trace experiment). Thus I expect the maximum sustained throughput to be definitely more than 10300 requests per second, and likely to be more than 17200 requests per second. +In the trace experiment the throughput was roughly 10300 requests per second, which gives us a lower bound for the expected throughput. Naively assuming that the throughput of \get{} requests scales linearly with the number of servers $S$ would yield an expected throughput of $\frac{5}{3} \cdot 10300 = 17200$ requests per second. However, this does not take into account that we will also increase the number of threads (from $T=5$ in the trace experiment). Thus I expect the maximum sustained throughput to be definitely more than 10300 requests per second, and likely to be more than 17200 requests per second. I predict that the graph of throughput as a function of the number of clients will look like in Figure~\ref{fig:exp1:hyp:throughput}: rapidly increasing at first, then reaching the knee after which throughput growth is much slower, and then completely saturating. After saturation, the throughput may fall due to unexpected behaviour in the middleware. \subsubsection{Breakdown of response time} -I expect that the most expensive operations inside the middleware will be queueing ($t_{dequeued}-t_{enqueued}$) and waiting for a response from memcached ($t_{forwarded}-t_{received}$). Queueing takes time because for a $C$ that gives a high throughput, the queue will also be non-empty and requests will need to wait. Requesting a response from memcached takes time because of a) the time it takes for memcached to process the request and b) the round-trip network latency. +I expect that the most expensive operations inside the middleware will be queueing ($tQueue=t_{dequeued}-t_{enqueued}$) and waiting for a response from memcached ($tMemcached=t_{forwarded}-t_{received}$). Queueing takes time because for a $C$ that gives a high throughput, the queue will also be non-empty and requests will need to wait. Requesting a response from memcached takes time because of a) the time it takes for memcached to process the request and b) the round-trip network latency. \subsection{Experiments} \begin{center} @@ -135,7 +135,7 @@ \subsection{Experiments} Three client machines were used for all experiments, except for the 1-client experiment, where only one machine was used. -The values of $T$ to test were $T=1$ as the lowest possible value, and then from $T=16$ in multiplicative steps of 2. The reason for the small number of tested values of $T$ is pragmatic: it doesn't require hundreds of experiments and at the same time gives a reasonable approximation of the optimal $T$. +The values of $T$ to test were $T=1$ as the lowest possible value, and then from $T=16$ in multiplicative steps of 2. The reason for the small number of tested values of $T$ and multiplicative steps is pragmatic: it doesn't require hundreds of experiments and at the same time gives a reasonable approximation of the optimal $T$. Some parameter combinations did not yield the required confidence interval in the first 6-minute repetition of the experiment. When that was the case, I re-ran the experiment (in some cases for a longer time), thus producing more datapoints and decreasing the confidence interval. @@ -161,13 +161,13 @@ \subsubsection{Maximum sustained throughput} Figure~\ref{fig:exp1:res:responsetime} shows the percentiles of the response time distribution for each parameter set. It is apparent that for all values of $T > 1$, both the median response time (green line) and 95\% quantile (blue line) increase significantly after 216 clients. For this reason, we will exclude all values of $T > 216$ from consideration as unsustainable. -Of the remaining setups, the highest throughput is achieved both by 180 and 216 clients at $T=32$. Thus we pick the one with the lower number of clients -- \textbf{180 clients and 32 threads} -- as the configuration we will declare optimal at a throughput of 18400 requests per second. Throughput drops rapidly when decreasing $C$ and increases very slowly when increasing $C$. Both $C$ and throughput are close to the expected values; $T$ is lower but not by an order of magnitude. +Of the remaining setups, the highest throughput is achieved both by 180 and 216 clients at $T=32$. Thus we pick the one with the lower number of clients -- \textbf{180 clients and 32 threads} -- as the configuration we will declare optimal at a throughput of 18400 requests per second. Throughput drops rapidly when decreasing $C$ and increases very slowly when increasing $C$. Both $C$ and throughput are close to the predicted values; $T$ is lower but not by an order of magnitude. \subsubsection{Effect of threads and client load} -The dependence of throughput on $C$ for all values of $T$ is as expected: there is a knee at a low value of $C$, a saturation region and a gradual degradation in performance (for $T=64$, this degradation probably occurs at an even higher number of clients than tested here). The saturation regions for $T>1$ have significant fluctuation; however, this is probably noise caused by varying conditions on Azure (this is easy to verify by running more repetitions of these experiments but I decided not to, because the trend is clear and I had limited Azure credit). +The dependence of throughput on $C$ for all values of $T$ is as expected: there is a knee at a low value of $C$, a saturation region and a gradual degradation in performance (for $T=64$, this degradation probably occurs outside the range of $C$ tested here). The saturation regions for $T>1$ have significant fluctuation; however, this is probably noise caused by varying conditions on Azure (this would be easy to verify by running more repetitions of these experiments, but I decided not to because the trend is clear and I had limited Azure credit). -Adding threads to the system improves performance: going from $T=1$ to $T=16$ has a strong effect: both median response time and the 95th and 99th percentiles are significantly improved. Going to $T=32$ improves the system much less: it mainly decreases the response time of outliers while keeping median response time similar. Going from $T=32$ to $T=64$ makes almost no difference. This happens because at $T=16$, most of the CPU time available to the middleware is utilised, and at $T=32$, almost all of it is -- which means additional threads don't significantly improve performance. +Adding threads to the system improves performance: going from $T=1$ to $T=16$ has a strong effect: both median response time and the 95th and 99th percentiles are significantly improved at most values of $C$. Going to $T=32$ improves the system much less: it mainly decreases the response time of outliers while keeping median response time similar. Going from $T=32$ to $T=64$ makes almost no difference. This happens because at $T=16$, most of the CPU resources available to the middleware are utilised, and at $T=32$, almost all of it is -- which means additional threads don't significantly improve performance. \subsubsection{Breakdown of response time} @@ -178,7 +178,7 @@ \subsubsection{Breakdown of response time} \label{fig:exp1:res:breakdown} \end{figure} -The distribution of time \get{} requests spend in different parts of the middleware is shown in Figure~\ref{fig:exp1:res:breakdown}, and the means in Figure~\ref{fig:exp1:table}. As expected, the most expensive operations are queueing and waiting for a response from memcached. The distributions of $tQueue$ and $tMemcached$ are bimodal with a second peak at roughly 8ms. The second peak in $tMemcached$ causes the peak in $tQueue$ (because if a request takes a long time in memcached, the next request waits longer in the queue); the peak in $tMemcached$ is most likely to be caused by unusual network conditions for a portion of the requests because there were no \get{} misses in the log. +The distribution of time \get{} requests spend in different parts of the middleware is shown in Figure~\ref{fig:exp1:res:breakdown}, and the means in Figure~\ref{fig:exp1:table}. As expected, the most expensive operations are queueing and waiting for a response from memcached. The distributions of $tQueue$ and $tMemcached$ are bimodal with a second peak at roughly 8ms. The second peak in $tMemcached$ causes the peak in $tQueue$ (because if a request takes a long time in memcached, the next request waits longer in the queue); the peak in $tMemcached$ is most likely to be caused by unusual network conditions for a portion of the requests because there were no \get{} misses in the log that could hypothetically have different response times than successes. \begin{figure}[h] \begin{center}