From 25dba7be9f31f79507d7632bc4acf68aa8e3c849 Mon Sep 17 00:00:00 2001 From: lkdvos Date: Mon, 3 Aug 2026 13:14:18 -0400 Subject: [PATCH] docs(examples): add TFIM ground-state and SU(3) Heisenberg examples MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The gallery had no beginner entry point: every example already assumed familiarity with the API. `groundstates/0.tfim-groundstate` is a complete ground-state study of the transverse-field Ising model — the same model the tutorials use — from a product state through DMRG, magnetization and correlation functions. `excitations/1.su3-heisenberg` covers the SU(3) Heisenberg chain using `SUNRepresentations`, which is the only example exercising a non-abelian symmetry beyond SU(2). Its dispersion reproduces the soft-mode location of the reference but not the reported gap value; the page says so explicitly rather than quietly presenting the number as agreement. Co-Authored-By: Claude Opus 5 (1M context) --- .../excitations/1.su3-heisenberg/figure-1.png | Bin 0 -> 28848 bytes .../excitations/1.su3-heisenberg/index.md | 262 +++++++++++++++ .../excitations/1.su3-heisenberg/main.ipynb | 302 +++++++++++++++++ .../0.tfim-groundstate/figure-1.png | Bin 0 -> 23421 bytes .../0.tfim-groundstate/figure-2.png | Bin 0 -> 21132 bytes .../0.tfim-groundstate/figure-3.png | Bin 0 -> 18340 bytes .../groundstates/0.tfim-groundstate/index.md | 199 +++++++++++ .../0.tfim-groundstate/main.ipynb | 310 ++++++++++++++++++ examples/Cache.toml | 2 + examples/Project.toml | 1 + examples/excitations/1.su3-heisenberg/main.jl | 190 +++++++++++ .../groundstates/0.tfim-groundstate/main.jl | 185 +++++++++++ 12 files changed, 1451 insertions(+) create mode 100644 docs/src/examples/excitations/1.su3-heisenberg/figure-1.png create mode 100644 docs/src/examples/excitations/1.su3-heisenberg/index.md create mode 100644 docs/src/examples/excitations/1.su3-heisenberg/main.ipynb create mode 100644 docs/src/examples/groundstates/0.tfim-groundstate/figure-1.png create mode 100644 docs/src/examples/groundstates/0.tfim-groundstate/figure-2.png create mode 100644 docs/src/examples/groundstates/0.tfim-groundstate/figure-3.png create mode 100644 docs/src/examples/groundstates/0.tfim-groundstate/index.md create mode 100644 docs/src/examples/groundstates/0.tfim-groundstate/main.ipynb create mode 100644 examples/excitations/1.su3-heisenberg/main.jl create mode 100644 examples/groundstates/0.tfim-groundstate/main.jl diff --git a/docs/src/examples/excitations/1.su3-heisenberg/figure-1.png b/docs/src/examples/excitations/1.su3-heisenberg/figure-1.png new file mode 100644 index 0000000000000000000000000000000000000000..ac9a559d576d9700a6fd9e6cad649ce33e886918 GIT binary patch literal 28848 zcmY&=1yqz>+b+$J4k4m+NvD8x3@srgsnVSyNC;9xHz?9AAqXNNp&$*?Ap$BTNGgqh z#JTyt|3B*--nGQn^~}uk?0v@-_ns(iEfo^N8-y4b7$j<{iny7J1{4$&=w+Rg#a2 zu8xtuS-kqSR6Z`Mx@%T*^TyMt2ZB_c59P@e{q(dYRJRW1UA+SXojqFjRu5+WoqFBA z-Td##6Svt9e{FwR2y3#yr(z`DbJrod{0l|_daB`3VW|y<1P0&Bf9Gfa5*TC+^!4Y( zhHPuT1r9|=N9P8fH#RlR3=L_${ZLWC!^XzO$r;6}cJ=C2+H3S$*|LG>OMNNy^z=Mb z<Xvb|6&6JlfuhGz$K72U)#`OIp zeP(iUa$=&kscHGESNATyeknIJYxD>sGgVT0_4MzbHxj<=kA8N?Nk2WDaO)#t!N25Tsl)ExUf}Wa%jeH2uU)%VytFo6@~z%Q@7}$-w{Ma8<}UMFtrs$$ ztBG-OarO1}r8Y^@_Hyl~$Zj|%B%{9LJMkXdR$>YT(C6~ACuR}sie186K zE0tDt+|%9NeXb?o_-kEF&C`SR7us}p?+!ow=(o1E#)KxN6&q>4SgD9OK04Y~ zcb)yhtIOu&Fh6 z!}K!#Mp{~xE_Oq`y;H4$7X#_H{_U@I@W;l+@^EmZ2|FaGr>BR9EBpDK#L?W=$`T{H zapMLpZAD(*C;i7B9w)o~{N9^Wf)Ed>#BOzUb#ot|vg=b*Q5oF7zq!0@V{2PnS(%fO z;Rl;ssFDyK5rL0~CmLV|K?V`k*Vkv&9eZ8!iL;j0&_YK<>%Tve8O88tb8%Qyd_29N zrJ|&yKwHMWMgw-*%9BP{{{p22F{y1ngxTU$#j>YP?t z$=7QA@9?*Ug@sHJ1Ox@I!wagbt4nbm zL_|eJJHkoECnhNC7=@xrMFdCq;_0QMk?(41DBh*4udln#wfvxu*@i__Kpg-3M@02& zWhI4`(8GMfIvRa&tuaq(aj~tMn%a0zQ)43&`fzJ*m|y(asTj(B{!{P)_tuZ* zYf&jmMhwcn*QluKf4ke**wE2s$6qbOE^{NplB2*6M@N^Rfrp1TUaa}8HLx{N?Y8XzwTsJdtDg8bM%5vV zk)pkf_LBl>X=y&bzI4)lwJpaSh=d-=r-wY@7N+&i3(d;^{%*-Sj1>i*AFp)B(L7!m za@m}Mbok(ZJT@}2U6T83@!C-4ZMU9yIwmG2NUg)eLzjkY;YCG7kT=UKD>T&9#0)au zJ3AG(o1n;acX!7YucTyU-8V6DG&g6Y-s9%w4cJ*!QdSPn%F1eNY;10Be)mpjZ@lDg zuE*oYyu7?3!op&-TK@k2_wHRqaY#sH_$nCjP|alqUhhSrelCdZwerUgo=9lUOzkdxwXI2L^;i zM6UW9Lg6rLeU_b?8jc*BoP6TpVfiP7iHnPnX=#35`{Bd$`L?D3JQhi z$4*X8XJ=;=6ci2_f4-D|eQVKyQ&=Rd32Dp0!Lk46M{_~JBIF08A}J{;B+fu}aBy&0 zS=sXP^32T4>goz>64Gj5U~u#1 zO-CpJMn+3ZOHzLOrKP34V`CostD`P^n7teYlbv$S=ClEWHy*yJLu}2pCLm9CdKgTZ zJ3jdCAyE-m7^t{%#UI~9!EKeUbLr?)H>pi+s*TDG-Yn8ocyG;i2~?;g z(8F_`7A`I>PC3^@?Sb9XL+MOF7>7yR5zVB#dbLX*8B5mP)ARMB72;b+Vnoe}+y?WR;B!3`8BqSld1m5)z_Z@rr%Df6vr8PYbn8x_f(9 zm6qB!kvL?`eth~q?-s1&;m*&V(njiqGQASWU$m?BV1~#kA>XnV6B2FvT%YG$H{mZ z6#W+57!|FfIkl+wpZlZ{9aSB~VbDMVpn}T3aJI2|k(xT`oPtIC)*tomk*B93;`fi{ zzp(wRYELE{u(7a^sMBw1Pq;^JH@h`UpEK>(TM?^vuj< zONXS@$gZ~P;d{`u|Fb7yZ)Mo-&g<8&i|^(>eDELuLjL??1vJhtukSfJI>L(sFU|ur zG-4AH5=u(gBRa|gAKbcC!+tkMpm-SCMUIs3F0`4AuT{5Ne=RR-=13hw#ek%OMB3Zg zS%Zg*qF}Fgn;X)nhVlgEo$~6{FJHdop7!KOKfUomCAy$kBi-ZQq08;tw*vz&poH|l zg86-Y!f?7~Wm(7ZDMuy5E?b zlte~L>uhd5;@tTcE+?Ym(Y|-@qvx8grKKf2i=5o2lY@;ge;T-4uS6?bCcy9h{rh+B ze6D=Z{JFm$9w{p=t+#3q9!D+Z=DmCOeoxo1OG!yFGh0F_g=B+f49ON^$IZo+A!yYN zU3=?$BLy{eZ^NqHP*!?&_D7d*^$iUT&{z`_6IoQ^5raKcmR-?Tp`5<2t^E-24+_O@ zN5mCqzmHG$*DlVs0#PE^*w}$*2VXTaML+uP{Q~#{FVwhm$E4O?XFLx3RQ5j!%fZjT zBDoEkGAul z)j{+zp>JwsP3`jvyO8C`2Ie%T#>bP&BVmp1YH7Kipf!d~=UzieQ$Sp&rWSs*8GHQ} zR02{uaxS}yzLURW#s{ow?mt~yu3p3NKlAu>8GjZ!;^mx z4}UT2E_C3BFyfGOo=oJ5%2M->^L`Ns5q?kVCxpjN}vN(C7BqSvhXvN>Xdzbvk ze0OJe7yh;wSXW&wC?W!F&%XT?89lJ(xy8i;~!bHEqUP_}?sKm$4dHAvH@M28Y67lYLe`wZEQL>+V} z(Rn#rDJm;lQeRdd-~)uIJ>A{RXq@KPP_1(%yd2jj%Aii()6r@4KNbp9BD{ntH_ldw z-DHI|%^KVnfL}1k`1cMDE@uiM@*xE10c)*05A44>c_%I|E)C#MM&{v2Ca;)InEc(l z{JgwxpmHAlDs5=+fy#}-2NprNc3J82wF`=ie?d)i`_W`$VIk=mAiNE zK7PD+lhv(2jSPjtG|#{K9>HXrq5JURLnz#t4TPUCqP6|r0^_Q$KmV2Kc7F6T0n+BO zghAnjx~zZ@)Z2x~=7@eRE1e)1iet44AL;As3w4u3E9+-radEx#^t+~}rhDZEP!=`q zpMNe*>8^Ef8ih#y{eBJ#vZ(XaTi`Z8ii8bP(u=eMR|lU9f7FUOu4~zK?W-nfUvL+r zC5`_Xn^1Ya%n?n_b6v{kZAONPuWw^SLG&GiYTJf=|-eQFe{ng)CH?Z#)>Z(Ewq*kE~oRs`I{c{Jvx9`D* zot<6b1+f_3uiSytZuD$_K>LuR;a;d9(L1__Rv~+cK z;f5>$e3GcDy-`zEyHb49=>9K_P zIYlk*VGSs|+_kYVgA$2DneW-o!?Z{f2q;ZMzxbR`Dx)|ZC4Y_Zr_U*5w|ZrlBH;$V ziKXrLFWz=_5#5z+ktrz@nS=3BQDo~m(757}mXrOr@oHRmyJD`PmIta)^XTS==}rD&>SYPVt1MnqNu1?yG_hP)!)@+0|;?+boAup1OPXx zDq^G$y5;!Tn7+O~HU7=N|TUu zI3AZW-}*7+&dE(I%}b`Ed=W-L4d^EXIRnsi8QW|_(6t(esi@# zE!p~PhZ7i@&o<))QXUfi29F!TeZKeSs*RPEe@5~Z26IvdZSSTFh4uXWJ=dCRmiFR> z*TMQds2NOpatMeq8k$TXW3sZc&lcd5p;JH!{6^(|2I2)73cy=cc{#;N+3VNQTUY#{ z+@T}BXG?yCYygs}Z(yL6E0g``J`37*Fr&+|S}R-P-kjuDoPj(3O#jlVPlbep zaEJh@b!#M(clP#{R#a&8k{RX#!e+h{KeQh_8004=An-lhOmAvBDb*=7;d2j#mf15i zBXRSlviq#2rY6ZPk~)I*Z@!;De~t|;s;@VAd*432Cto4L(a8zG*#Me2oRrSd#^x$5 z?dHbDx8!n!j-H-gAQ$rIG8K8~aFJSy5zizjH@Mh|(02#SG9BFWI*<#o_wvp_@=$sB z@L4;W08ot|Kqgp(OF}^{y}P>`qW6)Ah$wx{P9cI+I`I5MYinz6?p!jPdK#h!IuFj> zOrV;1c>?C2FxuKbf4<}EdkjG6^mru~V0g3V+86-xbhY2W%r4XPoiPYuuV0Hw1~<1Y zQz$7Z#g1L>E&x@C+1oBNow0)?BqWa?KhBh~^YC~V9*!6P6S@m2A>r=Mj>U(Jkp5Dd zpFmZ_;>*j*02i9IwY33c2hpNa09vN$0rz|BW1N@$XNxiXNR*bA)+MojEo!^8Bu@97kB+uc&n5A z*)oNs_a8+BFy+nfjeAEsKUaoxOB|XC3PP%Jfzi_e_`Q0y&h>``)GS+>*Yl)5=bruJ zMXkp0w@d+;13m>vxZ^nyZ*Cq(bb6hb{YW1E75dJuE&$mXQEmj4E-U<{*BqH`f2cx- zp&0bpnB*nyX!6>40`&xqMnf`?(n&n`eU)h>)22}%16>_>iLCz-63}%mlpF2~B!DH5 zlmM7O+dc;j0GbZXZC6$V%Gg*O)J!v8Mn*Y!a{#o{?`$B;tZH{5cJN4U?C%ZB?&XT0 zO3!tXfq{Y0P7gM|&cSU1$^)VTPyYPnOG87$l{v37+ymGPWrWw(>=~dA0B2CLK@Gfy zvcJ^pBu;S;P=?m^K|ZHPk0>+=w=tDCrtden=Ytk-U`77q$&(Q7O6sw(vGuJxHqOpG zMYz|~aCZp^2u{gKBdna9xIM+fEr3OY^tV$}J9#X$hYil6LZjan6rk*1BT$H*9pGi6 z)zMmsU#rYA)6)s)n}NjU531Ar1mdQF4wpAJZmj<3Y|>Dp;pKGz8fTag6~N3mYQd2H zWnD^y^_)f+jHhFLHO-&qJWl~Fq-E5wBQb2aX;~Y0%jN~CC5wYRK2g!Fq)A08{h1h@q z06hpoWxNvvv9dA{A-cM{pxF$#Mv(kMB0w;a^4W%cIyQ|Hu(q>PQC0>n`l#`~w6rwH zig?~97i%TCur5?|bU&O0LI-Wj%geude`Z1h@&#Z9MZiZY2V|g&^E1;Iwh8^qC;$GH z6c+;?1Yznu7mK`-QWuaAxX#nlv*lxzyh1a9f=?VWGj12`!xEX>5j1hqUpJq_0l3{*_JIPC520t+{| zckc_-dB_%B$`|SBoKrH;g`jr;cso@w05VBN*0#A_R#Nh{+>k$C?QZN|9spIS<3Lsc z$U;|SQI0K@O`v2_9EbJs)X;$FtZQj$0d#sPiLd7tuT4zoL!UiqE*lj-1N;mQ1?*5+ zc{%7oKl=LAwx8|o?e#<9kBbX4SOdm^gM&j!MdfI3-_Y1daE1%Y+>Y@3??eYVcpV0Ykfz<>jZ2+$Bn~dFW|{z#q$IdM=b&T&^11}00&0Gs;zIx# zR2Yq-)NTw6kg8$|Yj!XTtc9+V+%JzZ!z2h><5+;Dz>!a6oo;8B^gnVZ?&uu+h9|6ijk`S+r%SOA0c8#_rO>Tg z5M*R1NNLz91QQDjOSeiil37hiQZkdX>Pol;ln#hKw}q>ZXd|fe^|9_6aJ4a`HRNE<&iPtE=|t5eR{o zyr$jyM(#7pni$|AY^P2NU;GqxfB;ug4*_-29XsSyayclPfmEj)Y5u8O4 zFMNy{>(&(CCuJeRnrd`<6w?((TN_`vqt zZFi`N><`}C852iAh$U@pB-{oLi)l2H$=cEq%ZZ|k5Hhu%uJ_f*GOM3@QC8RuudYz) zJeG>}iRIB9rp{1}6Q{tje%gOl82K16kBX9@K}4J2$h`}uW@7Z!7H-P9GyP*eTchaW z#;2#dY~?LfOM9;fsD5^FRVtmi?z9s!IdX)d!^1^W|BzsqgbWy?gA^4;SCwzniN=oU zDE34k|M&?`{Wxobk`hY=kd0CKkpvLmmRNFGweNqn*P=$+Ppt zQ9Durp`*{u^TC0tAyY<1HgPjB(|ah}eHBkffipk*)*B2AN+!lXaBDBs-VhZ&UmnTD z-q|U3dH-wwdE%Dpq9516vcl}}$Ef8)G0Yk5T{R620DSMkUan&dD#D^?mh;cI-@nWC z-xRv3r(xrh0y!$V7a?_~c%@>raBUwYTYo zlDtI1ZX5)?)FCL&FG|kLG&M5faO4acVrxpH_l)?<7(;ktIOAJQsK_-Al#USO)AqLe z&HPeu=OQ9{g0b;IvX%t34InMiJw86Z7T>+%=;+S?3vq8fMJ)dQo&Ef|=VE6RaGs}r zenM0$pyOg;VM+XZD1k1?UBztqV20|w8nDB`KPeoeb$gZ%C`>`1azBj zm`!-SDjYu`abIhDECtM7IB#FGGM1i@Y%#?6TH4_LYvB5?j!(hZ4AOpJg0TS7ZzF`V z3it%-jpUO}`)y*tMnH2kRaFIU-`@K6ehXCNv(wWLA3kKXxN2w&K*xlIg92#o;u41h z+L8+W2doi*{g;wIbPA|db~ZM^-1+Y}jP&**m?)7*Z6l*dizz640Cq2hDL|7fX#0#7 zFeJbO4YvSZO)Kpu{P?Pw*&H~;fcMX!-I5ez`kq9cOUG6$=98Rlmt|L7;89#!B!Qe~^ffxvlf=MBK>DMo2G{|1UU}Ovo3=mM<1p5yR z!S42U%froSu$n{huT;K%jY5Q>(LBcQSQ!~V_4jjgaP)rrmMOmQcP=mxx`CAx)D ziC7HQQbIlM!_?H%jd@1Q+8U@vPpf$3FYlQ{rD#sZcZJFAl~-45WLV*b8S>C%(0dma z-O#`wN5sj%i9ZQAdVYS}#p|-N^p`Kc?lVEYfQ zTla*8z9HoDt5?hLWMF7^P5Htk2>^OI1hm~a;0jEat}N(+FzrF~JHyu8d>eQZ6T0Hf z8xRq=Sg|7_!fEF5i{C1?BnO8Tz6jV^2%qxCEHaY_=zKBqXW)WoXsF0{923=Fw2G*Hjf3S7;^%S+_K38Yk@ zpBXZWFgh_b6o0(Ax=Kw$)9+vZ{{70=Mi3q{M4SLHPdh&WK{Wf5H;y&AXpo|0u%hQm8RW}R}v9#1Y#2u`6 zpgT?{NcsdrP_=zg&97dUAwB=~+_c^fE&$1#grv&)$EB!y*pG(M^~Mo2+g(x za6_qkLS~3+KH1@8)#2}{7Cqcp{}E*KgPD>6m_$}ml7)jqpMUmkH~PXc9E+Oifp!Ah z^_vMjERn-hsgP0={rww&2%yA3{hs*p#pR>`l=7%3n0|=|pmqy}Gj6+PY2yL`gqkP` z2oG@U>(?+PA`(y!1j7H{@Apv3^BtO?++5>-=-l=uhToY=LLidbj!^tr*A3XbQFqST z+o>}&DwS*MJoOz)LdK+&`5c@)JpSAB!Jw6c#|0r$bAYQ5L;|i(8ceOMjkAN*qSO^= z=T}rx0@mu6DrZ|;7^!ND%!kPzvoG%8ShqRCxR&WVYc&{y$j@hLbq6!^bQoBwe;YIt zataDyZ3H3a%$J;F`Rl~k7_-{D>2H*`kHnw-n_bHGV*kG1M#TOQa-fe*;AIYjs>$p8 zZ8aXNQC?FlB@Q7#{ShQIho{Gn4Gq7N(hig3FfH9592oH5`!xu*E=|lA2Pdc70a}pD zpjxE%k5sU6JrWRqwq-YF_K~qfF5XO#1wf9PS{Z;#08RF|HeU7tV!kYKvs)o|>yVEU zVHtX1FbjTGLx@PO3jrEsdf?7fW*199C7xclEwbkMA1pD3H;%-Z2{FT4rc-R(uo8U8 z!z;M$7|Kj}{Xd`W1v~bi_m_xX&E=2WD4Q_q-QgC6=OSQE2tB(IU7%jt`Xg!qZ&Bzu zTDH3Payp?{D|_aA50Hl2_l8GPZ!N&j0ny9_N@-2R{TBaY5a>a=sj(gO0Ll#B+2LWh zqA0Ij1}^I$kmP@0QZqJ#CRDhJkm2-EW{<_Kyfni z0~fyS4Jio412hI&aSzs-uTLmw#oRwlO;IxmTePD=lFkC4FD-r6yw$Qn_~;dG02_eN zqq-|HyE1Nu!b%~clyr#++NWwTa_)JN^8v16krV+1^Z{ z18c#}H0E>oi7jgrbAQlY?3*!Hgo&0|DDBc%LjpS!xi>EX+WXY6r-BbiIZ&gI!Ha=D z3_<@ul?Xx(C<5U<13kS=NpDxHlIX}t_2?cu`{N&wIIJM=^2-AM2;p$omL?mU17|G2X zv+7%=8o)*=o^JCxgbAIoV-SUaf(@KhLtXtJ%*qrN6hOl`fc5w~F#(&~0TRIX@29}m zK_sJtDTm{|m1*b0i88%!_gkyUHoytJn=Nqwe&7ksXOPlisEp{U=)xfnFYnnx1Op65 zR90O6oPsT8Yh&{ph6FUr$mku9{D-o{fmI^%L9-Xis2Dt;`QWFjswyWZ2Yy57x7Q?e5)&ZQ zlxo{^UzY)1Wd<{OtD}W5b~n~}25?hZQL&-9`IZ?dP3d)qfKU(i_hG%Pp6FrE1jXS| ziNznN5HEXX{$0Va)VlKMVo#j}LhgG*t{T6erXRKCBfX_g3opf*-loer0CU=89;%pW zj~g8V=d?tCca8mIN!zk0sq@3BKrFc+7?fEu0U($>1r2KCF1R#Qnwx`{u;-6Y zj5nFb=@S_s-_W~2fsp&E$Jrd%5RDUkXsMQXiF%@umx{Z{+21)I^(sS zbar+Me8i9~`&d=A1qRUa($dklh{LsUJ8-`sSzrJQ^aTMuYI5?$U%!e=ON~G=baM*? zqhOogi_+s_`RGhE=tGJY10BjU1qVL~jdhGr(sIQ8$e1`#F7K^eeX^mNOlbXyb)q~m zJ$(&kqmq(F+fOu7TXLVB^bHNUjut3ob7fMu|J(t!A|)l|;&g8qN&~^U{{8zfeaYND zG7n=U;BE;8oa~Fzs_RfjbSy{~bRkKjM3ob-$&9Jof7HA4&Er3s%W2%t%6hZfusA&DszRlskp6RphOvpKNujYwQAq|G7}g9<9ZyeR$hPdO~N4b!{R< zb&?0g#`fy6Ie~6iK&6N^uZ!qGjviM9K-+h|*}^DLJ49y2pcOBW{HE0+0yewDwgzNa zMc&BTo$6R<>mHo@j#A|>!#!Wi;Z2)p4=;Ogb8}1H6IlDi9wu>;<0ldR1s4>EqO!8- zdhD)1`G9e4VULEcZ_Y&!pRyfEM9J*@rzFw92pfF=CnJ`B3lH4eX^``l>Xk3TD0 zh;ZRuHI}$WtI#SrPt)F~V@_F*-K#QHjk7#@@l@%Fp@Kz<(am>B+QgRVAOR;--%fE_ zEgp7f9B_HIYtjSBsy(r3+y51yqfH1M@-iZ*KHe;mWq&XB^I4&_5)rd;4I7d!q^eLkVV9|GZ)9VQ z>}JIDD~-BO;!^vJ6tV51%=r{_opD&C5-(KGmZSSKs1!lmkdJ5A=AjM1F8k61DBuS3T{(JrdZU&p>(t5ps|F>mj8!!5P~k`bY$G~5 zn@;vR`-rFz*IK{Y1mRQEL`Wo_Hu_WR>0#>W?2Y#k=>-KC3ibiA{?gQ8E+~j;n46u@ zRTa%-=5Uj|?|4Y+!V7nTM*6)_|F<%-L2KhF#X+he+QWI{$6y}p>k{P9_Tg_3|CrkR zISS8&N^_s~|CwW;WD4@3+$ClH+dR)DV5skDj&NCxaEs0R#No`FnD92cf~X|*8-r-AT-pp9Q2|pcc<8Y>flK{ftiqugi-_Z~}lSnwMf3eousxc=O zg#27l@V7HLu<>)Hp`!mMq{#+`vPC(p_-_j@j>cmCq14~^D)JCE*=+I?G67{uGFj^>7GR6r-fQ}N~rj2a)`9mvUp3R zx-v3YWEx*nc3qF??{A{ViO~)(TgcCSn1X*Fp)?Y@*y*E}HHdl-H!BDa;Er3=>Fvkz!$8A(^AMS(IMETX zq<=TmW}cc?b&ka-e5(Z9oQjGHqE#)VX!OM0G4s}D$q_%icT#_!z6?I^I__OF7|g~2 zLG3o|118*Z-TgZSz}-p&SK9)EjSGcT#IL>aS3mZbmvfdIFy4?m-3`yOBpp}D#M~vT zC*%tgRnaYpXs2zwz@Md0w|YP=-iL zdH6?xaKBW7UHf&Ea6`m+Y@v1Woi`&XMe&zdoW*I$f5#Tri^*TvzMj2$14;!kF)^4@ zv=W~70X<3pfgKz;FUo0^1Tcbw-*KvP@=9dW{SR9H^1xgyNTt)kK9_ zOGK{32n|LcrPAfFiJ7K`hNYDiO}Re|{5XskJJ{O`m|dl$jAxM58uz?^|2qhHFaby- z6P>>HI4#Lrjz z)jmw8z7vXPx+r9O@us38O+mt#qt8}_Qo2Ucw!2vIo7RBU`sZanvH05?;#-tTy~`eC zsMGB_n2`j28Y&`AJM@Cv(Dg@C7eA18U^t2hTs*vZYC%iTwgyZeUXTL=0N#H}4)b$R z*l*v|h1Y>El=(+_aY3h7GP15C_<5l{rxSK`0RXeG_F>(=rrD_w{ty0;Z)u>}H+qSqxZ!r`z|&Eql&B{GOCMl=jCrCqrk zGKn|={I39Gn1h3HX6^R!=#fMw1;F(z%*;3RFE0Zz2Mlc2d{tIp#+wE|!X~!uh;8yT z0&H0L9pxqHqYK<=Uxu+uw$r9}?zygT46QLyWF+dKPiONSmX?=c7pxaV>~94sC(9n9 z3}yf?5*9Pba$F>_31@L=WtaEh5fC$Tw{M+VO0~{0G1afu2-_<3Oy$) zMqzS~_d!!FfH^ogBO>AjLLed^rm0L#za=M=-(&_C?gVH$82Fii`XH0myL`jDLa(7S zF&B6t4bw7dGBaAKczWu76qD=k$W44H5W?t?p-&)wGihT+2Gp)xCSF|J3;97Z3aIW($RoI5fSaTSwjz8PkgV|P^y>%_Pze5b43FjC=vv7|u+aRjtMcjetZ=4xb!p2mT z%{?YJQ=f*hKE?+F%GlZeFq9WsRaX@whHUR~G?p>&;s1~$3Q|rML1U)8q5Ej;pAn*3g#Aqis{k?a8ETped@UV^ZeyC7FLHKm9Eu1g zn6!ZTuq)8?lt&P6uCPPX6Z6F8#iq>HCo|PBQ!B3j8^Oz3l>26=^N`~;m1u@CY~g>A zNF>?UWKOF1?sU}OS>3!>MflOmvUthgvIywlDY3;ItUiidenfsyP|$m~Ip}?lf{R9r zRUPdDu`1e9v0*khQy7d1bznw*pmIKQc{Gz_(}ip7uE~zHW5SyX=)ucs4U%gn*O0y4ks)M zsN{L37*u?z7X#`((K?F=JW2E+?befsw$H$ox^um&nr6}rUy`#UsU3LbTi)3i z2^RCnX4%Jf!8Fl)*H@-2$%OfFpr(sp?kaC{5~^1v5_!Usu`kr~6h-()l&O4((!s(( zps|-~_L*@>0+p!tHOVB#!ehf9-@jW+UAMr*&%RUC&aMzRt8BgF#v&qhuBbveT7D8D zj>sF-I${viuhX~@mYCq~#428b?}{~TJ448UQhSxEs25=xZ^=mpoCx@{_}m)Eu~XMfT+3uUM4vkjhbh>|uZ2vp*!i z%$tL9^qGxsXjDF79MJzniz8!YC3~7c{Vti?QM`!?u5IAUGI70Y&lPDxN`Oz9zw}7@ z#hofe_09Qd%=Re<%MN1eA&%$M{^;ti{SB#^Z&XbohgiHE7W(d^{BETkp-h<4BLXxh z3(Z!2gvLUIHlhp*>)IZgX6Zx(-gqOKcc^JtdUcei1hCzsu}G}SgMFz#r|NKI9wW?F zMjx@+yWU;xki@W8RAa70x1=flro{+;l*cK0(DCiU4n(Gf-VgE(7L6#lHBoa7y1JMuC|dLL8}RdqE( z3;+LI)F6}f{a0*F-mO)}JSMi#MUz@lVt6m!R}m7TV+dJFes1M_jYqdGK_?OUkSFcP z^W-*g&BEFKAP822scPEDWRZ7M`-5~Y4~l{#7h@957g8`s>YwYE?`u%g!q6fc z&+~?&jy5}XbBSe1*ZwhU-4}xHPC8-^)T0$`sV|yjgXlF2xs7Vwj_wTAR-M&fzb0D) z19j9#uV&pT@_WtVZKV8tRPHa=skxM~E^M|0#q~awUZ&A_ z4o9N2&}G{AL($45WbRRu+S2b_!n&Q<=V-*7S0XB z&4#2quMF~XpLP^tN|5Va9q6Z>qu~xy&i8~jq*Xf~#=ET>Zt;j6>*E_Aok4~EIo$|G z2z7$fKS2xucdxoD@~Wt?bR8qcxmIb)Cfp9+K6(2%_>aMdDWq1@hE<2f3L=j};9gs? zch6t7Y#k1`@@tr$`X+*x^TA(c83+KDMfKG^wF!pAAo^9|NwN7Jiqg{?I{l;hs!lTP zN8~4c?2ep@Y7z|gmXCs!?H8Op^kh*WofKe<#Y72-j+4)EzZzG073;My@wo;4I;(U! z5mSyVn&_V;XR`91%X}0@cK>?IQ5jBIH02!|nf4JZiHe|yQ$!NzN(>WY9t3}pcUR)I z2ze~Oym3K;Zd;SZW~-tej_05K(XA0l8?=vw{sX+)+DP#is!G>Jn=OhtM(Qg5sAnC^*+e|K*6_cx0EX%vPrm4;CTzRnJ-8oZ z>lrcBxDixO#kO^4O(ef)_!^qLC=H{D3S0DKhH#F8o5Yv!6(<8z+{lT$N9HZkaoi?y zZ8USJLP1qdN+2;KV;vzQxq&1yP(4g%6^>KR&oer5N`yQ0Q4*>A9L%%(qnp>L)IDbY zt^^Nn$6Zc;l{;Ttdi#eUxf|sjO&L_OawcG^zC-5V$aQ`DWOfKVzf=pm!SU4B^+=1LG$E6Fkhxhba`jXek-}ks9 z(lzk`F_OLZ>geCeqak}W5kfX;1`7u|38YHpWAv<%wcNNj8D*Sp>pbsfn8MftIbvgr zyZ64yDfXBjx&&IzP!T<2X)Fw>cxxoxH9CZiZ1Ew>xZ>H^Q>&E=TNrdT}aA%*dm^-gB zu`=93x1#goo9?9P0FH(OhHh{I&Qab(Q<*J*Gs^GwRVvDuG=rz>0>uB|01y%dE=x9J zLajW@{+YT*6RzkiWmZ8@!(O@cBk8a^ZxY|C<}dwX`A#W+W*xJ^6=g!2UcwviU}g0a zjw(7iZIHfHJ`qEz*cgt>n90G&BSsTv9`48O?9quGreteMa62v1mKsfEQb(U%*IyJC zz*o9!IzS2jD14^_jCa{O!5r%Qh11{S+7*|nt(fvv3gP<}50k*6QTh?LW_v7(VDNui zeY+)>U|x;iYGfpWhK2@C>%f6kFit0`-rA2czqt?)5?Xu-^WVcT13xu2H9LC_ls%jE z;Wh0(r5dxue-98uYMFi*y+Sv3S9=~F9df9d=y60HBdlW93>$0T^TsB1g=qN_3u^}M z4c?BS;^pGwn+01M##VqFqu2Ef4Pkgx3T_>KWMpzU!P&_Iz?pu_E;=U0ZXj)^SB8ma6g9V++_uvK$cqAr{ zJo9bJxy4Wl_WH1#8euI4MrgQ{35Skye&;d^@#n&ycSb(s2;8B%Ci9eB_Tsb##slHR zCs!dEn`~@wwxO@@j0Oh|uN#KyX~1B@Yq)4>$rDET&x64Zvy_2>0Ei@3cJ|v( zu0|K!!I}4HbfIdnIyO?SB47(>VKi^RSLJBkXYwB}OR!1KH)rKzSeOxjl&-}1Xu5U5R{n?2c@%{IH7S9EjR>Q;PRQQ_Qp`a4*mplq0O^6x@A zGAlZ|vaxs*rK9iS!mE}H+V{*SvXfjkr^nR3)3m3*cE~WMrD3{1y@s zp##gR;n7biX=(6sGC#uUx+lKA;ulWvr6ZsbY14ss`l|!N2)>2l_X?c#|AYZ!I-8rD z#aEVMU=n(YtEP@^{QkG$=&wa_H%+YP{JAlIM-*^Cm`(kzx@EM6_B(Qa%z^8qvl-mS zfr5F0R4^M2x&<_J4YW6X+P(>5eARzB$_L^>Wz1Czb^9r`xStIvDdTWp8@|)y8UsTs zoR(T$U4_%nYa1Jv7Lu@V?OFOBh#<| z_X@snBrZfwL#e{ zpdvshwfgSeAc!fu9RQL`h{eP#$6U z9JUw6c4YjIM&J-0ld$Xe1`t{4q%3cGU( zZ{RjI@h=pS@QX9DmGEZi^G)50VrQJuN<%3 zCplS!rce9I<@X*Yt^9~`eQU?a7&lPcS#?t{)U(T*FimlZMe1+xN!=A{dP_p7 zv?ubTt4@Kl{xsh^ka&JUp1UvDo=Cr7?wYy@W4{`jnpf*6HIs~$dR~s?bdStMb8ef@ zbRBX;tLM+r(V8;Wo?BizF1DsCCjkz#o8|#*O`r_#eXssP9^TbVEbtm96`FP zuKqI+?87n`I((^i^Blc2t}>_hGJ-;Y=0>6`KsrOcPVYaZFffz$RHcel@9jm4*xqyv zjQluydJ6BQ7nHiSo*lyY!l@Yys=&eNFR#X;1lj8Be-Z7La=Z58i6B(PZ#7xn)+>{E zbT7;@CqW?p`B1sM!a;r^(#$+@jLIJU%tuX2q~~UuJT}%?LX^;?I>pm0w&GbG!C@62 z@${3=bwJ~4%`3#K{%PmF4;1& zvr&Y?(4p; z_xp9D7tF6={ya!jIkIZLut{?8XGp(8x&K}CAt?>lXcRl56db|DoD($poxV*bRc3*^ zHVWhSka+TA75B;nn3>E#TzIk!gT-~GiFm%$>e=}O+g^u0ZT3Sl-avwqHZ9G6_Tuv0 zn1M$F&7dl4rEQZTR!$EvSX#LIz6Sk7!N&)z1yEn(;^s~$gjO=-5b*CG8T{8=Aoe|Z`o#TXTj)EG`a#Z(J&LVwbkGE89mi6=+B)SSAP_8 zx%_cSXa`KC^Pvz(oz6`RcvdrFvVF>xa92HSzWtTE&<2*2c!80GWW2bdwEb z%r*bhocRMqUh>v1r0tS)T^rMKR~l3X9{EOi&U4qst6%nLeid_#Mg!6Q^p`)(8;Y8v zrT4)c-8$oPMe5x<88?Y=?-=D5x`grk9Lq(~n z7Gh#!!5t_fD3}MbN05tBPvK>+KQ>I{d{j0@y)P}InO=lWo+3cdrzL9c-imJh zCM)0+!i5DNQ6L;cqyMW7vbVWO^E#3%NHx{? zdk4cV_NB=FB?RHb)=Pd~sN=eNvv+oGo35F)(mBhZnbJkLU0;9`Qb1M~77%8co0);5 zP7-RsP&yCQ5V~mnP$rib7kBN7HnLCc#iA|N>SwTITi2>g1Hm0E^QN~$ddb=ZI|j_& z7;s$n-OYijXIk1F=%|3;5o`%cJkf79xL(x1ReJa2erV?pR-}c9_kLYY=6*nnFuS!s zC7EzWTf#H0m@^7KhJ_Y&V^ywqt*oZO>IvZhoXE^HG@Jq*N}B$Z2VdUFE$i3`hMCYK zXbCxr;%$v9xn^b_`}CC%5^v;eX2}T2#BnIxz`~J%_5xrS-XMO5nG-aeAasDTV7)J_2{jOB~L!-q#D}hWJn(%oJk}>0AeSGfFMvG!j1Z0T(-*x=&jyMh3Tl zg@r{)xU~V+5ZR{FLSiVMFh+S1nD{^x3@!%?kPnv<(+X!kwwrhRvyW~vBp%>EB*~ul zNRqpbI%$9WLt{bQkaMapjFeYY^y=f^1K;SBS@vgmE|0P#*^#VYL?oMGG;5UH&f(bX zP(5R=1yx%P`7n8_?nYZ=&hK9C~iUV^VIVu@(1_zvn`q4;isP5QKLHv zG-P(PVt&Uw6>p|ku350@v|o=#6g$z;t3wb3z;UK5Oq@nj9Y=WhQsewa7aEfj_9E*l z-`*#5B!&(#`6dK^U0geKOr9By=AimyNaXfF`l+`AhMmhRkPFJU%7q=A-Xo5Jc9e)6 z@yYO1vg#%MH9sWaUSGx`_yZB1whK3l)lufQlx5gQrQm(6d-!^yIWrt0ldao+b zLUj7qRJvJX-iC&;*$7z~q3CTBWuwsy#l9YcF)ZfRVwBDN(cQIk4ogv45(z>-zFQ_N zMJHIk;cSrm-X+(7MFd8IVwRM?VLc3RMS9&`rKM4=R-83wZZi!tO1aJQ`mo%LLr4k~ zm7ROV=9*i57d;kxQn}WW@7lCKF`3U!*k^WCD>y#YXwU{`%~K1it$**B4RC&P=UNeaeVJ5yollc3a&DWrNaYoE=5{94 z6#DQ=>WEl=;&rzr?#iEU)PJegS?QKn5U@ln_UC72WQ3Te92dN%zj^VK>primVS&%j zUBlvuq~ugFStFK7X41EFqpT9r>WcuH$-Yl_aV$h>)R9 zS$NDA4fFRi{q(xD_gKMZihE2_vxH(Zb|iMLL>eh1Gu&pRJj~F*nrCNb_Lj*sEICiuexJOTP38KDEjZdWb*`<* z=Gb~}YjePc*uS1&W2N}afts*e&2_B#%iB1Y(nLSGIFGiv1*&hsv@>n@6Qt?9?o)g- zMvnh#s8>8Ywh(Mu%n8{+ZL-w4xx`-g{3BiWyY@l9QfN}1?;XUn^Ok{Wt7nOSO9%}} z*c(>&OnX~~rfm6?tgsz3pOj4Oq$BTt&0KENyyNTgl@MiXLhqNBGFU$9-Ee1+TgXs? zSi|I*C_~!)y(y@4x4EGq1f>7XXxyklzes7=5eA(dt{NmhYZ@w8?)r%uRT`%dJ z3HgzD{r71PElVw8ys>T0B@~(lm>za_5|P&^f=1~Q218}Kyobe058r|#9WWQ=zt~Q5 z2HVf)9!3%;pQ7bNHdHjCM~k<2HIjHS5)dVk`}T#yb)8!fW0bmRP`h>~B6IpNDR z9^y6&QoNR-Ywx!dxlSP|4E#%&b5pYRbKY3xn_W4I_92&OQ@0v>_>m1E;TUo8pTpxT zM2}2uUUqe9g_W3_G|dHlBYi=K?8h^y!n}?#9pVNRMHKTr50?7N$z)V~$VMTIH>2?! z0j%&cjensnuS(CgwTjVmBdF&p1c3qRzhVkw{(Zd9PR8Kd(-*gcA|LE}=DE%OmNJ4L zLEVYyQ|Zqi{m3@c?eV8HB{{G{U*$Jx^fM_PNW_y~II7 z7|3DhZlra+JoBC~P|s0fGV$SW8Vd*8Lg~^`GC74sY$S?6k^is8 z?;4G)8`Fk%N#0mXOIx=&y9@Q=$utoH2#V)x5;LRPkskNTVh+5Q@k0WizEhL>Och~Z zAQ`sd$pFa?3LfAj%JbYTb7|jBhoX^FlB()VHzl5g6RtJEt8hMMv6R`aMB^B^zy!gb zkug>ua>kwt(wATzd#(KS@AD4OU8HFKH^+X$4;U8;3g5Z#OMvjHk>VE=9EYARG{ixi zp5nJV3S!Mi%izE>GBxe2i-36v7R_LB3w#KnBA;1WR3~SZ+#FYA*5<9&ZkMFRL6wI7 zed!xaV+ZR2Cm<~U@eSM_-@Xkkxlb}XPE>)4a#u9quO>Lzf$j+!%Bmf}y^y0&YS4An z&iW$6ayZ4`tfV!SC5u- z>sEikFINanp04;Trsd-!+bpvYen#Yu0orRR=VQsSPRI-8@AS+RB+(rXHF!iuFjn6wOXb@(rRyWb9&qPzF3aXp0>6Zwxhed z9?s6rn0Ck;{v93pIR1q@2cqB=5Qc!vbRrR4yh%P6LE;RnchEyZ#mVQ#A|OuUJBRa4 z?_1EFJGVSH*KevO)VaHP%SDf(8C=!YBaO#@(c)5Lh6d}qcb+LHV?=1YJw0#t-Od~I z_VQ|NX`vAL!d8}~=9+JP^LY)9Z++ZDA2hVmI@mb$c^cq+f;ZklG7++08jK{fwxQub zT{je5j=*oc2K5_Qw(lJej*sJu2)L$xgIr0VG_(~FD9R9P*zb6KX;PBmXd2|6@CsKy zo!SJEEt%s!4iLE#R)|oi%*YiRaHqjGpedQ0h|C86%8#d z$p)Yr^vZ=)Ln5AUB)A>ki&&kzk-oS^>DbMBoNY>1z-FDwjH9kTl^U@Li~0bV-r;yD zAswc`YP^ zlNlqbbJ8Ev)35VJ(_p;c3j6(7gtF2!m^Jll=mthX+bB~)O!-tP{I?8;a(#+4u~-e$LLL}zJ6?e|ji%HX}Y zAK5fbO-?;R+>>uwyWhcsZ1d}Mp24e>B^IetYz~gB(qQF%>?9Wzx zQ?FI}KNh$RdkIsw`0lV4Gs6Nx2zQPj@bR5|cafd_ctIe#FoUN(NQCId2ckf29^xCc zVQ)X)j}H2)E>){rQ>@(W^fsh3NaU0}1}Q4{{yDykguEh#EYseM9OjM2AzDKIPqG*Ki|3lX+GXU1@U!C0 zW=7rCsvL)FI5eW9_kMQuX%k326uu5nw7yKm%vd4H7%ndR5( ztDTVjdP}~^Z?G#wQQ!;dT$%_eT#J_1g&9xG?v7~(O;TCzp!A;)+s@<=1K06YzoPq2jWa)o7R`Y={MLi54lJC7W zk}N(5I=V1M%cw`TVAJ@+6U7fEqd%BOR<2zgrj8(oQ&ln&tNNe?+&kbGmL04n4LYVo z#m&_81kX$p1-56Y_VXG=kf}H8?aP@x##iv(Yw5^Xn`;lHur~WScIdVh4^vq>%ofKTP(qY zJ1ArLP%Iiwy@=Exu`438@|H<7D!)K=zcl4>d}Is9HmNx)eCh~sp2H9%n>@U{CYxX2 z5u&dS3WRIvaR(!l>A>9}MOAgf&RiZtr&;0f#+T>6FYZ3gf&paPx|s8L2Sq(lR9ruB zbgTx>W_Vw^qB;}RzYg!^-!!wE*TkB=5M-ANG9xj_jEI)$O<-6}DtX{j`b8>2PB?I@ zTYqLr(hRGa&h=4ChR~( zQ!D6$$&YwA*Yj-bSdobqDg>FPhMWk?cVSTf#vNh%tMAWNE|0b6ny#elFA_DbyGSE} zlL>UH6_%xC{nGEfv8DrEcQ2OlRUirx1_( zAx!Ehj;jMj{b>j5OmN=}Vw5LUA4~Y;$99J`5@Ys>{)rPJJ~2$qCi^yZzjja!Mx}o> z#waa)HdJM}kw&&(U!v0Nv${tDG&`4RoLZ~+w@+P9N33wqCP#lll9bpHzRdR+D#g9- zCrhh_^5afixv6KEg4Z_YP{@km)3B+ur4v^S`7%B)`?P25AxvXNfj{8f|79$t@9xD7 z;6sCQGb8_IIH`Q&0|LZDKv4yfP}#yAx6W5QJ1EWN5i4qOE;K7 zGT1ob0xC>*A;_VW;B%4T;)9C%v29aaPh+HWc^6B}Ot1w$njHOk#C;=eas7~mb+wXh z=6Jbl0}&Wv3PpQA$KU0A#Zlev1OH{3Gz!seN`A0&mLky#C#T-t$@31cYzXNY&wXn*P z{vddZ2w9nIejQU0TsJo1mR*GN##YLzB}61M1c_c*B>zT@6g{C0lcO14UbJI}=f?g` zu6`NLuzk95lM_yW2m)H&q--M8qXCpY_l|532A-T0!4ZC1AQcmNYybN^6SMas{jL$N z=zz+n_^F=_s{Yq|b{S=)kpMqA?8r@;IOB6&M<*8H=6IHE(ghSE^Bh*1#*^1OGRw-! zK*;1XKIgArg#Jd0xKOBnj=^&AE!Si>u`SbB*xT$pwDFY@L1Rwv;othFU~c~2gn0j5 z`KCfhpBa?7sh<)5=asITy{1w^TWxGsIQ)5tHSpgi<0C_4UcutOCpl*6IP&y*K0XM< z>e)Do9Ryj?T$+*g17kcOU?~As2UH>Y!RE7GK*9r|Bbab&Yvq6v<&@cBGgf@}g-W_Q z@DjSZ=tblZ7o`bzhq-2+c`5M20ya}aTU)B|^Fwhl4otFOz|pd$rT0=M_<%CO4G9eW zDH7Y(H4nfe@@OuOtLB9b~gsFi6$$;a3ptn3t&xXk4 z5b~6pH=n67<6kkt^|VAiWX@6yUE{d@ib3)2T|Dv@xcs-{^7HbxHa2?f%O}Uc_J0&a ztzcywXZ;4+Whcv)CwGkT=?Ao)05&Gn85bW+=v?Vm4oKNL*}1M&oeQq~7gEB}QHoLHbMzdCnGgo7gx9R;k_{%xqz z;z+kCz$uc%Y8d-DwyTCR{)x;lEZscYH|B)X-~}!LPyf_lUNzXA@k^iR;&v z!Z|`C({c(*OHw73^;o}k4Gu+FVCE#5iC$%*5QRDc405_S{qs%8x> zNUFXxKp+*Zktr{|T&*fH?Uee+`&Gkw{wK$OW?V5EnN-XHxNda7a4Xx~9>@8yTYs7< z#ks@K7`O}ty>?Ys&F#)#Q!p$Nb@;wXM|!fy7ZmctPO?u@yWicp+Y{F?UhmD@;<*f6 ztyqmruZ!H=cR^5Keol;nJG$drihQTA|G&*Pu&>@R_5k82*sd>Dg0C8OW>|G)s!~A- z70_HMtS_V~5jymITjt325tdZRdn0VLJu8?=4cH30I2=2k%JoQvd7AqW-)M~Vj!+k z35!NdS$3B(qn4oBH>yZAAcjk&5T%IZ0RH;%v1Xi50-yq}UHc4#Cq|*$Xga# zL(>x)`mi30PD)x{SZK?)Idczw06C|+rY88k&798_78Jl<4LKh^l!yVNm=X98pZz$B zWGR}J$4Gllb~D7e&a7nxN7oBX&W14Hvq-<*v$n zDi1$F-95CKFPh?8AYEj~C;!FC3SR#z$rlctNqfj41w>pPKrIbCPXM5AjUe359$wac zE5qqQ-*`3Os57>(SP8J-AaEcKC*6Mp`w$e6yf$|YRl);Lp$=%d!XFp_As##z;UoIU zi3h+{T<28C&q1XDs;*?r)El<2*#)3O(6V7`W?VGSN+0!Hm`k-Jx>7Rljh#lXY%~b3 zF%u(g_X<=|R;=4FgB1hHXmEJ=B`dLvm}rI24a@Dbyd$spWc1nr(hrclzR)xR9A2iu1rNQG zUq3?unilk3;cx}Q5d2->8dUlp9e|l7l$Cx1W*iHFSa9&x?oIiqVZSM*_X54r^+uLF z{AH3LYXHFCAtjbel72V_jH{Jw#%Ix%+!N5U0~yXI1y87108S;Xf2joy7!7>V^>tDF z!oPlP%_JOOC(m#ppUZ{=u)1_t=)$<`iQS-sEBzOStvUd2fe z$O9%7Fe%~vv@cmv8{pmL2Pg#0`0ll%zsQCZDFMwH zlp_$G`fc~B-Y_r#f*YrY5coDRse1gdG0OP(IE1FlwqNOsxerA7)@fjam`$MRP&A`4 zklW18&2@8UB33V88pJzJfB{!vTuO42B>ASFU!A%9nYo`&!kH=XTZ6z$3fn!`-}(OO z0A~38M*ag+bvkz85PfsJY@2$PS4Qz;L8R z1?a=T-V}O&fZB{rD?QZq#=}PfX5X^h4BhMvO-VG87Q^w?RWovwpXu>I7E!S zkv{l3I0ze>>{dWtlQFzp!-!f2=)9fXV)4b!67RZtD1ueypAG*4u$tWy0-<}7%sbw7 z9X8^HOHdDl&7xieDWR-#fe-bHO}-i+lwju(66*T#BLE~W*hr`*laP|Wz+!=RehiSr z`CXw-{MGXq%}2$+EW3bWwFlgAJqb>%i&m@Iv10I~q4L}un{udRFOy;Xo!hot$F znF8420E7K_a_qy+JbE%^AQ?gv7z(BU3B7mhU~m5$25t%DU$8*}$nPL`gXz#Mz@*xJ z=>@yLop{2}6P)cR6y~7(_UF%|Eyn8nj;~)$imW~Z>jriTfKmwPZ(vsopfMMNnh#__ z@ENd_fQV?iue!1{6b} znu8k-D-mF24hIw}9@iU!i~pTNtfCF4WoC3316* ze6(NpYI1!1-W=}g+K&dyT*C-J=~|yDIFenj<&M>WlDr2Lr$I&mHwxx&zy_}sLV5(( z6u_SVCc*IXleG301Kp8#w*wx@&9{p05m4ILg2argabT_uwhD-6m-dW zupqmn!vJCn)U>dpSob<`IP73oADA8OEF>QNRCCL;i`C$Ht;VaHBJ^6VN(xM;6GQL` zc+}+R=vg*4e<0;z($(GD+gq?WJUkSnCljH~0Il@&aAdOeo$I zb|~YC@AUEY(bVh&lP7)-f{HgJsGpSxIiLa;NPwcCSgGcRl}N$s4%jF1E@v z2eRN<2nO;_+EDI4PwS>5<(!|M9)yPZ1I4*sf9O=1wmLO6H9tH_8wJpb;c>5zF6*i_ zmueL}TmkO@m@1fBS&h*vED$X?s^|w-Np$Kgen`dNj#&Q9D(4C0p5j{U!u-4nYRNm# z-px%y)Kpp%ma*O4eoLA0HsYi3fb37oAUKy{{y+{k&uId<$*}s}f;1r!reP?L85fts zO0r)P_-4|}&o*~W?A~IN(okE8RWt+ta|iI1BNhwP5>)rS3U-h z;syG!f_P3J3E21m98BzfG0Dlou^O=9!+-s~N0kjnuo+b`OkB_c7=v0o!_yrHNYJ1& z0n{LgGZgRqcF$_hwOtxvh4`E*WLXd6<*57853^d&i=5|Sb2S(|6O>X$`wLf3pg{s; zkY>mT9yu5a3_@SbzQYGt;m@)Q4Qh8VWbyEeN8n LtfN$bv3mA@j*pW8 literal 0 HcmV?d00001 diff --git a/docs/src/examples/excitations/1.su3-heisenberg/index.md b/docs/src/examples/excitations/1.su3-heisenberg/index.md new file mode 100644 index 000000000..9b8bb1f40 --- /dev/null +++ b/docs/src/examples/excitations/1.su3-heisenberg/index.md @@ -0,0 +1,262 @@ +```@meta +EditURL = "../../../../../examples/excitations/1.su3-heisenberg/main.jl" +``` + +[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/excitations/1.su3-heisenberg/main.ipynb) +[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/excitations/1.su3-heisenberg/main.ipynb) +[![](https://img.shields.io/badge/download-project-orange)](https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/QuantumKitHub/MPSKit.jl/examples/tree/gh-pages/dev/examples/excitations/1.su3-heisenberg) + +# The SU(3) Heisenberg chain + +The spin-1 Heisenberg chain famously has a gapped, symmetry-protected topological ground +state: the Haldane phase. +A natural question is what happens when the ``SU(2)`` symmetry of the spins is promoted to a +larger ``SU(N)`` symmetry. +In this example we study the ``SU(3)`` generalization introduced in [devos2022](@cite): a +uniform chain where every site carries the fully-symmetric ``[3\,0\,0]`` irrep of ``SU(3)`` +(the ten-dimensional representation), coupled by a nearest-neighbour ``SU(3)``-invariant +Heisenberg interaction + +```math +H = J \sum_{\langle i, j \rangle} \sum_{a=1}^{8} T^a_i T^a_j , +``` + +where the ``T^a`` are the eight generators of ``SU(3)``. +This is the direct analog of the spin-1 chain, with the three generators of ``SU(2)`` +replaced by the eight generators of ``SU(3)``. +The goal of this example is to exercise the full ``SU(N)`` toolchain end to end — building the +symmetric Hamiltonian, optimizing a uniform ground state with VUMPS, and scanning an +excitation dispersion — rather than to pin down the model's (very small) gap to high accuracy; +we return to that point in the closing discussion. + +Working with the full non-abelian ``SU(3)`` symmetry is what makes this tractable. +Just as ``SU(2)`` symmetry drastically shrinks the spin-1 problem (see +[Symmetries](@ref concept_symmetries)), imposing ``SU(3)`` block-diagonalizes every tensor +along its irreducible representations, so that a modest number of variational parameters +already captures a large physical bond dimension. +The Clebsch–Gordan coefficients that this requires are provided by +[SUNRepresentations.jl](https://github.com/QuantumKitHub/SUNRepresentations.jl), whose +`SU3Irrep` sectors plug directly into TensorKit's graded vector spaces. + +!!! warning "First-run cost" + SUNRepresentations.jl computes ``SU(N)`` Clebsch–Gordan coefficients on demand and + caches them both in memory and on disk (via `Scratch.jl`). + The **first** time a given coefficient is needed the computation can be slow; later runs + reuse the on-disk cache. + On a machine without a persisted scratch cache — such as a fresh continuous-integration + runner — this example therefore pays the full coefficient-generation cost once. + +````julia +using TensorKit +using SUNRepresentations +using MPSKit +using Plots +```` + +```` +Precompiling packages... + 960.3 ms ✓ ChunkCodecLibZstd + 1347.1 ms ✓ SparseArrayKit + 3750.1 ms ✓ FileIO + 25034.5 ms ✓ JLD2 + 7605.0 ms ✓ SUNRepresentations + 5 dependencies successfully precompiled in 38 seconds. 59 already precompiled. +Precompiling packages... + 2362.7 ms ✓ SparseArrayKit → SparseArrayKitSparseArrays + 1 dependency successfully precompiled in 3 seconds. 20 already precompiled. +Precompiling packages... + 1955.5 ms ✓ FileIO → HTTPExt + 4287.5 ms ✓ Plots → FileIOExt + 2 dependencies successfully precompiled in 8 seconds. 181 already precompiled. + +```` + +For reproducibility of this page, we fix the seed of the random number generator: + +````julia +using Random +Random.seed!(4321); +```` + +## The model + +Each site carries the ``[3\,0\,0]`` irrep, which we obtain from its highest weight and +represent as a one-dimensional graded space. + +````julia +I300 = SU3Irrep(3, 0, 0) +Vphys = Vect[SU3Irrep](I300 => 1) +@show dim(I300) +```` + +```` +10 +```` + +To build the interaction we use the same Casimir trick as for the ``SU(2)`` chain. +Writing ``C_2 = \sum_a T^a T^a`` for the quadratic Casimir operator, the two-site coupling is +diagonal in the total ``SU(3)`` charge ``c`` of a bond: + +```math +\sum_a T^a_i T^a_j = \tfrac{1}{2}\left( C_2(c) - C_2([3\,0\,0]) - C_2([3\,0\,0]) \right). +``` + +SUNRepresentations.jl provides the quadratic Casimir through `casimir(2, irrep)`. +Its normalization is the standard one with ``\mathrm{tr}(T^a T^b) = \tfrac{1}{2}\delta^{ab}``: +the fundamental ``[1\,0\,0]`` has ``C_2 = 4/3 = (N^2-1)/(2N)``. + +````julia +@show casimir(2, SU3Irrep(1, 0, 0)) +@show casimir(2, I300) +```` + +```` +6//1 +```` + +The nearest-neighbour term is then a single TensorKit operator that acts as a scalar on each +fusion channel of ``[3\,0\,0] \otimes [3\,0\,0]``. +Constructing it by iterating over the blocks — one block per total charge ``c`` — mirrors the +``SU(2)`` construction, but now with `casimir(2, ⋅)` supplying the eigenvalues. + +````julia +function su3_heisenberg(Vphys; J = 1.0) + site = SU3Irrep(3, 0, 0) + c2_site = casimir(2, site) + SS = zeros(ComplexF64, Vphys ⊗ Vphys ← Vphys ⊗ Vphys) + for (c, data) in blocks(SS) + coupling = (casimir(2, c) - 2 * c2_site) / 2 + for i in axes(data, 1) + data[i, i] = J * coupling + end + end + return InfiniteMPOHamiltonian(SS) +end + +H = su3_heisenberg(Vphys) +```` + +```` +1-site InfiniteMPOHamiltonian(ComplexF64, Rep[SU₃]) with maximal dimension 10: +| ⋮ +| (((0, 0, 0)=>1) ⊞ ((2, 1, 0)=>1) ⊞ ((0, 0, 0)=>1)) +┼─[1]─ ((3, 0, 0) => 1) +│ (((0, 0, 0)=>1) ⊞ ((2, 1, 0)=>1) ⊞ ((0, 0, 0)=>1)) +| ⋮ + +```` + +We can read off the physics directly from the fusion channels. +The product ``[3\,0\,0] \otimes [3\,0\,0]`` decomposes into four irreps, and the +antiferromagnetic coupling (``J > 0``) favours the channels of lowest Casimir: + +````julia +for (c, n) in directproduct(I300, I300) + coupling = (casimir(2, c) - 2 * casimir(2, I300)) / 2 + println(rpad(string(c), 22), " dim = ", rpad(dim(c), 4), " coupling = ", coupling) +end +```` + +```` +Irrep[SU₃]((6, 0, 0)) dim = 28 coupling = 3//1 +Irrep[SU₃]((5, 1, 0)) dim = 35 coupling = 0//1 +Irrep[SU₃]((4, 2, 0)) dim = 27 coupling = -2//1 +Irrep[SU₃]((3, 3, 0)) dim = 10 coupling = -3//1 + +```` + +## Ground state + +The ``[3\,0\,0]`` irrep has trivial triality (congruency class ``0``), so — like the +integer-spin Haldane chain — a translation-invariant state on a single-site unit cell is +admissible. +Because the physical charge has triality ``0`` it cannot shift the triality of the virtual +bonds, so every virtual space must sit in a single congruency class; here we use the trivial +class ``0``, which we found to give the lowest variational energy. +Following [devos2022](@cite), we seed the optimization with a random ``SU(3)``-symmetric +uniform state and optimize with VUMPS. +The bond dimension is kept deliberately modest here so that the page builds quickly. + +````julia +Vvirt = Vect[SU3Irrep]( + SU3Irrep(0, 0, 0) => 8, + SU3Irrep(2, 1, 0) => 6, + SU3Irrep(3, 0, 0) => 3, + SU3Irrep(3, 3, 0) => 3, + SU3Irrep(4, 2, 0) => 2, +) +@show dim(Vvirt) + +ψ₀ = InfiniteMPS([Vphys], [Vvirt]) +ψ, envs, δ = find_groundstate(ψ₀, H, VUMPS(; maxiter = 200, tol = 1.0e-10, verbosity = 1)) +E₀ = real(expectation_value(ψ, H)) +println("ground-state energy per site: E₀ = $E₀") +```` + +```` +dim(Vvirt) = 170 +┌ Warning: Constructing an MPS from tensors that are not full rank +└ @ MPSKit src/states/infinitemps.jl:188 +ground-state energy per site: E₀ = -2.573505652431292 + +```` + +## The excitation spectrum + +On top of the ground state we compute excitations with the quasiparticle ansatz. +In the thermodynamic limit each excitation carries a definite momentum ``k`` and a definite +``SU(3)`` charge. +Following [devos2022](@cite), we look in the adjoint ``[2\,1\,0]`` sector, where that reference +finds the lowest branch, and scan across half of the Brillouin zone (the other half follows by +reflection). + +````julia +sector = SU3Irrep(2, 1, 0) +kspace = range(0, π, 10) +Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ, envs; sector, verbosity = 0) + +Δ, idx = findmin(real.(Es)) +println("branch minimum ΔE/J = $Δ at k = $(kspace[idx])") +```` + +```` +branch minimum ΔE/J = -0.041856660250395326 at k = 2.0943951023931953 + +```` + +````julia +plot( + kspace, real.(Es); + xaxis = "momentum k", yaxis = "ΔE / J", label = "[2 1 0] branch", + title = "SU(3) [3 0 0] excitation dispersion" +) +hline!([0.0]; color = :gray, linestyle = :dash, label = "") +vline!([2π / 3]; color = :gray, linestyle = :dot, label = "k = 2π/3") +```` + +![](figure-1.png) + +The branch has a pronounced soft mode at ``k = 2\pi/3``, exactly the momentum at which +[devos2022](@cite) locates the minimum of the dispersion, where that reference reports a gap +of ``\Delta / J = 0.0263``. + +The soft-mode *location* is reproduced cleanly, but the gap *value* is not, and it is worth +being precise about why. +The quasiparticle energies plotted above are a genuine variational upper bound on the +excitation energies only when they are measured relative to the *exact* ground state. +Here the ground state is a deliberately lightweight, modest-bond-dimension uniform ``SU(3)`` +MPS, and for this near-critical model it is not converged to that accuracy. +Because the reference state sits slightly too high in energy, the ansatz can find "excitations" +that lie below it, so near ``k = 2\pi/3`` the computed branch drops to essentially zero and even +slightly negative. +The dispersion here is therefore *not* a variational estimate of the true gap: the small value +``\Delta / J = 0.0263`` is quoted from [devos2022](@cite) and would require a carefully +converged, large-bond-dimension calculation to reproduce. +What this example does show is the complete ``SU(3)``-symmetric workflow — Hamiltonian +construction, VUMPS ground state, and a momentum-resolved excitation scan — with the soft mode +correctly located at ``k = 2\pi/3``. + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/docs/src/examples/excitations/1.su3-heisenberg/main.ipynb b/docs/src/examples/excitations/1.su3-heisenberg/main.ipynb new file mode 100644 index 000000000..7c9958a7f --- /dev/null +++ b/docs/src/examples/excitations/1.su3-heisenberg/main.ipynb @@ -0,0 +1,302 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The SU(3) Heisenberg chain\n", + "\n", + "The spin-1 Heisenberg chain famously has a gapped, symmetry-protected topological ground\n", + "state: the Haldane phase.\n", + "A natural question is what happens when the $SU(2)$ symmetry of the spins is promoted to a\n", + "larger $SU(N)$ symmetry.\n", + "In this example we study the $SU(3)$ generalization introduced in [devos2022](@cite): a\n", + "uniform chain where every site carries the fully-symmetric $[3\\,0\\,0]$ irrep of $SU(3)$\n", + "(the ten-dimensional representation), coupled by a nearest-neighbour $SU(3)$-invariant\n", + "Heisenberg interaction\n", + "\n", + "$$\n", + "H = J \\sum_{\\langle i, j \\rangle} \\sum_{a=1}^{8} T^a_i T^a_j ,\n", + "$$\n", + "\n", + "where the $T^a$ are the eight generators of $SU(3)$.\n", + "This is the direct analog of the spin-1 chain, with the three generators of $SU(2)$\n", + "replaced by the eight generators of $SU(3)$.\n", + "The goal of this example is to exercise the full $SU(N)$ toolchain end to end — building the\n", + "symmetric Hamiltonian, optimizing a uniform ground state with VUMPS, and scanning an\n", + "excitation dispersion — rather than to pin down the model's (very small) gap to high accuracy;\n", + "we return to that point in the closing discussion.\n", + "\n", + "Working with the full non-abelian $SU(3)$ symmetry is what makes this tractable.\n", + "Just as $SU(2)$ symmetry drastically shrinks the spin-1 problem (see\n", + "Symmetries), imposing $SU(3)$ block-diagonalizes every tensor\n", + "along its irreducible representations, so that a modest number of variational parameters\n", + "already captures a large physical bond dimension.\n", + "The Clebsch–Gordan coefficients that this requires are provided by\n", + "[SUNRepresentations.jl](https://github.com/QuantumKitHub/SUNRepresentations.jl), whose\n", + "`SU3Irrep` sectors plug directly into TensorKit's graded vector spaces.\n", + "\n", + "> **First-run cost**\n", + ">\n", + "> SUNRepresentations.jl computes $SU(N)$ Clebsch–Gordan coefficients on demand and\n", + "> caches them both in memory and on disk (via `Scratch.jl`).\n", + "> The **first** time a given coefficient is needed the computation can be slow; later runs\n", + "> reuse the on-disk cache.\n", + "> On a machine without a persisted scratch cache — such as a fresh continuous-integration\n", + "> runner — this example therefore pays the full coefficient-generation cost once." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "using TensorKit\n", + "using SUNRepresentations\n", + "using MPSKit\n", + "using Plots" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For reproducibility of this page, we fix the seed of the random number generator:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "using Random\n", + "Random.seed!(4321);" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The model\n", + "\n", + "Each site carries the $[3\\,0\\,0]$ irrep, which we obtain from its highest weight and\n", + "represent as a one-dimensional graded space." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "I300 = SU3Irrep(3, 0, 0)\n", + "Vphys = Vect[SU3Irrep](I300 => 1)\n", + "@show dim(I300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "To build the interaction we use the same Casimir trick as for the $SU(2)$ chain.\n", + "Writing $C_2 = \\sum_a T^a T^a$ for the quadratic Casimir operator, the two-site coupling is\n", + "diagonal in the total $SU(3)$ charge $c$ of a bond:\n", + "\n", + "$$\n", + "\\sum_a T^a_i T^a_j = \\tfrac{1}{2}\\left( C_2(c) - C_2([3\\,0\\,0]) - C_2([3\\,0\\,0]) \\right).\n", + "$$\n", + "\n", + "SUNRepresentations.jl provides the quadratic Casimir through `casimir(2, irrep)`.\n", + "Its normalization is the standard one with $\\mathrm{tr}(T^a T^b) = \\tfrac{1}{2}\\delta^{ab}$:\n", + "the fundamental $[1\\,0\\,0]$ has $C_2 = 4/3 = (N^2-1)/(2N)$." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "@show casimir(2, SU3Irrep(1, 0, 0))\n", + "@show casimir(2, I300)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The nearest-neighbour term is then a single TensorKit operator that acts as a scalar on each\n", + "fusion channel of $[3\\,0\\,0] \\otimes [3\\,0\\,0]$.\n", + "Constructing it by iterating over the blocks — one block per total charge $c$ — mirrors the\n", + "$SU(2)$ construction, but now with `casimir(2, ⋅)` supplying the eigenvalues." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "function su3_heisenberg(Vphys; J = 1.0)\n", + " site = SU3Irrep(3, 0, 0)\n", + " c2_site = casimir(2, site)\n", + " SS = zeros(ComplexF64, Vphys ⊗ Vphys ← Vphys ⊗ Vphys)\n", + " for (c, data) in blocks(SS)\n", + " coupling = (casimir(2, c) - 2 * c2_site) / 2\n", + " for i in axes(data, 1)\n", + " data[i, i] = J * coupling\n", + " end\n", + " end\n", + " return InfiniteMPOHamiltonian(SS)\n", + "end\n", + "\n", + "H = su3_heisenberg(Vphys)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can read off the physics directly from the fusion channels.\n", + "The product $[3\\,0\\,0] \\otimes [3\\,0\\,0]$ decomposes into four irreps, and the\n", + "antiferromagnetic coupling ($J > 0$) favours the channels of lowest Casimir:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "for (c, n) in directproduct(I300, I300)\n", + " coupling = (casimir(2, c) - 2 * casimir(2, I300)) / 2\n", + " println(rpad(string(c), 22), \" dim = \", rpad(dim(c), 4), \" coupling = \", coupling)\n", + "end" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Ground state\n", + "\n", + "The $[3\\,0\\,0]$ irrep has trivial triality (congruency class $0$), so — like the\n", + "integer-spin Haldane chain — a translation-invariant state on a single-site unit cell is\n", + "admissible.\n", + "Because the physical charge has triality $0$ it cannot shift the triality of the virtual\n", + "bonds, so every virtual space must sit in a single congruency class; here we use the trivial\n", + "class $0$, which we found to give the lowest variational energy.\n", + "Following [devos2022](@cite), we seed the optimization with a random $SU(3)$-symmetric\n", + "uniform state and optimize with VUMPS.\n", + "The bond dimension is kept deliberately modest here so that the page builds quickly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "Vvirt = Vect[SU3Irrep](\n", + " SU3Irrep(0, 0, 0) => 8,\n", + " SU3Irrep(2, 1, 0) => 6,\n", + " SU3Irrep(3, 0, 0) => 3,\n", + " SU3Irrep(3, 3, 0) => 3,\n", + " SU3Irrep(4, 2, 0) => 2,\n", + ")\n", + "@show dim(Vvirt)\n", + "\n", + "ψ₀ = InfiniteMPS([Vphys], [Vvirt])\n", + "ψ, envs, δ = find_groundstate(ψ₀, H, VUMPS(; maxiter = 200, tol = 1.0e-10, verbosity = 1))\n", + "E₀ = real(expectation_value(ψ, H))\n", + "println(\"ground-state energy per site: E₀ = $E₀\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The excitation spectrum\n", + "\n", + "On top of the ground state we compute excitations with the quasiparticle ansatz.\n", + "In the thermodynamic limit each excitation carries a definite momentum $k$ and a definite\n", + "$SU(3)$ charge.\n", + "Following [devos2022](@cite), we look in the adjoint $[2\\,1\\,0]$ sector, where that reference\n", + "finds the lowest branch, and scan across half of the Brillouin zone (the other half follows by\n", + "reflection)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "sector = SU3Irrep(2, 1, 0)\n", + "kspace = range(0, π, 10)\n", + "Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ, envs; sector, verbosity = 0)\n", + "\n", + "Δ, idx = findmin(real.(Es))\n", + "println(\"branch minimum ΔE/J = $Δ at k = $(kspace[idx])\")\n", + "plot(\n", + " kspace, real.(Es);\n", + " xaxis = \"momentum k\", yaxis = \"ΔE / J\", label = \"[2 1 0] branch\",\n", + " title = \"SU(3) [3 0 0] excitation dispersion\"\n", + ")\n", + "hline!([0.0]; color = :gray, linestyle = :dash, label = \"\")\n", + "vline!([2π / 3]; color = :gray, linestyle = :dot, label = \"k = 2π/3\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The branch has a pronounced soft mode at $k = 2\\pi/3$, exactly the momentum at which\n", + "[devos2022](@cite) locates the minimum of the dispersion, where that reference reports a gap\n", + "of $\\Delta / J = 0.0263$.\n", + "\n", + "The soft-mode *location* is reproduced cleanly, but the gap *value* is not, and it is worth\n", + "being precise about why.\n", + "The quasiparticle energies plotted above are a genuine variational upper bound on the\n", + "excitation energies only when they are measured relative to the *exact* ground state.\n", + "Here the ground state is a deliberately lightweight, modest-bond-dimension uniform $SU(3)$\n", + "MPS, and for this near-critical model it is not converged to that accuracy.\n", + "Because the reference state sits slightly too high in energy, the ansatz can find \"excitations\"\n", + "that lie below it, so near $k = 2\\pi/3$ the computed branch drops to essentially zero and even\n", + "slightly negative.\n", + "The dispersion here is therefore *not* a variational estimate of the true gap: the small value\n", + "$\\Delta / J = 0.0263$ is quoted from [devos2022](@cite) and would require a carefully\n", + "converged, large-bond-dimension calculation to reproduce.\n", + "What this example does show is the complete $SU(3)$-symmetric workflow — Hamiltonian\n", + "construction, VUMPS ground state, and a momentum-resolved excitation scan — with the soft mode\n", + "correctly located at $k = 2\\pi/3$." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.12.6", + "language": "julia", + "name": "julia-1.12" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.12.6" + } + }, + "nbformat": 4, + "nbformat_minor": 3 +} \ No newline at end of file diff --git a/docs/src/examples/groundstates/0.tfim-groundstate/figure-1.png b/docs/src/examples/groundstates/0.tfim-groundstate/figure-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa4562426ced60e0ab517e6f5c650ad17686a9b GIT binary patch literal 23421 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 literal 0 HcmV?d00001 diff --git a/docs/src/examples/groundstates/0.tfim-groundstate/figure-2.png b/docs/src/examples/groundstates/0.tfim-groundstate/figure-2.png new file mode 100644 index 0000000000000000000000000000000000000000..19e71c3eac126fece3a3f8c26f217675376ff2d3 GIT binary patch literal 21132 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 literal 0 HcmV?d00001 diff --git a/docs/src/examples/groundstates/0.tfim-groundstate/figure-3.png b/docs/src/examples/groundstates/0.tfim-groundstate/figure-3.png new file mode 100644 index 0000000000000000000000000000000000000000..31b1c357adea7161ca03ae63e8282e49e96a0b6d GIT binary patch literal 18340 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 aoPzYtDXupMF*j&V2q`gn(Hx|~>;DBP5i>CW literal 0 HcmV?d00001 diff --git a/docs/src/examples/groundstates/0.tfim-groundstate/index.md b/docs/src/examples/groundstates/0.tfim-groundstate/index.md new file mode 100644 index 000000000..9552cde5e --- /dev/null +++ b/docs/src/examples/groundstates/0.tfim-groundstate/index.md @@ -0,0 +1,199 @@ +```@meta +EditURL = "../../../../../examples/groundstates/0.tfim-groundstate/main.jl" +``` + +[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/groundstates/0.tfim-groundstate/main.ipynb) +[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/groundstates/0.tfim-groundstate/main.ipynb) +[![](https://img.shields.io/badge/download-project-orange)](https://minhaskamal.github.io/DownGit/#/home?url=https://github.com/QuantumKitHub/MPSKit.jl/examples/tree/gh-pages/dev/examples/groundstates/0.tfim-groundstate) + +# The transverse-field Ising model: a complete ground-state study + +This example is the bridge from the introductory tutorials into the research-grade +gallery. +If you have worked through [Your first ground state](@ref tutorial_first_groundstate) and +[The thermodynamic limit](@ref tutorial_thermodynamic_limit) you already know every +individual tool used here; the goal now is to *assemble* them into one coherent case +study of a genuine quantum phase transition. + +We use the same transverse-field Ising model (TFIM) as the tutorials, on a chain of +spin-1/2 sites: + +```math +H = -J\left(\sum_{\langle i,j\rangle} \sigma^z_i \sigma^z_j + g\sum_i \sigma^x_i\right), +``` + +where the first sum runs over neighbouring pairs, ``J`` sets the energy scale, and the +dimensionless field ``g`` tunes the competition between the ``\sigma^z\sigma^z`` +interaction and the transverse ``\sigma^x`` field. +The model has a quantum critical point at ``g = 1``. + +Rather than looking at a single field value, we will scan ``g`` across the transition and +diagnose it three independent ways, comparing a *finite* chain against a calculation +performed *directly in the thermodynamic limit*: + +1. the order parameter ``|\langle\sigma^z\rangle|``, computed both for a finite chain and + for an infinite chain, in one figure; +2. the entanglement entropy of the infinite state; +3. the correlation length of the infinite state. + +All three should point at the same place — that agreement is the payoff. + +We take the model and lattice from MPSKitModels, the tensor backend from TensorKit, and +Plots for the figures. The Pauli operators `σᶻ`, `σˣ` are re-exported by MPSKitModels. + +````julia +using MPSKit, MPSKitModels, TensorKit, Plots +```` + +## Shared parameters + +We fix a finite chain length `L`, a bond dimension `D` (the accuracy knob, see +[Controlling bond dimension](@ref howto_bond_dimension)), and the set of field values to +scan. +`D` is kept modest so the whole page runs in a couple of minutes; increasing it sharpens +the infinite-state diagnostics below (the finite-chain curve responds to `D` in a less +obvious way, as we will see). + +````julia +L = 16 +D = 8 +g_values = 0.1:0.1:2.0 +```` + +```` +0.1:0.1:2.0 +```` + +## 1. Finite versus infinite magnetization + +We compute the order parameter ``|\langle\sigma^z\rangle|`` two ways at every field value. + +For the **finite** calculation we use an open chain of `L` sites, exactly as in the +tutorial, and optimize with [`DMRG`](@ref). +We average ``\langle\sigma^z_i\rangle`` over the sites and take the absolute value: the +exact finite-`L` ground state is symmetric, but DMRG lands on one of the two +symmetry-broken states with an arbitrary sign (see the discussion in +[Your first ground state](@ref tutorial_first_groundstate)). + +````julia +ψ₀_finite = FiniteMPS(L, ℂ^2, ℂ^D) +M_finite = map(g_values) do g + H = transverse_field_ising(FiniteChain(L); g = g) + ψ, = find_groundstate(ψ₀_finite, H, DMRG(; verbosity = 0)) + return abs(sum(expectation_value(ψ, i => σᶻ()) for i in 1:L)) / L +end; +```` + +For the **infinite** calculation we drop the lattice argument to build the Hamiltonian on +the infinite chain, use an [`InfiniteMPS`](@ref), and optimize with [`VUMPS`](@ref). +We keep every optimized infinite state, because we will reuse them for the entropy and +correlation-length diagnostics below. + +````julia +ψ₀_infinite = InfiniteMPS(ℂ^2, ℂ^D) +states_infinite = map(g_values) do g + H = transverse_field_ising(; g = g) + ψ, = find_groundstate(ψ₀_infinite, H, VUMPS(; verbosity = 0)) + return ψ +end; +```` + +The order parameter of a translation-invariant state is just ``\langle\sigma^z\rangle`` on +a single site of the unit cell; we again take the absolute value, because on the ordered +side the infinite state settles into one of the two symmetry-broken ground states (see +[The thermodynamic limit](@ref tutorial_thermodynamic_limit)). + +````julia +M_infinite = [abs(expectation_value(ψ, 1 => σᶻ())) for ψ in states_infinite]; +```` + +Plotting both curves in a single figure lets us compare them directly. + +````julia +p_magnetization = plot(; + xlabel = "g", ylabel = "|⟨σᶻ⟩|", title = "TFIM order parameter", legend = :bottomleft +) +scatter!(p_magnetization, g_values, M_finite; label = "finite chain, L = $L, D = $D") +scatter!(p_magnetization, g_values, M_infinite; label = "infinite, D = $D") +vline!(p_magnetization, [1.0]; color = "gray", linestyle = :dash, label = "g = 1") +p_magnetization +```` + +![](figure-1.png) + +Both calculations agree deep in either phase, but near the transition they tell very different stories. +The infinite curve stays on its ordered branch essentially up to `g = 1` and then collapses: it locates the critical point cleanly. +The finite-chain curve instead drops to zero far earlier — at this `L` and `D` the variational optimum on the open chain switches from the symmetry-broken branch to the exactly symmetric ground state, whose magnetization vanishes. +Where that switch happens is set by `L` and `D`, not by the physics; the same sweep at `D = 4` in [Your first ground state](@ref tutorial_first_groundstate) puts it elsewhere. +That is the real lesson of this panel: the finite-chain order parameter is dominated by which state the algorithm selects, while the calculation performed directly in the thermodynamic limit pins the transition at `g = 1`. + +## 2. Entanglement entropy across the transition + +Entanglement is a hallmark of criticality: it is bounded away from the critical point but +grows sharply as we approach it. +For an [`InfiniteMPS`](@ref), [`entropy`](@ref) returns the von Neumann entanglement entropy +per bond, one value for each site of the unit cell. +Our unit cell has a single site, so we take the one entry with `only`. + +````julia +S_infinite = [real(only(entropy(ψ))) for ψ in states_infinite] +p_entropy = scatter( + g_values, S_infinite; + xlabel = "g", ylabel = "entanglement entropy S", title = "TFIM entanglement entropy", + legend = false +) +vline!(p_entropy, [1.0]; color = "gray", linestyle = :dash) +p_entropy +```` + +![](figure-2.png) + +The entropy peaks near `g = 1`. +That peak is the entanglement signature of the phase transition: at criticality +correlations become long-ranged and the ground state is at its most entangled, whereas deep +in either phase the state is closer to a simple product and the entropy is small. + +## 3. Correlation length across the transition + +The [`correlation_length`](@ref) measures how far apart two spins can still influence each +other; it is extracted from the transfer-matrix spectrum of the uniform infinite state and +has no finite-chain analogue. +It grows toward criticality, so we plot it on a logarithmic vertical axis to make the +growth visible. + +````julia +ξ_infinite = [correlation_length(ψ) for ψ in states_infinite] +p_xi = scatter( + g_values, ξ_infinite; + xlabel = "g", ylabel = "correlation length ξ", yscale = :log10, + title = "TFIM correlation length", legend = false +) +vline!(p_xi, [1.0]; color = "gray", linestyle = :dash) +p_xi +```` + +![](figure-3.png) + +The correlation length peaks near `g = 1` as well. +At a genuine critical point it would diverge, but a finite bond dimension `D` can only +capture correlations out to a finite range, so what we measure is large-but-capped rather +than infinite — the peak grows and sharpens as `D` is increased. + +## What you now have + +Three independent diagnostics — the order parameter, the entanglement entropy, and the +correlation length — all locate the transition of the transverse-field Ising model near +`g = 1`, and the finite-versus-infinite comparison shows concretely why the thermodynamic +limit is the right place to measure it. + +From here the gallery goes further. +The Ising CFT example extracts the momentum-resolved excitation spectrum right at +criticality and matches it to the predictions of conformal field theory, turning the "there +is a critical point near `g = 1`" of this page into a quantitative fingerprint of *which* +critical theory it is. +Every curve on this page also sharpens if you rerun it at a larger bond dimension `D`. + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/docs/src/examples/groundstates/0.tfim-groundstate/main.ipynb b/docs/src/examples/groundstates/0.tfim-groundstate/main.ipynb new file mode 100644 index 000000000..12748dde4 --- /dev/null +++ b/docs/src/examples/groundstates/0.tfim-groundstate/main.ipynb @@ -0,0 +1,310 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# The transverse-field Ising model: a complete ground-state study\n", + "\n", + "This example is the bridge from the introductory tutorials into the research-grade\n", + "gallery.\n", + "If you have worked through Your first ground state and\n", + "The thermodynamic limit you already know every\n", + "individual tool used here; the goal now is to *assemble* them into one coherent case\n", + "study of a genuine quantum phase transition.\n", + "\n", + "We use the same transverse-field Ising model (TFIM) as the tutorials, on a chain of\n", + "spin-1/2 sites:\n", + "\n", + "$$\n", + "H = -J\\left(\\sum_{\\langle i,j\\rangle} \\sigma^z_i \\sigma^z_j + g\\sum_i \\sigma^x_i\\right),\n", + "$$\n", + "\n", + "where the first sum runs over neighbouring pairs, $J$ sets the energy scale, and the\n", + "dimensionless field $g$ tunes the competition between the $\\sigma^z\\sigma^z$\n", + "interaction and the transverse $\\sigma^x$ field.\n", + "The model has a quantum critical point at $g = 1$.\n", + "\n", + "Rather than looking at a single field value, we will scan $g$ across the transition and\n", + "diagnose it three independent ways, comparing a *finite* chain against a calculation\n", + "performed *directly in the thermodynamic limit*:\n", + "\n", + "1. the order parameter $|\\langle\\sigma^z\\rangle|$, computed both for a finite chain and\n", + " for an infinite chain, in one figure;\n", + "2. the entanglement entropy of the infinite state;\n", + "3. the correlation length of the infinite state.\n", + "\n", + "All three should point at the same place — that agreement is the payoff." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We take the model and lattice from MPSKitModels, the tensor backend from TensorKit, and\n", + "Plots for the figures. The Pauli operators `σᶻ`, `σˣ` are re-exported by MPSKitModels." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "using MPSKit, MPSKitModels, TensorKit, Plots" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Shared parameters\n", + "\n", + "We fix a finite chain length `L`, a bond dimension `D` (the accuracy knob, see\n", + "Controlling bond dimension), and the set of field values to\n", + "scan.\n", + "`D` is kept modest so the whole page runs in a couple of minutes; increasing it sharpens\n", + "the infinite-state diagnostics below (the finite-chain curve responds to `D` in a less\n", + "obvious way, as we will see)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "L = 16\n", + "D = 8\n", + "g_values = 0.1:0.1:2.0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Finite versus infinite magnetization\n", + "\n", + "We compute the order parameter $|\\langle\\sigma^z\\rangle|$ two ways at every field value.\n", + "\n", + "For the **finite** calculation we use an open chain of `L` sites, exactly as in the\n", + "tutorial, and optimize with `DMRG`.\n", + "We average $\\langle\\sigma^z_i\\rangle$ over the sites and take the absolute value: the\n", + "exact finite-`L` ground state is symmetric, but DMRG lands on one of the two\n", + "symmetry-broken states with an arbitrary sign (see the discussion in\n", + "Your first ground state)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ψ₀_finite = FiniteMPS(L, ℂ^2, ℂ^D)\n", + "M_finite = map(g_values) do g\n", + " H = transverse_field_ising(FiniteChain(L); g = g)\n", + " ψ, = find_groundstate(ψ₀_finite, H, DMRG(; verbosity = 0))\n", + " return abs(sum(expectation_value(ψ, i => σᶻ()) for i in 1:L)) / L\n", + "end;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For the **infinite** calculation we drop the lattice argument to build the Hamiltonian on\n", + "the infinite chain, use an `InfiniteMPS`, and optimize with `VUMPS`.\n", + "We keep every optimized infinite state, because we will reuse them for the entropy and\n", + "correlation-length diagnostics below." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ψ₀_infinite = InfiniteMPS(ℂ^2, ℂ^D)\n", + "states_infinite = map(g_values) do g\n", + " H = transverse_field_ising(; g = g)\n", + " ψ, = find_groundstate(ψ₀_infinite, H, VUMPS(; verbosity = 0))\n", + " return ψ\n", + "end;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The order parameter of a translation-invariant state is just $\\langle\\sigma^z\\rangle$ on\n", + "a single site of the unit cell; we again take the absolute value, because on the ordered\n", + "side the infinite state settles into one of the two symmetry-broken ground states (see\n", + "The thermodynamic limit)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "M_infinite = [abs(expectation_value(ψ, 1 => σᶻ())) for ψ in states_infinite];" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Plotting both curves in a single figure lets us compare them directly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "p_magnetization = plot(;\n", + " xlabel = \"g\", ylabel = \"|⟨σᶻ⟩|\", title = \"TFIM order parameter\", legend = :bottomleft\n", + ")\n", + "scatter!(p_magnetization, g_values, M_finite; label = \"finite chain, L = $L, D = $D\")\n", + "scatter!(p_magnetization, g_values, M_infinite; label = \"infinite, D = $D\")\n", + "vline!(p_magnetization, [1.0]; color = \"gray\", linestyle = :dash, label = \"g = 1\")\n", + "p_magnetization" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Both calculations agree deep in either phase, but near the transition they tell very different stories.\n", + "The infinite curve stays on its ordered branch essentially up to `g = 1` and then collapses: it locates the critical point cleanly.\n", + "The finite-chain curve instead drops to zero far earlier — at this `L` and `D` the variational optimum on the open chain switches from the symmetry-broken branch to the exactly symmetric ground state, whose magnetization vanishes.\n", + "Where that switch happens is set by `L` and `D`, not by the physics; the same sweep at `D = 4` in Your first ground state puts it elsewhere.\n", + "That is the real lesson of this panel: the finite-chain order parameter is dominated by which state the algorithm selects, while the calculation performed directly in the thermodynamic limit pins the transition at `g = 1`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Entanglement entropy across the transition\n", + "\n", + "Entanglement is a hallmark of criticality: it is bounded away from the critical point but\n", + "grows sharply as we approach it.\n", + "For an `InfiniteMPS`, `entropy` returns the von Neumann entanglement entropy\n", + "per bond, one value for each site of the unit cell.\n", + "Our unit cell has a single site, so we take the one entry with `only`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "S_infinite = [real(only(entropy(ψ))) for ψ in states_infinite]\n", + "p_entropy = scatter(\n", + " g_values, S_infinite;\n", + " xlabel = \"g\", ylabel = \"entanglement entropy S\", title = \"TFIM entanglement entropy\",\n", + " legend = false\n", + ")\n", + "vline!(p_entropy, [1.0]; color = \"gray\", linestyle = :dash)\n", + "p_entropy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The entropy peaks near `g = 1`.\n", + "That peak is the entanglement signature of the phase transition: at criticality\n", + "correlations become long-ranged and the ground state is at its most entangled, whereas deep\n", + "in either phase the state is closer to a simple product and the entropy is small." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Correlation length across the transition\n", + "\n", + "The `correlation_length` measures how far apart two spins can still influence each\n", + "other; it is extracted from the transfer-matrix spectrum of the uniform infinite state and\n", + "has no finite-chain analogue.\n", + "It grows toward criticality, so we plot it on a logarithmic vertical axis to make the\n", + "growth visible." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "ξ_infinite = [correlation_length(ψ) for ψ in states_infinite]\n", + "p_xi = scatter(\n", + " g_values, ξ_infinite;\n", + " xlabel = \"g\", ylabel = \"correlation length ξ\", yscale = :log10,\n", + " title = \"TFIM correlation length\", legend = false\n", + ")\n", + "vline!(p_xi, [1.0]; color = \"gray\", linestyle = :dash)\n", + "p_xi" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The correlation length peaks near `g = 1` as well.\n", + "At a genuine critical point it would diverge, but a finite bond dimension `D` can only\n", + "capture correlations out to a finite range, so what we measure is large-but-capped rather\n", + "than infinite — the peak grows and sharpens as `D` is increased." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## What you now have\n", + "\n", + "Three independent diagnostics — the order parameter, the entanglement entropy, and the\n", + "correlation length — all locate the transition of the transverse-field Ising model near\n", + "`g = 1`, and the finite-versus-infinite comparison shows concretely why the thermodynamic\n", + "limit is the right place to measure it.\n", + "\n", + "From here the gallery goes further.\n", + "The Ising CFT example extracts the momentum-resolved excitation spectrum right at\n", + "criticality and matches it to the predictions of conformal field theory, turning the \"there\n", + "is a critical point near `g = 1`\" of this page into a quantitative fingerprint of *which*\n", + "critical theory it is.\n", + "Every curve on this page also sharpens if you rerun it at a larger bond dimension `D`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "---\n", + "\n", + "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Julia 1.12.6", + "language": "julia", + "name": "julia-1.12" + }, + "language_info": { + "file_extension": ".jl", + "mimetype": "application/julia", + "name": "julia", + "version": "1.12.6" + } + }, + "nbformat": 4, + "nbformat_minor": 3 +} \ No newline at end of file diff --git a/examples/Cache.toml b/examples/Cache.toml index f3e9fa9fe..d65c505c7 100644 --- a/examples/Cache.toml +++ b/examples/Cache.toml @@ -1,4 +1,5 @@ [excitations] +"1.su3-heisenberg" = "a57dbdf1b92f6c589c086b166dab64f4f224813ef632e1668c34c9607f005f9f" "0.haldane" = "c09df36c3be5cd452bec564d22f6e2815474a9dab71dd5528013a3fb46b2f7c0" [dynamics] @@ -13,4 +14,5 @@ "2.hubbard" = "29e2469ac9307f1242bdfb76b97c6a2e04dc087f5d4b6c45c8b7a15df12ad36c" "3.bose-hubbard" = "cf0d9a543e784dc6053e413780d19e1b59bf956dd4598752fdf664804dd68ce6" "1.xxz-heisenberg" = "dae5f29dcad5fcfaffd12a7847916adb92c955276ce24166fd3f9c9534c50784" +"0.tfim-groundstate" = "a87cc89caf8df47285e25f6cec4ff130ea6ed88d4f73d59f8e7dc2e799ece1b0" "5.ising-cft" = "ebcae1e501347cb00a46d0889df1355707be77cf962f9ee0d16416393492529b" diff --git a/examples/Project.toml b/examples/Project.toml index 2e29ddd9c..1d6ade97b 100644 --- a/examples/Project.toml +++ b/examples/Project.toml @@ -12,6 +12,7 @@ Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" Polynomials = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" QuadGK = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" +SUNRepresentations = "1a50b95c-7aac-476d-a9ce-2bfc675fc617" TensorKit = "07d1fe3e-3e46-537d-9eac-e9e13d0d4cec" TensorOperations = "6aa20fa7-93e2-5fca-9bc0-fbd0db3c71a2" diff --git a/examples/excitations/1.su3-heisenberg/main.jl b/examples/excitations/1.su3-heisenberg/main.jl new file mode 100644 index 000000000..3c244f281 --- /dev/null +++ b/examples/excitations/1.su3-heisenberg/main.jl @@ -0,0 +1,190 @@ +md""" +# The SU(3) Heisenberg chain + +The spin-1 Heisenberg chain famously has a gapped, symmetry-protected topological ground +state: the Haldane phase. +A natural question is what happens when the ``SU(2)`` symmetry of the spins is promoted to a +larger ``SU(N)`` symmetry. +In this example we study the ``SU(3)`` generalization introduced in [devos2022](@cite): a +uniform chain where every site carries the fully-symmetric ``[3\,0\,0]`` irrep of ``SU(3)`` +(the ten-dimensional representation), coupled by a nearest-neighbour ``SU(3)``-invariant +Heisenberg interaction + +```math +H = J \sum_{\langle i, j \rangle} \sum_{a=1}^{8} T^a_i T^a_j , +``` + +where the ``T^a`` are the eight generators of ``SU(3)``. +This is the direct analog of the spin-1 chain, with the three generators of ``SU(2)`` +replaced by the eight generators of ``SU(3)``. +The goal of this example is to exercise the full ``SU(N)`` toolchain end to end — building the +symmetric Hamiltonian, optimizing a uniform ground state with VUMPS, and scanning an +excitation dispersion — rather than to pin down the model's (very small) gap to high accuracy; +we return to that point in the closing discussion. + +Working with the full non-abelian ``SU(3)`` symmetry is what makes this tractable. +Just as ``SU(2)`` symmetry drastically shrinks the spin-1 problem (see +[Symmetries](@ref concept_symmetries)), imposing ``SU(3)`` block-diagonalizes every tensor +along its irreducible representations, so that a modest number of variational parameters +already captures a large physical bond dimension. +The Clebsch–Gordan coefficients that this requires are provided by +[SUNRepresentations.jl](https://github.com/QuantumKitHub/SUNRepresentations.jl), whose +`SU3Irrep` sectors plug directly into TensorKit's graded vector spaces. + +!!! warning "First-run cost" + SUNRepresentations.jl computes ``SU(N)`` Clebsch–Gordan coefficients on demand and + caches them both in memory and on disk (via `Scratch.jl`). + The **first** time a given coefficient is needed the computation can be slow; later runs + reuse the on-disk cache. + On a machine without a persisted scratch cache — such as a fresh continuous-integration + runner — this example therefore pays the full coefficient-generation cost once. +""" + +using TensorKit +using SUNRepresentations +using MPSKit +using Plots + +# For reproducibility of this page, we fix the seed of the random number generator: + +using Random +Random.seed!(4321); + +md""" +## The model + +Each site carries the ``[3\,0\,0]`` irrep, which we obtain from its highest weight and +represent as a one-dimensional graded space. +""" + +I300 = SU3Irrep(3, 0, 0) +Vphys = Vect[SU3Irrep](I300 => 1) +@show dim(I300) + +md""" +To build the interaction we use the same Casimir trick as for the ``SU(2)`` chain. +Writing ``C_2 = \sum_a T^a T^a`` for the quadratic Casimir operator, the two-site coupling is +diagonal in the total ``SU(3)`` charge ``c`` of a bond: + +```math +\sum_a T^a_i T^a_j = \tfrac{1}{2}\left( C_2(c) - C_2([3\,0\,0]) - C_2([3\,0\,0]) \right). +``` + +SUNRepresentations.jl provides the quadratic Casimir through `casimir(2, irrep)`. +Its normalization is the standard one with ``\mathrm{tr}(T^a T^b) = \tfrac{1}{2}\delta^{ab}``: +the fundamental ``[1\,0\,0]`` has ``C_2 = 4/3 = (N^2-1)/(2N)``. +""" + +@show casimir(2, SU3Irrep(1, 0, 0)) +@show casimir(2, I300) + +md""" +The nearest-neighbour term is then a single TensorKit operator that acts as a scalar on each +fusion channel of ``[3\,0\,0] \otimes [3\,0\,0]``. +Constructing it by iterating over the blocks — one block per total charge ``c`` — mirrors the +``SU(2)`` construction, but now with `casimir(2, ⋅)` supplying the eigenvalues. +""" + +function su3_heisenberg(Vphys; J = 1.0) + site = SU3Irrep(3, 0, 0) + c2_site = casimir(2, site) + SS = zeros(ComplexF64, Vphys ⊗ Vphys ← Vphys ⊗ Vphys) + for (c, data) in blocks(SS) + coupling = (casimir(2, c) - 2 * c2_site) / 2 + for i in axes(data, 1) + data[i, i] = J * coupling + end + end + return InfiniteMPOHamiltonian(SS) +end + +H = su3_heisenberg(Vphys) + +md""" +We can read off the physics directly from the fusion channels. +The product ``[3\,0\,0] \otimes [3\,0\,0]`` decomposes into four irreps, and the +antiferromagnetic coupling (``J > 0``) favours the channels of lowest Casimir: +""" + +for (c, n) in directproduct(I300, I300) + coupling = (casimir(2, c) - 2 * casimir(2, I300)) / 2 + println(rpad(string(c), 22), " dim = ", rpad(dim(c), 4), " coupling = ", coupling) +end + +md""" +## Ground state + +The ``[3\,0\,0]`` irrep has trivial triality (congruency class ``0``), so — like the +integer-spin Haldane chain — a translation-invariant state on a single-site unit cell is +admissible. +Because the physical charge has triality ``0`` it cannot shift the triality of the virtual +bonds, so every virtual space must sit in a single congruency class; here we use the trivial +class ``0``, which we found to give the lowest variational energy. +Following [devos2022](@cite), we seed the optimization with a random ``SU(3)``-symmetric +uniform state and optimize with VUMPS. +The bond dimension is kept deliberately modest here so that the page builds quickly. +""" + +Vvirt = Vect[SU3Irrep]( + SU3Irrep(0, 0, 0) => 8, + SU3Irrep(2, 1, 0) => 6, + SU3Irrep(3, 0, 0) => 3, + SU3Irrep(3, 3, 0) => 3, + SU3Irrep(4, 2, 0) => 2, +) +@show dim(Vvirt) + +ψ₀ = InfiniteMPS([Vphys], [Vvirt]) +ψ, envs, δ = find_groundstate(ψ₀, H, VUMPS(; maxiter = 200, tol = 1.0e-10, verbosity = 1)) +E₀ = real(expectation_value(ψ, H)) +println("ground-state energy per site: E₀ = $E₀") + +md""" +## The excitation spectrum + +On top of the ground state we compute excitations with the quasiparticle ansatz. +In the thermodynamic limit each excitation carries a definite momentum ``k`` and a definite +``SU(3)`` charge. +Following [devos2022](@cite), we look in the adjoint ``[2\,1\,0]`` sector, where that reference +finds the lowest branch, and scan across half of the Brillouin zone (the other half follows by +reflection). +""" + +sector = SU3Irrep(2, 1, 0) +kspace = range(0, π, 10) +Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ, envs; sector, verbosity = 0) + +Δ, idx = findmin(real.(Es)) +println("branch minimum ΔE/J = $Δ at k = $(kspace[idx])") + +#+ + +plot( + kspace, real.(Es); + xaxis = "momentum k", yaxis = "ΔE / J", label = "[2 1 0] branch", + title = "SU(3) [3 0 0] excitation dispersion" +) +hline!([0.0]; color = :gray, linestyle = :dash, label = "") +vline!([2π / 3]; color = :gray, linestyle = :dot, label = "k = 2π/3") + +md""" +The branch has a pronounced soft mode at ``k = 2\pi/3``, exactly the momentum at which +[devos2022](@cite) locates the minimum of the dispersion, where that reference reports a gap +of ``\Delta / J = 0.0263``. + +The soft-mode *location* is reproduced cleanly, but the gap *value* is not, and it is worth +being precise about why. +The quasiparticle energies plotted above are a genuine variational upper bound on the +excitation energies only when they are measured relative to the *exact* ground state. +Here the ground state is a deliberately lightweight, modest-bond-dimension uniform ``SU(3)`` +MPS, and for this near-critical model it is not converged to that accuracy. +Because the reference state sits slightly too high in energy, the ansatz can find "excitations" +that lie below it, so near ``k = 2\pi/3`` the computed branch drops to essentially zero and even +slightly negative. +The dispersion here is therefore *not* a variational estimate of the true gap: the small value +``\Delta / J = 0.0263`` is quoted from [devos2022](@cite) and would require a carefully +converged, large-bond-dimension calculation to reproduce. +What this example does show is the complete ``SU(3)``-symmetric workflow — Hamiltonian +construction, VUMPS ground state, and a momentum-resolved excitation scan — with the soft mode +correctly located at ``k = 2\pi/3``. +""" diff --git a/examples/groundstates/0.tfim-groundstate/main.jl b/examples/groundstates/0.tfim-groundstate/main.jl new file mode 100644 index 000000000..09b3ae7e5 --- /dev/null +++ b/examples/groundstates/0.tfim-groundstate/main.jl @@ -0,0 +1,185 @@ +md""" +# The transverse-field Ising model: a complete ground-state study + +This example is the bridge from the introductory tutorials into the research-grade +gallery. +If you have worked through [Your first ground state](@ref tutorial_first_groundstate) and +[The thermodynamic limit](@ref tutorial_thermodynamic_limit) you already know every +individual tool used here; the goal now is to *assemble* them into one coherent case +study of a genuine quantum phase transition. + +We use the same transverse-field Ising model (TFIM) as the tutorials, on a chain of +spin-1/2 sites: + +```math +H = -J\left(\sum_{\langle i,j\rangle} \sigma^z_i \sigma^z_j + g\sum_i \sigma^x_i\right), +``` + +where the first sum runs over neighbouring pairs, ``J`` sets the energy scale, and the +dimensionless field ``g`` tunes the competition between the ``\sigma^z\sigma^z`` +interaction and the transverse ``\sigma^x`` field. +The model has a quantum critical point at ``g = 1``. + +Rather than looking at a single field value, we will scan ``g`` across the transition and +diagnose it three independent ways, comparing a *finite* chain against a calculation +performed *directly in the thermodynamic limit*: + +1. the order parameter ``|\langle\sigma^z\rangle|``, computed both for a finite chain and + for an infinite chain, in one figure; +2. the entanglement entropy of the infinite state; +3. the correlation length of the infinite state. + +All three should point at the same place — that agreement is the payoff. +""" + +# We take the model and lattice from MPSKitModels, the tensor backend from TensorKit, and +# Plots for the figures. The Pauli operators `σᶻ`, `σˣ` are re-exported by MPSKitModels. + +using MPSKit, MPSKitModels, TensorKit, Plots + +md""" +## Shared parameters + +We fix a finite chain length `L`, a bond dimension `D` (the accuracy knob, see +[Controlling bond dimension](@ref howto_bond_dimension)), and the set of field values to +scan. +`D` is kept modest so the whole page runs in a couple of minutes; increasing it sharpens +the infinite-state diagnostics below (the finite-chain curve responds to `D` in a less +obvious way, as we will see). +""" + +L = 16 +D = 8 +g_values = 0.1:0.1:2.0 + +md""" +## 1. Finite versus infinite magnetization + +We compute the order parameter ``|\langle\sigma^z\rangle|`` two ways at every field value. + +For the **finite** calculation we use an open chain of `L` sites, exactly as in the +tutorial, and optimize with [`DMRG`](@ref). +We average ``\langle\sigma^z_i\rangle`` over the sites and take the absolute value: the +exact finite-`L` ground state is symmetric, but DMRG lands on one of the two +symmetry-broken states with an arbitrary sign (see the discussion in +[Your first ground state](@ref tutorial_first_groundstate)). +""" + +ψ₀_finite = FiniteMPS(L, ℂ^2, ℂ^D) +M_finite = map(g_values) do g + H = transverse_field_ising(FiniteChain(L); g = g) + ψ, = find_groundstate(ψ₀_finite, H, DMRG(; verbosity = 0)) + return abs(sum(expectation_value(ψ, i => σᶻ()) for i in 1:L)) / L +end; + +md""" +For the **infinite** calculation we drop the lattice argument to build the Hamiltonian on +the infinite chain, use an [`InfiniteMPS`](@ref), and optimize with [`VUMPS`](@ref). +We keep every optimized infinite state, because we will reuse them for the entropy and +correlation-length diagnostics below. +""" + +ψ₀_infinite = InfiniteMPS(ℂ^2, ℂ^D) +states_infinite = map(g_values) do g + H = transverse_field_ising(; g = g) + ψ, = find_groundstate(ψ₀_infinite, H, VUMPS(; verbosity = 0)) + return ψ +end; + +md""" +The order parameter of a translation-invariant state is just ``\langle\sigma^z\rangle`` on +a single site of the unit cell; we again take the absolute value, because on the ordered +side the infinite state settles into one of the two symmetry-broken ground states (see +[The thermodynamic limit](@ref tutorial_thermodynamic_limit)). +""" + +M_infinite = [abs(expectation_value(ψ, 1 => σᶻ())) for ψ in states_infinite]; + +md""" +Plotting both curves in a single figure lets us compare them directly. +""" + +p_magnetization = plot(; + xlabel = "g", ylabel = "|⟨σᶻ⟩|", title = "TFIM order parameter", legend = :bottomleft +) +scatter!(p_magnetization, g_values, M_finite; label = "finite chain, L = $L, D = $D") +scatter!(p_magnetization, g_values, M_infinite; label = "infinite, D = $D") +vline!(p_magnetization, [1.0]; color = "gray", linestyle = :dash, label = "g = 1") +p_magnetization + +md""" +Both calculations agree deep in either phase, but near the transition they tell very different stories. +The infinite curve stays on its ordered branch essentially up to `g = 1` and then collapses: it locates the critical point cleanly. +The finite-chain curve instead drops to zero far earlier — at this `L` and `D` the variational optimum on the open chain switches from the symmetry-broken branch to the exactly symmetric ground state, whose magnetization vanishes. +Where that switch happens is set by `L` and `D`, not by the physics; the same sweep at `D = 4` in [Your first ground state](@ref tutorial_first_groundstate) puts it elsewhere. +That is the real lesson of this panel: the finite-chain order parameter is dominated by which state the algorithm selects, while the calculation performed directly in the thermodynamic limit pins the transition at `g = 1`. + +""" + +md""" +## 2. Entanglement entropy across the transition + +Entanglement is a hallmark of criticality: it is bounded away from the critical point but +grows sharply as we approach it. +For an [`InfiniteMPS`](@ref), [`entropy`](@ref) returns the von Neumann entanglement entropy +per bond, one value for each site of the unit cell. +Our unit cell has a single site, so we take the one entry with `only`. +""" + +S_infinite = [real(only(entropy(ψ))) for ψ in states_infinite] +p_entropy = scatter( + g_values, S_infinite; + xlabel = "g", ylabel = "entanglement entropy S", title = "TFIM entanglement entropy", + legend = false +) +vline!(p_entropy, [1.0]; color = "gray", linestyle = :dash) +p_entropy + +md""" +The entropy peaks near `g = 1`. +That peak is the entanglement signature of the phase transition: at criticality +correlations become long-ranged and the ground state is at its most entangled, whereas deep +in either phase the state is closer to a simple product and the entropy is small. +""" + +md""" +## 3. Correlation length across the transition + +The [`correlation_length`](@ref) measures how far apart two spins can still influence each +other; it is extracted from the transfer-matrix spectrum of the uniform infinite state and +has no finite-chain analogue. +It grows toward criticality, so we plot it on a logarithmic vertical axis to make the +growth visible. +""" + +ξ_infinite = [correlation_length(ψ) for ψ in states_infinite] +p_xi = scatter( + g_values, ξ_infinite; + xlabel = "g", ylabel = "correlation length ξ", yscale = :log10, + title = "TFIM correlation length", legend = false +) +vline!(p_xi, [1.0]; color = "gray", linestyle = :dash) +p_xi + +md""" +The correlation length peaks near `g = 1` as well. +At a genuine critical point it would diverge, but a finite bond dimension `D` can only +capture correlations out to a finite range, so what we measure is large-but-capped rather +than infinite — the peak grows and sharpens as `D` is increased. +""" + +md""" +## What you now have + +Three independent diagnostics — the order parameter, the entanglement entropy, and the +correlation length — all locate the transition of the transverse-field Ising model near +`g = 1`, and the finite-versus-infinite comparison shows concretely why the thermodynamic +limit is the right place to measure it. + +From here the gallery goes further. +The Ising CFT example extracts the momentum-resolved excitation spectrum right at +criticality and matches it to the predictions of conformal field theory, turning the "there +is a critical point near `g = 1`" of this page into a quantitative fingerprint of *which* +critical theory it is. +Every curve on this page also sharpens if you rerun it at a larger bond dimension `D`. +"""