From 3cc3b7fb52db13bc5c7118d7cace09ecab7477d8 Mon Sep 17 00:00:00 2001 From: Pitchaya Boonsarngsuk Date: Wed, 14 Mar 2018 15:39:30 +0000 Subject: [PATCH] =?UTF-8?q?=E0=B8=94=E0=B8=A3=E0=B8=B2=E0=B8=9F=E0=B8=95?= =?UTF-8?q?=E0=B9=8C2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- graphs/hitrate_graph1.png | Bin 45172 -> 46132 bytes graphs/hitrate_graph2.png | Bin 45366 -> 53230 bytes l4proj.tex | 321 ++++++++++++++++++++------------------ 3 files changed, 173 insertions(+), 148 deletions(-) diff --git a/graphs/hitrate_graph1.png b/graphs/hitrate_graph1.png index e6b5974858a924f88739c6cdecfa1d5867f037c5..f6298d67dc058711e1d1b59f0b73dbdf2f58f992 100644 GIT binary patch literal 46132 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 m{7<5I&;jK7mkQ&gm6 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

st`?V8%;sKyHxP2x1b7byLLIbZ-r} z&5_6yFa%bqV&yoC%NSmrmTKI(T6yZlMH`PzRziRtix2U|Y^gV5U1T2a>?YgcME-X#*zvpyu+jiBe;TSIK?5%gS7 zC0|zM+W3>eJiE?0iQ8|~?}AjDc&AqYZ%gmmnxgw)uSIqtP84wMf^V$4wdw=@0-(6L zkULw)ImNp$xh{&=@IH8FAyuY{O`dvqF8hB3b^lPPin>}nnVOYVq|ER9rm66g;sLf$ zTX7kb+(-|A!1yLiE5IA3D#Zy%JC$z<*bX!-WJYZ9M;Y#c{`-8;BgJ!cjcSh0H^ zHZd>gFkLX866ab*`4GY7lU-ZDJN*f{56XyT5$suryu=0x@1DXBup=9(T%2GbNk*ft z9rKrD@{V;Jj^yLWg`*=G3Ys7Jr@ly4R$Ba?P_>MJ@y{LQLev59VlwP*!A~qAAV;G$ zP3L#JN%A@%`j>;~)1&k#(ZxZ0U9qmPdDHXSOi8)dy_r3s8dHM=Jdi(HVv`(G3WpT0 zHLe&XJ(?i&CkB9+ZrQHXUNZx>P;DjRCi4fa-hL-dfKzoO85wgKRL@B2G;sNDhEDrM zMI!uK5c`d&NU<(RPm4Jsh$=|T0O@1j`o@Q)%LKruHYBG>j1)F)kziiA6xXbG;p{Oc^=N3K4j5_7LIO~CpVWa?3O7Nq@{tq|9T zka8DePghvag4_|Pm!vN@JIvAq2zf+BEf}{LJtU*p+91CTn$Rn$BZrXn_JvTGL>eWT z4Alk3w#|1+2qvvb)RIuNM>5BRJUofnIHU$4Z=UsMYH$hhALEgD!+k%YLiDAoN8W|t z2Ei93iQr6;aH-_Z98l&Sy4~0MA!SRjJrHpb-A%#9x}P6a3PS{gW!CgBv)BUOBgvg{ z1X%@XOHG;9KSI;;3;chCri4zmAkSFuIDG>4=wIgXDM$v%gZ7D+CXwS!I)@snIhqsP zy?3%8L!$uymE=jh`DB+IxN{)M!gYx#jRm4vc#n+WIN|_8G#w{!PBkTYoRC@(yNkT) zfklWbF_58#;EDjXKqj9CK~nBf{*OsqI=?zYaJj@pkXH_}pSWYS7Ax3A%&g=uN0!UY zgyRno@+P%_k0S{pKjK0j1?8b4$bYI9N5@XY?I9!uenL`#r1qt+i+4oSnPSKVRi+Q| zNA~umL}^oNn;_vT;s-@Jygj^e1O_CAWQoL>fw2*pV!GMU&Q?qMPEi9wsS4SePy%ZV zD2?Op!%rv=S2&JDA&&p#R+Xdi%)US*x2Hdf1TCx*;0>}i5p`B)L+7DlF7+4cGJ`s8 z3xR44Nb(3l6?(sM!PDt-_qo|6_WXL;)Jl&OOQZpUNW$TctdW!37(1qP_yhJu16cB8 zLPtXovZ)nW`%$k+q*$ zaHb|&;4i3k6mYGla4`N`LfBO-^Kuklm336{TWflpwoO!V#gS;-5{AomF9oy!`uxJdJ~(eqQmqJIrsw`-FLy9H@4>R2L)35Ezo_avYqHwLh^F~F?( z6feUIe0!P33B3|XsM)^^JynfJ$HXf@7!eyBjxj^&^Sk?Vz$f`@oh5-P2v=h?pv5tq zx$e?!!<0+E!Y-*U^x;&dMH^J8U|bw~662*O-iA3CsZ=KZ(HaGn(`}?!h;5Dm_>;px zE?h8^q7XNbwOGA<5_01LxaU%NP+zHQSzFgh0X%9>CVfjp~moDI%`tU=3cY4yu4LfW@u@FF)< zb87-9+A^JR-$c0$SaOwctQUp!(V|=X`uKeWqzYX;wcMhnE_EzX&NT=xP=c%GUOU7% z`4FLJu!A;q^f-gCQ$fu5D`{M) z8dt#J-7au%Ryvk5Q57Sa0||c4irPs}96P?)T=JPCCxOJ9>CAA#gg#p}Je%@Kcd-7J zN!gT;YE0@`y+g)$He_F(0Jot%U1AAWH8}q@>#5heEEmF18*>(vPVL1$`k(KVFkPcf zH5#6;1ljLf1S!NCiPGJ)2*QJxRa2NLzBQqY?$(0eQFp;_-ngA!*h0a56)PW1=Nq)X zzJV@7S~UFm!T(^GlwNYU&-5|?TI#-JobnOiKSC<@DS*jBUU*SOkcDpz7PTo9K|@NZ zxds#(by4;4OGC8|fY&y=T|6ywm@r=b{5})=Ue8H<(0B3NuVRu$9&O$Kh%By-vFX5e z+uh$`lrva(nsN6xNdY)RAgGWH6=2Em%m``uTmAX@<@}-9d)R>E5?Hc(s41DD+*&v;(Njt#y*ITx>VGJyMW4s~ zxl~{a2N%7Z)DAz(G=*R5S(z;Qc6`ctC|NIjExZ@H?sCqA<`6qn+OEAn!KgLilcDPSYpe{?K~UWXEA} zyi$U73046B^62YF{rBfL8TrZKSvGnCjN8y)oE#F_Pd| z2san5-$0!|B(Nd<3oDtZZBqiET5J#WonD2UeF2ww7Qjv--)TxcUz7_`x zyEG4hsC>KH`To{{M9049qKiQl(Vfw~UAmY0C-@?#XKZ*N+fEus;XT1{U0G0T+M6m@ zVl+MZX6e6(g38r=uzD60@{|4LU2ow8BLe@tSi-xSV1RCCUqOW?QNSh;1Z^~I$(#d zl?JC;9HTiy-*?}As2VL5e@06RSd%xU@sdaYlR@=((JjSt} ztnIA@YQj5OR&vIrzys?R&i8LXQfU6FGwnIZlo*JBny~!=qpzcvig=|j-I9GN@&tcQ2( zgXFTkL_(}IEe?>1w$oo{N~XFc_VZos|L9e!!r6EJeD(|F=w*u6E^i~m{;ahU`Us9u)e<_YcOHnz3R!9t958!y@^p5l zc>1#cBI%2fPS*dy6r6co;Z^Nlxb?7~$0_L}kIkd})c?`&lVg|APmUIn?bYz;Zqetn z;n1=Og8EC`sE_l1=?EY?LkLv&Ojp57GyQe(pw3kcC&P0yYYLGgI}6EL_FUdY{hTs1 zqmwm?g{Ph8_U+&qwri1x|7NEk#=-{F-V;NR^khfe;r*F2 zmC{s1mdo_o+SH}u;0=odl*xWygMZ8BU;8-zoPW5K5p8&MkyL-3%#p2=-f%+G(Tp-N z-g}C{@EyvO^2MqD<3mTnJ(!9Xy**gWDfLmlErXYBh6;J5m#HcJ3MtHDQh23Nf2`)e z3nom6v@KK`r^)i~H*#Y}vKo!!hI^^k$kMVYMQ8$`s%!9Js28QLp}UKU=ZHB|s{p6k z|M`~kc?HFp;_duC9xUUm_Vr%zAKJS-6`mv^jZOORP*Vn%>CYCw()e@p{?`c-IF{mK z`;yYRL*WSMlATtGzFpI$7bou1wLhX)=N=w=D`Gd#zbskM()V%Db=aUr28vGl-J|1scus{|#NXhUNBBSfQ}=*B zdGUGJT5tSf%>?FG|03Uk)|F|m&avoEJiNQ(cDj#VKVn+PllrF|S$#-Y0!JI$3)K(g{Ccuz$Lk&r0 zB`@-~c4&2#O&=55*}gGwx~(-zYV4LD0|@#DZz|qh^5qQ+N70smyCzy6B6!==uW}pJ ziv+D=ZRC4+c05&G{VvfcLf3z!A(Wq}UP&F081&xvgG6nPNHaKEFs|KEw@x&x&_g`t z(=*by41EBA!a-C#mWiN{UH^0nh?f?;z=%G^guJKV;ay@eUyIwC!PF!ec%J&lb?^Qb zM1%3(mdVr;5yO@MS2RY>1A?$?$sRiYqe=JCMl?qAlgHIQ$7^S(WmAO_>VqV&wmrBOssN6#+xFAs*HZ3>gi0z&kj586oRO0R zP%H#YC>tZtAsZ{ygHRwC14N6DB(cimTHH1VkU9~TLBc8wK_>H~$;${B;$Mp{b{x&Q zF6&E0oyQ?|gij*(B8wRcN3s5BqV>U zn&1$^p>`JxH=NKJ1Rd?2cT7lSh_~c=X`Az*u-C`!NwtzL^O#~r0DJ7i_e*W}Ax}=W zeJ`#yLPqBtJ^gK3P7TA9U&x6=yH0%Gn*L3Dqy>ahR)JL|_=?d)zd2fxJAW`EAZa&} zQQv=-Hy%I-eg5MBATBB(6(EizFPK=nAe;b|kzFb9J?VT*;YLs?pgmMGZriT}Tr2tq zesEtPIK>hYo;^8tJ;&hif~!Cu)(PpwPEX=ypw_O)i?RCrx4Vo{yB;4XI24 zn$c#HSm(JLMDT&dk-5qIre4Qo7viWs|74t0^iG@us-Et&nY5JHytZ9bSKi4VPRq#1 zS1zP#$;sc6VaxaNI35KDXW*?z2ro?X;`7z+`|tO%caPPDp6e@odoL-Y78q15Qv#S> zB7v>r4v=vGDNbO?NvBdVUuJ_Ap-m!I+x-jjKo$n1inzGAXbi1mXq6+v4-%KnGZU(+ z$0S1^i=Fdiq(xbYJGHE$hz?v-eh2E8`j09>IZ99;cp- zakuu25MSxlE0n?5_)-5;0t-hOk!`o2$o#jB`sb7-6d>mu!H0wPKdG;PuAK0l;w?yG zA|Lk`|Cdqu{C_*DQw4f8z{t`7^iqwlZ@iqG0K7CGoFIfWh*F6J_aYTqXkMMdm(DaV zk3Av^O6w6Kt;+vS=NuswK!{oMp$a4@3I$zdRaK+TH+KxG!rh4qNLp=M0ZCw=jkTpj z|E6JqGt{d0GYfT-i7hOv0P%$^ervN)l1|$YZv)p4mrZ2l<1Zp-Jt-4s3X#2sleslW znfmJ5Xj0?s_Ya=Qmw{ilxQ$NNxkdivG04UNBrD+RuaAd4Pkn+~aOxDk<2_Q6fh;sq zY}0u(#VZJBfQ7`Y(R@5mI9)3RIPF=Yq!2V7A+6@-Cb*bp?^V)dXpV4cq>B&$^q{ta z|Ei99GytC+_1aNbcua{4#q#tdM*;^!yDgyaPqoDkXk&8Cw zv;J!OXZe&Z)+?_9n0}`m;NMsig{CPqMAzv2DUeSJHLX*dE9m4uZW$#p8!04b>)tb62DTMPnMV3L%aIr6p{ zCl$!d^rFSLl@}_cH0)hQz0$t82K3U^=>5HQXhV? z_`|313W1{?xF2cM)SDFwaU$3k)TR-=a7ej0;T=f?UjDrviSlHw`wtg@=w5P!gfS5> zLP$9Xe{ldi2;mR08%Qw-`P}?}N(p8m{xywijzNE!y)j@{2-tNb<(%%wxxG>d2>y1q zjukwRd$z|E6}5H))JALQ>S> zaMb;!m6L?27kdERso*~V2t67>rO+}}!ijeP^>F?r`Fn>YL#OD)s*Svu0D9g!c^6MI z$~z)&7kI#i?z2MsZuGo$ z%y$I)MBu}OvxcYgkbd5m@&cbhEn~m1iAt~kxZkDi(37XDG5}}Rl`aXt=Z8)vu$*&x zSrxyJ6^)Rn{Mco0*qw9Ncw^-kAx%8LCvcnxNH-NOg?~+y^z(4oqnRg!z+;eY(d+oL z203taFi>>hd++$$`7hicxfCK#FQw`@0>CQ@MBYIoT&Z*cGR`4ZoB0F|s-9--6+mFk z4@cV|XWF$g`}q6&BT3=mCbzBpt6M9Ba)@iDz-B2RW>fN=Oq2C&|DwS9WWHzB30+q> z^DLrjW9TAZ1+~B^Yq{+Dwbja^qE6<0wbbED>oZkVh<%=VIsoS9#`;d>Q!7BmSzP13 zpGhF3peYGCy9=paE?qNt=e}b~N5X6WW#D+%n!WM!!;4cg4KRXvv^`VuI+#0z#H4oJ zF~_K$7J(j7t@c;g3GK0u-B3K{*2vpcP(Lq#8~0G;XD~N6w{(0mJJvf66mT~mS}ktO zH$^7}2>4oL1f^Pb*@ukJzDU1-@T<*_CI$9#>F%J4*<~kW8W$q7nSWlBK=3&|3Oc0N zZ?3Fd5wT%}Y7oucTX$D7bT{i_XO9>;IBb^G2fKl{k=r=qdQ$Ca{8}5NqE|!fZ!gLfXT)}yL(9SsPlk)DV z$Boaee0M4xM#u{*OV`FTWVW7pKMZx(a+20YIyS{UB`Y-?_?_bKoPeEdRQT%ZP>Awm`~4B!uIDV@TMI*5b-Hf66DSvyNy2{0~_C|D*4_Al6r-+r)ws}JVMOE?U$9}Uh_ulVC z+`S3KqbKNvB#tq4Z5()dA0e*4&6D+mG=$5c%}eC5uV;A+raZUZZ4PDh_G8!g{NAVd;%Vm-~UXh>L{QsH?ls4Ycjd zf*p^;eFPQzAN$=)YaZNL{&3W~Sc3FT4s=hMrZ~OYx0-xg#(X?&M0L!)Y_{DFSJ564 zM`7cdrq%V7)a5V@^`g@0XBPwxFn5^`PnXYFTV$pWeh1o=oEZhtO*=u!yQQ5W2s>NM ziARwI?QMkZWi-X#cnN6i z0gGc4D6DYk@>$RJ9U^lmeyh{+uS{_n*&aRlCViEAwR8^&wT7~cJ8Rqd58RXjxs(4;O^yD5W zGb%b|>|E+;at*s}M2Zo4+`bwqz|kQyV{fAA@PbE(eRKCv_!_(7v1}**R&A_msIb84 z_RmZdgK%s{p0Y5T!m$uHCp($UmFt{qDg&vZFUwg`EA9HNg|}4i-5B!oNFRTtg0)(^ zc}8T2W`(W$AWFh($B>xBq4Y!XBKu8y8He6U>U}?xn3X_&WLELr7;rA_-}1P0ra6HtX5^=z z-vsNcc`Mhk$jOzk-De+Z=`st6#<^wfzZGSxd>oG?Zu(vToSvgLWg{zX*gi{Dm-(w! zEeokC@7k;K+@$5Lpj06#l`G!NPN^}c%b(3KJDewny+p9?r!x#oN9wdr@3`sDFs}uy zDTmxgOZ=!Vtj$R{ge{Z=wW`UP_t!7>zfK!I=CUvONqI`O#E3=$+xUhp+d%3O@ePja zQC*Epq(Was#P6mS`dep}b~177ryHG~bn4>W$zcQ!y7DtfVsZf(Y;u(25-S8)J9hhx zoK^DGikD!ILAa3BeN$U5KX6S|pi#9xvM{UbnjV??aSe}=EUZV^!wNwL4Pl}x{-qJ{FeR*|Cdn#h;Jo~8*aPrx|I3-JqG#ReRD z9UEo;LrIaX(w3(y9GBHeN8C3axU?#!oZsJ- zcw_VWYXKbd{f`I1lq+wd=z7bh6Pu#m+wM5MnDC>`Q5{P~T0N*K9-2rvBHT!VJT~fr z1$)M|c+>2}8K<#picJy6MeW>$@f-8lujDOK4!;t1<}y;fy{24-Uq}%xoC&Qt+`p=5 zr^Y0ETc}7KVTlPwY45UB2k5zk^#n>u+yC z0~Tf2+F?iPSGSe#-czLBCHurE_sR;hS7{wfsuU=Brl_8EBqIa2Z=`QSIaaN#d`@T4 zF_a%n8r6`T4~@!$#oFsXY)+19IpbWG3rRPwyDWvaIhI&@65Ysno>1+$?LP|uGDrBF zf)*9RAO9~dL#E-sWy6}25hxiFk;_K$eAaUQRc#EB8dkT}0ogYAuJ&StH>#5Q`(2j! zj2pLOX|5f2EmsftoTbC}-GUp?|5a)f<{-C5NzNE9KR zmkB$68P1jEL%I+U&Ur{x?%Rs0gd@}oqJ7U=AdL!Dn^QKPr#N_)#8+?quino4sp+f> zT;Fb1)N zPp=f*Y?bHYZ|TZ41P%W>NG|#$+lfmU?{z)-G97ICrCRLrohl$7w*zK9COh4(`&eoXWo`XA8JDNHUV%fAi1u8svh8V!P;Fl2bve=kVYWuS(;AM zP5#Y9@ub?{s=$Oi6%3;F`4tfI)%6J)r4`@4>ZAx-`O%Vc&}|9eT`Ok~-(yFv$Xb-a z*Y{BJflKpo>Is+{-^U5YXas`s=linUV_j8(!L0c5S+=tvaO@IHi>JAW1dRlaN57GG z6$!PHW7Hvwlll3aYSYSZrj3bs^X;jt>742@swVcSc1LQ65!#|uA)Lg?nCE@;dc3<&$51?`aKOG{u%4D zrLIa#tZb3G!G(1H9uKGU$ze-yihS;lKR6182X#K*4XvY3077&H7>L}@w7x$(qlR~6 zqBZL@Kx{n0E~)D$Cw>x@Hhz zm7!yKc-Y6)0^M3Jc@0~+{m;R+>vEINZda*x#FSa#^p36qnEX|so5at0*tQh4UEB6M zx0{06y2wuDkc+EOW^Sx}r4w`&iOS*W!o1~%j#`yrvNB$i`&1^z9aCykb7+a3I!mS~ zXING-Y1g0h^yI#^IJ0;H&@wi05xp3wG+e%1uo>;`x3qnCBE4|kx-=9MGsxM*Wez# zTX`m^nw5CcC5(q;Jj`A5X}tBHK}|*5N<^}8Tk>r#qhkb2hDPg+*HL@@cX7bIU5F@A z*83XUVMRmE<{3e@bgm7@nUmwX4Q%CHrb|)Oc0>c3AZQTrw|8U2dGXW`v+&gJFq>(8 zr4RR1Rr;5HLP432730o(u}E6W629tccLNRop$AB5c%RhbRmY~r3$KeNRlho({wHpG z2~EQH09XYReJMcYuWEQN>N0(2GH0f#9$(>db7gT`VJ=L7bY8rV5enJ7%dB~dGw}x| z^nt}Y^$mrd9bX_8!N6mf@91lx0@);=^8NA;pW*y+ry<5*U5cXYHvomzIGv9^{8Bq) zCi}@e;=qOJ;^aZt!;}p@@n`ibgB>F+_`*p_Fd-({IjF-%T*d~~CX=z+DZ3+8QrB|C z*hst;=gi1KE^S?uP%c#?sIMjBy`-sk3@zla#QyJeUyu<7{q_}qdBO$-T-9~ObVro+J?=u@)8JMYqgSCr>|$3rgbJ8?GEcwJ)<-TIczk znj57Tpev}i^k+0fkNT)g8zqBt#}hUtNq>=e*-G&_?v3eTo3rS-ne!`BA|?gTZs}*d zJ{Dj?%x}HUDa$SRdRibH9qjRrOSYd#U2|2CLdbAwE-my4$MJm`LokX@59&bmCP%Fc z#$omM)_zc9cL|J(F~pRnInFdOW5WVZg;89`>l+i?4eR+wTwQc;PE>eL=#`08F>$G| zV-F8|d@AqUfA^UEu6^I##0b)R_Gt_85GbcFk>;w>$CXVBFh_?(TuX{L#q=jkRC%}8 ze*Z}v4o=!r7{8kESWp`AW~M2zD9e)i{WmDzi>(Xxb@*1QJwJ*M3?4Z^hi<0}W?Z8s zU5;8+!{gBzf9)*VU3Tfuv%~1_B%i$ZbUIZ{E_duXN56j2uLU3NJ=8nh{I2YGJ(2PP zdU16}lIV!+X4ttz+b2csOjMsWnvoDW4E_lN^E!VRhB7gEl;eN2Hv5SX+Cq3e${&i6 zi=|@-5BK3Jy}+S(rOluzIL39r%4rMH=A7S#Fo>z~rsAyz&kQe#n_T-XA4Nkpha?;t zP7;QR0rm^{$9wRVkvJ2I>ulEVHB z$k<5L3wpoV$4;N#ApNo-e<9q}N+irquD4M>94$B>mQwkq#xio6>-o z1IBDsA&QgKic7YoWkumIm)IoQoK5)gRtOq>WuU5x++NL%f2#DeC%sT4qt@D^z|A=^ ze-=FO@~Qdl1heKk4HlM|0?pz|Ie@x>$K=uyK)wWk4Uac)KS~;DilgLTy|@~PfN%*% zv{Y>0!jsiID^c~!FI0oBn6Ja-cq8)miK2)?eUaSlX}IKZlk4bwu~>#d>wdHQsuDO5z)6mB%TMtsNHi$gPR9m+V3evST;NAYF+IlV+#HaCAb-1p1dh&AIvxeQ73522=JJ&PA$*MOKks0@=&tRm@&Sdx#jIZe!Lsi8b zuwo`W8d*EPpGG8xNMFW+Tu1odP454uI&H~A)+qujhQ-u+5d+y0%a{-sv(LM*Ym@SC zsT;RANU2nlH2wF0qlWmQ-u$TOL34I#K>q<}%EoKS^D=u^R`4XXj1+~YV;vahizr6}&+vUMm(vw|>wCDz5XPnf#Y88;Ztzs8 zsH1>lH1zpF1Z2c!`X7sFxZH4_QBG)@nd9W8Q@HcYYBRYm|A4|wOXk}5<22Lq-<`lc zA|-zL(&0bHor4|>cmyMUbJ?AAc|?>dtn+PBQdVZ9Zbzkx0CTBUC2BX?H$-N`@_8$C z=$>0y(^@J|Fb%WC$mr2*)1xE6;j(Cue!GgPd281{deW9@fBar3$n$4b$bSS)g`W*X zNl_)OzC)DI6+Qq}-#`82jk*x+D*R!TtDWB-)xSl5K4v<$@6Sg`Nl`zkK77B&U2(R+ z9lc(o&OPmx^18e$D9bczf46MR`1Yre`{@}Onv2WJ%U{>l(Dy;1aeZTBNCt<)v5+KJ z#k*aZo~n@Fi#ij1Hf{1nUGenxc4J5~*BUc)b(E0h=fw&(LpJkNTeKe+AYRJllZ zHz!vklUS^z@!nqh1KtDL^bgv+t{Ywp2Hllpqr?T9al+MlztaZt>Oq&Ql^3|(XA68cbhO=}J`?+aNVsMqy?0!G-MVlt7%}E4wY7%_d}XJsQdTrxk;5hSX4;Jc3b^kDtFBp@tZ&OrYCES ztFcb`Xqh{=u&n5Uz+9#i{G*?b>J*P}^2-K@O{=gb&Fe(zXzL8CzLnO^zj~OfCuaS+tU9gVl(OsV>@+)x4Hyn1vfyR4J@ziz9)kpWdA5eG5X<3L<(9l xg@g_QBnMc22Vxm4>LBd~mjCAm<347^Tw{tJuKJyHMw diff --git a/l4proj.tex b/l4proj.tex index c1689de..27c535b 100644 --- a/l4proj.tex +++ b/l4proj.tex @@ -58,7 +58,7 @@ \maketitle \begin{abstract} -In the past few years, data visualisation tools on the web are becoming more popular. D3, a JavaScript library, has a module that focuses on simulating physical forces on particles for creating force-directed layouts. However, the currently-available algorithm does not scale very well for multidimensional scaling. To solve the problem, the Hybrid Layout algorithm and its pivot-based near neighbour search enhancement was implemented and integrated with the D3 module. The existing D3's algorithm and Bartasius' implementation of Chalmers' 1996 algorithm were also optimised for the use case and compared against the Hybrid algorithm. Furthermore, experiments were also performed to evaluate the impact of each user-defined parameters. The results show that for larger data sets, the Hybrid Layout consistently produces fairy good layouts while using less amount of time. It is also capable of working on larger data sets, compared to D3's algorithm. +In the past few years, data visualisation on the web are becoming more popular. D3, a JavaScript library, has a module that focuses on simulating physical forces on particles for creating force-directed layouts. However, the currently-available algorithms does not scale very well for multidimensional scaling. To solve this problem, the Hybrid Layout algorithm and its pivot-based near neighbour search enhancement was implemented and integrated into the D3 module. The existing D3's and Bartasius' implementation of Chalmers' 1996 algorithm were also optimised for the use case and compared against the Hybrid algorithm. Furthermore, experiments were also performed to evaluate the impact of each user-defined parameters. The results show that for larger data sets, the Hybrid Layout consistently produces fairy good layouts in a shorter amount of time. It is also capable of working on larger data sets, compared to the D3's algorithm. \end{abstract} %\educationalconsent @@ -78,48 +78,48 @@ In the past few years, data visualisation tools on the web are becoming more pop \pagenumbering{arabic} % ONLY DO THIS AT THE FIRST CHAPTER \section{Motivation} -In the age of Web 2.0, new data are being generated at an overwhelming speed. Raw data made up of numbers, letters, and boolean values are hard for humans to comprehend and infer any relation from it. To make it easier and faster for us, humans, to understand certain data, various techniques were created to map raw data to a visual representation. +In the age of Web 2.0, new data are being generated at an overwhelming speed. Raw data made up of numbers, letters, and boolean values are hard for humans to comprehend and infer any relation from it. To make it easier and faster for us, humans, to understand a data set, various techniques were created to map raw data to a visual representation. -A data set may have many dimensions while humans live in a 3D space, leading to the challenge of dimensionality scaling. There are many approaches to this problem, each with its own pros and cons. One of the approach is multidimensional scaling (MDS) which hi-light the similarity and clustering of data to the audiences. The idea is to map a data point to a particle in 2D space and place them in a way that the distance between each pair of particle in 2D space represents the distance in high-dimensional space. - -With the recent trend of moving away from traditional native applications to easily-accessible cross-platform web applications, many data visualisation toolkit for JavaScript such as Google Charts, Chart.js and D3.js, are emerging. With these frameworks, it is easier for website designers and content creators to create interactive attention-grabbing infographics, allowing more people to understand their works with less cognitive load required. +Many data sets have many features while humans live in a 3D space, leading to the challenge of dimensionality scaling. There are many approaches to this problem, each with its own pros and cons. One of the approaches is multidimensional scaling (MDS) which hi-light the similarity and clustering of data to the audiences. The idea is to map a data point to a particle in 2D space and place them in a way that the distance between each pair of particle in 2D space represents their distance in high-dimensional space. \begin{figure}[h] \centering - \includegraphics[height=4.5cm]{d3-samples/d3-horizons-chart.png} + \includegraphics[height=5cm]{d3-samples/d3-horizons-chart.png} ~ - \includegraphics[height=4.5cm]{d3-samples/d3-radial-box.png} + \includegraphics[height=5cm]{d3-samples/d3-radial-box.png} - \includegraphics[height=4.5cm]{d3-samples/d3-wordcloud.png} + \includegraphics[height=5cm]{d3-samples/d3-wordcloud.png} ~ - \includegraphics[height=4.5cm]{d3-samples/d3-sunburst-partition.png} - \caption{Several different data visualisation based on the D3 framework: Horizon Chart (top left), Radial Boxplot (top right), Word Cloud (lower left) and Sunburst Partition (bottom right).} + \includegraphics[height=5cm]{d3-samples/d3-sunburst-partition.png} + \caption{Several different visualisations based on the D3 framework: Horizon Chart (top left), Radial Boxplot (top right), Word Cloud (lower left) and Sunburst Partition (lower right).} \label{fig:intro_d3Samples} \end{figure} -One of the most popular free open-source data visualisation library is Data Driven Documents\cite{D3}\cite{D3Web}. The premise is to bind an arbitrary raw data to a web page content and then apply data-driven transformations, breathing life into it, all while only using standard web technologies and avoiding any restriction from proprietary software. This makes the library highly accessible, allowing the application to reach wider audience. +With the recent trend of moving away from traditional native applications to easily-accessible cross-platform web applications, many data visualisation toolkit for JavaScript such as Google Charts, Chart.js and D3.js, are developed. With these libraries, it is easier for website designers and content creators to setup interactive attention-grabbing infographics, allowing more people to understand their works with less cognitive load. -The D3-Force module, part of the D3 library, provide a framework for simulating physical forces on particles. Along with that, a spring model algorithm was also implemented to allow for creation of a force-directed layout. While the implementation is fast for several thousands particles, it does not scale well with larger data set, both in term of memory and time complexity. By solving these issues, the use cases covered by the module would expand to support very large data sets. The motivation of the project is to improve this scalability issues with better algorithms from the School of Computing Science. +One of the most popular free open-source data visualisation library is Data Driven Documents\cite{D3}\cite{D3Web}. The premise is to bind an arbitrary raw data to a web page content and then apply data-driven transformations, breathing life into it, all while only using standard web technologies and avoiding any restrictions from proprietary software. This makes the library highly accessible, allowing applications to reach wider audience. + +The D3-Force module, part of the D3 library, provides a framework for simulating physical forces on particles. Along with that, a spring-model algorithm was also implemented to allow for creation of a force-directed layout. While the implementation is fast for several thousands particles, it does not scale well with larger data sets, both in term of memory and time complexity. By solving these issues, the use cases covered by the module would expand to support more complicated data sets. The motivation of the project is to improve this scalability issues with better algorithms from the School of Computing Science. \section{Project Description} -University of Glasgow's School of Computing Science have some of the fastest force-directed layout drawing algorithm in the world. Some of these are Chalmers' 1996 Neighbour and Sampling technique ($O(N^2)$)\cite{Algo1996}, 2002 Hybrid Layout algorithm\cite{Algo2002} and its 2003 enhanced variant\cite{Algo2003}. These algorithms provide huge improvement, both in term of speed and memory complexity. However, these algorithms are only implemented in an older version of Java which limits its practical use. In 2017, Bartasius have implemented the 1996 algorithm along with several others and a visual interface in order to compare each algorithm against the other\cite{LastYear}. +The University of Glasgow's School of Computing Science have some of the fastest force-directed layout drawing algorithms in the world. Some of these are Chalmers' 1996 Neighbour and Sampling technique\cite{Algo1996}, 2002 Hybrid Layout algorithm\cite{Algo2002} and its 2003 enhanced variant\cite{Algo2003}. These algorithms provide huge improvements, both in term of speed and memory complexity. However, these algorithms are only implemented in an older version of Java which limits its practical use. In 2017, Bartasius have implemented the 1996 algorithm along with several others and a visual interface in order to compare each algorithm against the other\cite{LastYear}. In short, the goal of the project is to \begin{itemize} \item implement Hybrid Layout algorithms from School of Computing Science in JavaScript - \item integrate the implementation into D3 framework and Bartasius' tool set - \item optimise existing implementation of basic sprint model and Chalmers' algorithm for fair comparison - \item evaluate and compare each algorithm another + \item integrate the implementation into the D3 library and Bartasius' tool set + \item optimise existing implementations of basic spring model and Chalmers' algorithm + \item evaluate and compare each algorithm \end{itemize} \section{Outline} The remainder of the report will discuss the following: \begin{itemize} - \item \textbf{Background} This chapter discusses approaches to visualise high-dimensional data, and introduce the theory behind each algorithm implemented and evaluated. - \item \textbf{Design} This chapters discusses choice of technologies. - \item \textbf{Implementation} This chapter will briefly show decisions and justifications made during the implementation, along with several code snippets. + \item \textbf{Background} This chapter discusses approaches to visualise high-dimensional data, and introduce the theory behind each implemented algorithm. + \item \textbf{Design} This chapters discusses choices of technologies. + \item \textbf{Implementation} This chapter will briefly show decisions and justifications made during the implementation process, along with several code snippets. \item \textbf{Evaluation} This chapter will detail the process used to compare the performance of each algorithm, starting from the experiment design to the final result. - \item \textbf{Conclusion} This chapter give a brief summary of the project, reflect on the process in general, and discusses possible future improvements. + \item \textbf{Conclusion} This chapter gives a brief summary of the project, reflect on the process in general, and discusses possible future improvements. \end{itemize} @@ -133,15 +133,17 @@ The remainder of the report will discuss the following: \chapter{Background} \label{ch:bg} -With the emergence of complex data with more than 3 dimensions, there are more need to map the high-dimensional data down to 2D space. Figure \ref{fig:bg_many_multidimension} shows several approaches to the problem. One of the earliest method is to align graphs on the basis of one axis they all share. While it is still being used, the use cases are limited due to all graphs having to share an axis. On the other hand, scatterplot matrix performs scatterplot of every pair of dimensions, allowing users to see relations between many different dimensions. However, the screen space usage also rises quadratically, making it unsuitable for high-dimensional data. +With the emergence of more complex data, each having many features, the need of mapping the high-dimensional data down to 2D space is increasing. Figure \ref{fig:bg_many_multidimension} shows two approaches to the problem. One of the earliest method is to align graphs on the basis of one axis they all share. While it is still being used, the use cases are limited due to all graphs having to share an axis. On the other hand, scatterplot matrix performs scatterplot of every pair of dimensions, allowing users to see relations between many different dimensions. However, the screen space usage also rises quadratically, making it unsuitable for data with a very high number of dimensions. \begin{figure}[h] \centering \begin{subfigure}{0.45\textwidth} + \centering \includegraphics[height=6cm]{d3-samples/d3-single-axis-composition.png} \caption{Single-axis composition} \end{subfigure} \begin{subfigure}{0.45\textwidth} + \centering \includegraphics[height=6cm]{d3-samples/d3-scatterplot-matrix.png} \caption{Scatterplot Matrix} \end{subfigure} @@ -149,62 +151,62 @@ With the emergence of complex data with more than 3 dimensions, there are more n \label{fig:bg_many_multidimension} \end{figure} -Unlike other introduced techniques, Multidimensional scaling (MDS) aims to reduce data dimension by preserving the level of similarity, rather than the values. -Classical MDS\cite{cMDS} achieves this goal by creating new dimensions for scatter-plotting, each made up of a linear combination of the original dimensions, while minimising a loss function called strain, a function similar to stress. -Because strain assumes Euclidean distances, making it incompatible with other dissimilarity ratings, metric multidimensional scaling improves upon classical MDS by generalising the solution to support a variety of loss functions\cite{mcMDS}. However, the disadvantage of $O(N^3)$ time complexity still remains and the limitation of linear combination can be apparent in some data sets. +Unlike the two previously mentioned techniques, multidimensional scaling (MDS) took another approach by aiming to reduce data dimension by preserving the level of similarity, rather than the values. +Classical MDS (also known as Principal Coordinates Analysis or PCoA)\cite{cMDS} achieves this goal by creating new dimensions for scatter-plotting, each made up of a linear combination of the original dimensions, while minimising a loss function called strain. In a way, it is similar to finding the a camera angle to project the high-dimensional scatterplot onto a 2D image. +Because strain assumes Euclidean distances, making it incompatible with other dissimilarity ratings. Metric MDS improves upon classical MDS by generalising the solution to support a variety of loss functions\cite{mcMDS}. However, the disadvantage of $O(N^3)$ time complexity still remains and linear combination may not be enough for some data sets. -This project focuses on several non-linear MDS algorithms using force-directed layout. The idea is to attach each pair of data points with a spring with the equilibrium length proportional to the high-dimensional distance between the two points, although the spring model we know today does not use the Hooke's law to calculate the spring force\cite{Eades}. Several improvements have been introduced to the idea over the past decade. For example, the concept of 'temperature' purposed by Fruchterman and Reingold\cite{SpringTemp} solves the problem where the system is unable to reach an equilibrium state and improves execution time. The project focuses on an iterative spring-model-based algorithm introduced by Chalmers\cite{Algo1996} and the hybrid approach which will be detailed in subsequent sections of this chapter. +This project focuses on several non-linear MDS algorithms using force-directed layout. The idea is to attach each pair of data points with a spring whose equilibrium length is proportional to the high-dimensional distance between the two points, although the spring model we know today does not use Hooke's law to calculate the spring force\cite{Eades}. Several improvements have been introduced to the idea over the past decade. For example, the concept of 'temperature' purposed by Fruchterman and Reingold\cite{SpringTemp} solves the problem where the system is unable to reach an equilibrium state and improves execution time. The project focuses on an iterative spring-model-based algorithm introduced by Chalmers\cite{Algo1996} and the Hybrid approach which will be detailed in subsequent sections of this chapter. -A number of non-linear MDS algorithms were also introduced in the last few years. t-distributed Stochastic Neighbour Embedding (t-SNE)\cite{tSNE}, for example, is very popular in the field of machine learning. It is based on SNE\cite{SNE} where probability distributions are constructed over each pair of data point in a way that the more similar objects have higher probability of being picked. The distributions derived from high-dimensional and low-dimensional distances are then compared and the 2D placement of each data points are then iteratively adjusted to minimise the difference between the two distributions. The downside is that it have both time and memory complexity of $O(N^2)$ per iteration. In 2017, Bartasius\cite{LastYear} implemented t-SNE in D3 and found that not only is it the slowest algorithm in his test, the produced layout is also the many times worse in term of Stress metric, which will be introduced in section \ref{sec:bg_metrics}. +A number of other non-linear MDS algorithms were also introduced in the last few years. t-distributed Stochastic Neighbour Embedding (t-SNE)\cite{tSNE}, for example, is very popular in the field of machine learning. It is based on SNE\cite{SNE} where probability distributions are constructed over each pair of data point in a way that the more similar objects have higher probability of being picked. The distributions derived from the high-dimensional and low-dimensional distances are then compared and the 2D position of each data points are then iteratively adjusted to minimise the difference between the two distributions. The downside is that it have both time and memory complexity of $O(N^2)$ per iteration. In 2017, Bartasius\cite{LastYear} implemented t-SNE in D3 and found that not only is it the slowest algorithm in his test, the produced layout is also the many times worse in term of Stress, a metric which will be introduced in section \ref{sec:bg_metrics}. -The rest of this chapter will describes each algorithm and performance metrics used in this project in detail. +The rest of this chapter will describes each of the algorithm and performance metrics used in this project in detail. \section{Link Force} \label{sec:linkbg} -D3 library, which will be described in section \ref{sec:des_d3}, have a several different force models implemented in its Force module for creating a force directed graph. One of them is link force. In this model, a force is applied between the two nodes at the end of each link. The force pushes the nodes together or apart with varying strength, proportional to the error between the desired and current distance on the graph. Essentially, it is the same basis as the spring model. An example of a graph produced by the D3 link force is shown in figure \ref{fig:bg_linkForce}. In MDS where the high-dimensional distance between every pair of nodes can be calculated, a link will be created to represent the distance, resulting in a complete graph. +D3 library, which will be described in section \ref{sec:des_d3}, have several different force models implemented for creating a force-directed graph. One of them is Link Force. In this model, a force is applied between the two nodes at the end of each link. The force pushes the nodes together or apart with varying strength, proportional to the error between the desired and current distance on the graph. Essentially, it shares the same basis as the spring model. An example of a graph produced by the D3 link force is shown in figure \ref{fig:bg_linkForce}. In MDS where the high-dimensional distance between every pair of nodes can be calculated, a link will be created to represent each pair, resulting in a complete graph. \begin{figure}[h] \centering \includegraphics[height=9.2cm]{d3-samples/d3-force.png} - \caption{An example of a graph produced by D3 link force.} + \caption{An example of a graph produced by D3 Link Force.} \label{fig:bg_linkForce} \end{figure} -The link force algorithm is inefficient. In each time step (iteration), a calculation have to be done for each pair of nodes connected with a link. This means that for MDS with $N$ nodes, the algorithm will have to perform $N(N-1)$ force calculations per iteration, essentially $O(N^2)$. It is also believed that the number of iterations required to create a good layout is proportional to the size of the data set, hence the total time complexity of $O(N^3)$. -The model also cache the desired distance of each link in memory to improve the speed across many iterations. While this greatly reduces the number of calls to the distance-calculating function. the memory complexity also increases to $O(N^2)$. Because the JavaScript memory heap is limited, it runs out of memory when trying to process a fully-connected graph of more than a ten thousands data points. +The Link Force algorithm is inefficient. In each time step (iteration), a calculation have to be done for each pair of nodes connected with a link. This means that for MDS with $N$ nodes, the algorithm will have to perform $N(N-1)$ force calculations per iteration, essentially $O(N^2)$. It is also believed that the number of iterations required to create a good layout is proportional to the size of the data set, hence the total time complexity of $O(N^3)$. +The model also cache the desired distance of each link in memory to improve speed across multiple iterations. While this greatly reduces the number of calls to the distance-calculating function, the memory complexity also increases to $O(N^2)$. Because JavaScript memory heap is limited, it runs out of memory when trying to process a complete graph of more than a thousands data points. \section{Chalmers' 1996 algorithm} -In 1996, Matthew Chalmers proposed a technique to reduce the time complexity down to $O(N^2)$, which is a massive improvement over link force's $O(N^3)$ as described in section \ref{sec:linkbg}, at the cost of accuracy. This is done by reducing the number of spring force calculations per iterations using random samples\cite{Algo1996}. +In 1996, Matthew Chalmers proposed a technique to reduce the time complexity down to $O(N^2)$, which is a massive improvement over link force's $O(N^3)$, potentially at the cost of accuracy. This is done by reducing the number of spring force calculations per iterations, using random samples\cite{Algo1996}. -To begin, each object $i$, is assigned two distinct sets. $Neighbors$ set stores a sorted list of other objects that are closest to $i$, i.e. have low high-dimensional distance. These objects are expected to be put nearby in 2D space. At the start, this set is empty. $Neighbors$ set is referred to as $V$ in the original paper. The second set is $Samples$ (referred to as $S$). This set contains a number of other random objects that not member of the $Neighbors$ set, and is regenerated at the start of every iteration. +To begin, each object $i$, is assigned two distinct sets. $Neighbors$ set, referred to as $V$ in the original paper, stores a sorted list of other objects that are closest to $i$, i.e. have low high-dimensional distance. These objects are expected to be put near $i$ in 2D space. At the start, this set is empty. The second set is $Samples$ (referred to as $S$). This set contains a number of other random objects that not member of the $Neighbors$ set, and is regenerated at the start of every iteration. -In each iteration, each object $i$ only perform spring force calculations against every other objects in its $Neighbors$ and $Samples$ sets. Afterward, each random object is then compared against other objects in the $Neighbors$ set. If a random object is closer to $i$, then it is swapped into the $Neighbors$ set. As a result, the $Neighbors$ set becomes a better representative of the most similar objects to $i$. +In each iteration, each object $i$ only performs spring force calculations against every other objects in its $Neighbors$ and $Samples$ sets. Afterward, each random object is then compared against other objects in the $Neighbors$ set. If a random object is closer to $i$, then it is swapped into the $Neighbors$ set. As a result, the $Neighbors$ set becomes a better representative of the most similar objects to $i$. -The total number of spring calculations per iteration reduces from $N(N-1)$ to $N(Neighbours_{size} + Samples_{size})$ where $Neighbours_{size}$ and $Samples_{size}$ denotes the maximum number of objects each $Neighbours$ and $Samples$ set, respectively. Because these two numbers are pre-set constants, the time complexity is $O(N)$. +The total number of spring calculations per iteration reduces from $N(N-1)$ to $N(Neighbours_{size} + Samples_{size})$ where $Neighbours_{size}$ and $Samples_{size}$ denotes the maximum number of objects each $Neighbours$ and $Samples$ set, respectively. Because these two numbers are predefined constants, the time complexity is $O(N)$. -Previous evaluations indicated that the quality of the produced layout improves as $Neighbours_{size}$ and $Samples_{size}$ grows larger. For larger datasets, setting the too small values could cause the algorithm to miss some details. However, favorable results can be obtained from numbers as low as 5 and 10 for $Neighbours_{size}$ and $Samples_{size}$\cite{Algo2002}. +Previous evaluations indicated that the quality of the produced layout improves as $Neighbours_{size}$ and $Samples_{size}$ grows larger. For larger data sets, setting too small values could cause the algorithm to miss some details. However, favourable results can be obtained from numbers as low as 5 and 10 for $Neighbours_{size}$ and $Samples_{size}$\cite{Algo2002}. \section{Hybrid Layout for Multidimensional Scaling} \label{sec:bg_hybrid} -In 2002, Alistair Morrison, Greg Ross, and Matthew Chalmers introduced a multi-phase, based on Chalmers' 1996 algorithm, to reduce the run time down to $O(N\sqrt{N})$. This is achieved by calculating the spring forces over a subset of data, and interpolating the rest onto the 2D space\cite{Algo2002}. +In 2002, Alistair Morrison, Greg Ross, and Matthew Chalmers introduced a multi-phase method, based on Chalmers' 1996 algorithm to reduce the run time down to $O(N\sqrt{N})$. This is achieved by calculating the spring forces over a subset of data, and interpolating the rest\cite{Algo2002}. -In this hybrid layout method, the $\sqrt{N}$ sample objects ($S$) are first placed on the 2D space, using the 1996 algorithm. The complexity of this step is $O(\sqrt{N}\sqrt{N})$ or $O(N)$. After that, each of the other objects $i$ are then interpolated as described below. +In this hybrid layout method, the $\sqrt{N}$ sample objects ($S$) are first placed on the 2D space using the 1996 algorithm. The complexity of this step is $O(\sqrt{N}\sqrt{N})$ or $O(N)$. After that, each of the other objects $i$ are then interpolated as described below. \begin{enumerate} - \item \label{step:hybridFindPar} Find the 'parent' object $x\in{S}$ with the minimal high-dimensional distance to $i$. This is essentially a nearest neighbor searching problem. + \item \label{step:hybridFindPar} Find the `parent' object $x\in{S}$ with the least high-dimensional distance to $i$. This is essentially the nearest neighbour searching problem. \item Define a circle around $x$ with radius $r$, proportional to the high-dimensional distance between $x$ and $i$. \item Find the quadrant of the circle which is the most satisfactory to place $i$. - \item Perform a binary search on the quadrant to determine the best angle of $i$ and place it there. + \item Perform a binary search on the quadrant to determine the best angle for $i$ and place it there. \item Select random samples $s$ from $S$. $s\subset{S}$. \item \label{step:hybridFindVec} Calculate the sum of force vector between $i$ and each member of $s$. \item \label{step:hybridApplyVec} Add the vector to $i$'s current position. \item Repeat step \ref{step:hybridFindVec} and \ref{step:hybridApplyVec} for a constant number of times to refine the placement. \end{enumerate} -In this process, step \ref{step:hybridFindPar} has the highest time complexity of $O(S_{size})$ i.e. $O(\sqrt{N})$. Because there are $N-\sqrt{N}$ objects to interpolate, the overall complexity of this step is $O(N\sqrt{N})$. +In this process, step \ref{step:hybridFindPar} has the highest time complexity of $O(S_{size}) = O(\sqrt{N})$. Because there are $N-\sqrt{N}$ objects to interpolate, the overall complexity of this step is $O(N\sqrt{N})$. Finally, the Chalmers' spring model is applied to the full data set for a constant number of iterations. This operation have the time complexity of $O(N)$. -Previous evaluations show that this method is faster that the Chalmers' 1996 algorithm alone, and can create a layout with lower stress, thanks to the more accurate positioning in the interpolation process. +Previous evaluations show that this method is faster than the Chalmers' 1996 algorithm, and can create a layout with lower stress, thanks to the more accurate positioning in the interpolation process. \section{Hybrid MDS with Pivot-Based Searching algorithm} \label{sec:bg_hybridPivot} @@ -212,20 +214,20 @@ Previous evaluations show that this method is faster that the Chalmers' 1996 alg \begin{wrapfigure}{rh}{0.3\textwidth} \centering \includegraphics[width=0.3\textwidth]{images/pivotBucketsIllust.png} - \caption{Diagram of a pivot (dark shaded point) with six buckets, illustrated as discs between dotted circle. Each of the other points are classified into buckets by the distances to the pivot.} + \caption{Diagram of a pivot (dark shaded point) with five buckets, illustrated as discs between dotted circle. Each of the other points in $S$ are classified into buckets by the distances to the pivot.} \label{fig:bg_pivotBuckets} \end{wrapfigure} -The bottleneck of the hybrid model is the nearest-neighbor searching process during the interpolation. The previous brute-force method results in time complexity of $O(N\sqrt{N})$. This improvement introduces pivot-based searching to approximate a near-neighbor instead. This reduces the time complexity to $O(N^\frac{5}{4})$\cite{Algo2003}. +The bottleneck of the Hybrid Layout Algorithm is the nearest-neighbour searching process during the interpolation. The previous brute-force method results in the time complexity of $O(N\sqrt{N})$. This improvement introduces pivot-based searching to approximate a near-neighbour and reduces the time complexity to $O(N^\frac{5}{4})$\cite{Algo2003}. -The main improvements is gained by preprocessing the set $S$ ($\sqrt{N}$ samples) so that each of the $N-\sqrt{N}$ other points can find the parent is faster. To begin, $k$ points were selected from $S$ as 'pivots'. Each pivot $p\in{k}$ have a number of buckets. Every other points in $S$ assigned a bucket number, based on the distance from to $p$ as illustrated in figure \ref{fig:bg_pivotBuckets}. +The main improvements is gained by pre-processing the set $S$ ($\sqrt{N}$ samples) so that each of the $N-\sqrt{N}$ other points can find the parent is faster. To begin, $k$ points were selected from $S$ as `parent'. Each pivot $p\in{k}$ have a number of buckets. Every other points in $S-\{p\}$ assigned a bucket number, based on the distance from to $p$ as illustrated in figure \ref{fig:bg_pivotBuckets}. To find a parent of an object, a distance calculation is first performed against each pivot to determine which bucket of each pivot is the object in. From this, the content of each bucket is searched for the nearest neighbor. \begin{algorithmic} -\item Preprocessing: -\ForAll{$\sqrt{n}$ samples in $S$} - \ForAll{pivot in $k$} +\item Pre-processing: +\ForAll{pivot in $k$} + \ForAll{points in $S$ that is not $k$} \State Perform distance calculation \EndFor \EndFor @@ -247,14 +249,16 @@ With this method, the parent found is not guaranteed to be the closest point. Pr \section{Performance Metrics} \label{sec:bg_metrics} -To compare different algorithms they have to be tested against the same set of performance metric. During the development, a number of metrics were used to objectively judge the resulting graph and computation requirement. The evaluation process in chapter \ref{ch:eval} will focuses on the following metrics. +To compare different algorithms, they have to be tested against the same set of performance metric. During the development, a number of metrics were used to objectively judge the produced layout and computation requirements. The evaluation process in chapter \ref{ch:eval} will focuses on the following metrics. \begin{itemize} - \item \textbf{Execution time} is a broadly used metric for any algorithm requiring any significant computational power. Some applications aim to be interactive and the algorithm have to finish the calculations within the time constraints for the program to stay responsive. This project, however, focuses on large data sets with minimal user interaction. Hence, the execution time in this project is a measures of the time an algorithm takes to produce its "final" result. The criteria for this will be discussed in details in section \ref{ch:eval}. - \item \textbf{Stress} is one of the most popular metric for spring-based layout algorithm, modeled from the mechanical stress of a spring system. It is based on sum-of-squared errors of inter-object distance\cite{Algo1996}. The function is defined as follow. $$Stress = \frac{\sum_{i..} tag. In this project, an SVG is used as a base canvas to display the produced graphics. Each data point is then drawn as a circle as shown in figure \ref{fig:des_svgobject}. +HTML 5 allow SVG to be embedded directly in an \texttt{..} tag, rather than a seperate xhtml document in previous HTML versions. In this project, an SVG is used as a base canvas to display the produced graphics. Each data point is then drawn as a circle as shown in figure \ref{fig:des_svgobject}. \begin{figure}[h] \centering @@ -290,41 +295,41 @@ SVG (Scalable Vector Graphics) is an open XML-based vector image format. HTML 5 %============================ \subsection{JavaScript} \label{ssec:des_js} -JavaScript is the most common high-level scripting language for web pages. It is dynamic, untyped and multi-paradigm, supporting event-driven, functional, prototype-based, and object-oriented programming style. -It mostly runs on client's browser interpreter. Many APIs are designed for manipulating the HTML content, allowing programmers to create dynamic web pages by changing contents according to a variety of events. +JavaScript is the most common high-level scripting language for web pages. It is dynamic, untyped and multi-paradigm, supporting event-driven, functional, prototype-based, and object-oriented programming styles. +It mostly runs on client's browser interpreter, although platforms such as Node.js allow it to run on servers as well. Many APIs are designed for manipulating the HTML document, allowing programmers to create dynamic web pages by changing contents according to a variety of events. %Cite JS Alternative languages such as CoffeeScript and TypeScript are emerging, each adding more features, syntactic sugars, or syntax changes to improve code readability. However, in order to run these languages on browsers, they have to be compiled back to JavaScript. The learning resources availability is also leagues behind JavaScript. For these reasons, standard JavaScript was chosen for this project. -Being an interpreted high-level language, it is relatively slow and is only single-threaded due to limitations from standard APIs. asm.js is an effort to optimize JavaScript by using only a restricted subset of features. It is intended to be a compilation target from other statically-typed languages such as C/C++ rather than a language to code in\cite{asmjs}. Existing JavaScript engines may gain performance from asm.js' restrictions such as preallocated heap, reducing the load on the Garbage Collector. Firefox and Edge also recognize asm.js and compile the code to assembly ahead-of-time (AOT) to eliminate the need to run code through interpreter entirely, resulting in a significant speed increase\cite{asmjsSpeed}. However, the D3 library is still using standard JavaScript. A large chunk of the library have to be ported in order to be able to compare different algorithms fairly. Since a lot of effort is required to potentially significantly improve performance on 2 browsers and marginally on others, asm.js was not selected for this project. +Being an interpreted high-level language, it is relatively slow. Due to limitations from standard APIs, it is also single-threaded. asm.js is an effort to optimize JavaScript by using only a restricted subset of features. It is intended to be a compilation target from other statically-typed languages such as C/C++ rather than a language to code in\cite{asmjs}. Existing JavaScript engines may gain performance from asm.js' restrictions such as preallocated heap, reducing load on the Garbage Collector. Firefox and Edge also recognize asm.js and compile the code to assembly ahead-of-time (AOT) to eliminate the need to run code through interpreter entirely, resulting in a significant speed increase\cite{asmjsSpeed}. However, the D3 library is still using standard JavaScript. A large chunk of the library have to be ported in order to be able to compare different algorithms fairly. Since a lot of effort is required to potentially improve performance significantly on 2 browsers and marginally on others, asm.js was not selected for this project. WebAssembly (wasm) is another recent contender. Unlike JavaScript, it is a binary format designed to run with JavaScript on the same sandboxed stack machine\cite{WebAssembly}. Similar to asm.js, it is intended to be a compile target. With support for additional CPU instructions not available in JavaScript, it also perform predictably better than asm.js. Only recently exited the preview phase in March 2017, the support was not widespread and learning resources was hard to find. It also inherit a risk of not being widely adopted by browsers. As a result, WebAssembly was not considered as a viable option. %============================ \section{Data Driven Document} \label{sec:des_d3} -Data Driven Documents (D3 or D3.js)\cite{D3}\cite{D3Web} is one of the most popular JavaScript library for interactive data visualisations in web browsers. The focus is to bind data to DOM (Document Object Model) elements in HTML or SVG and apply data-driven transformations to make the visualisation visually appealing. Its modular and free open-source nature also makes it flexible. Many visualisation algorithms can be easy integrated into it. In this project, aside from Force Link algorithm, the complicated process of translating velocities and location onto an SVG document are handled by the D3 library, allowing the project to just focus on the algorithms. +Data Driven Documents (D3 or D3.js)\cite{D3}\cite{D3Web} is one of the most popular JavaScript library for interactive data visualisations in web browsers. The focus is to bind data to DOM (Document Object Model) elements in HTML or SVG documents and apply data-driven transformations to make the visualisation visually appealing. Its modular and free open-source nature also makes it flexible. Many visualisation algorithms can be easy integrated into it. In this project, aside from Force Link algorithm, the complicated process of translating velocities and location onto an SVG document are handled by the D3 library, allowing the project to just focus more on the algorithms. -There are several other data visualisation libraries such as Google Charts and Chart.js. However, most of them do not support force-directed layout and are not as flexible. In addition to being a requirement set by the project advisor, D3 is the only sensible choice for this project. +There are several other data visualisation libraries such as Google Charts and Chart.js. However, most of them do not support force-directed layout and are not as flexible. In addition to being a requirement set by the project advisor, D3 seems like the best choice for this project. %============================ \section{Bartasius' D3 Neighbour Sampling plug-in} -In 2017, Bartasius implemented the Chalmers' 1996 algorithm and several others algorithms for the level 4 project at the School of Computing Science. All source files are released on GitHub under the MIT license. To reduce the amount of duplicated work, the project advisor recommended using the repository as a groundwork to implement other algorithms upon. +In 2017, Bartasius implemented the Chalmers' 1996 algorithm and several others algorithms for his level 4 project at the School of Computing Science. All source files are released on GitHub under the MIT license. To reduce the amount of duplicated work, the project advisor recommended using the repository as a groundwork to implement other algorithms upon. %============================ \subsection{Input Data} -The data is one of the most important element of the project. Without it, nothing can be visualised. Since the data may consist of many different features (attributes), each with a unique name, it makes sense to store each data point (node) as an JavaScript object, a collection of key:value pairs. To conform with D3 API, all nodes are stored in a list (array). +The data is one of the most important element of the project. Without it, nothing can be visualised. Since the data may consist of many different features (attributes), each with a unique name, it makes sense to store each data point (node) as an JavaScript object, a collection of \texttt{key:value} pairs. To conform with D3 API, all nodes are stored in a list (array). Two example data structures are shown in figure \ref{fig:des_jsobject} -\begin{figure} +\begin{figure}[h] \centering \includegraphics[height=7cm]{images/jsobj.png} - \caption{Examples of the data structure used to store the input data. On the left display nodes from the Poker Hand data set. Right shows nodes from the Antartica data set.} + \caption{Examples of the data structure used to store the input data. On the left is nodes from the Poker Hand data set. Right shows nodes from the Antarctica data set. The two data sets will be explained in section \ref{sec:EvalDataSet}.} \label{fig:des_jsobject} \end{figure} %============================ \subsection{Graphical User Interface} -Due to the sheer amount of experiments to run, manually changing function and file names between each run is a tedious task. Bartasius developed a GUI for the plug-in to ease the testing process. For this project, new modifications have been made to accommodate newly implemented algorithms. +Due to the sheer amount of experiments to run, manually changing functions and file names between each run will be a tedious task. Bartasius developed a GUI for the plug-in to ease the testing process. For this project, modifications have been made to accommodate newly implemented algorithms. Figure \ref{fig:des_gui} shows the modified GUI used in this project. At the top is the canvas to draw the produced layout. The controls below are then divided into 3 columns. The left column controls data set input, rendering, and iterations limit. The middle column are a set radio and slider buttons for selecting the algorithm and parameters to use. The right contains a list of distance functions to choose from. @@ -347,27 +352,27 @@ Figure \ref{fig:des_gui} shows the modified GUI used in this project. At the top \label{ch:imp} \section{Outline} -D3-force module provide a simplified Simulation object to control various calculations. Each Simulation contain data point nodes and Force objects. Interfaces were defined, allowing each Force to access the node list. To keep track of positions, each node will be assigned values representing its current location and velocity vector. These values can then be used by the application to draw a graph. In each constant unit time step (iteration), the Simulation will trigger a function in each Force object, allowing them to add values to each particle's velocity vector, which will then be added to the particle's position. +D3-force module provides a simplified Simulation object to control various calculations. Each Simulation contain a list of nodes and Force objects. Interfaces were defined, allowing each Force to access the node list. To keep track of positions, each node will be assigned values representing its current location and velocity vector. These values can then be used by the application to draw a graph. In each constant unit time step (iteration), the Simulation will trigger a function in each Force object, allowing them to calculate and add values to each particle's velocity vector, which will then be added to the particle's position by the Simulation. -Because D3-force are libraries to be built into other web applications, the algorithms implemented can not be used on their own. Fortunately, as part of Bartasius' level 4 project in 2017, a web application for testing and evaluation has already been created with graphical user interface designed to allow the user to easily select an algorithm, data set, and parameter values. Various distance functions, including one specifically created to handle the Poker Hands data set\cite{UCL_Data} which will be used for evaluation (section \ref{sec:EvalDataSet}), are also in place and fully functional. +Because D3-force are libraries to be built into other web applications, the algorithms implemented can not be used on their own. Fortunately, as part of Bartasius' level 4 project in 2017, a web application for testing and evaluation has already been created with graphical user interface designed to allow the user to easily select an algorithm, data set, and parameter values to use. Various distance functions, including one specifically created for the Poker Hands data set\cite{UCL_Data} which will be used for evaluation (section \ref{sec:EvalDataSet}), are also in place and fully functional. -The csv-formatted data file can be loaded locally. Next, it is parsed using Papa Parse JavaScript library\cite{PapaParse} and then put on the simulation. -Depending on the distance functions, per-dimension mean, variance, and other attributes may also be calculated as well. These values are used in general distance functions to scale values of each feature properly. The D3 simulation layout is shown on an SVG canvas with zoom functionality to allow graph investigation. The distance function scaling was tweaked to only affect rendering and not the force calculation. +The csv-formatted data file can be loaded locally. Next, it is parsed by Papa Parse JavaScript library\cite{PapaParse} and then loaded into the Simulation. +Depending on the distance functions, per-dimension mean, variance, and other attributes may also be calculated as well. These values are used in several general distance functions to scale values of each feature. The D3 simulation layout is shown on an SVG canvas with zoom functionality to allow graph investigation. The distance function scaling was tweaked to only affect rendering and not the force calculation. -Several values used for evaluation such as execution time, total force applied per iteration, and stress is also computed. However, these values are printed out to JavaScript console instead. +Several values used for evaluation such as execution time, total force applied per iteration, and stress may also be computed. However, these values are printed out to JavaScript console instead. -Due to the growing number of algorithms and variable, the main JavaScript code have been refactored. Functions for controlling each algorithm have been extracted to their own file, and unused codes are removed. +Due to the growing number of algorithms and variables, the main JavaScript code have been refactored. Functions for controlling each algorithm have been extracted to their own file, and some unused codes are removed or commented out. \section{Algorithms} -This section discusses implementation decisions for each algorithm, some of which are already implemented in D3 force module and the d3-neighbour-sampling plugin. Adjustments made to third-party implemented algorithms are also discussed. +This section discusses implementation decisions for each algorithm, some of which are already implemented in D3 force module and the d3-neighbour-sampling plugin. Adjustments made to third-party-implemented algorithms are also discussed. \subsection{Link force} \label{sec:imp_linkForce} -D3-force module have implemented an algorithm to produce a force-directed layout. The main idea is to change the velocity vector of each pair connected via a link at every time step, simulating force application. For example, if two nodes are further apart than the desired distance, a force is applied to both nodes to pull them together. The implementation also supports incomplete graphs, thus the links have to be specified. The force is also, by default, scaled on each node depending on how many spring it is attached to, in order to balance the force applied to heavily and lightly connected nodes, improving the stability. Without such scaling, the graph would expands into every direction. +D3-force module have an algorithm implemented to produce a force-directed layout. The main idea is to change the velocity vector of each pair of node connected via a link at every time step, simulating force application. For example, if two nodes are further apart than the desired distance, a force is applied to both nodes to pull them together. The implementation also supports incomplete graphs, thus the links have to be specified. The force is also, by default, scaled on each node depending on how many springs it is attached to, in order to balance the force applied to heavily and lightly connected nodes, improving overall stability. Without such scaling, the graph would expands in every direction. In the early stages of the project, when assessing the library, it is observed that many of the available features are unused for Multidimensional scaling. In order to reduce the computation time and memory usage, I created a modified version of Force Link as part of the plug-in. The following are the improved aspects. -Firstly, to accommodate an incomplete graph, the force scaling has to be calculated for each node and each link. The calculated values are then cached in a similar manner to the distances ($bias$ and $strengths$ in code \ref{lst:impl_LinkD3}). In a fully-connected graph, these values are the same for every links and nodes. To save on memory and startup time, the arrays was replaced by a single number value. +Firstly, to accommodate an incomplete graph, the force scaling has to be calculated for each node and each link. The calculated values are then cached in a similar manner to the distances ($bias$ and $strengths$ in code \ref{lst:impl_LinkD3}). In a fully-connected graph, these values are the same for every links and nodes. To save on memory and startup time, the arrays were replaced by a single number value. \begin{lstlisting}[language=JavaScript,caption={Force calculation function of Force Link as implemented in D3.},label={lst:impl_LinkD3}] function force(alpha) { @@ -388,7 +393,7 @@ Firstly, to accommodate an incomplete graph, the force scaling has to be calcula } \end{lstlisting} -Secondly, D3's Force Link require the user to specify and array of links to describe the graph. Each link is a string-indexed dictionary which is not the most memory-friendly data type. The cached distance values are stored in a separated array with the index parallel to that of the links array. Since nodes are also stored in an array, the links array is entirely replaced with a nested loop over the nodes array, reducing the memory footprint even further and eliminating time required to construct the array. The index for the cached distance is then adjusted accordingly. +Secondly, D3's Force Link requires the user to specify an array of links to describe the graph. Each link is a string-indexed dictionary which is not the most memory-friendly data type. The cached distance values are stored in a separated array with index parallel to that of the links array. Since nodes are also stored in an array, I replaced the entire links array with a nested loop over the nodes array, reducing the memory footprint even further and eliminating time required to construct the array. The index for the cached distance is then adjusted accordingly. \begin{lstlisting}[language=JavaScript,caption={Part of the customized force calculation function.},label={lst:impl_LinkCustom}] function force(alpha) { @@ -421,15 +426,18 @@ After optimisation, the execution time decreases marginally while memory consump \label{fig:imp_linkComparison} \end{figure} -Next, the \texttt{jiggle()} function was assessed. As shown in line 5-7 of code \ref{lst:impl_LinkD3}, in cases where two nodes are projected to be on the exact same location, \texttt{x}, \texttt{y} and, in-turn, \texttt{l}, could be 0. This would cause a divide-by-zero error in line 8. Rather than throwing an error, JavaScript would return the result as Infinity. Any subsequent arithmetic operations, except for modulus, with other numbers will results in either Infinity or -Infinity, effectively deleting the coordinate and velocity values from the entire system. To prevent such error, when \texttt{x} or \texttt{y} is calculated to be zero, D3 will replace the values with a very small random number generated by \texttt{jiggle()} instead. While extremely unlikely, there is still a chance that \texttt{jiggle()} will random 0. This case can rarely be observed when every nodes are initially placed at the exact same position. To counter this, I modified \texttt{jiggle()} to re-random a number until a non-zero value is found. +Next, \texttt{jiggle()} function was assessed. As shown in line 5-7 of code \ref{lst:impl_LinkD3}, in cases where two nodes are projected to be on the exact same location, \texttt{x}, \texttt{y} and, in-turn, \texttt{l}, could be 0. This would cause a divide-by-zero error in line 8. Rather than throwing an error, JavaScript would return the result as \texttt{Infinity} or \texttt{-Infinity}. Any subsequent arithmetic operations, except for modulus, with other numbers will also results in \texttt{$\pm{}$Infinity}, effectively deleting the coordinate and velocity values from the entire system. To prevent such error, when \texttt{x} or \texttt{y} is calculated to be zero, D3 will replace the values with a very small random number generated by \texttt{jiggle()}. While extremely unlikely, there is still a chance that \texttt{jiggle()} will random return a random value of 0. This case can rarely be observed when every nodes are initially placed at the exact same position. To counter this, I modified \texttt{jiggle()} to re-random a number until a non-zero value is found. -Finally, a feature is added to track the average force applied to the system in each iteration. A threshold value can be set so once average force falls below the threshold, a user-defined function is be called. In this case, a handler is added to Bartasius' application to stop the simulation. This is feature will be heavily used in the evaluation process (section \ref{ssec:eval_termCriteria}). +Finally, a feature is added to track the average force applied to the system in each iteration. A threshold value are set so that once average force falls below the threshold, a user-defined function is called. In this case, a handler is added to Bartasius' application to stop the simulation. This is feature will be heavily used in the evaluation process (section \ref{ssec:eval_termCriteria}). %============================ \subsection{Chalmers' 1996} \label{sec:imp_neigbour} -Bartasius' d3-neighbour-sampling plug-in have the main focus on Chalmers' 1996 algorithm. The idea is to use the exact same force calculation function as D3 Force Link to allow for fair comparison. The algorithm was also implemented as a Force, to be used by a Simulation. As part of the project, I refactored the code base to ease the development process and improved a shortcoming. +Bartasius' d3-neighbour-sampling plug-in have the main focus on Chalmers' 1996 algorithm. The idea is to use the exact same force calculation function as D3 Force Link for a fair comparison. The algorithm was also implemented as a Force object to be used by a Simulation. As part of the project, I refactored the code base to ease the development process and improved a shortcoming. -Aside from formatting the code, Bartasius' implementation does not have spring force scaling, making the graph explodes in every direction. Originally, the example implementation used decaying $alpha$, a variable controlled by the Simulation used for artificially scaling down the force applied to the system over time and causing the system to contract back. A constant dataSizeFactor, similar to that in the custom Link Force, have been added to mitigate the requirement of decaying alpha. +Aside from formatting the code, Bartasius' implementation does not have spring force scaling, making the graph explodes in every direction. Originally, the example implementation used decaying $alpha$, a variable controlled by the Simulation used for artificially scaling down the force applied to the system over time, to make the system contract back. A constant \texttt{dataSizeFactor}, similar to that in the custom Link Force, have been added to mitigate the requirement of decaying alpha. + +Next, after seeing memory footprint of the optimized Link Force, an idea occurred to also cache all the distances between every pair of nodes. After the implementation, an experiment was ran to compare the performance. +However, even with a data set of moderate size and higher number of iterations than typical requirement, the time spent on caching is higher than time saved, resulting in longer total execution time (figure \ref{fig:imp_chalmersCache}). The JavaScript heap usage also raises to 128 MB with manually-invoked garbage collector (will be discussed in section \ref{ssec:eval_ram}) when originally, it has never used more than 50 MB. With all these drawbacks, this patch was withdrawn. \begin{figure}[h] \centering @@ -438,15 +446,12 @@ Aside from formatting the code, Bartasius' implementation does not have spring f \label{fig:imp_chalmersCache} \end{figure} - -Next, after seeing memory footprint of the optimized Link Force, an idea occurred to also cache all the distances between every pair of nodes. After the implementation, an experiment was ran to compare the performance. However, with a data set of moderate size and higher iterations than typical requirement, the time spent on caching is higher than time saved, resulting in longer total execution time (figure \ref{fig:imp_chalmersCache}). The JavaScript heap usage also raises to 128 MB with manually-invoked garbage collector (will be discussed in section \ref{ssec:eval_ram}) when originally, it has never used more than 50 MB. With all these drawbacks, this patch was withdrawn. - -Lastly, the average force applied tracker, similar to that added to Force Link, is also added for the evaluation process. It should be noted that unlike Force Link, the system will not stabilise to a freezing point. Because the $Samples$ set keeps changing randomly, there is no single state where every spring forces cancel each other out completely. This is also reflected when the animation is drawn where every nodes keep wiggling about but the overall layout remains constant. +Lastly, the average force applied tracker, similar to that added to Force Link, is also added for the evaluation process. It should be noted that unlike Force Link, the system will not stabilise to a freezing point. Because the $Samples$ set keeps changing randomly, there is no single state where every spring forces cancel each other out completely. This can also be seen when the animation is drawn where every nodes keep wiggling about but the overall layout remains constant. %============================ \subsection{Hybrid Layout} -Because Hybrid Layout is a multi-phase use of the Chalmers' algorithm, it does not fit well with the limited interfaces designed for Force objects. The approach taken is to implement the Hybrid algorithm as a new JavaScript object that takes control of the Simulation instead. To make it fit with other D3 APIs design have to first be studied. +Because Hybrid Layout is a multi-phase use of the Chalmers' algorithm, it does not fit well with the limited interfaces designed for Force objects. The approach taken is to implement the Hybrid algorithm as a new JavaScript object that takes control of the Simulation instead. To make it fit with other D3 APIs, the designs have to first be studied. -The D3 API extensively with the Method Chaining design pattern. The main idea is that by having each method returns the object itself rather than void, the method calls on the same object can be chained together in a single statement\cite{CleanCode}. In addition, the code readability is also improved to a certain degree. With the knowledge in mind, the same trend is followed for this Hybrid object. +The D3 API extensively with the Method Chaining design pattern. The main idea is that by having each method returns the reference to itself rather than nothing, the method calls on the same object can be chained together in a single statement\cite{CleanCode}. In addition, the code readability is also improved to a certain degree. With the knowledge in mind, the same trend is followed for this Hybrid object. \begin{lstlisting}[language=JavaScript,caption={Simplified example of using the API.},label={lst:impl_HybridUsage}] let simulation = d3.forceSimulation() // Configured D3 Simulation object @@ -474,7 +479,7 @@ The D3 API extensively with the Method Chaining design pattern. The main idea is } \end{lstlisting} -As shown in code \ref{lst:impl_HybridUsage}, the algorithm-specific parameters for each Chalmers' force objects are set in advance by the user. Since the Hybrid object interacts with the Simulation and force-calculation objects via common interfaces, other force calculators could potentially be used without having to modify the Hybrid object as well. In fact, D3's original implementation of Force Link also works with the Hybrid object. To terminate the forces in the first and last phase, the Hybrid object have an internal iteration counter to stop the force calculations after predefined period of time. In addition, the applied force threshold events are also supported as an alternative termination criteria. +As shown in code \ref{lst:impl_HybridUsage}, the algorithm-specific parameters for each Chalmers' force objects are set in advance by the user. Since the Hybrid object interacts with the Simulation and force-calculation objects via general interfaces, other force calculators could potentially be used without having to modify the Hybrid object as well. In fact, D3's original implementation of Force Link also works with the Hybrid object. To terminate the force calculations in the first and last phase, the Hybrid object have an internal iteration counter to stop the calculations after predefined number of time steps. In addition, the applied force threshold events are also supported as an alternative termination criteria. For interpolation, two separate functions were created for each method. After the parent is found, both functions call the same third function to handle the rest of the process (step 2 to 8 of in section \ref{sec:bg_hybrid}). @@ -507,18 +512,18 @@ For interpolation, two separate functions were created for each method. After th \EndFor \EndFor \State Fill in the rest of the cache - \State \Call{Place n}{$n$, closest $k$, $s$, distance cache} + \State \Call{Place n}{$n$, closest $i$ or $p$, $s$, distance cache} \EndFor \end{algorithmic} \end{multicols} -Since the original paper did not specify the method of placing a node $n$ on the circle around its parent (step 3 to 4), Matthew Chalmers, the project advisor who also took part in developing the algorithm, was contacted for clarification. Unfortunately, the knowledge was lost. Instead, Sum of distance error between $n$ and every member of $s$ was proposed as an alternative. Preliminary testings shows that it works well and is used for this implementation. +Since the original paper did not specify the ``satisfactory'' metric for of placing a node $n$ on the circle around its parent (step 3 to 4), Matthew Chalmers, the project advisor who also took part in developing the algorithm, was contacted for clarification. Unfortunately, the knowledge was lost. Instead, sum of distance error between $n$ and every member of $s$ was proposed as an alternative. Preliminary testings shows that it works well and is used for this implementation. -With that decision, the high-dimensional distances between $n$ and each member of $s$ are used multiple times for binary searching and placement refinement (step 7 and 8). To reduce the time complexity, a distance cache have been created. For brute-force parent finding, the cache can be filled while the parent is being selected as $s\subset{S}$. On the other hand, pivot-based searching might not cover every member of $s$. Thus, the missing caches are filled after parent searching. +With that decision, the high-dimensional distances between $n$ and each member of $s$ becomes used multiple times for binary searching and placement refinement (step 7 and 8). To reduce the distance function calls, a distance cache have been created. For brute-force parent finding, the cache can be filled while the parent is being selected as $s\subset{S}$. On the other hand, pivot-based searching might not cover every member of $s$. Thus, the missing caches are filled after parent searching. %============================ \section{Metrics} -Many different metrics were introduced in section \ref{sec:bg_metrics}, some of them require extra code to be written. While memory usage measurement requires an external profiler, execution time can also be calculated by the application. For JavaScript, the recommended way is to take the high-resolution time-stamp before and after code execution. The method provides accuracy up-to 5 microseconds. It is important to note that with the level of precision, the measured value will vary from run-to-run, due to many factors both from software such as OS' process scheduler, and hardware such as Intel\textsuperscript{\textregistered} Turbo Boost or cache prefetch. +Many different metrics were introduced in section \ref{sec:bg_metrics}, some of them require extra code to be written. While memory usage measurement requires an external profiler, execution time can also be calculated by the application. For JavaScript, the recommended way is to take the high-resolution time-stamp before and after code execution. The method provides accuracy up-to 5 microseconds. However, it is important to note that with the level of precision, the measured value will vary from run-to-run, due to many factors both from software such as OS' process scheduler, and hardware such as Intel\textsuperscript{\textregistered} Turbo Boost or cache prefetch. \begin{lstlisting}[language=JavaScript,caption={Execution time measurement.},label={lst:impl_Time}] p1 = performance.now(); @@ -527,7 +532,7 @@ p2 = performance.now(); console.log("Execution time", p2-p1); \end{lstlisting} -Stress calculation is done as defined by the formula in section \ref{sec:bg_metrics}. The calculation is independent of the algorithm. In fact, it does not depend on D3 at all. Only an array of node objects and a distance calculation is required. Due to its very long calculation time, this function is only called on-demand when the value have to be recorded.The exact implementation is shown in code \ref{lst:impl_Stress}. +Stress calculation is done as defined by the formula in section \ref{sec:bg_metrics}. The calculation is independent of the algorithm. In fact, it does not depend on D3 at all. Only an array of node objects and a distance calculation is required. Due to its very long calculation time, this function is only called on-demand when the value have to be recorded. The exact implementation is shown in code \ref{lst:impl_Stress}. \begin{lstlisting}[language=JavaScript,caption={Stress calculation function.},label={lst:impl_Stress}] export function getStress(nodes, distance) { @@ -553,14 +558,14 @@ export function getStress(nodes, distance) { %%%%%%%%%%%%%%%% \chapter{Evaluation} \label{ch:eval} -This chapter presents the comparison between each of the implemented algorithm. First, data sets that were used will be described. The experiments setup are then introduced, along with decision behind the test designs. Lastly, the results are shown and briefly interpreted. +This chapter presents comparisons between each of the implemented algorithm. First, used data sets will be described. The experiment setup is then introduced, along with decision behind the each test design. Lastly, the results are shown and briefly interpreted. \section{Data Sets} \label{sec:EvalDataSet} -The data sets utilized during the developments are the Iris, Poker Hands\cite{UCL_Data}, and Antarctic data set\cite{Antartica_Data}. -The Iris is one of the most popular data set to get started in Machine Learning. It contain 150 measurements from flowers of Iris Setosa, Iris Versicolour and Iris Virginica species, each with four parameters: petal and sepal width and height in centimeter. It is chosen as a starting point for development because it is a classification data set where the parameters can be used by the distance function and the label is only used to color each instance. Each species is also clustered quite clearly, making it easier to see if the algorithm is working as intended. +The data sets utilized during the development are the Iris, Poker Hands\cite{UCL_Data}, and Antarctic data set\cite{Antartica_Data}. +The Iris is one of the most popular data set to get started in Machine Learning. It contain 150 measurements from flowers of Iris Setosa, Iris Versicolour and Iris Virginica species, each with four parameters: petal and sepal width and height in centimeter. It was chosen as a starting point for development because it is a classification data set where the parameters can be used by the distance function and the label can be used to colour each instance. Each species is also clustered quite clearly, making it easier to see if the algorithm is working as intended. -The Poker Hands is another classification dataset containing possible hands of 5 playing cards, each is described in rank (Ace, 2, 3,...) and suit (Hearts, Spades, etc). Each hand is labeled with the poker hand (unrecognized, Flush, Full house, etc). This data set is selected for the experiment because it contains over a million records. In each test, only subsets of the data is used due to size limitation. +The Poker Hands is another classification data set containing possible hands of 5 playing cards, each is described in rank (Ace, 2, 3,...) and suit (Hearts, Spades, etc). Each hand is labelled as a poker hand (unrecognized, Flush, Full house, etc). This data set is selected for the experiment because it contains over a million records. In each test, only subsets of the data is used due to size limitation. \begin{figure} \centering @@ -569,34 +574,34 @@ The Poker Hands is another classification dataset containing possible hands of 5 \label{fig:eval_idealSample} \end{figure} -The Antarctic data set contain 2,202 measurements by remote sensing probes over 2 weeks at a frozen lake in the Antarctic. Features includes water temperature, UV radiation levels, ice thickness, etc. The data is formatted into CSV by Greg Ross and is used to represent a data set with complex structure. Due to the relatively small size of this data set, it is only used to compare the ability to show fine details. +The Antarctic data set contain 2,202 measurements by remote sensing probes over the period of 2 weeks at a frozen lake in the Antarctic. The 16 features includes water temperature, UV radiation levels, ice thickness, etc. The data is formatted into CSV by Greg Ross and is used to represent a data set with complex structure and high dimensionality. Due to the relatively small size of this data set, it is only used to compare the ability to show fine details. \section{Experimental Setup} -Hardware and web browser can greatly impact the JavaScript performance. In addition to from the code and dataset, these variables have to be controlled as well. -The computers used are all the same model of a Dell All-in-One desktop computer with Intel\textsuperscript{\textregistered} Core\texttrademark{} i5-3470S and 8GB of DDR3 memory, running CentOS 7 with Linux 3.10-x86-64. -As for web browser, the official 64-bit build of Google Chrome 61.0.3163.79 is used to both run and analyse CPU and memory usage with its performance profiling tool. +Hardware and web browser can greatly impact the JavaScript performance. In addition to the code and data set, these variables have to be controlled as well. +The computers used are all the same model of Dell All-in-One desktop computers with Intel\textsuperscript{\textregistered} Core\texttrademark{} i5-3470S and 8GB of DDR3 memory, running CentOS 7 with Linux 3.10-x86-64. +As for web browser, the official 64-bit build of Google Chrome 61.0.3163.79 is used to both run and analyse hardware usage with its performance profiling tool. -Other unrelated parameters have to also be controlled as much as possible. The simulation's velocity decay is set at default of $0.4$, mimicking air friction, and the starting position of all nodes are locked at $(0,0)$. Although starting every nodes at the exact same position may seems to cause a very high initial spring force, the force scaling and the way D3 takes each node's velocity as part of spring force calculation prevent the system from spreading out too far. In practice, the graphs have to continue to expand for several more iterations before the overall layout reaches the correct size. Alpha, a decaying value used for artificially slowing down and freezing the system over time, is also kept at 1 to keep the springs' forces in full effect. +Other unrelated parameters were also controlled as much as possible. The simulation's velocity decay is set at default of $0.4$, mimicking air friction, and the starting position of all nodes are locked at $(0,0)$. Although starting every nodes at the exact same position may seems to cause a very high initial spring force, the force scaling and the way D3 takes each node's velocity as part of spring force calculation prevent the system from spreading out too far. In practice, the graphs continue to expand for several more iterations before the overall layout reaches the correct size. Alpha, a decaying value used for artificially slowing down and freezing the system over time, is also kept at 1 to keep the springs' forces in full effect. The web page is also refreshed after every run to make sure that everything, including uncontrollable aspects such as JavaScript heap, ahead-of-time compilation and the behavior of the browser's garbage collector, have been properly reset. \subsection{Termination criteria} \label{ssec:eval_termCriteria} Both Link force and the Chalmers' 1996 algorithm create a layout that stabilises over time. In D3, calculations are performed for a predefined number of iterations. This have a drawback of having to select an appropriate value. Choosing the number too high means that execution time is wasted calculating minute details with no visible change to the layout while the opposite can results in a bad layout. -Determining the constant number can be problematic, considering that each algorithm may stabilise after different number of iterations, especially when the interpolation result can vary greatly from run-to-run. +Determining the constant number can be problematic, considering that each algorithm may stabilise after different number of iterations, especially when considering that the interpolation result from the Hybrid algorithm can vary greatly from run-to-run(section \ref{ssec:eval_selectParams}). -An alternative method is to stop when a condition is met. One such condition purposed is the difference in velocity ($\Delta{v}$) of the system between iterations\cite{Algo2002}. In other word, once the amount of force applied in that iteration is lower than a scalar threshold, the calculation may stop. Taking note of stress and average force applied over multiple iterations as illustrated in figure \ref{fig:eval_stressVeloOverTime}, it is clear that Link Force converges to a complete stillness while the Chalmers algorithm's average force reaches and fluctuate around a constant as stated in section \ref{sec:imp_neigbour}. It can also be seen that stress of each layout converges a minimal value as the average force converges a constant, indicating that the best layout from each algorithm can be obtained once the system stabilizes. +An alternative method is to stop when a condition is met. One such condition purposed is the difference in velocity ($\Delta{v}$) of the system between iterations\cite{Algo2002}. In other word, once the amount of force applied in that iteration is lower than a scalar threshold, the calculation may stop. Taking note of stress and average force applied over multiple iterations as illustrated in figure \ref{fig:eval_stressVeloOverTime}, it is clear that Link Force converges to a complete stillness while the Chalmers algorithm reaches and fluctuate around a constant as stated in section \ref{sec:imp_neigbour}. It can also be seen that stress of each layout converges a value as the average force converges a constant, indicating that the best layout each algorithm can create can be obtained once the system stabilises. \begin{figure} \centering \includegraphics[height=5cm]{graphs/stressVeloOverTime.png} - \caption{A log-scaled graph showing decreasing stress and forces applied per iteration over time covering a constant number when running different algorithm over 10,000 data points of Poker Hands data set. Stress is calculated every \nth{10} iteration.} + \caption{A log-scaled graph showing decreasing stress and forces applied per iteration over time converging to a constant number when running different algorithms over 10,000 data points from Poker Hands data set. Stress is calculated every \nth{10} iteration.} \label{fig:eval_stressVeloOverTime} \end{figure} -Since stress takes too long to calculate every iteration, termination criteria selected is the average force applied per node. This criteria is used for all 3 algorithms for consistency. The cut-off constant is then manually selected for each algorithm for each subset used. Link force's threshold is a value low enough that there are no visible changes and stress have reached near minimum. The Chalmers' threshold is the lowest possible value that will be reached most of the time. It is interesting to note that with bigger subset of the Poker Hands data set, the threshold rises and converges to 0.66 from 3,000 data points onward. +Since stress takes too long to calculate at every iteration, the termination criteria selected is the average force applied per node. This criteria is used for all 3 algorithms for consistency. The cut-off constants are then manually selected for each algorithm for each subset used. Link force's threshold is a value low enough that there are no visible changes and stress have reached near minimum. The Chalmers' threshold is the lowest possible value that will be reached most of the time. It is interesting to note that with bigger subset of the Poker Hands data set, the threshold rises and converges to 0.66 from 3,000 data points onward. -By selecting this termination condition, the goal of the last phase of the Hybrid Layout algorithm is flipped. Rather than performing the Chalmers' algorithm over the whole dataset to correct interpolation errors, the interpolation phase's role is to help the final phase reaches stability quicker. Thus, parameters of the interpolation phase can not be evaluated on their own. Taking more time to produce a better interpolation result may or may not effect the number of iterations in the final phase, creating the need to balance between time spent and saved by interpolation. +By selecting this termination condition, the goal of the last phase of the Hybrid Layout algorithm is flipped. Rather than performing the Chalmers' algorithm over the whole data set to correct interpolation errors, the interpolation phase's role is to help the final phase reaches stability quicker. Thus, parameters of the interpolation phase can not be evaluated on their own. Taking more time to produce a better interpolation result may or may not effect the number of iterations in the final phase, creating the need to balance between time spent and saved by interpolation. %============================ @@ -607,19 +612,19 @@ Some of the algorithms have variables that are predefined constant numbers. Care The Chalmers' algorithm have two adjustable parameters: $Neighbours_{size}$, $Samples_{size}$. According to previous evaluations\cite{LastYear}\cite{Algo2002}, favorable layout could be achieved with values as low as $10$ for both variables. Preliminary testings seems to confirm the findings and the values are selected for the experiments. In the other hand, Link force have no adjustable parameter whatsoever so no attention is required. -\begin{figure} +Hybrid layout have multiple parameters during the interpolation phase. For the parent-finding stage, there is a choice of weather to use brute-force or pivot-based searching method. In case of pivot-based, the number of pivots ($k$) have to also be chosen. Experiments have been run to find the accuracy of pivot-based searching, starting from 1 pivot to determine reasonable numbers to use in subsequence experiments. As shown in figure \ref{fig:eval_interpVariations}, the randomly selected $S$ set (the $\sqrt{N}$ samples used in the first stage) can greatly affect the interpolation result, especially with smaller data set with many small clusters. Therefore, each tests have to be run multiple times to generalise the result. From figure \ref{fig:eval_pivotHits}, it can be seen that the more pivots used, the higher accuracy and consistency. The diminishing returns can be observed at around 6 to 10 pivots, depending on the number of data points. Hence, higher number of pivots are not considered for the experiment. + +Finally, the last step of interpolation is to refine the placement for a constant number of times. Preliminary testings shows that this step helps clean up a lot of interpolation artifacts. For example, a clear radial pattern and straight lines can be seen in figure \ref{sfig:eval_refineCompareA}, especially in the lower right corner. While these artifacts are no longer visible in figure \ref{sfig:eval_refineCompareB}, it is still impossible to obtain a desirable layout, even after more refinement steps were added. Thus, running the Chalmers' algorithm over the entire data set after the interpolation phase is unavoidable. For the rest of the experiment, only two values, 0 and 20 were selected, representing with and without interpolation artifacts cleaning. + +\begin{figure}[!h] \centering \includegraphics[height=5cm]{graphs/hitrate_graph1.png} \includegraphics[height=5cm]{graphs/hitrate_graph2.png} - \caption{Graphs showing accuracy of pivot-based searching between $k = $ 1, 3, 6, and 10. The left box-plot graph shows the percentage across 5 different runs (higher and more consistent is better). The right shows the high-dimensional distance ratio between the parent chosen by brute-force and pivot-based searching when they are not the same (closer to 1 is better). For instance, if the parent found by brute-force searching is 1 unit away from the querying node, a ratio of 1.3 means that the parent found by pivot-based searching parent is 1.3 unit away.} + \caption{Graphs showing accuracy of pivot-based searching between $k = $ 1, 3, 6 and 10. The left box-plot graph shows the percentage across 5 different runs (higher and more consistent is better). The right shows the high-dimensional distance ratio between the parent chosen by brute-force and pivot-based searching when they are not the same (closer to 1 is better). For instance, if the parent found by brute-force searching is 1 unit away from the querying node, a ratio of 1.3 means that the parent found by pivot-based searching parent is 1.3 unit away.} \label{fig:eval_pivotHits} \end{figure} -Hybrid layout have multiple parameters during the interpolation phase. For the parent-finding stage, there is a choice of weather to use brute-force or pivot-based searching method. In case of pivot-based, the number of pivots ($k$) have to also be chosen. Experiments have been run to find the accuracy of pivot-based searching, starting from 1 pivot to determine reasonable numbers to use in subsequence experiments. As shown in figure \ref{fig:eval_interpVariations}, the randomly selected $S$ set (the $\sqrt{N}$ samples used in the first stage) can greatly affect the interpolation result, especially with smaller data set with many small clusters. Therefore, each tests have to be run multiple times to generalise the result. From figure \ref{fig:eval_pivotHits}, it can be seen that the more pivots used, the higher accuracy and consistency. The diminishing returns can be observed at around 6 to 10 pivots, depending on number of data points. Hence, higher number of pivots are not considered for the experiment. - -Finally, the last step of interpolation is to refine the placement for a constant number of times. Preliminary testings shows that this step helps clean up a lot of interpolation artifacts. For example, a clear radial pattern and straight lines can be seen in figure \ref{sfig:eval_refineCompareA}, especially in the lower right corner. While these artifacts are no longer visible in figure \ref{sfig:eval_refineCompareB}, it is still impossible to obtain a desirable layout, even after more refinement steps were added. Hence, the Chalmers' algorithm has to be run over the entire data set after the interpolation phase. For the rest of the experiment, only two values, 0 and 20 were selected, representing with and without interpolation artifacts cleaning. - -\begin{figure}[h] +\begin{figure}[!h] \centering \begin{subfigure}{\textwidth} \includegraphics[height=5.5cm]{layout/interpVar1A.png} @@ -632,11 +637,11 @@ Finally, the last step of interpolation is to refine the placement for a constan \includegraphics[height=6cm]{layout/interpVar2B.png} \caption{An example of interpolation result with a less-balanced $S$} \end{subfigure} - \caption{Difference in interpolation results of a subset with 1,000 data points. Left images shows only data points in set $S$ and the right shows the interpolation result.} + \caption{Difference in interpolation results of a subset with 1,000 data points. Left images show only data points in set $S$ and the right show the interpolation result.} \label{fig:eval_interpVariations} \end{figure} -\begin{figure}[h] +\begin{figure}[!h] \centering \begin{subfigure}{0.45\textwidth} \includegraphics[height=5cm]{layout/refineCompareA.png} @@ -647,15 +652,15 @@ Finally, the last step of interpolation is to refine the placement for a constan \includegraphics[height=5cm]{layout/refineCompareB.png} \caption{20 steps of Interpolation refinement} \label{sfig:eval_refineCompareB} \end{subfigure} - \caption{A comparison between the interpolation result} + \caption{A comparison between the interpolation results} \label{fig:eval_refineCompare} \end{figure} %============================ \subsection{Performance metrics} -As discussed in section \ref{sec:bg_metrics}, there are three main criteria to evaluate each algorithm: execution time, memory consumption, and the produced layout. Although stress is a good metric to judge the quality of a layout, it does not necessary means that layouts of the same stress are equally as good for data exploration. Thus, the looks of the product itself have to also be compared. Since Bartasius have found that Link Force provide a layout with the least stress in all cases, the its layout will be used as a baseline for comparison (figure \ref{fig:eval_idealSample}). +As discussed in section \ref{sec:bg_metrics}, there are three main criteria to evaluate each algorithm: execution time, memory consumption, and the produced layout. Although stress is a good metric to judge the quality of a layout, it does not necessary means that layouts of the same stress are equally as good for data exploration. Thus, the looks of the product itself have to also be compared. Since Bartasius have found that Link Force provide a layout with the least stress in all cases\cite{LastYear}, the its layout will be used as a baseline for comparison (recall figure \ref{fig:eval_idealSample}). -It should also be noted that for ease of comparison, the visualisations may be uniformly scaled and rotated. This manipulation should not effect the evaluation as the only concern of a spring model is relative distance between data points. +It should also be noted that for ease of comparison, the visualisations shown in this chapter may be uniformly scaled and rotated. This manipulation should not effect the evaluation as the only concern of a spring model is relative distance between data points. %============================ \section{Results} @@ -663,12 +668,12 @@ It should also be noted that for ease of comparison, the visualisations may be u \subsection{Memory usage} \label{ssec:eval_ram} -Google Chrome comes with the performance profiling tools, allowing users to measure JavaScript heap usage. While it is straightforward to measure the usage of Link Force, the 1996 algorithm the garbage collector gets in the way of obtaining an accurate value. Because the $Samples$ sets and, to a certain degree, $Neighbours$ sets are reconstructed at every iterations, a lot of new memory spaces are allocated and the old ones are left unreachable, waiting to be reclaimed. As a result, the JS heap usage keeps increasing until the GC runs even though the actual usage is theoretically constant across multiple iterations (figure \ref{fig:eval_neighbourRam}). Even though GC is designed to be only be run automatically by the JavaScript engine, Google Chrome allow it to be manually called in the profiling tool. For this experiment, GC will be manually called periodically during part of the run. The usage immediately after garbage collection is then be recorded and used for comparison. The peak before GC automatically gets invoked is also noted. +Google Chrome comes with a performance profiling tools, allowing users to measure JavaScript heap usage. While it is straightforward to measure the usage of Link Force, the garbage collector gets in the way of obtaining an accurate value for the 1996 algorithm. Because the $Samples$ sets and, to a certain degree, $Neighbours$ sets are reconstructed at every iterations, a lot of new memory spaces are allocated and the old ones are left unreachable, waiting to be reclaimed. As a result, the JS heap usage keeps increasing until the GC runs even though the actual usage is theoretically constant across multiple iterations (figure \ref{fig:eval_neighbourRam}). Even though GC is designed to be only be run automatically by the JavaScript engine, Google Chrome allow it to be manually called in the profiling tool. For this experiment, GC will be manually called periodically during part of the run. The usage immediately after garbage collection is then be recorded and used for comparison. The peak usage before GC automatically gets invoked is also noted. \begin{figure} \centering \includegraphics[height=3cm]{graphs/neighbourRam.png} - \caption{Fluctuating JavaScript usage due to frequent memory allocation of the Chalmers' algorithm. GC is manually invoked every second in the first half and automatically in the later.} + \caption{Fluctuating JavaScript heap usage due to frequent memory allocation of the Chalmers' algorithm. GC is manually invoked every second in the first half and automatically in the later.} \label{fig:eval_neighbourRam} \end{figure} @@ -684,7 +689,7 @@ The hybrid layout has multiple phases, each with different theoretical memory co The comparison have been made between the 3 algorithms with hybrid layout running 10 pivots to represent the worst case scenario for interpolation. Rendering is also turned off to minimize the impact due to DOM elements manipulation\cite{LastYear}. The results are displayed in figure \ref{fig:eval_ram}. The modified Link Force, which use less memory compared to the D3's implementation (section \ref{sec:imp_linkForce}), scales badly compared to all others, even with automatic garbage collection. The difference in the base memory usage between the 1996 algorithm and the final stage of Hybrid layout is also within the margin of error, confirming that they both have the same memory requirement. If the final phase of the Hybrid layout is skipped, memory requirement will grow at a slightly lower rate. -Although the original researchers, Chalmers, Morrison, nor Ross, have explored the memory aspect before, Bartasius experimented with the maximum data size the application handle before Out of Memory exception occurred\cite{LastYear}. A similar test is re-performed to find if there has been any changes. +Although the original researchers, Chalmers, Morrison, nor Ross, have explored this memory aspect before, Bartasius experimented with the maximum data size the application handle before Out of Memory exception occurred\cite{LastYear}. A similar test is re-performed to find if there has been any changes. Due to JavaScript limitation, Link Force crashes the browser tab at 50,000 data points before any spring force is calculated, failing the test entirely. The similar behavior can also be observed with the D3's implementation. In contrast, the Chalmers' and hybrid algorithm can process as much as 470,000 data points. Interestingly, while the Chalmers' algorithm can also handle 600,000 data points with rendering, the 8GB memory is all used up, causing heavy thrashing and slowing down the entire machine. Considering that, paging does not occur when Link Force crashes the browser tab, memory requirement may not the only limiting factor in play. All in all, since a desirable result can not be obtained from Hybrid algorithm if the final stage is skipped, there is no benefit in term of memory usage from using the Hybrid layout, compared to Chalmers' algorithm. Both of them have a lot smaller memory footprint compared to Link Force and can work with a lot more data points on the same hardware constraint. @@ -693,7 +698,7 @@ All in all, since a desirable result can not be obtained from Hybrid algorithm i \subsection{Different Parameters for the Hybrid Layout} In section \ref{ssec:eval_termCriteria}, it has been concluded that the value of the parameters can not be evaluated on their own. Based on findings discussed in section \ref{ssec:eval_selectParams}, 10 different combinations of interpolation parameters were chosen: Brute force and 1, 3, 6, and 10 pivots, each with and without refinement at the end. Due to possible variations from the sample set $S$, each experiment is also performed 5 times. Data sets used are Poker Hands with 10,000 data points, which is the highest amount where stress can be calculated before crashing the web page, and 100,000 data points to hi-light the widen difference in interpolation time. -It should also be noted that while the original researchers had a similar experiment\cite{Algo2003}, it only explored the difference in execution time usage between random parent, brute-force, and pivot-based parent finders. The different values of each parameters was not taken into consideration and the produced results were assumed to be equal across multiple different runs. +It should also be noted that while the original researchers had a similar experiment\cite{Algo2003}, it only explored the difference in execution time between random parent, brute-force, and pivot-based parent finders. Different number of pivots were not taken into consideration and the produced results were assumed to be equal across multiple different runs. \begin{figure} \centering @@ -705,9 +710,9 @@ It should also be noted that while the original researchers had a similar experi \label{fig:eval_hybridParams10k} \end{figure} -Figure \ref{fig:eval_hybridParams10k} and \ref{fig:eval_hybridParams100k} shows that most of the execution time is spent in the final phase, making the number of iterations very important. While refining the interpolation result takes nearly insignificant amount of time, it both reduces the stress of the final layout and help the last phase reach stability much faster across the board. Figure \ref{fig:eval_pivotToggleRefine} also suggest that the produced layout is much more accurate. Without refining, it can be seen that a lot of "One pair" (orange) and "Two pair" (green) data points circles around "Unrecognized" (blue) when they should not. Thus, there is no compelling reason to disable this refinement step. +Figure \ref{fig:eval_hybridParams10k} and \ref{fig:eval_hybridParams100k} shows that most of the execution time is spent in the final phase, making the number of iterations very important. While refining the interpolation result takes an insignificant amount of time, it both reduces the stress of the final layout and help the last phase reach stability much faster across the board. Figure \ref{fig:eval_pivotToggleRefine} also suggest that the produced layout is much more accurate. Without refining, it can be seen that a lot of ``One pair'' (orange) and ``Two pair'' (green) data points circles around ``Unrecognized'' (blue) when they should not. Thus, there is no compelling reason to disable this refinement step. -Surprisingly, despite lower time complexity, selecting higher number of pivots on the smaller data set can results in higher execution time than brute-force, negating any benefits of using it. At 10,000 data points, 3 pivots takes approximately as much time as brute-force, marking the highest sensible number of pivots. Looking at the lower number, the time saved from using 1 pivot does not reflect on the total time used by the layout. At 100,000 points however, a significant speed up can be observed and is reflected in the total execution time. This suggests that pivot-based searching could shine with even larger data set and slower distance functions. +Surprisingly, despite lower time complexity, selecting higher number of pivots on the smaller data set can results in higher execution time than brute-force, negating any benefits of using it. At 10,000 data points, 3 pivots takes approximately as much time as brute-force, marking the highest sensible number of pivots to use. Looking at the lower number, the time saved from using 1 pivot does not reflect on the total time used by the layout. At 100,000 points, however, a significant speed up can be observed and is reflected in the total execution time. This suggests that pivot-based searching could shine with even larger data set and slower distance functions. \begin{figure} \centering @@ -739,11 +744,11 @@ Surprisingly, despite lower time complexity, selecting higher number of pivots o Between brute-force and 1 pivot, there is no visual difference aside from variation from run-to-run. The stress measurement seems to support this subjective opinion. On the other hand, brute-force seems to results in a more consistent total execution time. Considering that refinement is stronger with bigger data set as there are more points to compare against, it make sense that the effect of low accuracy is easily corrected in larger data set. -In summary, to obtain quality layout, the refining step of the interpolation phase can not be ignored. Pivot-based searching only provide a significant benefit with very large data set and/or slow distance function. Otherwise, brute-force method can yield a better layout in consistently less time. +In summary, to obtain quality layout, the refining step of the interpolation phase can not be ignored. Pivot-based searching only provide a significant benefit with very large data set and/or slow distance function. Otherwise, brute-force method can consistently yield a better layout in less time. %============================ \subsection{The 3-way comparison} -Figure \ref{sfig:eval_multiAlgoTime} shows the execution time and stress of the produced layout of each algorithm with various data sets. The results reveal that the Hybrid algorithm is superior to other algorithms across the board. The difference compared to Chalmers' algorithm is so large that the time difference from to parameter settings seems insignificant. It should be noted that with smaller data sets, the processing time in each iteration can be faster than 17 milliseconds, the time between each frame on a typical monitor running at 60 frames per second. In D3-force, the processing is put on idle until the next screen refresh. As a result, the total execution time is limited to the number of iterations. +Figure \ref{sfig:eval_multiAlgoTime} shows the execution time and stress of the produced layout of each algorithm with various data sets. The results reveal that the execution time of the Hybrid algorithm is superior to others across the board. The difference compared to Chalmers' algorithm is so large that the time differences from setting interpolation parameter seems insignificant. It should be noted that with smaller data sets, the processing time in each iteration can be faster than 17 milliseconds, the time between each frame on a typical monitor running at 60 frames per second. In D3-force, the processing is put on idle until the next screen refresh. As a result, the total execution time is limited to the number of iterations. \begin{figure}[h] % GRAPH \centering @@ -784,7 +789,7 @@ Figure \ref{sfig:eval_multiAlgoTime} shows the execution time and stress of the As for the stress, a relative value is used for comparison. Figure \ref{sfig:eval_multiAlgoStress} shows that the Hybrid algorithm results in a layout of lower stress overall. A trend also implies that the more data points available, the better the Chalmers' and Hybrid algorithm perform. In any cases, Link Force's always has the lowest stress. -Comparing the produced layout, at 10,000 data points (figure \ref{fig:eval_Poker10k}), Hybrid can better reproduce the space between large clusters as seen in the Link Force's layout. For example, "Unrecongnized" (blue) and "One pair" (orange) have a clearer gap; "Two pairs" (green) and "Three of a kind" (red) overlap less; "Three of a kind" and "Straight" (brown) mixes together in Chalmers' layout but more separated in the Hybrid layout. However, for other classes with less data points (colored brown, purple, pink, ...), the hybrid layout fail to form a cluster, causing them to spread out even more. The same phenomenon can be observed at 100,000 data points (figure \ref{fig:eval_Poker100k}). +Comparing the produced layout, at 10,000 data points (figure \ref{fig:eval_Poker10k}), Hybrid can better reproduce the space between large clusters as seen in the Link Force's layout. For example, ``Unrecongnized'' (blue) and ``One pair'' (orange) have a clearer gap; ``Two pairs'' (green) and ``Three of a kind'' (red) overlap less; ``Three of a kind'' and ``Straight'' (brown) mixes together in Chalmers' layout but more separated in the Hybrid layout. However, for other classes with less data points (colored brown, purple, pink, ...), the hybrid layout fail to form a cluster, causing them to spread out even more. The same phenomenon can be observed at 100,000 data points (figure \ref{fig:eval_Poker100k}). \begin{figure}[h] % Poker 100k \centering @@ -812,9 +817,9 @@ The area where the 1996 and Hybrid algorithm fall short is the consistency in th ~ %add desired spacing between images, if blank, line break \begin{subfigure}[t]{0.45\textwidth} \includegraphics[height=4cm]{layout/IrisNeighbourStuck.png} - \caption{Result from 1996 Algorithm with an Iris Versicolour point (orange) stuck behind the Iris Virginica (green) cluster.} + \caption{A result from 1996 Algorithm with an Iris Versicolour point (orange) stuck behind the Iris Virginica (green) cluster.} \end{subfigure} - \caption{Variations of the result from the Chalmers' 1996 algorithm on the Iris data set with the same parameters.} + \caption{Results from the Chalmers' 1996 algorithm on the Iris data set with the exact same parameters.} \label{fig:eval_IrisBad} \end{figure} @@ -829,7 +834,7 @@ The area where the 1996 and Hybrid algorithm fall short is the consistency in th \includegraphics[height=5cm]{layout/Poker100HybridBad.png} \caption{A result with higher stress.} \end{subfigure} - \caption{Variations of the result from the Hybrid on 100 data points from the Poker Hands data set with the same parameters.} + \caption{Variations of the results from the Hybrid on 100 data points from the Poker Hands data set with the same parameters.} \label{fig:eval_Poker100Bad} \end{figure} @@ -863,11 +868,11 @@ Moving to the Antartica data set with a more complicated pattern, all three algo %============================ \section{Summary} -Each algorithm demonstrates their own strengths and weaknesses in different tests. For smaller data sets with a few thousands data points, Link Force works great and perform consistently. Most information visualisations on a web page will not hit any limitation of the algorithm. In addition, it allows the real-time object interactions and produces smooth animations which might be more important to most users. However, for a fully-connected spring model with above 1,000 data points, the startup time spent on distance caching starts to become noticeable and the each iteration can takes longer than 17ms time limit, dropping the animation below 60fps, causing visible lags and slowdown. Its memory-hungry nature also limit the ability to run on lower-end computers that a significant margin of the Internet users possess. +Each algorithm demonstrates their own strengths and weaknesses in different tests. For smaller data sets with a few thousands data points, Link Force works great and perform consistently. Most information visualisations on a web page will not hit the limitation of the algorithm. In addition, it allows the real-time object interactions and produces smooth animations which might be more important to most users. However, for a fully-connected spring model with over 1,000 data points, the startup time spent on distance caching starts to become noticeable and the each iteration can takes longer than 17ms time limit, dropping the animation below 60fps, causing visible stuttering and slowdown. Its memory-hungry nature also limits the ability to run on lower-end computers that a significant margin of the Internet users possess. -When bigger data sets are loaded and interactivity is not a concern, performing the Hybrid layout's interpolation strategy before running the 1996 algorithm results in a better layout in a shorter amount of time. It should be noted that, this method does not work consistently with smaller data set, making Link Force a better option. As for interpolation, simple brute-force method is the better choice in general. Pivot-based searching does not significantly decrease the computation time, even with a relatively large data set, and the result is less predictable. +When bigger data sets are loaded and interactivity is not a concern, performing the Hybrid layout's interpolation strategy before running the 1996 algorithm results in a better layout in a shorter amount of time. It should be noted that, this method does not work consistently with smaller data set, making Link Force a better option. As for interpolation, simple brute-force method is the better choice in general. Pivot-based searching does not significantly decrease the computation time, unless a very large data set is concerned, and the result is less predictable. -Looking back at the older Java implementation from 2002 running on Intel\textsuperscript{\textregistered} Pentium III\cite{Algo2002}, it used to be that a 3-dimensional data set with 30,000 data points requires over 10 minutes to run, using Chalmers' algorithm and approximately 3 minutes using the Hybrid algorithm with brute-force and pivot-based parent finding\cite{Algo2003}. Comparing to now where 30,000 data point of Poker Hands, even with parameters stored as text-keyed dictionary rather than index-based array, can be visualised by 1.5 minutes with Chalmers' and 14 seconds with the Hybrid algorithm, it is clear that performance of general consumer devices have improved greatly. +Looking back at the older Java implementation from 2002 running on Intel\textsuperscript{\textregistered} Pentium III\cite{Algo2002}, it used to be that a 3-dimensional data set with 30,000 data points requires over 10 minutes to run, using Chalmers' algorithm and approximately 3 minutes using the Hybrid algorithm\cite{Algo2003}. Comparing to now where 30,000 data point of Poker Hands, even with parameters stored as text-keyed dictionary object rather than an memory-offset-based class, can be visualised in 1.5 minutes with Chalmers' and 14 seconds with the Hybrid algorithm, it is clear that performance of general consumer devices have improved greatly. Overall, these algorithms are all valuable tools. It depends on the developer to use the right tool for the application. %============================ @@ -889,9 +894,9 @@ The following is the summarized list of work from the beginning to the end, over \begin{itemize} \item \textbf{Studied algorithms:} Each algorithm and relevant researches were studied and understood. \item \textbf{Researched and assessed libraries:} Open-source JavaScript libraries were looked into. D3-force module was inspected and assessed for potential faults. - \item \textbf{Modified D3 Link Force:} The D3 Link Force implementation was forked and optimized for use with a complete graph such as multidimensional scaling using spring model. The applied force tracker was also added, allowing the user to stop the simulation once the force stabilised. + \item \textbf{Modified D3 Link Force:} The D3 Link Force implementation was forked and optimized for use with a complete graph such as multidimensional scaling using spring model. The applied force tracker was also added, allowing the user to stop the simulation once the system stabilised. \item \textbf{Modified d3-neighbour-sampling plug-in:} Chalmers' implementation was tweaked to scale the applied force against a constant, rather than relying on a decreasing value. The applied force tracker was added and the evaluation application interface was updated to include newer algorithms. - \item \textbf{Implemented interpolation algorithms for hybrid layout:} The interpolation algorithm was implemented with support for both pivot-based and brute-force pivot finding. + \item \textbf{Implemented interpolation algorithms for hybrid layout:} Interpolation functions were implemented with support for both pivot-based and brute-force pivot finding. \item \textbf{Implemented Hybrid simulation controller:} A JavaScript object was created as part of the plug-in to control a D3 Simulation object through the 3 phases of Hybrid layout algorithm. \item \textbf{Evaluated interpolation parameters:} Since the interpolation process have many parameters, several values were tested and the impacts were evaluated, both independently and as a whole system. A good combination of parameters was found after experiments. \item \textbf{Compared the three algorithms:} Each algorithm's strength and weakness was identified and compared against each other. Link Force was found to only work well in small data set but does not scales while Hybrid Layout only perform nicely on larger ones. @@ -900,21 +905,21 @@ The following is the summarized list of work from the beginning to the end, over \section{Learning Experience} The project had many challenges that helped me learn of both software engineering and research practices. Working with older research papers, I have met with a lot of ambiguity in an otherwise thorough-looking description. In terms of Software Engineering, both D3 force and d3-neighbour-sampling do not have a documentation on interfaces between each component. A lot of time were spent figuring out how each object interacts with each other and what the flow of the system is. At the same time, the free and open-source license of D3 allowed me to easily access the source code to learn and customise components such as Link Force. This project also helped me expand my knowledge of client-side web application technologies and its fast development. -As a result of evaluating this project, I believe that I have a better understanding of designing and conducting experiments on software performance. Furthermore, I also gained a valuable knowledge in JavaScript behavior on different browser and the limitation of each performance profiling tool. +As a result of evaluating this project, I believe that I have a better understanding of designing and conducting experiments on software performance. Furthermore, I also gained a valuable knowledge in JavaScript behaviour and the limitation of each performance profiling tool in different browsers. \section{Future Work} -There are several areas of the project that was not throughly explored or could be improved. This section show several directions that can enhance the application. +There are several areas of the project that was not thoroughly explored or could be improved. This section shows several directions that can enhance the application. \begin{itemize} - \item \textbf{Incorporating Chalmers' 1996 and Hybrid interpolation algorithms into D3 framework:} Currently, all the implementations are published on a publicly-accessible self-hosted Git Server as a D3 plug-in. While the hybrid model seems to make more sense as a user application implementation, the improved Chalmers' algorithm and the interpolation functions could be integrated to the core functionality of the D3 library. - \item \textbf{Data Exploration Test:} The project focuses on overall layouts produced by each algorithm and a single Stress metric. One of the goal of MDS is to explore data, which is not been assessed. A good tool and layout should help users identify patterns and meanings behind small clusters with less effort. The project could be extended to include data investigation tools. - \item \textbf{Data Sets:} The evaluation focuses on only 1 data set. It is possible that the algorithms could behave differently on different dataset with different dimensionality, data types and distance functions. Hence, findings in chapter \ref{ch:eval} may not apply to all. + \item \textbf{Incorporating Chalmers' 1996 and Hybrid interpolation algorithms into D3 framework:} Currently, all the implementations are published on a publicly-accessible self-hosted Git Server as a D3 plug-in. While the hybrid algorithm as a whole seems to make more sense as a user application implementation, the improved Chalmers' algorithm and the interpolation functions could be integrated to the core functionality of the D3 library. + \item \textbf{Data Exploration Test:} The project focuses on overall layouts produced by each algorithm and a single Stress metric. One of the goal of MDS is to explore data, which has not been assessed. A good tool and layout should help users identify patterns and meanings behind small clusters with less effort. The project could be extended to include data investigation tools. + \item \textbf{Data Sets:} The evaluation focuses mainly on 1 data set. It is possible that the algorithms could behave differently on different data set with different dimensionality, data types and distance functions. Hence, findings in chapter \ref{ch:eval} may not apply to all. \item \textbf{Optimal parameters generalisation:} So far, only good combinations of parameters were determined for a specific data set. These values may not be universally optimal and can vary from data set to data set. Even the threshold value to stop Chalmers' algorithm also varies for different size of subset of the same Poker Hands data set. Future researches could be conducted to find the relation between these parameters to other information about the data set. - \item \textbf{GPU rendering:} The use of GPU for general-purpose computing (GPGPU) is gaining popularity because GPU can perform simple calculations in parallel much faster than CPU. In 2017, Khronos group have introduced WebCL\cite{WebCL}, OpenCL for web browsers. However, it have never gained any popularity and was not adopted by any browser. + \item \textbf{GPU rendering:} The use of GPU for general-purpose computing (GPGPU) is gaining popularity because GPU can perform simple calculations in parallel much faster than CPU. In 2017, Khronos group have introduced WebCL\cite{WebCL}, OpenCL-like standard for web browsers. However, it have never gained any popularity and was not adopted by any browser. - Other efforts such as gpu.js\cite{gpujs} turns to using OpenGL Shading Language (GLSL) on WebGL instead. While the latest WebGL 2.0 does not support Compute Shader due to the limiting feature set of OpenGL ES 3.0\cite{WebGL2}, all of the mathematical operations used in those algorithms are supported. Following the approach, Chalmers' and the interpolation algorithms could be ported to GLSL in the future. + Other efforts such as gpu.js\cite{gpujs} turns to use OpenGL Shading Language (GLSL) on WebGL instead. While the latest WebGL 2.0 does not support Compute Shader due to the limiting feature set of OpenGL ES 3.0\cite{WebGL2}, all of the mathematical operations used in the algorithms in this project are supported. Following the approach, Chalmers' and the interpolation algorithms could be ported to GLSL in the future. \item \textbf{asm.js and WebAssembly:} As discussed in section \ref{ssec:des_js}, coding in lower-level languages such as C and C++ and compiling them to asm.js or WebAssembly could speed up the execution time. During the period of the project, support for WebAssembly has been growing with more learning resources available online. It is now supported on many major web browsers such as Firefox, Chrome, Safari, and Edge. The project could be ported to these languages to potentially reduce the execution time even further. - \item \textbf{More-efficient hashing algorithms for parent finding:} Over the decade, the field of machine learning and data mining have gained a lot of interest. Many improvements were made to solving related problems, including high-dimensional near neighbour searching. Newer algorithms such as data-dependent Locality-Sensitive Hashing\cite{LSH}, could provide a better execution time or more accurate result. Future researches can be carried out to incorporate these newer algorithm into the interpolation process of the Hybrid layout and evaluate any difference they make. - \item \textbf{Multi-threading with HTML5 Web Workers:} By nature, JavaScript is designed to be single-threaded. HTML5 allow new processes to be created and ran concurrently. These workers have isolated memory space and are not attached to the HTML document. The only way to communicate between each other is message passing. JSON objects passed are serialized by the sender and de-serialized on the other end, creating even more overhead. Due to the size of the object the program have to work with, it is estimated that the overhead will out weight the benefit and support was not implemented. + \item \textbf{More-efficient hashing algorithms for parent finding:} Over the decade, the field of machine learning and data mining have gained a lot of interest. Many improvements were made to solving related problems, including high-dimensional near neighbour searching. Newer algorithms such as data-dependent Locality-Sensitive Hashing\cite{LSH}, could provide a better execution time or more accurate result. Future researches can be carried out to incorporate these newer algorithms into the interpolation process of the Hybrid layout and evaluate any difference they make. + \item \textbf{Multi-threading with HTML5 Web Workers:} By nature, JavaScript is designed to be single-threaded. HTML5 allow new processes to be created and ran concurrently. These workers have isolated memory space and are not attached to the HTML document. The only way to communicate between each other is message passing. JSON objects passed are serialized by the sender and de-serialized on the other end, creating even more overhead. Due to the size of the object the program have to work with, it is estimated that the overhead will out weight the benefit and support was not implemented. In the future, the support can be added to verify the hypothesis. \end{itemize} \section{Acknowledgements} @@ -930,18 +935,38 @@ I would like to thank Matthew Chalmers for his guidance and feedback throughout \chapter{Running the evaluation application} The web application can run locally by loading a single HTML file. It is located at \begin{verbatim} - d3-spring-model/examples/example-papaparsing.html + examples/example-papaparsing.html \end{verbatim} The data sets used can also be found at \begin{verbatim} - d3-spring-model/examples/data + examples/data \end{verbatim} Please note that a modern browser is required to run the application. Firefox 57 and Chrome 61 were tested, but some older versions might also works. -In order to change the value... +Most of the settings are available on the web interface. However, the cut-off value to stop the simulation when the system stabilises is not. To change the values, navigate to +\begin{verbatim} + examples/js/algos/[algorithmName].js +\end{verbatim} +and edit the parameter of \texttt{stableVelocity()} method. \chapter{Setting up development environment} -The API references and instruction for building the plug-in is available in README.md file. Please note that the build scripts are written for Linux development environment and may have to be adapted for other operating system. A built JavaScript file for the plug-in is already included with the submission, hence re-building is unnecessary. +The API references and instruction for building the plug-in is available in README.md file. Please note that the build scripts are written for Ubuntu and may have to be adapted for other distributions or operating systems. A built JavaScript file for the plug-in is already included with the submission, hence re-building is unnecessary. + +For the plug-in, dependencies have to first been fetched and installed. Assuming that a recent version of Node.js and node package manager is already installed, run +\begin{verbatim} + npm install +\end{verbatim} + +To compile and pack the plug-in, run +\begin{verbatim} + npm run build + npm run minify + npm run zip +\end{verbatim} +The output files will be located in the \texttt{build} directory. + +The evaluation web page is self-contained and can be edited with any text editor without Node.js. It will load the plug-in from the \texttt{build} directory. When the new build of the plug-in is compiled, simply refresh the web page will load up the new build. + \end{appendices}