From b143aeffe00bc5ed20a2bc91d94e427b705c25c7 Mon Sep 17 00:00:00 2001 From: tl Date: Tue, 27 Feb 2024 15:21:28 +0100 Subject: [PATCH 01/24] Add logo --- docs/src/assets/logo.png | Bin 0 -> 43928 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/src/assets/logo.png diff --git a/docs/src/assets/logo.png b/docs/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..92f392792ca1dcb66048dde4c4a2c94dc9e46f7c GIT binary patch literal 43928 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%0Ds@ihPNcjGa=Q@Aqro!^U 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 literal 0 HcmV?d00001 From 7daa6f905a2f632bfb981f018568f1977890025d Mon Sep 17 00:00:00 2001 From: tl Date: Tue, 27 Feb 2024 16:37:44 +0100 Subject: [PATCH 02/24] Update logo --- docs/src/assets/logo.png | Bin 43928 -> 46225 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/src/assets/logo.png b/docs/src/assets/logo.png index 92f392792ca1dcb66048dde4c4a2c94dc9e46f7c..78999faf8cdecd78fbd63524a8b439af2518ddc5 100644 GIT binary patch literal 46225 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¥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 B!vp{T literal 43928 zcmeFZ`8(9#A3yw(PzjZy66$S`5D{W%luBcdO0t*i`!@EWLW?Y8%dTwM_uZfrjeXyS z8L}H=tYaBt?$`ABet*0Ffcv`cT-RK@&hk9x`FL)Rb7stY9W7P16Bkba0Kf)+cuyAq zn0e^0W6WR+b1ADB`0J?KUHIc;;E&%ii+AAjap#8yZUAsyfc|3e%7S@LU>pZ^Jd2|Bl?zAbjO~tP^ub?!_bbFQ|u?A+aU~nHDio+|Mnt z4KBpKxA~wj&yaI{*nT2hdH_f9ZX!+k7UDTl^Zhp)I65hv&uNv7vEau3{rp4V9|Hdn z_=mth1pXoL4}pIO{6paX4+xZ;DO{ce#F|~;xY*ek2#e4d6q9O5BO9TFQHrQp4!EQC z#tft<3@-$T{w#urYr1Nn1W+sWm7ef2K}?1rfgirA>8g!tt9L)q>{@mm)0eOkDS)zX zw?M8`ZIj$6GieD8vbDm|BO*X&l?*(*bCy~t5Z#~Ir4%9?4h9#b>9(I^IyAR=>&*GRkQgV#jVk2!` z+~9e0NrsOQW(Tzb!#x6?F_YmNxsaV4qKWrS%##Gax^sa`<*KNU(G#&%lo)Q9z_zCw*y-XjN&aeVoT#_QTRS#JtuY7=38w?(xWxuMV%0P zKA+-=nAu&IaHi&FS)sibapdEJzlM8I$+x>pf%BvLka!{Qt1YAmJVf3p`6WYvSdO6g ztrpXt*x`@xBK0z#U4bK#Up*2Om;dC3HR(4dSu{;Y9BT%i3hq5aAzvMg2+0Y{+plpR zk&M|yDSlqxX_JU4 z00OC)GP|L1mjiejLPbq{ZlufvL-Z{+x=sWpxH}8MTnC`mpYz2N6m1y;V+mhR(tc(6vy=4T<@4>yeVO@CnX zq0EYMK+Ch}S?p4iN|k<-RvFD%l_h;~z=krDQn=g$59eE(00#YTVK$eVB&rJAPz?^v zZj550puIE*xOh_c@(z5MT?POW$7Q0m1IajEXg&+-((OS2c!nB+H%1>qUs!EFL~(|K z$4GT@tyoXGPm!#!yj95nqZlWtXQMG}VZ?vEr4Q(stb@p9(Yl{Kq{?8vw1hDP-hUoD zYq-?J!=)P`EN}k#22gS|K8NP`?4eTp>`IU&&^wuHaEP}atqQpD8vESI%j}}GFJ0{8R!k@>?CaA zPpjt|O6`3*4(#tLKkcqATo{=I0hQzcxaJ2TJ=wI|&+L_AW}6x28G5^@OUT-%%acUa zBg)?|74teZ{Zn+6q>fpfZZm?hcrsl^EB(*=K`a6 zBV(zUfxYdF)^Y|jn<6z@O7GXz@HP>Ku%+lFfJjv2eZ+>d1oDo?%&u=W?HCT7b7*61W-sVzN8a2$sQW_n z0$Sbf?wfusBot+H9x*Eo_W9$;Ojs+6;y!P>Xg@jqK z?>r`D2^qxxsIB7C8GzN(K6|0hZOM)q#&*wLLjBW7s{V1dE6ew1N&p@yZ@sJ?_Van&_Hx&Nd4t&5psl8b(7cEW zo^t@UMutk-`?B1@ws2Ik#%6!Lk~ow_e8ALv#0V5hi}aw&knF(@(8Br49PQ`=B%_u2m}dx-3Rf=_+DGn239GLhAo&tEP#+YOl4PMt5(2V&D@YLo(tDaGfN=%6 z0jkN;7kD^n^5}p=B8}ljQHPJ5ylT!^cnMb@6qSsxX9&FD;tJ0Hlf(u%q$H1d@l{e8dWY?#j~C=j7BqB! zB~~WXI7ALS|7mEH8tR)yr}boEj45jN+GK$9A`LP?!4u zj(-M@ceN%l1KFJg6ZyUtvbTd+CF2an_}}kTosTRD;=)bT2c3o^8CqR*z@cR~%Ga@H zftLxf)F=qcjw4|9VU)i&5FBT@#I|ef1EMJ)OLjE7SML5a@Jm;Jih{Zo)A@0+$y~7E zfslQAu>LmKOZYp`lQ7x*&XY6=G@mVn0na`d)ah9*6@+PwDzg%N3Spu!4RR~6b z#H{ioCmrHe2MrWNn|p`1KnY})H|wn;e+h-ofA;?)7HV(V{{Er-zJ%fLA6HMy{;x;y z2mM|R0MhS`{;whC7j>4vxvgSVwy*fGGzu%jQcDt5o1P&-E4iIpF4J5=V!`&od06ysmO{C|jVO7)Tfue>_O0V&A}P39cO=c=ddFJn)hv>*gIRt5ao6iI2r8C#f(GWdoipEk*0dc!OAFkPzk%5L_oSQ8Do6;Z#Si;s2p zt@-$fuXf)fIhubCT)2ASb6;08S4tbKd(pzV!?8|}pN8&F=!aXCK;U(HP>~df;F1<0 zGhB!|-G)@%8s5=M+x56nM_$L@p!Oy9sZuT&V>=edO&;(Ot+x71dpQS!8oMd~o@I}PCdr)L-?|lyfY${}7F58|`W>z0tsUP0n_qKMw$?+*{ zo~5N_Z#87v&x#u2x9~m!KPj19iN;ytnVKa=c$Y1#LxWB_z&?K=vZU@>N$OSc{+^19 z2n}BCoo_m=OdJX;@>jfj5;oBh!lGI>{k;!K+imGPNwc__o8*5HfHT+Yl~KcZ%O}BC zOIS)7{Wtx&Ym2vRu6KCsg>}9LZ*t=pV%v^JQ+=l@tC-ARNDbig+hXx{CUR^{jguC> zSHga`5co8jK8)KxPof#fbN0!@xnN_a*HRp_9V+cC?I}O(ODAy&rCq5Bbwis{9v_YS z{r@b#by*gMH%84KLJ+Yr_4}2ytR%$b0>QxO;4F*RhvAiaQcR_xHu6#7wqQr&4wW@k z&S5z$B{X|hUPbSaHgtTZuO%a6Z*_nAfUwWDH~x~avE4R2*9g9#1i6E);+3RXQE{!K zpC3LIO4uBLopg|kT&mZ=Y#E10`NxYS>=(4n{AlKy)_6|A3}>{ zO~h*LZB+4;%|~0|tEVwER^Z?WznbfcHmzj4!eKMHFfGlvYD~OmY=6&tI1Xw>xd64y z&&5{VDorqHisy%sTVhbY)k&o@RtlAybK|+D*U{55R$`{J{l{calm>m8hW!c&5;1($ z!5bhbU4<1j1R?4iB?l)ocBL-4=TwxJ@J0w4M8`-7)`|)uJ_#X;YAi^q<9y7$Rana& zTrRXX=?P_9uyR&V(Ax!tMxCreJGjw<4%Gft{Fg7HRs0tla<`zSd|l1l3x!6tMMMW+ zrc1PE(rrzd@hL^7qie5K7Wh{!no05KSq3hrL3!H>{XI+`LEum4%*n{eR$&|y`~sc zeSeQJV@g55fU3!6S5@eZ!*^``qLwi}XQ-caHLCVjWNK=anh-n_?!}E@1$7-B= zvv@wgweQ*HXVP{{tA-q8S2H!M09_6(DHvw33i0W_;GUy+ZB};C!={O{WfoJ~3$C_v zqs^HW7Smo83ceMBCCswYL z_VW9`lTDf~B@TM0SU767lD1pL^D+J@C__EM2dyqEtHOgH{tiw@MkmA^~%fQCdPB;=BHPOtBY=XY(KQ)qE+WI%m+(wrN62H`FO$bK`zd`@GdVHbp@RU+N?_!n3_NYp^Byz!GIVj=LG; z56d!23n&sd*hxsbK1ush#loPNaBkD2Y(|+^@n#lZAKW{(rUX8j7QQ3Q9bkL- z;hbX+i^eV1+a-j-ZGyt)z|y7E=N#Hn`9w|5r-gQU?d{K(J>CfF<6W1jMc)`(3tzFu zdmul5r}|7@dZcR-o0zb^zmQ$l2&o=K@hG5uT9!IY%j<}DDthF2nnwSO%dhb4tl&kr z*L2&b;p|FSS};&B)E8eeO;(tnuzKcBQ6_8#co){Ev@Zl22NIqY>h$Ryse4=_19g%>YM zVdC)fFe#)4=Nf!QrC?Kk_K4!umWQ(3vsHruvDW%X|ts1}r7iF@cE*UVW0;^*1C zOuyZ#fmMo;TEqJBQOIGybQv+*J?Bz%;(hph+jRHLqyW4~T!w$In%|y^`6b6IJ5IhV zd%e{BjQnn4B=+`bP~C^-+_E0&YW5%aedS&sc*XbYoe#Fl@pXTKu0SAsFLM6YJI>%ggOx1IeQHcUGCu`m>H)i^M8!09= z&4d-RjyFGW`Tir{Y8#rOhw?E(Ejf_PXYyt6;usbvBl@EjZSBzxDEgC%{pX|XzAcmG z`zgt&*-?mL1v<2Aej1`bs6|7|H6ig5RZ7g~lWcXL_M~|@H<^ZOFR#P1E79+}GG~3W z=F7ASNlBF(tUHxTET3=9o9zBDw&hj2p4A|N*~H>nEWsT5GI#Fl7kfr>||c^ zfa~|t5eFt4v=+J>BjX+;t7j-uO(mZLHh4^yn|^3);^ zDmfVy4{ptK$l{6cwtvLQ+vMpXZr-(LSl>W$;pZI`FH6T1kKSf0#1|a(bSTqLHVf%u zTFPl-|t&3)@nL%R0~jYbh|M|RTtStP50M(ZRgT9Cacfw8% z(@R5ox*LY@>uHON@4OG z!nFlh!ad z)X9@Cj17?XYB(bldK}mCS=tCC+MkQ8-x#EjY<*8kdWxCU*teG}=!F+y3}?8C4y>q| zeqT)qzTGCCvuq9#)47~HLhtAiU?!5$NWAxw<;zsQ$TaD9=xT`1!1i1j_sqV_aC(Tzr=7$Qf5`d_AvN)`>3O=Z@b zKDFCJLz*toVBY(-D5P3fZCbs1njIY!BblX%8_0R5Y|}#sCb?=y^7?kP-`4?*DX(+K z@)L&$hH*K{>q(RTCHL-cGR4|bl_0e0rbRO9*_s6ZwQSC&+D0%S=Us3=B8X4bXoE4y zaTWx+82^my1}kbzF3A@=SNsf1J|A#HLMuYOQtZ|`F2ithhg8RK5Lkw1XJf`I+pd?*|4B)E-) zl~F5piVZ3(Yrs8Zucy8&_Pn<=4P>Uq zSkPrC3vvkUVZT>SZfc>)@7l&wTV@oWT@vO>-imFpgOMJJuvDUhF<;^eu8Pn$-QrjL zUt$ddO^bx)$hGAGIWY(KQD`t|A&-{XvhaH?jQY5}UsX8(4}K!6el;avN88rbzJW8g zYbL339{G`7vN45HCz^)6u+%6nm?Lz-)|Vst&R%uQKB5IZ?S^mg>#M68(eQlHavre= z-?{Wuk5)E#X@blpl#9{^Xw%f#n;{v)Vd7hjO%*juzW`#)m>@w`CA?J z>QYTa@kooCBJn5PeUY-8o2CcVU|?wDUn7WhUHdkS$e8CymBGJmT@O~Gx6X!|iT-_=}GLe6H6mGS!WoP$$B*w2s~mfw$?P6(ygARjCJ zwzBsrh;cQ^CLbW| z-Ll(@LR2bQNS)?s{qU>O?KdNWU*C2w2?7OEb?VP*yIiE}rXa;A^=!Osi)D!=-an^c z(sns%W4HFCVI>+IqHkB|lz`q~9jR10x?9|3Qr2dkrH6|hGi-=WZLr6@Obb z)Mf}ZAvambwUxvxl2Mblk@KgQ;t|4QXwXO%F+M8&RO*|j6Q$Wik>;kPCik6%?fto8 zTUS4<;grq3r^sG(Y)$~xbwR#)9&u<_G=BR{3QQYw!KH{}rXxacqnn=`g0J-2`%mA@ z>Fx`akMsPLIfr_cH^`JWj-H_PJfT`I>RL1QssADq%*OYm21ImWrJA6eQ(qy}gd=lV zn`J_fOa4*m zQ)#p|ZWmsRsYls^S=4%}D4;3TkGwH5fg?x0SF^Xqd=Z`~m(03O=U>&$4<2n!CMJ7t zW>JiW$Y;-!z?9&I>x`y|AoWq=<2Xhh70uOr!JJNm(*0I&xW!E;3@e#{*e9uj^j5qi zszAFP%0Cvch%7XiO};$(xZ9sN0t& z**@f4a-ow-S;lqQG#uG+NQFBC?J2TScKIJOghk z${@NEWkz}0lhil3=@pnowv?1TD9!PFok_ptyU@*@*Ge3Px!hT^!46JAn)Wv_OnMYO z+8{%J?*uAXpQI0+`vYOAKr_i!qQt-&rw!ZYkJvTG8VVgLHJ84%lIcrc9`Z4GkI0o; z^2@f|`Xq;(`h~akJr?!~(VZq!kMDT}C)2qw6tnz>SSiDv^JPImnq!2acfi#R>g@7vIW<)=Y)G-Hh1UW;duY4NIL7m%Kf&Dy`5` zb57`NW^qH~U>Rh!wrh6VS$r-mNn(tm0!}Wq9QzSGxqze`R>#dsM1v=0mgkQ)&|8G} zEZ|WrXFT-?=lA3+iO(qkG=9{|80edD7-lcR9=7e!?HZWlh_Ndk7hdxFCPb-5Gd*|r zUgAhw6$`b}vLC(2mF!Alr$*r@YVG-0+>w`eF&q7+$ac;6RhkY~&rGbw?XX~Bn=-eN z$=6TjI?rf}+O$+`ICP*Ct^YWs$jQnjasFA;45JfV?^s@6goq#iUz>u0C9e)+>}b#h%6 z@k(#@6E`dIl^C%?OciLv8}l?z+i)e2^Mi-fBQuy}R>Y)CrLVWzJg86WXOGH3n2EUQN94?AC{ z;>t#Gcn(oX^1-J#-NV(WAXVDJ@<;abV8GjJRd=PLpDcwZo9c!;`Lc$Y6LdG*Sc;7N z!GrDxmZ|v9zTZ<>DJedWa>ufX;*yp_MnfcyR98@c#ZfR;MZ011iSaq65}F&yU}%1R zQdTyw#EaMuji_rPip&I$mPB>Jmh$TncC_}))e&&7+_sL_mzv1g>N`{u5PY{9x9)-j zs#cLknH?Cce&6)j<86eyO-uhoRmC?y+d^?PTC{FeMi|Eoz65PI^RwDk{NvM<0K5a} zGqU0)&NI#IQ0i=P^!~h;@u}1g{PBr$$)zj5L8c|exBI2+^d+Bubg{-hznTa1q*r32 zUUaY=(u{xS`^&ra{zAFaM+H07P^i?~p zZK>s0ttMIueN{1~`ElL{`{)SB-vpDKo4c39OIS;*E9{pLmc6OlaYcB78k!YDJ6Emw z+RCGXv}YF)8|j7R%o7Tjcj%=P*5?SsXsalEmA9|PZ-^py#P9eu=wt8Y4@6{I9d}q~Iowf||1r-tcEa5?6RP`s9ar>b`SN}=eB*P$C zZuf0dC&67kYwx-sQmnKX4o%)^$&{i@C{?$|_!#8Mmw~cNWB6ldM`NApNCOTML7LNy z!V|YVh;^Yo>aMP!)~^jr)s;32A{yqY;L>(KLvofPIad#fx*Oji(qK;F9E{LyC(#qB zlfCaTMNUL#iuVKYxk)(l-%duViPDSiJPE&A;*}ElPUAWPt`d*Fj^P7C@OYlS`l0oZ zjVTQVn)#E>|7g`XT2`iainb*ad?9tD@Q$SoAF~F-LkzcD@UUev*oa9RSC^yJ9_U!3CtMFWZnMjs?g?a$%P+E+=AO> z5IuU=eUa_`Luae$ymAr+4swYE1=?c1Y20%#4n07WH?Ep4bA&Z6uW;~g7duGUB#o{? z0;szZU89ncbNqj^&gbOiGTj{XbhbLe5Klg{d;ck~doTG_2}0AB9W0v~x(j?>gk{)O zcoT?pX=eawwMpOBTVK)ijqJn_VL^^`Ylc8CIf};W;f?!mpLg7cGt+n0TTNM_&5!9H zkmJYs`h_@5kniJDH)2zu8NaB+^jDP@_pQ?1W;MBq+btk~$O@m;P9@(gzyC0-ppl{t z(XJKjyfCM^b`Q{dgt){^BugA~oKj3tf7PBqfHmN0<5DAdoIjfSA@O-PY(HZm=J`bb zx$*6XOELGY4rcOUL*&S+cWks^FnwF%19CRsLwf9dStB8PYSntknQ{`cuc<=mC~B7M zP2tz=-?P@N0;yo+;B1^p%Et2lYNhy^#{a36=xdk`aAy#BfUY_X@ic|}sRx`KknoE& zUUTe=^c*8RoIV?JK`U1{Z7*uX2;@kz@7S7}uQ(Z%BbN}jQ)UeuoEQRH87qfdoEo?8 zo7(vvi^dY&tPXc#T%Vw9z|O-riNz<~_a)M5|9r&T_?}SYWyMtzWC=N*umlS&@NkoM zBUv}1mRLb41`$8_Z=rF6Q)RL+1g0A;0AhX+mN+Pv=KaeKH%X4{(zM@|4^4F@1&L6# z1;>hr;>{9U)PUlH{RLRfPCSRmieP%0rF42;8!EL9_@zs2~Xs$P2seckwO`OOakw6Da|NqRX% zhL;#~VVu9U8ZGU=o6XOv^sLfx?xXMREUT5?Viv-^SuPp#HGREf9aw5t+|P@CwLOvG zOE+U@K~@jGHqP&NM{B$WERQON=ZjNr8AbB5Stt|vzJc>6*e;cbx>t_2)%pJ7NH)_DrfG^DDSCbkgb4|sIVm5tKHuj+N zylbLho}jfiY$ALQ&5%=@m6rIbYCtCZkl4Una_v`YdSYuFXYmbOd|>05xOZ1q{EC}DR^{`kW11Xc3$k!O zGjx5P1-@{OWzwe&2GY{Qj5iXa4#g%*6OpsEpv_aWb#dNUn;q&Stn}w(oPVbblx>T! z4L1Qf%+yk@AU9|&SX!0W`X8`Z$Y#N5Uoo#a8(rOVxATs%N%Cn*$c$X_{4-e$a#qd} z(3{XQ7}RbG_^wU3Ahic~V<(Ub7DAYe709)hV!OLeUo`W}+eUUan)OsyE4{&3{mqWO z#d50FfiAg&2dnG|($3+pkKEdeBV0mT+&dQR@=K}syevOSI9O|%rDZGAjL=hW>$xkG z-o9TTdzWizWAGJdMz49>G6(VPeXL0x?IRc{oAIlM4etACYGw3Oxm8ij{zAFL#N-g0 zy{vjft!L{wSpk=$6+2swZcugGzpxb5Y~rdyCFQ#sy?Penq7J)6 zUV&#wfCnz(L=T(8M&bnx`-R3;PD76ep)?T;184!+xQ$imVy|uf3iJ!T&oQObk({Jd zeU!HF*jG^D*2jFyIkd7KJzI~3~h0?`CDL<6L9YIg%`4ilc9i~Arz5w>*Ri{-iF2n47f40iz7TMpL zeOqs8q~@qm<_}s%a~WG{XyUU;As;@#s+>1r~f17%v~^`>|WPJVoVrs4#NRIuJAU>s2~p zve0co3rvulBlI`ZzMUM7xDR%jNmgD@Lc8zmfp8w==f2t%?rGGp4upS+(Tz{u8MosC z3H!^0v!&)_LSxmFr6D`i${=V4HxXZVsr_|>oC$d}Q83J(emJ&+FO0`@T7zngbzZpI z(h(nj5z;e#H9)LQ!6iFw$i05O>! zu&9=dp>0Q;@U-qKRmt^EgSs};!P(s^1dudIo^;%s{hND$gdL%ZUOJKud?Hv#$`TmsTKeOrG6ta{+^LH8GY1EmG%jz{3^` za@>FRafQH>yo94%d$F|lSfYl>p`KHaOL&eK0&wQ~!ObpD{er<=_$DqCTysbN_YW4dA+UR*Uz;oZ zf@cMSrQc~VOQkjBl+@;H7(jg`uUr)H7DT?EB2vSd^}Zh600cUtYp#`WL2hRjODm5l3epoDM`vkHtSQts^Yqc)uBQe@c=m$rs%(%;W_@7(503x6ADc zWI5si(!z06((?xj@m9Cyk>aDHQ-#c->8AVv?JZcJ(B_`6eVQcJGSQ#P7n=>y<<@;& z>LKiNz7QXW39)k@*w(jEp7gEzYMAeTwy9^|SygtheRnY%J`I3-s}w#;S^hQSq=c)_ zD3+43w^p!wgbwcgnvU?P2EG|Uxmgo)EjtGHIMACTr6hdbS@(~xnZ4;<8RJzKy`m6D z`)8KoJt?UMyCn#gz{H{Rs?+mta@gV9tgxsCb*%=6vdn=75bT0ecWW%ik5{h{dHcB& z>c(Whxs~VY-uew1sEe}uh32&@iaY)7di2*9R@3{J+19}w&vXh&oOc774l-0Ta!8(G zOw=6u5<96c(37{SyzNsE$81{$IRli`g!mkR-smpPK5;$m#+R(5NL+hoiTR36gx|Hd z&Q;)~n37&U&@SOy-OAfy=cQK&LjIlL%Fo{}?eMuPMxsq(qfhQD#?zA&~j7 zS2S36at&r$Pmv;>eLVbwG1UKe=W5L3HAjX>J|QIo>)sOc!jGmKj&~g7*YcF)Bs{oC zu@w;r*1*T5X47xI7sMRa*@GhHOUnsW{%y-N?oRe?aH{MyEN8;qy{q`08nr#7&q{1e zsA^aChBeTupIxZ_Xh}b#O-ZH~$`o6^mOfqIz9K~LQoS=SvRaa6$lNF`a3@=5<=Uaq z$&0|2afzA!r_|C-6Wo=x^(vx1E%FXy;9)6An;)Uxl?KzLebiIAbUn7B90aYRY)8%> zM;0KRc-*>D`jQ|P?j&hrN8$oR&iy$3kzFxRX>T3*plj4YO_FzJlHqctY;{eq6ge@4 z#Va(uE<44YqAEx!00j-^eau)4Q4dGIG9*Q=X8MdeFTM?h2?Vd>cmdt+m1Gqyg18j(p4W7S~M_T{SZbj85swgC}RoS0C4%r zor`5fFPk~g(5Z#k{oQ&LaRG!$`fiEy_HR+oF&y-0tPJrdwkLLF21G(?E@z-^vM~qo zvo+Io)J(f^#_-O?C2+#a*SGx^Z6Z<$DM1^*7;hRk^sp%Z5L;Xcei_0`oD5p#@gBR* zkNUAkmtjTucD`#ZTzO7|7l8#q>j6QVKly>xQ)RQpfDL!WDXz}EqXRL-1u+=OJewTQf~lzw?(c&8YlJygg>>?UOo7o!wulE?#ss|gwSw9UAF=A zE&IMZnozarGobtga@8$%eIB_~w~X7@jUCT03IXRhEx18Lk4&PWkp-`Lq~Km;r% z4Ugj4FGwss1DCqM{UhCM`ox7dD+QkwR)!q*0s^PO)sTYQCz8n!3q`U_O zP26%Hd{v*a#2d6B6Om%fecwD}G?r1>W2MxQnpf;+4@^q^st`U~yMP z+v?uVuUX+#F8&oIO;qI5;pB7K%S1$^qJl8;NL}8cwm-t8<;mY2)Drz1r zZYu!PX3xAIsj0M1rlO&lF%u1@BTopx5DgdU;F`A-mi)n2HZ07Fl?4HRDv*BGpd=Gg{} z(yJI=cz_#B-LrZnYm+KkzH3T2-q8xC436DznbBbVoQ+N}_Uj2^aa^4Yn!VXIYF>V7 z>BRaOXW;tEZeRRrYyAt|Z?(1ZA6V;jb-Pwl*e`4USVMAM?A|Q;Ml@F`zkkI#B-4j< z7O1WC)}g+_ogS@eBG!{G2TRh6b`f#ZnuuQyS9V>V3Bsc)lE7UXC3*I4@m7<=mGKS4 zs2y$8*d5S?H##)%sfU;(#J2snCG(amqI^pF{nj8>-d3vNAl0C)6*U`Ha^%(Ppa{Wd z0gc3lza^jdDt=KtbVXvRoGzm)6Tzjz_-5s7?e0%3B60~y*BfW~G_U@rbh>3ITSm{b zGRK9of?b~_j(4~Eent}c#1)P8RRDlL5=*kRuaEXA{gbAaw+Xgjx-Ytn zU8i{Krz2jE?LZu+Cm8@C=!^aL)yPi5rk&?#?|D_4fDI2QbhH^)?maTqx%VO94{uPaCO^V1+AH)@;KegZRQKi6 zh?_oso|^1D>`)JkPINcuLxCe8yWmiGg$c*;Mso4pT6q}k3_1eP@Msr@Dpg_e)lVn2 znv`z>m_`yP*~v`79`t3tg_IyoX@hsHecDelc1D2N;YjO`MHoJQqiErlTOR`ci<4md zrj&HI9C+?Ku3E$@}3h>chMeN*8>dJwj4PzBB1 zgN8>W{225IT5jWmag}~AHz?LDAye_!`T1T${=t4ld^Vp#lL#&1sypA8Nf5y7`v z%v*Y0)Gt~D&2<2_29m#EPs)b|_oOA}!}-vkg4dpah%dGV-o3i!FRNMimH*-R1e6hw z6};+~Wz(t!){17HA?{_G`WfuXk#DckyoqS3Cwh8v9aTJ+QiN>~^x1K_OOZ%L9~9yN z-?_ncO*j@zO3Kx*Tg4T=y?^2?BKfDxI5aq28;osb4(5?x+jw$#bCa>csvPMAS0f!R zrFVbQ^Bh%-rCUNu7sM{uzu1!sbU((0EMF?Pzm4PdE?Z2`=2bbC2D()yDmlP;UETbnSb2oP$U(D;OZ@60d`c`CV3LCJu^T-+!6tS$;VL z3iJ!UB_*D1kS=j~ddd(5JiGvPncXrbZx{VW-vXCrCY=Np-`p6`s-tEM?WQN5mv#5_ z@H5FS1kIWr;b~NzO*lz;Q-Q9rwBA4kXTaurHDnm2 zCbVM|C|2{RO;Ez zKTbZXvwecX6J?>9oOJz~G}fz=l9EIfIGlN9F9poM!HT|hQ{(~CjV!0t`46}7%-#r# zK02S*>qUYGBxU)p5AhWjy?(Rsd}ea&XLwkBD*U4V(sh9bX;PrYkQ~1S>h{L}0vklEvi-SvZ_&v{J=y&;z_*Jq= z`PvnF^Fy6?J>bAMfB7RkZ38ra=Doa$H#*l_LR@CRbA?|~n-!yS*3ohaFFA`}XaQA6 z^D~Be48LQpvU7XM%^HaLo9O=8ShsB{9(dI7b4?DCs8Oa`BZ)bwdZR%FnJ{!Z9b4Vyy0dQw5^+2OS)>!CYPu)S51 zO!6{s)O{h=GMy-4Btts$VCV~T*M645!}buJ1i_1dj=<{=_fwyXtDG`jWUv^w%o7Fq zOq4L=NKw+|_Y53?ol>j|9bUqk{n?+IsK?-n51B8QzrN|x`lxA44D<4-$N$cz4;Atf z(~bi}Tz7W|gK}VHwFuRVT`*^wxsVJ!3kotViMfq;-;DqId73>?gS9_3LxT55{R~R3 z4+;R+>opLLXG5m08huNs<@~(_V9Lz-%G0mHgoa~J&5~FF?-Ii68!Tblpf5xX zgod5q!qLlCtmPfQ2(4cFIbDm17v#&pId0UXW5tISX4Vr5g+6I4K)~G}!UV-#Y$Jso zwQ>(MD+75MJ1RJHlzkIO?2niig!hdgTthc54k49iVhG_stWBQAzSv zC`bIw%;%t_?gzY{`xz8()l4{Lo=sS79K2Hi@&qm+@ZTv;3&v5eUgogzUa}~-c{Gxn zu^@k45A+_hvUD>}db)gGa5gP!uryEBUUDY)KVa{Sp}`mR9DU1ir#_Pa+o)cV*dC*4lQx?6Uc`HZKcY~HBR7o4PH&SGe*Klyz>6Puae$XNV6KjfZ2~W z*sAUP2>2hJCl_ShhiqPFw%Yn}0fX#VTOF6RQrtP4W>z9FJ81Ip0UOT@=syBEq_W~n zA^KLT(swmTAvcp;`kipu=^1q0_Qj$Is!u}LzTfr9I6&JYeSvw`|r+!~*^Hn+4MvymMSRbl1&WMy0{8Sjyaa zy6*<0b1{{dhNkUJf!_{PX-|w}1ks@LCFj%b6R0mLJPp!PSq4$B!*{v?K==)hT9SV! z^uNMR_tywU;MVbLL!TseE}!F?fQ&V{X!|d+?0N!E^Qx?c1&upv+c&YPYQEcm)5A%svfO z@FW>1{IP?k8!>WYCigK=Yk7j7U*6+47mnA4Gx*PY6v(xKTNh;=CWtES^2+x^*rF-X28yG%; zDmATm~EztIw?0}aSw6};Ku+9Cb=QJEqSz*(PF;_ z-0|QM=_1beW`w&S*JT9;k3Sow?Zej9WErE&L(d z%V%r=P55m<)0^5CEzBQRM%8$E0NtxGYC#f|Vyn|5$AR7IF2V_3{;lwb9 z>2|)q2-NA7+`^lZ-?*fJw4TR|@y8e3X&YVsVg;T4IJyb*#Y$`)UuLIxVSOP)@a7Gu zy!N)S_)sli^wj9x<3ODi|Hkz-3!x%Tp!d_Qa5w*y#d<$eeTH<^Y>vEIDbk9DwDcV1 ziX^c3$hyvYqQGH)gY&(K{euW!+w{zANW^jQ>#8FyzC(Ys{CE>Wx@N;d2kq6Bw~T0> z{+|{s-g1EQC#=sdHe~H6Es3d!ALxB!t^CEsJuToeM!OjQqRSc12Iu1hq^#>zgcKEj zLVw)1pHOBDOeOaC^7!P~JkaykIX_R|c2QCDr|oLV5DIuF`OGD)JN7+0&s{nKJ^~*$ zyc@$*@Yi*LNWE=Y$uKYo-uM*WRzCCQ0`)+s(OIuE4B-!g5~$`$>CX9Rq{XP%~C%am3lVc*T) zFv0!DTaE)8qDbvsJk)iT3q_`f-_2ujO@w<*=Q*GZ%1)mv>;}S8a7&YqMDNmFz$f>S z;n^J$(G>g?mhB89p85dFPQj;kd_=Q;hOj-#{Y_V1;@;CsbG(n9TuC!jWl)AW)Di|d z4A_Q0O%Lph4nb1;nF4V$l$y+3)rr2Vf0I-sSJd|5e$;5mce?%ee{PUdlg#!m76Hl$ z8Vw8C&|sa}9S-m?ajGp@PVijSialzOKy72VOxkzF!@eVA-|h$_#DL$8r+zfz*q*#H zhmno~4>?)miV64lnP%uyqfe1}o)k+RSy$_v>R&(j=0mSH35J!{(cI2e-aV} zQc1(xjiH%A@Jp+ED`+QwQH?(~pOm|N8cM&Qh;%$+z`kQgQ}`HCmGtiUApKHq-PIactWUo> z(!w0gB*NeHhCvx6miMRR%9&^vU@_vBu=dbVday|RdKYWXGhlWf$9NQ=qS6YDRQ>9k#X&PU6Q10XI$5~WXHudug&k=-rvvfuU9Yk`Fx(oUgz;RC*{oR64ZjyW3^!IJC97jT(L^IL|5!{i(S& z_OI!{z+;bGEcJ`;L{1OA37MQthkC6rQE4(hrHEIF=lzUXpuK$0lx4%^U;S1>frMM@ zGi^2Rzgw0=y~^Y#6}-|rXc+zqC2ruaXbp7Cw)K=)k$FPjTpn-3+n5+wKskV-o^` zB&7=ApL9A zn)dD>5K>{gf2K|`#`3m1ON%ok5U~|>2wpq?bTog=7E(z!`A_Q5UinpN1&C9!lUjEh z1S?@|R{xxV;uCu|o~hn`?no7_y0pMO`m;r@zZ1D20ZmHH=V^Hw$lm%jA?0;i8ZC64 zD3USJ^KvQ;%MM+i9q(84^|e4Cxx*5>);gG>IQ~&pvsh!A)6nei$#mH>Sieu_pk6dW zw(D8JcJvqd4$50E=*x?GP-R=hVD{x>|93%yORIJR*r z4Do|TrEc-uuMu|-7JI#G<@mOBgQ2XUiiYxjyAdt;8Z?4CN#BFIt z=2u$CDKmpo+S^Gta4e#=BoKbx#(FwXWnJdbqyJm!f~A0%O=X16fU_yDi3k!8{hs?Z zLow^=@88DZQfwhzxQSAR>BD0Tl-d4i@8d>(_ExL>5eIaghUK*zmi?ORGzSDZvBHR! z%IzaJ6^*w~gW^heMa)D%HdUKYl;@-MdV$R2oeH#&J{fhnCn|RH3nHS1zc|n)&q8Oa z`7tCgRG&8*p?P(ls3+<%F=au^D@{$*Mw050Un(1HURI*x!9@$9JWk8)5#6yq=?Jwx z!y*sXmQ#QN>sutTP4_Q!%i@=?7eT%~VkH!!LUp_aIghC(?CgT?+C7s|fz~2dDD>X} zWNAQUE3k8UhVH zu_%ct4+Hdj|4Ni?Tm!XeJPbi^zH|(?hu>pl0Mf}#>v(M|MQbI|Vx=@Jo)LNvf!Cn= z78wop8Mjep=u2Gvy$_cfgbN(cj|$MJJbn98BgH&a7d-sy7Q~ZT9P%D<{{e%@bAvMw z>ehc7`8o zQ%Ik+^hO3?uqU7vli_=_V0wZELS68>-Bv7IdjCB5XNuc8pP~PD*o$%mf&seruO1e0 zf9h(j#3|@aK69!8ui*2NGth;LUbnxZJARYRpx-~f@v(wxQ?DT4jJk?|9l689!rFos z;>o!?l_~_&<5rga0cG~BSDF@`mq4Ei%^qlNeapyBcz70A{|Cb<#Pv&J5Kn~n;wk@t zbF7e%sLuRjDlNUH>b1ypmOo0HU+{F}q4%KzFNOcUg=$e?m-*RmPz&ig`OD|w%gO-? z7ZXud!?%3KRJTy;-u5R#&z)m4AJ%OH5550*sya88hpt-hMCkV!Cwp2dVZB}mm6qFJ zmi?>%pu8iS{_<4>t7{Odr9GVSzS1$MZpWFUU4Q=8@PeM(daetz%ga+Ou>L2874G(< zDd_#R?tJ#u7tbJd?Q}z#(svgi9)Xd~z|?&uSAimN6C{!aT78(il%`*?ZFLd~xs&Jq zzLmra)#82$4vMH9mjTdOrnCjnT|vaC zCHxcO1Z1aH8vVazBE`Azyl*A~fC_sG25yXMCkWB1Je6nrtF+U6D64ovUII3FP15xCz5N5BH1FW?6!_ZI>XY)53F0HZR@oc_9yb)q%riK=#-{ zw>U%iEGh8{^yN}`&Hve&1~<(%1?nQrLbc`GPpJUhs2COS^k#rAlokA3HEf@#=7Mwu z{S`8NBFoxIrcE^kr*smfvhZwD$u0 z%-Sh7hzA{Pe`I*QsS_Mn+Rmb}cJc4Kr(h^>iU9=qlmvJ6kDt9N0|ivy5b#kb7DE!wO9A)hW#`Y%`-V#Jx+^1%|B%6-)@Qa9>&utv zOgIyLAeH+szP(L9(jIOJKkw&A3&q_ewS>&)>Bqp+6hUw=)?8pM z8;V`u%M`go(5B84Lm39bC!752py*bb%tsc>;)R9NPsmYk1D*zBfKAF~neTmPcC7f) zmHM@w+3jn42a9=BrdNH+j0iYTm<{=v#!4RNUMQo+wEmTpSv8=$D|Hm6s(8N>m!Umd zr_liNtK`ZRa5%RBZK&7x2L}6*yTO*5!%uVqfQxsA$A3B~jtpcjl6e*Z>)ou>qDHZGq;T2?M2B zZTY95-{=ubT-&!>>78_;M>d2~Pijy32poxEK4-oeiT7vmqwYW;k=MxrxNBZ zu&cdlhC;Uwu(C*rG8@%1l%Z^p8Tyy{&bEx7eX{jzRGyk!#<$(^@GV>x3@1RntZq6I z+40$VmL@B}@;X&4HLypU6H}T#f^=3SId%Z7&TNSF%RtT{Wzh*HP$~${Xo{0H&h0qS|6bO^NoaiC10k1Bh3Sk zmzJLH*KuANN~k<~V0nQN!d5v5j&8tENlvZp2d+-^(Ahs*!N(vY_bwhMnZSfm@|=*} zaB{rnCDx5CyI-H(NCRwb<809Tb4Uy94+ZYaej2P$K-*KN<#W|~dx^8+N>c!r{C_SP zAqm%E&BjCs!j|p54sy%lfu)r#WK}IGGeOw3ugNmxSC5S`QF%TznX-7L{w#e3=A(m- z^~Ck9BSlD{MfiAZKTIufKk*`mjPV&N|5?{5jp0cDP;?xWX>{}>&^_QamF5aA30{ps z*vsO|#ro#!Ks|5Q=GE2J4fQYn8^P%LhWZG5p;g0#LNguN4GK+13&(Hn$fpy?@3zE! z^Ib$`BcV)wmjo$SKWz6?OuGNpS+M)~B{<7tdmk))U_YdEEavnC)pjzp$fRix1}{e9 z6k1wo3rFq7|ABO;InDcX33tpWZ(%NVVW%Lar@RESviJ+orbt}CapNh$Nt>6+szsUp zZ>VJm3yatEzpTAO61o89@&Xe5$^@jEvpX0ma*jVsCW1)z&~M zNA-xmFzELBqD9$nJo*@o+nEn;rCT z3G=$m5l=u>4$p(La_oG|5o!e=AIsLR2;sE1wP`}H4s4|x)F^DW*17mK%{^QyofWf+ zU%F4N#XVpd-0~;9-vK#6DIl`z<3Ib4@3=6zxVg#Z4}vV*S+Df{J}6wBBrZ^C;@my; zri1Oa>wPDWBl8W5n{i{TKk4a@SHh6WPP*fvCu)Y!i{+O zt<$r9k@q12&$Lb6$|GmFxw}$IpeqZi%0q6u2}!y>6M-L@=&SKYGeUxtJ_`kM8A0I_ z%lFrR5a3*MU6&U=6JK^WtX5alKkv?qT5x0sQulT7AEP3I>i@a)=pK@~^I~dy@9?Uj zksV<*f<$qN-AvTD#t!v$gp|yk4>THh@c|+3cfXI?@};Z!$d&FflP$dvE>Jv9OF{Q99UWM|9v{9A^HrM#AT8LsN^Cm-jDBy4Ov&qo|2#2t8S>+h z!l>SxBkGZgI*zXA{{h%Y&xku7?ER5G+-(Lq$DFtI4V;nKtzJ;{Aas;`>tu?n>@CoqJm+#UVSr_j|#IUkIg>pe_Z5B@=>4UrjmZ=`+@)`#R9euBO!4_&=zMy_L8GF7rrv(- zd#eT5NcrdTqI<#sbzg7%(cVTjDLSyMN!jX`jcUHO>>K_{$U04?Vj@6o;FIy17L`S` z=~w0E8+XCR+pXhNe$Mxs)ZUUE!0pC6^Q>G*UV#G~5T>#CI={?ME#Xb(jXmD_9}RFl zprX#YiNP`AC zOXSOM0We%U^lV4Bp+)8)utoKA$_gg*t0n!7v=Kr3EuWs zv%@vK5$61`N$o#by|5EP6lWdtT`EK!QR`*yB5{C6JEd9hx!!r+vLI#^OX3k#`Zl7! z*tdY;Q@cKW>U-8t>2uE6z-dDp0vyI8HIJt_J{Yoq!sSmirMP>C0yf}w;~7yRuL=v- zn@yrB*T| z;SKE*d*Hu3v)mt6Q9qf67jx!pbXLv!XvNPWgU{CF*n*H1nV=i@QOnr_WiyvHFS@)M{qrqlugg8Ia)i3jZ_1k? zu48lk(}jzrS>DT;>^Zs=Gc--+4<&5y==d>-j?>8 z88%b)-4SJ2n>NkXWmpB&Di>Y@#LqsJ07cm0chb!Tpm<~k_>JvM)&%;*1A z$m26l{&}$rR5Xj>S;b!y`^sN&fuf=col?bc!IrGQ+6=CNHGwF$;7J84j;!Ag!4Y~_|iK-Reb*=MD>J|TNu#DU1 zQafXH&vFxb!o^Jb7Kk5&yWWbv$_Q`-T?rpI|GZ#LoB)4(!Z&?S05aKH-`fk5ioN@6 z%ScB3+}lR-S{=Zn?3{$G)P?h&24_@c(D{Wi7l{`yV+|Nc4jNN7Ag{jodR0|g_*b6( znumeA{MadNNt-xyXUQVmmLyneNl+@z0kVD~jc+_oz+&*ST397ZC7+?k%UJBaF`} zd+rB8>iWG8#?P8~_om9Zy!bAz3rTWc8G4g^UX2yDQJ_K}h3$Mv5YdrB6sM0$i0dDnMsQXMzj>dDe>E}A2n~h z@w&v_82vh%(Z%9G|Gm(9-wo)?1^PbOhMTJ%p1&G}{%VQ+$Fk?^<#`P^*MG=sD!>1$ zW_w+mBtcnDsU{THq`d36I^8Ez)Es5Wf|K zkCa=tueW7Cr}pY>8U*T2o*w_l|Mo0?+E9q_nEEC^y~AbXnf72p>CU>11&hgpL=Q-1 z_Ft>m7yh7m?I#_*q0k>kz|LM~PxHPS0HYyywFB${_0>Y_db{!Lw)C}?pM`t+Loqy9 zYA0W?L%qLON7=T~p6yr!BdYQ+8SAJKFaXTN-m`JQX8%0IznuRr@0DdIQmH2XsNQMd zU>}I?SF^5^2G{)iwcXTbzZZ#~93TAc^t5B=2{%Cp@HsPP>dSetq93ORzn5m^@W$Cu zDJ-UU4cUd^77rJ-Y|ywsMH`lHUF7`5UaxFZ3zkL&+=ctVbtT(gJiu|rGM~h+zmo@2 z!OiA(^9SpH3KUO1x!7_F77#c(-t>OShKd#k#*tE`dOTzCf&b;z5v0%?t70ho<-(rL z28;3(=u%Bln0>>qRZq3h0Zvc8kax-uC$n*)(?dd6j>Vzu2e?o7pBPH3OW$^V=5&^q zF1VHYVDqJKtUxv#o{>;h%}W?6T=dJl!qS0inU3(*dJkL?=s$)6F5KTaYLLosF#B~? zZ^E$FI5&?WjJ1IS5j|xX4}Ed#VQ_wS+=w_C;PLfqA5aCVvC(?F zxr^^NtPFJg{jR%i;bN2SnQgGI@HO|fhqn7JVPo*%J7~AI1~jC2c@-!pF?j*(|gsJ^+!qEi?9&{`h|n-`*duNSpvvuQ_*)C4Opy zw{=_;D*Z=udT^`1;4n*C7N|kAz>x=R>A{)IAFuN8c=YrGYw7FyJEm`5H+ev{DxViK%$Av#-uW9b z2Ah<7fIQ|a$)tCl)#@&o{W+aY6@wd2^?>*d(XZ9#Pp7*-LJLH9CqAaO2qGmG-tNwe zm@N^*R^mUcK7bVh{{4m@`EEZ=K02k7b#f=3$DtKLEn3C~|R)rJC_zsDTK}b>;HM}1xik{Z50Oa>Q5|0UK&gP=h+2t)=>wI9a zUl$WQi`CsCVdLlf5j3Ggf~J>rKD_Xc_&veYINxma!p}rDG`Y0iE=L^5TaclL)rZZu z00HCD67kfAPX*#z{~p6z(^z4qi-1KA^?rR?ZHL6a&EnT#XsPYJ;9F&6QOJn<71u=Y zU~f|Z;x{_H3rju+LsEwT0eBvR!2OhOT4B@e2WltueXl5++FCt>e;ZyLO^>}<>UmEx@?0!WRbUN>4g({4 zEEHQ5PT-PcJr@S`cYw%;jtM>V{78^YNBqq0s*~j$EwCN}l=xZU*FKZ5=AuLo#t2sP zGRRm-fdlH`mbqk7+ScEYl&LxQU4vt@ZSJZYAbs5c8|##mpPn1O}nTJg^Gj(|{gBOK@!V1a(bz%v^EO{;HkrxgwV< z2f;8`I9+D_i$i(f9W9xk)p?RIeYKgwP*-hz6-%Y{%+_2`oS?h$z1zLLh1EdTuC*1FSC;WJ%JW!k0d=fB;M7nclevQ#<@v z1xs-YAcSb6l_Q_hukTc#`15L>L5mq7joTXJ^P3Z;fvgjGnGQf$k_I@F?)n?M2=6=1 ztGjr+l-a$GcC(niaiXh<)HcCcnOwJqWFFg1KE z=T(oC|BM#f1T-^$K3Z1N{wZ0G=ioRud+dmfDrqyz<@23K=lgA-Sr_IHY314W0{aJ!KS4zz zgX!t067Xnm%Kj zDXa-kZ`j~m#;5)kFg@E?w*wHqi#l8Rs3GWS;sbb|y6HR^i)(!`hYkuU^aynH;U5J2 zt#`@8Hahhk1DR0I&tx|%87E1CIXi7zvmrYeLoywzOp-E-G+G){6pcyAYw&4CgA&v9VByRlV!EOkC!*e<^grQFocjfcOLOzjo&`t zn*yE6q9TDX=%0%?Ddf_0n)6wtX3jJZb`e15_ASG(A#kV!%;!)#Q)&a2?Aiu>QZCSB^)$kx48@w+i_*wrg+qYNM)B1>FWsQj>@DC4^=-9E zpB-=&kCt?SsXkffqr({Ca)a;Hpngi`g1_#Af%x1{`O3J^&vWnK7qeIYL!1k}^yV9z zH@~QDt6TS=$JRHxdwY>Ua5isMh-WB}K0aPrihTprxvKkGKvO3l6?Zy=QUf!`6&&M> zYiyo9!A&1Fm4RsLXA$oQ9nc_mNy=DNUCdnS+Mnd}t<&~DUeZGW({0=7*d;#lnVl5B z-S1+pThqKsB!E2Q5=F2gdN&L4z{B1F*iuB-*u1=;IViJa&RO^k4epOEa)8OgyNESe zyC35usNSCY5u4n6No0e9?*5#X`BCQUuL)65fMlNV$YKYW+~tThyGv=9+EM0#QzwU= zVt&Bi<(;J4U|K*w0*dEU(fnFa(hQU;G93=rmR+{@fKduMDYzowlP2O+2S#8=?3x{- zQY-!lk(sjF4qzSbmFGi%6U>yMTc|7ka>xB|IY{)2sDWv8isLyeAjP^B_#b7_3gqyc zMu8EV59UA`W7!ZG@wyNBb2AluF?qw!@lpn%?*aj-(Dv8;X8-Yv#Z$qPmO-S58Y1zS z6AK0mW+4*lRQIXtjW@f*f$^J)9n1LoFfFkEmvXER2sA>IFQyFV^|;8*ag*OSwvPcd zUum2R)@g0NE9TBavr`kFgSvZ{T#zLm81Z%DzdCwy%>66kpbmE;(?Nu+zeXUE%||9V zUTm5udU_g-U5<|5%%p;6!%bk@)(#441ar)0hY8}T+zUE@pU!G$_73VQqOo0=&&rZ= zKslStD|&(*d|%XlIH}?sGxdB^NqJ&lf_#1;deWPPC^#%fed}BM`EMUicL)D|Kt7*6 zbg+?7oS>2MezO6Tcabcct^SVU$2o}8&J*7|_5ajI3 z!kwF*NmXDd{5ib!pd#_`r^1N^i8A|xf_iH;SU@v|F0@d=GQcMC@kB@WCY5;g0pt$e z9N()aGtDVEz(J8tk&3~(gsGx zk{8(@ta`7!Qxiu`U2Oe&^=FFXRQ=8$kY5-aA5EGwun%0Ds@ihPNcjGa=Q@Aqro!^U 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 From 538bfbbd8652c1c67af9d948f72fca6a646c9092 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brieuc=20Le=20D=C3=A9?= Date: Fri, 1 Mar 2024 18:30:33 +0100 Subject: [PATCH 03/24] Update doc --- src/.measure.jl.swp | Bin 0 -> 16384 bytes src/measure.jl | 8 ++++++++ src/mpsBasics.jl | 30 ++++++++++++++++++++++++++++++ src/observables.jl | 7 +++++++ src/reshape.jl | 17 +++++++++++++++++ src/treeMeasure.jl | 21 +++++++++++++++++++++ src/treeTDVP.jl | 9 ++++++++- 7 files changed, 91 insertions(+), 1 deletion(-) create mode 100644 src/.measure.jl.swp diff --git a/src/.measure.jl.swp b/src/.measure.jl.swp new file mode 100644 index 0000000000000000000000000000000000000000..148307529ea05a165248d662a5d383f5adf8d3fb GIT binary patch literal 16384 zcmeI3TWlOx8OKiw4TO?lB@dLh6Q>HZ&3f%!EBhyVMfMswse~-69`ByD$C;fO z&BczBCe(dEs2~M_L=mkD1qpExsSt#RLQz422M{u?R3)v1C`AYaRBd>G-V*qq+sy3E zZd!5GZ1nTY&UY@~`OZ1tne&~^;@BOxP0V)LN49#EW2Wllh&O($YNl#xWNTm zfBc5Snr!PdTzXa(IC`tsh}+DK!qM9&X6_8VRc(Mb-`{};D$G6RqC&(?3TOhYUZh_naxdn0y_kquY z1{eaDuP5XQ@Kx{?;D9~g_vnBhf-ivw!52XcBCr>{fLO%y;LqSs;4yF>)WJb;BX}PD z_XqGKcpUr^da}RJ%;?liola5DrJ>IncFSf> z8rl&HOJvdus6`z+j6_=IhF%cTh1voQm>;kZzv;k_H;^Q-mzI$xh?YIq3)+@rpF$~9 zGqXk7@Y;SHF;SD_H7tj+lc*=MBHMEbq4=mDezbkhsF~&+5PCt8PNla(9n(A(`wk0F z-{wX|aHb&I!rZ1PBw&_fc&@W^w`$cAWi2Xt!<03XG|_GO`%uBK{Q$MOv2GrfIcG9p)}Y%SNq0@45?Z z4ZJm@7A%RMy?iJLyucXdW?r^JdegKpFI`)<9d7(t`P4{CC`j`Ut7f2hUHVjkv|_ix zEw`P~3S0IxTV=tzsOG<=lVxWT^kM^6EK+aLH0z5Y3s$W~hZSIha;I>jX)R4OT`p-` zCk=10BnNG&ROpj1_P0-XY|Wd+xbLjBZMz09KlCkE>Lu$b7fPt9DC+K(RfMcdjk?SF zl-^OY$VP}RPL29$FIvVdQO6XCAVp} zL&G#PU0dlRk$qVqdVcFGpXULK;=rX9F@u>CGI5iUloN>!@3-zVua%6Qa)FMU+%{qk zcgiYS)?MJ3c(7Gr2M=~vlopmu=Zpck-FnC3R?STt^;)${S~Ez2-r-6T4V004bTnM6 z%`kQSGXGO4$`Ob!Vr(Set5sJHX$s3oQSvC`;9hI-x-?yl{;oY>$eo?#jPRP^RT5=KGXh;(^;rly{nNIhbIu>O!`ROr+nvc5`i zM=12~%>2gnkNs}_wG*=(N2zku^BiFX@g2Q!+{L;tY)i$Pki6w@LPaXQK7WEQYQ;E{ z=0>N!zT6l-rdbODYyI@NIUTnb8Q#n)vSbXefwF!**E34HZP4R$5{JS&Vz9JGl|#X( z4Kb(M_)RfZYtP5}j6uV+C-7YMAM*m-Nu>2Fm%!)#0-yC2mxjFY6iO?>}9ggvZ}{Vw1C>+|myv9Esyd<{GZJ`Fwzj)5xR zd;f!AFL)Vy{ojI1;K$(W;LG5Ca2lKf9|On0C@6t_fX4^UgS!C(H-ne3@Baz-EcgUC z3tFHEZUTG39?n|Kt|PEs$Fvw?J-z z+yXr@gUt=GDba6N6ratFIeQ+jropmTtA!Ebto+Fc54G0BH4V<%RX1*Xet1a7Xa|*3 z?^{rj)_V%9n6gNrmb`^7D!f*gRYMw-~V0&fRh;T<_6?y6IOHA z&ls_b4LY`BnSch5JR`&)-p$&6$fJq%G{!wGw%gTAU{5zrg&k%%%`P4ChjIxG@F)*r|8%25o|5s-EY&)6 z{M@|AE~P>ZaV)@9(~+aJooVOS5qg!Q=Ww>YDuzE{HDU)X%$}U^1DU#r81WN?T1f_i zuAyvk4%9Woa596im1u#Mz+k*uJVt8*zDEritRk;cP^3I=TP?#v;-(@^h>)nu5MIOK z(SClC5`t3=nqudCZ=b#txhCQ*pAEg^l^E9>zSP#XB08I^(;?=pUQPe8;c6Etxrs^XPmxD J!RwfL{{&=ZtB?Qy literal 0 HcmV?d00001 diff --git a/src/measure.jl b/src/measure.jl index 4fe6aaa..cc9b43b 100644 --- a/src/measure.jl +++ b/src/measure.jl @@ -987,6 +987,14 @@ function measure(A::Vector, O::CdagCdn, ρ::Vector) return expval end +""" + measure(A::Vector, Os::Vector; kwargs...) + +Caculate expectation of Os on MPS A. + +""" + + function measure(A::Vector, Os::Vector; kwargs...) numobs = length(Os) numobs==0 && return Any[] diff --git a/src/mpsBasics.jl b/src/mpsBasics.jl index dde7aac..0005058 100644 --- a/src/mpsBasics.jl +++ b/src/mpsBasics.jl @@ -559,6 +559,13 @@ function applympo!(A, H) end end +""" + reversemps!(A) + +Reverse the left and right dimensions of the MPS A. The resulting MPS A is the reversed MPS. + +""" + function reversemps!(A) N = length(A) reverse!(A) @@ -566,6 +573,14 @@ function reversemps!(A) A[i] = permutedims(A[i], [2,1,3]) end end + +""" + reversemps(A) + +Reverse the left and right bond-dimensions of the MPS A. + +""" + function reversemps(A) N = length(A) Ar = Vector{Any}(undef, N) @@ -575,6 +590,13 @@ function reversemps(A) return Ar end +""" + reversempo!(M) + +Reverse the left and right dimensions of the MPO M. The resulting MPO M is the reversed MPO. + +""" + function reversempo!(M) N = length(M) reverse!(M) @@ -582,6 +604,14 @@ function reversempo!(M) M[i] = permutedims(M[i], [2,1,3,4]) end end + +""" + reversempo(M) + +Reverse the left and right dimensions of the MPO M. + +""" + function reversempo(M) N = length(M) Mr = Vector{Any}(undef, N) diff --git a/src/observables.jl b/src/observables.jl index 0839e5c..30808dd 100644 --- a/src/observables.jl +++ b/src/observables.jl @@ -17,6 +17,13 @@ end FockError(sysop, N) = FockError([fill(0.0, N), fill(1.0, N-1), 0.5], sysop, (2, N+1)) Base.ndims(::FockError) = 0 +""" + measure(A, obs::FockError; t=0, kwargs...) + +Return the measure of the observable obs on the MPS A. + +""" + function measure(A, obs::FockError; t=0, kwargs...) d = physdims(A)[obs.sites[1]:obs.sites[2]][1] all(x->x==d, physdims(A)[obs.sites[1]:obs.sites[2]]) || error("MPS has non-uniform local Hilbert space dimensions") diff --git a/src/reshape.jl b/src/reshape.jl index 717e033..fff373f 100644 --- a/src/reshape.jl +++ b/src/reshape.jl @@ -1,3 +1,20 @@ +""" + Base.reshape(x::Number, dims...) + +Reshape any matrix with dimensions "dims" + +# Example + +```julia-repl +julia> A = rand(2,3,2) + +julia> B = reshape(A,4,3) + +julia> size(B) == (4,3) + +``` +""" + function Base.reshape(x::Number, dims...) prod(dims) == 1 || throw(DimensionMismatch("new dimensions $(dims) must be consistent with array size 1")) return fill(x, dims...) diff --git a/src/treeMeasure.jl b/src/treeMeasure.jl index 85fa2d3..09737fc 100644 --- a/src/treeMeasure.jl +++ b/src/treeMeasure.jl @@ -1,3 +1,10 @@ +""" + measure1siteoperator(net::TreeNetwork, O, id::Int) + +For a Tree, compute the local expectation value of a one-site operator O for site id. + +""" + function measure1siteoperator(net::TreeNetwork, O, id::Int) ρ = ones(ComplexF64, 1, 1) T = ishermitian(O) ? Float64 : ComplexF64 @@ -9,6 +16,13 @@ function measure1siteoperator(net::TreeNetwork, O, id::Int) return v end +""" + measure1siteoperator(net::TreeNetwork, O, sites::Tuple{Int,Int}) + +For a Tree, compute the local expectation value of a one-site operator O for the specified site range. + +""" + function measure1siteoperator(net::TreeNetwork, O, sites::Tuple{Int,Int}) ρ = ones(ComplexF64, 1, 1) firstsite = sites[1] @@ -45,6 +59,13 @@ function measure1siteoperator(net::TreeNetwork, O, sites::Tuple{Int,Int}) end end +""" + measure2siteoperator(net::TreeNetwork, O1, O2, sites::Tuple{Int,Int}) + +For a Tree, compute the local expectation value of two one-site operators O1 and O2 for the specified site range. + +""" + function measure2siteoperator(net::TreeNetwork, O1, O2, sites::Tuple{Int,Int}) herm_cis = ishermitian(O1*O2) diff --git a/src/treeTDVP.jl b/src/treeTDVP.jl index 696ade5..26c87dd 100644 --- a/src/treeTDVP.jl +++ b/src/treeTDVP.jl @@ -605,7 +605,7 @@ productstatemps(tree::Tree, physdims::Int, Dmax::Int; state=:Vacuum) = """ mpsembed(A::TreeNetwork, Dmax::Int) -Embed tree-MPS `A` in manifold of max bond-dimension `Dmax` +Embed tree-MPS `A` in manifold of max bond-dimension `Dmax`. """ @@ -634,6 +634,13 @@ function mpsembed!(A::TreeNetwork, Dmax::Int) return A end +""" + bonddims(A::TreeNetwork) + +Return the bon-dimension of a tree-MPS `A`. + +""" + function bonddims(A::TreeNetwork) N = length(A) mat = zeros(Int, N, N) From 6e1fded865cd93f3182a7e780f8d598cb8d4a5de Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Wed, 27 Mar 2024 17:40:00 +0100 Subject: [PATCH 04/24] Update doc structure --- docs/src/dev.md | 15 ++++++++ docs/src/index.md | 29 ++++++++++---- docs/src/methods.md | 5 +++ docs/src/theory.md | 85 ++++++++++++++++++++++++++++++++++++++++++ docs/src/user-guide.md | 13 +++++++ 5 files changed, 139 insertions(+), 8 deletions(-) create mode 100644 docs/src/dev.md create mode 100644 docs/src/methods.md create mode 100644 docs/src/theory.md create mode 100644 docs/src/user-guide.md diff --git a/docs/src/dev.md b/docs/src/dev.md new file mode 100644 index 0000000..5eb08e5 --- /dev/null +++ b/docs/src/dev.md @@ -0,0 +1,15 @@ +# Developpers + +## Simulation Workflow + +The flow chart will go here + +## How to Contribute + +Contributions are welcome! Don't hesitate to contact us if you + +* found a bug; +* have a suggestion on how to improve the code and/or documentation; +* would like to get involved in writing code and/or documentation. + +You can contact us by raising an [issue on Github](https://github.com/shareloqs/MPSDynamics/issues), or by writing to one of the developpers. diff --git a/docs/src/index.md b/docs/src/index.md index 5a4a677..db010d7 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -6,11 +6,6 @@ The package also provides strong support for the measurement of observables, as The package has been developed with the aim of studying non-Markovian open system dynamics at finite temperature using the state-of-the-art numerically exact Thermalized-Time Evolving Density operator with Orthonormal Polynomials Algorithm (T-TEDOPA) based on environment chain mapping. However the methods implemented can equally be applied to other areas of physics. -## Table of Contents - -```@contents -``` - ## Installation The package may be installed by typing the following into a Julia REPL @@ -19,8 +14,26 @@ The package may be installed by typing the following into a Julia REPL ] add https://github.com/shareloqs/MPSDynamics.git ``` -## Functions +## Table of Contents + +```@contents +Pages = ["index.md", "user-guide.md", "./examples/sbm.md", "./examples/puredephasing.md", "theory.md", "methods.md", "dev.md"] +Depth = 3 +``` -```@autodocs -Modules = [MPSDynamics] +## Citation +If you use the package in your research, please consider citing it. +You can add the Zenodo record to your BibTex file: + +```tex +@misc{mpsdynamics_zenodo2021, + title = {shareloqs/{MPSDynamics}}, + shorttitle = {{MPSDynamics.jl}}, + url = {https://zenodo.org/record/5106435}, + abstract = {Tensor network simulations for finite temperature, open quantum system dynamics}, + publisher = {Zenodo}, + author = {Dunnett, Angus and Lacroix, Thibaut and Le Dé, Brieuc and Riva, Angela}, + year = {2021}, + doi = {10.5281/zenodo.5106435}, +} ``` diff --git a/docs/src/methods.md b/docs/src/methods.md new file mode 100644 index 0000000..af11c21 --- /dev/null +++ b/docs/src/methods.md @@ -0,0 +1,5 @@ +# List of all methods + +```@autodocs +Modules = [MPSDynamics] +``` diff --git a/docs/src/theory.md b/docs/src/theory.md new file mode 100644 index 0000000..3e1299c --- /dev/null +++ b/docs/src/theory.md @@ -0,0 +1,85 @@ +# Theoretical Background + +## Chain-Mapping of bosonic environments + +We consider, in the Schrödinger picture, a general Hamiltonian where a non-specified system interacts linearly with a bosonic environments + +```math +\begin{align} + \hat{H} =& \hat{H}_S + \int_0^{+\infty} \hbar\omega\hat{a}^\dagger_\omega\hat{a}_\omega\ \mathrm{d}\omega + \hat{A}_S\int_0^{+\infty}\sqrt{J(\omega)}\left(\hat{a}_\omega + \hat{a}^\dagger_\omega\right)\mathrm{d}\omega +\end{align} +``` + +where ``\hat{a}_\omega`` (``\hat{a}^\dagger_\omega``) is a bosonic annihilation (creation) operator for a normal mode of the environment of energy ``\hbar\omega``, ``\hat{A}_S`` is a system operator, and ``J(\omega) = \sum_k |g_k|^2\delta(\omega - \omega_k)`` is the bath spectral density (SD), defined with the microscopic system-environment coupling strength ``g_k``. +The SD quantifies the coupling strengths of the different normal modes of the environment with the system. +Any SD that is not flat corresponds to a non-Markovian environment. + +### Zero Temperature + +Let us consider the Hamiltonian presented in Eq.(1). +We can introduce a unitary transformation of the continuous normal modes ``\hat{a}_\omega`` to an infinite discrete set of interacting modes ``\hat{b}_n``[^chin_exact_2010]. + +```math +\begin{align} + \hat{a}_\omega &= \sum_{n=0}^{+\infty} U_n(\omega)\hat{b}_n = \sum_{n=0}^{+\infty} \sqrt{J(\omega)}P_n(\omega)\hat{b}_n\ , +\end{align} +``` + +where ``P_n(\omega)`` are orthonormal polynomials such that + +```math +\begin{align} + \int_{0}^{+\infty}P_n(\omega)P_m(\omega)J(\omega)\mathrm{d}\omega = \delta_{n,m}\ ; +\end{align} +``` + +and the inverse transformation is + +```math +\begin{align} + \hat{b}_n &= \int_0^{+\infty} U_n(\omega)\hat{a}_\omega\mathrm{d}\omega\ . +\end{align} +``` + +Note that the orthonormality of the polynomials ensures the unitarity of the transformation defined in Eq.(2). +The mapping from a continuous set of modes to a (still infinite) discrete set might seem counter-intuitive, however it is a direct consequence of the separability of the underlying Hilbert space. + +Under this transformation, the Hamiltonian in Eq.(1) becomes + +```math +\begin{align} + \hat{H}= \hat{H}_S &+ \sum_{n=0}^{+\infty}\varepsilon_n\hat{b}_n^\dagger\hat{b}_n + t_n(\hat{b}_{n+1}^\dagger\hat{b}_n + \mathrm{h.c.}) + \kappa\hat{A}_S(\hat{b}_0 + \hat{b}_0^\dagger)\ . +\end{align} +``` + +Hence, this mapping transforms the normal bath Hamiltonian into a tight-binding Hamiltonian with on-site energies ``\varepsilon_n`` and hopping energies ``t_n``. +Another important consequence of this mapping is that now the system only interacts with the first mode ``n = 0`` of the chain-mapped environment. +The chain coefficients ``\varepsilon_n``, ``t_n``, and the coupling ``\kappa`` depend solely on the SD. + +This makes chain mapping a tool of choice for describing systems coupled to environment with highly structured SD (e.g. experimentally measured or calculated **ab initio**)[^chin_role_2013][^alvertis_nonequilibrium_2019][^dunnett_influence_2021][^caycedosoler_exact_2022] +In this new representation, the Hamiltonian in Eq.(5) has naturally a 1D chain topology. +This makes its representation as a Matrix Product Operator (MPO) and the representation of the joint \{System + Environment\} wave-function as a Matrix Product State (MPS) suited~\cite{orus_practical_2014, paeckel_time-evolution_2019}. + +The orthogonal polynomial-based chain mapping and the subsequent representation of the joint wave-function as a MPS (and the operators as MPO) are the building blocks of the Time-dependent Density operator with Orthonormal Polynomials Algorithm (TEDOPA) one of the state-of-the-art numerically exact method to simulate the dynamics of open quantum systems especially in the non-Markovian, non-perturbative regimes both at zero and finite temperatures~\cite{prior_efficient_2010, woods_simulating_2015, tamascelli_efficient_2019, dunnett_simulating_2021, lacroix_unveiling_2021}. + +### Finite Temperature + + + +[^chin_exact_2010]: + > Chin, A. W.; Rivas, Á.; Huelga, S. F.; Plenio, M. B. Exact Mapping between System-Reservoir Quantum Models and Semi-Infinite Discrete Chains Using Orthogonal Polynomials. Journal of Mathematical Physics 2010, 51 (9), 092109. https://doi.org/10.1063/1.3490188. + +[^chin_role_2013]: + > Chin, A. W.; Prior, J.; Rosenbach, R.; Caycedo-Soler, F.; Huelga, S. F.; Plenio, M. B. The Role of Non-Equilibrium Vibrational Structures in Electronic Coherence and Recoherence in Pigment–Protein Complexes. Nature Phys 2013, 9 (2), 113–118. https://doi.org/10.1038/nphys2515. + +[^alvertis_nonequilibrium_2019]: + > Alvertis, A. M.; Schröder, F. A. Y. N.; Chin, A. W. Non-Equilibrium Relaxation of Hot States in Organic Semiconductors: Impact of Mode-Selective Excitation on Charge Transfer. J. Chem. Phys. 2019, 151 (8), 084104. https://doi.org/10.1063/1.5115239. + +[^dunnett_influence_2021]: + > Dunnett, A. J.; Gowland, D.; Isborn, C. M.; Chin, A. W.; Zuehlsdorff, T. J. Influence of Non-Adiabatic Effects on Linear Absorption Spectra in the Condensed Phase: Methylene Blue. J. Chem. Phys. 2021, 155 (14), 144112. https://doi.org/10.1063/5.0062950. + +[^caycedosoler_exact_2022]: + > Caycedo-Soler, F.; Mattioni, A.; Lim, J.; Renger, T.; Huelga, S. F.; Plenio, M. B. Exact Simulation of Pigment-Protein Complexes Unveils Vibronic Renormalization of Electronic Parameters in Ultrafast Spectroscopy. Nat Commun 2022, 13 (1), 2912. https://doi.org/10.1038/s41467-022-30565-4. + + + diff --git a/docs/src/user-guide.md b/docs/src/user-guide.md new file mode 100644 index 0000000..eb314a6 --- /dev/null +++ b/docs/src/user-guide.md @@ -0,0 +1,13 @@ +# Users Guide + +Here we explain the different steps to perform a simulation. + +## Initial State + +## Hamiltonian + +## Observables + +## Time-Evolution + +## Data Storage From 41122e5c2c9280da91d78f2fab1b3cc635af91fb Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Wed, 27 Mar 2024 17:41:38 +0100 Subject: [PATCH 05/24] Update make.jl --- docs/make.jl | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/make.jl b/docs/make.jl index e44a750..9e29847 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -7,8 +7,17 @@ makedocs( modules = [MPSDynamics], highlightsig = true, sitename = "MPSDynamics.jl", - authors = "Angus Dunnett, Thibaut Lacroix, Brieuc Le Dé", - expandfirst = [] + authors = "Angus Dunnett, Thibaut Lacroix, Brieuc Le Dé, Angela Riva", + pages = [ + "index.md", + "user-guide.md", + "Examples" => ["./examples/sbm.md", "./examples/puredephasing.md"], + "theory.md", + "Methods" => "methods.md", + "dev.md" + ], + expandfirst = [], + remotes = nothing ) deploydocs( From 8e1adf23eabc2d98575b1d900ca7668eb81510d7 Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Tue, 2 Apr 2024 18:23:55 +0200 Subject: [PATCH 06/24] Update user-guide.md --- docs/src/user-guide.md | 49 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/docs/src/user-guide.md b/docs/src/user-guide.md index eb314a6..5cc73de 100644 --- a/docs/src/user-guide.md +++ b/docs/src/user-guide.md @@ -2,10 +2,59 @@ Here we explain the different steps to perform a simulation. +Examples with detailed explanations can be found in . + ## Initial State +The initial many-body state of the {System + Environment} can be described easily as [Matrix Product States](@ref) (MPS) or [Tree Tensor Networks](@ref) (TTN) state (e.g. when a system is coupled to several environments). + +### Matrix Product States + +A MPS can be initialized with several methods. + +The [`productstatemps`](@ref) method enables to instantiate arbitrary MPS of fixed uniform bond dimension with non-uniform physical dimensions. +The individual states of the MPS sites can be provided by setting state to a list of column vectors. +Setting `state=:Vacuum` will produce an MPS in the vacuum state. +Setting `state=:FullOccupy` will produce an MPS in which each site is fully occupied. +The gauge of the MPS can also be set using a keyword argument. + +```julia +julia> ψ = unitcol(1,2); d = 6; N = 30; α = 0.1; Δ = 0.0; ω0 = 0.2; s = 1 + +julia> cpars = chaincoeffs_ohmic(N, α, s) + +julia> H = spinbosonmpo(ω0, Δ, d, N, cpars) + +julia> A = productstatemps(physdims(H), state=[ψ, fill(unitcol(1,d), N)...]) # MPS representation of |ψ>|Vacuum> +``` + +Alternatively, a chain with a specified number of excitation localiswed on one site, or delocalized accross several sites can be generated with [`MPSDynamics.chainmps`](@ref). + +Random MPS can also be generated with the [`randmps`](@ref) method. + +For the case of fermionic states (which need to be anti-symmetrized), the [`MPSDynamics.electronkmps`](@ref) method generate an MPS for an electron with momentum `k`, and the [`MPSDynamics.electron2kmps`](@ref) generate an MPS with 2 electrons in k-states `k1` and `k2`. + +### Tree Tensor Networks + +Write a quick explanation of the how trees are structured: parents, child, nodes; and that most methods to initialize a MPS are overloaded for `TreeNetwork`. + ## Hamiltonian +In order to perform time evolution and have access to the dynamics of the many-body state a Hamiltonian needs to be specified in the form of a Matrix Product Operator (MPO) of as a tree tensor network. +Either way, this can be done by using a [Build-in Hamiltonian](@ref), [Convert a MPO from ITensor](@ref), or creating a [Tailored MPO](@ref). + +### Build-in Hamiltonian + +MPSDynamics provides several topical Hamiltonians directly in the form of MPO or Tree Tensor Networks such as the Ising model [`MPSDynamics.isingmpo`](@ref), the XYZ Hamiltonian [`MPSDynamics.xyzmpo`](@ref), the Spin Boson Model [`MPSDynamics.spinbosonmpo`](@ref), (non-)uniform tight-binding chain Hamiltonian [`MPSDynamics.hbathchain`](@ref). + +### Convert a MPO from ITensor + +The method [`MPSDynamics.MPOtoVector`](@ref) converts an ITensors chain MPO into a form compatible with MPSDynamics. + +### Tailored MPO + +Explain that a MPO is just a list of tensors with matching bond dimensions. + ## Observables ## Time-Evolution From 4e4bee6c4467342e646005661bcb08f821154e7e Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Wed, 3 Apr 2024 12:25:08 +0200 Subject: [PATCH 07/24] Update user-guide.md --- docs/src/user-guide.md | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/docs/src/user-guide.md b/docs/src/user-guide.md index 5cc73de..f5fc2ec 100644 --- a/docs/src/user-guide.md +++ b/docs/src/user-guide.md @@ -19,9 +19,11 @@ Setting `state=:FullOccupy` will produce an MPS in which each site is fully occu The gauge of the MPS can also be set using a keyword argument. ```julia -julia> ψ = unitcol(1,2); d = 6; N = 30; α = 0.1; Δ = 0.0; ω0 = 0.2; s = 1 +julia> ψ = unitcol(1,2) # system initial state -julia> cpars = chaincoeffs_ohmic(N, α, s) +julia> d = 6; N = 30; α = 0.1; Δ = 0.0; ω0 = 0.2; s = 1 + +julia> cpars = chaincoeffs_ohmic(N, α, s) # chain coefficient for an Ohmic spectral density julia> H = spinbosonmpo(ω0, Δ, d, N, cpars) @@ -57,6 +59,34 @@ Explain that a MPO is just a list of tensors with matching bond dimensions. ## Observables +Explain OneSiteObservable and TwoSiteObservable + ## Time-Evolution +Explain that we do TDVP + +### One-site TDVP + +Fixed bond dimension, complexity XXX, preserves unitarity. + +The convergence parameter is the bond dimension. + +Is set in `MPSDynamics.runsim`(@ref) usind the key word argument `method=:TDVP1` + +### Two-Site TDVP + +Varying bond dimension, complexity higher than 1TDVP, but breaks unitarity because of a SVD. + +The convergence parameter is the threshold of the SVD. + +Is set in [MPSDynamics.runsim`(@ref) usind the key word argument `method=:TDVP2` + +### Adaptive One-Site TDVP + +Keeps the good scaling of the 1TDVP, preserves unitarity but is able to increase the bond dimendion. + +The convergence parameter is a threshold value for the rate of change of the projection error with respect to the bond dimension. + +Is set in `MPSDynamics.runsim`(@ref) usind the key word argument `method=:DTDVP` + ## Data Storage From 26a4ff84a3a606179ccf56fa197683c41fed08cd Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Wed, 3 Apr 2024 12:25:37 +0200 Subject: [PATCH 08/24] Update theory.md --- docs/src/theory.md | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/docs/src/theory.md b/docs/src/theory.md index 3e1299c..fad5503 100644 --- a/docs/src/theory.md +++ b/docs/src/theory.md @@ -56,16 +56,32 @@ Hence, this mapping transforms the normal bath Hamiltonian into a tight-binding Another important consequence of this mapping is that now the system only interacts with the first mode ``n = 0`` of the chain-mapped environment. The chain coefficients ``\varepsilon_n``, ``t_n``, and the coupling ``\kappa`` depend solely on the SD. -This makes chain mapping a tool of choice for describing systems coupled to environment with highly structured SD (e.g. experimentally measured or calculated **ab initio**)[^chin_role_2013][^alvertis_nonequilibrium_2019][^dunnett_influence_2021][^caycedosoler_exact_2022] +This makes chain mapping a tool of choice for describing systems coupled to environment with highly structured SD (e.g. experimentally measured or calculated *ab initio*)[^chin_role_2013][^alvertis_nonequilibrium_2019][^dunnett_influence_2021][^caycedosoler_exact_2022] In this new representation, the Hamiltonian in Eq.(5) has naturally a 1D chain topology. -This makes its representation as a Matrix Product Operator (MPO) and the representation of the joint \{System + Environment\} wave-function as a Matrix Product State (MPS) suited~\cite{orus_practical_2014, paeckel_time-evolution_2019}. +This makes its representation as a Matrix Product Operator (MPO) and the representation of the joint \{System + Environment\} wave-function as a Matrix Product State (MPS) suited [^orus_practical_2014][^paeckel_timeevolution_2019]. -The orthogonal polynomial-based chain mapping and the subsequent representation of the joint wave-function as a MPS (and the operators as MPO) are the building blocks of the Time-dependent Density operator with Orthonormal Polynomials Algorithm (TEDOPA) one of the state-of-the-art numerically exact method to simulate the dynamics of open quantum systems especially in the non-Markovian, non-perturbative regimes both at zero and finite temperatures~\cite{prior_efficient_2010, woods_simulating_2015, tamascelli_efficient_2019, dunnett_simulating_2021, lacroix_unveiling_2021}. +The orthogonal polynomial-based chain mapping and the subsequent representation of the joint wave-function as a MPS (and the operators as MPO) are the building blocks of the Time-dependent Density operator with Orthonormal Polynomials Algorithm (TEDOPA) one of the state-of-the-art numerically exact method to simulate the dynamics of open quantum systems especially in the non-Markovian, non-perturbative regimes both at zero and finite temperatures [^prior_efficient_2010][^woods_simulating_2015][^tamascelli_efficient_2019][^dunnett_simulating_2021][^lacroix_unveiling_2021]. ### Finite Temperature +Explain that by extending the bath to negative frequencies and having temperature-dependent system environment couplings, it is possible to describe the finite temperature case as an effective zero temperature one. +Hence, we can keep the pure state description and avoid moving to density matrices at the cost of doubling the size of the environment. +## Computation of the chain coefficient +Explain the three-term recurence relation and the relation of the coefficients to the chain on-site and hopping energies. + +Explain that for some weight function/SD they are known analytically and that for others we can use the build-in routines inspired by Gautschi or the PolyChaos.jl package. + +## Time-Dependent Variational Principal + +Explain the concept behind TDVP and give references + +## Tensor Networks + +Explain quickly why and give references + +## Bibliography [^chin_exact_2010]: > Chin, A. W.; Rivas, Á.; Huelga, S. F.; Plenio, M. B. Exact Mapping between System-Reservoir Quantum Models and Semi-Infinite Discrete Chains Using Orthogonal Polynomials. Journal of Mathematical Physics 2010, 51 (9), 092109. https://doi.org/10.1063/1.3490188. @@ -81,5 +97,23 @@ The orthogonal polynomial-based chain mapping and the subsequent representation [^caycedosoler_exact_2022]: > Caycedo-Soler, F.; Mattioni, A.; Lim, J.; Renger, T.; Huelga, S. F.; Plenio, M. B. Exact Simulation of Pigment-Protein Complexes Unveils Vibronic Renormalization of Electronic Parameters in Ultrafast Spectroscopy. Nat Commun 2022, 13 (1), 2912. https://doi.org/10.1038/s41467-022-30565-4. +[^orus_practical_2014]: + > Orus, R. A Practical Introduction to Tensor Networks: Matrix Product States and Projected Entangled Pair States. Annals of Physics 2014, 349, 117–158. https://doi.org/10.1016/j.aop.2014.06.013. + +[^paeckel_timeevolution_2019]: + > Paeckel, S.; Köhler, T.; Swoboda, A.; Manmana, S. R.; Schollwöck, U.; Hubig, C. Time-Evolution Methods for Matrix-Product States. Annals of Physics 2019, 411, 167998. https://doi.org/10.1016/j.aop.2019.167998. + +[^prior_efficient_2010]: + > Prior, J.; Chin, A. W.; Huelga, S. F.; Plenio, M. B. Efficient Simulation of Strong System-Environment Interactions. Phys. Rev. Lett. 2010, 105 (5), 050404. https://doi.org/10.1103/PhysRevLett.105.050404. + +[^woods_simulating_2015]: + > Woods, M. P.; Cramer, M.; Plenio, M. B. Simulating Bosonic Baths with Error Bars. Phys. Rev. Lett. 2015, 115 (13), 130401. https://doi.org/10.1103/PhysRevLett.115.130401. + +[^tamascelli_efficient_2019]: + > Tamascelli, D.; Smirne, A.; Lim, J.; Huelga, S. F.; Plenio, M. B. Efficient Simulation of Finite-Temperature Open Quantum Systems. Phys. Rev. Lett. 2019, 123 (9), 090402. https://doi.org/10.1103/PhysRevLett.123.090402. +[^dunnett_simulating_2021]: + > Dunnett, A. J.; Chin, A. W. Simulating Quantum Vibronic Dynamics at Finite Temperatures With Many Body Wave Functions at 0 K. Front. Chem. 2021, 8. https://doi.org/10.3389/fchem.2020.600731. +[^lacroix_unveiling_2021]: + > Lacroix, T.; Dunnett, A.; Gribben, D.; Lovett, B. W.; Chin, A. Unveiling Non-Markovian Spacetime Signaling in Open Quantum Systems with Long-Range Tensor Network Dynamics. Phys. Rev. A 2021, 104 (5), 052204. https://doi.org/10.1103/PhysRevA.104.052204. From 3877387ea0d38a41dcec3067cdef45d86dbe361e Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Wed, 3 Apr 2024 16:53:13 +0200 Subject: [PATCH 09/24] Update user-guide.md --- docs/src/user-guide.md | 60 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/docs/src/user-guide.md b/docs/src/user-guide.md index f5fc2ec..58156b0 100644 --- a/docs/src/user-guide.md +++ b/docs/src/user-guide.md @@ -59,12 +59,17 @@ Explain that a MPO is just a list of tensors with matching bond dimensions. ## Observables +System and environment observables can be computed, as well as system-and-environment non-local observables. + Explain OneSiteObservable and TwoSiteObservable ## Time-Evolution Explain that we do TDVP +Local one-site and two-site observables, as well as non-local two-site observables, can be efficiently computed for each time-step of the time-evolution. + + ### One-site TDVP Fixed bond dimension, complexity XXX, preserves unitarity. @@ -79,7 +84,7 @@ Varying bond dimension, complexity higher than 1TDVP, but breaks unitarity becau The convergence parameter is the threshold of the SVD. -Is set in [MPSDynamics.runsim`(@ref) usind the key word argument `method=:TDVP2` +Is set in `MPSDynamics.runsim`(@ref) usind the key word argument `method=:TDVP2` ### Adaptive One-Site TDVP @@ -90,3 +95,56 @@ The convergence parameter is a threshold value for the rate of change of the pro Is set in `MPSDynamics.runsim`(@ref) usind the key word argument `method=:DTDVP` ## Data Storage + +The data (i.e. observables time-series) is stored in the JLD format which is based on HDF5. + +The HDF5 format is natively supported across many platforms and languages (e.g. `Python`, or `Mathematica`). + +For the data to be saved to a file after a run, the keyword argument `save=true` needs to be usedin `runsim`. + +The directory where the data should be saved can be chosen by setting a path with the `savedir` keyword argument. + +A `plot` keyword argument can also be used to choose whether plots for 1D observables will be automatically generated and saved along with the data. + +Loading the data in Julia using the [`JLD.jl`](https://github.com/JuliaIO/JLD.jl) package will recover the full type information of the Julia variables that were stored. + +```julia +julia> using JLD + +julia> dat = load("filename.jld") +Dict{String, Any} with 2 entries: + "parameters" => Dict{String, Any}("tmax"=>0.2, "method"=>:DTDVP, "dt"=>0.0005… + "data" => Dict{String, Any}("bonddims"=>[1 1 … 1 1; 1 2 … 2 2; … ; 1 1 … +``` + +If the data is loaded in an variable `dat` the structure is the folowing: +- the `parameters` entry contains a dictionary where all the simulation parameters are stored +- the `data` entry contains a dictionary where are stored simulation time, the observables and (whenever relevent) the bond dimension of the state at each time steps. + +```julia +julia> dat["parameters"] +Dict{String, Any} with 11 entries: + "tmax" => 0.2 + "method" => :DTDVP + "dt" => 0.0005 + "name" => "my model" + "Δ" => 0.0 + "β" => 0.0186854 + "N" => 300.0 + "d" => 15.0 + "unid" => "Ovzm6" + "ω0" => 0.0 + "convparams" => 0.0005 + +julia> dat["data"] +Dict{String, Any} with 6 entries: + "bonddims" => [1 1 … 1 1; 1 2 … 2 2; … ; 1 1 … 7 7; 1 1 … 1 1] + "sx" => [1.0, 0.912818, 0.741759, 0.605797, 0.528792, 0.492497, 0.47976… + "sz" => [0.0, 0.0871825, 0.25824, 0.394201, 0.471207, 0.507503, 0.52023… + "nchain" => [0.0 0.23466 … 1.84319 1.76098; 0.0 0.00231507 … 0.83105 0.9033… + "sy" => [0.0, -0.0133489, -0.0588887, -0.0858181, -0.0759996, -0.048539… + "times" => [0.0, 0.0005, 0.001, 0.0015, 0.002, 0.0025, 0.003, 0.0035, 0.00… + + + +``` From 9a19eb4412d5aa0c40b358f13e979ff355232d1f Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Wed, 3 Apr 2024 17:07:49 +0200 Subject: [PATCH 10/24] Update user-guide.md --- docs/src/user-guide.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/src/user-guide.md b/docs/src/user-guide.md index 58156b0..2fc0087 100644 --- a/docs/src/user-guide.md +++ b/docs/src/user-guide.md @@ -47,7 +47,7 @@ Either way, this can be done by using a [Build-in Hamiltonian](@ref), [Convert a ### Build-in Hamiltonian -MPSDynamics provides several topical Hamiltonians directly in the form of MPO or Tree Tensor Networks such as the Ising model [`MPSDynamics.isingmpo`](@ref), the XYZ Hamiltonian [`MPSDynamics.xyzmpo`](@ref), the Spin Boson Model [`MPSDynamics.spinbosonmpo`](@ref), (non-)uniform tight-binding chain Hamiltonian [`MPSDynamics.hbathchain`](@ref). +MPSDynamics provides several topical Hamiltonians directly in the form of MPO or Tree Tensor Networks such as the Ising model [`MPSDynamics.isingmpo`](@ref), the XYZ Hamiltonian [`MPSDynamics.xyzmpo`](@ref), the Spin Boson Model [`MPSDynamics.spinbosonmpo`](@ref), a spin coupled to two bosonic baths `MPSDynamics.twobathspinmpo`, nearest neighbour interactions Hamiltonian `MPSDynamics.nearestneighbourmpo`, the idependent boson model `MPSDynamics.ibmmpo`, (non-)uniform tight-binding chain Hamiltonian [`MPSDynamics.hbathchain`](@ref). ### Convert a MPO from ITensor @@ -145,6 +145,4 @@ Dict{String, Any} with 6 entries: "sy" => [0.0, -0.0133489, -0.0588887, -0.0858181, -0.0759996, -0.048539… "times" => [0.0, 0.0005, 0.001, 0.0015, 0.002, 0.0025, 0.003, 0.0035, 0.00… - - ``` From 64a4ed08392cebb739944b593d84aacfde46e5db Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Wed, 3 Apr 2024 17:20:12 +0200 Subject: [PATCH 11/24] Create sbm.md --- docs/src/examples/sbm.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 docs/src/examples/sbm.md diff --git a/docs/src/examples/sbm.md b/docs/src/examples/sbm.md new file mode 100644 index 0000000..f233143 --- /dev/null +++ b/docs/src/examples/sbm.md @@ -0,0 +1 @@ +# The Spin-Boson Model From af556b867f8019a5a57c6c3eed0385d9c56c38db Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Wed, 3 Apr 2024 17:20:52 +0200 Subject: [PATCH 12/24] Create puredephasing.md --- docs/src/examples/puredephasing.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/src/examples/puredephasing.md diff --git a/docs/src/examples/puredephasing.md b/docs/src/examples/puredephasing.md new file mode 100644 index 0000000..eb08147 --- /dev/null +++ b/docs/src/examples/puredephasing.md @@ -0,0 +1,5 @@ +# Pure-Dephasing + +## Zero Temperature + +## Finite Temperature From f1a3b17cb74651d832a9b07e9bef4afedacd9115 Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Wed, 3 Apr 2024 17:50:49 +0200 Subject: [PATCH 13/24] Update theory.md --- docs/src/theory.md | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/docs/src/theory.md b/docs/src/theory.md index fad5503..cb6a3d0 100644 --- a/docs/src/theory.md +++ b/docs/src/theory.md @@ -67,9 +67,22 @@ The orthogonal polynomial-based chain mapping and the subsequent representation Explain that by extending the bath to negative frequencies and having temperature-dependent system environment couplings, it is possible to describe the finite temperature case as an effective zero temperature one. Hence, we can keep the pure state description and avoid moving to density matrices at the cost of doubling the size of the environment. -## Computation of the chain coefficient +## Computation of the chain coefficients -Explain the three-term recurence relation and the relation of the coefficients to the chain on-site and hopping energies. +A useful property of the orthonormal polynomials is that they obey a recurrence relation + +```math +\begin{align} + P_n(\omega) &= (C_{n-1}\omega - A_{n-1})P_{n-1}(\omega) + B_{n-1}P_{n-2}(\omega)\ , +\end{align} +``` + +where ``A_n`` is related to the first moment of ``P_n``, ``B_n`` and ``C_n`` to the norms of ``P_n`` and ``P_{n-1}``[^appel_mathematics_2007]. +This recurrence relation can be used to construct the polynomials with the conditions that ``P_0(\omega) = ||p_0||^{-1} = \left(\int_{\mathbb{R}^{+}} J(\omega)\mathrm{d}\omega \right)^{-\frac{1}{2}}`` and ``P_{-1}(\omega) = 0``, with ``||\bullet||`` the norm of ``\bullet`` with respect to the measure ``J(\omega)``, and ``P_n(\omega) = p_n(\omega)||p_n||^{-1}`` ; where the polynomials ``\{p_n\}_{n\in\mathbb{N}}`` are the so called _monic polynomials_ where the factor ``a_n`` in front of ``\omega^{n}`` is equal to 1. + +The energy of the chain mode ``n`` is given by ``\varepsilon_n = A_n C_n^{-1}`` and ``t_n=C_n^{-1}`` is the coupling between mode ``n`` and ``n+1``[^chin_exact_2010]. + +The system couples _only_ to the first mode with the coupling strength ``\kappa = ||p_0||``. Explain that for some weight function/SD they are known analytically and that for others we can use the build-in routines inspired by Gautschi or the PolyChaos.jl package. @@ -117,3 +130,7 @@ Explain quickly why and give references [^lacroix_unveiling_2021]: > Lacroix, T.; Dunnett, A.; Gribben, D.; Lovett, B. W.; Chin, A. Unveiling Non-Markovian Spacetime Signaling in Open Quantum Systems with Long-Range Tensor Network Dynamics. Phys. Rev. A 2021, 104 (5), 052204. https://doi.org/10.1103/PhysRevA.104.052204. + +[^appel_mathematics_2007]: + > Appel, W. Mathematics for Physics and Physicists; Princeton University Press, 2007. + From 2aa70a80871d401c5cd926c5e9fc62782985b413 Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Thu, 4 Apr 2024 17:46:12 +0200 Subject: [PATCH 14/24] Update theory.md --- docs/src/theory.md | 45 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/docs/src/theory.md b/docs/src/theory.md index cb6a3d0..5029c70 100644 --- a/docs/src/theory.md +++ b/docs/src/theory.md @@ -88,7 +88,50 @@ Explain that for some weight function/SD they are known analytically and that fo ## Time-Dependent Variational Principal -Explain the concept behind TDVP and give references +The original idea behind TDVP goes back to Dirac \cite{dirac_note_1930} and Frenkel \cite{frenkel_wave_1934}. +The main point, in the modern tensor networks formulation, is that instead of solving the Schrödinger equation and then truncating the MPS representation of the quantum state, one can solve the equations of motion projected into a space of restricted bond dimension \cite{haegeman_time-dependent_2011, haegeman_unifying_2016}. + +The general formulation of the Dirac-Frenkel Variational Principle~\cite{raab_diracfrenkelmclachlan_2000} is that one looks for a solution ``|\varphi\rangle \in \mathcal{M}`` of the Schrödinger equation where ``\mathcal{M} \subset \mathcal{H}`` is a manifold of the total Hilbert space ``\mathcal{H}`` in which we think that the relevant physical states `live'. + +We define ``T_{|\varphi\rangle}\mathcal{M}`` the tangent space of ``\mathcal{M}`` around the state ``|\varphi\rangle``. +The criterion to find ``|\varphi\rangle`` is that for every state ``|\chi\rangle \in T_{|\varphi\rangle}\mathcal{M}`` + +```math +\begin{align} + \langle\chi|\left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{H}\right)|\varphi\rangle &=0\ , +\end{align} +``` + +which can be interpreted as saying that the time evolution procedure should keep ``|\varphi\rangle`` inside of the manifold ``\mathcal{M}``. + +The term *variational* in the name of the method comes from the fact that in practice one aims at minimising the right-hand side of Eq.~(\ref{eq:DiracFrenkel1}) to find ``|\varphi\rangle``. + +Introducing ``\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}`` the projector onto the tangent space ``T_{|\varphi\rangle}\mathcal{M}``, we can write the state ``|\chi\rangle = \hat{P}_{T_{|\varphi\rangle}\mathcal{M}}|\phi\rangle`` with ``|\phi\rangle`` a state in ``\mathcal{H}``. +Leading to + +```math +\begin{align} + \forall |\phi\rangle \in \mathcal{H}, \ \langle\phi|\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}\left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{H}\right)|\varphi\rangle &=0\ . +\end{align} +``` +Because the time derivation and the projector commute, we have + +```math +\begin{align} + \forall |\phi\rangle \in \mathcal{H}, \ \langle\phi|\left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}\hat{H}\right)|\varphi\rangle &=0\ . +\end{align} +``` +This equation must be true for any ``|\phi\rangle \in \mathcal{H}``, Eq.~(\ref{eq:DiracFrenkel1}) can thus be written + +```math +\begin{align} + \left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}\hat{H}\right)|\varphi\rangle &=0\ . +\end{align} +``` + +In the context of MPS, the manifold ``\mathcal{M}`` will correspond to the space of full-ranked MPS of a given bond dimension ``D``, and the tangent space will be the space spanned by variations of single MPS tensors. + +The major advantage of this method is that it naturally preserves the unitarity of the time evolution and conserves the energy. ## Tensor Networks From ea0f58f896927c10968cfe874aefa89c97ba4f97 Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:45:39 +0200 Subject: [PATCH 15/24] Update theory.md --- docs/src/theory.md | 82 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 77 insertions(+), 5 deletions(-) diff --git a/docs/src/theory.md b/docs/src/theory.md index 5029c70..b776d06 100644 --- a/docs/src/theory.md +++ b/docs/src/theory.md @@ -86,6 +86,83 @@ The system couples _only_ to the first mode with the coupling strength ``\kappa Explain that for some weight function/SD they are known analytically and that for others we can use the build-in routines inspired by Gautschi or the PolyChaos.jl package. +## Tensor Networks + +A multipartite quantum state ``|\psi\rangle``, e.g. a ``N``-site system where the sites can each be in a state ``|\phi_i\rangle`` belonging to a ``d``-dimensional Hilbert space, can be written as follows + +```math +\begin{align} + |\psi\rangle = \sum_{\{i_k\}}c_{i_1\ldots i_N}|\phi_{i_1}\rangle\otimes\ldots\otimes|\phi_{i_N}\rangle\ , +\end{align} +``` + +where the complex numbers ``c_{i_1\ldots i_N}`` are the amplitudes of each state ``|\phi_{i_1}\rangle\otimes\ldots\otimes|\phi_{i_N}\rangle`` whose superpositions form in full generality the state ``|\psi\rangle``. +Thus the state ``|\psi\rangle`` can be completely represented by a rank-``N`` tensor ``c`` that is the collection of all possible amplitudes ``c_{i_1\ldots i_N}``. +Here by the rank of a tensor, we simply mean the number of indices it has. + +### MPS + +The tensor ``c`` of a quantum state ``|\psi\rangle`` corresponding to a one-dimensional system can be decomposed into a product of ``N`` smaller rank-3 tensors ``T_{k}`` (except for the first and last sites where the tensors will have a rank-2) + +```math +\begin{align} + c_{i_1\ldots i_N} = \sum_{\{\alpha\}} T^{\alpha_1}_{i_1}T^{\alpha_1\alpha_2\ }_{i_2}T^{\alpha_2\alpha_3\ }_{i_3}\ldots T^{\alpha_{N-1}}_{i_N} \ . +\end{align} +``` + +In this form, the local tensor ``T_k`` contains the information on the quantum state on site ``k`` and its relation (especially the entanglement) with the neighbouring sites. + +The decomposition of the tensor of the amplitudes of a quantum state into a product of smaller rank tensors is called a **Matrix Product State** decomposition. + +The contracted indices ``\alpha_k`` between the tensors are called _virtual indices_ and carry information about the correlations between bi-partitions of the state at bond ``k``. +The number of different values a virtual index can take is called the _bond dimension_ and is denoted ``D``. +The free indices ``i_k`` associated with local quantum states are called _physical indices_. +Thus, they can take ``d`` values (with ``d`` the dimension of the local Hilbert space). + +Any state in the Hilbert space of a one-dimensional many-body system can in principle be represented by a MPS by choosing a sufficiently large value for the bond dimension ``D`` \cite{Orus}. +On top of this intellectually satisfying property of MPSs being a dense set of states for a 1d-system, they can also be used as a practical Ansätze for a many-body quantum states by setting a maximal allowed value ``\chi`` for the bond dimension ``D``. +In doing so, we restrict ourselves to a corner of the total Hilbert space. +The rationale behind this Ansatz is the following: if the initial quantum state of a many-body system has a low bond dimension (typically if the initial state is a product state with ``D = 1``), then in a finite time it will only be able to explore a region of the Hilbert space that is not to far away from its starting point. +Thus, the bond dimension will not have the time to diverge exponentially \cite{poulin_quantum_2011}. +However, depending on the physical system at hand, this sub-manifold of the Hilbert space could still be "too large". +There is an additional reason that explains why MPSs are good Ansätze for 1d physical systems. +Most many-body Hamiltonians we (physicists) are interested in are local, meaning that the interactions they describe involve objects that are "neighbours". +For such Hamiltonians, the ground states (outside of potential critical phases) follow the so called _area law_ for the entanglement entropy.\cite{srednicki_entropy_1993, vidal_entanglement_2003, wolf_area_2008}. +This law states that the entanglement entropy ``S_{vN}`` of a bi-partition of the system is proportional, not to the volume of the partition as one might expect, but to the hyper-surface of the partition's boundary; hence the name "area law". +For a 3d system this corresponds to an actual surface area ``A``, ``S_{vN} \sim A``; for a 2d system it corresponds to the length ``L`` of the partition's boundary, ``S_{vN} \sim L``; and in 1d the boundary reduces to a point, thus the entropy will be independent of the size of the system ``S_{vN} \sim \text{constant}``. +The MPSs are states that satisfy this area law. + +An application of the [Singular Value Decomposition](https://en.wikipedia.org/wiki/Singular_value_decomposition) is to create efficient approximations of quantum states to perform computations. +The main idea is to reduce the content of the MPS to keep only the parts that contain the physics of interest. +One method to realise this approximation is to do a SVD on each of the tensors of the MPS after each time step of the state time-evolution and to trim the smallest singular values in order to decrease the bond dimension of the MPS down to a chosen maximal value ``\chi``. +The corresponding columns and rows of the unitary matrices ``U`` and ``V^\dagger`` are also removed. +Then, the trimmed matrices ``\tilde{U}``, ``\tilde{S}`` and ``\tilde{V}^\dagger`` are contracted back to give an approximated tensor ``T`` with a smaller bond dimension. +Another way to apply the restricted rank approximation is to restrict oneself into working in a manifold of fixed bond dimension ``D`` and to use methods that can enforce this constraint. + +### MPO + +In order to compute expectation values of observables or apply unitary transformations to a quantum state, we need a TN representation of operators. +In the same fashion as a one-dimensional quantum state can be represented as a MPS, operators acting on those states can be represented as **Matrix Product Operators** (MPO). +For an operator ``\hat{O}``, its MPO can be defined as follows + +```math +\begin{align} + \hat{O} = \sum_{\{i_k\}\{i_k^{'}\} \{w\}} W^{i_1\ i^{'}_1}_{1\ w_0w_1}\ldots W^{i_N\ i^{'}_N}_{N\ w_{N-1}w_N} |\phi_{i_1^{'}}\ldots \phi_{i_N^{'}}\rangle\langle\phi_{i_1}\ldots \phi_{i_N}| +\end{align} +``` +The contracted indices between the tensors are called _virtual indices_. +The free indices are called _physical indices_ and correspond to the different input and output local quantum states. +They can take ``d`` values (with ``d`` the dimension of the local Hilbert space). + +### TTN +A natural extension to the MPS is the (loop-free) tree tensor network. +A TTN is a generalisation of the MPS wherein each site, instead of being connected to only one other site to its right, may be connected to any arbitrary number of _child_ sites. +Provided the tree does not contain any loops, everything that one can do to an MPS/MPO can be extended straight-forwardly to TTN states and TTN operators. +The generalisation to trees introduces no new conceptual complexity (only implementational complexity). +The sites of a TTN are usually referred to as _nodes_. +For our purposes, every node of a TTN state and operator has one _parent_ leg, and any number (including zero) of child legs. +The first node is known as the head-node and has a dummy parent leg with dimension 1. + ## Time-Dependent Variational Principal The original idea behind TDVP goes back to Dirac \cite{dirac_note_1930} and Frenkel \cite{frenkel_wave_1934}. @@ -133,10 +210,6 @@ In the context of MPS, the manifold ``\mathcal{M}`` will correspond to the space The major advantage of this method is that it naturally preserves the unitarity of the time evolution and conserves the energy. -## Tensor Networks - -Explain quickly why and give references - ## Bibliography [^chin_exact_2010]: > Chin, A. W.; Rivas, Á.; Huelga, S. F.; Plenio, M. B. Exact Mapping between System-Reservoir Quantum Models and Semi-Infinite Discrete Chains Using Orthogonal Polynomials. Journal of Mathematical Physics 2010, 51 (9), 092109. https://doi.org/10.1063/1.3490188. @@ -176,4 +249,3 @@ Explain quickly why and give references [^appel_mathematics_2007]: > Appel, W. Mathematics for Physics and Physicists; Princeton University Press, 2007. - From 20f20730dbfcc8f309ea2ed431d427bdbbf014fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brieuc=20Le=20D=C3=A9?= Date: Mon, 15 Apr 2024 14:52:10 +0200 Subject: [PATCH 16/24] Correct docs --- docs/src/theory.md | 47 ++++++++++-------------------------------- docs/src/user-guide.md | 4 ++-- 2 files changed, 13 insertions(+), 38 deletions(-) diff --git a/docs/src/theory.md b/docs/src/theory.md index b776d06..de2493a 100644 --- a/docs/src/theory.md +++ b/docs/src/theory.md @@ -5,11 +5,10 @@ We consider, in the Schrödinger picture, a general Hamiltonian where a non-specified system interacts linearly with a bosonic environments ```math -\begin{align} - \hat{H} =& \hat{H}_S + \int_0^{+\infty} \hbar\omega\hat{a}^\dagger_\omega\hat{a}_\omega\ \mathrm{d}\omega + \hat{A}_S\int_0^{+\infty}\sqrt{J(\omega)}\left(\hat{a}_\omega + \hat{a}^\dagger_\omega\right)\mathrm{d}\omega -\end{align} + \hat{H} = \hat{H}_S + \int_0^{+\infty} \hbar\omega\hat{a}^\dagger_\omega\hat{a}_\omega\ \mathrm{d}\omega + \hat{A}_S\int_0^{+\infty}\sqrt{J(\omega)}\left(\hat{a}_\omega + \hat{a}^\dagger_\omega\right)\mathrm{d}\omega ``` + where ``\hat{a}_\omega`` (``\hat{a}^\dagger_\omega``) is a bosonic annihilation (creation) operator for a normal mode of the environment of energy ``\hbar\omega``, ``\hat{A}_S`` is a system operator, and ``J(\omega) = \sum_k |g_k|^2\delta(\omega - \omega_k)`` is the bath spectral density (SD), defined with the microscopic system-environment coupling strength ``g_k``. The SD quantifies the coupling strengths of the different normal modes of the environment with the system. Any SD that is not flat corresponds to a non-Markovian environment. @@ -20,25 +19,19 @@ Let us consider the Hamiltonian presented in Eq.(1). We can introduce a unitary transformation of the continuous normal modes ``\hat{a}_\omega`` to an infinite discrete set of interacting modes ``\hat{b}_n``[^chin_exact_2010]. ```math -\begin{align} - \hat{a}_\omega &= \sum_{n=0}^{+\infty} U_n(\omega)\hat{b}_n = \sum_{n=0}^{+\infty} \sqrt{J(\omega)}P_n(\omega)\hat{b}_n\ , -\end{align} + \hat{a}_\omega = \sum_{n=0}^{+\infty} U_n(\omega)\hat{b}_n = \sum_{n=0}^{+\infty} \sqrt{J(\omega)}P_n(\omega)\hat{b}_n\ , ``` where ``P_n(\omega)`` are orthonormal polynomials such that ```math -\begin{align} \int_{0}^{+\infty}P_n(\omega)P_m(\omega)J(\omega)\mathrm{d}\omega = \delta_{n,m}\ ; -\end{align} ``` and the inverse transformation is ```math -\begin{align} - \hat{b}_n &= \int_0^{+\infty} U_n(\omega)\hat{a}_\omega\mathrm{d}\omega\ . -\end{align} + \hat{b}_n = \int_0^{+\infty} U_n(\omega)\hat{a}_\omega\mathrm{d}\omega\ . ``` Note that the orthonormality of the polynomials ensures the unitarity of the transformation defined in Eq.(2). @@ -47,16 +40,14 @@ The mapping from a continuous set of modes to a (still infinite) discrete set mi Under this transformation, the Hamiltonian in Eq.(1) becomes ```math -\begin{align} - \hat{H}= \hat{H}_S &+ \sum_{n=0}^{+\infty}\varepsilon_n\hat{b}_n^\dagger\hat{b}_n + t_n(\hat{b}_{n+1}^\dagger\hat{b}_n + \mathrm{h.c.}) + \kappa\hat{A}_S(\hat{b}_0 + \hat{b}_0^\dagger)\ . -\end{align} + \hat{H}= \hat{H}_S + \sum_{n=0}^{+\infty}\varepsilon_n\hat{b}_n^\dagger\hat{b}_n + t_n(\hat{b}_{n+1}^\dagger\hat{b}_n + \mathrm{h.c.}) + \kappa\hat{A}_S(\hat{b}_0 + \hat{b}_0^\dagger)\ . ``` Hence, this mapping transforms the normal bath Hamiltonian into a tight-binding Hamiltonian with on-site energies ``\varepsilon_n`` and hopping energies ``t_n``. Another important consequence of this mapping is that now the system only interacts with the first mode ``n = 0`` of the chain-mapped environment. The chain coefficients ``\varepsilon_n``, ``t_n``, and the coupling ``\kappa`` depend solely on the SD. -This makes chain mapping a tool of choice for describing systems coupled to environment with highly structured SD (e.g. experimentally measured or calculated *ab initio*)[^chin_role_2013][^alvertis_nonequilibrium_2019][^dunnett_influence_2021][^caycedosoler_exact_2022] +This makes chain mapping a tool of choice for describing systems coupled to environment with highly structured SD (e.g. experimentally measured or calculated *ab initio*)[^chin_role_2013][^alvertis_nonequilibrium_2019][^dunnett_influence_2021][^caycedosoler_exact_2022]. In this new representation, the Hamiltonian in Eq.(5) has naturally a 1D chain topology. This makes its representation as a Matrix Product Operator (MPO) and the representation of the joint \{System + Environment\} wave-function as a Matrix Product State (MPS) suited [^orus_practical_2014][^paeckel_timeevolution_2019]. @@ -72,9 +63,7 @@ Hence, we can keep the pure state description and avoid moving to density matric A useful property of the orthonormal polynomials is that they obey a recurrence relation ```math -\begin{align} - P_n(\omega) &= (C_{n-1}\omega - A_{n-1})P_{n-1}(\omega) + B_{n-1}P_{n-2}(\omega)\ , -\end{align} + P_n(\omega) = (C_{n-1}\omega - A_{n-1})P_{n-1}(\omega) + B_{n-1}P_{n-2}(\omega)\ , ``` where ``A_n`` is related to the first moment of ``P_n``, ``B_n`` and ``C_n`` to the norms of ``P_n`` and ``P_{n-1}``[^appel_mathematics_2007]. @@ -91,9 +80,7 @@ Explain that for some weight function/SD they are known analytically and that fo A multipartite quantum state ``|\psi\rangle``, e.g. a ``N``-site system where the sites can each be in a state ``|\phi_i\rangle`` belonging to a ``d``-dimensional Hilbert space, can be written as follows ```math -\begin{align} |\psi\rangle = \sum_{\{i_k\}}c_{i_1\ldots i_N}|\phi_{i_1}\rangle\otimes\ldots\otimes|\phi_{i_N}\rangle\ , -\end{align} ``` where the complex numbers ``c_{i_1\ldots i_N}`` are the amplitudes of each state ``|\phi_{i_1}\rangle\otimes\ldots\otimes|\phi_{i_N}\rangle`` whose superpositions form in full generality the state ``|\psi\rangle``. @@ -105,9 +92,7 @@ Here by the rank of a tensor, we simply mean the number of indices it has. The tensor ``c`` of a quantum state ``|\psi\rangle`` corresponding to a one-dimensional system can be decomposed into a product of ``N`` smaller rank-3 tensors ``T_{k}`` (except for the first and last sites where the tensors will have a rank-2) ```math -\begin{align} c_{i_1\ldots i_N} = \sum_{\{\alpha\}} T^{\alpha_1}_{i_1}T^{\alpha_1\alpha_2\ }_{i_2}T^{\alpha_2\alpha_3\ }_{i_3}\ldots T^{\alpha_{N-1}}_{i_N} \ . -\end{align} ``` In this form, the local tensor ``T_k`` contains the information on the quantum state on site ``k`` and its relation (especially the entanglement) with the neighbouring sites. @@ -146,9 +131,7 @@ In the same fashion as a one-dimensional quantum state can be represented as a M For an operator ``\hat{O}``, its MPO can be defined as follows ```math -\begin{align} \hat{O} = \sum_{\{i_k\}\{i_k^{'}\} \{w\}} W^{i_1\ i^{'}_1}_{1\ w_0w_1}\ldots W^{i_N\ i^{'}_N}_{N\ w_{N-1}w_N} |\phi_{i_1^{'}}\ldots \phi_{i_N^{'}}\rangle\langle\phi_{i_1}\ldots \phi_{i_N}| -\end{align} ``` The contracted indices between the tensors are called _virtual indices_. The free indices are called _physical indices_ and correspond to the different input and output local quantum states. @@ -174,9 +157,7 @@ We define ``T_{|\varphi\rangle}\mathcal{M}`` the tangent space of ``\mathcal{M}` The criterion to find ``|\varphi\rangle`` is that for every state ``|\chi\rangle \in T_{|\varphi\rangle}\mathcal{M}`` ```math -\begin{align} - \langle\chi|\left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{H}\right)|\varphi\rangle &=0\ , -\end{align} + \langle\chi|\left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{H}\right)|\varphi\rangle =0\ , ``` which can be interpreted as saying that the time evolution procedure should keep ``|\varphi\rangle`` inside of the manifold ``\mathcal{M}``. @@ -187,23 +168,17 @@ Introducing ``\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}`` the projector onto the Leading to ```math -\begin{align} - \forall |\phi\rangle \in \mathcal{H}, \ \langle\phi|\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}\left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{H}\right)|\varphi\rangle &=0\ . -\end{align} + \forall |\phi\rangle \in \mathcal{H}, \ \langle\phi|\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}\left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{H}\right)|\varphi\rangle =0\ . ``` Because the time derivation and the projector commute, we have ```math -\begin{align} - \forall |\phi\rangle \in \mathcal{H}, \ \langle\phi|\left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}\hat{H}\right)|\varphi\rangle &=0\ . -\end{align} + \forall |\phi\rangle \in \mathcal{H}, \ \langle\phi|\left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}\hat{H}\right)|\varphi\rangle =0\ . ``` This equation must be true for any ``|\phi\rangle \in \mathcal{H}``, Eq.~(\ref{eq:DiracFrenkel1}) can thus be written ```math -\begin{align} - \left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}\hat{H}\right)|\varphi\rangle &=0\ . -\end{align} + \left(\frac{\mathrm{d}}{\mathrm{d}t} - \frac{1}{\mathrm{i}\hbar}\hat{P}_{T_{|\varphi\rangle}\mathcal{M}}\hat{H}\right)|\varphi\rangle =0\ . ``` In the context of MPS, the manifold ``\mathcal{M}`` will correspond to the space of full-ranked MPS of a given bond dimension ``D``, and the tangent space will be the space spanned by variations of single MPS tensors. diff --git a/docs/src/user-guide.md b/docs/src/user-guide.md index 2fc0087..dfd2a10 100644 --- a/docs/src/user-guide.md +++ b/docs/src/user-guide.md @@ -30,7 +30,7 @@ julia> H = spinbosonmpo(ω0, Δ, d, N, cpars) julia> A = productstatemps(physdims(H), state=[ψ, fill(unitcol(1,d), N)...]) # MPS representation of |ψ>|Vacuum> ``` -Alternatively, a chain with a specified number of excitation localiswed on one site, or delocalized accross several sites can be generated with [`MPSDynamics.chainmps`](@ref). +Alternatively, a chain with a specified number of excitation localised on one site, or delocalized accross several sites can be generated with [`MPSDynamics.chainmps`](@ref). Random MPS can also be generated with the [`randmps`](@ref) method. @@ -100,7 +100,7 @@ The data (i.e. observables time-series) is stored in the JLD format which is bas The HDF5 format is natively supported across many platforms and languages (e.g. `Python`, or `Mathematica`). -For the data to be saved to a file after a run, the keyword argument `save=true` needs to be usedin `runsim`. +For the data to be saved to a file after a run, the keyword argument `save=true` needs to be used in `runsim`. The directory where the data should be saved can be chosen by setting a path with the `savedir` keyword argument. From 4a30ceec47ecbd35d679ed498682f3c0d903d9bb Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:19:09 +0200 Subject: [PATCH 17/24] Add a warning message --- docs/src/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/src/index.md b/docs/src/index.md index db010d7..93d790f 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -6,6 +6,9 @@ The package also provides strong support for the measurement of observables, as The package has been developed with the aim of studying non-Markovian open system dynamics at finite temperature using the state-of-the-art numerically exact Thermalized-Time Evolving Density operator with Orthonormal Polynomials Algorithm (T-TEDOPA) based on environment chain mapping. However the methods implemented can equally be applied to other areas of physics. +!!! warning + The documentation is currently undergoing massive restructurations/improvement. It's a work in progress until the next release scheduled for May, 2024. + ## Installation The package may be installed by typing the following into a Julia REPL From 2a53fc08cbfdd68cfff8dbcb2e326ec97f903117 Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:27:29 +0200 Subject: [PATCH 18/24] Update docs.yml --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 34ffe58..41fe3ba 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -3,7 +3,7 @@ name: Documentation on: push: branches: - - master + - doc-writing tags: '*' pull_request: From 234e3bc704727ca44f83d41f689e802d2f06ca69 Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:40:48 +0200 Subject: [PATCH 19/24] Update make.jl --- docs/make.jl | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/make.jl b/docs/make.jl index 9e29847..7d483de 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -22,5 +22,6 @@ makedocs( deploydocs( repo = "github.com/shareloqs/MPSDynamics.git", - devurl = "docs" + devurl = "docs", + devbranch = "doc-writing" ) From 328de08028efcba5b4cdaaa2bafe63e2746d5d1b Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:11:36 +0200 Subject: [PATCH 20/24] Update theory.md --- docs/src/theory.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/theory.md b/docs/src/theory.md index de2493a..8d6b7c5 100644 --- a/docs/src/theory.md +++ b/docs/src/theory.md @@ -5,7 +5,9 @@ We consider, in the Schrödinger picture, a general Hamiltonian where a non-specified system interacts linearly with a bosonic environments ```math - \hat{H} = \hat{H}_S + \int_0^{+\infty} \hbar\omega\hat{a}^\dagger_\omega\hat{a}_\omega\ \mathrm{d}\omega + \hat{A}_S\int_0^{+\infty}\sqrt{J(\omega)}\left(\hat{a}_\omega + \hat{a}^\dagger_\omega\right)\mathrm{d}\omega +\begin{align} + \hat{H} =& \hat{H}_S + \int_0^{+\infty} \hbar\omega\hat{a}^\dagger_\omega\hat{a}_\omega\ \mathrm{d}\omega + \hat{A}_S\int_0^{+\infty}\sqrt{J(\omega)}\left(\hat{a}_\omega + \hat{a}^\dagger_\omega\right)\mathrm{d}\omega +\end{align} ``` From 02d11cc0921a75f1950c6ac69f6a54f821aa0705 Mon Sep 17 00:00:00 2001 From: Thibaut Lacroix <57836508+tfmlaX@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:19:49 +0200 Subject: [PATCH 21/24] Update theory.md --- docs/src/theory.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/theory.md b/docs/src/theory.md index 8d6b7c5..4948cf7 100644 --- a/docs/src/theory.md +++ b/docs/src/theory.md @@ -5,9 +5,9 @@ We consider, in the Schrödinger picture, a general Hamiltonian where a non-specified system interacts linearly with a bosonic environments ```math -\begin{align} +\begin{aligned} \hat{H} =& \hat{H}_S + \int_0^{+\infty} \hbar\omega\hat{a}^\dagger_\omega\hat{a}_\omega\ \mathrm{d}\omega + \hat{A}_S\int_0^{+\infty}\sqrt{J(\omega)}\left(\hat{a}_\omega + \hat{a}^\dagger_\omega\right)\mathrm{d}\omega -\end{align} +\end{aligned} ``` From 9437744858b8743760f20fb4d85153647654fff7 Mon Sep 17 00:00:00 2001 From: tl Date: Tue, 16 Apr 2024 16:37:39 +0200 Subject: [PATCH 22/24] Describe observables --- docs/src/user-guide.md | 35 +++++++++++++++++++++++++++++++---- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/docs/src/user-guide.md b/docs/src/user-guide.md index dfd2a10..453060e 100644 --- a/docs/src/user-guide.md +++ b/docs/src/user-guide.md @@ -55,17 +55,44 @@ The method [`MPSDynamics.MPOtoVector`](@ref) converts an ITensors chain MPO into ### Tailored MPO -Explain that a MPO is just a list of tensors with matching bond dimensions. +One can also construct MPO tailored to the problem one is interested in. +MPOs are fundamentally a lists of rank-4 tensors such that the right bond dimension of the nth tensor must be equal to the left bond dimension of the n+1th tensor; and the dimension of the physical bonds of the nth tensor must be equal to the corresponding physical bond on the MPS. ## Observables -System and environment observables can be computed, as well as system-and-environment non-local observables. +System and environment observables can be computed, as well as system-and-environment 'non-local' observables. -Explain OneSiteObservable and TwoSiteObservable +Observables that will be passed to `MPSDynamics.runsim`(@ref) to have their expectation value computated at each time step are defined with the [`OneSiteObservable`](@ref) and `[`TwoSiteObservable`](@ref)`. + +One-site and two-site obsevables work similarly, they need to be given a name, an (pair of) operator(s) and the (list of) site(s) on which they are evaluated. + +For instance one can calculated the average number of excitation in each of the ``N`` environmental modes + +```julia + ob = OneSiteObservable("chain mode occupation", numb(d), (2,N+1)) +``` + +It is also possible to measure composite system/environment observables, for example + +```julia + ob = TwoSiteObservable("SXdisp", sx, disp(d), [1], collect(2:N+1)) +``` +which measure the correlation between the spin in the x-direction and the displacement of the bath modes. + +Purely environmental 'non-local' observables such as + +```julia + ob = TwoSiteObservable("bath coherence", crea(d), anih(d), collect(2:N+1), collect(2:N+1)) +``` +that computes all the chain mode coherences ``\langle\hat{a}_n^\dagger\hat{a}_{m}\rangle`` (and the chain mode occupation when ``n = m``). + +We note that if one knows the coherences and populations of all the chain modes, it is then possible to reconstruct the populations of the normal mode environment. ## Time-Evolution -Explain that we do TDVP +Explain that we do TDVP. + +A simulation is runned by the `MPSDynamics.runsim`(@ref) function. Local one-site and two-site observables, as well as non-local two-site observables, can be efficiently computed for each time-step of the time-evolution. From f3758b6b0716e1e472c920ee31eefecf8173c42c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brieuc=20Le=20D=C3=A9?= Date: Tue, 16 Apr 2024 17:20:15 +0200 Subject: [PATCH 23/24] Update models.jl docs --- docs/src/user-guide.md | 4 +- src/fundamentals.jl | 4 +- src/models.jl | 137 +++++++++++++++++++++++++++++++++++++++-- src/mpsBasics.jl | 7 ++- 4 files changed, 142 insertions(+), 10 deletions(-) diff --git a/docs/src/user-guide.md b/docs/src/user-guide.md index dfd2a10..172e9ef 100644 --- a/docs/src/user-guide.md +++ b/docs/src/user-guide.md @@ -1,4 +1,4 @@ -# Users Guide +# User Guide Here we explain the different steps to perform a simulation. @@ -47,7 +47,7 @@ Either way, this can be done by using a [Build-in Hamiltonian](@ref), [Convert a ### Build-in Hamiltonian -MPSDynamics provides several topical Hamiltonians directly in the form of MPO or Tree Tensor Networks such as the Ising model [`MPSDynamics.isingmpo`](@ref), the XYZ Hamiltonian [`MPSDynamics.xyzmpo`](@ref), the Spin Boson Model [`MPSDynamics.spinbosonmpo`](@ref), a spin coupled to two bosonic baths `MPSDynamics.twobathspinmpo`, nearest neighbour interactions Hamiltonian `MPSDynamics.nearestneighbourmpo`, the idependent boson model `MPSDynamics.ibmmpo`, (non-)uniform tight-binding chain Hamiltonian [`MPSDynamics.hbathchain`](@ref). +MPSDynamics provides several topical Hamiltonians directly in the form of MPO or Tree Tensor Networks such as the Ising model [`MPSDynamics.isingmpo`](@ref), the XYZ Hamiltonian [`MPSDynamics.xyzmpo`](@ref), the Spin Boson Model [`MPSDynamics.spinbosonmpo`](@ref), a spin coupled to two bosonic baths `MPSDynamics.twobathspinmpo`, nearest neighbour interactions Hamiltonian `MPSDynamics.nearestneighbourmpo`, the independent boson model `MPSDynamics.ibmmpo`, (non-)uniform tight-binding chain Hamiltonian [`MPSDynamics.tightbindingmpo`](@ref). ### Convert a MPO from ITensor diff --git a/src/fundamentals.jl b/src/fundamentals.jl index c02359c..87f686b 100644 --- a/src/fundamentals.jl +++ b/src/fundamentals.jl @@ -178,9 +178,9 @@ end """ findchainlength(T, cparams...; eps=10^-6) -Estimate length of chain required for a particular set of chain parameters by calulating how long an excitation on the +Estimate length of chain required for a particular set of chain parameters by calculating how long an excitation on the first site takes to reach the end. The chain length is given as the length required for the excitation to have just -reached the last site after time T. +reached the last site after time T. The initial number of sites in cparams has to be larger than the findchainlength result. """ function findchainlength(T, cparams; eps=10^-4, verbose=false) diff --git a/src/models.jl b/src/models.jl index 89a4a6f..c6599e4 100644 --- a/src/models.jl +++ b/src/models.jl @@ -4,11 +4,13 @@ dn(ops...) = permutedims(cat(reverse(ops)...; dims=3), [3,1,2]) """ xyzmpo(N::Int; Jx=1.0, Jy=Jx, Jz=Jx, hx=0., hz=0.) -Return the MPO representation of the `N`-spin XYZ Hamiltonian with external field ``\\vec{h}=(h_x, 0, h_z)``. +Generate MPO for the `N`-spin XYZ model with external field ``\\vec{h}=(h_x, 0, h_z)``, , defined by the Hamiltonian `` H = \\sum_{n=1}^{N-1} -J_x σ_x^{n} σ_x^{n+1} - J_y σ_y^{n} σ_y^{n+1} - J_z σ_z^{n} σ_z^{n+1} + \\sum_{n=1}^{N}(- h_x σ_x^{n} - h_z σ_z^{n}) -``. +`` + +with ``σ_x^{n}, σ_y^{n}, σ_z^{n}`` the Pauli spin-1/2 matrices of the ``n^\\text{th}`` site. """ function xyzmpo(N::Int; Jx=1.0, Jy=Jx, Jz=Jx, hx=0., hz=0.) @@ -40,13 +42,51 @@ end """ isingmpo(N; J=1.0, h=1.0) -Return the MPO representation of a `N`-spin 1D Ising model with external field ``\\vec{h} = (0,0,h)``. +Generate MPO for the `N`-spin 1D Ising model with external field ``\\vec{h} = (0,0,h)``, defined by the Hamiltonian + +`` +H = \\sum_{n=1}^{N-1} -J_x σ_x^{n} σ_x^{n+1} + \\sum_{n=1}^{N}(- h_z σ_z^{n}) +`` + +with ``σ_x^{n}, σ_y^{n}, σ_z^{n}`` the Pauli spin-1/2 matrices of the ``n^\\text{th}`` site. + """ isingmpo(N::Int; J=1.0, h=1.0) = xyzmpo(N; Jx=J, Jy=0., Jz=0., hz=h, hx=0.) +""" + heisenbergmpo(N::Int, J=1.0) = xyzmpo(N; Jx=J) + +Generate MPO for the `N`-spin Heisenberg XXX model, defined by the Hamiltonian + +`` +H = \\sum_{n=1}^{N-1} -J σ_x^{n} σ_x^{n+1} - J σ_y^{n} σ_y^{n+1} - J σ_z^{n} σ_z^{n+1} +`` +with ``σ_x^{n}, σ_y^{n}, σ_z^{n}`` the Pauli spin-1/2 matrices of the ``n^\\text{th}`` site. + + +""" heisenbergmpo(N::Int, J=1.0) = xyzmpo(N; Jx=J) +""" + xxzmpo(N::Int, Δ = 1.0, J=1.0) = xyzmpo(N; Jx=J, Jy=J, Jz=J*Δ) + +Generate MPO for the `N`-spin XXZ model, defined by the Hamiltonian + +`` +H = \\sum_{n=1}^{N-1} -J σ_x^{n} σ_x^{n+1} - J σ_y^{n} σ_y^{n+1} - \\Delta J σ_z^{n} σ_z^{n+1} +`` + +with ``σ_x^{n}, σ_y^{n}, σ_z^{n}`` the Pauli spin-1/2 matrices of the ``n^\\text{th}`` site. + +""" xxzmpo(N::Int, Δ = 1.0, J=1.0) = xyzmpo(N; Jx=J, Jy=J, Jz=J*Δ) +""" + longrange_xyzmpo(N::Int, α::Float64=0.; Jx=1.0, Jy=Jx, Jz=Jx, hx=0., hz=0.) + +Gennerate MPO for the `N`-spin long-range XYZ model with external field ``\\vec{h}=(h_x, 0, h_z)``, , defined by the Hamiltonian + + +""" function longrange_xyzmpo(N::Int, α::Float64=0.; Jx=1.0, Jy=Jx, Jz=Jx, hx=0., hz=0.) u = unitmat(2) @@ -77,10 +117,20 @@ function longrange_xyzmpo(N::Int, α::Float64=0.; Jx=1.0, Jy=Jx, Jz=Jx, hx=0., h end return Any[M[1:1,:,:,:], fill(M, N-2)..., M[:,D:D,:,:]] end + +""" + longrange_isingmpo(N::Int, α::Float64=0.; J=1.0, h=1.0) = longrange_xyzmpo(N, α; Jx=J, Jy=0., Jz=0., hz=h, hx=0.) + +""" longrange_isingmpo(N::Int, α::Float64=0.; J=1.0, h=1.0) = longrange_xyzmpo(N, α; Jx=J, Jy=0., Jz=0., hz=h, hx=0.) +""" + spinchainmpo(N::Int; J=1.0, hz=1.0, hx=0.0, i=div(N,2)) + + +""" function spinchainmpo(N::Int; J=1.0, hz=1.0, hx=0.0, i=div(N,2)) - u = unitmat(2) +u = unitmat(2) Mx = zeros(4,4,2,2) Mx[1,1,:,:] = u @@ -103,6 +153,12 @@ function spinchainmpo(N::Int; J=1.0, hz=1.0, hx=0.0, i=div(N,2)) return Any[M0[1:1,:,:,:], fill(M0, i-2)..., Mx, fill(M0, N-i-1)..., M0[:,4:4,:,:]] end +""" + tightbindingmpo(N::Int, d::Int; J=1.0, e=1.0) + + + +""" function tightbindingmpo(N::Int, d::Int; J=1.0, e=1.0) b = anih(d) bd = crea(d) @@ -124,7 +180,7 @@ end """ hbathchain(N::Int, d::Int, chainparams, longrangecc...; tree=false, reverse=false, coupletox=false) -Create an MPO representing a tight-binding chain of `N` oscillators with `d` Fock states each. Chain parameters are supplied in the standard form: `chainparams` ``=[[ϵ_0,ϵ_1,...],[t_0,t_1,...],c_0]``. The output does not itself represent a complete MPO but will possess an end which is *open* and should be attached to another tensor site, usually representing the *system*. +Generate MPO representing a tight-binding chain of `N` oscillators with `d` Fock states each. Chain parameters are supplied in the standard form: `chainparams` ``=[[ϵ_0,ϵ_1,...],[t_0,t_1,...],c_0]``. The output does not itself represent a complete MPO but will possess an end which is *open* and should be attached to another tensor site, usually representing the *system*. # Arguments @@ -387,6 +443,26 @@ function spinbosonmpo(ω0, Δ, d, N, chainparams; rwa=false, tree=false) end end +""" + twobathspinmpo(ω0, Δ, Nl, Nr, dl, dr, chainparamsl=[fill(1.0,N),fill(1.0,N-1), 1.0], chainparamsr=chainparamsl; tree=false) + +Generate MPO for a spin-1/2 coupled to two chains of harmonic oscillators, defined by the Hamiltonian + +`` +H = \\frac{ω_0}{2}σ_z + Δσ_x + c_0^rσ_x(b_0^\\dagger+b_0) + \\sum_{i=0}^{N_r-1} t_i^r (b_{i+1}^\\dagger b_i +h.c.) + \\sum_{i=0}^{N_r} ϵ_i^rb_i^\\dagger b_i + c_0^lσ_x(d_0^\\dagger+d_0) + \\sum_{i=0}^{N_l-1} t_i^l (d_{i+1}^\\dagger d_i +h.c.) + \\sum_{i=0}^{N_l} ϵ_i^l d_i^\\dagger d_i +``. + +The spin is on site ``N_l + 1`` of the MPS, surrounded by the left chain modes and the right chain modes. + +This Hamiltonain is unitarily equivalent (before the truncation to `N` sites) to the spin-boson Hamiltonian defined by + +`` +H = \\frac{ω_0}{2}σ_z + Δσ_x + σ_x\\int_0^∞ dω\\sqrt{\\frac{J(ω)}{π}}(b_ω^\\dagger+b_ω) + \\int_0^∞ dω ωb_ω^\\dagger b_ωi + σ_x\\int_0^∞ dω\\sqrt{\\frac{J^l(ω)}{π}}(d_ω^\\dagger+d_ω) + \\int_0^∞ dω ωd_ω^\\dagger d_ω +``. + +The chain parameters, supplied by `chainparams`=``[[ϵ_0,ϵ_1,...],[t_0,t_1,...],c_0]``, can be chosen to represent any arbitrary spectral density ``J(ω)`` at any temperature. The two chains can have a different spectral density. + +""" function twobathspinmpo(ω0, Δ, Nl, Nr, dl, dr, chainparamsl=[fill(1.0,N),fill(1.0,N-1), 1.0], chainparamsr=chainparamsl; tree=false) u = unitmat(2) @@ -458,6 +534,13 @@ function getchaincoeffs(nummodes, α, s, beta, ωc=1) end ## +""" + readchaincoeffs(fdir, params...) + + + + +""" function readchaincoeffs(fdir, params...) n = length(params) dat = h5open(fdir, "r") do fid @@ -479,6 +562,26 @@ function readchaincoeffs(fdir, params...) return dat end +""" + ibmmpo(ω0, d, N, chainparams; tree=false) + +Generate MPO for a spin-1/2 coupled to a chain of harmonic oscillators with the interacting boson model (IBM), defined by the Hamiltonian + +`` +H = \\frac{ω_0}{2}σ_z + c_0σ_z(b_0^\\dagger+b_0) + \\sum_{i=0}^{N-1} t_i (b_{i+1}^\\dagger b_i +h.c.) + \\sum_{i=0}^{N} ϵ_ib_i^\\dagger b_i +``. + +The spin is on site 1 of the MPS and the bath modes are to the right. + +This Hamiltonain is unitarily equivalent (before the truncation to `N` sites) to the spin-boson Hamiltonian defined by + +`` +H = \\frac{ω_0}{2}σ_z + σ_z\\int_0^∞ dω\\sqrt{\\frac{J(ω)}{π}}(b_ω^\\dagger+b_ω) + \\int_0^∞ dω ωb_ω^\\dagger b_ω +``. + +The chain parameters, supplied by `chainparams`=``[[ϵ_0,ϵ_1,...],[t_0,t_1,...],c_0]``, can be chosen to represent any arbitrary spectral density ``J(ω)`` at any temperature. + +""" function ibmmpo(ω0, d, N, chainparams; tree=false) u = unitmat(2) @@ -501,6 +604,14 @@ function ibmmpo(ω0, d, N, chainparams; tree=false) end end +""" + tunnelingmpo(ϵ, delta, α, s, β, d::Int, nummodes::Int; tree=false, ωc=1) + + + + + +""" function tunnelingmpo(ϵ, delta, α, s, β, d::Int, nummodes::Int; tree=false, ωc=1) cps = chaincoeffs_ohmic(nummodes, α, s, β; ωc=ωc) λ = 2*α*ωc/s + delta @@ -525,6 +636,14 @@ function tunnelingmpo(ϵ, delta, α, s, β, d::Int, nummodes::Int; tree=false, end end +""" + nearestneighbourmpo(N::Int, h0, A, Ad = A') + + + + + +""" function nearestneighbourmpo(N::Int, h0, A, Ad = A') size(h0) == size(A) || error("physical dimensions don't match") size(h0) == size(Ad) || error("physical dimensions don't match") @@ -541,6 +660,14 @@ function nearestneighbourmpo(N::Int, h0, A, Ad = A') return Any[M[D:D,:,:,:], fill(M, N-2)..., M[:,1:1,:,:]] end +""" + nearestneighbourmpo(tree_::Tree, h0, A, Ad = A') + + + + + +""" function nearestneighbourmpo(tree_::Tree, h0, A, Ad = A') size(h0) == size(A) || error("physical dimensions don't match") size(h0) == size(Ad) || error("physical dimensions don't match") diff --git a/src/mpsBasics.jl b/src/mpsBasics.jl index 0005058..b7b9577 100644 --- a/src/mpsBasics.jl +++ b/src/mpsBasics.jl @@ -680,7 +680,12 @@ function bonddims(M::Vector) return Dims(res) end -#calculates M1*M2 where M1 and M2 are MPOs +""" + multiply(M1::Vector, M2::Vector) + +Calculates M1*M2 where M1 and M2 are MPOs + +""" function multiply(M1::Vector, M2::Vector) N = length(M1) length(M2) == N || throw(ArgumentError("MPOs do not have the same length!")) From 59f5528c0fc4bb6d89363d9be698dc743e743dba Mon Sep 17 00:00:00 2001 From: tl Date: Wed, 17 Apr 2024 11:18:38 +0200 Subject: [PATCH 24/24] Explained chain coeffs finite T --- docs/src/user-guide.md | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/src/user-guide.md b/docs/src/user-guide.md index e6b198a..3d2ae10 100644 --- a/docs/src/user-guide.md +++ b/docs/src/user-guide.md @@ -2,7 +2,7 @@ Here we explain the different steps to perform a simulation. -Examples with detailed explanations can be found in . +Examples with detailed explanations can be found in [Examples](@ref). ## Initial State @@ -45,6 +45,8 @@ Write a quick explanation of the how trees are structured: parents, child, nodes In order to perform time evolution and have access to the dynamics of the many-body state a Hamiltonian needs to be specified in the form of a Matrix Product Operator (MPO) of as a tree tensor network. Either way, this can be done by using a [Build-in Hamiltonian](@ref), [Convert a MPO from ITensor](@ref), or creating a [Tailored MPO](@ref). +In the context of Open Quantum Systems, custom chain coefficients for the environment can be generated for finite temperature simulations, and/or user provided spectral densities (SDs). + ### Build-in Hamiltonian MPSDynamics provides several topical Hamiltonians directly in the form of MPO or Tree Tensor Networks such as the Ising model [`MPSDynamics.isingmpo`](@ref), the XYZ Hamiltonian [`MPSDynamics.xyzmpo`](@ref), the Spin Boson Model [`MPSDynamics.spinbosonmpo`](@ref), a spin coupled to two bosonic baths `MPSDynamics.twobathspinmpo`, nearest neighbour interactions Hamiltonian `MPSDynamics.nearestneighbourmpo`, the independent boson model `MPSDynamics.ibmmpo`, (non-)uniform tight-binding chain Hamiltonian [`MPSDynamics.tightbindingmpo`](@ref). @@ -58,6 +60,13 @@ The method [`MPSDynamics.MPOtoVector`](@ref) converts an ITensors chain MPO into One can also construct MPO tailored to the problem one is interested in. MPOs are fundamentally a lists of rank-4 tensors such that the right bond dimension of the nth tensor must be equal to the left bond dimension of the n+1th tensor; and the dimension of the physical bonds of the nth tensor must be equal to the corresponding physical bond on the MPS. +### Finite Temperature and Custom SD + +In the T-TEDOPA framework (see [Theoretical Background](@ref) for more details) finite temperature simulations are done with an effective pure state description of the system and the environment where the coupling coefficients (or the SD) is temperature-dependent. + +The corresponding chain coefficients for an Ohmic or a user provided spectral density (that can thus in pratice be either at zero or finite temperature) are computed with the `[`chaincoeffs_finiteT`](@ref)`. +This method is based on the `ORTHOPOL` routines[^Gautschi] + ## Observables System and environment observables can be computed, as well as system-and-environment 'non-local' observables. @@ -69,7 +78,7 @@ One-site and two-site obsevables work similarly, they need to be given a name, a For instance one can calculated the average number of excitation in each of the ``N`` environmental modes ```julia - ob = OneSiteObservable("chain mode occupation", numb(d), (2,N+1)) + ob = OneSiteObservable("chain mode occupation", numb(d), (2,N+1)) ``` It is also possible to measure composite system/environment observables, for example @@ -173,3 +182,7 @@ Dict{String, Any} with 6 entries: "times" => [0.0, 0.0005, 0.001, 0.0015, 0.002, 0.0025, 0.003, 0.0035, 0.00… ``` + +[^Gautschi]: + > Gautschi, W. Algorithm 726: ORTHPOL–a package of routines for generating orthogonal polynomials and Gauss-type quadrature rules. ACM Trans. Math. Softw. 20, 21–62 (1994). +