From 378fa966862e981746f3398d69119ddf384a140c Mon Sep 17 00:00:00 2001 From: Luca Lombardo Date: Sat, 24 Dec 2022 16:43:29 +0100 Subject: [PATCH] Small fixes to avoid path errors --- .gitignore | 1 - README.md | 3 +-- src/algo.py => algo.py | 17 +++++++---------- src/main.py => main.py | 2 +- tex/main.pdf | Bin 144221 -> 144311 bytes tex/shift_GMRES.tex | 2 ++ 6 files changed, 11 insertions(+), 14 deletions(-) rename src/algo.py => algo.py (97%) rename src/main.py => main.py (97%) mode change 100644 => 100755 diff --git a/.gitignore b/.gitignore index 46be8fe..c92ca66 100644 --- a/.gitignore +++ b/.gitignore @@ -276,5 +276,4 @@ TSWLatexianTemp* *.lpz data/ - __pycache__/ diff --git a/README.md b/README.md index c170f85..a8215f9 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This repository contains the code of my attempt to replicate the results obtaine pip install -r requirements.txt ``` -At the moment, the standard and shifted power method to compute the PageRank with multiple damping factors are fully implemented (as described in `[1]`). To run the program, go into the folder `src/` and execute the `./main.py` file. It takes as input two arguments: +At the moment, the standard and shifted power method to compute the PageRank with multiple damping factors are fully implemented (as described in `[1]`). To run the program we need to execute the `main.py` file. It takes as input two arguments: - `--dataset`: the options are `BerkStan` and `Stanford`. This commands selects the web-graph to run the algorithms on. - `--algo`: the options are `power`, `shifted`, `both`. If you choose the last option, it will first run the standard power method and then the shifted one. @@ -16,7 +16,6 @@ At the moment, the standard and shifted power method to compute the PageRank wit Here an example of what's described above. ```bash -cd src sudo chmod +x main.py ``` diff --git a/src/algo.py b/algo.py similarity index 97% rename from src/algo.py rename to algo.py index cf05e51..1add09e 100644 --- a/src/algo.py +++ b/algo.py @@ -42,29 +42,28 @@ def load_data(dataset: Literal["Stanford", "NotreDame", "BerkStan"]) -> nx.Graph """ # check if there is a data folder - if not exists(os.path.join(os.getcwd(), "data")): - os.mkdir(os.path.join(os.getcwd(), "data")) - + if not exists(os.path.join("data")): + os.mkdir(os.path.join("data")) if dataset not in ["Stanford", "NotreDame", "BerkStan"]: raise ValueError("Invalid dataset. Please choose a valid dataset.") # Download the dataset - if not exists(f"../data/Web-{dataset}.txt.gz"): + if not exists(f"data/Web-{dataset}.txt.gz"): print(f"\nDownloading the dataset {dataset}...") wget.download(f"http://snap.stanford.edu/data/web-{dataset}.txt.gz", out=f"data/Web-{dataset}.txt.gz") else: print(f"\nThe dataset {dataset} is already downloaded.") # unzip the dataset - if not exists(f"../data/Web-{dataset}.txt"): + if not exists(f"data/Web-{dataset}.txt"): print(f"\nUnzipping the dataset {dataset}...") - with gzip.open(f"../data/Web-{dataset}.txt.gz", "rb") as f_in: - with open(f"../data/Web-{dataset}.txt", "wb") as f_out: + with gzip.open(f"data/Web-{dataset}.txt.gz", "rb") as f_in: + with open(f"data/Web-{dataset}.txt", "wb") as f_out: f_out.write(f_in.read()) # create the graph print(f"\nCreating the graph of the dataset {dataset}...\n") - G_dataset = nx.read_edgelist(f"../data/Web-{dataset}.txt", create_using=nx.DiGraph(), nodetype=int) + G_dataset = nx.read_edgelist(f"data/Web-{dataset}.txt", create_using=nx.DiGraph(), nodetype=int) print(f"\tNumber of nodes: {G_dataset.number_of_nodes()}") print(f"\tNumber of edges: {G_dataset.number_of_edges()}") @@ -430,8 +429,6 @@ def pagerank(G, alpha=0.85, personalization=None, max_iter=10000, tol=1.0e-9, ns raise nx.PowerIterationFailedConvergence(max_iter) - - def shifted_pow_pagerank(G, alphas=[0.85, 0.9, 0.95, 0.99], max_iter=10000, tol=1.0e-9): """ diff --git a/src/main.py b/main.py old mode 100644 new mode 100755 similarity index 97% rename from src/main.py rename to main.py index 95e539f..f03d704 --- a/src/main.py +++ b/main.py @@ -41,7 +41,7 @@ def run_standard_pagerank(G, alphas): def run_shifted_powe(G, alphas): - print("\nStarting the shifted pagerank algorithm...\n") + print("\nStarting the SHIFTED PAGERANK ALGORITHM...\n") start2 = time.time() x, mv, alphas, tol = shifted_pow_pagerank(G, alphas, tol=1e-6) diff --git a/tex/main.pdf b/tex/main.pdf index a06565d53718363d3bb8894e718a83570750a39e..7f6e9ac35c68db995c9d553a1b1299cd8af6a64d 100644 GIT binary patch delta 13363 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 delta 13233 zcmaiaLvSu^)MRjD+qki9+qP}n$s60YZ*1GPZQJI2|IE~EXZ7^cr#EMFs=BLNPa(HY zAnWvmL0K3$k_?4u0c^-Uv$b=!?svCJk6YId=4Zt67?ih!qaPw zy?&kZK>C3cUQBd(B0@kN^KrE}0!h<1W;QP`k?*^``ug8*@|9*fC0i#}Zob@;u9?$K z(@Ht_>(5p%d-LSYL6j%Je(@dfbpbR=b6L@zZ%VkK0bTE z`}H*URbL{W8(&T3^4H;WZvbwdV=7ZQGs&nKOu|2^R*_46XS*cc=t&!=V8csUS$fy@ zp;x#W-FA4+xg|+Xb+-4-EfVc7bLpJ4*ngw#Lb2#VjG2|ifGE%|+#5rg5MyW$?HX>9 zC}LTF&Y(6X;L%@qdw03p-16|ewgQA;?qqPiXQh+=k zhE6pT2IdGCOUY2gJh46WeKrMaYHM9l_gt6h9{fryT(NW9FrLlEyRbm?RY><|OVi{XFS8n$+U5!!oH zuQ$m~02hj&FMk&Uml#x-)~^xRKKq@YgLb){Jy0){M!~Haglv>tN2=6J!Z2%lJ05ce zygE%Wii14+{r5CFK|9=j*7K!y9yVWt$ac=|!11yh%S3PS{g$p${%=Hk^tFPra;O!E zN#W!^wI?#0>Q&W2jJf@#3)I6=w5P^eg%o%jz(pyZ1Jod_tBz7!-af!&f=pgJF-H%teUGRWoz0>PAVOs4DAzmtmwQ;s)*Dh5u z3)*92W=HqC6ppugeL-Z7+I&Y{p-^Pkx~2Xb&od}IqnD|C+Ow~8wHR6FG!-@6-^UEi z-(M$VpQ?Czwkj|Orfg6Z%3rNKg4pQ`z#o86IyCJI6sR6s&497TJXXN03_fMKUPayF zl4G^E{QA~kF&sVAj!<4K5KGLN}Ck9j0p3p2^<#Z~6qwMSl z`ApQZX!<+vKF$6}v%ZRuWICjjz&`nDKdIEomqWFpzf0G`mvquMIQ(o%smwJ8_@op= zsG7gPD8f+I&)X^gaVyBWt|wJJBq1PCR#YC7LI1c*YY24Jp~jjmair~uyd*eSN>Aji z%&vjw)zLU~AP8o1tR4E37L%p8LvtBdkOsu{FCMdl#J0Z?caHnEfCJ#lRm{wJO3C+r z{u>bCbG(pF7M?smY}%)4ZF7AAP$1O}mTp`D6ClSX?g*u!Zc)hnr(}Y1FaCOGE`Tme zpXJ)&i=Covrwl(f2a4ecEGytpu{_CQ=9#Ps3z8!zC&hTbhWg`~>LT~uAbvmE7OFhm zSP(cH$-rEWb+q=dOi}zwd)v|xw;3#%ah?Sb@h^<=t$zEcY@xKqi%G%)^h72F^TN)C zK{6cSEj-Pcs>VcuzYt*EttQE`-K4}Lr$^{<%7CV;8E&1HHSNty_)^uNSWjxR_{LD0 z^Az`0q&Lr8pyvHif`yGQs=i}s<;zk&Y*|Pf)zntpKC*M3QS%Z!sNIN^(2fKQ$$%}; zrN}m+79q8Co>h-t|53sQ{LpZp7rch#S9(2M{f)f>abw90^kHJX=>gKNL$iR20on8L zE6RBn#y?89&Wr`p$YgX72;ba-k0!pooEUH-(dfDMnDdkdZ#?o`d9`_rVR=c+-HsqO zH%G1tQAxNzlS#KNyEPXbG|5V2Vx|1OZeUK7w=|ITDtmyQ=>@L$yQ&=^?{U)Z&qbH19GESfd(Bz zmfe@HX7am@sP9iY;L6^{Lk6KVKu(f->^Rf_BE#oW*xV2Wf3xZ?&cled`euLaU1C<)ibHKx1S7fadVs~n4Ko;=e0C=Y+8DG`7uHu(8>Hgp92GTnKaq6GKzH8 z>dGlK9(Sg!L|^2hAZ(`(e_TrWjS4ox)H2K1c^0r2XHMh|FemmxCm(Lr_~Oi-BF`P| zd-2cm`{;XimZ3gEM3w598JIE+taD~^3>+*zelpO(T>IFx`RM1s3w}%ra#&06S4-4* z^VR);i91X9dlZz4AlE4`m+Q2cp4$ta{-xdMEU&N zw0@p;RJJ(>xLcn}f%TQ7$S%AKWzu-!)leLo3u;=?<3a=_!7RG0@2O;yhICF2W=Xmm zle?_6Z?fN9j0bND*jQA;%h7*x;h{Gbp<#=ZcCdu^E&*pJqfCMWnBLWR$61w=Ejq{7WR>m*eVW9DxTENV);ewcj z`KPtNY;ujiy!6=IoJ!|VX2lm`Ap!#A9*_1N@}=EgUr_XBQ(c{rVuI}I4o0?@0->%H z_Qg8@mEXwv;h|?1$4i?PlM^c_3Z#=m>IDf!9E%32ER@+{tTfNoKU%PjBrN>}TLl*^iksF_xg-evLT;4mST_MG!TPlc-KRm}Dnj1Wn1Y_8C zKq!B&rFW*mM4E|~T5z)t5aU0pVbmQ3h3*ERi(w#Vj6=W=Q@I+D&a=;UMM?u@gOM=e zcx)#&2NzcnRa75H2l$WvOyJ?_l_e7nUOyEQ;Z&I3*MW9L3ChJaI|&)H%8l7KN!$zo zD4E0pF>gal3#T7?MTTqAbJTVdp6UDg@qwN)t>}+N*M|oEZmkarLxC9go+@n9btUIT zyw!8m@U03Jwi7Y2F+*DpnkX#9ySMHmPn&4HB9plqShAEZ#ul=pB+7}M93A)ylBkYM z=2i}oVS0S%$U|gADHNWd{ti{c==|Vo6SJG9eEfNrS4RHe0u};Z@tMPhIBeLMG+& zMgyv1rz+=UJ=H?<4RUR6tX&%3S925N4z2G5YD+7n(l$X{U{Dj)8_^#!Ab+?4>s?5? zUkciSQ@!C5IuB533@yCfxG9u3nalo_N!_Z_^Jt8%4|f*9EnFPgpX({^i67-EcL~sc ztj#MlPIL%#7^`ZNT^~CCQLQhVsoz}ou;z*BWt1jfD(2U1f3z&E{+Mxwb2^6{dEWG2 zytb>Uq**4)d+Qg%+xJv$rl?E++_)oVhn=wcQrO%l$v=pz{yc2Ub(`-{liYGM{%krQ zL^8P@VUS$b3}sNCWZeuq4MowONxOD&KzsVvU&FgqwRI{#Dd0<`nJkk;xN7p)>7bda zvwSMgSFr)V&W-;&-`|;;){I*hBI}o+4}qN&!DuJBO&)XlGRb$yAVhx!bh@jk*VB|M zcozT_2%9zqmmCDR&D3P3x=)x3Hs9W3O@7rIgMNlpycE~%5C90Q_}3-Q0{;AIpkWq8 zY8dXeOW{SN;ztiLr zC283uZ5vU*!T&(Sac#E;T&xwaLMl=05FdH-cbJrU-J$KohSZI^Hb3_<mE+#pdE97p!!+zRxv25JO)m zq!nmwbw3x9J;P+B!Jh+BU;__>`1vYN70vyQpkGGFV)(8$s?Pt=qjFrptvcQo%?7B7EZ*|aB zjDH}T&T)ccP(~J#h=GHP5D0%ouFEucIEngCEmQ{heN?P`dhjCV;-*qQ4?{Ue)lnE|)MZqkpeRwD`5;@nR^Dg^gY zXyFR!r&{PVBfeYyiMk;*wp1ou+$QP2U-0X1MbRTfhzOnTpv-Hp|I|)^nCq$$Fz~%R z0C#}C2@f4;Q#%u97bjCg+y6oKMpn>lgbalL^YZXC>M77e(`&ugVEF+%J2=61`;z?jY8M8%aFMoxk~W(BI`jM@z-n`GCOLAUfUvP7&1<26GB9%{8UCRF zZ0krnZ~bTHKGmlvC(EZD?){3b5Z0@CvMW?fQC4sIUjh~skcp?~7{wcM^n15~Bm!~c z2NRA|+~~0*ZP@(9URM!-NGdPUG<{zKgLeU4UiYo`w7QCkC^bVD%gYmGI#tPN?Z__A zR-IlsXt%4;CdXcb=~HxCL)k`bdR4XCeJ+KSFq~h6>781%ai_Lw z+m{P69{QUa>%II&Xvz5T=^1{{R<~M{=gtnw)}NhW>@~ncHOEHkWVdyR+ce9M-tv%7 z+4MxoP%NI7+49b>9~}F(Lk%~21bjsFVT{lB%Q6CekLUA2D+X$?xEjltRMr-tZu$6T z__EccIRt{gN}{G(&)31EGi8s>+`+Z=<9N6?aO${z3hl05@TA6E{GlJ_3b}rc^laMW zrg)~he})skw~BJou7cX98SmYle}JDK@Hn}okvx`x85g3>%!r=2R64XqGD#{i^n7W~ zPTDIde&Z;Rl1KFRO1)Z{y6ORN5IRjBLz~2U^x0vM>q4bqWIPT%#-?EBJ(s7nw8W&c z4|z6CM47Fgqa7DkI^tCSKt-9hk#3M?tZxTFipwZtOo}~%ORBJ!I*qhA7Z;(3&N`9u z8lYOnhHy2l%(YOgW!EwV`(j-ef0NEuf(EzBu<}32URz95r5zt#GB5$y!6ug9D|jWs zot2bS#>{}taWN&P(wBkGlER4Chm$nfE{-HSltbMfSGhF2_RYC8Dw1-RXG^yDBa!EP zu$1?}oVkeu0g1lJZgTNYU`NPy3j{a0&(bg4g*# ztaqSau81%>;=0f+u(THvH$ixp%iQ(|KJVdtDUO-a5Md}v3?l(?Mj$>*ABq)%*Ut};iRulLhcbuqlw&1lqF{e0%D{f8T%@P zu;KSA;Sr7w<46DquZ`JjA7E>aINFa%#Nbv#Tdarh-cJIqID>2fvw^Um7+$DBBPj%< z*}Z77$iL2}p*v+k&5HS9dLwjDPeXxbp9=Kx+hk$1&Lg9SH}z(f@Dlcmf~nE@FTa!n z*i?i;EYqUv`Tl~&^tW4k_xdqtco^WPNtKHbXoh=$d1?z0p zSUjaF(?$R=mp+$m*MBhwd(yPB0l!?VwmXOe8^}sY;B=th3+7aR!Ta)0or1%Q5W@v@ zuoB<~=Efzd`DQkwe1CXOArIt2jA6Cr+)d7`Y*OSTLPWW?oCVpLjHe>{3Q}x z>I{`Lgcm}@&P}d_WVu-99v5x~1%@QU<#lj5UdjNDHsemx0!+Nifo)7~-9=@qeHMi2 zDahHSD$a`Zm?`n%hPMW5c+6+TUQ1)*=tu~-o{g&VE_OV;OXOgNXN1{36}zpf`<+ei z{vgz@VgmW07mTJ2t&b&z940avvcT7ke^cg8*CuAIC%RLvc>8?eKv~y&XgPLmD{J~_ zeFFg6X0?m!d}Tn_TtBzT7nM55Ck#QC8D7L4o)|GLDm7g|t>+B136|nuY!XNLJs-Xm z%zSbe*UJ&ui{PL|YZL-Bo(*xZLv;Tgh}e12@?x3L6p%4)Q*~+J?SzPAa|Me0#qpU0 zlX)rwnvY}y$~7KW%e>MqN%;oI{$FNlmnsSMOJ0SXQx9;5 zRJv+aSWE^*E_BIQftMx*+qW{l5DwCZHn=dxOhcFh3&bhIVXwT#2Euac(R|FBTt?-q z11)gG08_w_|o8N3HR{B!XMOtKB*>L zBk$(!Fz_dzvuKHmC@TN~2H(<>hZudB*@!I{iP+sn3`R+i#y$P>S90e4Xqkwv4F)KSP;DQ+9RcVrt&w z;bAm6Z0U_R@PN|)M3NdAqEW#Qn#u>TOILZI;LKKV5|s}M6JD4Ox7t8tnR+Yp5Yt?M zKWf4=XeTB$%g`Py1aa=7K?i)bSyStrI!ur9@2_8jLv6O&{YuIA6m=XY%p-%O7ZyrK zO-8mc!h#LS!$=rhY(bTEWTv|pT@f_!u(uW(pio0QB_p{HUuQY-6Bq?{alm;q1&%8? zVr%>hc(oxS)K|=se#WwG=E8biD;Q$I8{$>|=Q2Uq{1F7L;HEfQF9u+^YV%o8gM@r= ztU#md{nC7?Vh{r&V_nOesa}@fYy<%UEkFV_BZM`Yp-oU%rXE=uYb#@LQ1-pdw`8LG zl$TQX#Xl#b`jQEB*?&hq&(wKb4}?pi(EZdn-zjlf<+2IO)}`=rx(!z->L#XFHiJMW z`{Gc_al=YI7V)1nKm?eEqk|k55zgJp0W>Bf>JrPl;?7S{>fTM+Q-}|9%P_0L;B~;8 z?Qj+fMe75EV;HQuoaWbga;PT}BsO86!}lmdj?7DAi9z-3_3EN9VV1%l88+ zI-AOIvLOGtk-co&V&gyaWgJ|5G0IQlmHtni3h>F}p(D>A=?#cNTqQuG2(PbJ@>~HfrH^&De}My+xoZK&_3U{V-X94 z;;xmWq!+Cy`@9nz+o!U#zz#KIzE@69_=t0D7`r%RI@ZOsYi!h>n7Wqbesc*d7aq& zx3DY_yU0d$Kuk7*ma$S2U5R82JM^3N9DJPPNW=mhQE_r|c-^KzQ&n*9KhDabgRSGP zhTuKz$_=~ZM#AgrQ)Y!icIS^(`?QtZ+Qtj6r^Yzf>`{O`3n!h!0!rFU>USEgBAgf} z%mNu!N_@$beTR}O3^)*4|RRd&q1$}&R*^44`z{tPd zv>T1LPpDy1x*w9$kpSu84kQn7RU&i&Y1F zwf$fPxzB|XWxuKq{Eo5oVd}vR zJls!O>BTw@sX?ECz|=|8vjTrXujA-bz;TFiz*@U?PbNnuotL!VvQ?CS?Cs8WN~hE9 z5}RKGMSC};vXa5nH!@;NNaq6zY;_F$o)4dC}D_hT~$vkHpNb>bx0L+D|58N-mtPhNB)Q#X#eF6GgRuE=sek1 z(6s0u$zC~{V*c;@)P)%L%iYc)>sQC%4#53}(=`@5M5*R*L6@8N1|MlFs-}Bvo9;7Z zmNYpvD#t?yBmtU$UpVmF=f?h`_Sakxlm7~?U<8UkfYKe@@f=x*Y(hrErl`w9z~-=Dj$Fo#RlQ?nIZetEAAt1fuF<`vT3AJE8K zYWxf88O7n68u02}i*HaioP(ozzWL170-A606*EJ(-$CiNUlHEH#lGKWYQ%1oDRhVSiC+FaJoPAU!#r=*#EX9hLkriP|vzo7?mr7w8`iy$M& zUGCZU&|y`U#h#xaFfHWQaR!1t5HJW}sJWQ4!??RsXdMe%6c_03ARK?ZyoxZt)p32= zn0=esb;fp&YZRmf-5!!xc(V@=riHrc=@j!=dr4oiq{LxCp7lJm-{xki9DuCoTRil1 zJV(tx7bj>+hYdNN)o%}V|8GxJFNfYv2kn-Z0JtH6Ct zP$mABBH9>6K%N&7hIo7a?jed5QzfCU-i=1c=&u?YA!J!c3@3!r- za66VcQ6hY(;XNXSP7Fj1zP=WY--W6>A1nOM{g7X7{g7R5+tBlpA3p=T&(M$X{`dYR zKw_v`=TH62R<>w0^q016fQoKn-okJlrO$iJw#zs+4)C*c_#0&w(?t**zp3G%Lq5{* zi-{sj?mt=Irn39fBfH@JML7(nIR;z2?7`Tqzb)$8>1e>U-A^PtSvU4YzmdXE^5>df zkHDms{5(N;mS4>D{hc#3x-!78o3+6GrpnwdL1}KPD3uD%6gsJ@fCBM>Q&&t=a#@c~ zOrLCX6c};0JB&%K#htvO2Y!xYr`H@KivxHgCn$0LT5{U<8EbU%0SU9V#rjThsk!`7!9uYcf&u-J15N@G47G9SiJW z9hMzcEc8F9d`AfiCTR%3xNu;+^Gq=FN1~t2#lDcp2>(FWOJYEE^F8Aj^E(}vJHlVA zrLW0T1cp!fQ&dF7bq{Du)td*M?LT(LwvG-H_-_+8>T16il(MXA`)ZHSt-HXP#Fp^~ zuuczu!2}j(ul~31XJ>63uy%(BW^d&3`i28$Y2*mk0|Vwr1I7SBX{?Cp1_5Slw1~%n z0A_9sPK$>DW^F_(8u}mkMtv*{2qR~sRd<)*e;V@NCOKf{)-73JRz6_XR^({lZBJnK z);lneBG9y3Fc6g15-5;bkhDZ75Y$#nSdeGnG&R`&SVwpeE|4@m`2S!JB8VnvS|#Ft zkO~!K1tbjv6-2953j-t$BozY$t@Q^BWEljQA#Dj4B=`>_Clg1S4ju@>|3LsekhuRw z2>2klSZvVrVwO(ME`%Ix|3Mj3J98HcLKapgw*Q@MTx)APZ?<&!zSiy;cXN}4b32kP zmgfvflBb#3lv-ZigVN5o$eBncoUyF;{#1b}A(w00lx`z<&#di%4VfDHV)y`2TG}R( zE}V;;@FlE}Xg%nWjqL5L4}pg?N@ufid=7brHA;0&p`6PmLPUJVkI9^RFBCN-QtT^g zL$F)|?$;jL#ku(o`|FvTf}P`i0#gIwpr|TogxUG_1~gEO!6n7ZN8rna}6yhQUIq15~M}#hKkaY8c1sOvoG!ZEAR=GSE`+8JS zFh^^BFiDuF91adO;XKX}|5*A2jC}20RM3&rz<7je8uLN31rT#N$?nhS|Gw`SheJP% zGtU(O5v|5IDp8H|T2lh4!Rt_@{jtW=dXXH%3y_pbG+OA(#cBwXGeIAX(KAU^HcMs% zVBuWMN zRFo~m|3wAEu-I;>3vkmwZ^2G(sAJC04$)OXGV{C$7aOIDCyGI5A+3c45?rGQlR{R4 zz#OdS9xb&1Q(E?(Ft8v~CQQPH7!TkEP^JHEkKD#SL#vq!n@=Ws>r)+j$>mv>9$LJ2 z;Ni_d?MB9qCnb;YP*+jq#1o`HxPGKxj#{iJlRAT8ei^#=P$8AiB{{&{0Jbu&Hx4Ie zp~Y2RrTBM3SNWd18$yxso)d*!dFvBSbUZE3e;whz=y=;ymFVp6<(3`Z_#mAE(7D=2 z%8zQSO-i(=o#c%+Qb{SY0{<(<<9$$^9dldK?S!r?H07oI0x>-QCha6g6AO*K1lB=W zQigL(Fo_o{X3XM>p95b%cYfEk;7ZdGA8u@XYR1q z>+~o=$nrson68(JWz{ZKF0@guqD>{8>UGTqat>F)#OwS1MT-k|)&GvT;h#%->awnw z-TQlQp16s6V((%_7&5=@;8EXPEG)^AMny5(Doq7}yf3jq+N++WjlH!3xKjPLwYE{u z@^zu#{nxuwb6&d|x2&J;y`-PVYQCFo>a527u&c7Z6Z|zRGD@7OFmeg0S!@81e~7Av z_fAX(EqdO_x^i#r8UgJB#B7o!ReOMJQlx3g`~g6Bik#mPbGuOKFG26C2UF*YSr!s( zZz|Nk1f!n@>ZR3^&ZC6=#S0&2hM0fWbxP@G*}c*$+Hh0Lw=Pa@3er4N!9(R|{^2`E z&NEGu-1z2tVc?5x!glEnKJMt2bl+EF?)cKwhMKNpl(MVeg?zgM4tw>wI6eJ3c3lH^ zwpO9sq!yYz(-SszW=DnxL&PyxLV_$S3G%bYS1ql-?@w6lLS@IK8wSU`ZT3;oKgY}@Lqp# z6vMu9%ZgzB6!5wL*y#p<`ov31IGnXK%G0=g0zW>52o7Ok$;GB9F*rviRh*{{8dc1H z>I>v=Zmgek5}S}8nQH z_van`-e%tXNULUqE?A17GrX#dn_U=XoT#K@W(X>^_xTI~&-^5t;?k7*X^GzP$s2#( zKC#tHO|q33RsVvwi%W`-I?B4lC1S&~eua@Wf6A*yr2ki<*rMK(F)r#R+CP@(A1-xG z&@f}_?va_nxEpGGc+6MN?c(S#AUK7k^?CRm{VhBk-f4&V>xfRB*GH1nmN~}aevdqv z!%>!>#OD|afNDg3nwOg9?QYw>xZBcNJNK+<_iW|l#P~E>S1aUCo}NE-)JHcAS1*@p z%fJHphO?^GKhh#=AJ^m%tZI-6r_3l53_fm4s*P{knN93vZ9v(thO9Xs3re)y~53hzRJlZ4YiF(0vPLdjsSU#`ho zJUA~w%totgB`@ifx;AOCOO#gZB(tyV9sL3*!r9jIwarbC+0GkXVhWHL!sf7*%MNWm z+=j9~$4P(2RwXTBOHigSI^unosE9AkAt88HG99k!RPuT^&UIq{G`(!)Q8-Qof{MiwBaQkOVjo| zGB$nk7&#^?Bl*IPfS&gsF27Ma+6_|!(C|9OU5^wUX=-kIf1)69yEE-*Kmr-IzK*mh zMfsx~DSH~Gupu~pjZ@P1W*9JMMtrnK*cDycZK!*|SnfB5=q|Uogv|I|VP!>mGxG|#uBUpT+ z7swn|Od@dcXoaZ0^5|LJ>Yn>4ieRZ(cY79=B{;IE3S&mR1Pp9kMt9h_iyDh7hFHw& zIg2)H)u^mcas2WV)OL`be2cq)B;?%F`8rPYAOTVFW?^nf*0O=*_F-Pr!T|Ado?L57 z)0j$f;behBo^nl3)P(3;x%US^i1y!%iy7%EWR&g!p2F~D5_+Jp<%h0Z2nk{IkZv+u zySFv10;jdV-6+1oaEY9uk!?DCj#Vn%YL4|(1VqL0Jx^RU6go3c6~YVpQ?k0wV22!}TaDuGShcX63^+_ZC88g2MXpp7n5lk_7k zV;D_un>6Jr;z{~vPYpeQYTEL{hufU~j!KfpcYT#negE^s^?~1npVsW@>#ET}2zwL( zTxQl=w0mRc=4PPx;dj3c6HN~tGgTE&=hJ1_9N_6@l|Qd~?ziJ8(8W!mu~`$mt{t>z zY=(1CyIr)gq1wxp@HzX}Aoa<8j6O6eOXxp8^S1^DR()$HqM{9O8N0$~($xF=@-ui} zd1E2pyQ3Ey)<|0c4q8~!f7T9UrHR<}<|}S>O5FUOnxKcST=H|QAdq1RF^${P~hjnjk!JDw^)ZQ6RJO4))gzogoECQ!$?^g>F|QKy1q=XDgYQ5%HIr54w(8%!p>BNJ%DjWTOGF6l!=cDKjiH1+FhbT9IX` z8F^7#-v+ww>#&U@FMY51McNZytGhBNtN{SLeZ?)hJFm!3Ty`2VZj1TsAkJ3unAjfp zW_jeTdn5HOn;{G<4t_ZfepBCj#rz^1$dBc>qR@a_tIlazqIT7+GCFaD%%_>1pZBlh zNdoz}*%=e`D>JXR6dTI6d-GbSW-FMuLkc*2=**XPkb+X1 zD1YrVIf{0NAkJuclqRp7}GJuyndKZ zm06l!Eo`Yd%;@}9F`VXyuf!Bed202fAL}6xSy7E>b4t~LFP<77eULmV=2caMV>;G5Qb{`0y^;ke!jP(`qU>6|K@`Oq~cS z-wtKk0~M;pC%`ony$C9e@F}%#=01Q?z^H=BeUIMxh2$TzDx4Cq!Z2z7 zMhwq1nFldydyg~8*!_psjEC~-BDM6q7CSIe0A$S zIe0{$s>{jzVjOHx#?hK!3R6I^{DE`gEe35~=+SJV=f2*o1D0WX%I?=FqAP0g$}T=VVTSDA8~g)IxZFuG3OV*Br&#`&vpDFQ5eX5~><8bBMf z9A)>m*3=()wVm^>NA;tdog@_3LNE}~MOX7jAc~n`s>LLWAF5%MEL^CAjxyZP7R(;i zz{T~rtJ!Ki0gp^szzO)bS}_UfU6#ITBl4ZUXyf(Np16^Z)ET&Pxz#34675^z2-~fb z)rLAe#4w&3mY6bSRe(*L0_^2!5T#BfXbxNVc#-ohsxi0U>cmTqTRIFNqTtX4wH_nC z$Hg+Y9-W%izRmc!dzPfvhf2WtBkL7)I(o?J9DNVU$t=aCn|B)jtJv~v(m7_F z)$Pfu3P90b_+6CTwYYEhy5981s+Mnc;E4X^qS0o?DouTpP(HBad&Eq|_OjFSjcjd% znc~nbV0|9`KpIuuY_RajGJwOyr(1ngW%AAjpRW0&k^-MK4@~n14n*eOPmRvFQlI>| z><3Kj0HgbxKmwoRI%ysh1%#C`O@sl22*9KZO|NX}WlG4z$^=cXPN>aD$V|xiAE{(- z??TAL!uelOMhTi;($38OKMBMC{fQ82^N6sBFf%d>35hbZ3oFfsf`F$jw= zv57H?@)7?3CAzTxFKuFDW=y+h0HFdbP1;8rqK@7>?__wEE>2D{M8kKN&BJuhdzV%h zszepgi8iCc;oL)nr)X$MphSdUL*b;h2-%P#LjeLri0V;cxDVfRr^!!w9=m3}IeXPa zGOZHAuYX&^+c)WBh{gh##cZ%$Ak+?5-lF}lL`Q|3qN;k zXd6lvNwwWE!kfq&OT6}r1=p~)JV&;=Wj|giijuvr6?*?}3e@2YoiW@mL-7%Ji0y(I zcMf?}QA`YTo1IlS#|DwD5$yx2`_Q?iRsC%plA4)SHVYtIH7b>^{mr!GS{9o~*CZ#$ z-6GvEn&!C3Ewu~aHVoNa`tSi1gL-GdbZ4RX1}2WZQf52+P=it4obQ-Z^Dm0;S)a{8 z4nXh&h_Hi@Q+$kJ%`CF!} z#Q8Pwlf>bC-upeG>=BIiW&-4XXZZZ39k6QpL^V{-I}cCaw|wp}4A20ns#I}bt7vV| zt9x8k&byF4lbI7+f$HoA!bL0cO{xAY!TdqXaQf0h&_;Xxw4l!d$T4471@-Z#od{n{ z2NrMwkTFYGn#>Jm#p67(CSzlvXsS2A_tv~hf5s(Z6EKLWR%#yJTJ8Vxi3wCyHMAdD z|EGy(Gg~CQc_WQG3fsV Div-{w diff --git a/tex/shift_GMRES.tex b/tex/shift_GMRES.tex index 800805d..c43f2a1 100644 --- a/tex/shift_GMRES.tex +++ b/tex/shift_GMRES.tex @@ -35,6 +35,8 @@ The Restarted GMRES method (hereafter referred to as GMRES in short) is a non-sy \noindent Where $A \in \R^{n\times n}$ and $v_0 \in \R ^{n \times 1}$ is the initial vector. After $m$ iterations, the Arnoldi procedure produces the orthogonal basis $V_m = [v_1, \dots, v_m]$ and the upper Hessenberg matrix $H_m \in \R^{m\times m}$, and the residual vector $v_{m+1} \in \R^{n \times 1}$ and the residual norm $h_{m+1,m} \in \R$. Starting from $v_0 = b - Ax_0$ with an initial guess $x_0$, after running $m$ steps of the algorithm \ref{alg:arnoldi}, the \texttt{GMRES} method produces the approximate solution $\tilde x$ of the linear system $Ax = b$ that minimizes the residual norm $\lVert b - Ax \rVert$ in the Krylov subspace of dimension $m$. \vspace*{0.4cm} +\paragraph{Implementation:} On the github res + \noindent We know that the accuracy of the approximate solution $\tilde x$ of \texttt{GMRES} depends heavily on the dimension $m$ of the search space. The authors in \cite{SHEN2022126799} propose to use the \texttt{GMRES} method as a preconditioner for the shifted power method presented in the previous section. The core idea of the method is to run standard GMRES on a seed system and to approximate the other solutions as by products. The theoretical basis is the shift-invariance property of the Krylov subspace that enables us to use only one Krylov subspace for all the shifted systems, provided that the residual vectors are collinear to one other. The algorithm proposed by the authors is presented in Algorithm \ref{alg:shifted_GMRES}. \begin{algorithm}[H]