From 13cdd2167adffb2b396ed76b3dcabf5e4c7f4db7 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 20 Mar 2009 17:19:26 -0700 Subject: [PATCH 01/36] Added airports example from Brendan Frey --- graphs/airports.mat | Bin 0 -> 240003 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 graphs/airports.mat diff --git a/graphs/airports.mat b/graphs/airports.mat new file mode 100644 index 0000000000000000000000000000000000000000..6134dd0463d9cf1b973a90fcbc79d20d6cf55db5 GIT binary patch literal 240003 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

SK<25fFmOv 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

    =%&13 zPC`hgTDam{Bmtga?Hx0ik+?M{VDBkM(oX##eIS)gU(}x^ldu8%u z&lCS%iyK?iyJ`1tfs^nqwA9tnboAw6;6w%E%=lh+gstd^fq;BVIUtR-q7I;hjL}=P zCBBp1RVH~yI1QiwqqY$nv+q%ed$4s!Qj?%0og`voDkMw3XKu$l!`_Oe#y z)7-!CD$`4V#LR~0PM#;8l1r2elpiF5zL?H@0^W>n%J~wZ$QtTun((?{{5EV7In=2+ z`Zf+a26miH>$)*8dsoD)bUSOe#(<%enPMiJtiqBCccG8Q-prPfpEV`ke`=`;*a{d| z{Zo~(cp$GPPqQiVl~}^v2L04H4?RSczR202%&$6ofR7K(7B#Jz49Nw&osbVRG<)|0 z_2;Bap|kULiN}74*fnR zgjdr(F>zyZG*u0{_E9 zt3K^n2zzp>v%!4x!XQwqoHR28+qoI-zN#uO5E=CzG_erlUZg%cm=d<|<@x=a>c8R&!Wq^K}4?yD?xn^TfzixmP zW-wMl9R71FaY!$(ym?wN%b5ALDF-g4{xEOPQ_r^pfHW9M$%wjtAqHpgb&$AK|JKY> zs(^$^P!8HV44`Z)Zi*~?f3er;biwwF^oun^q?Xk?fuClvLK`il#P!S%wf+ZkM@Sth zx_NOwz5SZB-{Ezp4quR%movAv>+FIZG3Tv5Q&bP+${JZpJh1~H}$z1w?ym52kwuLuD2 z0SgP;Gkn3>9r~J&p(|mg752gGzt zA&L*W`i&>ljttxaOgkK^rLmrV(st>+uJ%KydfF8AUyaULnUlpr-<LizFfkJFjh11oJud_}my5*LJ9J!&K`~lqY~y|Vn>y#^Uu&X1ywrARNl%!; zN^SwmwK`{V1;W*gObRcd#7nBaEcUNk_D}3r{CUEA7^G`-tT@mLM1N^>s?uLqIzIPo zgTGZk1Ilf`x+e?_410I1HMt@M zdsox?Ur0}0+`1g!i(KRIR#9GOzlu=3{di_o%lXa^l5#n-rpGN`oE4OAH}9V%r+++0 zs)jxGk7LaCb!fv6oUpiYpnSSgu-G|5lrVE%{ND3cy`xiTb9h29Annzm7fzCP5|pAiW_IEwY4UIx zQuRTs%-gE9+qP|t!thK`Y_g{sZ*Of|t8E+_xG<#bGytsV70H^F^jJcf6zKmjW`BGG`*_ zPio_xWX%IB`gI%`9X{(9LG|ITurQ*ELonTW=h`qbX(y_AN+^xc2S1!lmpz z<+3|%9pAE_OYR*x?0r@T;kzH8g^H|uXTD47{r!|h6JyZHMYmTzgdBgE6v`s4S?>>j zriCcwXSBNIh>p+dqK|j8yDzKJ=QBEN;@+yp`&AsbvFBwbOp)PkT)OYh_qZ~*)-Phf z!6ZG!o?|Xs=^;lnY)s?u0S`U~V2Mqpb~8f8#|K%Efw0rJB2k(+@W}p8m;{Tv@yfPj;^2kF)1H~qzDT?N_Pg)8vbAkM!(uq zvLoS7+KG|v;%yp+mY4-NlvGJ(7EG?Uoe~px)+v0t376jFX=f+|Rea*~ZxWw0UQhZQ z_eEN!Riml)HVSC}ImmAFOnV9+QuN3DP8`SB{v*W8c+xDOXf0=C9}~kxN@Z&`Tp>@k&yT&k z9qHKWhLJY1)B7-o(FwivGf$Lp>L$m^G7lDIJ-dAM^OBj^E}atg{)U>AnDpdBbn}+p zVCF%emWO>O#$pd^8!&(V%k(^La$}9W0}>BE%U#6L=i`I|JruOc$X&BqA!=g}f!vRd z5ui4Uw;2lPmv=LT-vPw3OOipe2( zROq>wiPpIT%XL!^EggHh+8^m>dN;4eDrd;29F`AlARbv-SAV1l`RZoMDpmp1r-d>X z26si8$E{%)bET!8u3bKcfM`Br`XugXpZ+O(?KmKn7)I?gb8Ri?7P zIVmnk6Zr}yp@4fzXK~1*oDysv+`~A8c*$&sT;tQLCS#M9WjO}$Ss2w$ZJtLIL8=>8o~5&3=(qL^(z__pSl4uop0|AIYD zIJ5oq?cg7)Peca!S<=4(o#+ie^UQlkT-%RyFHmhK6c*MKBkCkJ*L^{ug1EgiC%oYv zsw<#pZAqnNJFSNWFxhMCyBJ-U>TgOGCRgH&o9`Sy`L#N~h#1>QG4^_q9g44N8{W^Y z)+;`8TKY=gpxB>m%Qpqa4XYN%6sR~7o9m)2aR)wg{mDShmF^t!8S@fL3-y|i|! znJOZ9;34psK4$29`#Z z6>wnfv;UX9R~Iu)rM;{F(mlEfFC7f>eYe^FC0F0l3v^vP6bN^+NmCng8w>P6VoFaadWDA1n-Anq9 zN0q+moHq8?6gawG#AfqxSpSc{uoN<5k++UhzSnlKU?LGhAP6?IU3i(j(S} zU(cPG*lyd0^Afh#ot?a|><7t@{CFg{=-0c!ceIlajDhLKW+!XP_6qj#$Pw8BlUN*^ zWd5Ima~XFx3iM{b2h#j?sl%06hm@#av}E@-?*ln)Csm~XysJF?(Dkp1yrK2kL{a8O z+2azC2L*RCPhtNF^m>|Rn=vJS-kW}|S#UK7S5=z!sAT6=sU3v(_;2Rd#6Ae=XjWK= zHzh_*()Zqy3HO<$(E7*~x?$Tp3aI&;SK-5w71Wd0qDNooG~6#qU)<+*xe)^&t$8y? z0smI5d*H&}1pkpZqnZE6So)jav|z)>cefdmPhMf1whIUcsM!Ag8Z+u}YS!M)Us0n% zMWSv*2u757+gLW{;ir+)m)?nl94vewpdx8noz?mx3M;*_*Q6@i}=W|$Y>MzC(( z$<-A`DI$tkWOjCXy$?6>NH`$)bsR{w?5qo^j_Od*rXZ;4%=KVQJcJRXdI(@;w#0eJ@gJ! zcRV@vRPQXjx<7h9L=5qw*5nQh`tU+$G$R$}8*ijj}M)b48)qx$2!0<)H7 zFBy~M4i$a!(4h=qFCIUq=sCkTv!26~eC~^ukASY*vq5&Rhb7cL;n` z9{q7HP$#;2PQABZG1$IrGSqISqi;`xt*QCr%EztjPC$^bnQWF{rQI7*6d4V3O1(JG ziOotEnhFecuIr+8Tz0r6zU2?ljz1ESunn4femzcj!+X~{S-`h1DELBlTCz&WYI5;W z`W)jt=Yg_Z(=Ut)p!%s9-0xw%1{d3~gNe$pR ztfY5O_3o?KzC7UhdY|v<0cVJs!gM{DkaNZP-WQpI?bTXY<)d)_#!KWJ4{rVOmo)q{ ze(31Q<)ifS^SGYqGXk&027)YorwWjepRpp6$wv$juIdUpBL7{*Uu*+CB<{a4;x}2P zdS37m4F#wjJy(4#3`t1hJ)QLN;crM$clA|FL-zf><6d<}uycj?a^}Rn$bkCzw{@50 z5}oqS#k!pLg}Z-t4xLi0l*mRh-yM-@gp49HhFwxO^T(g$H{2inoahk>_PCtIxTD|G zc;Cf{U>){HE&BcHx6P=KtYhlR4GOQbJW@RQZoU_P(N(KF&(co; zEqihBzfUqDMsk<5Ojy#;ucAJeRGke>1_ZftL>23WyJ)8j%(H%9z%#Dx=fDh+@U404 zd*6N1^%YKP86)Pc)D+Hb-u^-Idq{^|MEtbs5#SPrBfC_Z5Rhs{dB>~80bT5)vJ)4h zx3mr1MM!<0Nw!7baXeh+4a@4M!Ej-bV|}W9>L)@_mPOGQjofT;_tZ`N**bIe!lxLwKF_HtN6sC zHt#vy*6VnL{L6z~VDoe{d?0~(^`xZP)ftYn>g220^eWHgqXKf*J}Nh_9W#Gcel{^pzN?dMO~*y^POyp3B=_X>fGTsbM>4Jp|7VC%J_+4j?w>+&xpC7KLt z!-w+Lk1>jZz${CZPY*wx{uO+%Yk&9`u9GbL42jB=@P{0>XWbnr{S>rg9{u3707B&v zdHYl3dz-{?OYyHTO0LC{r*Yv^nA=V|0Q3n^Cp*UH<)^%9!ZiU%)~| zs^A)&c8+v1+oLb9@BM7TLtj18Ha6(%f#Lz#($b#XD_t7S#BYZVeHPertG{IZboQf9 zz%s_>sYT770hFO-XwB;VA6N4)NDo2UJ$kfH>0q?0pO#CUKR+a2I^QOXN*&`>ec$JQ zIC2g&s#HN{Kj57{`6|jI&GF)pc%>wG?6RH`E~XcE>2oG;y-D*BQ(_6HFTs8N+QM$k ziaaoS5xg?(FPJ!2yheUrCcJys;sv<6QzmgNGOC%dp5NlKB-!e5{yvC+tLG?)$iKrf zin1S;r0X9gqJrLSEB)B|DP$SS1$NRsbWZ#esFLKE_Pvu^I2aAyx)Rd~sSy(SAPX_R z6`1m+w#D%6@>&K)=C#zO-4%G=wSP8H{(_GQ?1Lt@F;xU6u@z^z)MHSm?i@1+Gvr$!gws)CLs#Prte@-PXN* zI)P}#`^=$&-KcGAn75u9A+cmA! zM%AUsD;o9Fmz;Cxg#TQR-8}l_jPR`Kva@^R+UBdjLUMNZecjuY{L5=!&${f#1#X8a zwej|yJnH8Azd-5z$^QjP<=HddGnb{KA3c=|w-1*W-2HYe{PkdcbMBeqBwJ&@rSqOz zYB@DeY}lqB?|gOMj;BgT@NHPn&Yt)$OGWO=?Pt9JF6E8Uhi_{*DF5hTM*ylK9#AN5 z5ji&5xmPx-IvIO)sr!*jXIwNc`{6xzWDVdXwDr`>AHRc?JWN z>YlI{28QDLF?6TnQBo+9Y6vP#5r4a*lvi2WDePjyqc7|Vi(B*!Ur#G!y!sPEY3d1k zZLk)6Xu>ti`jM~wuz%<+^`%z3{D_@q1Y{?d1mSM{ujgN{Z^ms zsmDLd?YR8F(Evm)7+x(YQxuH|oGxdrqYR=JdZem+&uy@OCMb@}=qtO`;h z%CW!N?=U)$#56x+ulo|Bww%|2w_`N09SV#Yw@iGMxgHEpY+iD=(`p8~5eQ^%wBbMH8W zX6Bp*_WKmR(vpa682bBNl4Y}}H9jmmc+Q#Zw$E<#rwWzL{4rnuZ zc-y(Yyd-)IZWkhdj>N@kZF;jS$C~f8zU9p{v6*s>aq;hMC}abTUx3bK@@NxIMdR(oNG z+z_^Ex=Db&3L-geYWUo7?%&1HjVVAc$-(4cx6kg1^A|nNi@Tg{?L80MBRifxbHV1) zt^wYC0eMOh0kFay@a)*TPh|zYp+X-3HW}zI56f|QC*>Y{n?1hS0$0g4D*fxQ=0Mk7 z0^*X11rvfOrcX5kIGo6JmDh3=7~h;;QJg84jX3^wm%|mS%u!@#pWkoV7;t<&$snP=gg zx;r5Y=a?`uoR2#=Z+e_JcQ`|Ipj?|;IlRC+9?yUYg;tw4&wJ-Fl+Qj*cU_P~@;dL0zJ}Ik3cT+9dD$d4S(R75X?O zX%oYnQ|F-Pj9K8`gPhvDI~}{v;kJ2WRP$OD!+DKcCj&Y79{>RV|E!tIZ`(!?hh3m8 zoIVogfu;x$fVW(P>e^!^N|tDvlxi7PoZE=phzqTDglof&hU*Esrp z44LCHppx{QrDw+Zt;W&s<9I80DtONs3@dx4Eu24U9Q{6Kj!SqdMc>=*h@`;K#esdC zkT(Z~ak~9@h|}LKobwvzJm+i>65g5k^{V#$SNZq1R6^esl2g7$(*0RCdpM1I&dj&| zzNC2K^MUnws|Yx(pyvc$~C2zN~Rx<{U{j&>zSMQYcd9 zz-zOsu`a#QCu7g!#bbSznqbX*SahQC1>8kd0*qaFFDf;q9lu;zo0}) zaPFwmwLAE9X4VIq`mE+&LxwSnL1)zE_0iup-kTclO~oUEgN&V}5ZH5rnQ8nQ^Bs9X z6lCb{UeC%d=Me0PRHchuIEyV!6J5lHoW?xWoYc7z3Fhh0?G*1NFidx6NH9IB6YS#O z685}oBV)oHm!^39{=#}5OhE0>l7HRu|F(TcOPnV{ zDB=utQirDb*i;`A?3=OU0^jFa@{@I(bIzrZdh+7b>}HRr82&-f*tRbfoU4pSDb=2p zvc02SH?X6z(qpfaUBsD7)G1mK7V6zzUrZ!{6iZh}3)9=aPIAsAFs9wRwa-gQu-x*z z)YqFXei6RH5J?2x761F#!ue3+e5g2TCGdhXrR&6*3)C(BCFM%Dyampzt(HOE>@3?< zU>N^44w_>$=ik*h?;dgbiyg=m_$rg@N?n=F<<~W?exGFQ^G?XLKcq}N(8AfX4t+4= zoT_7G+Qw}PYaGg{_===pWPfj+0;8Yd0fTSuS2Kr4BHA33v27hqL86+)yIOgZwvUgL zR24ZeH@w$3ofmS_&q89Cac?WXZ0^BR*el(sY<2aNFv1~kQHS{2=$VD_O_g7E9KlGE!6}@^x)7Pl z?^NIIh1xic`JC~zx=&Yg!7AR!Ddc5;L?TEtoHK*#4*u;yH#AJ6fw6y0bJ&X^5!D>_ zMn?YqS>xz;j}hgd&|u&M5M$9$p37HT{p0bN0*9So+DR`ovFmM(^ET(CL~_ug4A?<$ zgx2}#p>W+GvASv7?z23J)fWiN3eZc0&U+2b`&!&zJMHVdG=T^n?=RapP5F5R(Iy|a zC(P~t<=l4Lryn@QHON|*mz={z@o6|_d$FdueFa-m%8`6`_!OM`E*z2Yl9MmSZ1eC+ z?DFkeaKb&Rk&|%(S-G4wsvTjhlqR-)!-p*s zVyE(@jv=RMj`+Y8sB-Uthh`t=9kAp0x91R$oak-ExFd&QGD8&}>wS)oDv}=4(Ei*> z8YOfC{Dj{d8qb~Voh4TMDf_p^_~-^kPSaV9_Mpfr1lue$b1?| zK5KKY@dbzKUejhrV;+h08(C$fvcxtn*WkEPC`C@#D}B%T4*&rF|D>7QZ`(E$hdp2$ zdQG#U=;cjseKFwIJx+GhI!km}95~J1Xz4^EER!xt#qoc?LrQisftzV6fRH$VKk)p{ zojM&12CwnCBzI&BO2II=4Ds^`K7ZizD?ZQg`FYU%{L+5@37^yU_n`gz)Nqy%OiCgu zkQ${q(*vA$9nQNQXG-pgtb++v+hGv?J#akNNr!i0c#P1NG(C6YyzX!somfVs0x=9y zSDjvVI4>KHq^uYQ(fPpDE;~n%6-BSz+&Xh!bT}^>4&;0oTz?-pbL{%aU=9UA=g0G2 zb}7LZ(5l>U4#m;?4(Gk$)B>u}lqf|(E^47ApY_pcqc|G|$%VU4R{LNRx=Y~_( z(4@RG$9^7`@k;ya%$f71!+B#kN>vbC@ob3>yYi1i&Ty3m&m=Ru-R26Z{4{JLRNrjOK7OSUNx2X zw5p&9aPN4k7Yh>uZNc@+`|nVxBt?$q9X zhibuV!O-ttFMHXwT9*`S;dSh6mo+Z{hYzaLE1J1-to4WD7~9&k;~bjz-gY=|4JX$< zXq4n2CFwuUMzq?HdZ`otW|wD&&h??g`CvGV0a^2k%F#>(DXDR`iQ*o5F^+*0e|e(U zA&%95R7ze~s8n?A%CY7fUr^l>!z1dNH7+?iPVr_K>2;op>LfX)&f3qzGBeG_Y=8 z($6kY5T^J>k23Q<90@Yew;9L@-Rj409ghAS)iT4qVODZd$;UMF*Qu6ED0E=E&okD( zwiSAxX*Y=3#5d1keLu6pydO`T?Xu+ua#Woy0c&IAIuG0OH70AbDtzrZr^Q5;?Ydw( zt*^gg*r3Ql7b55Uu$~7wQ*y5-tjV<_$F@&tP9iEG%v|&Jvg?+Me#c?`!E z&&XMGp#uCZ^-85VzaQW{>u~hv7;7S?>4pCO_XFSm-1+`z^L=s0tL11;ML`)QO@@tb zFqCjolKYL%I}XsuG8mI>dxhXz-&zi^c0~5p-Eh*1n3X0z^Q|KZS?c-ksQJNWS5oA_ zTAAZp|GJ&vaZ0`-?TWR#HuRqRk`*b*<67fA*Cb5oP4r(ndD$ljDj4EuK=Wlod3u5U%=hB+0m5+??+L{)3}vv*C*RwuzUUJuMY(wu(Qp+^wftcCEH0S4gKdg z(`n`7$mAVAJR=HogSRh^yzRn0`)QN(&QqKtngJj>bJh9(InBkNH%9;#Af=9Ze{GFt zzGuGuI>kz#LGTUJRlhPE{{sL3|NpF+O>Y}F5Qbf#Eu5xt(j&O(Z;#fGC`j?Zr+oN)nkrcWE4|J=ekY;X=8N6_sU zT!z^3OXL6T`zYrWh9ELjbT_&|=lQw8vF{_E=9Ms)r=hy|IX9Gmq`jzDp&YNDBnUaj zl{xYD$SJBDC{{N-uo%jIU6r2>(8{+I$oc2Zo`L; z^=_q4O#KE7ME9ZYB57%K&SGnu3DI(TjNJq}QMy%6TBJh|>qfE30Dj@R*Jz zAaz&Art}bGD-x?hIKF(24YLJk#ODGDwt2?x4-E&ktgPrbO`cEjw zTeotBH@K8`i0%dU3tkSF<=48Fb^|%ycygR`l3Kd~DunZ-!Fl31W=>&rT8}I7Ixn~( zm+AX;Axa-vnw+)Kws_sa9(~zT&OzW#djYS`u9d##SY&P(e-uuC7|$_(*uE#1f&yp| zW{>yY6Q@(iGTUKp@%oE6?@_85R=r_#{1E4(%;~-l+6RI5JajJ0(N3NHI6X;?lk?Ud zeU1UDMIA{g(Moi2zt4%vvj$-?m0&hQUT0PW}MNv{k!aem)P?1o$(|*uz&sR{C;cV_6 z9mK~|l5@OfZacH8Cc*i@>%Y9TJ16SwtC)(`i7yu1-r^nN(%0`MvcQbSp5cdsV2;-w zsia#L+_NVpA0!G$YP}k#>uxuU_o~5r<#_zqqSz@{RdnoD7 z(00t&rLXYYvvj+H{y3cDt5eA>7pnm82JV}^=ejHGj?S(w*7n5gcQ1h#HkHKYTWYe| z+3!QO%l^`*FL5&bchdmwVNWKtfnDY#UtYTek;?MMYTWJwa=iBN)JQkPhxeoZD< ztMde=rOxZ7pP+LNEK36(@=ce zIF6CGVu$_t7LNT|Y7c*x8cO%o%fVjfqOsbfIj$y|*uBUEwP6=fENHfZG_RIOfjr+{ z%JS-OEU3FJg)L@Q_~>}bxxrj2+d*C>@%44WQzF4C)qj(xx7p>Z`!#R9n75pZEu6Ov z&RfSR=BSU`pcI~rQw7y3Z|gkp9{>OV|No8B-3o#*7zW@46_P*M9qa;j0Uf4xSk^%h z>ujLOaBiYTx8J4<UUdXt za_9dO04JCn$=k9b_?)^rKl`XoFj)|Mr_Oygz%iM!nm0@{337I}z%iMYLa28w`BT55 z{5CrKKaK|+lj+N}Ngf}^~=l4^$LnJ^-A)K^7Bga^-@zx_3P4r2IzzB2LN4(BI Date: Fri, 20 Mar 2009 17:20:01 -0700 Subject: [PATCH 02/36] Added gitignore for matlab temp files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d0ab673 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*~ +*.asv + From e4b5da8cedd609831558ddd0ea186e4b635c57cb Mon Sep 17 00:00:00 2001 From: David Date: Fri, 20 Mar 2009 17:20:57 -0700 Subject: [PATCH 03/36] Wrapped sparse_to_csr in a handy convert_sparse function for easily getting the necessary structure.: --- convert_sparse.m | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 convert_sparse.m diff --git a/convert_sparse.m b/convert_sparse.m new file mode 100644 index 0000000..820d295 --- /dev/null +++ b/convert_sparse.m @@ -0,0 +1,16 @@ +function As = convert_sparse(A) +% CONVERT_SPARSE Convert a sparse matrix to the native gaimc representation +% +% As = convert_sparse(A) returns a struct with the three arrays defining +% the compressed sparse row structure of A. +% +% Example: +% load('graphs/all_shortest_paths_example') +% As = convert_sparse(A) +% +% See also SPARSE_TO_CSR SPARSE + +[rp ci ai] = sparse_to_csr(A); +As.rp = rp; +As.ci = ci; +As.ai = ai; \ No newline at end of file From 7b94546bc2daba54d8b15109af5fecc4b67d09f1 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 20 Mar 2009 17:21:47 -0700 Subject: [PATCH 04/36] Put in graph_draw to help draw graphs with richer node and edge labels. --- graph_draw.m | 554 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 554 insertions(+) create mode 100644 graph_draw.m diff --git a/graph_draw.m b/graph_draw.m new file mode 100644 index 0000000..5254505 --- /dev/null +++ b/graph_draw.m @@ -0,0 +1,554 @@ +function h = graph_draw(adj, xy, varargin) +% [x, y, h] = graph_draw(adj, varargin) +% +% INPUTS: ADJ - Adjacency matrix (source, sink) +% 'linestyle' - default '-' +% 'linewidth' - default .5 +% 'linecolor' - default Black +% 'fontsize' - fontsize for labels, default 8 +% 'labels' - Cell array containing labels +% 'shapes' - 1 if node is a box, 0 if oval +% +% OUTPUT: h - Object handles [h(i,1) is the text handle - color +% h(i,2) is the circle handle - facecolor] +% NOTES: +% Shades nodes linked to self ! + +% 2009-02-26 interface modified by David Gleich +% to remove automatic layout +% 24 Feb 2004 cleaned up, optimized and corrected by Leon Peshkin pesha @ ai.mit.edu +% Apr-2000 draw_graph Ali Taylan Cemgil +% 1995-1997 arrow Erik A. Johnson + +linestyle = '-'; % -- -. +linewidth = .5; % 2 +linecolor = 'Black'; % Red +fontsize = 8; +N = size(adj,1); +color = ones(N, 3); % colors of elipses around text +labels = cellstr(int2str((1:N)')); % labels = cellstr(char(zeros(N,1)+double('+'))); +node_t = zeros(N,1); % +for i = 1:2:length(varargin) % get optional args + switch varargin{i} + case 'linestyle', linestyle = varargin{i+1}; + case 'linewidth', linewidth = varargin{i+1}; + case 'linecolor', linecolor = varargin{i+1}; + case 'labels', labels = varargin{i+1}; + case 'fontsize', fontsize = varargin{i+1}; + case 'shapes', node_t = varargin{i+1}; node_t = node_t(:); + end +end + +x = xy(:,1); +x = x - min(x); +y = xy(:,2); +y = y - min(y); +% scale the graph so it's between 0 and 1 +xrange = max(x); +yrange = max(y); +scalefactor = max(xrange,yrange); +x = x/scalefactor; +y = y/scalefactor; + +lp_ndx = find(diag(adj)); % recover from self-loops = diagonal ones +color(lp_ndx,:) = repmat([.8 .8 .8],length(lp_ndx),1); % makes self-looped nodes blue +adj = adj - diag(diag(adj)); % clean up the diagonal + +axis([-0.1 1.1 -0.1 1.1]); +axis off; +set(gcf,'Color',[1 1 1]); +set(gca,'XTick',[], 'YTick',[], 'box','on'); % axis('square'); %colormap(flipud(gray)); + +idx1 = find(node_t == 0); wd1 = []; % Draw nodes +if ~isempty(idx1), + [h1 wd1] = textoval(x(idx1), y(idx1), labels(idx1), fontsize, color); +end; + +idx2 = find(node_t ~= 0); wd2 = []; +if ~isempty(idx2), + [h2 wd2] = textbox(x(idx2), y(idx2), labels(idx2), color); +end; + +wd = zeros(size(wd1,1) + size(wd2,1),2); +if ~isempty(idx1), wd(idx1, :) = wd1; end; +if ~isempty(idx2), wd(idx2, :) = wd2; end; + +for node = 1:N % Draw edges + edges = find(adj(node,:) == 1); + for node2 = edges + sign = 1; + if ((x(node2) - x(node)) == 0) + if (y(node) > y(node2)), alpha = -pi/2; else alpha = pi/2; end; + else + alpha = atan((y(node2)-y(node))/(x(node2)-x(node))); + if (x(node2) <= x(node)), sign = -1; end; + end; + dy1 = sign.*wd(node,2).*sin(alpha); dx1 = sign.*wd(node,1).*cos(alpha); + dy2 = sign.*wd(node2,2).*sin(alpha); dx2 = sign.*wd(node2,1).*cos(alpha); + if (adj(node2,node) == 0) % if directed edge + my_arrow([x(node)+dx1 y(node)+dy1], [x(node2)-dx2 y(node2)-dy2]); + else + line([x(node)+dx1 x(node2)-dx2], [y(node)+dy1 y(node2)-dy2], ... + 'Color', linecolor, 'LineStyle', linestyle, 'LineWidth', linewidth); + adj(node2,node) = -1; % Prevent drawing lines twice + end; + end; +end; + +if nargout > 2 + h = zeros(length(wd),2); + if ~isempty(idx1), h(idx1,:) = h1; end; + if ~isempty(idx2), h(idx2,:) = h2; end; +end; + +function [t, wd] = textoval(x, y, str, fontsize, c) +% [t, wd] = textoval(x, y, str, fontsize) Draws an oval around text objects +% INPUT: x, y - Coordinates +% str - Strings +% c - colors +% OUTPUT: t - Object Handles +% width - x and y width of ovals +temp = []; +if ~isa(str,'cell'), str = cellstr(str); end; +N = length(str); +wd = zeros(N,2); +for i = 1:N, + tx = text(x(i),y(i),str{i},'HorizontalAlignment','center','VerticalAlign','middle','FontSize', fontsize); + sz = get(tx, 'Extent'); + wy = sz(4); + wx = max(2/3*sz(3), wy); + wx = 0.9 * wx; % might want to play with this .9 and .5 coefficients + wy = 0.5 * wy; + ptc = ellipse(x(i), y(i), wx, wy, c(i,:)); + set(ptc, 'FaceColor', c(i,:)); % 'w' + wd(i,:) = [wx wy]; + delete(tx); + tx = text(x(i),y(i),str{i},'HorizontalAlignment','center','VerticalAlign','middle', 'FontSize', fontsize); + temp = [temp; tx ptc]; +end; +t = temp; + +function [p] = ellipse(x, y, rx, ry, c) +% [p] = ellipse(x, y, rx, ry) Draws Ellipse shaped patch objects +% INPUT: x,y - N x 1 vectors of x and y coordinates +% Rx, Ry - Radii +% C - colors +% OUTPUT: p - Handles of Ellipse shaped path objects + + if length(rx)== 1, rx = ones(size(x)).*rx; end; + if length(ry)== 1, ry = ones(size(x)).*ry; end; +N = length(x); +p = zeros(size(x)); +t = 0:pi/30:2*pi; +for i = 1:N + px = rx(i) * cos(t) + x(i); py = ry(i) * sin(t) + y(i); + p(i) = patch(px, py, c(i,:)); +end; + +function [h, wd] = textbox(x,y,str,c) +% [h, wd] = textbox(x,y,str) draws a box around the text +% INPUT: x, y - Coordinates +% str - Strings +% OUTPUT: h - Object Handles +% wd - x and y Width of boxes + +h = []; +if ~isa(str,'cell') str=cellstr(str); end; +N = length(str); +for i = 1:N, + tx = text(x(i),y(i),str{i},'HorizontalAlignment','center','VerticalAlign','middle'); + sz = get(tx, 'Extent'); + wy = 2/3 * sz(4); wyB = y(i) - wy; wyT = y(i) + wy; + wx = max(2/3 * sz(3), wy); wxL = x(i) - wx; wxR = x(i) + wx; + ptc = patch([wxL wxR wxR wxL], [wyT wyT wyB wyB], c(i,:)); + set(ptc, 'FaceColor', c(i,:)); % 'w' + wd(i,:) = [wx wy]; + delete(tx); + tx = text(x(i),y(i),str{i},'HorizontalAlignment','center','VerticalAlign','middle'); + h = [h; tx ptc]; +end; + +function [h,yy,zz] = my_arrow(varargin) +% [h,yy,zz] = my_arrow(varargin) Draw a line with an arrowhead. + +% A lot of the original code is removed and most of the remaining can probably go too +% since it comes from a general use function only being called inone context. - Leon Peshkin +% Copyright 1997, Erik A. Johnson , 8/14/97 + +ax = []; % set values to empty matrices +deflen = 12; % 16 +defbaseangle = 45; % 90 +deftipangle = 16; +defwid = 0; defpage = 0; defends = 1; +ArrowTag = 'Arrow'; % The 'Tag' we'll put on our arrows +start = varargin{1}; % fill empty arguments +stop = varargin{2}; +crossdir = [NaN NaN NaN]; +len = NaN; baseangle = NaN; tipangle = NaN; wid = NaN; +page = 0; ends = NaN; +start = [start NaN]; stop = [stop NaN]; +o = 1; % expand single-column arguments +ax = gca; +% set up the UserData data (here so not corrupted by log10's and such) +ud = [start stop len baseangle tipangle wid page crossdir ends]; +% Get axes limits, range, min; correct for aspect ratio and log scale +axm = zeros(3,1); axr = axm; axrev = axm; ap = zeros(2,1); +xyzlog = axm; limmin = ap; limrange = ap; oldaxlims = zeros(1,7); +oneax = 1; % all(ax==ax(1)); LPM +if (oneax), + T = zeros(4,4); invT = zeros(4,4); +else + T = zeros(16,1); invT = zeros(16,1); end +axnotdone = 1; % logical(ones(size(ax))); LPM +while (any(axnotdone)), + ii = 1; % LPM min(find(axnotdone)); + curax = ax(ii); + curpage = page(ii); + % get axes limits and aspect ratio + axl = [get(curax,'XLim'); get(curax,'YLim'); get(curax,'ZLim')]; + oldaxlims(min(find(oldaxlims(:,1)==0)),:) = [curax reshape(axl',1,6)]; + % get axes size in pixels (points) + u = get(curax,'Units'); + axposoldunits = get(curax,'Position'); + really_curpage = curpage & strcmp(u,'normalized'); + if (really_curpage), + curfig = get(curax,'Parent'); pu = get(curfig,'PaperUnits'); + set(curfig,'PaperUnits','points'); pp = get(curfig,'PaperPosition'); + set(curfig,'PaperUnits',pu); set(curax,'Units','pixels'); + curapscreen = get(curax,'Position'); set(curax,'Units','normalized'); + curap = pp.*get(curax,'Position'); + else, + set(curax,'Units','pixels'); + curapscreen = get(curax,'Position'); + curap = curapscreen; + end; + set(curax,'Units',u); set(curax,'Position',axposoldunits); + % handle non-stretched axes position + str_stretch = {'DataAspectRatioMode'; 'PlotBoxAspectRatioMode' ; 'CameraViewAngleMode' }; + str_camera = {'CameraPositionMode' ; 'CameraTargetMode' ; ... + 'CameraViewAngleMode' ; 'CameraUpVectorMode'}; + notstretched = strcmp(get(curax,str_stretch),'manual'); + manualcamera = strcmp(get(curax,str_camera),'manual'); + if ~arrow_WarpToFill(notstretched,manualcamera,curax), + % find the true pixel size of the actual axes + texttmp = text(axl(1,[1 2 2 1 1 2 2 1]), ... + axl(2,[1 1 2 2 1 1 2 2]), axl(3,[1 1 1 1 2 2 2 2]),''); + set(texttmp,'Units','points'); + textpos = get(texttmp,'Position'); + delete(texttmp); + textpos = cat(1,textpos{:}); + textpos = max(textpos(:,1:2)) - min(textpos(:,1:2)); + % adjust the axes position + if (really_curpage), % adjust to printed size + textpos = textpos * min(curap(3:4)./textpos); + curap = [curap(1:2)+(curap(3:4)-textpos)/2 textpos]; + else, % adjust for pixel roundoff + textpos = textpos * min(curapscreen(3:4)./textpos); + curap = [curap(1:2)+(curap(3:4)-textpos)/2 textpos]; + end; + end; + % adjust limits for log scale on axes + curxyzlog = [strcmp(get(curax,'XScale'),'log'); ... + strcmp(get(curax,'YScale'),'log'); strcmp(get(curax,'ZScale'),'log')]; + if (any(curxyzlog)), + ii = find([curxyzlog;curxyzlog]); + if (any(axl(ii)<=0)), + error([upper(mfilename) ' does not support non-positive limits on log-scaled axes.']); + else, + axl(ii) = log10(axl(ii)); + end; + end; + % correct for 'reverse' direction on axes; + curreverse = [strcmp(get(curax,'XDir'),'reverse'); ... + strcmp(get(curax,'YDir'),'reverse'); strcmp(get(curax,'ZDir'),'reverse')]; + ii = find(curreverse); + if ~isempty(ii), + axl(ii,[1 2])=-axl(ii,[2 1]); + end; + % compute the range of 2-D values + curT = get(curax,'Xform'); + lim = curT*[0 1 0 1 0 1 0 1;0 0 1 1 0 0 1 1;0 0 0 0 1 1 1 1;1 1 1 1 1 1 1 1]; + lim = lim(1:2,:)./([1;1]*lim(4,:)); + curlimmin = min(lim')'; + curlimrange = max(lim')' - curlimmin; + curinvT = inv(curT); + if (~oneax), + curT = curT.'; curinvT = curinvT.'; curT = curT(:); curinvT = curinvT(:); + end; + % check which arrows to which cur corresponds + ii = find((ax==curax)&(page==curpage)); + oo = ones(1,length(ii)); axr(:,ii) = diff(axl')' * oo; + axm(:,ii) = axl(:,1) * oo; axrev(:,ii) = curreverse * oo; + ap(:,ii) = curap(3:4)' * oo; xyzlog(:,ii) = curxyzlog * oo; + limmin(:,ii) = curlimmin * oo; limrange(:,ii) = curlimrange * oo; + if (oneax), + T = curT; invT = curinvT; + else, + T(:,ii) = curT * oo; invT(:,ii) = curinvT * oo; + end; + axnotdone(ii) = zeros(1,length(ii)); +end; +oldaxlims(oldaxlims(:,1)==0,:) = []; + +% correct for log scales +curxyzlog = xyzlog.'; ii = find(curxyzlog(:)); +if ~isempty(ii), + start(ii) = real(log10(start(ii))); stop(ii) = real(log10(stop(ii))); + if (all(imag(crossdir)==0)), % pulled (ii) subscript on crossdir, 12/5/96 eaj + crossdir(ii) = real(log10(crossdir(ii))); + end; +end; +ii = find(axrev.'); % correct for reverse directions +if ~isempty(ii), + start(ii) = -start(ii); stop(ii) = -stop(ii); crossdir(ii) = -crossdir(ii); +end; +start = start.'; stop = stop.'; % transpose start/stop values +% take care of defaults, page was done above +ii = find(isnan(start(:))); if ~isempty(ii), start(ii) = axm(ii)+axr(ii)/2; end; +ii = find(isnan(stop(:))); if ~isempty(ii), stop(ii) = axm(ii)+axr(ii)/2; end; +ii = find(isnan(crossdir(:))); if ~isempty(ii), crossdir(ii) = zeros(length(ii),1); end; +ii = find(isnan(len)); if ~isempty(ii), len(ii) = ones(length(ii),1)*deflen; end; +baseangle(ii) = ones(length(ii),1)*defbaseangle; tipangle(ii) = ones(length(ii),1)*deftipangle; +wid(ii) = ones(length(ii),1) * defwid; ends(ii) = ones(length(ii),1) * defends; +% transpose rest of values +len = len.'; baseangle = baseangle.'; tipangle = tipangle.'; wid = wid.'; +page = page.'; crossdir = crossdir.'; ends = ends.'; ax = ax.'; + +% for all points with start==stop, start=stop-(verysmallvalue)*(up-direction); +ii = find(all(start==stop)); +if ~isempty(ii), + % find an arrowdir vertical on screen and perpendicular to viewer + % transform to 2-D + tmp1 = [(stop(:,ii)-axm(:,ii))./axr(:,ii);ones(1,length(ii))]; + if (oneax), twoD=T*tmp1; + else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T(:,ii).*tmp1; + tmp2=zeros(4,4*length(ii)); tmp2(:)=tmp1(:); + twoD=zeros(4,length(ii)); twoD(:)=sum(tmp2)'; end; + twoD=twoD./(ones(4,1)*twoD(4,:)); + % move the start point down just slightly + tmp1 = twoD + [0;-1/1000;0;0]*(limrange(2,ii)./ap(2,ii)); + % transform back to 3-D + if (oneax), threeD=invT*tmp1; + else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT(:,ii).*tmp1; + tmp2=zeros(4,4*length(ii)); tmp2(:)=tmp1(:); + threeD=zeros(4,length(ii)); threeD(:)=sum(tmp2)'; end; + start(:,ii) = (threeD(1:3,:)./(ones(3,1)*threeD(4,:))).*axr(:,ii)+axm(:,ii); +end; +% compute along-arrow points +% transform Start points + tmp1 = [(start-axm)./axr; 1]; + if (oneax), X0=T*tmp1; + else, tmp1 = [tmp1;tmp1;tmp1;tmp1]; tmp1=T.*tmp1; + tmp2 = zeros(4,4); tmp2(:)=tmp1(:); + X0=zeros(4,1); X0(:)=sum(tmp2)'; end; + X0=X0./(ones(4,1)*X0(4,:)); +% transform Stop points + tmp1=[(stop-axm)./axr; 1]; + if (oneax), Xf=T*tmp1; + else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T.*tmp1; + tmp2=zeros(4,4); tmp2(:)=tmp1(:); + Xf=zeros(4,1); Xf(:)=sum(tmp2)'; end; + Xf=Xf./(ones(4,1)*Xf(4,:)); +% compute pixel distance between points + D = sqrt(sum(((Xf(1:2,:)-X0(1:2,:)).*(ap./limrange)).^2)); +% compute and modify along-arrow distances + len1 = len; + len2 = len - (len.*tan(tipangle/180*pi)-wid/2).*tan((90-baseangle)/180*pi); + slen0 = 0; slen1 = len1 .* ((ends==2)|(ends==3)); + slen2 = len2 .* ((ends==2)|(ends==3)); + len0 = 0; len1 = len1 .* ((ends==1)|(ends==3)); + len2 = len2 .* ((ends==1)|(ends==3)); + ii = find((ends==1)&(D Date: Fri, 20 Mar 2009 17:22:24 -0700 Subject: [PATCH 05/36] Fixed typo in see also for sparse_to_csr --- sparse_to_csr.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sparse_to_csr.m b/sparse_to_csr.m index d5cc6e4..c4703eb 100644 --- a/sparse_to_csr.m +++ b/sparse_to_csr.m @@ -12,7 +12,7 @@ % A=sparse(6,6); A(1,1)=5; A(1,5)=2; A(2,3)=-1; A(4,1)=1; A(5,6)=1; % [rp ci ai]=sparse_to_csr(A) % -% See also SPARSE_TO_CSC +% See also SPARSE % David Gleich % Copyright, Stanford University, 2008 From 1253fb8f297cc13278b72427749dcb7bad3b2888 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 20 Mar 2009 17:36:39 -0700 Subject: [PATCH 06/36] Start of script to test examples. --- test/test_examples.m | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 test/test_examples.m diff --git a/test/test_examples.m b/test/test_examples.m new file mode 100644 index 0000000..67534cb --- /dev/null +++ b/test/test_examples.m @@ -0,0 +1,8 @@ + +% scomponents +load('graphs/cores_example'); % the graph A has three components +ci = scomponents(A) +max(ci) % should be 3 +R = sparse(1:size(A,1),ci,1,size(A,1),ncomp); % create a restriction matrix +CG = R'*A*R; % create the graph with each component + % collapsed into a single node. From a4479512211ef81fe364c37821af526c5b2ed085 Mon Sep 17 00:00:00 2001 From: David Date: Sun, 29 Mar 2009 15:50:29 -0700 Subject: [PATCH 07/36] Fixed documentation --- graph_draw.m | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/graph_draw.m b/graph_draw.m index 5254505..3d95c4a 100644 --- a/graph_draw.m +++ b/graph_draw.m @@ -1,18 +1,31 @@ function h = graph_draw(adj, xy, varargin) -% [x, y, h] = graph_draw(adj, varargin) +% GRAPH_DRAW Draw a picture of a graph when the coordinates are known % -% INPUTS: ADJ - Adjacency matrix (source, sink) +% graph_draw(A, xy) draws a picture of graph A where node i is placed +% at x = xy(i,1), y = xy(i,2). In the drawing, shaded nodes have +% self loops. +% +% Some of the parameters of the drawing are controlled by specifying +% optional parameters in the call graph_draw(A, xy, key, value). The keys +% and default values are % 'linestyle' - default '-' % 'linewidth' - default .5 % 'linecolor' - default Black % 'fontsize' - fontsize for labels, default 8 % 'labels' - Cell array containing labels % 'shapes' - 1 if node is a box, 0 if oval +% +% h = graph_draw(A,xy,...) returns a handle for each object. h(i,1) is +% the text handle for vertex i, and h(i,2) is the circle handle for +% vertex i. +% +% Originally written by Erik A. Johnson, Ali Taylan Cemgil, and Leon Peskin +% Modified by David F. Gleich for gaimc package. % -% OUTPUT: h - Object handles [h(i,1) is the text handle - color -% h(i,2) is the circle handle - facecolor] -% NOTES: -% Shades nodes linked to self ! +% See also GPLOT +% +% Example: + % 2009-02-26 interface modified by David Gleich % to remove automatic layout From dbb47b7c201bdc9f79aae64791a2f834bcc6ee7b Mon Sep 17 00:00:00 2001 From: David Date: Sun, 29 Mar 2009 15:50:39 -0700 Subject: [PATCH 08/36] Added example code --- dfs.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/dfs.m b/dfs.m index dc5e258..65c1870 100644 --- a/dfs.m +++ b/dfs.m @@ -19,6 +19,8 @@ % yet. % % Example: +% load('graphs/dfs_example.mat') % use the dfs example from Boost +% d = dfs(A,1) % % See also BFS From ed3fc67f8939d9b42e2847a3d886b371bed32a02 Mon Sep 17 00:00:00 2001 From: David Date: Sun, 29 Mar 2009 15:51:28 -0700 Subject: [PATCH 09/36] Added xy coordinates to graphs --- I hope, this may just have been a slightly different mat file format --- graphs/bfs_example.mat | Bin 324 -> 378 bytes graphs/dfs_example.mat | Bin 324 -> 380 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/graphs/bfs_example.mat b/graphs/bfs_example.mat index c3ef97c5640e242edf03e6b32ff4db12c155d02f..7ee9b0bff09eadea61fce570e4ac34bd055ca719 100644 GIT binary patch delta 116 zcmX@Y^owbNyso>CUxcHXiH?GEQEFmIYKlUBo|QsyVu^xVYLbGHg@Tchm9d$XiJ^j# zfq~`3K<$YMtP^WanDH|(Fz5ks#hk~<2?+%ZNoESq8ZIdu;Ck9@AS__abh68fBbs4J T!^BR>7Rg42BdiQoqKp#&@T(&$ delta 59 zcmeyxbcAVwymo+dxTl|vf^$)7Vo7R>LVli=f^UAFf@49Ef{}@Wfq|8Qsg_4ZaN@SVRRryWnv&QI3O}HIyE&q zGcq7DFfcihQ7e&P1(AGd0a=meI9}oaNWTV>c_6cxq2{qe-NFUL+(66=u@ PMn)zkW{5rjNgV;4e~~yn delta 103 zcmV-t0GR*$0>lE4A1hEpS4mDRAVYFxVRU6=Aa8CuAWd&>AVF|)ATl%{FfckaFgh_a zATls8Hjz;)kzfard}#q&k>)riWbnZrI}OpVfn*-YEM};A>`=FG0Wmia^FsL<1kI%$ J4FE@~6)4W Date: Sun, 29 Mar 2009 15:51:55 -0700 Subject: [PATCH 10/36] Added documentation --- scomponents.m | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/scomponents.m b/scomponents.m index 92be09b..e3f9a68 100644 --- a/scomponents.m +++ b/scomponents.m @@ -1,14 +1,27 @@ function [sci sizes] = scomponents(A) % SCOMPONENTS Compute the strongly connected components of a graph % -% ci=scomponents(A) returns the +% ci=scomponents(A) returns an index for the component number of every +% vertex in the graph A. The total number of components is max(ci). +% If the input is undirected, then this algorithm outputs just the +% connected components. Otherwise, it output the strongly connected +% components. +% +% % % The implement is from Tarjan's 1972 paper: Depth-first search and linear % graph algorithms. In SIAM's Journal of Computing, 1972, 1, pp.146-160. % -% Example: -% % See also DMPERM +% +% Example: +% load('graphs/cores_example'); % the graph A has three components +% ci = scomponents(A) +% ncomp = max(ci) % should be 3 +% R = sparse(1:size(A,1),ci,1,size(A,1),ncomp); % create a restriction matrix +% CG = R'*A*R; % create the graph with each component +% % collapsed into a single node. + % David Gleich % Copyright, Stanford University, 2008 From 48293fc44c1aab24850a6e8c4f2bc87659863e0f Mon Sep 17 00:00:00 2001 From: David Date: Sun, 29 Mar 2009 15:52:14 -0700 Subject: [PATCH 11/36] Updated contents file --- Contents.m | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/Contents.m b/Contents.m index 145ade2..c7f529d 100644 --- a/Contents.m +++ b/Contents.m @@ -2,7 +2,7 @@ % Graph Algorithms in Matlab Code (gaimc) % Written by David Gleich % Version 1.0 (beta) -% 2008-04-21 +% 2008-2009 %========================================= % % Search algorithms @@ -23,11 +23,20 @@ % dirclustercoeffs - Compute directed clustering coefficients % corenums - Compute core numbers % +% Drawing +% graph_draw - Draw an adjacency matrix (from Leon Peshkin) +% % Helper functions % sparse_to_csr - Compressed sparse row arrays from a matrix % David Gleich -% Copyright, Stanford University, 2008 +% Copyright, Stanford University, 2008-2009 % History % 2008-04-10: Initial version + + +% TODO for release +% Write demo code +% Fix mlintrpt errors +% Update copyright info \ No newline at end of file From 55058361490bf49ae5d7258225968b31e9472816 Mon Sep 17 00:00:00 2001 From: David Date: Sun, 29 Mar 2009 15:52:35 -0700 Subject: [PATCH 12/36] Unfinished version of the demo file --- demo/demo.m | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 demo/demo.m diff --git a/demo/demo.m b/demo/demo.m new file mode 100644 index 0000000..3230176 --- /dev/null +++ b/demo/demo.m @@ -0,0 +1,148 @@ +%% Demo of gaimc - Graph Algorithms in Matlab code` +% Matlab includes great algorithms to work with sparse matrices but does +% provide a reasonable set of algorithms to work with sparse matrices as +% graph data structures. My other project -- MatlabBGL -- provides a +% high-performance solution to this problem by directly interfacing the +% Matlab sparse matrix data structure with the Boost Graph Library. +% That library, however, suffers from enormous complication because +% it must be compiled for each platform. The Boost Graph Library +% heavily uses advanced C++ features that impair easy portability +% between platforms. In contrast, the gaimc library is implemented in +% pure Matlab code, making it completely portable. +% +% The cost of the portability for this library is a 2-4x slowdown in +% the runtime of the algorithms as well as significantly fewer +% algorithms to choose from. + +%% Sparse matrices as graphs +% To store the connectivity structure of the graph, gaimc uses the +% adjacency matrix of a graph. + + +%% Search algorithms +% The two standard graph search algorithms are depth first search and +% breadth first search. This library implements both. + +%% +% Load the example matrix from the Boost Graph Library +load('graphs/dfs_example'); +figure(1); graph_draw(A,xy,'labels',labels); + +%% +% Run a depth first search. The output records the distance to the other +% vertices, except where the vertices are not reachable starting from the +% first node A. +d=dfs(A,1) + +%% +% From this example, we see that vertices a-f are reachable from vertex a, +% but that verice g-i are not reachable. Given the of the edges, this +% makes sense. + +%% +% Let's look at breadth first search too, using a different example. +load('graphs/bfs_example'); +figure(1); clf; graph_draw(A,xy,'labels',labels); + +%% +% The breadth first search algorithm records the distance from the starting +% vertex to each vertex it visits in breadth first order. This means it +% visits all the vertices in order of their distance from the starting +% vertex. The d output records the distance, and the dt output records the +% step of the algorithm when the breadth first search saw the node. +[d dt] = bfs(A,2); +% draw the graph where the label is the "discovery time" of the vertex. +figure(1); clf; graph_draw(A,xy,'labels',num2str(dt)); + +%% +% Notice how the algorithm visits all vertices one edge away from the start +% vertex (0) before visiting those two edges away. + +%% Shortest paths +% In the previous two examples, the distance between vertices was +% equivalent to the number of edges. Some graphs, however, have specific +% weights, such as the graph of flights between airports. + +%% Minimum spanning trees +% A minimum spanning tree is a set of edges from a graph that ... + +%% Connected components + +%% Statistics +% Graph statistics are just measures that indicate a property of the graph +% at every vertex, or at every edges. Arguably the simplest graph +% statistic would be the average vertex degree. Because such statistics +% are easy to compute with the adjaceny matrix in Matlab, they do not have +% special functions in gaimc. + +%% +% Load a road network to use for statistical computations +load('graphs/minnesota'); +gplot(A,xy); + +%% +% Average vertex degree +d = sum(A,2); +mean(d) +%% +% So the average number of roads at any intersection is 2.5. My guess is +% that many roads have artificial intersections in the graph structure that +% do not correspond to real intersections. Try validating that hypothesis +% using the library! + +%% +% Average clustering coefficients +ccfs = clustercoeffs(A); +mean(ccfs) +% The average clustering coefficient is a measure of the edge density +% throughout the graph. A small value indicates that the network has few +% edges and they are well distributed throughout the graph. + +%% +% Average core numbers +cn = corenums(A); +mean(cn) + + + +%% Efficient repetition +% Every time a gaimc function runs, it converts the adjacency matrix into a +% set of compressed sparse row arrays. These arrays yield efficient access +% to the edges of the graph starting at a particular vertex. For many +% function calls on the same graph, this conversion process slows the +% algorithms. Hence, gaimc also accepts pre-converted input, in which case +% it skips it's conversion. +% +% Let's demonstrate how this works by calling Dijkstra's algorithm to +% compute the shortest paths between all vertices in the graph. The +% Floyd Warshall algorithm computes these same quantities more efficiently, +% but that would just be one more algorithm to implement and maintain. + +%% +% Load and convert the graph. +load ('graphs/all_shortest_paths_example'); +A = spfun(@(x) x-min(min(A))+1,A); % remove the negative edges +As = convert_sparse(A); +%% +% Now, we'll run Dijkstra's algorithm for every vertex and save the result +% On my 2GHz laptop, this takes 0.000485 seconds. +n = size(A,1); +D = zeros(n,n); +tic +for i=1:n + D(i,:) = dijkstra(As,i); +end +toc +%% +% Let's try it without the conversion to see if we can notice the +% difference in speed. +% On my 2GHz laptop, this takes 0.001392 seconds. +D2 = zeros(n,n); +tic +for i=1:n + D2(i,:) = dijkstra(A,i); +end +toc +%% +% And just to check, let's make sure the output is the same. +isequal(D,D2) \ No newline at end of file From 42023d0a65682f69edaf9afa02ce270b107fe3c9 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 29 Apr 2009 22:47:09 -0700 Subject: [PATCH 13/36] Updated contents todo --- Contents.m | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Contents.m b/Contents.m index c7f529d..5b5ec5e 100644 --- a/Contents.m +++ b/Contents.m @@ -39,4 +39,11 @@ % TODO for release % Write demo code % Fix mlintrpt errors -% Update copyright info \ No newline at end of file +% Update copyright info +% Examples for mst_prim, dijkstra, dirclustercoeffs, dfs +% Documentation for Dijkstra, dirclustercoeffs +% Implement bipartite matching + +% Future todos +% Implement weighted core nums +% More testing From 46975c2a0e039a1fdaeeb35e09121368120144d4 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 29 Apr 2009 22:47:44 -0700 Subject: [PATCH 14/36] Added load_gaimc_graph code --- Contents.m | 1 + load_gaimc_graph.m | 35 +++++++++++++++++++++++++++++++++++ test/test_examples.m | 7 +++++++ test/test_load_gaimc_graph.m | 31 +++++++++++++++++++++++++++++++ test/test_main.m | 4 ++++ 5 files changed, 78 insertions(+) create mode 100644 load_gaimc_graph.m create mode 100644 test/test_load_gaimc_graph.m diff --git a/Contents.m b/Contents.m index 5b5ec5e..2332e22 100644 --- a/Contents.m +++ b/Contents.m @@ -28,6 +28,7 @@ % % Helper functions % sparse_to_csr - Compressed sparse row arrays from a matrix +% load_gaimc_graph - Loads a sample graph from the library % David Gleich % Copyright, Stanford University, 2008-2009 diff --git a/load_gaimc_graph.m b/load_gaimc_graph.m new file mode 100644 index 0000000..82430a0 --- /dev/null +++ b/load_gaimc_graph.m @@ -0,0 +1,35 @@ +function varargout=load_gaimc_graph(graphname) +% LOAD_GAIMC_GRAPH Loads a graph from the gaimc library +% +% load_gaimc_graph is a helper function to load a graph provided with the +% library regardless of the current working directory. +% +% If it's called without any output arguments, it functions just like a +% load command executed on the .mat file with the graph. If it's called +% with an output arguemnt, it functions just like a load command with +% output arguments. It's somewhat complicated to explain because this is +% just a convinence function to make the examples work for any path, and +% not just from the gaimc root directory. +% +% Example: +% % equivalent to load('graphs/airports.mat') run from the gaimc directory +% load_gaimc_graph('airports') +% % equivalent to P=load('graphs/kt-7-2.mat') run from the gaimc directory +% P=load_gaimc_graph('kt-7-2.mat') +% % so you don't have to put the path in for examples! + +% David Gleich +% Copyright, Stanford University, 2009 + +% History +% 2009-04-27: Initial coding + + +path=fileparts(mfilename('fullpath')); +if nargout==0 + evalin('caller',['load(''' fullfile(path,'graphs',graphname) ''');']); +else + P = load(fullfile(path,'graphs',graphname)); + varargout{1} = P; +end + \ No newline at end of file diff --git a/test/test_examples.m b/test/test_examples.m index 67534cb..5ffe75b 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -6,3 +6,10 @@ R = sparse(1:size(A,1),ci,1,size(A,1),ncomp); % create a restriction matrix CG = R'*A*R; % create the graph with each component % collapsed into a single node. + + +% equivalent to load('graphs/airports.mat') run from the gaimc directory +load_gaimc_graph('airports') +% equivalent to P=load('graphs/kt-7-2.mat') run from the gaimc directory +P=load_gaimc_graph('kt-7-2.mat') +% so you don't have to put the path in for examples! \ No newline at end of file diff --git a/test/test_load_gaimc_graph.m b/test/test_load_gaimc_graph.m new file mode 100644 index 0000000..18b2a67 --- /dev/null +++ b/test/test_load_gaimc_graph.m @@ -0,0 +1,31 @@ +function test_gaimc_graph + +%% +P1=load('../graphs/kt-7-2.mat'); +P2=gaimc_graph('kt-7-2.mat'); +if ~isequal(P1,P2) + error('gaimc_graph failed on kt-7-2.mat'); +else + fprintf('gaimc_graph passed load test on kt-7-2.mat\n'); +end + +%% +P1=load('../graphs/kt-7-2'); +P2=gaimc_graph('kt-7-2'); +if ~isequal(P1,P2) + error('gaimc_graph failed on kt-7-2'); +else + fprintf('gaimc_graph passed load test on kt-7-2\n'); +end + +%% +load('../graphs/clr-24-1'); +P1 = struct('A',A,'labels',labels,'xy',xy); +gaimc_graph('clr-24-1'); +P2 = struct('A',A,'labels',labels,'xy',xy); + +if ~isequal(P1,P2) + error('gaimc_graph failed on clr-24-1'); +else + fprintf('gaimc_graph passed load test on clr-24-1\n'); +end \ No newline at end of file diff --git a/test/test_main.m b/test/test_main.m index 729c2a2..ae807c2 100644 --- a/test/test_main.m +++ b/test/test_main.m @@ -1,4 +1,8 @@ function test_main +% TODO Check the directory test_sparse_to_csr test_dfs +test_load_gaimc_graph + + end \ No newline at end of file From 50b88f70534efe40fc1ae7889e690b21673c1d2b Mon Sep 17 00:00:00 2001 From: David Date: Wed, 29 Apr 2009 23:44:12 -0700 Subject: [PATCH 15/36] Added largest_component and test case --- Contents.m | 1 + largest_component.m | 48 +++++++++++++++++++++++++++++++++++++++++++ test/test_examples.m | 18 +++++++++++++--- test/test_largest_component.m | 33 +++++++++++++++++++++++++++++ 4 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 largest_component.m create mode 100644 test/test_largest_component.m diff --git a/Contents.m b/Contents.m index 2332e22..52014dd 100644 --- a/Contents.m +++ b/Contents.m @@ -17,6 +17,7 @@ % % Connected components % scomponents - Compute strongly connected components +% largest_component - Selects only the largest component % % Statistics % clustercoeffs - Compute clustering coefficients diff --git a/largest_component.m b/largest_component.m new file mode 100644 index 0000000..bef9e79 --- /dev/null +++ b/largest_component.m @@ -0,0 +1,48 @@ +function [Acc,p] = largest_component(A,sym) +% LARGEST_COMPONENT Return the largest connected component of A +% +% Acc = largest_component(A) returns the largest connected component +% of the graph A. If A is directed, this returns the largest +% strongly connected component. +% +% Acc = largest_component(A,1) returns the largest connected piece of +% a directed graph where connectivity is undirected. Algorithmically, +% this takes A, drops the directions, then components the largest component +% and returns just this piece of the original _directed_ network. So the +% output Acc is directed in this case. +% +% [Acc,p] = largest_component(A,...) also returns a logical vector +% indicating which vertices in A were chosen. +% +% See also SCOMPONENTS +% +% Example: +% load_gaimc_graph('dfs_example') +% [Acc p] = largest_component(A); % compute the largest component +% xy2 = xy(p,:); labels2 = labels(p); % get component metadata +% % draw original graph +% subplot(1,2,1); graph_draw(A,xy,'labels',labels); title('Original'); +% % draw component +% subplot(1,2,2); graph_draw(Acc,xy2,'labels',labels2); title('Component'); + +% David Gleich +% Copyright, Stanford University, 2008-2009 + +% History +% 2009-04-29: Initial coding + +% TODO: Write example + +if ~exist('sym','var') || isempty(sym), sym=0; end + +if sym + As = A|A'; + [ci sizes] = scomponents(As); +else + [ci sizes] = scomponents(A); +end +[csize cind] = max(sizes); +p = ci==cind; +Acc = A(p,p); + + diff --git a/test/test_examples.m b/test/test_examples.m index 5ffe75b..0a2564c 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -1,15 +1,27 @@ +%% scomponents % scomponents load('graphs/cores_example'); % the graph A has three components ci = scomponents(A) max(ci) % should be 3 R = sparse(1:size(A,1),ci,1,size(A,1),ncomp); % create a restriction matrix CG = R'*A*R; % create the graph with each component - % collapsed into a single node. + % collapsed into a single node. - +%% load_gaimc_graph % equivalent to load('graphs/airports.mat') run from the gaimc directory load_gaimc_graph('airports') % equivalent to P=load('graphs/kt-7-2.mat') run from the gaimc directory P=load_gaimc_graph('kt-7-2.mat') -% so you don't have to put the path in for examples! \ No newline at end of file +% so you don't have to put the path in for examples! + + +%% largest_component +load_gaimc_graph('dfs_example') +[Acc p] = largest_component(A); % compute the largest component +xy2 = xy(p,:); labels2 = labels(p); % get component metadata +% draw original graph +subplot(1,2,1); graph_draw(A,xy,'labels',labels); title('Original'); +% draw component +subplot(1,2,2); graph_draw(Acc,xy2,'labels',labels2); title('Component'); + diff --git a/test/test_largest_component.m b/test/test_largest_component.m new file mode 100644 index 0000000..f55f0bc --- /dev/null +++ b/test/test_largest_component.m @@ -0,0 +1,33 @@ +function test_largest_component + +fname = 'largest_component'; % function name +ntest = 0; % test number + +ntest = ntest+1; tid = sprintf('%32s test %3i : ', fname, ntest); +load_gaimc_graph('dfs_example'); +Acc = largest_component(A); +if size(Acc,1) ~= 5 + error('gaimc:test','%s failed on dfs_example', tid); +else + fprintf([tid 'passed\n']); +end + +ntest = ntest+1; tid = sprintf('%32s test %3i : ', fname, ntest); +load_gaimc_graph('dfs_example'); +Acc = largest_component(A,1); +if size(Acc,1) ~= 6 + error('gaimc:test','%s failed on sym=1 dfs_example', tid); +else + fprintf([tid 'passed\n']); +end + +ntest = ntest+1; tid = sprintf('%32s test %3i : ', fname, ntest); +load_gaimc_graph('cores_example'); % the graph A is symmetric +Acc1 = largest_component(A); +Acc2 = largest_component(A,1); +if ~isequal(Acc1,Acc2) + error('gaimc:test','%s failed on cores_example', tid); +else + fprintf([tid 'passed\n']); +end + \ No newline at end of file From 60bdf69f98a6e2ea8a4df7b1540d0ca3c9a20b7c Mon Sep 17 00:00:00 2001 From: David Date: Wed, 29 Apr 2009 23:44:48 -0700 Subject: [PATCH 16/36] Updated corenums example --- corenums.m | 2 +- test/test_examples.m | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/corenums.m b/corenums.m index 5869154..83e0582 100644 --- a/corenums.m +++ b/corenums.m @@ -15,7 +15,7 @@ % Decomposition of Networks." Sept. 1 2002. % % Example: -% load('graphs/cores_example.mat') +% load_gaimc_graph('cores_example'); % the graph A has three components % corenums(A) % diff --git a/test/test_examples.m b/test/test_examples.m index 0a2564c..8057024 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -25,3 +25,7 @@ % draw component subplot(1,2,2); graph_draw(Acc,xy2,'labels',labels2); title('Component'); +%% corenums +load_gaimc_graph('cores_example'); % the graph A has three components +corenums(A) + From 6fdc699619a289ee38266dd897441d8f2296c969 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 29 Apr 2009 23:46:15 -0700 Subject: [PATCH 17/36] Fixed missing largest_component test and load_gaimc_graph test --- test/test_load_gaimc_graph.m | 8 ++++---- test/test_main.m | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_load_gaimc_graph.m b/test/test_load_gaimc_graph.m index 18b2a67..b30d7e0 100644 --- a/test/test_load_gaimc_graph.m +++ b/test/test_load_gaimc_graph.m @@ -1,8 +1,8 @@ -function test_gaimc_graph +function load_test_gaimc_graph %% P1=load('../graphs/kt-7-2.mat'); -P2=gaimc_graph('kt-7-2.mat'); +P2=load_gaimc_graph('kt-7-2.mat'); if ~isequal(P1,P2) error('gaimc_graph failed on kt-7-2.mat'); else @@ -11,7 +11,7 @@ %% P1=load('../graphs/kt-7-2'); -P2=gaimc_graph('kt-7-2'); +P2=load_gaimc_graph('kt-7-2'); if ~isequal(P1,P2) error('gaimc_graph failed on kt-7-2'); else @@ -21,7 +21,7 @@ %% load('../graphs/clr-24-1'); P1 = struct('A',A,'labels',labels,'xy',xy); -gaimc_graph('clr-24-1'); +load_gaimc_graph('clr-24-1'); P2 = struct('A',A,'labels',labels,'xy',xy); if ~isequal(P1,P2) diff --git a/test/test_main.m b/test/test_main.m index ae807c2..f9c58b8 100644 --- a/test/test_main.m +++ b/test/test_main.m @@ -3,6 +3,6 @@ test_sparse_to_csr test_dfs test_load_gaimc_graph - +test_largest_component end \ No newline at end of file From 95b6d385a5268148bd4ab729e50d34f2ba3f0395 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 29 Apr 2009 23:50:38 -0700 Subject: [PATCH 18/36] Added test example to bfs --- bfs.m | 2 ++ test/test_examples.m | 3 +++ 2 files changed, 5 insertions(+) diff --git a/bfs.m b/bfs.m index f069647..e6033d7 100644 --- a/bfs.m +++ b/bfs.m @@ -11,6 +11,8 @@ % [...] = bfs(A,u,v) stops the bfs when it hits the vertex v % % Example: +% load_gaimc_graph('bfs_example.mat') % use the dfs example from Boost +% d = bfs(A,1) % % See also DFS diff --git a/test/test_examples.m b/test/test_examples.m index 8057024..0158dae 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -1,3 +1,6 @@ +%% bfs +load_gaimc_graph('bfs_example.mat') % use the dfs example from Boost +d = bfs(A,1) %% scomponents % scomponents From a702c33b5c6c0040acd4919e986e8b3a0d1aa1b4 Mon Sep 17 00:00:00 2001 From: David Date: Wed, 29 Apr 2009 23:51:19 -0700 Subject: [PATCH 19/36] Fixed dfs example for gaimc_graph and added to test_examples --- dfs.m | 2 +- test/test_examples.m | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/dfs.m b/dfs.m index 65c1870..5b61b78 100644 --- a/dfs.m +++ b/dfs.m @@ -19,7 +19,7 @@ % yet. % % Example: -% load('graphs/dfs_example.mat') % use the dfs example from Boost +% load_gaimc_graph('dfs_example.mat') % use the dfs example from Boost % d = dfs(A,1) % % See also BFS diff --git a/test/test_examples.m b/test/test_examples.m index 0158dae..7171c34 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -2,6 +2,10 @@ load_gaimc_graph('bfs_example.mat') % use the dfs example from Boost d = bfs(A,1) +%% dfs +load_gaimc_graph('dfs_example.mat') % use the dfs example from Boost +d = dfs(A,1) + %% scomponents % scomponents load('graphs/cores_example'); % the graph A has three components From ea8b79da8aa01ef17f798b5bf7dced5325bf00f3 Mon Sep 17 00:00:00 2001 From: David Date: Sat, 2 May 2009 22:45:32 -0700 Subject: [PATCH 20/36] MST example for Prim's algorithm --- mst_prim.m | 28 ++++++++++++++++++++++++---- test/test_examples.m | 7 +++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/mst_prim.m b/mst_prim.m index 98b88d4..4f2c7b6 100644 --- a/mst_prim.m +++ b/mst_prim.m @@ -11,6 +11,21 @@ % [ti tj tv] = mst_prim(...) returns the edges from the matrix and does not % convert to a sparse matrix structure. This saves a bit of work and is % required when there are 0 edge weights. +% +% Example: +% load_gaimc_graph('airports'); % A(i,j) = negative travel time +% A = -A; % convert to travel time. +% A = max(A,A'); % make the travel times symmetric +% T = mst_prim(A); +% gplot(T,xy); % look at the minimum travel time tree in the US + +% David Gleich +% Copyright, Stanford University, 2008-2009 + +% History: +% 2009-05-02: Added example + +% TODO: Add example if ~exist('full','var') || isempty(full), full=0; end if ~exist('target','var') || isempty(full), u=1; end @@ -19,9 +34,11 @@ else [rp ci ai]=sparse_to_csr(A); check=1; end if check && any(ai)<0, error('gaimc:prim', ... - 'prim''s algorithm cannot handle negative edge weights.'); end + 'prim''s algorithm cannot handle negative edge weights.'); +end if check && ~isequal(A,A'), error('gaimc:prim', ... - 'prim''s algorithm requires an undirected graph.'); end + 'prim''s algorithm requires an undirected graph.'); +end nverts=length(rp)-1; d=Inf*ones(nverts,1); T=zeros(nverts,1); L=zeros(nverts,1); pred=zeros(1,length(rp)-1); @@ -29,7 +46,10 @@ % enter the main dijkstra loop for iter=1:nverts if iter==1, root=u; - else root=mod(u+iter-1,nverts)+1; if L(v)>0, continue; end, end + else + root=mod(u+iter-1,nverts)+1; + if L(v)>0, continue; end + end n=1; T(n)=root; L(root)=n; % oops, n is now the size of the heap d(root) = 0; while n>0 @@ -114,4 +134,4 @@ else varargout = {ti, tj, tv}; end - \ No newline at end of file + diff --git a/test/test_examples.m b/test/test_examples.m index 7171c34..a9cde07 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -5,6 +5,13 @@ %% dfs load_gaimc_graph('dfs_example.mat') % use the dfs example from Boost d = dfs(A,1) + +%% mst_prim +load_gaimc_graph('airports'); % A(i,j) = negative travel time +A = -A; % convert to travel time. +A = max(A,A'); % make the travel times symmetric +T = mst_prim(A); +gplot(T,xy); % look at the minimum travel time tree in the US %% scomponents % scomponents From fbf136cd1b52c38609e0de9aff1a07225764eec6 Mon Sep 17 00:00:00 2001 From: David Date: Sat, 2 May 2009 22:47:01 -0700 Subject: [PATCH 21/36] Added load_gaimc_graph demo --- demo/demo.m | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/demo/demo.m b/demo/demo.m index 3230176..5d507bd 100644 --- a/demo/demo.m +++ b/demo/demo.m @@ -1,4 +1,4 @@ -%% Demo of gaimc - Graph Algorithms in Matlab code` +%% Demo of gaimc - 'Graph Algorithms In Matlab Code' % Matlab includes great algorithms to work with sparse matrices but does % provide a reasonable set of algorithms to work with sparse matrices as % graph data structures. My other project -- MatlabBGL -- provides a @@ -18,6 +18,16 @@ % To store the connectivity structure of the graph, gaimc uses the % adjacency matrix of a graph. +%% Loading helper +% To make loading our sample graphs easy, gaimc defines it's own function +% to load graphs. + +load_gaimc_graph('dfs_example'); % loads one of our example graphs +whos + +%% +% This helps make our examples work regardless of where the current +% directory lies. %% Search algorithms % The two standard graph search algorithms are depth first search and From fb503653ab7c0f552101deed97618440b91923eb Mon Sep 17 00:00:00 2001 From: David Date: Sat, 2 May 2009 22:48:59 -0700 Subject: [PATCH 22/36] Added minimum spanning tree demo --- demo/demo.m | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/demo/demo.m b/demo/demo.m index 5d507bd..69213d6 100644 --- a/demo/demo.m +++ b/demo/demo.m @@ -75,6 +75,63 @@ %% Minimum spanning trees % A minimum spanning tree is a set of edges from a graph that ... +% +% This demo requires the mapping toolbox for maximum effect, but we'll do +% okay without it. + +%% +% Our data comes from a graph Brendan Frey prepared for his affinity +% propagation clustering tool. For 456 cities in the US, we have the mean +% travel time between airports in those cities, along with their latitude +% and longitude. +load_gaimc_graph('airports') + +%% +% For some reason, the data is stored with the negative travel time between +% cities. (I believe this is so that closer cities have larger edges +% between them.) But for a minimum spanning tree, we want the actual +% travel time between cities. +A = -A; + +%% +% Now, we just call MST and look at the result. +T = mst_prim(A); + +%% +% Oops, travel time isn't symmetric! Let's just pick the longest possible +% time. +A = max(A,A'); +T = mst_prim(A); +sum(sum(T))/2 % total travel time in tree + +%% +% Well, the total weight isn't that helpful, let's _look_ at the data +% instead. +clf; +gplot(T,xy); + +%% +% Hey! That looks like the US! You can see regional airports and get some +% sense of the overall connectivity. Now, we can use the mapping toolbox +% to look at the data even closer. +% +% These next lines plot a map of the US with states colored. +ax = worldmap('USA'); +load coast +geoshow(ax, lat, long,... + 'DisplayType', 'polygon', 'FaceColor', [.45 .60 .30]) +states = shaperead('usastatelo', 'UseGeoCoords', true); +faceColors = makesymbolspec('Polygon',... + {'INDEX', [1 numel(states)], 'FaceColor', polcmap(numel(states))}); + geoshow(ax, states, 'DisplayType', 'polygon', 'SymbolSpec', faceColors) +set(gcf,'Position', [ 52 234 929 702]); +%% +% That's the US, now we need to plot our data on top of it. +[X,Y] = gplot(T,xy); % get the information to reproduce a gplot +plotm(Y,X,'k.-','LineWidth',1.5); % plot the lines on the map +%% +% We need to clear the axes after the mapping toolbox +clf; %% Connected components From 462be0c8e5e6d47e75d2d196c24aa702dce9aa39 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 22:06:18 -0700 Subject: [PATCH 23/36] Added documentation to Dijkstra --- Contents.m | 6 +++--- dijkstra.m | 34 +++++++++++++++++++++++++++++++++- test/test_examples.m | 14 ++++++++++++++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/Contents.m b/Contents.m index 52014dd..442f87e 100644 --- a/Contents.m +++ b/Contents.m @@ -41,9 +41,9 @@ % TODO for release % Write demo code % Fix mlintrpt errors -% Update copyright info -% Examples for mst_prim, dijkstra, dirclustercoeffs, dfs -% Documentation for Dijkstra, dirclustercoeffs +% Update copyright info everywhere +% Examples for dirclustercoeffs +% Documentation for dirclustercoeffs % Implement bipartite matching % Future todos diff --git a/dijkstra.m b/dijkstra.m index f3d646b..ac27373 100644 --- a/dijkstra.m +++ b/dijkstra.m @@ -1,10 +1,42 @@ function [d pred]=dijkstra(A,u) +% DIJKSTRA Compute shortest paths using Dijkstra's algorithm +% +% d=dijkstra(A,u) computes the shortest path from vertex u to all nodes +% reachable from vertex u using Dijkstra's algorithm for the problem. +% The graph is given by the weighted sparse matrix A, where A(i,j) is +% the distance between vertex i and j. In the output vector d, +% the entry d(v) is the minimum distance between vertex u and vertex v. +% A vertex w unreachable from u has d(w)=Inf. +% +% [d pred]=dijkstra(A,u) also returns the predecessor tree to generate +% the actual shorest paths. In the predecessor tree pred(v) is the +% vertex preceeding v in the shortest path and pred(u)=0. Any +% unreachable vertex has pred(w)=0 as well. +% +% If your network is unweighted, then use bfs instead. +% +% See also BFS +% +% Example: +% % Find the minimum travel time between Los Angeles (LAX) and +% % Rochester Minnesota (RST). +% load_gaimc_graph('airports') +% A = -A; % fix funny encoding of airport data +% lax=247; rst=355; +% [d pred] = dijkstra(A,lax); +% fprintf('Minimum time: %g\n',d(rst)); +% % Print the path +% fprintf('Path:\n'); +% path =[]; u = rst; while (u ~= lax) path=[u path]; u=pred(u); end +% fprintf('%s',labels{lax}); +% for i=path; fprintf(' --> %s', labels{i}); end, fprintf('\n'); % David Gleich -% Copyright, Stanford University, 2008 +% Copyright, Stanford University, 2008-2009 % History % 2008-04-09: Initial coding +% 2009-05-15: Documentation if isstruct(A), rp=A.rp; ci=A.ci; ai=A.ai; check=0; else [rp ci ai]=sparse_to_csr(A); check=1; diff --git a/test/test_examples.m b/test/test_examples.m index a9cde07..6971ed6 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -6,6 +6,20 @@ load_gaimc_graph('dfs_example.mat') % use the dfs example from Boost d = dfs(A,1) +%% dijkstra +% Find the minimum travel time between Los Angeles (LAX) and +% Rochester Minnesota (RST). +load_gaimc_graph('airports') +A = -A; % fix funny encoding of airport data +lax=247; rst=355; +[d pred] = dijkstra(A,lax); +fprintf('Minimum time: %g\n',d(rst)); +% Print the path +fprintf('Path:\n'); +path =[]; u = rst; while (u ~= lax) path=[u path]; u=pred(u); end +fprintf('%s',labels{lax}); +for i=path; fprintf(' --> %s', labels{i}); end, fprintf('\n'); + %% mst_prim load_gaimc_graph('airports'); % A(i,j) = negative travel time A = -A; % convert to travel time. From 6ce76e5df88a65e1aece92393ae7804d5a50e97c Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 22:39:55 -0700 Subject: [PATCH 24/36] Added examples to dirclustercoeffs.m --- Contents.m | 2 -- dirclustercoeffs.m | 30 ++++++++++++++++++++++++++---- test/test_examples.m | 6 ++++++ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/Contents.m b/Contents.m index 442f87e..ebce84c 100644 --- a/Contents.m +++ b/Contents.m @@ -42,8 +42,6 @@ % Write demo code % Fix mlintrpt errors % Update copyright info everywhere -% Examples for dirclustercoeffs -% Documentation for dirclustercoeffs % Implement bipartite matching % Future todos diff --git a/dirclustercoeffs.m b/dirclustercoeffs.m index 32f85ee..911fea5 100644 --- a/dirclustercoeffs.m +++ b/dirclustercoeffs.m @@ -2,11 +2,30 @@ % DIRCLUSTERCOEFFS Compute clustering coefficients for a directed graph % % cc=dirclustercoeffs(A) returns the directed clustering coefficients -% (which are identical to the clustering coefficients on an undirected -% graph. +% (which generalize the clustering coefficients of an undirected graph, +% and so calling this function on an undirected graph will produce the same +% answer as clustercoeffs, but less efficiently.) +% +% This function implements the algorithm from Fagiolo, Phys Rev. E. 76 +% 026107 (doi:10:1103/PhysRevE.76.026107). +% +% [cc,cccyc,ccmid,ccin,ccout,nf]=dirclusteringcoeffs(A) returns different +% components of the clustering coefficients corresponding to cycles, +% middles, in triangles, and out triangles. See the manuscript for a +% description of the various types of triangles counted in the above +% metrics. +% +% See also CLUSTERCOEFFS +% +% Example: +% load_gaimc_graph('celegans'); % load the C elegans nervous system network +% cc=dirclustercoeffs(A); +% [maxval maxind]=max(cc) +% labels(maxind) % most clustered vertex in the nervous system % History % 2008-04-22: Initial coding +% 2009-05-15: Documentation and example if ~exist('normalized','var') || isempty(normalized), normalized=true; end if ~exist('weighted','var') || isempty(weighted), weighted=true; end @@ -37,9 +56,12 @@ if nargout>4, ccout=zeros(n,1); end if nargout>5, nf=zeros(n,1); end % precompute degrees -for v=1:n, for rpi=rp(v):rp(v+1)-1, w=ci(rpi); +for v=1:n, + for rpi=rp(v):rp(v+1)-1, + w=ci(rpi); if v==w, continue; else degs(w)=degs(w)+1; degs(v)=degs(v)+1; end -end, end + end +end ew=1; ew2=1; for v=1:n % setup counts for the different cycle types diff --git a/test/test_examples.m b/test/test_examples.m index 6971ed6..0b3e58a 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -20,6 +20,12 @@ fprintf('%s',labels{lax}); for i=path; fprintf(' --> %s', labels{i}); end, fprintf('\n'); +%% dirclustercoeffs +load_gaimc_graph('celegans'); % load the C elegans nervous system network +cc=dirclustercoeffs(A); +[maxval maxind]=max(cc) +labels(maxind) % most clustered vertex in the nervous system + %% mst_prim load_gaimc_graph('airports'); % A(i,j) = negative travel time A = -A; % convert to travel time. From cd319a587a14fa21ccd2d03a67344c03dd233b33 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 22:43:49 -0700 Subject: [PATCH 25/36] Added example to clustercoeffs --- clustercoeffs.m | 9 +++++++-- test/test_examples.m | 5 +++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/clustercoeffs.m b/clustercoeffs.m index 115868a..5de2482 100644 --- a/clustercoeffs.m +++ b/clustercoeffs.m @@ -8,11 +8,16 @@ % control normalization and weighted computation. If normalized=0 or % false, then the computation is not normalized by d*(d-1) in the % unweighted case. If weighted=0 or false, then the weights of the matrix -% A are ignored. +% A are ignored. Either parameter will assume it's default value if you +% specify an empty matrix. % % See also DIRCLUSTERCOEFFS % % Example: +% load_gaimc_graph('clique-10'); +% cc = clustercoeffs(A) % they are all equal! as we expect in a clique + +% TODO Example if ~exist('normalized','var') || isempty(normalized), normalized=true; end if ~exist('weighted','var') || isempty(weighted), weighted=true; end @@ -37,7 +42,7 @@ end n=length(rp)-1; -cc=zeros(n,1); ind=false(n,1); cache=zeros(n,1); degs=zeros(n,1); +cc=zeros(n,1); ind=false(n,1); cache=zeros(n,1); ew=1; ew2=1; for v=1:n for rpi=rp(v):rp(v+1)-1 diff --git a/test/test_examples.m b/test/test_examples.m index 0b3e58a..196ade0 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -2,6 +2,11 @@ load_gaimc_graph('bfs_example.mat') % use the dfs example from Boost d = bfs(A,1) +%% clustercoeffs +load_gaimc_graph('clique-10'); +cc = clustercoeffs(A) % they are all equal! as we expect in a clique + + %% dfs load_gaimc_graph('dfs_example.mat') % use the dfs example from Boost d = dfs(A,1) From 03d0d654720b2fc3510d528bcced2b95cbe50a84 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 22:47:16 -0700 Subject: [PATCH 26/36] Graph_draw code cleanup and added example --- graph_draw.m | 161 +++++++++++++++++++++++++++++---------------------- test/test_examples.m | 5 ++ 2 files changed, 96 insertions(+), 70 deletions(-) diff --git a/graph_draw.m b/graph_draw.m index 3d95c4a..dc5b69e 100644 --- a/graph_draw.m +++ b/graph_draw.m @@ -25,10 +25,14 @@ % See also GPLOT % % Example: +% load_gaimc_graph('dfs_example'); +% graph_draw(A,xy); % 2009-02-26 interface modified by David Gleich % to remove automatic layout +% 2009-05-15: Added example + % 24 Feb 2004 cleaned up, optimized and corrected by Leon Peshkin pesha @ ai.mit.edu % Apr-2000 draw_graph Ali Taylan Cemgil % 1995-1997 arrow Erik A. Johnson @@ -121,10 +125,10 @@ % c - colors % OUTPUT: t - Object Handles % width - x and y width of ovals -temp = []; if ~isa(str,'cell'), str = cellstr(str); end; N = length(str); wd = zeros(N,2); +temp = zeros(N,2); for i = 1:N, tx = text(x(i),y(i),str{i},'HorizontalAlignment','center','VerticalAlign','middle','FontSize', fontsize); sz = get(tx, 'Extent'); @@ -137,7 +141,7 @@ wd(i,:) = [wx wy]; delete(tx); tx = text(x(i),y(i),str{i},'HorizontalAlignment','center','VerticalAlign','middle', 'FontSize', fontsize); - temp = [temp; tx ptc]; + temp(i,:) = [tx ptc]; end; t = temp; @@ -165,9 +169,10 @@ % OUTPUT: h - Object Handles % wd - x and y Width of boxes -h = []; -if ~isa(str,'cell') str=cellstr(str); end; +if ~isa(str,'cell'), str=cellstr(str); end N = length(str); +wd = zeros(N,2); +h = zeros(N,2); for i = 1:N, tx = text(x(i),y(i),str{i},'HorizontalAlignment','center','VerticalAlign','middle'); sz = get(tx, 'Extent'); @@ -178,7 +183,7 @@ wd(i,:) = [wx wy]; delete(tx); tx = text(x(i),y(i),str{i},'HorizontalAlignment','center','VerticalAlign','middle'); - h = [h; tx ptc]; + h(i,:) = [tx ptc]; end; function [h,yy,zz] = my_arrow(varargin) @@ -211,30 +216,31 @@ if (oneax), T = zeros(4,4); invT = zeros(4,4); else - T = zeros(16,1); invT = zeros(16,1); end + T = zeros(16,1); invT = zeros(16,1); +end axnotdone = 1; % logical(ones(size(ax))); LPM -while (any(axnotdone)), +while (any(axnotdone)) ii = 1; % LPM min(find(axnotdone)); curax = ax(ii); curpage = page(ii); % get axes limits and aspect ratio axl = [get(curax,'XLim'); get(curax,'YLim'); get(curax,'ZLim')]; - oldaxlims(min(find(oldaxlims(:,1)==0)),:) = [curax reshape(axl',1,6)]; + oldaxlims(find(oldaxlims(:,1)==0, 1),:) = [curax reshape(axl',1,6)]; % get axes size in pixels (points) u = get(curax,'Units'); axposoldunits = get(curax,'Position'); really_curpage = curpage & strcmp(u,'normalized'); - if (really_curpage), + if (really_curpage) curfig = get(curax,'Parent'); pu = get(curfig,'PaperUnits'); set(curfig,'PaperUnits','points'); pp = get(curfig,'PaperPosition'); set(curfig,'PaperUnits',pu); set(curax,'Units','pixels'); curapscreen = get(curax,'Position'); set(curax,'Units','normalized'); curap = pp.*get(curax,'Position'); - else, + else set(curax,'Units','pixels'); curapscreen = get(curax,'Position'); curap = curapscreen; - end; + end set(curax,'Units',u); set(curax,'Position',axposoldunits); % handle non-stretched axes position str_stretch = {'DataAspectRatioMode'; 'PlotBoxAspectRatioMode' ; 'CameraViewAngleMode' }; @@ -242,7 +248,7 @@ 'CameraViewAngleMode' ; 'CameraUpVectorMode'}; notstretched = strcmp(get(curax,str_stretch),'manual'); manualcamera = strcmp(get(curax,str_camera),'manual'); - if ~arrow_WarpToFill(notstretched,manualcamera,curax), + if ~arrow_WarpToFill(notstretched,manualcamera,curax) % find the true pixel size of the actual axes texttmp = text(axl(1,[1 2 2 1 1 2 2 1]), ... axl(2,[1 1 2 2 1 1 2 2]), axl(3,[1 1 1 1 2 2 2 2]),''); @@ -252,51 +258,51 @@ textpos = cat(1,textpos{:}); textpos = max(textpos(:,1:2)) - min(textpos(:,1:2)); % adjust the axes position - if (really_curpage), % adjust to printed size + if (really_curpage) % adjust to printed size textpos = textpos * min(curap(3:4)./textpos); curap = [curap(1:2)+(curap(3:4)-textpos)/2 textpos]; - else, % adjust for pixel roundoff + else % adjust for pixel roundoff textpos = textpos * min(curapscreen(3:4)./textpos); curap = [curap(1:2)+(curap(3:4)-textpos)/2 textpos]; - end; - end; + end + end % adjust limits for log scale on axes curxyzlog = [strcmp(get(curax,'XScale'),'log'); ... strcmp(get(curax,'YScale'),'log'); strcmp(get(curax,'ZScale'),'log')]; - if (any(curxyzlog)), + if (any(curxyzlog)) ii = find([curxyzlog;curxyzlog]); - if (any(axl(ii)<=0)), + if (any(axl(ii)<=0)) error([upper(mfilename) ' does not support non-positive limits on log-scaled axes.']); - else, + else axl(ii) = log10(axl(ii)); - end; - end; + end + end % correct for 'reverse' direction on axes; curreverse = [strcmp(get(curax,'XDir'),'reverse'); ... strcmp(get(curax,'YDir'),'reverse'); strcmp(get(curax,'ZDir'),'reverse')]; ii = find(curreverse); - if ~isempty(ii), + if ~isempty(ii) axl(ii,[1 2])=-axl(ii,[2 1]); - end; + end % compute the range of 2-D values curT = get(curax,'Xform'); lim = curT*[0 1 0 1 0 1 0 1;0 0 1 1 0 0 1 1;0 0 0 0 1 1 1 1;1 1 1 1 1 1 1 1]; lim = lim(1:2,:)./([1;1]*lim(4,:)); - curlimmin = min(lim')'; - curlimrange = max(lim')' - curlimmin; + curlimmin = min(lim,[],2); + curlimrange = max(lim,[],2) - curlimmin; curinvT = inv(curT); - if (~oneax), - curT = curT.'; curinvT = curinvT.'; curT = curT(:); curinvT = curinvT(:); - end; + if ~oneax + curT = curT.'; curinvT = curinvT.'; curT = curT(:); curinvT = curinvT(:); + end % check which arrows to which cur corresponds ii = find((ax==curax)&(page==curpage)); - oo = ones(1,length(ii)); axr(:,ii) = diff(axl')' * oo; + oo = ones(1,length(ii)); axr(:,ii) = diff(axl,1,2) * oo; axm(:,ii) = axl(:,1) * oo; axrev(:,ii) = curreverse * oo; ap(:,ii) = curap(3:4)' * oo; xyzlog(:,ii) = curxyzlog * oo; limmin(:,ii) = curlimmin * oo; limrange(:,ii) = curlimrange * oo; if (oneax), T = curT; invT = curinvT; - else, + else T(:,ii) = curT * oo; invT(:,ii) = curinvT * oo; end; axnotdone(ii) = zeros(1,length(ii)); @@ -305,16 +311,16 @@ % correct for log scales curxyzlog = xyzlog.'; ii = find(curxyzlog(:)); -if ~isempty(ii), +if ~isempty(ii) start(ii) = real(log10(start(ii))); stop(ii) = real(log10(stop(ii))); - if (all(imag(crossdir)==0)), % pulled (ii) subscript on crossdir, 12/5/96 eaj + if (all(imag(crossdir)==0)) % pulled (ii) subscript on crossdir, 12/5/96 eaj crossdir(ii) = real(log10(crossdir(ii))); - end; -end; + end +end ii = find(axrev.'); % correct for reverse directions -if ~isempty(ii), +if ~isempty(ii) start(ii) = -start(ii); stop(ii) = -stop(ii); crossdir(ii) = -crossdir(ii); -end; +end start = start.'; stop = stop.'; % transpose start/stop values % take care of defaults, page was done above ii = find(isnan(start(:))); if ~isempty(ii), start(ii) = axm(ii)+axr(ii)/2; end; @@ -329,38 +335,42 @@ % for all points with start==stop, start=stop-(verysmallvalue)*(up-direction); ii = find(all(start==stop)); -if ~isempty(ii), +if ~isempty(ii) % find an arrowdir vertical on screen and perpendicular to viewer % transform to 2-D tmp1 = [(stop(:,ii)-axm(:,ii))./axr(:,ii);ones(1,length(ii))]; if (oneax), twoD=T*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T(:,ii).*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T(:,ii).*tmp1; tmp2=zeros(4,4*length(ii)); tmp2(:)=tmp1(:); - twoD=zeros(4,length(ii)); twoD(:)=sum(tmp2)'; end; + twoD=zeros(4,length(ii)); twoD(:)=sum(tmp2)'; + end twoD=twoD./(ones(4,1)*twoD(4,:)); % move the start point down just slightly tmp1 = twoD + [0;-1/1000;0;0]*(limrange(2,ii)./ap(2,ii)); % transform back to 3-D if (oneax), threeD=invT*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT(:,ii).*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT(:,ii).*tmp1; tmp2=zeros(4,4*length(ii)); tmp2(:)=tmp1(:); - threeD=zeros(4,length(ii)); threeD(:)=sum(tmp2)'; end; + threeD=zeros(4,length(ii)); threeD(:)=sum(tmp2)'; + end start(:,ii) = (threeD(1:3,:)./(ones(3,1)*threeD(4,:))).*axr(:,ii)+axm(:,ii); end; % compute along-arrow points % transform Start points tmp1 = [(start-axm)./axr; 1]; if (oneax), X0=T*tmp1; - else, tmp1 = [tmp1;tmp1;tmp1;tmp1]; tmp1=T.*tmp1; + else tmp1 = [tmp1;tmp1;tmp1;tmp1]; tmp1=T.*tmp1; tmp2 = zeros(4,4); tmp2(:)=tmp1(:); - X0=zeros(4,1); X0(:)=sum(tmp2)'; end; + X0=zeros(4,1); X0(:)=sum(tmp2)'; + end X0=X0./(ones(4,1)*X0(4,:)); % transform Stop points tmp1=[(stop-axm)./axr; 1]; if (oneax), Xf=T*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T.*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T.*tmp1; tmp2=zeros(4,4); tmp2(:)=tmp1(:); - Xf=zeros(4,1); Xf(:)=sum(tmp2)'; end; + Xf=zeros(4,1); Xf(:)=sum(tmp2)'; + end Xf=Xf./(ones(4,1)*Xf(4,:)); % compute pixel distance between points D = sqrt(sum(((Xf(1:2,:)-X0(1:2,:)).*(ap./limrange)).^2)); @@ -389,44 +399,50 @@ % compute stoppoints tmp1 = X0.*(ones(4,1)*(len0./D))+Xf.*(ones(4,1)*(1-len0./D)); if (oneax), tmp3 = invT*tmp1; - else, tmp1 = [tmp1;tmp1;tmp1;tmp1]; tmp1 = invT.*tmp1; + else tmp1 = [tmp1;tmp1;tmp1;tmp1]; tmp1 = invT.*tmp1; tmp2 = zeros(4,4); tmp2(:) = tmp1(:); - tmp3 = zeros(4,1); tmp3(:) = sum(tmp2)'; end; + tmp3 = zeros(4,1); tmp3(:) = sum(tmp2)'; + end stoppoint = tmp3(1:3,:)./(ones(3,1)*tmp3(4,:)).*axr+axm; % compute tippoints tmp1=X0.*(ones(4,1)*(len1./D))+Xf.*(ones(4,1)*(1-len1./D)); if (oneax), tmp3=invT*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT.*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT.*tmp1; tmp2=zeros(4,4); tmp2(:)=tmp1(:); - tmp3=zeros(4,1); tmp3(:)=sum(tmp2)'; end; + tmp3=zeros(4,1); tmp3(:)=sum(tmp2)'; + end tippoint = tmp3(1:3,:)./(ones(3,1)*tmp3(4,:)).*axr+axm; % compute basepoints tmp1=X0.*(ones(4,1)*(len2./D))+Xf.*(ones(4,1)*(1-len2./D)); if (oneax), tmp3=invT*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT.*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT.*tmp1; tmp2=zeros(4,4); tmp2(:)=tmp1(:); - tmp3=zeros(4,1); tmp3(:)=sum(tmp2)'; end; + tmp3=zeros(4,1); tmp3(:)=sum(tmp2)'; + end basepoint = tmp3(1:3,:)./(ones(3,1)*tmp3(4,:)).*axr+axm; % compute startpoints tmp1=X0.*(ones(4,1)*(1-slen0./D))+Xf.*(ones(4,1)*(slen0./D)); if (oneax), tmp3=invT*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT.*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT.*tmp1; tmp2=zeros(4,4); tmp2(:) = tmp1(:); - tmp3=zeros(4,1); tmp3(:) = sum(tmp2)'; end; + tmp3=zeros(4,1); tmp3(:) = sum(tmp2)'; + end startpoint = tmp3(1:3,:)./(ones(3,1)*tmp3(4,:)).*axr+axm; % compute stippoints tmp1=X0.*(ones(4,1)*(1-slen1./D))+Xf.*(ones(4,1)*(slen1./D)); if (oneax), tmp3=invT*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1 = invT.*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1 = invT.*tmp1; tmp2=zeros(4,4); tmp2(:)=tmp1(:); - tmp3=zeros(4,1); tmp3(:)=sum(tmp2)'; end; + tmp3=zeros(4,1); tmp3(:)=sum(tmp2)'; + end stippoint = tmp3(1:3,:)./(ones(3,1)*tmp3(4,:)).*axr+axm; % compute sbasepoints tmp1=X0.*(ones(4,1)*(1-slen2./D))+Xf.*(ones(4,1)*(slen2./D)); if (oneax), tmp3=invT*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT.*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=invT.*tmp1; tmp2=zeros(4,4); tmp2(:)=tmp1(:); - tmp3=zeros(4,1); tmp3(:)=sum(tmp2)'; end; + tmp3=zeros(4,1); tmp3(:)=sum(tmp2)'; + end sbasepoint = tmp3(1:3,:)./(ones(3,1)*tmp3(4,:)).*axr+axm; % compute cross-arrow directions for arrows with NormalDir specified @@ -446,17 +462,19 @@ tmp1 = (tmp1-axm(:,[ii ii ii ii])) ./ axr(:,[ii ii ii ii]); tmp1 = [tmp1; ones(1,4*numii)]; if (oneax), X0=T*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T(:,[ii ii ii ii]).*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T(:,[ii ii ii ii]).*tmp1; tmp2=zeros(4,16*numii); tmp2(:)=tmp1(:); - X0=zeros(4,4*numii); X0(:)=sum(tmp2)'; end; + X0=zeros(4,4*numii); X0(:)=sum(tmp2)'; + end X0=X0./(ones(4,1)*X0(4,:)); % transform stop points tmp1 = [(2*stop(:,ii)-start(:,ii)-axm(:,ii))./axr(:,ii);ones(1,numii)]; tmp1 = [tmp1 tmp1 tmp1 tmp1]; - if (oneax), Xf=T*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T(:,[ii ii ii ii]).*tmp1; + if (oneax) Xf=T*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=T(:,[ii ii ii ii]).*tmp1; tmp2=zeros(4,16*numii); tmp2(:)=tmp1(:); - Xf=zeros(4,4*numii); Xf(:)=sum(tmp2)'; end; + Xf=zeros(4,4*numii); Xf(:)=sum(tmp2)'; + end Xf=Xf./(ones(4,1)*Xf(4,:)); % compute perpendicular directions pixfact = ((limrange(1,ii)./limrange(2,ii)).*(ap(2,ii)./ap(1,ii))).^2; @@ -489,18 +507,20 @@ tmp1 = (st - axm11) ./ axr11; tmp1 = [tmp1; ones(1,size(tmp1,2))]; if (oneax), X0=T*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=[T T T T T T T T T T T].*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=[T T T T T T T T T T T].*tmp1; tmp2=zeros(4,44); tmp2(:)=tmp1(:); - X0=zeros(4,11); X0(:)=sum(tmp2)'; end; + X0=zeros(4,11); X0(:)=sum(tmp2)'; + end X0=X0./(ones(4,1)*X0(4,:)); % compute stop points tmp1 = ([start tipcross basecross sbasecross stipcross stop stipcross sbasecross basecross tipcross start] ... - axm11) ./ axr11; tmp1 = [tmp1; ones(1,size(tmp1,2))]; if (oneax), Xf=T*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=[T T T T T T T T T T T].*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=[T T T T T T T T T T T].*tmp1; tmp2=zeros(4,44); tmp2(:)=tmp1(:); - Xf=zeros(4,11); Xf(:)=sum(tmp2)'; end; + Xf=zeros(4,11); Xf(:)=sum(tmp2)'; + end Xf=Xf./(ones(4,1)*Xf(4,:)); % compute lengths len0 = len.*((ends==1)|(ends==3)).*tan(tipangle/180*pi); @@ -513,9 +533,10 @@ tmp1 = X0.*(ones(4,1)*(1-le./D)) + Xf.*(ones(4,1)*(le./D)); % inverse transform if (oneax), tmp3=invT*tmp1; - else, tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=[invT invT invT invT invT invT invT invT invT invT invT].*tmp1; + else tmp1=[tmp1;tmp1;tmp1;tmp1]; tmp1=[invT invT invT invT invT invT invT invT invT invT invT].*tmp1; tmp2=zeros(4,44); tmp2(:)=tmp1(:); - tmp3=zeros(4,11); tmp3(:)=sum(tmp2)'; end; + tmp3=zeros(4,11); tmp3(:)=sum(tmp2)'; + end pts = tmp3(1:3,:)./(ones(3,1)*tmp3(4,:)) .* axr11 + axm11; % correct for ones where the crossdir was specified ii = find(~(all(crossdir==0)|any(isnan(crossdir)))); @@ -543,7 +564,7 @@ % % create or modify the patches H = 0; % % make or modify the arrows -if arrow_is2DXY(ax(1)), zz=[]; else, zz=z(:,1); end; +if arrow_is2DXY(ax(1)), zz=[]; else zz=z(:,1); end; xyz = {'XData',x(:,1),'YData',y(:,1),'ZData',zz,'Tag',ArrowTag}; H(1) = patch(xyz{:}); % % additional properties @@ -560,7 +581,7 @@ out(:) = abs(views(:,2))==90; is2D(:) = out(:) | all(rem(views',90)==0)'; -function out = arrow_WarpToFill(notstretched,manualcamera,curax) +function out = arrow_WarpToFill(notstretched,manualcamera,curax) %#ok % check if we are in "WarpToFill" mode. out = strcmp(get(curax,'WarpToFill'),'on'); % 'WarpToFill' is undocumented, so may need to replace this by diff --git a/test/test_examples.m b/test/test_examples.m index 196ade0..1b268f8 100644 --- a/test/test_examples.m +++ b/test/test_examples.m @@ -31,6 +31,11 @@ [maxval maxind]=max(cc) labels(maxind) % most clustered vertex in the nervous system +%% graph_draw +load_gaimc_graph('dfs_example'); +graph_draw(A,xy); + + %% mst_prim load_gaimc_graph('airports'); % A(i,j) = negative travel time A = -A; % convert to travel time. From 5c1810accffed8d92318f358e907242c95eacdde Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 22:48:47 -0700 Subject: [PATCH 27/36] Fix for missing graph in previous commit --- graphs/celegans.mat | Bin 0 -> 7354 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 graphs/celegans.mat diff --git a/graphs/celegans.mat b/graphs/celegans.mat new file mode 100644 index 0000000000000000000000000000000000000000..79d1b2996c0f9773ea0bc4e8d944c409fc0cd95a GIT binary patch literal 7354 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 Date: Fri, 15 May 2009 22:50:04 -0700 Subject: [PATCH 28/36] Added copyright message --- convert_sparse.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/convert_sparse.m b/convert_sparse.m index 820d295..4d18d11 100644 --- a/convert_sparse.m +++ b/convert_sparse.m @@ -10,6 +10,12 @@ % % See also SPARSE_TO_CSR SPARSE +% David Gleich +% Copyright, Stanford University, 2008-2009 + +% History +% 2009-04-29: Initial coding + [rp ci ai] = sparse_to_csr(A); As.rp = rp; As.ci = ci; From 661e09f4f290c8e52429051f873a781b146c18e8 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 22:51:30 -0700 Subject: [PATCH 29/36] Unknown change looks like comment line wrap --- scomponents.m | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/scomponents.m b/scomponents.m index e3f9a68..3cf27ac 100644 --- a/scomponents.m +++ b/scomponents.m @@ -7,10 +7,9 @@ % connected components. Otherwise, it output the strongly connected % components. % -% -% -% The implement is from Tarjan's 1972 paper: Depth-first search and linear -% graph algorithms. In SIAM's Journal of Computing, 1972, 1, pp.146-160. +% The implementation is from Tarjan's 1972 paper: Depth-first search and +% linear graph algorithms. In SIAM's Journal of Computing, 1972, 1, +% pp.146-160. % % See also DMPERM % @@ -22,7 +21,6 @@ % CG = R'*A*R; % create the graph with each component % % collapsed into a single node. - % David Gleich % Copyright, Stanford University, 2008 From b46669ac9d76371a56f9d7c9c3abcd1ae3c895a8 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 22:52:01 -0700 Subject: [PATCH 30/36] Fixed mlint end warnings --- sparse_to_csr.m | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sparse_to_csr.m b/sparse_to_csr.m index c4703eb..35cf129 100644 --- a/sparse_to_csr.m +++ b/sparse_to_csr.m @@ -31,12 +31,15 @@ nz = length(A); if length(nzi) ~= length(nzj), error('gaimc:invalidInput',... 'length of nzi (%i) not equal to length of nzj (%i)', nz, ... - length(nzj)); end + length(nzj)); + end if reta && length(varargin) < 3, error('gaimc:invalidInput',... - 'no value array passed for triplet input, see usage'); end + 'no value array passed for triplet input, see usage'); + end if ~isscalar(n), error('gaimc:invalidInput',... ['the final input to sparse_to_csr with triple input was not ' ... - 'a scalar']); end + 'a scalar']); + end else n = size(A,1); nz=nnz(A); From a1ba2540b6e40dcf3b75ec16eb28785741658497 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 23:07:58 -0700 Subject: [PATCH 31/36] Airports demo --- demo/airports.m | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 demo/airports.m diff --git a/demo/airports.m b/demo/airports.m new file mode 100644 index 0000000..0f2aad4 --- /dev/null +++ b/demo/airports.m @@ -0,0 +1,124 @@ +%% The US airport network +% THe North American airport network is an interesting graph to examine. +% The source for this data was a file on Brendan Frey's affinity +% propagation website. A(i,j) is the negative travel time between two +% airports. Although the data didn't include the airport locations, I used +% the Yahoo! Geocoding API to generate a latitude and longitude for each +% airport. + +%% The data +load_gaimc_graph('airports'); +%% +% Plot a histogram for all route time estimates +[si, ti, rt] = find(A); +hist(-rt,100); % times are stored as negative values + +%% +% Find the lengthiest route +[val,ind] = max(-rt) +{labels{si(ind)} labels{ti(ind)}} + +%% +% Some of the routes include stop overs, so it's probable that is what +% we find in this case. + +%% Graph analysis: connected? +% One of the first questions about any graph should be if it's connected or +% not. + +max(scomponents(A)) + +%% +% There is only one connected component, so the graph is connected. + +%% Distance instead of time +% Let's see how the edges correlate distance with estimated travel time. +[ai aj te] = find(A); +de = distance(xy(ai,:), xy(aj,:)); +plot(de,-te,'.'); +xlabel('distance (arclength)'); ylabel('time (?)'); + +%% +% Wow! It's all over the place, but there is a lower bound. Some of +% these routes can include stop + +%% Minimum spanning tree +% This section repeats and extends some analysis in the overall gaimc demo. +% First, let's recompute the minimum spanning tree based on travel time. +load_gaimc_graph('airports') +A = -A; % we store the negative travel time +A = max(A,A'); % travel time isn't symmetric +T = mst_prim(A); +clf; +gplot(T,xy); + + +% These next lines plot a map of the US with states colored. +ax = worldmap('USA'); +load coast +geoshow(ax, lat, long,... + 'DisplayType', 'polygon', 'FaceColor', [.45 .60 .30]) +states = shaperead('usastatelo', 'UseGeoCoords', true); +faceColors = makesymbolspec('Polygon',... + {'INDEX', [1 numel(states)], 'FaceColor', polcmap(numel(states))}); + geoshow(ax, states, 'DisplayType', 'polygon', 'SymbolSpec', faceColors) +set(gcf,'Position', [ 52 234 929 702]); +%% +% That's the US, now we need to plot our data on top of it. +[X,Y] = gplot(T,xy); % get the information to reproduce a gplot +plotm(Y,X,'k.-','LineWidth',1.5); % plot the lines on the map +%% +% We need to clear the axes after the mapping toolbox +clf; +%% +% Let's just look at the continential US too. +figure; ax = usamap('conus'); +states = shaperead('usastatelo', 'UseGeoCoords', true, 'Selector',... + {@(name) ~any(strcmp(name,{'Alaska','Hawaii'})), 'Name'}); +faceColors = makesymbolspec('Polygon',... + {'INDEX', [1 numel(states)], 'FaceColor', polcmap(numel(states))}); +geoshow(ax, states, 'DisplayType', 'polygon', 'SymbolSpec', faceColors) +framem off; gridm off; mlabel off; plabel off +set(gcf,'Position', [ 52 234 929 702]); +plotm(Y,X,'k.-','LineWidth',1.5); % plot the lines on the map +%% +% One interesting aspect of this map is that major airline hubs (Chicago, +% New York, etc. are not well represented. One possible explaination is +% that they have larger delays than other regional airports. +% +% Clear the figure again before proceeding. +clf; + +%% Honolulu to St. Johns? +% Before, we saw that the lengthiest route was between St. John's and +% Honolulu. But, does the network have a better path to follow between +% these cities? Let's check using Dijkstra's shortest path algorithm! + +% Reload the network to restore it. +load_gaimc_graph('airports') +A = -A; + +% find the longest route again +[si, ti, rt] = find(A); +[val,ind] = max(rt); % we've already negated above, so no need to redo it +start = si(ind); +dest = ti(ind); +[d pred] = dijkstra(A,start); % compute the distance to everywhere from St. Johns +d(dest) + +%% +% That value is considerably shorter than the direct time. How do we find +% this awesome route? +path =[]; u = dest; while (u ~= start) path=[u path]; u=pred(u); end +fprintf('%s',labels{start}); +for i=path; fprintf(' --> %s', labels{i}); end, fprintf('\n'); + +%% All pairs shortest paths +% At this point, the right thing to do would be to recompute each edge in +% the network using an all-pairs shortest path algorithm, and then look at +% how distance correlates with time in that network. However, I haven't +% had time to implement that algorithm yet. + +%% Conclusion +% Hopefully, you will agree that network algorithms are a powerful way to +% look at the relationships between airports! From 8a0f1f72a29b6a8653a68b3e8c699e66db51aead Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 23:12:40 -0700 Subject: [PATCH 32/36] Initial demo code --- demo/demo.m | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/demo/demo.m b/demo/demo.m index 69213d6..b0adf18 100644 --- a/demo/demo.m +++ b/demo/demo.m @@ -112,26 +112,7 @@ %% % Hey! That looks like the US! You can see regional airports and get some -% sense of the overall connectivity. Now, we can use the mapping toolbox -% to look at the data even closer. -% -% These next lines plot a map of the US with states colored. -ax = worldmap('USA'); -load coast -geoshow(ax, lat, long,... - 'DisplayType', 'polygon', 'FaceColor', [.45 .60 .30]) -states = shaperead('usastatelo', 'UseGeoCoords', true); -faceColors = makesymbolspec('Polygon',... - {'INDEX', [1 numel(states)], 'FaceColor', polcmap(numel(states))}); - geoshow(ax, states, 'DisplayType', 'polygon', 'SymbolSpec', faceColors) -set(gcf,'Position', [ 52 234 929 702]); -%% -% That's the US, now we need to plot our data on top of it. -[X,Y] = gplot(T,xy); % get the information to reproduce a gplot -plotm(Y,X,'k.-','LineWidth',1.5); % plot the lines on the map -%% -% We need to clear the axes after the mapping toolbox -clf; +% sense of the overall connectivity. %% Connected components From 297adbc8abb4f5be5ae93a7ba64ddd401ee935b8 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 23:12:59 -0700 Subject: [PATCH 33/36] Updated todos --- Contents.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Contents.m b/Contents.m index ebce84c..86060fc 100644 --- a/Contents.m +++ b/Contents.m @@ -44,6 +44,8 @@ % Update copyright info everywhere % Implement bipartite matching + % Future todos % Implement weighted core nums % More testing +% Implement all pairs shortest paths with Floyd Warshall \ No newline at end of file From 886c7bdd58e5aa6026bb58b808148ce9c6ac0acc Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 23:13:54 -0700 Subject: [PATCH 34/36] Fixed todos --- clustercoeffs.m | 2 -- largest_component.m | 2 -- 2 files changed, 4 deletions(-) diff --git a/clustercoeffs.m b/clustercoeffs.m index 5de2482..6b33c96 100644 --- a/clustercoeffs.m +++ b/clustercoeffs.m @@ -17,8 +17,6 @@ % load_gaimc_graph('clique-10'); % cc = clustercoeffs(A) % they are all equal! as we expect in a clique -% TODO Example - if ~exist('normalized','var') || isempty(normalized), normalized=true; end if ~exist('weighted','var') || isempty(weighted), weighted=true; end donorm=1; usew=1; diff --git a/largest_component.m b/largest_component.m index bef9e79..21878dd 100644 --- a/largest_component.m +++ b/largest_component.m @@ -31,8 +31,6 @@ % History % 2009-04-29: Initial coding -% TODO: Write example - if ~exist('sym','var') || isempty(sym), sym=0; end if sym From 88afba60adfe8f804d275a5d0b70dcbed3779b35 Mon Sep 17 00:00:00 2001 From: David Date: Fri, 15 May 2009 23:14:13 -0700 Subject: [PATCH 35/36] Empty test_bfs function --- test/test_bfs.m | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_bfs.m b/test/test_bfs.m index e69de29..c08e76d 100644 --- a/test/test_bfs.m +++ b/test/test_bfs.m @@ -0,0 +1,2 @@ +function test_bfs +end From 617635c4d7030783045aef084f217d688d42d3b2 Mon Sep 17 00:00:00 2001 From: David Date: Sat, 16 May 2009 11:28:08 -0700 Subject: [PATCH 36/36] First draft of demo --- Contents.m | 1 - demo/demo.m | 114 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 2 deletions(-) diff --git a/Contents.m b/Contents.m index 86060fc..faf8c88 100644 --- a/Contents.m +++ b/Contents.m @@ -39,7 +39,6 @@ % TODO for release -% Write demo code % Fix mlintrpt errors % Update copyright info everywhere % Implement bipartite matching diff --git a/demo/demo.m b/demo/demo.m index b0adf18..68fe5da 100644 --- a/demo/demo.m +++ b/demo/demo.m @@ -17,6 +17,54 @@ %% Sparse matrices as graphs % To store the connectivity structure of the graph, gaimc uses the % adjacency matrix of a graph. +% +% A graph is represented by a set of vertices and a set of +% edges between the vertices. Often, we write $G = (V,E)$ to denote the +% graph, the set of vertices, and the set of edges, respectively. In +% gaimc, like in my other package MatlabBGL, we represent graphs with their +% adjacency matrices. This representation is handy in Matlab because +% Matlab is rather efficient at working with the large sparse matrices that +% typically arise as adjacency matrices. +% +% To convert from $G=(V,E)$ to an adjacency matrix, we identify each vertex +% with a row of the matrix via a bijective map. The adjacency matrix is +% then a $|V| \times |V|$ matrix called A. The entry A(i,j) = 1 for +% any edge between in $E$ and 0 otherwise. Let's look at an example. + +load_gaimc_graph('bfs_example'); +graph_draw(A,xy,'labels',labels) +full(A) +labels' + +%% +% This output means that vertex 'r' is row 1, vertex 's' is row 2 and +% because A(1,2) = 1, then there is an edge between them, just like in the +% picture. +% +% One funny property is that A(2,1) = 1 too! So we actually have to store +% each edge twice in the adjacency matrix. This might seem wasteful, but +% its hard to avoid as I've learned while working on graph algorithms. So +% don't worry about it! It also makes the generalization to directed +% graphs (below) easy. +% +% For more information about the adjacency matrix representation of a +% graph, see a standard book on graph algorithms. +% + +%% Weighted and directed graphs +% Our previous case handled the situation for undirected graphs only. To +% encode weighted and directed graphs, we use weighted and non-symmetric +% adjacency matrices. +% +% For a weighted matrix, A(i,j) = distance between i and j for most of the +% algorithms in gaimc. But A(i,j) = 0 means there is no edge, and so +% sometimes things can get a little tricky to get what you want. +% +% For a directed graph, just set A(i,j) ~= A(j,i). The adjacency matrix +% won't be symmetric, but that's what you want! +% +% To understand more, explore the examples or read up on adjacency matrices +% in graph theory books. %% Loading helper % To make loading our sample graphs easy, gaimc defines it's own function @@ -68,10 +116,28 @@ % Notice how the algorithm visits all vertices one edge away from the start % vertex (0) before visiting those two edges away. + %% Shortest paths % In the previous two examples, the distance between vertices was % equivalent to the number of edges. Some graphs, however, have specific -% weights, such as the graph of flights between airports. +% weights, such as the graph of flights between airports. We can use this +% information to build information about the _shortest path_ between two +% nodes in a network. + +% Find the minimum travel time between Los Angeles (LAX) and +% Rochester Minnesota (RST). +load_gaimc_graph('airports') +A = -A; % fix funny encoding of airport data +lax=247; rst=355; + +[d pred] = dijkstra(A,lax); % find all the shorest paths from Los Angeles. + +fprintf('Minimum time: %g\n',d(rst)); +% Print the path +fprintf('Path:\n'); +path =[]; u = rst; while (u ~= lax) path=[u path]; u=pred(u); end +fprintf('%s',labels{lax}); +for i=path; fprintf(' --> %s', labels{i}); end, fprintf('\n'); %% Minimum spanning trees % A minimum spanning tree is a set of edges from a graph that ... @@ -115,6 +181,51 @@ % sense of the overall connectivity. %% Connected components +% The connected components of a network determine which parts of the +% network are reachable from other parts. One of your first questions +% about any network should generally be: is it connected? +% +% There are two types of connected components: components and strongly +% connected components. gaimc only implements an algorithm for the latter +% case, but that's okay! It turns out it computes exactly the right thing +% for connected components as well. The difference only occurs when the +% graph is undirected vs. directed. + +load_gaimc_graph('dfs_example') +graph_draw(A,xy) + +%% +% This picture shows there are 3 strongly connected components and 2 +% connected components + +% get the number of strongly connected components +max(scomponents(A)) + +%% + +% get the number of connected components +max(scomponents(A|A')) % we make the graph symmetric first by "or"ing each entry + +%% +% Let's look at the vertices in the strongly connected components +cc = scomponents(A) +%% +% The output tells us that vertices 1,2,3,5,6 are in one strong component, +% vertex 4 is it's own strong component, and vertices 7,8,9 are in another +% one. Remember that a strong component is all the vertices mutually +% reachable from a given vertex. If you start at vertex 4, you can't get +% anywhere else! That's why it is in a different component than vertices +% 1,2,3,5,6. + +%% +% We also have a largest_component function that makes it easy to just get +% the largest connected component. +[Acc,f] = largest_component(A); +graph_draw(Acc,xy(f,:)) +%% +% The filter variable f, tells us which vertices in the original graph made +% it into the largest strong component. We can just apply that filter to +% the coordinates xy and reuse them for drawing the graph! %% Statistics % Graph statistics are just measures that indicate a property of the graph @@ -132,6 +243,7 @@ % Average vertex degree d = sum(A,2); mean(d) + %% % So the average number of roads at any intersection is 2.5. My guess is % that many roads have artificial intersections in the graph structure that