From 85ed22b67fcbfd83986c7d0bf8810d7b1b42d4da Mon Sep 17 00:00:00 2001 From: lkdvos Date: Mon, 3 Aug 2026 13:13:48 -0400 Subject: [PATCH 1/8] docs(examples): regroup the gallery by computational task `quantum1d` and `classic2d` grouped by the physics of the model, which is not how a reader arrives: they come with a task ("I need a ground state", "I need finite temperature") and have to open every example to find out which one does it. Regroup into `groundstates`, `excitations`, `dynamics` and `statmech`, and give the gallery index a one-paragraph summary per example so it can be scanned. `examples/make.jl` now discovers groups by listing its own subdirectories instead of naming them, so adding a group needs no pipeline change. The gallery sidebar in `docs/make.jl` mirrors the same grouping. Co-Authored-By: Claude Opus 5 (1M context) --- docs/make.jl | 23 +- .../classic2d/1.hard-hexagon/figure-1.png | Bin 16598 -> 0 bytes .../0.ising-dqpt}/finite_timeev.png | Bin .../0.ising-dqpt}/index.md | 48 +- .../0.ising-dqpt}/infinite_timeev.png | Bin .../0.ising-dqpt}/main.ipynb | 8 +- .../dynamics/1.xy-finiteT/figure-1.png | Bin 0 -> 38310 bytes .../dynamics/1.xy-finiteT/figure-2.png | Bin 0 -> 40337 bytes .../dynamics/1.xy-finiteT/figure-3.png | Bin 0 -> 40669 bytes .../dynamics/1.xy-finiteT/figure-4.png | Bin 0 -> 37133 bytes .../dynamics/1.xy-finiteT/figure-5.png | Bin 0 -> 40664 bytes .../dynamics/1.xy-finiteT/figure-6.png | Bin 0 -> 42270 bytes .../1.xy-finiteT}/index.md | 46 +- .../1.xy-finiteT}/main.ipynb | 196 +++--- .../0.haldane}/figure-1.png | Bin .../0.haldane}/figure-2.png | Bin .../0.haldane}/figure-3.png | Bin .../0.haldane}/index.md | 39 +- .../0.haldane}/main.ipynb | 2 +- .../1.xxz-heisenberg/figure-1.png | Bin 0 -> 12994 bytes .../1.xxz-heisenberg/figure-2.png | Bin 0 -> 21619 bytes .../groundstates/1.xxz-heisenberg/index.md | 208 +++++++ .../1.xxz-heisenberg}/main.ipynb | 197 +++--- .../2.hubbard}/figure-1.png | Bin 41850 -> 41850 bytes .../2.hubbard}/figure-2.png | Bin 40056 -> 40056 bytes .../2.hubbard}/figure-3.png | Bin .../examples/groundstates/2.hubbard/index.md | 361 +++++++++++ .../2.hubbard}/main.ipynb | 44 +- .../groundstates/3.bose-hubbard/figure-1.png | Bin 0 -> 16503 bytes .../3.bose-hubbard}/figure-2.png | Bin .../groundstates/3.bose-hubbard/figure-3.png | Bin 0 -> 39306 bytes .../groundstates/3.bose-hubbard/figure-4.png | Bin 0 -> 36945 bytes .../groundstates/3.bose-hubbard/figure-5.png | Bin 0 -> 32117 bytes .../groundstates/3.bose-hubbard/figure-6.png | Bin 0 -> 15424 bytes .../3.bose-hubbard}/index.md | 28 +- .../3.bose-hubbard}/main.ipynb | 0 .../groundstates/4.haldane-spt/figure-1.png | Bin 0 -> 34236 bytes .../groundstates/4.haldane-spt/figure-2.png | Bin 0 -> 32088 bytes .../4.haldane-spt}/figure-3.png | Bin 37379 -> 37375 bytes .../4.haldane-spt}/index.md | 16 +- .../4.haldane-spt}/main.ipynb | 0 .../4.haldane-spt}/spt-tensors.svg | 0 .../groundstates/5.ising-cft/figure-1.png | Bin 0 -> 15044 bytes .../5.ising-cft}/figure-2.png | Bin .../groundstates/5.ising-cft/figure-3.png | Bin 0 -> 22801 bytes .../5.ising-cft}/index.md | 84 +-- .../5.ising-cft}/main.ipynb | 2 +- .../5.ising-cft}/translation_mpo.svg | 0 docs/src/examples/index.md | 111 +++- .../quantum1d/1.ising-cft/figure-1.png | Bin 15484 -> 0 bytes .../quantum1d/1.ising-cft/figure-3.png | Bin 22799 -> 0 bytes .../quantum1d/4.xxz-heisenberg/figure-1.png | Bin 11462 -> 0 bytes .../quantum1d/4.xxz-heisenberg/figure-2.png | Bin 19339 -> 0 bytes .../quantum1d/4.xxz-heisenberg/index.md | 568 ------------------ .../quantum1d/5.haldane-spt/figure-1.png | Bin 32871 -> 0 bytes .../quantum1d/5.haldane-spt/figure-2.png | Bin 32025 -> 0 bytes .../src/examples/quantum1d/6.hubbard/index.md | 494 --------------- .../quantum1d/7.xy-finiteT/figure-1.png | Bin 37795 -> 0 bytes .../quantum1d/7.xy-finiteT/figure-2.png | Bin 36052 -> 0 bytes .../quantum1d/7.xy-finiteT/figure-3.png | Bin 36103 -> 0 bytes .../quantum1d/7.xy-finiteT/figure-4.png | Bin 34906 -> 0 bytes .../quantum1d/7.xy-finiteT/figure-5.png | Bin 38446 -> 0 bytes .../quantum1d/7.xy-finiteT/figure-6.png | Bin 42294 -> 0 bytes .../quantum1d/8.bose-hubbard/figure-1.png | Bin 16373 -> 0 bytes .../quantum1d/8.bose-hubbard/figure-3.png | Bin 39405 -> 0 bytes .../quantum1d/8.bose-hubbard/figure-4.png | Bin 36800 -> 0 bytes .../quantum1d/8.bose-hubbard/figure-5.png | Bin 35226 -> 0 bytes .../quantum1d/8.bose-hubbard/figure-6.png | Bin 15426 -> 0 bytes .../statmech/0.hard-hexagon/figure-1.png | Bin 0 -> 16674 bytes .../0.hard-hexagon}/hexagon.svg | 0 .../0.hard-hexagon}/index.md | 18 +- .../0.hard-hexagon}/main.ipynb | 6 +- examples/Cache.toml | 26 +- examples/README.md | 8 +- .../0.ising-dqpt}/finite_timeev.png | Bin .../0.ising-dqpt}/infinite_timeev.png | Bin .../0.ising-dqpt}/main.jl | 8 +- .../1.xy-finiteT}/main.jl | 10 +- .../0.haldane}/main.jl | 2 +- .../1.xxz-heisenberg}/main.jl | 17 +- .../2.hubbard}/main.jl | 33 +- .../3.bose-hubbard}/main.jl | 0 .../4.haldane-spt}/main.jl | 0 .../4.haldane-spt}/spt-tensors.svg | 0 .../5.ising-cft}/main.jl | 2 +- .../5.ising-cft}/translation_mpo.svg | 0 examples/make.jl | 24 +- .../0.hard-hexagon}/hexagon.svg | 0 .../0.hard-hexagon}/main.jl | 0 89 files changed, 1111 insertions(+), 1518 deletions(-) delete mode 100644 docs/src/examples/classic2d/1.hard-hexagon/figure-1.png rename docs/src/examples/{quantum1d/3.ising-dqpt => dynamics/0.ising-dqpt}/finite_timeev.png (100%) rename docs/src/examples/{quantum1d/3.ising-dqpt => dynamics/0.ising-dqpt}/index.md (75%) rename docs/src/examples/{quantum1d/3.ising-dqpt => dynamics/0.ising-dqpt}/infinite_timeev.png (100%) rename docs/src/examples/{quantum1d/3.ising-dqpt => dynamics/0.ising-dqpt}/main.ipynb (96%) create mode 100644 docs/src/examples/dynamics/1.xy-finiteT/figure-1.png create mode 100644 docs/src/examples/dynamics/1.xy-finiteT/figure-2.png create mode 100644 docs/src/examples/dynamics/1.xy-finiteT/figure-3.png create mode 100644 docs/src/examples/dynamics/1.xy-finiteT/figure-4.png create mode 100644 docs/src/examples/dynamics/1.xy-finiteT/figure-5.png create mode 100644 docs/src/examples/dynamics/1.xy-finiteT/figure-6.png rename docs/src/examples/{quantum1d/7.xy-finiteT => dynamics/1.xy-finiteT}/index.md (93%) rename docs/src/examples/{quantum1d/7.xy-finiteT => dynamics/1.xy-finiteT}/main.ipynb (94%) rename docs/src/examples/{quantum1d/2.haldane => excitations/0.haldane}/figure-1.png (100%) rename docs/src/examples/{quantum1d/2.haldane => excitations/0.haldane}/figure-2.png (100%) rename docs/src/examples/{quantum1d/2.haldane => excitations/0.haldane}/figure-3.png (100%) rename docs/src/examples/{quantum1d/2.haldane => excitations/0.haldane}/index.md (78%) rename docs/src/examples/{quantum1d/2.haldane => excitations/0.haldane}/main.ipynb (99%) create mode 100644 docs/src/examples/groundstates/1.xxz-heisenberg/figure-1.png create mode 100644 docs/src/examples/groundstates/1.xxz-heisenberg/figure-2.png create mode 100644 docs/src/examples/groundstates/1.xxz-heisenberg/index.md rename docs/src/examples/{quantum1d/4.xxz-heisenberg => groundstates/1.xxz-heisenberg}/main.ipynb (81%) rename docs/src/examples/{quantum1d/6.hubbard => groundstates/2.hubbard}/figure-1.png (99%) rename docs/src/examples/{quantum1d/6.hubbard => groundstates/2.hubbard}/figure-2.png (99%) rename docs/src/examples/{quantum1d/6.hubbard => groundstates/2.hubbard}/figure-3.png (100%) create mode 100644 docs/src/examples/groundstates/2.hubbard/index.md rename docs/src/examples/{quantum1d/6.hubbard => groundstates/2.hubbard}/main.ipynb (91%) create mode 100644 docs/src/examples/groundstates/3.bose-hubbard/figure-1.png rename docs/src/examples/{quantum1d/8.bose-hubbard => groundstates/3.bose-hubbard}/figure-2.png (100%) create mode 100644 docs/src/examples/groundstates/3.bose-hubbard/figure-3.png create mode 100644 docs/src/examples/groundstates/3.bose-hubbard/figure-4.png create mode 100644 docs/src/examples/groundstates/3.bose-hubbard/figure-5.png create mode 100644 docs/src/examples/groundstates/3.bose-hubbard/figure-6.png rename docs/src/examples/{quantum1d/8.bose-hubbard => groundstates/3.bose-hubbard}/index.md (96%) rename docs/src/examples/{quantum1d/8.bose-hubbard => groundstates/3.bose-hubbard}/main.ipynb (100%) create mode 100644 docs/src/examples/groundstates/4.haldane-spt/figure-1.png create mode 100644 docs/src/examples/groundstates/4.haldane-spt/figure-2.png rename docs/src/examples/{quantum1d/5.haldane-spt => groundstates/4.haldane-spt}/figure-3.png (51%) rename docs/src/examples/{quantum1d/5.haldane-spt => groundstates/4.haldane-spt}/index.md (93%) rename docs/src/examples/{quantum1d/5.haldane-spt => groundstates/4.haldane-spt}/main.ipynb (100%) rename docs/src/examples/{quantum1d/5.haldane-spt => groundstates/4.haldane-spt}/spt-tensors.svg (100%) create mode 100644 docs/src/examples/groundstates/5.ising-cft/figure-1.png rename docs/src/examples/{quantum1d/1.ising-cft => groundstates/5.ising-cft}/figure-2.png (100%) create mode 100644 docs/src/examples/groundstates/5.ising-cft/figure-3.png rename docs/src/examples/{quantum1d/1.ising-cft => groundstates/5.ising-cft}/index.md (63%) rename docs/src/examples/{quantum1d/1.ising-cft => groundstates/5.ising-cft}/main.ipynb (99%) rename docs/src/examples/{quantum1d/1.ising-cft => groundstates/5.ising-cft}/translation_mpo.svg (100%) delete mode 100644 docs/src/examples/quantum1d/1.ising-cft/figure-1.png delete mode 100644 docs/src/examples/quantum1d/1.ising-cft/figure-3.png delete mode 100644 docs/src/examples/quantum1d/4.xxz-heisenberg/figure-1.png delete mode 100644 docs/src/examples/quantum1d/4.xxz-heisenberg/figure-2.png delete mode 100644 docs/src/examples/quantum1d/4.xxz-heisenberg/index.md delete mode 100644 docs/src/examples/quantum1d/5.haldane-spt/figure-1.png delete mode 100644 docs/src/examples/quantum1d/5.haldane-spt/figure-2.png delete mode 100644 docs/src/examples/quantum1d/6.hubbard/index.md delete mode 100644 docs/src/examples/quantum1d/7.xy-finiteT/figure-1.png delete mode 100644 docs/src/examples/quantum1d/7.xy-finiteT/figure-2.png delete mode 100644 docs/src/examples/quantum1d/7.xy-finiteT/figure-3.png delete mode 100644 docs/src/examples/quantum1d/7.xy-finiteT/figure-4.png delete mode 100644 docs/src/examples/quantum1d/7.xy-finiteT/figure-5.png delete mode 100644 docs/src/examples/quantum1d/7.xy-finiteT/figure-6.png delete mode 100644 docs/src/examples/quantum1d/8.bose-hubbard/figure-1.png delete mode 100644 docs/src/examples/quantum1d/8.bose-hubbard/figure-3.png delete mode 100644 docs/src/examples/quantum1d/8.bose-hubbard/figure-4.png delete mode 100644 docs/src/examples/quantum1d/8.bose-hubbard/figure-5.png delete mode 100644 docs/src/examples/quantum1d/8.bose-hubbard/figure-6.png create mode 100644 docs/src/examples/statmech/0.hard-hexagon/figure-1.png rename docs/src/examples/{classic2d/1.hard-hexagon => statmech/0.hard-hexagon}/hexagon.svg (100%) rename docs/src/examples/{classic2d/1.hard-hexagon => statmech/0.hard-hexagon}/index.md (84%) rename docs/src/examples/{classic2d/1.hard-hexagon => statmech/0.hard-hexagon}/main.ipynb (94%) rename examples/{quantum1d/3.ising-dqpt => dynamics/0.ising-dqpt}/finite_timeev.png (100%) rename examples/{quantum1d/3.ising-dqpt => dynamics/0.ising-dqpt}/infinite_timeev.png (100%) rename examples/{quantum1d/3.ising-dqpt => dynamics/0.ising-dqpt}/main.jl (94%) rename examples/{quantum1d/7.xy-finiteT => dynamics/1.xy-finiteT}/main.jl (97%) rename examples/{quantum1d/2.haldane => excitations/0.haldane}/main.jl (99%) rename examples/{quantum1d/4.xxz-heisenberg => groundstates/1.xxz-heisenberg}/main.jl (91%) rename examples/{quantum1d/6.hubbard => groundstates/2.hubbard}/main.jl (90%) rename examples/{quantum1d/8.bose-hubbard => groundstates/3.bose-hubbard}/main.jl (100%) rename examples/{quantum1d/5.haldane-spt => groundstates/4.haldane-spt}/main.jl (100%) rename examples/{quantum1d/5.haldane-spt => groundstates/4.haldane-spt}/spt-tensors.svg (100%) rename examples/{quantum1d/1.ising-cft => groundstates/5.ising-cft}/main.jl (99%) rename examples/{quantum1d/1.ising-cft => groundstates/5.ising-cft}/translation_mpo.svg (100%) rename examples/{classic2d/1.hard-hexagon => statmech/0.hard-hexagon}/hexagon.svg (100%) rename examples/{classic2d/1.hard-hexagon => statmech/0.hard-hexagon}/main.jl (100%) diff --git a/docs/make.jl b/docs/make.jl index 5922e4ee3..2d71a20a0 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -12,13 +12,19 @@ using DocumenterVitepress using DocumenterCitations using DocumenterInterLinks -# examples +# examples — grouped by computational task; each group is a subdirectory of src/examples/ example_dir = joinpath(@__DIR__, "src", "examples") -classic_pages = map(readdir(joinpath(example_dir, "classic2d"))) do dir - return joinpath("examples", "classic2d", dir, "index.md") -end -quantum_pages = map(readdir(joinpath(example_dir, "quantum1d"))) do dir - return joinpath("examples", "quantum1d", dir, "index.md") +example_groups = [ + "Ground states" => "groundstates", + "Excitations & dispersions" => "excitations", + "Dynamics & finite temperature" => "dynamics", + "Statistical mechanics" => "statmech", +] +example_pages = map(example_groups) do (title, group) + pages = map(readdir(joinpath(example_dir, group))) do dir + return joinpath("examples", group, dir, "index.md") + end + return title => pages end # bibliography @@ -56,7 +62,10 @@ makedocs(; "man/parallelism.md", "man/lattices.md", ], - "Examples" => "examples/index.md", + "Examples" => [ + "Overview" => "examples/index.md", + example_pages..., + ], "Library" => "lib/lib.md", "References" => "references.md", "Changelog" => "changelog.md", diff --git a/docs/src/examples/classic2d/1.hard-hexagon/figure-1.png b/docs/src/examples/classic2d/1.hard-hexagon/figure-1.png deleted file mode 100644 index 78d2bc35945cb707a41ec6367faeca6e2994d9eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16598 zcmbWfWmr|~7B)Op)TOinBGM=-t)!$N4bm+g(o)hX5&{Y;0@5H#cOxl?h=52-m$Y0w;qQWXJaf`#Ix0OvtPp$BUT)s_uEa-$SHIJR| zpqippcBvnT=sBD*RgUREobIyzBwr+7S~J7D4tAUX^9a7@U3Kv22X*L-|k`+iPD5|XoO9S)Nl$7e(a2nVyaX;W-m6DUIu^q4P$x;sq4%T2& z^YGYzoV&NTT)R9{U3plM@oizVm`)?2$U5(XzHO!rIY+dtc*+Z>vsw0~fgGh}3G=Fc zj~+cr5r1|T2gk!0lcRReS<2piEi12Pet!PTxb6M6n25Nz{iKEarlwT4?B5C+T zdYIeV+A1n`JkHJPTVP~hu(!8wHPzA9=5?I^cz;rZ5<$$gNf_(n;^IOn_~tiv@rCwR z{4ePKg7xfp)F@>To%Nq4*4EMCBzvZtSGyegiBUb5oX2*o-XD9qh>66qApp1JiUpm8 zg@pza$s$qjq}5=SQpSdxKwv{M#YgE4x9Scv4pN-r#~NWp0&fed{Rq_6`y{@qz&qiE z=R{oiM@$nvNvNp2=Q`gl4OhxsK3AdrKv$R{BDitlG{u9i8c%l{n`M)hNKFQLBYo0O z!^81TXBX^B7fp)#Jp@PlgB7R=zTp`PeBFBfX{$GUYScYDGqZDHbD9ITM8Ipm+;u1D z{MGkPix#V~Ct$Tt-0u2mU@wq zHH}}ywq;i$iK*$&tU-VIs_I`J;O5^s0t^fV50rSVD=SW(p^*(tCTy{G~^{9<5l!@GoIJcVos^$ z>8DKt4zf$;r#pR5V%Ik`T$*G(fqbu=Zi{uuk`B@uU#Ry`C^e{F#-2GT{1dwthwNKB zt@mh6$jVTKL)nAj;Ly-iinqcqU%vdBAP_=}g_N_Bgb-K$cq}mbG5FFlP%f1A~ekChdfnP+WE>E zaPM6WyO84yRabJuxocd_6!miwGvsWq_0FbKl+@mkKS#V6cqEuN-c zpVsjU>zUu6!*j98wiO%%d&Um!;%x`T41IsB&y4QtH`C{8pG%u=@ZJqCQ(uWWrL~^A z+IBNiT|1jl1Uld#Qza&`ek{6=jefW9bQVo`Kzg&lYkg}b0!>cID z;mR?UoBFiH`6o`}k@GqI{PgV7LT^rZ%M?FlSi`vFyUy(F?E3n8*iq}zns_I11i55u zO0b`p}f6B83foD+!tW1O-t4{|j%!sExc<>JgfYt*M|iid9X zrXPMH-bvV0tGwm45K7sgmr?m6+B8A4*6X0|(Fr~8gUtbd!vdGFx<_QsQkO&!#MJnv zn(1N=?`x)DQs!XNI~q&_kH~W|6<&vwcbc>or+E@;)GC<~#669*mR=^*WL0~A`lEwq zY*(m5Uj_T1@mlbREz{kZivjWUnq}aQCs; zFYIM6x3*j5pFBff|0&;f{XWa~S0QxwAf94qMn*=WSadRTbGgW#sdODfG=gg0D#V;? zSzU>2)oWNS9HwJX@Qa+8o>p@oXlO`T5?fkYQVWCavwqs4;OP=|(;>>V+qle2v3QdI zIOP2D7|&Yh34&itt-AR*^~OC`-G=lT1C;}6AL zJ6~z&7OB1T53+KWAF!i5fsRD><14ibL&L&5GlRZkFgzD(f&8}?r`8J>3s`b^B@JJG z&!ru(OTa?Eoq(01%DDAFL62ui;C^Y6vJHF?2R;_nGF)UTuc7hU@j<8osT!RJ^S2Vq zzTNF*n^hrf+3M|WhXTs2n?5WCWa$o@w(o^&E1Ek&+Mopp5 zR!xr~OkdwBUf;^@)8-%NykDB{Ks8{;R96$CaE)l|XMdLkcbW==813F+7(R0Qj@g=n zaR%d#aPrI7Hs5pc)^KUIbWk6qpuhXfu>F+v2lLhPTXR167hiH#1)6lop5$Hz-iqL;sC znSO1{by3Pja=pktvit(wF@KJAx31KumI-XLwv(?>v1j!Ta8T zUAi#DBp#{&#rQAJA&B+5zy8&;9q&MpJ=J{)9~tw*={(!N<)VC7HGH<+mD$&hyQ7#`b%nk0pXmh0$AaE#BrjhJHeXQ`TZKIC-(U*JjH;_p*-@`6XX;N)Jh~ zsLrBa_>2?5{q}kR6Iau6JWsBT!+@O?A*`}aI9m40XeW3IWxJd`72C^vjp7si*TB$x zPIN};WgR}a7{$8cel>LP?a4(RE?jgd4OwxM`|oeE#~*de2);17fe}21j$}965)6i9 z#r?u~#DZA;2}w3SI?SD4rUV;LVf+$ ztTT%|PN!gW{U*|s3ezPV!a`gGVrrBcE(>3bxUslLA1M+3O2kgjk z(V13pZsmkjAZloNTNKWuxxSj;|oe`o{?^PtpUK1zNO{buQF z4$feKOT|04MkYrHix-6XLMQK_yFqYQx0K1TBJm-#02ZHlRHv%xKi-P`y3s?fq+I+`z!Vv^~M|v&EGw zS3LK&4#pnix0)Uu?k(r@c6N4>#auw@3SO)96n3kw=>$zkVOKTPJR>Qt0epqiV8#)1 zT{*Qi?pD$J_q#Nf;t~?EvZ-0>c`@yoJ@Wvg_jhIzr;BQ8YH*)oBV&>r7s6VU)UkOt zBbj84D=@HiN`SygLP|V#>_tA`v#H*E-cxElI6XDh^G+t}&6_vgHa;!ZU8#2)M8N#X zemhTk%qObt{`!uGDWk}vx}Yr?MQ_P0hoV<=XL74) z1yVihCf3OIrqgZmA_P{qv{C_4UP)|EyyZYo^R~EHC98);x5@>|8^^x!RTuj3AOq60 zT`H&=X+COPiCEUQF4tLF-%VpV_Mv#P&bzw|!>U`A-eHDw>W;ARqubQ8Llx|a?ea1* zdkcBBB&@pp_gi1zF#7bm&*SJ|8)_&xSaHlPk6-y|X{M5rpEno!X4+!6y^prN!^jnn zA>>baxn&|tdvmtgR=c+~$UWQ!r@OaVcHm_4bgKv8*M5FjBA=mfAs`^2j*ym-mR`~- za$TP;Vb`;>vwQgPp{8bZSXlcLLb^yMO~Vhf;0<5@25YgcyKysAqI`HmR3QeW0~awg z#ye|M#Kgp0HDL-FD#4<18x$*FORE_o&hB9-VpXX+ag-gbYA0rxmrjTW(>5ty#EM_M zzW;GBgoXmCt4D(;-^9iE)aIWi{8H45JS!M91hnj!5)k21ULoU;8B52w`=Flvba>Q; zgktXnDX!_|;k0e?0FvSh<%y81rSp2c1ni7sCo@JXB}7lLc$bx%1PVTOaBwi6@pbzk zib1|n?*=bKO&AWiVG#GuBNwFgMo02GM~3dbncr3paIwcpGtM^Kls46@B4#1tg}@&VQ>Jp0Z4nQb_dfGayafP|8xvN%!}2Yk=vk zkZzcWMc6Hyu_lJM>P_~t2Ip(|J(nkG-RiG=a?NH$Gw8+{e6LOK7muN?G{5h^i>^t5 z_5VOYj;!+|)qBp2f-$$YkBYq(pNhykDQ>+^PhQpY5@TfGCxM($mog`F_T6e~Ap(`3RzK#1>bk8?2SOXDiNcCn!|T z2ywPMgoA8_&w#3KiCWFaZaY;b1Vd6!qN~}^kKLR3}A$(Xn`E&5@8paQt z{7U=MI3X=56sN7o(C5Jg()6Ph1GZV+rk}2|9HW7uC?MbaOtLK#K3pWep78#4}P)|KOrymFPC_ePrWo z+G6w?p(W#&=5XOKm~<~3JA>}qA?bstmeMA6x17JQnpUBse0JKS(=gx1=zIm(@O_1>NyMJQ|7d_Bxjn{%{%&Dost-U86H7b5D9AwY z^%QgmaoI0MM9+O`eHiw6bxB?TW=w`c1FKgx*^-guEl%g9rgNrU_BujO;GuPA=}e;V zw?9rvij}O0PNZ~JCQmwC-Bxtu<&Gtf?p?E{V@-juwtF8)aeD%tud_S5ir;lwxFE)d z$Ab+={~gP-nb_Q(si{k%P@lP}E6|DDmKMx4>FIytA>U0H-G^RBF@fVs=)$0EAsgXi zY6a9qcuC{cR@X^3=NfcVMhKiJZo|l|FtS2YwY_fSxtY$wcmN}d)57qa6P{}jr*x@N z{L*z~Xt3Ep;%Uw8FBUaiO~aD1o;Z>F9KjH`>28`^5V>=itvggTRnwXEJ%$hV&<~6{ zexP=b&Fcq1O2dO@kq6mEccq0rBa7Ib+X7oI#LSeX*51A70%g9Q5tS=?+CdD$i**&^6|L%rEDMWl>&&lTLUJhA)55 zx?FR9ec&p~BQSh~9}NmadUA4KQx_|x86IrSchc;Zs8?52&Ff}NZ#wh zW9skd1`kPW42kiD>6Q;W)0APADK(RWlGV<~qzSN>7NrUXG!!@06cPnD^ zMu$|*gl*Zt%F6GVRZ^=ppIo0qbi|}PP8&_tel4$Cb8$L1f_Jh>Igj>LvoVkpv9}zi zf2~eZ)lAQIr8R|8#J+f;SZNHb86hDduo(MWgEp655h2-A@tR$pUVFhg*{{9a+iMsd z*!k-}T}w1{cnvtAGZZGZx!XP*!KjW$!P}j!SyWtH4CKn`oYcMr)3z8@H8qlp7jGGV zCJ_1D9DX%TKJjqadDPX-EtE=Vq^W7KBmRWcSK=@_u%B9&ebZX{>sHDV&Ztd+Kxz zn%vynFb}1BsTlQK?TeI@g8Fqnm67f)F6k2tnVq2I%tip77Z;G6p{=1{c| zjr(I?a9SRTkBgJVC^AIAxd}Q<%ZiAI04f0>V5K{=Hr0aP-&QweFCZW=SZr?ef*(=P zqffcXt`i--bdj?$XW7=!{b&!%%nEmxd>rVvF!Ea>nEqn(@C_=@-Ho8IFnLKyYCqZ6 zYz9zuaB^~rr`))H-F)I>5ZW+^)W61<`P5y)eJ9TNkPIjsFmAa`hWamGq)9@cV!816 zL!Dv4{=q?8OPTec)5dH^ptjxquT>!G&3ZCbZ{PL_328Yx+!n$XJ>_%C=xIPqD@WsQ z7)lw&?_5M{T2Z9Cdm%?rNJuEaU`fYoW$c6dh5IHZ2YY=LLr~R7zf*erVQgmRGan`L z^9jm375Xx-ZF%was&@K1kt1KSSFNQC3%;K%JC1~XoOS&2w0oXzk3WUJ(ocfynfO2u zGTYF1>NpR!j$#eRl}I$Yqp4tK6kiVE;U=Q-nKasXpQ%?0ThLn~1%x;2|&sA_1TLSuL(gmi~ z(-UWw3yMz0Lj`|ApBo+f_TN}2dv0QrspdJX+#RBGzRkZp(XWdA=MNyHey4&}QFLj4 ziF}uP?jcUppZOTWC{E3Pm&$YrJc(385iklL&@%Z#^F zFE86;uQ{OQsrjNkYq_#`NsK`C9vnj8ATm*IY zkJA`#8+|CkuA3$$E`yBqY)yJJTE^wj8nUXbEqw7_{cljSWo-{ssOi8SDb}%UM4lbF zXYhxD*7}Qrh9eqdf(_uREpKI@M2yZ;zpn&Nup-BO|SHoU4#w$3ZO;bk>1F$ zcO>(1^P49fZ=T$M`OHG9)QG6rk74TP$9(!t>7GDfgsdBXp`rHl>km8wjR>&v3E{Ej zwl<#qona&$`*@0yu z+kh<0h>k8|?TG=BLhu3m(Ua z%bcHK26L?X)Jo#CbcYWQ;lKnFjII7RQMv?ne)|rfw)vK~8HzvqliJz|!(tmyk{l1w zI0X~Z<#6pU?C$Z!GXU>JsZw~30|OEMOO>8+*g>h%V+c0zOZ-o#JEeYetGX}!&%nWv z17kOKD4S`~So3V4_Un_Y%s#opT+rZM@7M^Hcw%<7pwosR;;5XL&yMNOYFgPWc=WVfK{;2HEu{fag;)om4 z%2ty(VIN^S`V90v?yM zP^49z^*MiIh$YH8%yc7$z9?$-@+0_x&)wUEz79ZE{#Ehk_ZOcy=92>tC)tOXUeGrc zYB1FvHQL7(qjq719ZWzT<4Uk^UUbc{_?jWkZ}&lBAh5f>gJ8XhtTJxo_37a3kMX|$|vK}12UC}7wpt^}>J+kYri_-;DT zs5}^8OTo$qhn4?kOM%W*@YCP^AGY)u!UvPsOJ%+ODm8oTU$*oFvIX1Ds|PIvAIukpV?X++6Bshj0_VxEKg6L ztyv%!aN}TOW22=7F7OR}0R4Wy=Y@rZtTn&teeI5sR?8JQPcA-7bi?y*bpCYJOc*gs z0%DShWMOx6!H+;sZ}fCd(Ze~V^&qKmdgx=pU)9j&^&@y8Np$|aQBXP}de21|YL{~a zOsMm@LXJT~>(=%#ZOci$H7B){mDf8YsLo*dnkKlWN`z68)ZVf^_f%JXvxTcC1LwEj zZ=}INkOy7~vHco%3ovZg+(XOW>@#Q1(D-5e>j4ptKpUvM+~r%6FfgMDH%-2H=DBaq z_uL7@BPJnm#SFpEy5>Uyuz21+8kvLl*)YJ5_CtCT@D zsiwjZ(P38n;%@2jYF!%+vb*%>7pZ%V`0&ja>bA~_U>!fUrzli;znS)FNXXuNR$eHj z!0uWL>*>>{B}7HBPM?NuW50(vz{(4(y8B7A8=ITZ`m5ds~grEc6d7<}`3W zLlb5tY`9t`zT@E~D*6$QavMllcyD)gI_w;5J^n6LndD`QzTDyO1xC!VO@-gBoIDTj zQk>dc?D;YCSxNmpR%tj&nTS2}bolAbv4z`@;fifzd%AALTJR{aIKsev!M!nH$U;|l zq$5S*42@g0ZiY(Cg-n&q@T>BG{38iy!<#MCp{2jn`7UIA-}w?*{aeLmCG}<{!)l4@ zarR9C#$sxOCudjAubqFrb*d$5%6ol51mW<3jWKN-`*>G z01dpWa&fbxwMWI~T^JfY&&?h%P||bf>=y?(E3^|LBYR&D9>){;UsPgi%M@TRUo`UU z68A%1oyC41AA~aOYJ@aMICj=I&-zb5FPtGF6T~ON!ot%%PsJwz;Y!QMczSvQ`%AU< zU=si>s5v5;@Ac-lnQH_7yKMiauFi-znYd5foYf za8s@X|BSpr)7Hnqd!s?$Mn{iEpaWaJRh*VK0}ET$dekufaB%>b@?81nIC0N_6J&CX z_`5fNyUHfL5nelR2x?AT+hW}Q;XevA8$uVsOzuVEfR+0Py9VJcF&AwQX*olze zYIiraA>hrn^BVcCKCy zYWAM7=vr4u75u)j{SQ8>TS~%=H_x@?0qW7@zfgN?^*6%=uQ)?Q!%qk-Z*=Z|hWdO! zLoQakg|wRXOoMkXN0-G+E=oXFzWo@+xxprWXLDTVORG+TVmP{9quYccp1+yY0&;vC zlu2bpSr&xpgcv4lD^WOKj|knaNIzOXiElbBQSUz5d&Efn)jWd+wgJ41T0Bqr=di}# z&9mb^DI$dR2Xnc)*@s^K)YRp3m7|5j0su)7Gp1`I<(E>r7`z7Fer-D^diVS`C5jkO z^0eOj52pH4A!Oee?;=FTeku6bp8gNUC>9ta=&5GBr8tWuLF@Gqfyh6tXB1kg0-cZe zY$jpiWva5aN2mI70#Sp_C24e$xG=b2PxL6U(B+B%+!r4`8YU{xOrw8K!7sE` z<4Sm14wp*gud1yA8GSxiHP z2Ojn5zL>ZkqDekfiy&b>7o?jEfCW-kzxbB8hCOO!AE*&{DV2gB-XjB*w3|OF`zkjn z>Af~R0d^ppf$FlAf8;8$7MU@k-d`;Ve{XTTFyR1uK*p_7Jz)Pj#uVRtNI4UGmk$W- z1NeloVbLCX&*FKTvDI;mXHc+Hr<;sfBxq1MS~cqVKos`bZb`mY5>)%x_()5V7 z*!AzKp77SlLBTCANf_%F zH5-{6t|ujaFh|!0O!lBL1(67#EoS~dIuz)>^T2WAc0_3dtb?Ax-<^YFi0#>HBC&O| zj;ggDX!{4Pig7_t2a>T`ir-Qw7Qj z3*kVvfBXPh3ZS)OqIWDYToy-l7=PE-NZmm)=92&Ka>3${6a%%T((D?sYf&vg&@e|x zL-O}rekY!?+Aeg&?|oRMmW7LpOL5Z}vyeF2Ug@}?=H~WZF3o-1|HAR($C*fm)S^{- zf;}&loHYG-erEk~C2F)tSY2+rv_vTR3(3nx_uI&Xy!JiSpEn!dxN&1=XNUX2&}&Z1 zUcWQvThVk0?O>FA@%8o1)v27GnYqVQephMczN*J2Z!GI8rrlG_(A>W;&q)Xpl%mYc z`Mlc0`HsoM(*nD@yN77Ux(hndYO!3_YI(Yg3k$KYUUdU<1ODZ=juAitm(_Ruj9IS6 z^jFPY=YZk&NcEiU%oIS4O+jxn2IDV6lh~d&qgUm1@Lq$-$=Ug;ABZXSe|&y1Jw+!G z%5OVX7yho;Zhk2Hi;0b`XROq8o-j6a^)JX!GOc&Yu}tgPH*&&cs+Mi$gmRQ91uk4?f@)URQ8>z z4|wva-RMu0steCICUlzb4kGBx)2pqkt7~m-O;5kJPGnY7Tveq_`+|SAcF@bq3m7-o z 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 bE*>2#SWZ11cO7wn*CSG5a-z8+`o8}k%=hp4 diff --git a/docs/src/examples/quantum1d/3.ising-dqpt/finite_timeev.png b/docs/src/examples/dynamics/0.ising-dqpt/finite_timeev.png similarity index 100% rename from docs/src/examples/quantum1d/3.ising-dqpt/finite_timeev.png rename to docs/src/examples/dynamics/0.ising-dqpt/finite_timeev.png diff --git a/docs/src/examples/quantum1d/3.ising-dqpt/index.md b/docs/src/examples/dynamics/0.ising-dqpt/index.md similarity index 75% rename from docs/src/examples/quantum1d/3.ising-dqpt/index.md rename to docs/src/examples/dynamics/0.ising-dqpt/index.md index c60dc700d..0532ac2f1 100644 --- a/docs/src/examples/quantum1d/3.ising-dqpt/index.md +++ b/docs/src/examples/dynamics/0.ising-dqpt/index.md @@ -1,10 +1,10 @@ ```@meta -EditURL = "../../../../../examples/quantum1d/3.ising-dqpt/main.jl" +EditURL = "../../../../../examples/dynamics/0.ising-dqpt/main.jl" ``` -[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/quantum1d/3.ising-dqpt/main.ipynb) -[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/quantum1d/3.ising-dqpt/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/quantum1d/3.ising-dqpt) +[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/dynamics/0.ising-dqpt/main.ipynb) +[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/dynamics/0.ising-dqpt/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/dynamics/0.ising-dqpt) # DQPT in the Ising model @@ -15,6 +15,13 @@ In this tutorial we will try to reproduce the results from using MPSKit, MPSKitModels, TensorKit ```` +```` +Precompiling packages... + 14306.2 ms ✓ MPSKitModels + 1 dependency successfully precompiled in 16 seconds. 74 already precompiled. + +```` + Dynamical quantum phase transitions (DQPT in short) are signatures of equilibrium phase transitions in a dynamical quantity - the Loschmidt echo. This quantity is given by ``L(t) = \frac{-2}{N} ln(| < \psi(t) | \psi(0) > |) `` where ``N`` is the system size. One typically starts from a ground state and then quenches the Hamiltonian to a different point. @@ -35,18 +42,7 @@ First we construct the Hamiltonian in MPO form, and obtain the pre-quenched grou L = 20 H₀ = transverse_field_ising(FiniteChain(L); g = -0.5) ψ₀ = FiniteMPS(L, ℂ^2, ℂ^10) -ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG()); -```` - -```` -[ Info: DMRG init: obj = +9.979013604153e+00 err = 1.4988e-01 -[ Info: DMRG 1: obj = -2.040021714911e+01 err = 6.6274818897e-04 time = 4.21 sec -[ Info: DMRG 2: obj = -2.040021715179e+01 err = 4.7025708686e-07 time = 0.30 sec -[ Info: DMRG 3: obj = -2.040021786572e+01 err = 3.1050733385e-05 time = 0.09 sec -[ Info: DMRG 4: obj = -2.040021786702e+01 err = 1.7208246127e-06 time = 0.04 sec -[ Info: DMRG 5: obj = -2.040021786703e+01 err = 3.5080300899e-08 time = 0.04 sec -[ Info: DMRG conv 6: obj = -2.040021786703e+01 err = 3.6868374475e-11 time = 4.71 sec - +ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0)); ```` ## Finite MPS quenching @@ -75,7 +71,7 @@ Putting it all together, we get function finite_sim(L; dt = 0.05, finaltime = 5.0) ψ₀ = FiniteMPS(L, ℂ^2, ℂ^10) H₀ = transverse_field_ising(FiniteChain(L); g = -0.5) - ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG()) + ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0)) H₁ = transverse_field_ising(FiniteChain(L); g = -2.0) ψₜ = deepcopy(ψ₀) @@ -107,19 +103,7 @@ Similarly we could start with an initial infinite state and find the pre-quench ````julia ψ₀ = InfiniteMPS([ℂ^2], [ℂ^10]) H₀ = transverse_field_ising(; g = -0.5) -ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS()); -```` - -```` -[ Info: VUMPS init: obj = +4.970192050239e-01 err = 3.8858e-01 -[ Info: VUMPS 1: obj = -1.049521519045e+00 err = 9.6762771022e-02 time = 1.62 sec -[ Info: VUMPS 2: obj = -1.063544398670e+00 err = 1.0462983506e-04 time = 0.02 sec -[ Info: VUMPS 3: obj = -1.063544409966e+00 err = 3.0128180222e-06 time = 0.01 sec -[ Info: VUMPS 4: obj = -1.063544409973e+00 err = 5.4785900416e-08 time = 0.01 sec -[ Info: VUMPS 5: obj = -1.063544409973e+00 err = 3.5329191510e-09 time = 0.01 sec -[ Info: VUMPS 6: obj = -1.063544409973e+00 err = 3.7796484550e-10 time = 0.01 sec -[ Info: VUMPS conv 7: obj = -1.063544409973e+00 err = 2.9001138645e-11 time = 1.69 sec - +ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS(; verbosity = 0)); ```` The dot product of two infinite matrix product states scales as ``\alpha ^N`` where ``α`` is the dominant eigenvalue of the transfer matrix. @@ -130,7 +114,7 @@ dot(ψ₀, ψ₀) ```` ```` -0.9999999999999996 + 3.8955006105253705e-16im +1.0000000000000047 + 1.040736567930811e-16im ```` so the Loschmidt echo takes on the pleasant form @@ -163,7 +147,7 @@ The final code is ````julia function infinite_sim(dt = 0.05, finaltime = 5.0) ψ₀ = InfiniteMPS([ℂ^2], [ℂ^10]) - ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS()) + ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS(; verbosity = 0)) ψₜ = deepcopy(ψ₀) envs = environments(ψₜ, H₁, ψₜ) diff --git a/docs/src/examples/quantum1d/3.ising-dqpt/infinite_timeev.png b/docs/src/examples/dynamics/0.ising-dqpt/infinite_timeev.png similarity index 100% rename from docs/src/examples/quantum1d/3.ising-dqpt/infinite_timeev.png rename to docs/src/examples/dynamics/0.ising-dqpt/infinite_timeev.png diff --git a/docs/src/examples/quantum1d/3.ising-dqpt/main.ipynb b/docs/src/examples/dynamics/0.ising-dqpt/main.ipynb similarity index 96% rename from docs/src/examples/quantum1d/3.ising-dqpt/main.ipynb rename to docs/src/examples/dynamics/0.ising-dqpt/main.ipynb index e3418901c..682c5b3a1 100644 --- a/docs/src/examples/quantum1d/3.ising-dqpt/main.ipynb +++ b/docs/src/examples/dynamics/0.ising-dqpt/main.ipynb @@ -49,7 +49,7 @@ "L = 20\n", "H₀ = transverse_field_ising(FiniteChain(L); g = -0.5)\n", "ψ₀ = FiniteMPS(L, ℂ^2, ℂ^10)\n", - "ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG());" + "ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0));" ] }, { @@ -108,7 +108,7 @@ "function finite_sim(L; dt = 0.05, finaltime = 5.0)\n", " ψ₀ = FiniteMPS(L, ℂ^2, ℂ^10)\n", " H₀ = transverse_field_ising(FiniteChain(L); g = -0.5)\n", - " ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG())\n", + " ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0))\n", "\n", " H₁ = transverse_field_ising(FiniteChain(L); g = -2.0)\n", " ψₜ = deepcopy(ψ₀)\n", @@ -151,7 +151,7 @@ "source": [ "ψ₀ = InfiniteMPS([ℂ^2], [ℂ^10])\n", "H₀ = transverse_field_ising(; g = -0.5)\n", - "ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS());" + "ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS(; verbosity = 0));" ] }, { @@ -241,7 +241,7 @@ "source": [ "function infinite_sim(dt = 0.05, finaltime = 5.0)\n", " ψ₀ = InfiniteMPS([ℂ^2], [ℂ^10])\n", - " ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS())\n", + " ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS(; verbosity = 0))\n", "\n", " ψₜ = deepcopy(ψ₀)\n", " envs = environments(ψₜ, H₁, ψₜ)\n", diff --git a/docs/src/examples/dynamics/1.xy-finiteT/figure-1.png b/docs/src/examples/dynamics/1.xy-finiteT/figure-1.png new file mode 100644 index 0000000000000000000000000000000000000000..be692709ada39eafc159edc9a94082a7d0765ad3 GIT binary patch literal 38310 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 HT*Utaz^K(2 literal 0 HcmV?d00001 diff --git a/docs/src/examples/dynamics/1.xy-finiteT/figure-2.png b/docs/src/examples/dynamics/1.xy-finiteT/figure-2.png new file mode 100644 index 0000000000000000000000000000000000000000..508b940157d3eae1bcd3065d652e35d65a6638f1 GIT binary patch literal 40337 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 TZ$IgM00000NkvXXu0mjfAjg11 literal 0 HcmV?d00001 diff --git a/docs/src/examples/dynamics/1.xy-finiteT/figure-3.png b/docs/src/examples/dynamics/1.xy-finiteT/figure-3.png new file mode 100644 index 0000000000000000000000000000000000000000..9df5786028213b634b6aac1e6fc200bb2122f929 GIT binary patch literal 40669 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 literal 0 HcmV?d00001 diff --git a/docs/src/examples/dynamics/1.xy-finiteT/figure-4.png b/docs/src/examples/dynamics/1.xy-finiteT/figure-4.png new file mode 100644 index 0000000000000000000000000000000000000000..701d842e029accaacc839a8b0faee833d577b002 GIT binary patch literal 37133 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Í$YCWg}!&NI5sE88ru)1 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 bsA(eX+TArd{Iw$%pAmNLaImSc_KN!(=8yEZ literal 0 HcmV?d00001 diff --git a/docs/src/examples/dynamics/1.xy-finiteT/figure-6.png b/docs/src/examples/dynamics/1.xy-finiteT/figure-6.png new file mode 100644 index 0000000000000000000000000000000000000000..16501b948c802166a3e6e6fcad5dfdc5601f8303 GIT binary patch literal 42270 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 literal 0 HcmV?d00001 diff --git a/docs/src/examples/quantum1d/7.xy-finiteT/index.md b/docs/src/examples/dynamics/1.xy-finiteT/index.md similarity index 93% rename from docs/src/examples/quantum1d/7.xy-finiteT/index.md rename to docs/src/examples/dynamics/1.xy-finiteT/index.md index a897a94b2..9ea29fd28 100644 --- a/docs/src/examples/quantum1d/7.xy-finiteT/index.md +++ b/docs/src/examples/dynamics/1.xy-finiteT/index.md @@ -1,10 +1,10 @@ ```@meta -EditURL = "../../../../../examples/quantum1d/7.xy-finiteT/main.jl" +EditURL = "../../../../../examples/dynamics/1.xy-finiteT/main.jl" ``` -[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/quantum1d/7.xy-finiteT/main.ipynb) -[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/quantum1d/7.xy-finiteT/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/quantum1d/7.xy-finiteT) +[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/dynamics/1.xy-finiteT/main.ipynb) +[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/dynamics/1.xy-finiteT/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/dynamics/1.xy-finiteT) ````julia using Markdown @@ -19,6 +19,27 @@ using LinearAlgebra using BenchmarkFreeFermions ```` +```` +Precompiling packages... + 2928.0 ms ✓ SpecialFunctions + 1 dependency successfully precompiled in 3 seconds. 12 already precompiled. +Precompiling packages... + 1182.9 ms ✓ JLFzf + 1251.9 ms ✓ Xorg_libXi_jll + 1647.3 ms ✓ GLFW_jll + 4694.5 ms ✓ Latexify + 2510.2 ms ✓ GR_jll + 1296.9 ms ✓ Latexify → SparseArraysExt + 14731.3 ms ✓ HTTP + 5752.3 ms ✓ GR + 46383.1 ms ✓ Plots + 9 dependencies successfully precompiled in 71 seconds. 171 already precompiled. +Precompiling packages... + 2884.9 ms ✓ ColorVectorSpace → SpecialFunctionsExt + 1 dependency successfully precompiled in 3 seconds. 20 already precompiled. + +```` + # Finite temperature XY model This example shows how to simulate the finite temperature behavior of the XY model in 1D. @@ -66,8 +87,7 @@ The Hamiltonian can be diagonalized in terms of fermionic creation and annihilat E_0 = -\frac{1}{\pi} \text{EllipticE}\left( \sqrt{1 - \gamma^2} \right) ``` -!!! todo - Show the derivation of the ground state energy by diagonalizing the Hamiltonian in terms of fermionic operators. +The derivation, via a Jordan-Wigner transformation to free fermions followed by a Bogoliubov rotation, can be found in [Lieb, Schultz & Mattis, Ann. Phys. 16, 407 (1961)](https://doi.org/10.1016/0003-4916(61)90115-4). ````julia function groundstate_energy(J, N) @@ -116,7 +136,7 @@ D = 64 V_init = symmetry === Trivial ? ℂ^32 : U1Space(i => 10 for i in -1:(1 // 2):1) psi_init = FiniteMPS(N, physicalspace(H, 1), V_init) trunc = truncrank(D) -psi, envs, = find_groundstate(psi_init, H, DMRG2(; trunc, maxiter = 5)); +psi, envs, = find_groundstate(psi_init, H, DMRG2(; trunc, maxiter = 5, verbosity = 0)); E_0 = expectation_value(psi, H, envs) / N println("Numerical:\t", real(E_0)) @@ -125,11 +145,7 @@ println("Exact (N=Inf):\t", groundstate_energy(J, Inf)) ```` ```` -[ Info: DMRG2 1: obj = -5.004084801485e+00 err = 9.7485774328e-01 time = 1.43 min -[ Info: DMRG2 2: obj = -5.004096940647e+00 err = 1.1899230994e-06 time = 1.27 sec -[ Info: DMRG2 3: obj = -5.004096975044e+00 err = 2.2262868216e-09 time = 0.80 sec -[ Info: DMRG2 conv 4: obj = -5.004096975044e+00 err = 1.1612932838e-13 time = 1.47 min -Numerical: -0.15637803047010942 +Numerical: -0.1563780304701162 Exact (N=32): -0.15637803047254015 Exact (N=Inf): -0.15915494309189535 @@ -173,8 +189,7 @@ The resulting expression is Z(\beta) = \prod_{k=1}^{N} \left( 1 + e^{-\beta \epsilon_k} \right)^{1/N} ``` -!!! todo - Show the derivation of the partition function for the XY model. +This expression follows from the same free-fermion diagonalization as the ground-state energy above: each single-particle mode $\epsilon_k$ is independently occupied or empty, giving the usual free-fermion partition function (see again [Lieb, Schultz & Mattis (1961)](https://doi.org/10.1016/0003-4916(61)90115-4)). ````julia function partition_function(β::Number, J::Number, N::Number) @@ -308,9 +323,6 @@ Z(\beta) = In other words, we can compute the partition function at $\beta$ by computing the overlap of two states evolved for $\beta / 2$, as long as the Hamiltonian is Hermitian. Otherwise, we could still use the same trick, but we would have to compute the evolved states twice, once for $H$ and once for $H^\dagger$. -!!! todo - Add a figure to illustrate this trick. - ````julia double_logpartition(ρ₁, ρ₂ = ρ₁) = log(real(dot(ρ₁, ρ₂))) / length(ρ₁) diff --git a/docs/src/examples/quantum1d/7.xy-finiteT/main.ipynb b/docs/src/examples/dynamics/1.xy-finiteT/main.ipynb similarity index 94% rename from docs/src/examples/quantum1d/7.xy-finiteT/main.ipynb rename to docs/src/examples/dynamics/1.xy-finiteT/main.ipynb index 26798bd0e..1af3f9bf8 100644 --- a/docs/src/examples/quantum1d/7.xy-finiteT/main.ipynb +++ b/docs/src/examples/dynamics/1.xy-finiteT/main.ipynb @@ -1,8 +1,10 @@ { "cells": [ { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "using Markdown\n", "using TensorKit\n", @@ -14,12 +16,11 @@ "using Plots\n", "using LinearAlgebra\n", "using BenchmarkFreeFermions" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "# Finite temperature XY model\n", "\n", @@ -33,19 +34,20 @@ "$$\n", "\n", "Here we will consider the anti-ferromagnetic ($J > 0$) chain, and restrict ourselves to $J = 1/2$." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Parameters" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "J = 1 / 2\n", "T = ComplexF64\n", @@ -63,12 +65,11 @@ " end\n", " end\n", "end" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Diagonalization of the Hamiltonian\n", "\n", @@ -79,15 +80,14 @@ " E_0 = -\\frac{1}{\\pi} \\text{EllipticE}\\left( \\sqrt{1 - \\gamma^2} \\right)\n", "$$\n", "\n", - "> **Todo**\n", - ">\n", - "> Show the derivation of the ground state energy by diagonalizing the Hamiltonian in terms of fermionic operators." - ], - "metadata": {} + "The derivation, via a Jordan-Wigner transformation to free fermions followed by a Bogoliubov rotation, can be found in [Lieb, Schultz & Mattis, Ann. Phys. 16, 407 (1961)](https://doi.org/10.1016/0003-4916(61)90115-4)." + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "function groundstate_energy(J, N)\n", " isfinite(N) || return -J / π\n", @@ -95,22 +95,22 @@ " ϵ = SingleParticleSpectrum(T)\n", " return Energy(ϵ, Inf, 0) / N\n", "end" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Exact diagonalization\n", "\n", "We can check our results by comparing them to the exact diagonalization of the Hamiltonian." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "N_exact = 6\n", "H = open_boundary_conditions(XY_hamiltonian(T, symmetry; J, N = Inf), N_exact)\n", @@ -121,22 +121,22 @@ "println(\"Numerical:\\t\", minimum(real(vals)))\n", "println(\"Exact (N=$(N_exact)):\\t\", groundstate_energy(J, N_exact))\n", "println(\"Exact (N=Inf):\\t\", groundstate_energy(J, Inf))" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Finite MPS\n", "\n", "If we wish to increase the system size, we can use the finite MPS representation." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "N = 32\n", "H = XY_hamiltonian(T, symmetry; J, N)\n", @@ -144,18 +144,17 @@ "V_init = symmetry === Trivial ? ℂ^32 : U1Space(i => 10 for i in -1:(1 // 2):1)\n", "psi_init = FiniteMPS(N, physicalspace(H, 1), V_init)\n", "trunc = truncrank(D)\n", - "psi, envs, = find_groundstate(psi_init, H, DMRG2(; trunc, maxiter = 5));\n", + "psi, envs, = find_groundstate(psi_init, H, DMRG2(; trunc, maxiter = 5, verbosity = 0));\n", "E_0 = expectation_value(psi, H, envs) / N\n", "\n", "println(\"Numerical:\\t\", real(E_0))\n", "println(\"Exact (N=$N):\\t\", groundstate_energy(J, N))\n", "println(\"Exact (N=Inf):\\t\", groundstate_energy(J, Inf))" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Finite temperature properties\n", "\n", @@ -195,15 +194,14 @@ " Z(\\beta) = \\prod_{k=1}^{N} \\left( 1 + e^{-\\beta \\epsilon_k} \\right)^{1/N}\n", "$$\n", "\n", - "> **Todo**\n", - ">\n", - "> Show the derivation of the partition function for the XY model." - ], - "metadata": {} + "This expression follows from the same free-fermion diagonalization as the ground-state energy above: each single-particle mode $\\epsilon_k$ is independently occupied or empty, giving the usual free-fermion partition function (see again [Lieb, Schultz & Mattis (1961)](https://doi.org/10.1016/0003-4916(61)90115-4))." + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "function partition_function(β::Number, J::Number, N::Number)\n", " T = diagm(1 => J / 2 * ones(N - 1), -1 => J / 2 * ones(N - 1))\n", @@ -220,12 +218,11 @@ "\n", "Z_analytic = partition_function.(βs, J, N);\n", "F_analytic = free_energy.(βs, J, N);" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### MPO approach\n", "\n", @@ -235,12 +232,13 @@ "In order to build the time-evolution operator, we can repurpose the `make_time_mpo` function, which constructs the time-evolution operator for the ground state.\n", "However, since we are interested in $e^{-\\beta H}$, instead of $e^{-iH dt}$, we work with $dt = -i \\beta$.\n", "In particular, we can approximate the exponential using a Taylor series through the `TaylorCluster` algorithm." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "expansion_orders = 1:3\n", "\n", @@ -274,22 +272,21 @@ " plot!(p2, βs, F_taylor; label = labels)\n", " plot(p1, p2)\n", "end" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Some observations:\n", "- The first order approximation fails to capture the behavior of the partition function.\n", "- The higher order approximations are in good agreement with the analytical result, as long as $\\beta$ is not too large.\n", "- The computational cost of the approximations does not depend on $\\beta$, but on the order of the approximation." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "To address the first point, we can have a look at the particular form of the time-evolution operator.\n", "Here we see that for this particular Hamiltonian, all the terms with factors $d\\tau$ are either zero or have trace zero.\n", @@ -312,12 +309,13 @@ "\n", "Therefore, we will exclude the first order approximation from now on.\n", "Zooming in on the differences with the analytical result, we find:" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "expansion_orders = 2:3\n", "Z_taylor = Z_taylor[:, 2:end]\n", @@ -340,12 +338,11 @@ " )\n", " plot(p1, p2)\n", "end" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "We can now clearly see that, somewhat unsurprisingly, the error increases the larger $\\beta$ becomes.\n", "Given that we are computing Taylor expansions around $\\beta = 0$, this is to be expected.\n", @@ -360,17 +357,14 @@ "$$\n", "\n", "In other words, we can compute the partition function at $\\beta$ by computing the overlap of two states evolved for $\\beta / 2$, as long as the Hamiltonian is Hermitian.\n", - "Otherwise, we could still use the same trick, but we would have to compute the evolved states twice, once for $H$ and once for $H^\\dagger$.\n", - "\n", - "> **Todo**\n", - ">\n", - "> Add a figure to illustrate this trick." - ], - "metadata": {} + "Otherwise, we could still use the same trick, but we would have to compute the evolved states twice, once for $H$ and once for $H^\\dagger$." + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "double_logpartition(ρ₁, ρ₂ = ρ₁) = log(real(dot(ρ₁, ρ₂))) / length(ρ₁)\n", "\n", @@ -403,12 +397,11 @@ " )\n", " plot(p1, p2)\n", "end" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### MPO multiplication approach (linear)\n", "\n", @@ -436,12 +429,13 @@ "> In particular, the truncation of the MPO is now happening in the Frobenius norm, rather than the operator norm.\n", "> While for small truncations this might still work, this is not guaranteed to be the case for larger truncations.\n", "> As a result, the truncated object might not be positive semidefinite, spoiling its interpretation as a density matrix." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "Z_mpo_mul = zeros(length(βs))\n", "D_max = 64\n", @@ -489,12 +483,11 @@ " )\n", " plot(p1, p2)\n", "end" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "This approach clearly improves the accuracy of the results, indicating that we can indeed compute partition functions at larger $\\beta$ values.\n", "However, the computational cost of this approach (at fixed maximal bond dimension) is now linear in $\\beta$, since we need to compute the partition function at each $\\beta$ value.\n", @@ -509,11 +502,11 @@ "The accuracy of the initial density matrix can be improved by increasing the order of the Taylor expansion, but this will result in a larger MPO bond dimension.\n", "On the other hand, if we improve the accuracy of the initial density matrix, we could also increase the step size, which would reduce the number of iterations required to reach a certain $\\beta$ value.\n", "Keeping these parameters in balance is necessary to obtain accurate results, and this might require some trial and error." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### MPO multiplication approach (exponential)\n", "\n", @@ -529,12 +522,13 @@ "$$\n", "\n", "In other words, we can scan a range of exponentially increasing $\\beta$ values by squaring the density matrix at each step." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "βs_exp = 2.0 .^ (-3:3)\n", "Z_analytic_exp = partition_function.(βs_exp, J, N)\n", @@ -582,12 +576,11 @@ " plot!(p2, βs_exp, abs.(F_mpo_mul_exp .- F_analytic_exp); label = \"MPO multiplication exp\")\n", " plot(p1, p2)\n", "end" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Clearly, the exponential approach allows us to reach larger $\\beta$ values much quicker, but there is again a trade-off.\n", "Since the size of the steps are increasing, we need to be more careful with the accuracy of our approximations.\n", @@ -596,11 +589,11 @@ ">\n", "> Again, using MPS techniques to approximate the multiplication of density matrices might lead to unphysical truncated density matrices.\n", "> Increasing the stepsize could make this happen sooner, so we need to be careful with the maximal bond dimension." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "### Time evolution approach\n", "\n", @@ -615,12 +608,13 @@ "\n", "The starting point for this approach could be either achieved through one of the techniques we have already discussed, but we can also start from the infinite temperature state directly.\n", "In particular, this state is given by the identity MPO, and we can evolve this state to compute the partition function at any $\\beta$ value." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "Z_tdvp = zeros(length(βs))\n", "\n", @@ -666,43 +660,41 @@ "\n", " plot(p1, p2)\n", "end" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "> **Note**\n", ">\n", "> We could further improve the accuracy of the TDVP approach by evolving with $(H \\otimes \\mathbb{1} + \\mathbb{1} \\otimes H^\\dagger)$, rather than $H \\otimes \\mathbb{1}$ which is the current implementation.\n", "> This is known to improve the stability of the positive semidefinite property of the density matrix, and could lead to more accurate results." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "---\n", "\n", "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" - ], - "metadata": {} + ] } ], - "nbformat_minor": 3, "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.4" - }, - "kernelspec": { - "name": "julia-1.12", - "display_name": "Julia 1.12.4", - "language": "julia" + "version": "1.12.6" } }, - "nbformat": 4 + "nbformat": 4, + "nbformat_minor": 3 } \ No newline at end of file diff --git a/docs/src/examples/quantum1d/2.haldane/figure-1.png b/docs/src/examples/excitations/0.haldane/figure-1.png similarity index 100% rename from docs/src/examples/quantum1d/2.haldane/figure-1.png rename to docs/src/examples/excitations/0.haldane/figure-1.png diff --git a/docs/src/examples/quantum1d/2.haldane/figure-2.png b/docs/src/examples/excitations/0.haldane/figure-2.png similarity index 100% rename from docs/src/examples/quantum1d/2.haldane/figure-2.png rename to docs/src/examples/excitations/0.haldane/figure-2.png diff --git a/docs/src/examples/quantum1d/2.haldane/figure-3.png b/docs/src/examples/excitations/0.haldane/figure-3.png similarity index 100% rename from docs/src/examples/quantum1d/2.haldane/figure-3.png rename to docs/src/examples/excitations/0.haldane/figure-3.png diff --git a/docs/src/examples/quantum1d/2.haldane/index.md b/docs/src/examples/excitations/0.haldane/index.md similarity index 78% rename from docs/src/examples/quantum1d/2.haldane/index.md rename to docs/src/examples/excitations/0.haldane/index.md index 71bcad85e..c7518c237 100644 --- a/docs/src/examples/quantum1d/2.haldane/index.md +++ b/docs/src/examples/excitations/0.haldane/index.md @@ -1,10 +1,10 @@ ```@meta -EditURL = "../../../../../examples/quantum1d/2.haldane/main.jl" +EditURL = "../../../../../examples/excitations/0.haldane/main.jl" ``` -[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/quantum1d/2.haldane/main.ipynb) -[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/quantum1d/2.haldane/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/quantum1d/2.haldane) +[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/excitations/0.haldane/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/0.haldane/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/0.haldane) # The Haldane gap @@ -15,6 +15,13 @@ To follow the tutorial you need the following packages: using MPSKit, MPSKitModels, TensorKit, Plots, Polynomials ```` +```` +Precompiling packages... + 1343.7 ms ✓ Polynomials → PolynomialsRecipesBaseExt + 1 dependency successfully precompiled in 2 seconds. 18 already precompiled. + +```` + The Heisenberg model is defined by the following Hamiltonian: ```math @@ -61,7 +68,7 @@ En_2, st_2 = excitations(H, QuasiparticleAnsatz(), ψ, envs; sector = SU2Irrep(2 ```` ```` -0.7989253589480472 +0.7989253589480387 ```` We can go even further and doublecheck the claim that ``S = 1`` is an edge excitation, by plotting the energy density. @@ -100,7 +107,7 @@ f = fit(Ls .^ (-2), ΔEs, 1) ```` ```` -0.4517340158583749 +0.4517340158585316 ```` ````julia @@ -129,30 +136,14 @@ virtual_space_inf = Rep[SU₂](1 // 2 => 16, 3 // 2 => 16, 5 // 2 => 8, 7 // 2 = ψ_inf, envs_inf, delta_inf = find_groundstate(ψ₀_inf, H; verbosity = 0) kspace = range(0, π, 16) -Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ_inf, envs_inf; sector = SU2Irrep(1)) +Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ_inf, envs_inf; sector = SU2Irrep(1), verbosity = 0) ΔE, idx = findmin(real.(Es)) println("minimum @k = $(kspace[idx]):\t ΔE = $(ΔE)") ```` ```` -[ Info: Found excitations for momentum = 0.0 -[ Info: Found excitations for momentum = 0.20943951023931953 -[ Info: Found excitations for momentum = 0.41887902047863906 -[ Info: Found excitations for momentum = 0.6283185307179586 -[ Info: Found excitations for momentum = 1.4660765716752369 -[ Info: Found excitations for momentum = 1.2566370614359172 -[ Info: Found excitations for momentum = 0.8377580409572781 -[ Info: Found excitations for momentum = 1.0471975511965976 -[ Info: Found excitations for momentum = 1.6755160819145563 -[ Info: Found excitations for momentum = 1.8849555921538759 -[ Info: Found excitations for momentum = 2.0943951023931953 -[ Info: Found excitations for momentum = 2.303834612632515 -[ Info: Found excitations for momentum = 2.5132741228718345 -[ Info: Found excitations for momentum = 2.9321531433504737 -[ Info: Found excitations for momentum = 2.722713633111154 -[ Info: Found excitations for momentum = 3.141592653589793 -minimum @k = 3.141592653589793: ΔE = 0.41047924848831047 +minimum @k = 3.141592653589793: ΔE = 0.41047924870059116 ```` diff --git a/docs/src/examples/quantum1d/2.haldane/main.ipynb b/docs/src/examples/excitations/0.haldane/main.ipynb similarity index 99% rename from docs/src/examples/quantum1d/2.haldane/main.ipynb rename to docs/src/examples/excitations/0.haldane/main.ipynb index 2084d50d9..a2c095d53 100644 --- a/docs/src/examples/quantum1d/2.haldane/main.ipynb +++ b/docs/src/examples/excitations/0.haldane/main.ipynb @@ -164,7 +164,7 @@ "ψ_inf, envs_inf, delta_inf = find_groundstate(ψ₀_inf, H; verbosity = 0)\n", "\n", "kspace = range(0, π, 16)\n", - "Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ_inf, envs_inf; sector = SU2Irrep(1))\n", + "Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ_inf, envs_inf; sector = SU2Irrep(1), verbosity = 0)\n", "\n", "ΔE, idx = findmin(real.(Es))\n", "println(\"minimum @k = $(kspace[idx]):\\t ΔE = $(ΔE)\")\n", diff --git a/docs/src/examples/groundstates/1.xxz-heisenberg/figure-1.png b/docs/src/examples/groundstates/1.xxz-heisenberg/figure-1.png new file mode 100644 index 0000000000000000000000000000000000000000..5cb23a3c0ea4d3a4b0e992006d0aaf8c39a2866f GIT binary patch literal 12994 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%0ANqjw8!nKh8z_X+% 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 U#)jALuttf^b~|hzP~A`e0}0flVgLXD literal 0 HcmV?d00001 diff --git a/docs/src/examples/groundstates/1.xxz-heisenberg/index.md b/docs/src/examples/groundstates/1.xxz-heisenberg/index.md new file mode 100644 index 000000000..d8a547f1a --- /dev/null +++ b/docs/src/examples/groundstates/1.xxz-heisenberg/index.md @@ -0,0 +1,208 @@ +```@meta +EditURL = "../../../../../examples/groundstates/1.xxz-heisenberg/main.jl" +``` + +[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/groundstates/1.xxz-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/groundstates/1.xxz-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/groundstates/1.xxz-heisenberg) + +# The XXZ model + +In this file we will give step by step instructions on how to analyze the spin 1/2 XXZ model. +The necessary packages to follow this tutorial are: + +````julia +using MPSKit, MPSKitModels, TensorKit, Plots +```` + +For reproducibility of this page, we fix the seed of the random number generator: + +````julia +using Random +Random.seed!(123); +```` + +## Failure + +First we should define the Hamiltonian we want to work with. +Then we specify an initial guess, which we then further optimize. +Working directly in the thermodynamic limit, this is achieved as follows: + +````julia +H = heisenberg_XXX(; spin = 1 // 2) +```` + +```` +1-site InfiniteMPOHamiltonian(ComplexF64, TensorKit.ComplexSpace) with maximal dimension 5: +| ⋮ +| (ℂ^1 ⊞ ℂ^3 ⊞ ℂ^1) +┼─[1]─ ℂ^2 +│ (ℂ^1 ⊞ ℂ^3 ⊞ ℂ^1) +| ⋮ + +```` + +We then need an initial state, which we shall later optimize. In this example we work directly in the thermodynamic limit. + +````julia +state = InfiniteMPS(2, 20) +```` + +```` +1-site InfiniteMPS(ComplexF64, TensorKit.ComplexSpace) with maximal dimension 20: +| ⋮ +| ℂ^20 +├─[1]─ ℂ^2 +│ ℂ^20 +| ⋮ + +```` + +The ground state can then be found by calling `find_groundstate`. + +````julia +groundstate, cache, delta = find_groundstate(state, H, VUMPS(; verbosity = 1)); +```` + +```` +┌ Warning: VUMPS cancel 200: obj = -1.878034423426e-01 err = 3.7915687051e-01 time = 6.59 sec +└ @ MPSKit src/algorithms/groundstate/vumps.jl:87 + +```` + +As you can see, VUMPS struggles to converge. +On its own, that is already quite curious. +Maybe we can do better using another algorithm, such as gradient descent. + +````julia +groundstate, cache, delta = find_groundstate(state, H, GradientGrassmann(; maxiter = 20, verbosity = 1)); +```` + +```` +┌ Warning: resorting to η +└ @ OptimKit src/cg.jl:225 +┌ Warning: CG: not converged to requested tol after 20 iterations and time 5.39 s: f = -4.427115230754e-01, ‖∇f‖ = 5.6573e-03 +└ @ OptimKit src/cg.jl:188 + +```` + +Convergence is quite slow and even fails after sufficiently many iterations. +To understand why, we can look at the transfer matrix spectrum. + +````julia +transferplot(groundstate, groundstate) +```` + +![](figure-1.png) + +We can clearly see multiple eigenvalues close to the unit circle. +Our state is close to being non-injective, and represents the sum of multiple injective states. +This is numerically very problematic, but also indicates that we used an incorrect ansatz to approximate the groundstate. +We should retry with a larger unit cell. + +## Success + +Let's initialize a different initial state, this time with a 2-site unit cell: + +````julia +state = InfiniteMPS(fill(2, 2), fill(20, 2)) +```` + +```` +2-site InfiniteMPS(ComplexF64, TensorKit.ComplexSpace) with maximal dimension 20: +| ⋮ +| ℂ^20 +├─[2]─ ℂ^2 +│ ℂ^20 +├─[1]─ ℂ^2 +│ ℂ^20 +| ⋮ + +```` + +In MPSKit, we require that the periodicity of the Hamiltonian equals that of the state it is applied to. +This is not a big obstacle, you can simply repeat the original Hamiltonian. +Alternatively, the Hamiltonian can be constructed directly on a two-site unit cell by making use of MPSKitModels.jl's `@mpoham`. + +````julia +# H2 = repeat(H, 2); -- copies the one-site version +H2 = heisenberg_XXX(ComplexF64, Trivial, InfiniteChain(2); spin = 1 // 2) +groundstate, envs, delta = find_groundstate( + state, H2, VUMPS(; maxiter = 100, tol = 1.0e-12, verbosity = 1) +); +```` + +```` +┌ Warning: VUMPS cancel 100: obj = -8.862417624752e-01 err = 4.2010390727e-06 time = 3.79 sec +└ @ MPSKit src/algorithms/groundstate/vumps.jl:87 + +```` + +We get convergence, but it takes an enormous amount of iterations. +The reason behind this becomes more obvious at higher bond dimensions: + +````julia +groundstate, envs, delta = find_groundstate( + state, H2, IDMRG2(; trunc = truncrank(50), maxiter = 20, tol = 1.0e-12, verbosity = 1) +); +entanglementplot(groundstate) +```` + +![](figure-2.png) + +We see that some eigenvalues clearly belong to a group, and are almost degenerate. +This implies 2 things: +- there is superfluous information, if those eigenvalues are the same anyway +- poor convergence if we cut off within such a subspace + +It are precisely those problems that we can solve by using symmetries. + +## Symmetries + +The XXZ Heisenberg Hamiltonian is SU(2) symmetric and we can exploit this to greatly speed up the simulation. + +It is cumbersome to construct symmetric Hamiltonians, but luckily SU(2) symmetric XXZ is already implemented: + +````julia +H2 = heisenberg_XXX(ComplexF64, SU2Irrep, InfiniteChain(2); spin = 1 // 2); +```` + +Our initial state should also be SU(2) symmetric. +It now becomes apparent why we have to use a two-site periodic state. +The physical space carries a half-integer charge and the first tensor maps the first `virtual_space ⊗ the physical_space` to the second `virtual_space`. +Half-integer virtual charges will therefore map only to integer charges, and vice versa. +The staggering thus happens on the virtual level. + +An alternative constructor for the initial state is + +````julia +P = Rep[SU₂](1 // 2 => 1) +V1 = Rep[SU₂](1 // 2 => 10, 3 // 2 => 5, 5 // 2 => 2) +V2 = Rep[SU₂](0 => 15, 1 => 10, 2 => 5) +state = InfiniteMPS([P, P], [V1, V2]); +```` + +```` +┌ Warning: Constructing an MPS from tensors that are not full rank +└ @ MPSKit src/states/infinitemps.jl:188 + +```` + +Even though the bond dimension is higher than in the example without symmetry, convergence is reached much faster: + +````julia +println(dim(V1)) +println(dim(V2)) +groundstate, cache, delta = find_groundstate(state, H2, VUMPS(; maxiter = 400, tol = 1.0e-12, verbosity = 1)); +```` + +```` +52 +70 + +```` + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/docs/src/examples/quantum1d/4.xxz-heisenberg/main.ipynb b/docs/src/examples/groundstates/1.xxz-heisenberg/main.ipynb similarity index 81% rename from docs/src/examples/quantum1d/4.xxz-heisenberg/main.ipynb rename to docs/src/examples/groundstates/1.xxz-heisenberg/main.ipynb index ce74387d6..8f1685258 100644 --- a/docs/src/examples/quantum1d/4.xxz-heisenberg/main.ipynb +++ b/docs/src/examples/groundstates/1.xxz-heisenberg/main.ipynb @@ -2,182 +2,200 @@ "cells": [ { "cell_type": "markdown", + "metadata": {}, "source": [ "# The XXZ model\n", "\n", "In this file we will give step by step instructions on how to analyze the spin 1/2 XXZ model.\n", "The necessary packages to follow this tutorial are:" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "using MPSKit, MPSKitModels, TensorKit, Plots" - ], + ] + }, + { + "cell_type": "markdown", "metadata": {}, - "execution_count": null + "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!(123);" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Failure\n", "\n", "First we should define the Hamiltonian we want to work with.\n", "Then we specify an initial guess, which we then further optimize.\n", "Working directly in the thermodynamic limit, this is achieved as follows:" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "H = heisenberg_XXX(; spin = 1 // 2)" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "We then need an initial state, which we shall later optimize. In this example we work directly in the thermodynamic limit." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "state = InfiniteMPS(2, 20)" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "The ground state can then be found by calling `find_groundstate`." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", - "source": [ - "groundstate, cache, delta = find_groundstate(state, H, VUMPS());" - ], + "execution_count": null, "metadata": {}, - "execution_count": null + "outputs": [], + "source": [ + "groundstate, cache, delta = find_groundstate(state, H, VUMPS(; verbosity = 1));" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "As you can see, VUMPS struggles to converge.\n", "On its own, that is already quite curious.\n", "Maybe we can do better using another algorithm, such as gradient descent." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", - "source": [ - "groundstate, cache, delta = find_groundstate(state, H, GradientGrassmann(; maxiter = 20));" - ], + "execution_count": null, "metadata": {}, - "execution_count": null + "outputs": [], + "source": [ + "groundstate, cache, delta = find_groundstate(state, H, GradientGrassmann(; maxiter = 20, verbosity = 1));" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Convergence is quite slow and even fails after sufficiently many iterations.\n", "To understand why, we can look at the transfer matrix spectrum." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "transferplot(groundstate, groundstate)" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "We can clearly see multiple eigenvalues close to the unit circle.\n", "Our state is close to being non-injective, and represents the sum of multiple injective states.\n", "This is numerically very problematic, but also indicates that we used an incorrect ansatz to approximate the groundstate.\n", "We should retry with a larger unit cell." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Success\n", "\n", "Let's initialize a different initial state, this time with a 2-site unit cell:" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "state = InfiniteMPS(fill(2, 2), fill(20, 2))" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "In MPSKit, we require that the periodicity of the Hamiltonian equals that of the state it is applied to.\n", "This is not a big obstacle, you can simply repeat the original Hamiltonian.\n", "Alternatively, the Hamiltonian can be constructed directly on a two-site unit cell by making use of MPSKitModels.jl's `@mpoham`." - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "# H2 = repeat(H, 2); -- copies the one-site version\n", "H2 = heisenberg_XXX(ComplexF64, Trivial, InfiniteChain(2); spin = 1 // 2)\n", "groundstate, envs, delta = find_groundstate(\n", - " state, H2, VUMPS(; maxiter = 100, tol = 1.0e-12)\n", + " state, H2, VUMPS(; maxiter = 100, tol = 1.0e-12, verbosity = 1)\n", ");" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "We get convergence, but it takes an enormous amount of iterations.\n", "The reason behind this becomes more obvious at higher bond dimensions:" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "groundstate, envs, delta = find_groundstate(\n", - " state, H2, IDMRG2(; trunc = truncrank(50), maxiter = 20, tol = 1.0e-12)\n", + " state, H2, IDMRG2(; trunc = truncrank(50), maxiter = 20, tol = 1.0e-12, verbosity = 1)\n", ");\n", "entanglementplot(groundstate)" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "We see that some eigenvalues clearly belong to a group, and are almost degenerate.\n", "This implies 2 things:\n", @@ -185,31 +203,31 @@ "- poor convergence if we cut off within such a subspace\n", "\n", "It are precisely those problems that we can solve by using symmetries." - ], - "metadata": {} + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "## Symmetries\n", "\n", "The XXZ Heisenberg Hamiltonian is SU(2) symmetric and we can exploit this to greatly speed up the simulation.\n", "\n", "It is cumbersome to construct symmetric Hamiltonians, but luckily SU(2) symmetric XXZ is already implemented:" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "H2 = heisenberg_XXX(ComplexF64, SU2Irrep, InfiniteChain(2); spin = 1 // 2);" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Our initial state should also be SU(2) symmetric.\n", "It now becomes apparent why we have to use a two-site periodic state.\n", @@ -218,62 +236,61 @@ "The staggering thus happens on the virtual level.\n", "\n", "An alternative constructor for the initial state is" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "P = Rep[SU₂](1 // 2 => 1)\n", "V1 = Rep[SU₂](1 // 2 => 10, 3 // 2 => 5, 5 // 2 => 2)\n", "V2 = Rep[SU₂](0 => 15, 1 => 10, 2 => 5)\n", "state = InfiniteMPS([P, P], [V1, V2]);" - ], - "metadata": {}, - "execution_count": null + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "Even though the bond dimension is higher than in the example without symmetry, convergence is reached much faster:" - ], - "metadata": {} + ] }, { - "outputs": [], "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], "source": [ "println(dim(V1))\n", "println(dim(V2))\n", - "groundstate, cache, delta = find_groundstate(state, H2, VUMPS(; maxiter = 400, tol = 1.0e-12));" - ], - "metadata": {}, - "execution_count": null + "groundstate, cache, delta = find_groundstate(state, H2, VUMPS(; maxiter = 400, tol = 1.0e-12, verbosity = 1));" + ] }, { "cell_type": "markdown", + "metadata": {}, "source": [ "---\n", "\n", "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" - ], - "metadata": {} + ] } ], - "nbformat_minor": 3, "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.4" - }, - "kernelspec": { - "name": "julia-1.12", - "display_name": "Julia 1.12.4", - "language": "julia" + "version": "1.12.6" } }, - "nbformat": 4 + "nbformat": 4, + "nbformat_minor": 3 } \ No newline at end of file diff --git a/docs/src/examples/quantum1d/6.hubbard/figure-1.png b/docs/src/examples/groundstates/2.hubbard/figure-1.png similarity index 99% rename from docs/src/examples/quantum1d/6.hubbard/figure-1.png rename to docs/src/examples/groundstates/2.hubbard/figure-1.png index 87a4f10f89ffef8d0c689873e70c1b07dcb1d57b..73f21dcec67104f4325a647b53f56b5e2eb3b5c7 100644 GIT binary patch delta 63 zcmex$jOo`grVaj6SklhkZ=D=GMU{DF$g0WJQ(71=ZwBS3j3^P6 dim(left_virtualspace(psi, x)), 1:length(psi)) + D′ = max(5, round(Int, D * expansionfactor)) + trunc = trunctol(; atol = svalue / 10) & truncrank(D′) + psi′, = changebonds(psi, H, OptimalExpand(; trunc = trunc)) + all( + left_virtualspace.(Ref(psi), 1:length(psi)) .== + left_virtualspace.(Ref(psi′), 1:length(psi)) + ) && break + psi, = find_groundstate(psi′, H, VUMPS(; tol = svalue / 5, maxiter = 10, verbosity)) + end + + # convergence steps + psi, = changebonds(psi, H, SvdCut(; trunc = trunctol(; atol = svalue))) + psi, = find_groundstate( + psi, H, + VUMPS(; tol = svalue / 100, verbosity, maxiter = 100) & + GradientGrassmann(; tol = svalue / 1000, verbosity) + ) + + return psi +end + +H = hubbard_model(InfiniteChain(2); U, t, mu = U / 2) +Vspaces = fill(Vect[fℤ₂](0 => 10, 1 => 10), 2) +psi = InfiniteMPS(physicalspace(H), Vspaces) +psi = compute_groundstate(psi, H) +E = real(expectation_value(psi, H)) / 2 +@info """ +Groundstate energy: + * numerical: $E + * analytic: $(hubbard_energy(U / 4) - U / 4) +""" +```` + +```` +┌ Info: Groundstate energy: +│ * numerical: -2.189996060974577 +└ * analytic: -2.190038374277775 + +```` + +## Symmetries + +The Hubbard model has a rich symmetry structure, which can be exploited to speed up simulations. +Apart from the fermionic parity, the model also has a ``U(1)`` particle number symmetry, along with a ``SU(2)`` spin symmetry. +Explicitly imposing these symmetries on the tensors can greatly reduce the computational cost of the simulation. + +Naively imposing these symmetries however, is not compatible with our desire to work at half-filling. +By construction, imposing symmetries restricts the optimization procedure to a single symmetry sector, which is the trivial sector. +In order to work at half-filling, we need to effectively inject one particle per site. +In MPSKit, this is achieved by the `add_physical_charge` function, which shifts the physical spaces of the tensors to the desired charge sector. + +````julia +H_u1_su2 = hubbard_model(ComplexF64, U1Irrep, SU2Irrep, InfiniteChain(2); U, t, mu = U / 2); +charges = fill(FermionParity(1) ⊠ U1Irrep(1) ⊠ SU2Irrep(0), 2); +H_u1_su2 = MPSKit.add_physical_charge(H_u1_su2, charges); + +pspaces = physicalspace.(Ref(H_u1_su2), 1:2) +vspaces = [oneunit(eltype(pspaces)), first(pspaces)] +psi = InfiniteMPS(pspaces, vspaces) +psi = compute_groundstate(psi, H_u1_su2; expansionfactor = 1 / 3) +E = real(expectation_value(psi, H_u1_su2)) / 2 +@info """ +Groundstate energy: + * numerical: $E + * analytic: $(hubbard_energy(U / 4) - U / 4) +""" +```` + +```` +┌ Info: Groundstate energy: +│ * numerical: -2.190015347514472 +└ * analytic: -2.190038374277775 + +```` + +## Excitations + +Because of the integrability, it is known that the Hubbard model has a rich excitation spectrum. +The elementary excitations are known as spinons and holons, which are domain walls in the spin and charge sectors, respectively. +The fact that the spin and charge sectors are separate is a phenomenon known as spin-charge separation. + +The domain walls can be constructed by noticing that there are two equivalent groundstates, which differ by a translation over a single site. +In other words, the groundstates are ``\psi_{AB}`` and ``\psi_{BA}``, where ``A`` and ``B`` are the two sites. +These excitations can be constructed as follows: + +````julia +alg = QuasiparticleAnsatz(; tol = 1.0e-3) +momenta = range(-π, π; length = 33) +psi_AB = psi +envs_AB = environments(psi_AB, H_u1_su2, psi_AB); +psi_BA = circshift(psi, 1) +envs_BA = environments(psi_BA, H_u1_su2, psi_BA); + +spinon_charge = FermionParity(0) ⊠ U1Irrep(0) ⊠ SU2Irrep(1 // 2) +E_spinon, ϕ_spinon = excitations( + H_u1_su2, alg, momenta, psi_AB, envs_AB, psi_BA, envs_BA; + sector = spinon_charge, num = 1, verbosity = 0 +); + +holon_charge = FermionParity(1) ⊠ U1Irrep(-1) ⊠ SU2Irrep(0) +E_holon, ϕ_holon = excitations( + H_u1_su2, alg, momenta, psi_AB, envs_AB, psi_BA, envs_BA; + sector = holon_charge, num = 1, verbosity = 0 +); +```` + +Again, we can compare the numerical results to the analytic solution. +Here, the formulae for the excitation energies are expressed in terms of dressed momenta: + +````julia +function spinon_momentum(Λ, u; rtol = 1.0e-12) + integrandum(ω) = besselj0(ω) * sin(ω * Λ) / ω / cosh(ω * u) + return π / 2 - quadgk(integrandum, 0, Inf; rtol = rtol)[1] +end +function spinon_energy(Λ, u; rtol = 1.0e-12) + integrandum(ω) = besselj1(ω) * cos(ω * Λ) / ω / cosh(ω * u) + return 2 * quadgk(integrandum, 0, Inf; rtol = rtol)[1] +end + +function holon_momentum(k, u; rtol = 1.0e-12) + integrandum(ω) = besselj0(ω) * sin(ω * sin(k)) / ω / (1 + exp(2u * abs(ω))) + return π / 2 - k - 2 * quadgk(integrandum, 0, Inf; rtol = rtol)[1] +end +function holon_energy(k, u; rtol = 1.0e-12) + integrandum(ω) = besselj1(ω) * cos(ω * sin(k)) * exp(-ω * u) / ω / cosh(ω * u) + return 2 * cos(k) + 2u + 2 * quadgk(integrandum, 0, Inf; rtol = rtol)[1] +end + +Λs = range(-10, 10; length = 51) +P_spinon_analytic = rem2pi.(spinon_momentum.(Λs, U / 4), RoundNearest) +E_spinon_analytic = spinon_energy.(Λs, U / 4) +I_spinon = sortperm(P_spinon_analytic) +P_spinon_analytic = P_spinon_analytic[I_spinon] +E_spinon_analytic = E_spinon_analytic[I_spinon] +P_spinon_analytic = [reverse(-P_spinon_analytic); P_spinon_analytic] +E_spinon_analytic = [reverse(E_spinon_analytic); E_spinon_analytic]; + +ks = range(0, 2π; length = 51) +P_holon_analytic = rem2pi.(holon_momentum.(ks, U / 4), RoundNearest) +E_holon_analytic = holon_energy.(ks, U / 4) +I_holon = sortperm(P_holon_analytic) +P_holon_analytic = P_holon_analytic[I_holon] +E_holon_analytic = E_holon_analytic[I_holon]; + +p = let p_excitations = plot(; xaxis = "momentum", yaxis = "energy") + scatter!(p_excitations, momenta, real(E_spinon); label = "spinon") + plot!(p_excitations, P_spinon_analytic, E_spinon_analytic; label = "spinon (analytic)") + + scatter!(p_excitations, momenta, real(E_holon); label = "holon") + plot!(p_excitations, P_holon_analytic, E_holon_analytic; label = "holon (analytic)") + + p_excitations +end +```` + +![](figure-1.png) + +The plot shows some discrepancies between the numerical and analytic results. +First and foremost, we must realize that in the thermodynamic limit, the momentum of a domain wall is actually not well-defined. +Concretely, only the difference in momentum between the two groundstates is well-defined, as we can always shift the momentum by multiplying one of the groundstates by a phase. +Here, we can fix this shift by realizing that our choice of shifting the groundstates by a single site, differs from the formula by a factor ``π/2``. + +````julia +momenta_shifted = rem2pi.(momenta .- π / 2, RoundNearest) +p = let p_excitations = plot(; xaxis = "momentum", yaxis = "energy", xlims = (-π, π)) + scatter!(p_excitations, momenta_shifted, real(E_spinon); label = "spinon") + plot!(p_excitations, P_spinon_analytic, E_spinon_analytic; label = "spinon (analytic)") + + scatter!(p_excitations, momenta_shifted, real(E_holon); label = "holon") + plot!(p_excitations, P_holon_analytic, E_holon_analytic; label = "holon (analytic)") + + p_excitations +end +```` + +![](figure-2.png) + +The second discrepancy is that while the spinon dispersion is well-reproduced, the holon dispersion is not. +This is due to the fact that the excitation ansatz captures the lowest-energy excitation, and not the elementary single-particle excitation. +To make this explicit, we can consider the scattering states comprising of a holon and two spinons. +If these are truly scattering states, the energy of the scattering state should be the sum of the energies of the individual excitations, and the momentum is the sum of the momenta. +Thus, we can find the lowest-energy scattering states by minimizing the energy over the combination of momenta for the constituent elementary excitations. + +````julia +holon_dispersion_itp = linear_interpolation( + P_holon_analytic, E_holon_analytic; + extrapolation_bc = Line() +) +spinon_dispersion_itp = linear_interpolation( + P_spinon_analytic, E_spinon_analytic; + extrapolation_bc = Line() +) +function scattering_energy(p1, p2, p3) + p1, p2, p3 = rem2pi.((p1, p2, p3), RoundNearest) + return holon_dispersion_itp(p1) + spinon_dispersion_itp(p2) + spinon_dispersion_itp(p3) +end; + +E_scattering_min = map(momenta_shifted) do p + e = Inf + for i in 1:10 # repeat for stability + res = optimize((rand(2) .* (2π) .- π)) do (p₁, p₂) + p₃ = p - p₁ - p₂ + return scattering_energy(p₁, p₂, p₃) + end + + e = min(Optim.minimum(res), e) + end + return e +end +E_scattering_max = map(momenta_shifted) do p + e = -Inf + for i in 1:10 # repeat for stability + res = optimize((rand(Float64, 2) .* (2π) .- π)) do (p₁, p₂) + p₃ = p - p₁ - p₂ + return -scattering_energy(p₁, p₂, p₃) + end + + e = max(-Optim.minimum(res), e) + end + return e +end; + +p = let p_excitations = plot(; + xaxis = "momentum", yaxis = "energy", xlims = (-π, π), ylims = (-0.1, 5) + ) + scatter!(p_excitations, momenta_shifted, real(E_spinon); label = "spinon") + plot!(p_excitations, P_spinon_analytic, E_spinon_analytic; label = "spinon (analytic)") + + scatter!(p_excitations, momenta_shifted, real(E_holon); label = "holon") + plot!(p_excitations, P_holon_analytic, E_holon_analytic; label = "holon (analytic)") + + I = sortperm(momenta_shifted) + plot!( + p_excitations, momenta_shifted[I], E_scattering_min[I]; label = "scattering states", + fillrange = E_scattering_max[I], fillalpha = 0.3, fillstyle = :x + ) + + p_excitations +end +```` + +![](figure-3.png) + +--- + +*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* + diff --git a/docs/src/examples/quantum1d/6.hubbard/main.ipynb b/docs/src/examples/groundstates/2.hubbard/main.ipynb similarity index 91% rename from docs/src/examples/quantum1d/6.hubbard/main.ipynb rename to docs/src/examples/groundstates/2.hubbard/main.ipynb index 9b64a7960..f8fc1f68d 100644 --- a/docs/src/examples/quantum1d/6.hubbard/main.ipynb +++ b/docs/src/examples/groundstates/2.hubbard/main.ipynb @@ -21,7 +21,7 @@ "Often, a third term is included which serves as a chemical potential to control the number of electrons in the system.\n", "\n", "$$\n", - "H = -t \\sum_{\\langle i, j \\rangle, \\sigma} c^{\\dagger}_{i,\\sigma} c_{j,\\sigma} + U \\sum_i n_{i,\\uparrow} n_{i,\\downarrow} - \\mu \\sum_{i,\\sigma} n_{i,\\sigma}\n", + "H = -t ∑_{⟨i, j⟩, σ} c^{†}_{i,σ} c_{j,σ} + U ∑_i n_{i,↑} n_{i,↓} - μ ∑_{i,σ} n_{i,σ}\n", "$$\n", "\n", "At half-filling, the system exhibits particle-hole symmetry, which can be made explicit by rewriting the Hamiltonian slightly.\n", @@ -29,13 +29,13 @@ "This results in the following Hamiltonian:\n", "\n", "$$\n", - "H = - \\sum_{\\langle i, j \\rangle, \\sigma} c^{\\dagger}_{i,\\sigma} c_{j,\\sigma} + U / 4 \\sum_i (1 - 2 n_{i,\\uparrow}) (1 - 2 n_{i,\\downarrow}) - \\mu \\sum_{i,\\sigma} n_{i,\\sigma}\n", + "H = - ∑_{⟨i, j⟩, σ} c^{†}_{i,σ} c_{j,σ} + U / 4 ∑_i (1 - 2 n_{i,↑}) (1 - 2 n_{i,↓}) - μ ∑_{i,σ} n_{i,σ}\n", "$$\n", "\n", "Finally, setting `\\mu = 0` and defining `u = U / 4` we obtain the Hubbard model at half-filling.\n", "\n", "$$\n", - "H = - \\sum_{\\langle i, j \\rangle, \\sigma} c^{\\dagger}_{i,\\sigma} c_{j,\\sigma} + u \\sum_i (1 - 2 n_{i,\\uparrow}) (1 - 2 n_{i,\\downarrow})\n", + "H = - ∑_{⟨i, j⟩, σ} c^{†}_{i,σ} c_{j,σ} + u ∑_i (1 - 2 n_{i,↑}) (1 - 2 n_{i,↓})\n", "$$" ] }, @@ -52,8 +52,24 @@ "using QuadGK: quadgk\n", "using Plots\n", "using Interpolations\n", - "using Optim\n", - "\n", + "using Optim" + ] + }, + { + "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!(123);\n", "\n", "const t = 1.0\n", "const mu = 0.0\n", @@ -65,10 +81,10 @@ "metadata": {}, "source": [ "For this case, the ground state energy has an analytic solution, which can be used to benchmark the numerical results.\n", - "It follows from Eq. (6.82) in []().\n", + "It follows from Eq. (6.82) in [Essler, Frahm, Göhmann, Klümper & Korepin, The One-Dimensional Hubbard Model](https://doi.org/10.1017/CBO9780511534843).\n", "\n", "$$\n", - "e(u) = - u - 4 \\int_0^{\\infty} \\frac{d\\omega}{\\omega} \\frac{J_0(\\omega) J_1(\\omega)}{1 + \\exp(2u \\omega)}\n", + "e(u) = - u - 4 ∫₀^{∞} \\frac{dω}{ω} \\frac{J₀(ω) J₁(ω)}{1 + \\exp(2u ω)}\n", "$$\n", "\n", "We can easily verify this by comparing the numerical results to the analytic solution." @@ -82,7 +98,7 @@ "source": [ "function hubbard_energy(u; rtol = 1.0e-12)\n", " integrandum(ω) = besselj0(ω) * besselj1(ω) / (1 + exp(2u * ω)) / ω\n", - " int, err = quadgk(integrandum, 0, Inf; rtol = rtol)\n", + " int, err = quadgk(integrandum, 0, Inf; rtol)\n", " return -u - 4 * int\n", "end\n", "\n", @@ -92,7 +108,7 @@ " expansionfactor = (1 / 10),\n", " expansioniter = 20\n", " )\n", - " verbosity = 2\n", + " verbosity = 0\n", " psi, = find_groundstate(psi, H; tol = svalue * 10, verbosity)\n", " for _ in 1:expansioniter\n", " D = maximum(x -> dim(left_virtualspace(psi, x)), 1:length(psi))\n", @@ -111,7 +127,7 @@ " psi, = find_groundstate(\n", " psi, H,\n", " VUMPS(; tol = svalue / 100, verbosity, maxiter = 100) &\n", - " GradientGrassmann(; tol = svalue / 1000)\n", + " GradientGrassmann(; tol = svalue / 1000, verbosity)\n", " )\n", "\n", " return psi\n", @@ -178,7 +194,7 @@ "The fact that the spin and charge sectors are separate is a phenomenon known as spin-charge separation.\n", "\n", "The domain walls can be constructed by noticing that there are two equivalent groundstates, which differ by a translation over a single site.\n", - "In other words, the groundstates are $\\psi_{AB}` and $\\psi_{BA}$, where $A$ and $B$ are the two sites.\n", + "In other words, the groundstates are $\\psi_{AB}$ and $\\psi_{BA}$, where $A$ and $B$ are the two sites.\n", "These excitations can be constructed as follows:" ] }, @@ -198,13 +214,13 @@ "spinon_charge = FermionParity(0) ⊠ U1Irrep(0) ⊠ SU2Irrep(1 // 2)\n", "E_spinon, ϕ_spinon = excitations(\n", " H_u1_su2, alg, momenta, psi_AB, envs_AB, psi_BA, envs_BA;\n", - " sector = spinon_charge, num = 1\n", + " sector = spinon_charge, num = 1, verbosity = 0\n", ");\n", "\n", "holon_charge = FermionParity(1) ⊠ U1Irrep(-1) ⊠ SU2Irrep(0)\n", "E_holon, ϕ_holon = excitations(\n", " H_u1_su2, alg, momenta, psi_AB, envs_AB, psi_BA, envs_BA;\n", - " sector = holon_charge, num = 1\n", + " sector = holon_charge, num = 1, verbosity = 0\n", ");" ] }, @@ -274,7 +290,7 @@ "The plot shows some discrepancies between the numerical and analytic results.\n", "First and foremost, we must realize that in the thermodynamic limit, the momentum of a domain wall is actually not well-defined.\n", "Concretely, only the difference in momentum between the two groundstates is well-defined, as we can always shift the momentum by multiplying one of the groundstates by a phase.\n", - "Here, we can fix this shift by realizing that our choice of shifting the groundstates by a single site, differs from the formula by a factor $\\pi/2$." + "Here, we can fix this shift by realizing that our choice of shifting the groundstates by a single site, differs from the formula by a factor $π/2$." ] }, { diff --git a/docs/src/examples/groundstates/3.bose-hubbard/figure-1.png b/docs/src/examples/groundstates/3.bose-hubbard/figure-1.png new file mode 100644 index 0000000000000000000000000000000000000000..d57ee39ea4b6e74af4b2fb57d72757ef0583db09 GIT binary patch literal 16503 zcmb8XcRba9_&$9*%Xn?kiD|k zeZ5cL&-Z@(?#J(+`+Ob`)$ty$agFEoyq>R5u$G3(8Da)v6bf}l^}3=q3Uy2$g(7%? zJ_g?$=mmGdAE)l$P*Fr3A^#=UWk#Y<7f`B-S9LtzF8;E*NBzC&)R^#3TPXtV3oPk@ zjVDh~>*O?L5U~<-c_>M7=@+eJW2mEeXiw0*WL1*a%1Itzl;S>d;?gYp6OrDZn^L0@ zA4Oa2t~V_u@-461x(N+>pA+8`Dt$OD$lFES}JzzIb7YMOavvl~sYAvWIlyRGH!8 z#{9tK#Dq1W6WPwr4gmo{eSLk|vnqnf*4NR|(Qn@lzY3!vR?^by?$0-hA8n@!DXOiN z5fj^dLdaYsv%lV4UweWu``gn!398Lh)zhS%vkx4;p+9Qq$6G2%U~gN=n+; z*m&5McYlrIF*7q;ZaDH8x;iXxZ*Q-r_VuS@!>?CiT?x|es}mok9j1wtxMJG&{?3{m zM8=Cdj{NCK`&sFzDIR6iJ?rxEcSx9Js!SSuV60DstvVM5O9>tGX@`o< zR7UH)i{BfjmX-ZII$S<7tSa30^3l-fJSX1ljzgiwzH8xs$`qjw_V=-p*G{)iIcMvr zN&EkN(P}Of``nFq%g_5ew|2G;e@vgoII|+_%Z=Xak5_TaXhun=i4z5{ZBkycscbHf zCbp(V4%EYznZq(bp)B zq5SmLOISr1MXQZ&&QT6YqEL;x9(ojWYCZ*5MDv$otgHzMP$<3eyGmck>SM;+Ts|I& ze#5*=IEg}Gp1RYpsEi5B?uxJ|CKSiH(V|dTq7hvjj@)MAG;aKXb7h=pMp-GCk+-oP z4r7qcv1ayh1;2g&_e)%JOiRbbN>XA1RO4e$ zTMA0n;DnDW7Bv$|f>q3@#&}Oh3g;7t6InJVp3M`WYU8(PSy&X~R%A>i;)e4r)z9L` z5vWJU(#2^=ZFv^c5RJ?%xj8rV1v#sF%h)3ns&INyiR+KxO4o;tpEg#oK*Y6m=wMf@ zx74YD<0ua{>J$sC_nYGBoC0=#{IZBqv#>DLv(w_=NFDNmT!G!G^lYMz-hO1USOWeM zZnz}+!^YiAil&@ixfEoH-V!T$go>E5AS2_W$B?1MbhU7mD_*Herfde08VO;s$OO`}aE#?bybWO4i=lhKZBVJ7nETkpJsK5U>+ z#>bRA7@dBn8$FwMWX{09kwD2qn$(0+I{qH^3d(Olob2V|Sc$xXLkd-QzOWB_L z@5^@vmIZoN1*RR3@K1Z9g;S>rAer3bjQ@6VX#PEZISCaghS*g-!pT$B_JZ8V!LBY) zr>IZxYdW`_BhjV%Yr%=XOyw%YPz%=o)ei&wR?0Ah6iN10Rg>tY^U2)P{@vRN(UkNF zs~xEdHSdy8Y>}nzZYF*ut|gQKi$d$eA(+o^*NS{Wbew+_kA@w*^ZF<3ycQw1! zSo6OxJJX3mVR4`9w%8>jYqUV3#_VT=2O2}H4oeL=n+rCx|O+_-Zx@1oYv8Z zi&Y6zkKcXS(thtmeNDUy$@duiP%7jpMrZ;AVqCoA$WuG@|Go8O$clq16)j~zZtG8n z{?~Y;$PZwxHNqI+xV%UpAeHq0_hs4fHVI6tuLyh)UihIEsjSX`bV+_-GZBjP#Q zjjV9~GuARPnK1XSP$dBywSSLJ>GuSr~ zeCe|U01j~&m7G&dE0Yu9weKgr2UYP`fjw+~#`^dE7{t5MFhNK+3%k?9vjx|UJQ~x# z;DbZlGgcRLcveDHn|V{5?rai%)jF=ok_^O^mmvPjOlmE6?MYCQ}Q<-*(Y&ma5Yg0iwc%>ie;WaY%fqCdYc9}GCd_)a~3 zI?pcg+4&zgx(|K42QO`u7iO$VpOjYJ1li!~+E}Lr$={wDC&x^zF*ArE#Wuti_gf2OkD+MZ! zn^}JbKQprPQQ4jd75LQBB4Su=-bzV0vx*^6VQBEfNBYoWPepo4N(Hp4s_M>o;Q5e{ z5K1blna%`8TH5IryF_KmgXe1z8N0oc0bd_Nc1E6wQizjeH8*hUd@FhT-A&2In|7X_ zJDmyAu&9ZNiA(KR=790Gk3D_CQ)0s~Rt7uT@#&8E#~X9H+S+RXvl3)Hg?M=8XOet< zCd0(vp6y(}K1oMTsu|hPm(HDvSTx$^9eRFlF423_fPbrSo-r~qQYDN*S6~0n>wAg8 zJoCJBBH?e&%;l9M`;TJjpib%e(L(*`$&)ACQD0wr$|PA}>!jvS_Xk}eLdhp}uzs80 z0Pq*qzwqn5xRlh;YPL*l@~^smw}bYY2mb>${1$VSVHt(JwpXgEsVfyV`C$qQ3bD2#X{w% z&mKT8l?diVFfO&>om&NEk;VKs^wxxth&EDC-AoaCa}ySO`uA^Zk+^T)zTHYwmgI{L zoLu2`XZnZ$jX6ViW70ms!B7dyQ_V56YCdBBz*l4LuRFL=@2y`4TceKE{C_tFOqRXh zCti8H^rQHhwuWXi#kOjVtUCIZ8KiNPZslFx+js8V(a}lQ;!4-HxqJ853zloCsi_PO zMHX$eGoRMY0YK=)npitmemzT#YC?5zJfb89haC{M2*$%S~Nfh2y6< zB3nIsWX|c)ULt19=95Y8H0GQSH`;_KZMrVqq#DT~`rztQn>Py`LRH35#Q~x=h%c;Y zi-oSlnE3R}Z$wYc&CLO5&ND2Z`#am$Njy#SKVYSNYG~i_zpDi=Ui@f?gCd}?cJ1qW zmt0a*lgch$U=p(VK_7+coCahnsUg4aJ)aQ&5%%r z68NRga-vuoZ8)l)Nem4SH!i-fW?=Hh*3VBrT_9kpSqy9{xxzp-v;}Fx#;~v}_WxEnWO5Mfh3acQrLNS%3N!=e~dc z&Z(K`a)-N+?SD{|`v0J)k&l)XiINX3yOXa%)GL)CL8ArfNnlUh?g%b7t%uPB$h0tg zpL=@-aR85)=}#2z($huk>RGM@yt&B{rabxjp7Bh7`^Ib%W$6nLVzpOzWta({kUs_vjsy>+u*$?*6eiKrSn_R8bUBGcwXkBQ*)boOkWxcK<@kGGaSpZCRZM@b1M z=~1X$$*9`)4fwjgyJm9o!&XoDanu-%9W#ZpipqIeF9}gm*P$|-$=*e%25JU&c6O#Kk90D$zkmBS79iBg5|&h0v-@Q8lW`<# z1kbVp1bDxh_v>}a8QR(9Cu0Ommd0d8!r6#vm1H&aBe~aw@zYaysDe`oXF|f3w|AXu z$9QvK46nh&wvMrS^mZ!bUO-xFOO8UvOpr(`^R|O^e>&cA#Ak02W=J|yn5OKnF#cM{ zIBaHAz1uXo{_h(|fHqAE|6N_{xo&A_$Pm+JU$q8?_t1;|LT`)GZm(I+U)|pAleqDb z9Xcp0@*yt&nVjs)I!VL=9)ZO&U%-*y+U81he5>kt*Qh87*)=k&Qgk56*%F_FN2P@?u(gnP1E z(iiYm2bsA{Y{xRXD@jg(HWUJ#*KaKcvV(YX!PC0FLHZv(aG_+La+pJ5& z;jXQViwhQ8R9Zs7f|QkWZN9n|d9PYJIB+TF2vLoFKX{uC5B4JPL9DB0x|K5t^WKdw zsmt9u8NyM%Q6;~AQKPeM<@!w5z`y_xbqE9islTpwqqF)X3V56JV={Q8cu5!${NR^a z?D@c@H(m9NQ8(-5%d5K^^Witr`er+m0IuH!AxE5n)w@`5R zJ=0bVzXql7Gm7mw2jx13Dv-x`h>k{CSP*eSf`2A+K=Ys@!d3i5fxVOK(8Xf5A=^1@PoN=hi z$t+3Mduclz;1PVJ-4==p2Fq>rBABmuc_SZNTie^WZ`)td^!7dgaEE4jR5#MqwRT@Om23zr1S3}g_I&05r(i*%Z~f>5sc0=qcL^~Lq!PW}g;n{Xm;dzFcjsvDjV&`WYwdN%{N?(+f{Kd%60e;#i+N|^L++;TZmq~x zYDPxJ^XCPqiTnEcG~Y_}U>%I>jFY0HE8G@`#D2^A>~AMuea71c*%VTZT?zVZ!0h*2 zy=KwHp>jqE?7ekOV?8}RBO}{7qMRPKVaa z&Q#HR!;f8E5uZyvH&{i!?HkRv2{e@PF9U10KHcH&)%0nv&Z-Nb(k44jkVM$xE4A%o zgEG%Kq5#u8PQx%|v!974(18NM3At4(HQWbg?-B0v2UDb=*{A2qeAm%75}J;=CkP3R zA~b1;PaY=xuzXcDNTQj;v)iK|a}^3*KTd4#SnbtkrwlUlv$C>0Rz46Wtk)z4vaQgm zTv0;jsvW&XV!Gzo3szn(uI=6V!qU>xhTXYbDozb@#D!kGe0j^jAT}X^k2Vx)l=+~6 z4NAmL#{r(bam7c61K(n$HDY zstW!TN!cdw?ua5$dN}@CIQrzVCk+j9fz2;l&7G@7NMn~nL4;6F76J6kH(Et9aQeIO%(2eI(NHc67Z2IY_L|JLs)n{>1f}|$H%8R zDteIM1C1aih21TBEy6dqSC+P{AqhdD?iNt0eGWhOv%>y%w$4J*-$w`k>a}hen_)}< zPcQ9~_$6lqGh+3`LIp)c{?_j;*?K%YE1M(-HCtx-Q`+&MryuWfQ1s`0)mKM0=zWO+ z&eYU&c6RoE$~LmHaC`|XWyO|Tn1;kxzCnnT{QM3ODVaz)p>XS(p;FL~{sl%^X4ChU zo@~hv@;<$gqTZ|2&OwCyLdLpfR*H@R`0u_v65#$>EWQJfordbk{0r*(Sv;z@EWEhG ze8aJVVW&~@^FQ{70e#5;{J>x^%~AG=-p80!=r=VJ9czpEuNf6-QeVbDQ``(NHJypq zWhtqep05{gL`z7Jl@a{o@iKgGN)w^{_Wmp0c6Mfx$e3mHF_^b+-bes&FDeq`w0ss# z>7MYeYCE8QU+>yS10U)31p-tzu~-DU!*U&{Y5;?~5M;ssmq+Rl*aqx)CkY{6%L@Ce zH)ruQ2a=tu&O&zfT%U&cnpst~Jz(N{#b@8c(sCO3=Mk@Ub$HR87cBz!B#w22E#J&J zhUEL<;0{(DE^3JXGtSlhq7XXMl*71rd0o^5t@BV?dHkM+)(fH}+@%CLq z^(9OE8v{CWl@b4j0`AS5H~$K_J9pgvbf@U%-Vv2CATCgjE4pstW*AkkMkyUA_{Q}t zkR*0KcXoGnGSbt*vwhb)#Gzp!2POF2_gpAAr`oaIhN&86)oWa4-r*I0$Po~-lv4fd zRP48gr2l-!Daw3W62RADIi2yzwA%A(kybbK$G%H0wnPp z5odFb5T38`%MM<{^wUr(_r%61H=+J_vucMb|9+3bje4zje9ON5v)s1QWmdZy(OXQ&BzLt=IrC<$kj2;6fb2dzBP=woGh}_K?@LWd*;~w3@X?(U4Ew8G^lZqH zZJzqf&c$w|90`f5pLLU$Z$vsk@7*1X^%s82-&0|F(oi+uH`m^!Gn?zRy!Q(6b3JqL z$(}S7ak~$ZoSFrgYRcntzrqn_6brm&yCG)k1gaY+jp2O=DW?|yDJm**n*4MCgaEOB zlVocnzlUs3YSGI))!fd*5M*KX%uCT5j}E@PWCOsMdieUyn?K9T0x@j~v1Cgl`A*bl za}EBH`!Nt?^zscwUH)`8H8nvJM?N|_OtM}cV~tNV+D~n={E>KbzPmZ^QlIfCLW26W z6&v6vgUx%OabRjHD=P~jjf=|~@DPT-5|6PP`TtSZdV0O25Z#^aXjuZAS#aQJJ_ozr zYpwZ2-cTy*>PAJTJ~;?t<#YlbUNmMSgA>2WeClLL7jU?M0DzF2;4;racvJ@HpRB)_&T+ny$4m@o0DFUFfSalF!X^jTT2DvK0=h2ZV3YRp*bf7GOF z=PB1|D_L(jJc86Mn|SvV_X4<>pI0RtiPD2Z(Wc)d89QnoAi)Cj(L@FJsP3>seALco z{ygBwF!2#AmK{r-Xp$;uo&{~CxVK@w=`nc6Ao8VQN$NU6NVMl?`&N{Ho;e$)oIuJ} z@+)4%=_OnXJ%V1`3{jvaLNR*7)y;xwDiI?!uC~HPa!32?;Snc*?mX8CbZ5T>Al(pF zj$SZ4`BD2(3WuK+`8)ZruTx(H$4)#4;))V!7NJ=>On6Iuj}8GmyDSaIl4~0q*Mr*w zCX(Wzmk9ZARjuM}qWLtW_cl4nkVPM!!+Kn7#9TF)TWOC%UDb z9mjR~;T4p;u#yLu=rckxjYOGh1Y(PlG`r0A^NEWO7z{Svf(8M7xcuYE$E9;pNYHyd z$g2=wN*`cTR+5wR)tO8iYl{$~&a9^Db9n-YF(kKJ=3b%>f%d5w<{^ZhyYJnUl$E7q zX(Zm_$=~?WMEc8pLeNu=uhch!YHww{nNGlXVRCYPv2t{z$|((U3-~xBpzvn0g-g~) ze)S9K)qjk7$8{0>k_EYrE3#GNt;FglMn`rIjvSqwK-f7bDT9N9;V#mP>KH}z<(WdZ zyjaAq9stQOx3Rmhuy9t`vi;5F=GZ5VHo%HXl<-?xBvz~>XZ7hL5B^i+skn_il9Ln4 zKWX7J5;V;(TLdoPvU)FvA4Ao~bg+_~KHb*Zy1Ke*Q{@bC8n&~OZB8g`d~fcCCOvmo z4*(PB&lTm$y5KK57apzct3{F(7tZ;sQpu&jv}nG!jCGgWmJ!Fy3B#RQ@+GlU_fH54H%&H6(BX#w(VZ*ug( z%o8Yx-v+(Jg-V4D7>{Oj8uBdfkRsmI3Bfw>45OIG%DrmL2zILBa6{m;$}y|Ri*@OB z^*0hW`~ejPaN<2B+b)q|u`jc0Yt*-^#I89i;>zZmNwz1YtIw9kE9b5Hb#0xO1HZza9j&EkZGxGD3a>zU-l; z1ePOUnQc}oj67B2AM8d(uPM7@4k^Lm=j-NJY4?IjHUd#RzJ9P)5i4qeU>%8I;4L?|%B`WN2XhMo7QaT*k#hAcm>Q*m@#DpE z)8+v0y~WDx>}*6_u(kASeQoV+G)Y!bJErjK_Va&?DE1TpD(Kkz`T6zs_CA0996(1* zRFpli{~$d8Q|{!1C@J@cxwHZk-w=ryvsIA+&ceb1Orb=dx1zvv41^Dl{-nHmMVWcx z_=9wWnEP5rMr68Nbs1o8sR1s`p}>-Yfx*zoX#R_ge3HZ(QGrOi{zF~gb$Y~~Nr70> z<<^C)&@9RkX#)&TPft&{=1Co=?N>hrapV^*0l)~{ThHk+D76e@l3W999U2lcvFeeL zk+HY6?7Q(@Z^x@%c%6XeU!0yLCObPXNR`vopn+=+P8A?nfIgC_ijL%)*PjDPmxFB{(@b8BA8^&Yc_}Hs8Lzbo-qIAFURr zI_5e$t-4|`FBefCG(I_$5;eSatJrB$dA=E#dMJb_6&!}ERwpCmNY4tL7$to~15g?% zf3{VC$}4dw#3y+!-*XfdKxldIZMH@8Nqg_Qn4AChBRI}G4@2Ak!WQus{%j_bgZlin z^Rbh?E&jj{e0p$S4C(faaaATTY;0{E{q55PoGsxr(bCu`Kfgc&%+BiP^ClH` zv3*p>M4Mg&ZXdRCxB^AyjyI^UCQ4B5LexNBX%rve?+*eO8X6kOi}Y0|RQHc51aU83 z8@h@@F-;Y+*19bkDkvzd8;w3*uCwZV>jWu@Wg;t6Vq!BOXLMt#0Y4aWUm8mB1$N9{Fsg8MkPi~g?p1r(LuHK9D zM@;F*?a5rTQ>08Dz^KFuTS0w!PRivEuxqigu~Zy4A&(q$D4y;>@;eI3n-cOOr62D57*fpi`mG5|Fmfx`}i|8y&Q8-P$CYtig#Iyra~| zkUly~*;Dp$NqmP~ESnf9OQBECQg%#_l6z^N3p(Vn_zwBK^IQtn=WHfI!Mgfm{&mRx z&LyK$T#*j>hppHR(KuTpB%u}^huh;sKK#EO@+u>^SM=756ULJc>JhMSWN(&eL&yyy z#?>aLDQ;?`QOpENXnU66#Lkr|q(d$mgAApL2ktzrJjN636M#fS9K;l)fsYddf{&d< zFS7Di-X&ya$%`;E<^NBIyxR@#mTqJB2QX|9iFA7XpjWT(lW1tPi)_xU|Bm%q1wsx$ zuU?^w2awR0d{trtWNbsnl+f-EfGEb+sC`HcdA=c`656eCJ(xBi{GK`kRE+<9 zxw$$sw%es&iU=nB?#NR-^+rpRj{jpacHSe)Ykd-)7sh_*>1>O17=FSvzk=T1oDPzv z&*A^mrh#OvZf!1wBE|ro*Pl8$kR0c5QVG4u9vt6>RT^qK&Y{GQgi^kztS25%1Pukh zzsZqj5OsLzzb~aDIe1xdw@iMT_YWXX!&<@9gcE&V37T`+YFU>IAZv#IQm$?65tMNE z#qgIA!ew%%f3Qd=Ko`^@*8mGNf{A>fptosS$B|nMsgy-RiA@kf&ZIEx%Ai7Ro+Xhh za1@2ibsDZ?p)b&<6b>B=w?&PuY2n7WpzQ$Kn7ZPD^e=dl1H^q2#45wa)H@QU>N)MA zNTB+GV?9Cm>LT#+X`RMhbMyE$Vt`i!A$<-fa$Bvehxl07EdqB(^CEV68!2-K;Kt9C z0TI7rTh1xH)I>VfRTtofVBXn_$UEuaot)!4?o=-H zh@ffg0nAdyw-XbA{6hix2jpm9(t=T>!ffP&mvhXI?UGq@f-ArtYFu2B3S%P?(Mc56 zd5b8n{K(HNs#YhT*ZjL-IER%4c+2-{rx_1>zBIYYY|5;(LI(f&;U<$E*; zNk6RLpmt^W99Nbjg3RD#fi6x-NhyZ^E-UWu;?J$^)k$c1pCKdT!~v9c94zs7lfqK( z$Q`P~q}NZwEq?3OcPM06Td07nXTdQ^yV?Ey(K|d|(I3elt;9wRUqWPQ$)CyH5;74GCSz7GGZeJ(T zU|(K!wErLr)IPMft6z}=#BU6hC_)1%Haj!JNgK*X)?xYZ!2?JMH`LTZ!jX@|TBVSX z5D<(|hXN#(a-9R!sWSQ&7j=S^t20I?IeaFGo%nn%-;Z3iy)QG&UIu7X=j4mqNaovF zDD7HmI68zhX4Fql5&%gGa{TPZuKS4R=Y9cNYU)~`c!6p&to2w8rs51BJ!go)+(fIY zt0xFqgs`PPoqw_65lOBLpxofLGBRO`Kqd;ec~H7mIskcHS+H}sw+y`*DEi@Zr_k6N zav|)}(E%Oscu!BB=4}IhjWYOmMvSr4qrX{NT)^VI%8vnh9vL4jl&vRx$?W-?;{73^ zC+}pEH6aU*{1c}ty{w_0NAlrUU-K(>o$e414C*-$yw9B~Dm2X4`L!`$*ziDvp>6GB zD4j0%_j5_zs-qOl(8hq#RPt8Z4lF_HSEn^q#DCUp50^mX0n{o~<>fNJS3M4PHzwD2 z+|U15@VC)&$-26Nr84nK+7$`D|y}GipZ_WptEQ_#F_y@YW$drC4bTpKcGRs)s9f4oMY?ili8Vs_gV)4-Za6QXO&`4_lo@WZO)p5l8 zNjYgu0aZ{F`&$^KXjOHypsVP8?rB03w?8Xqca^}b1F2ja*Cn&j=RL-r%*{P$bJo?> z1z8dF1;)a?cD*~v{+Q-<707(kjI2E9YyiCz9g{W=AT}Wxb9-0U5iGR;rb-?i3y2f8 z;roM)j(G7f<+P2avwjVeYR$(~4mlvzGw7CcW_~-63KgBV2|R|1n0m2nX(42A|NaEH zH4#fR!G=(*-LD!~*qZP28;oLh*n~Ff52BYbFCC9Io|2NmtwsrTo%-?9;#j&RiQ}m7 zu`Jftt>(TalGfc9RBD+#xShV~B%0jsC?Rt8gu@G8yRj+TXoP zMaTr`@r{^$+{Q(4uYuq81kgKQU1=sWie6t|cV8U(Zaxiq03$~s_v!Xn=*#STGjjeG zkMCdz`}C;q{6N=v5vk(oKifmSW%i?%adC0+JjGOJ-zcJ4Nc1rJd=l7qvu)~xt}~o& zHLjBxqlIUE+pH&iFE+m*I(}mDz#&0&XSH_RFnD!&z>{dZz3&?Csoe6P%AFvM6o-l5 z_C@EdCJrhch%>&G7)8t-);6~+?npl*yg2%(;3;vb_xj9;-NeOnZyMUSJs(lNfn}%+2>R}92dvXb`9v`{H%aV zqx`(QGKW6$m^M**l4!E~(H6kUf@O`0+inwO_04kg@EBACAB}>g_FMQX^!(B5gT;5Wz*!Si49m;2HdnrnzMQwnw6txLf z)l2KANCl}RM_8)y?c1Z~{MtsD#o=GFvM*MM-M%C`Ek`Dh`#?26HQ2t2DYY-hla~co z#G9SP5yx@lq27|$P%d8fKwI}l+@rl0bB6cNyvwRQn`gfhKiuxLqpP;nx%}-wfIZJ> z#(n9qFju(f)KvaH-`>6rbKmdG>c_ECuG~waLt@Hl#n3fnbNt&JCz7XXJ37P5!_(X$ zY(xryE+;1ky0}h-J+$0Bg-i6b-(T_ZZ80Dm@Or#y!!xVRwLYEbatmNo{)CX>s2XgAoO3rE$mc&=tt9mJe?a+-e+s9TjD;^n{Sl37XB(zVl;K zI^0oHBih}Rbo>}D0fEefrYmncrrA`&e{4x!DMFigjQfX#5D#4%ZeE@I+_1lP1OECc zgoX$BWd&*f$5qg22%+H@PfKq@3NEr_q z0TYGj7W})Pk9=)?osErcR@s@3A?#g20jaMKpN^ImIVI)OTU~snA`FmpA-^h02R-KE zsMf=D=gZgksizP=xE6rl!Rm?B<2SF)*`Yy zzaw3!YF>xZ2^_*qi2WykegqYg@j$^{b&fum_v62Rp!33T?wt4MwvxK9PmUAvK9n`7 z_uA>xl$%=LF)%Pdx;TTSGybRPXkl+7Tdl2JB!ON4FfbZK!G>l5x^@~Xalg3g-8)Ml zkIT}kUjQi%yglKG6GgmxQ!ysH+uPK%v<^RtQXp(WMf_Is;q)(!oUe~w?5xi~Co|E) zAWBX2ehYfY33Cfh&?qT=d~?|hSX&!|hf`mpfZNoM2Dv7pu6#6$>D=F0FE`|CD*>fK z6)cBA^e>>=Kr6v3ckc3ioMHaE*sdsQYHD0ypplzirNb{EWj>cI02d2#Oa16N5EsA` zE~&U&(JM4w{8_mSt!DjbJ}#~|5>BZW2LK6tcK_Ps^kCXxdBi~*=6mFWbcBR~5dkSi zv_)uWXcCCQ-h25(NQu?}fBohSy+V*8YwMRUSvfhW316l_uqv{f*$3SjFy;paq^D0y zW5-Zon1UdSLC{gcxgLe<_wT1pO;h)8(IYuNNy6!=rJ^1s14E7L{GAjnpi=-009%8( zeLFHX)~1?56I27x*oVdEQ%<`K=6C5*>)Hy4(8>~9LV|*-Ce!DPFG@&kgKmgf*peg( z%6mX+fD-)u{V9NNQGoW8Ra%dSc-OL|lC=l}FkN|DF)y#P!|z?#s{P?KQ?||ngXp#? z(4k~9eD)V4iG2Bz;{16{1jf}tnr>Zue}f~^)ZM^I;w|BMFTpEU4nREU3G!A*Ft_ye zt?P6{bh!EW_#pqfT&sC~u(uV#B-y)5?wD^0+YdHm1wB}xvsv0o!Z?P^=--u;tT`l( zJ`B;y{Vqh(JU+ZDFtNU)mhsAgy)wDSx(ZWZ5!*FmHZj-$>;?eL!u~=N&7${9iri5g zoSaEgt~vGf#%VqJN6eB;q%mzDmrB02w$6fqH$To9&;S11rte+Yc{!iqDkq?$U@gB{ zi=0_@@z_e*OuUVQ^GBa2v%f!RyXLPzK~63&{>liL>Z1BUKw<|62eZ>oqRMGbJ8M&L zBMAWh%4L4g#Ldj8h$h&Y8dN~nF+yf7=uR%^RNWbuctDjP6bpfNmcxa@vUCRu1*jJhZ(`zTAQpQQ znxQW1RsO$!o6j4mrD(Y;{v+dixfmr)RZe10o$~ zXQA(Y{N{jwpy5%$ySKMD3N$rH+en)A`@anga9+GdadSX!(_PMtV0JY^c8QYQes zo#(=j%L-qn+G0S@b%~nThSOOIq9JtLoIlX8n8Tt2FfYbPxq<^jbFhc>j{-E(JD{b= zZ&31k&?@OyiN$FabBL;$nn@fut|+z0)^E9b0z+r-DuFhvC76nc<p$ZOMDNTG&0P~#h;lU!$G)D;pcc>Uax_24v1|)H!%0+wQ(P4TSF-7 z3!mlQ-CW#j7w#fgfC>oc)akCIF2VNFF4@QX+fE8!;2T7TJug>1^eN3U>7KzRNX70K zZv#Gt0asv5PMiTc6QO#!qaKtSnwX3dQE`wfKtbi~?EG5I0;o^qWFHL4vUG5*E?Ehj z^%~g~7%Y@oY8e1G7%$&f#9{^O{P<^}h1K@;YffPy=%%*7d{oev=}CZZj%hWAqk|E0 zhZ2i^{8msK;mGTZM`1oAb&qFeW{x0!pL&)8^e*TF(i1xU%`GhMR$)^h>O%iNx~&4@ zIf(LpJAoex_%+ke(jv(O6kl9iT>90{Q=s&RXm7Uj(zwufv3vj$x${=xeX;nX zWjG870XF~Ow#%DH&5Tl1WfV=6k3eNSpX3r^Od&0>M=a_B>7Ck z$+5H82h@$l;Peo0p?l9*P&Qogjg^}_XFP$j(*9@v^gsw`_#`wLQDr9%Em2H7&|(%5 zaryn_<#O$MCzR&A>mO@@`;AWGH>n3r3Klxg0IJ*D+cBV41ygKpYU)h9@)L9l&=q(} z4qgmab^7#aD0>TaxaoNHyMLdV0-)bKJUk5hrx7ofUs197%Y8IICnxU8;|jz4&h~Zy zbc|OX{gpdhC7a)bXa+Zv5fiU%Z8^Ghjl+2c==!jWi0EYNY|i#sL8lxDY$V_F$t7Gi zI~DPH5Bj=j7ADdeNXBmMiN~?Dv?!(p2vRT^964!VAJpN48&kr1qHQIwDiSB8hnpHrz4%{IxBti;jw#dU5yEn4*Lz@fem&cKe=#!xHr6KZh~u zX=|5wtWIPm`3$Y4t*l_@=|FbcJvy3XN)KfUKpNCh8C%KIV=dmHmAXz04$%KZ))2=@YT7H5)|bL*>%(VlfcqeC%n>75AS zj}YW?;pa{s`vA)+cerhqqO~32yFUq|fJ3?mu;9Sm059>P|HjES)_fZp^vC^b1W6JK~EimH%P%iYB8mX!q94j9g~RG$Se(KD7#0`0m^GZ!J-|L z;R^fs9_xjkv_Q3t2OgXZ<%ae)C1N);G&pcjMu_h8F<*HEcufQYDj?IlhrovP7u@9` zM~`?+hP`h^jY+{dV$w>>j<}p0?)hs`YEkj=wsn!AgLYyJVf{&fgTM9nQz`&Imeh3~ zxSK0m!=*NT9P_7=yfqaiFcdNIQYu9A z8aRV616qx3*UAm+Oq)-&twBfu4brO@FNz>q6@r!%QbPVO8Wev}DAfUqR98z&3xn~3 zl^!0(L|eehgW9vOVeKnVbaM${tDex7 z1g+`oq$GhTHLz9XaHeVyvOsl})>8%e8rrQ;cKx22k=q`721o)B@-k@ZS*eNPI6B!m zDG^`^A*po&V1_~h(hEqme4U(D!2;btgb@=%2QENO{d?gT@jW?`$9vl>sG>r6x@^+& z%uGyVBnTfQAt1m39Z_H7vWkidkO1|Zj0HjmQe<&)v0Lrwn*c7<)zv}!XJG;76zt%v zm&F@GguS$~uux@x1?Q-K&QIYvbU5O|P|tP(jvWWE{+~ZL-|0aI07Z@be*yl_-)zq{+ob>WC^Y_hcA;QOhwnh8$USp#v@$|9(yKMgJ+5Sy29 zf;NwK7BbWl`FVL4;W~11ci-*L){FoAxw@u?ogDvS27Zr9(?vh=8T;+qx(^>lDSXX~ zAjGk3MB}luvm;aL&W|}nL_~ObQPIyZpB~cS5y{KUETfy8o4fn0oGncvJ;_(d;rlpgQ>I95tqXxX!M+z9WUiycE1Z~bCr(`ybm*T9;T4YK3%jMM;|vl# z`>{&YAPTeY5(V=-F!0(VtRYB&<&nPrq>J$SLB}2)Zi)!w$;RQc%saV+H#(RPD#cFF z=7~rIqBbilt8I9AxVM*dh2fR5lamunYF-}qpf?>!5Q=fOghybwOD5bYUA{DI+spJi zq7;STRp6r{#KQ~S-F44-Macd7^=m?$SCkUO7vAW^kJzs%@NJpUC1N=<)e?nou@DF| z4XXQ?w_3fS%McfVl8Lj9n_L>}Isapw1kdvZ#hi^|LK}_BY+u_U$(Fffd)_RB9_>YY zFu_mtue)Mi`h#n+Mwi{9=PO=o{;RkB0}ubZcZ7|c1*0r7cXW2A=PMl_y9M^EYOIU1 z-AbwzS$J&$pELoZwB6CN@m$)le#b46RHvS)c>1t$Gt7e{aO9le#Ufl|r`9y@TI^6v z4g+UNpWYoIF)!v_jB1;G%{@FaQmEE!&1_9GRo>w?x~UF3X%>*(mDq@-wRX`QV{t7Vv0dFH02F*7q;t__!Z zdU_&LK79C)kU&FCO)XAWXV=4&=X*&_?giYBYW$Dg^hGQ=cka+HOcZ*1tVh3BD;@v$ zQ(8LW?r3Xk!%~XnGHi8%HTI~$tRYQ4GNjp$;$1i;54TZ;hN5CyLqkJr>n&DRc@-5- zUS3{C#!HN|8yiq99y>dCm2PYrGavWbW$<|ty1*G_rmoD$^-5LyZ(MNlm-;fa zv;JmgX8Ij$PPc?>XQ(lv|Ni}JWo6ad*BAZ%{onrnp^eXste%}5oUK&Se?gr`e*64#alO=; zI3bqd`tm%7kr>(HHbKrPHlp6d@PUt^4$}k?>u`l?fHosJCFRBToN{?1 zjT<-Ok$CP?Q3TXIfO0hNY#YRNnzDd87ZkXuU$>e|zE# zM%SG!^uJNN_D*;xBL-3s2Ht)k3WDIK8o#sQmX@IQiK&q0Rp^ z>N`%O!rUzjg!oejoOpyam0iZM4(Ve~*A~`9{QZ#wp-{9Z=DU)m{Lg*X_bXxPB&jDr z>4NL&!M&PGGe{Brbuvti(I>S2IG3C>PKYDrqze^j@&+3^p|T=)mSdh#H(0#$w9pI1 zX%0o836H$d#C5DT|6VqBp`F&VnUXKes;YPOSpkwrX658?E~loaUs;hg!Z|>Cw_8U$ z&&Igacon_JP7^xmTH0{e)a`8*g<`#F1lz9G_ry-%b9uSYtA>!Uu-{!>QZADLu<7bf zVBbZCgqZQi+1uOa<>isFs>veHj#u(kZfUEiCVdD_m!8b8y&pCWN9sOL*@W+jh-&CdMZujEYdI zm?ld3`}L$gxPANf&itP{LPGv0`?=7`&}ei(KtO70YIZiq#CL{3YX6ut!*Jl)I z_d~wu9C%yk4v^)L!FH`vO%Q(9W+f*lw_g?f=FJ;;eyO zkn{XP2|uzEd19V4^O~hlVM{7oQMP}7#h~rOH@q3zLMV$=o$s?B&4g#3ihM+o)U_x{ z>xMMhzkl~mQ%kG&yH578*9UlWQY1DS6{nK-{kuh%*bX46fB*DF6FaT=#bSM?vDnaO ze7>J|lnZfbdn#E1!zRbVaJlqoXw2|r5QzNQ0Z;O~Th6PxcVij~QDI?W1ApE9A8$4V z6Q`%AOLz@*cSH4C9PWLt+TYd1!^Wndtxd)#;5OgEXW7bt*3HpR`SOML`Sz@ze~{!$ z>3`~$t29qr(m$V{JdDcZKFK^HIzspL=IRGuMi8ps=xDaF$1gs7%4yD|X7HijwY;;h zB5!wZ??hlm#mA=_5Jr6b4e5{uv&H4*q7hi<&g0d1K`uz%yL8&ixBkE$kx0C(Om!LY z3?1^*UYRJ>bP)C+06_V-G)n^}&^=&S-27El|0G@EmyoDQOKbY`Cqg>K=WsKnqT&!X zU?iOc6w~tZgA=|4KPuS^>tLpR($^xmJRxL+?mJsT+}QbtJp@ol5cSpq*K^%^*FJy# z47)r@()Y&>c3yN6<}z^>?da+vCL*G{W1|8eYGRTU8ygFE5*bM>9nxkc>3?2r8#71C zhQ_+dns2dEwKi8P)BB9GExJfOU0q4hVE!Bwk7_$ z&aynsuIJekDNKP15c|kuTI+N4bbWtmdb-ywC4FlKN|IDk74Gs?D*0cuESFN2PR_Es zZ=jj4_s5U_+j#jOPN=yY6y=D-o(`OhdTMb?`k8N-^9DH zrr;9OJ$(2OenFG%!(GQiA!R&r=_HpSGSZ_7-m%Nne5vCLGg~b?Zr@ZMz42f}AQp)M zK=h=^!{81N4KboyBk7%OZG~X3|NZ;${{4pYJ!%q?cX4sgr<+4z2`{d!2nh;$y1Uaz z`H4$P(lM6!U!22WsmJjLg-=Y2P4=?o3+KD#$KU>C_K+;}x5a^DYCdhte>m~yCq7H; zD_5LHD|$BQY`T*E_>q=oWhnw)xp$9&j}Mw!%voM-?fE^M-E|IO=2=GE;JeO$O-hXX zZp;4deZfKH`nSu&n*lRrGF|>sUxTbz`SedeS*e;R?6!W;d1S#qG4ZFqesZcQSn70B zX0UZ&K=*pYfSWBmfYZWTC{RjDO7xOG!XC>HWo5Bn-ecqBBqt-YtmC+KYagckrEjEU zfb=iJkKbk-yd14*#W_@Y1-}dapkAyUfu$RPyq_3c7KknV6U) zSjY0RvW}M11h%)guV24DcHPj>aAkSLNw^w95NM8~VKE0(cbfAy~t*;3&V$* za*BXuU6bqzG^%-ge0+HLk*@9l{Qv0DkK&^DZB~BVipZcSdL(vgUv2kF!#a+Y+m(bP zw+WY;C)s}=x)*dpiM);!u6|p=Ilz9Nk(aj)w2@UkX?0-yM6rA@*U;9|ve;uq_x}C+ z?Ce?9)#7Ai(Ez#ktE~8knw!x=Lv@$&8832n@vA&tlkcaz7jF1+YNs;yG@LKZ#+(*t zws4wO7A-C9>KbgqWdHM{#vlT?xiQa`v#%q+fB#<9`S`oN9rz6`4bAM_95Jn^Y(`(G z>~wo9kI>_P_5IG95*o;(-`20xeMbFflLwHf{!itS%{m`CypHiOWoA=?kB<+Q3=ph^ z&O{j`2@(w;6y}!btGd7c1(4yKoE#uLzy!Z%W-_4F5`;-;X;oQB;ijHEeq0ecHdKGn2VPPBimkPY$Vgjo9KEriKT+ zL*g^qAZ0IQ_@-<;xI@NkM$(_X1=GUaW0RAUdmb1VP!EJwK*?y;eGz;ulY)st zHPB4oosC~&hY^E7CQTRJUjQ?QHveC_e70$Jv^{t2+BK}DXt^}wDo+5e4nWBV^NcNp z@*b5s3>8`55PYl;KM0bhezt8A7;Igzu$_I8m>K=uUf_Nz&W@ak&x57vD=Ytj{0rVY zcZy3&VBkthOCKO3=pn@4xv{ss7Dq_75pi*TeC0Mt+Rk-r< z^7{%6KYoaU1mSrfs+^abn_<~wYN>37z&ni%mZSf!+;rGbRv$+(Q!U13niB8nFOh`7 z?9_khR;wHwXw2xRauGHsi9?8M&Ye^(EiFkr-~KvMaM0S?3Xn8Oti7#GQ9;4|iKd1| zR7{L7023e>K!vuRiA!e!#1a(z_#Z|*+aZx9tw0`xU9_-oVv|*N}!A}A3ZftB^-um(5M_{5!V$lj;oq#j`?djh2eEns8X+ADJ} z0bt2R(mk=ZzRAV)1WLBUUp7EV`-U(80NsP6g;R4k@v2_*c2!6lUU%N+K9nMLycHie zWC`0efRQHY3)dWih+KR9-g|nd9OQLSXekX43}EBgk1yLDCV`!@=gH& zT~JUEw5?cf;~(A!+|nU(X&!m1zi>5>xLG=em(!Rc?Q5K_u{da5C@3fFo4;;yz%Vhn zOqh|fGQs`*lY@=&CnKJF%l%2L{y7Zccke*pfeSd0 zSajQmj~{D2*FKk&?A|-x-P#HTObi?;Cr3q5(Oi8B=FAt!FyP4v|BITDB31D#K`t8c zlKmp;Txs*C$*Ho&Yd$HzP%t2<|8Aec*48%fK#}R4Zl2LlZVwc&-@n6FeoiA>Nr*gK zkIN_|;~n&!Ntl-2agmAF7_wPmURA$&2{2gH`>1%@A}Q19s}`jklN}S-37x-u(3lEC zb!)PBF=}d=g!D+hLM`tTN;CSJ0V**T;4v>*arrj~^NlrcrzFAV^|3l0%=9 zB0`Rggk(xL_^f;6PUH9Qw{Jza^|1voFZ6p4)AWxlS_@Zy7%;5-#mj@)Z?C09L@Eg= zxoN~aRg{&Lb#(6Dx#I=^0mLYyrPIZpw8Fx|)ir?BCe_dQZrz&yo26~ER2?f!E`2-Z z#oX_ho5~-tv9X0kM6TfAe2k6VVWmF&jyFR=wd$E`InP9+nBO*Co8fgM;=fJl@+~dR z(!t?7Tp1a*R#vmq)1>6&0^a+NZ+m>H^MOvVK3dsiQHYY>+uPHFkt{H80+P>8{u_vP z<+~caS_32ieb3c@g-&Cl=x%69P|ds#*2kXj%+pHxfIN2u8%f}Lgfshny{FsXi=|)T zKj0?`&kMQZKj+WFvvCtMZp{9^C4Yq^mHVhSyUH`}t+F46i3PB}mEgcXU6C-g(U-xW4)huvq5kFe$y!xjeqpHC zHeT?_^02BPT(|J-Z=q*7DIIYq$3#f!Mjx5r+b(wZ6>jf%v-`SeL&QBmOy9GQV|wIzw%z004A0F4{STgUZX64ict|A34(^UtzG=D#KFwc?ilBpPDJgv~4uWkw zKua2mo@=b`%TV7q3kJm#uFB82yMO+&w@XsT%+j1i5{@?)bP9Bi^f8+8g#H>#uSOuM zJ;;CSS=BrK{1MAvxJ<~-VbA`09SFHhvPIS# zPVH(Uwu|Y^{3kCxxDf~;MS|#px0_PQlD@Dbk2m};MsjNk3O2K21@7LxTcsLzi~QTqL3ToHN^!5i`6Phx1#_2`SYCg%<)(Q`9M}yH{T=z^~3kX)7pA2h=39n zFo+TWhs2%7#r<@hyRXts=^dg?C6=5Yrm!phbv!+5OOEEZ=`sw4yQp`mH{*41bR43T zrY3A1DR&+l8-pGLJ+W#nD+6;4#!EuI3_~q1E&?Ix9vGmz>p=dh0ZB~k?C3~FPOhS+ zHeUG3f9C6n;FqMDx32;G!h(hB{l}v4>C>mshf6%yh9~?^o&fr;#>0DI-TyHFEydF= zeyYN9yG<(1m}7LM=m`&I^~;QpRe257oer&VgXAyw;6Z43IC1sDr%#_+!YRGn-Niw{ zI6d52=t_^XJ=e^Bf$GAjdj6)xysE^-Ccy7|Zvr z?LKjfTxGg#Y6~9DYg5A1GjWQOrt1fYfJ+7?b|jH6)&&#GzkgqTe^dFHd(OtGN3 z{=V@>$T-LbK(39#uyJG!+ubb+^ziry7!xSQmfz{!dp;-sU#*;MNmMM?%YEc=ylbE5 zegy|a9Bw?qKYASxI6t#AWNtruY(bikkAo@!T#?IEqfWMNX<6CR z^o#LH4Wt35E+9E*yRToje!lBCJv|L8uDH1Ph>VCZp|Y()^U_GROB^zIFx60M2mkp6 zABJ29q{u?+GBq_-R17snQu3JiY)&@74DBTte9IrN^S@X~_V?_Rw{&*C*y)mTo~S*G zlscbWNS7xH;^p92X$~cOczX{X3z{+XOYLteOCp}wgf@+h76kjjbL_P;Dq+I+>$XOV zN6OVK03Pt7sjpxEo|R=>>+_r;kvFbG$a(zV@UUkY8yj1WexU_;6{A1ahm~p8NoxHs z{Gh30Uv2<80#{$(PFpnVsUl8=V}IF~U}EM6=bWr0{Q@RlvJ@2<0|4H>o5N#ks&p&m zRD?q9o~+w}Y2bI7*IV|Ej&;wrrUy;^*M{{qHG4!caIN`1lURGBSBV&!_}%D3iTWCYG;DOc!^2O)yZ2Kun|+SS62&dr_Fuc{UM* zP9YN(?t)~QDC*%*E(Z)Ok3h)>B=rtJL*Zdz*Kgd&&dvtk2(TZF%fBEEZS9?gSGcdz z!OieoAI-{#Jv}$Kun_!n#@gDN$Ecz{*ebxwNL(f@pT7SW%lnY;MWG);#Qg_zFJa)5 z53xxIf%a!tWf)U6wNB`}Riz8_^R?awc?;*TSZr);j14(CIbj<98MCvofg(S? zURIU?%|@=oqgOZ?W)i_{1fD?P6#}TmQ0#YicV!=laQ;K$)ZOGLryRD{O{ij3T8}H)>d)r zUT;c92b}(L=D1x#;KV}ZD_+r6Q6ZF8c=SkAP!RT^-K2yRpcH_F$P{o!9334A2*N?4 z1`7|2hTMgwyVZTkiscOj_Zd*JI5ZWWPRaM*1)?AS84E?+dCN^d;Cgz#5@qLHCFC4W9v( z3s53C35kfuGP(33NGG5oIu7Ij;WH?-cmVF{$xA)nuc6_}T@&bs0k#0LOXP`xTVGpKWa*UQtc_I5APbd6YrtZ$bp{6jHj|OTUirZ} zJDTXf3z>3wc$n;WykzKIj2i+NuaJHTNaoSWMjdD-ZOJ(S#73UD6IH&te5G*;8d@*p z!hh{O9V7csw)zN|et&fc7K!`%sEBA{QcTR;>@4~9>kdv%;~SFk@$q*B1mJf*smyQB zwU<903Pk;Qww3zj%a_1FX&akwRbm(GJ?{Sc^T&HDG*W4x-KM9vSnsr_FTK($4%vL(Y=k@U@*>s;r%yM?1$(M6ZVc?s*0H^Cf9PuDRpU}t82g@Td} z+;6u}z?MV|q z_T?!t?^u|opU)Z4hvMwFCt07U_Su_z6R?ak=*Ek8=B#RT)Qs5v*MvA>$GCfV;0iC5 zK~0a2Cac0{LZ6?XIKvF@mjTy=55S=+IuIsIwsUq?S5mqTXaW}b$y~Z}EGX-g+(y4* zpCOdF=@?zhyMAQ|qVSY%=i8BNNEnaFfGkk2u)AdLq%&=JP7}_cATTN*qaWI&Vh;-m zAS@sR;~VYm?NE)p*K@vn>E6+N4~h#u9$tzHi3-6JpKriHVbiT`iQ9euHfp7#IjF*Vo7A5E?Fy=;v>u=9dPgC9cN5`MTMv z^K-g)4Nb{4h6Z>ihnma!_FLQgt_Sr5?8%PL{k}}M!9p_W6y8}M6N9CSMiB)^M@1

oi2rIjf;lGok@|9EwohreZM?m!4iv&{VKz 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 literal 0 HcmV?d00001 diff --git a/docs/src/examples/groundstates/3.bose-hubbard/figure-4.png b/docs/src/examples/groundstates/3.bose-hubbard/figure-4.png new file mode 100644 index 0000000000000000000000000000000000000000..5befe8bb36c6a19a24a6a99d308d71aae047d2d7 GIT binary patch literal 36945 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 literal 0 HcmV?d00001 diff --git a/docs/src/examples/groundstates/3.bose-hubbard/figure-5.png b/docs/src/examples/groundstates/3.bose-hubbard/figure-5.png new file mode 100644 index 0000000000000000000000000000000000000000..03e3e7ee30f21c2104ec7ded3249a7a1d26f20a0 GIT binary patch literal 32117 zcmd43XHZmKw>8=l+Xe)bBsqy>5D^d&ut87+CFdv^Bu52_O^yl(5+n(d6a)k%M-jxg+L%k?%$JD zMIdmr5r}iKNF4ahiB?z-{6p~gfxIl@4EtY3?YlSxf*EmN_Kvz|>gq2K=}U`egd11A zN<>3fb26x$hQo0!8N>=cdz^58s;Gz_>T@`GZcC~6zQS$rf>wksCE;gEUK9Jug2Xa#Z@({DFAWfguYdmhs=gS8 zS>=w5P{^tBIT0VxASAYx5%u%4lc}aA)rba7;>^s9Mxo{l1N=;W zgQ}e#sk2yvyKx(b$87S^tK(nFK7ZD}os^zlZ`t#v{_Iqbmnu#>#VIQeZsf4PHQy0P zNE$B7N<(;-eLFG`=*cWt(4A zG+yuPYi9PgxL5#vk0b8Nl`CPgSx&QGmnKWN97br~zI`hzFMqZ(@F+h&-^9dZWMt&k zt5@}>M=Onig!`)_*FFA>H;0h6wY6Q+c`41TUE{e~_xx|@_)>KvqL=U1ty@>Gh8� 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 U=w?KR>KI>#59+FAQBPj|A5Fnj!2kdN literal 0 HcmV?d00001 diff --git a/docs/src/examples/groundstates/3.bose-hubbard/figure-6.png b/docs/src/examples/groundstates/3.bose-hubbard/figure-6.png new file mode 100644 index 0000000000000000000000000000000000000000..a770a1995a90e10982bd41499c7eea691237f08a GIT binary patch literal 15424 zcmZv@2RzmP`#yduq@s{yWSmq+MwyY3V;mtndlp&Qdx!J3N=IhN-kaz)2p5uPr_jO;_^$b#!M-!i?K94{kh#yKzC?gQ3H4unXp@gU5 zI|u4PUGN`*C$eY>#1ZbV#LpSw2m}M-p@f*KOYFiAR|oRP)n}JSvqVeqSOxs}P*cI#DO%0=H_XRsrNs*?g2MHCh91~UZuGB7Y3osuBL(5j-yqA)jT zTLzJ`oR62Vc5X3vcGg$QKZUPv+3(u0KISjClJ2b;&ECsNkRg|ZF-_$6=hMNMUff2K zoMtxSd%v|X;{4|zH7)IjD-$A-@-*@VO1s?ZM~PWq+}2wC1l!mYcy(JUsS&&YV4c`gDauh2=;Y{8FCI$1quI z1jB`A7(@{~q1<_CtSXrSY4jzKbar-@mzTFn5D(!*2tS1>m~fkPR{iK{2)HD=(XS#K z#r96r+sn)AaBrzbVL>rx;58NZ^rxlj--2=o17Fz`#40SpO(v!UAy?%zWnPg=r-fnX zF;^x=Mn)cNzal4%1Up!tmG@7Cak~yqvR$?s|`n0rhYug=%B+ zubrLocb_&b{`e#=E`APq>eQ(>Z{FO!d$*rinsD~phZF`v0Re$HLC0UBricn*9cuj0 zKkb|~v4W0s?3aX(_SfLk;{HT$L`t;snqSk(K745S*LC{qJBz{GpWHGC1OEqv3<|os zapmRCzYl7T4)-`~_PM<#ep*1}cpnobqB(Tu=I1$eDj4RAd8k8bYP`+OvpvscIL;3~ zioN${YL*)@LAd?njG`&*NP_p_$I-4zhuN@oqTYgaCbhR z?#zRi{U7cBtgfzZZ@XwFz&nlk-lrrdI|%CTZ7!TcQil)>NuJUnd})k`l_9}c*Bq32 z?rp-~jvE??7bLLq2pjtfG$8_EMeIX@K#WqKMj{XuyvIMV&{DsY$ims_zS2vtzJCCL zw7RwiQNH2!`2u>NNaNshj1_}9rJLcl`$N^c>nW9H#%i9P2Whg=g3gN`_B8%hs_R$u zF;fyA)y%vqqU(I;n_}O;ry(Wnnb^r0?Ub}=SdIH-cfEeQuQ89_pN~ji zXyoJJNOpdHeqtg6AKzeEMrGx&k>y?wnqJB6LlnuAC-+9Yr>6CGdFOvcu&5Y$QlL8o zNv2~v^M2&y+=wg_)*@4t&z*8|Pc%!j|HS_zkpnXp^ga6Uw&g}rIqBzIV&{!{9gnq( zr6wtSA*RAJmO{c``}y?fD9mZBX+P7O)9AAwc-93Zg%tRYHN8xucNF#%BKosBFxs!c zw!$zeh#az>3z*U|_dlY)l13jTU-g*HlG4jgl}J>;+-JBc9I4@!HRB!N##NeBGvc1< z5VEOTd^F+n@JhctW;G*l%GsRTJ>%lowv~k_UcL6(+FH&{$9y_`1cKy=x>fPH)1;Db z4$-xb60R2uJHy0IBObJ0Cs8tbJ3F?|!T|{Zwkc48#K@noXCR3rN9q)!HqTHB_gxK1 zrO=&8`MQBiyAlj|u%{B&+dlKKmJ2&WP$OzXA_LXfqI{m++-AFZl$y$a^LISSb<^3_ zit7#7u*9VCa0=daeWXuPNTZCm@{8{>NBI5Ovj?UF5mi!`#hC|?NF<<8(u-QRVX=_^*3^(aM3m)73$s9HSki3l<*Yd1-;k}wRc$OON4u+XpHyhp732H*=1^!7y}yol zlo0B+xTxGmf1<}zCDbyaZ0BC${$MFbYd_?DOT5<$j>5rle;OJ`#WbWP%K=AGw7{xnZ)Vym-lB-Z1w<4FcSu zdxlx$SYFf5vShPAt2ja^xcgCKmGIrL#*F3LRl+-nweC~`=#U9m%1R`#;dtVDxiv0{4!V~gSuHffMSn+_>UE9UP-8GqE8 zMwi5pjR)%rISYZ%x^(I|c;Ym*Cxrjq1M&f1X6uch(aljq+(PqM+zK}vulD@Y8TV({TbvDX?87$GVV{Jm*Png!{cA!8M`zh^TN7JE_xdQ3f*K5tQ9>*(ql|7dSg zp!YdAI9OzVS={)k)X7FB7m=0bMt2+Cka_fo_MVLa;ENisgNt-RF0;Ki_fitPc4x&e z2~RF9CA@w6ZGz2kcgqDmf?9CfPZyqi#yZ%fi$gEJqW6I0R zi|#)CK-7(&kd;!#^0DjXuz%XKq}nj_On=NjL?8W2$RAvmRT7WFNcterp-FT}LC7O4 z3w@8KfG^vDsiqwsmAuh)q76bSGC@r{3f@?A3a%+qu1Vf(-5Reo3K_ERkQkV*8>0Fb;?a{W96p3UYM6}(q+{i z#a=v4b>+%UON_rib%>PNh$)ZL(%6sc@4acVq6h0Lkus5CVO-|@nYp>S)t-B8wA{En zZo}A1QNxqoYYM>1ZEMl9JtZh8XsAFxx~xFIM#Qw60VVzL;X@mnLbV)#cC3-XB){h8 z_n^ecjMyFTzfFU%=abuULca zB)t+^ww-%LTI$C0jia}A6jWon-{(l}+8B-I0?zm_za_nnOSu+FnMC0)&mh%8 zPX9MukxEAXb;IPxAAbVDuPk;>GvT_kE%CqUl_5Kq>uL?*x}(tRe~z;>vrK}`$}18m zz9%W#1JBbfbhv5N*)2b5qE5LuRD{k4!ZS*t17&_b(f{TV7MZ0aE30uM*O7Sk$WJh8 zUzAsNj!wMudV`Bx$%-i?1I^VV%4$uyQUa>sJNr!B8x0X?>7{_1^lxN(!i|r!iPiyIuF4#Ksklv?Jxh0XCyn-qa&nR&xz=3T5R*Hgh+o zXHifu_}C5#CwXIH-=Z@g-;E$sRqAYn+1|8PXjdFkY)~{(5~myvTt9lC=ZNQ8nxw3X zRor>i{hV*!L9j7_!&aIhH$T6#v-9<}H&jVN z!Z^M6J~B9YVQyx&FT>B*my4U*!rZ*Ay*=a6d#6uca<{@6{m&v0=lcf+ltu_8Zf?CX zd(^7%ijQ|+%Qp*Ll&U5#fWDSbSh zGs^|dp{0zpbZFU`)2E>?S-@VT7x91;bNQCs%=h9y4VOf7pEm}HpH8Z&sbOCo=X;1WI7Iuqwj{LNP-x$jjChjmiKqodNEj% z~@Yl<$&K_oV>PQ>?jpZ5H!}$eY6(`_{%#t`Q4hdiOiPFV#JhKj!IKe8;fthgyW|BA zmg0ro^R-InqR_v8{YnkGjQnEC)703=YpSTEWV=4oqfHB~2Lg`nA_e<5gM*bEqd*@S~;P%h!7U3S#238og)xOCo2${0?PUSQsG^j?;R$ zf{1`YEdnL2rx#yPVEwzftgwM`Fwyng{=T|7P2bx3ug_}!sqRYXqfd{!i*EF*3};eh z?+KQ=6vU_$Rn>;Eb=h!e6$u$KkL4J)jQ)vM>{|V&IQC`Q42O8{=iszEoC&9ERFgA* zY5UJs?=9YDWgY(T6m4s}5 zvE~pOlacEA{7+WSnvtaObFj-+#5g!MA;rL&GwP1XRJ?@ChYUw_NY?%{hzIjY1_P#j zFO6dnxW`nG(iUno_52sIb+48jY>An_&$%%B(cic8VWWE;g zfQ&SHABEQp+ADe&T`_W3UT6kS6-|lg<^agAGEK%fxJ!Nx>}Y>t+P{MiZi40FT0 zB|Ux5cih-t(Dwry?}b^*+!7seG1;#26bjxOn76!aS!V0@wmF(Dx6z?fI@i;POHUcH z6}70AW2avJ3O{NNqtAM#;nWJbO;)%*itu;^e(Jp)I!AJhy>pKXiT~pi90JDcT~!PD z)e8CiKWI2q1Zt4gBl4;7H30B7cr_a}$|L<9#+jNkVnY7$!4NWpS7Tk z9@=t$nA}{+)@%tIL(69TR_+faNj7d>c$$T7$)eXQCD62^*W67~R!kb3%8|0g9`~v^ zoKZ_0&kJ0g6|pP)VPa4sIgI98=7PPwy+Z80q#jc`w;7~@LYGtmhu6`;mM_DX#zx1b zG2JnnbI9Y>ymszaf;!r`D&}utVxmE7*v;Q?x`kYpi@QW_kL_b@a|U)t?Yp2sw}f+U zKmApS?-_1OOsfZTHMyUEyAvsM<=QnJU0u)B$%lI>kbZ3q3=9B`dU$vou3){H@8h4; zRd+#VWsWpDL5EDhJ-tql1R?JMgj}2Mu(h=vDYrgaX{JYqP^Ufr3gcS5?a&C3m5h&r ztU@TIcE#;bBsP?ND0HmpYXqaTx4l8OMN7`Jq+m5{=unV`-D>PxY$mBjup-1(@6fYs zs%j1jJ9QtvAJw_JUz?lJ!g(|yV&IyJt=7G??qElXvXW;UrD8uSn^QA|NX^|d2ao1`>Z#-xw*-~!J$@Y zLw?)}RZG31RMOC3wv3L5AfgqFAPI|#Qq$6sA$%w=U+uDT9VtQH2sH+FLHNA9&q?=N zb+sLMN)}Pkqn0;};~r}rfuxL3-_IcvJXV7ouB` z3LXfQQ5%KKp;-rdk7Y44GqdNQ`447TVOlI2B^QKy`vxe5LW; zwM%Kn1o->&+48Wm%8apCpS0l2nP}$9-K-HfZ;ygpu<;feg>S(-i7|0o_ek%th+++$VXWu2{;LGymr?m9tH1 z{0IL!mL#!pjU}0<(5?4qg4cq|j+n|0FOTRz176=jwBvm%9U5gX4LjmERcvV1AOjA` z+1-$R%^;g6mM(;f^13I1hktGZQ{f^Nh{J3DIo~$NCotxu1MVbGRj9az3-sl_( zSov>eMXR>v-}*Txn+40{%sRs@(}7yM5aIg|Chu8Ni!wB-8PAepZkA(J;EmbWcpru4 z(ILg*)m|ZD7!{JF9{PXrUFB(%@*~~g{#0tOVx#*d#+(>nz@k4KnP5G4Up2%_0m#OX8t8V4&i-iZj@_5 z`tArc*ubu*E&%WO*?o)8v>X0?md@pYE%^;d{)h+mPE&1HKI?H>&Ts7c`uY+OJN^Bp zq^xW=+42THW-w9f^Y4k;Z|PzzQBzBRif-+__x_->&hM;NvZ2$F)e^%DHJxw$z()O)Ossv6>!(s*cfp00G_UL=s-95eiV63Cy1`9hh#hAsQ8X};k_vI5)k&m!RO6@ zS`=P<;eozy{%4rvV!(JnFV$=ChFdi%DD zipqdFFLLrFXLaD~*S9c2`^ycGUuuBMc5&H;-aaBO`DeL3a4FD&JM;Y&r4{w6Dknw4U19+Q{4L(|`V0k5=>; z+{ql6+uq*(^5sim;hjzSOV{ohe0oZC?Hb#UKhF(7U4Z_-_lG?EuDTf|A#7;o(ERV? zuX9LWhFB3#H{k3+F-VaLc_KH=$-=U-u@PBzu)j~Oz~Q_w%xlyV3Zf1F4+Q|foIwV= zf>6=xU{VjPQxoqLW3j{#WhrP2_Y8>~t<=ciU{zuQP{ zcX=PKZ4Bwx=+2wggx_SJ?!~_bPu3IV%^2>8R z=wOQ0_clkY69gSu+1V|>7a4=Hg$V`mMhKL!GJ+2uKHOHzWxy0ls6mmU(wY#i_xC9T zVF4lx*dhfey*pFU(0roA#eu?sGwT&64;}1y$2;zT5Azt@7v7$*U|eSz2sRCNAE|(l z3{xvK=Yhe1e0KM)ZBMe~vtohUw=Lk%z$5ib%^xc&c0&yCL*Efigkvxf_zJCM3jU~tLviuicH8ZOd(NuBFI>+8NT`kNzRPIn-1p?2=;5}wfkq>cblv8o zJdFLOJUGZ8lP2@R7#3JVRpG?br z_dW{>HHV}>gj!VQ6k4!t*_x|_RJ(VxSS;U$k!sqlYRr+I_n4zLr(~@!+5kE>w0lo! zEm)dekVK~6d;_u(0Wr1e7Q`y=%8h>hI;U2c z*CL3I+1c6FpJ3ZScXF5tDikI%s=KF8-&_!D9@)5 z^H`zP7DlWPijaksb$2EOdrKkyZ-fsd&-RqCqrctL8@WB{k`fYZdQ~ov0AJG(BM>Fe zlar%md3hOisy$qFb#;}Mm6ygor!}{^xVTJYjY1Qp-N8`UI-tt%7dTxL(8ia%kAQ03 zTpAZeB9n@Wip27CVTJ+2)t;Xkp8(@=jmxM7g4(m44_3qY+Z(Uz2n5Y6&I*M`tJrNNR&_P_Gpr8|WbJ*Wr0TC5w933bgKzHoJ!X<#dS+@f_#C!Qj?qIWC-m z9ccz>-ncEob#3}x$8?kB`3o10cDlR=2M1YcxcY?aJLB$m#qe4{A;QPUhXW4GfUxba zFR2g1tppfgHu_adq+Xy@LwaDqnDS85(nwmP_-u(^V z6LOr3kk3%@cmhW{t|C7|0REhikWi90G*6@dYP8fs-Og?`?$y=ENW`f87cRGa!@8Vx zodzv-PbEy`&mEOmI0man8o`WQlSg+4c#SmFTcRvln6};k$rd&a>hEwUgoK3Z>+2Vd5GR<<*Ca$Mq-pI>SIyqy zr_KB5*VlF+x=2tE$B>oSU zX{Ni*lt*SnD&>QCz{N6gz#oumAnD)2>_egh-FstowGx!=sf$#{&90JiQgv$z@KX0Y zwhK#ib##OrW)x8^z_=gn4%Ik8OIYWN-TQQPdcgh#k)85rt)$7%rGYx?L!t|A|0bl7=Ca{MCP*}f3{e?sDZN$vVM zTvK-O z?eD&Ej_H`%_tKhpMY8qZ$06YHR3}J2B`o2h4^Bku4rYE&TFFC+quvqx=M#A6dLR5x zzj1bM`MmI~$kOM-em*s=>Z*4vN%2S@-HxzYdFzy^NQbU||D-#d4I4841?_SRc>lP< z&_5dvFav4BeKY4+QcT=1_2EXHP~-ko(5l$@1z4Ryyl}VhiT+n}Jd1})>2X<}5EB)x zId#TLX>1kt8ftAIh#n*51z#^8orC4l$^GpMN}b)2B=Ey(i#IWEDTi%tkF|#tGvArq z)Z78F=-qjIm61D>q^oL5N-Gen9zf$><j?fDC)bba?r=drC1HFb!WICh)^zvAB~> zOd#$@02yf<+H)whe9ylzEPXjTZnXDX^x2+rMICq;D9FjZI_Lz*RkJhw9zzl-WBfrQ zHLi@<9V!G2j`;j}x5+nXukD{_BW0Wf32-l}2n*1kcya2C$l>NKv`T`o_E5g3E+URsf@Zci^J{e5&`|mB4sai&T~tw4 zmXVcB!@=6r)ElT4=%vgpEY2ap`y;2Iz=Y`^8oG=EDmlgA>+w;4eFNsNftV;s@@Wy*ad8AF!oz z-!MmW=8KNF-UeabI-fZdA!s-BdIB*tN^#hFvFWPtEF0fEWsi z8hcHE%W8}og-$LC7j`dwe)j5v;)0npF#LFRgT+JfM9C1_pA}@`7K!{N%Fo>+3u2&s9}_vA`H_ zf`f;^4{|1lR!IvW46z2tBpJ#!X8i-#9L*el*8c;@onF9h5_lj0{-)k7MqHrHTF&)n zU7%nCB~qu#<%3@n{E~dSvT9g&=`}J!e6ejPcWIT1Kzadh6Ea|4O3O=0R8YN}t!jIZ zg$00wm)#c-aBA^gh8P`A2k21aXe-tG8p`_m-cabuEJtMMrO;>qsJlBm$K*P6jBcO2 zK%BmIR|w%WT&QUNe!k)9dn<#LBvHAZHXHBS?38j+5M_vJwtW4^{AVwj`ET8ej2x3v zQLw08w)$xsGS)OH*2SA^l4a2nfo;hOnMfTD*tGtehtnZ?OxFwd48dWOots;Nk3vZs z7%(8e7~FXdgdohed_Dun`)G-KPausksEdi6Dt%;M(a&-$GMM#EUCl(4=LEThLU75adZoO}`#7Q)j&eo4m3UnL{! zP3#E1a+`uvZ!}9KgAx7u-V>1LCr+=bw^eu$%!WS5RLh|U=NB};mr?R@g1m6zL!?wx zRo8K9ZqBnPHq9qI)a8~Vn{{XDd4T2s@ElK3s_cJ{1G^08K<|^2rIJz)h+)y}+ERo) z^Bb`L03tywuJPF6LQ3pz`JAP*>4u#_WL~>M2n`%mDk@Zq-z5>#5pL@-A(S+Dz_K6b zTyxNa+=>*^#2Fj3FL>aD#S)=8_fIM#sty|&Wq0jmmQvCeZQB=~n&NQ6hYfLW`zKV~ zDxySBDYB*xX2#|CDBRG~ZoBGwOJ9XhbOOGZyiH`J%#EVjG&B<4)9*|O zh$tD>Mlr{#GMZH>;*&=D>?W|VSMdx1pJ76Q!yI>qa&vg3d%oObXLV=o&sjXY8@FzO zPhlIfHBcCK&99CHOb^Sks_$y4%<#p|-f=hsJ~*iE4+&?%9@%61wY^=%<~;5g133{b zwYIwYuY&+^m9@76*av!>-f^3NK>y^)6QlU|V9BycuT=8PvYb0JBVbIS;Fcc!fRnX3 zVyrpL4!sbdZ$&Roldk0#YqxiAL%f9TKyf&ek^m&f%*=ByF`1NV&Km6N^Om=W!KP!} z!q{)uMmiaW&SW6bVsiu|;!^cq{z0dR=k77ns;r`t(zCzwG_`LwHF=Sk(0934mJ`U| z&h~cM|1eaMzK;`q4fx)JHo33`a-1}ckB<+ej9w>4M@R6O(Kr{v`T#;@@v`H^<^5&G zn(9RP`5!FlBlnl8?Aud>-PSX+v%_#{A2KX84{XHzM4caSTAqjdu7F7a2YwW9dIBAw zX?41MoZI%YAu6!d2zqB=;_o1hetii7Ln0_nKt2Uqzv@x%o1Rh(H|JinJ&oB373TG-$iwaN!0U zC=p6^&dkD-`bN)XRH`EnCKNjQ*84+wCyoP|Ia0xAH~t=H(Az=|G+GIjN(Y&ia&Eiz zw{MI4V+Z^|;!!zF=#xR%0Wb8#ie6R}a}%ff`1cFD(SU;QA1f5)A;AlzCeTM>2AQ6w zX-Ayg1Jp*_M?D%W2h1Oj2FXs|H43l?@1%11qH{kUTk&jC45XO(PbJ*H0fN+j0-to& z)u()$JQ~FSEu5FcPP8Bn@g@!^hACoki9au3f9^7eKAYczZ*7|X8)lVax+DiCwZ9}4 z_NF2UyVTSNgAVTGGNt^M^DxY0E+C1LEk^%S|&q;8*eiutGJ%4OL+BrQv9n&!l2Gi}G9bT(K(Fn3gqKRG%17v$@lf@-%van9stQO9-+uhd2^ zJN@!4P%VU(YtLXvKI>VRYQb4C_bvhW(j~I@+{kD$j_9~8*?!Y@r`7X^o|;Yv2m{)3qmOYSFM0s-8Nu9~Wl;y?f>QU^w^5*25YVj7fZ+llYytrIqU#cuptBlcs`Ov?i0Bnip8wx51 z2Dj}2(|`EpT%A2W$?C^K@}lg|Y$bIR!~SL2 zkXm#7UG~Rf?aGYc`AJ_FF-dFtxGP`QaBty){qzw-L72PT(`T)usm`gt-pFVCiYjd3 zqK0%KVu=^UM^s9H@2};@_9yu=-gUxNk;Va^|FaZrxK80!H)enDwG?pvqpPDcoG145|e2G#v=IVv?@r!yjq@8~Q z^jNV&LEDoHE7X^w_eGoRZFdx&Q4@*F$G0p;uC+0e$Gv4VHNJN>j`@hx!fs@3ngZ8I z#!8SIk25-K{J-5E*mr!uau0-CVDev#oBE%=<48m&?*~}5TXxZ$L;`sK%Wd}C?s@ucM}9iDD4B?nv7u8%WMr#DpUB63>87{N7__Bt^b zC(u(cYImUMR2cC$2z5Qp`jxor!F+xX&hYl~&-Q4}BZv{|Yo0)7!kfdw!*RS97>>?{ zoPrt4?c0BRC6rHF3`miI5O6d#zg4VO9$3?REebwA^De2V*q&?+2Q;<5x=Iaf(b2*9 zk-!OfQ{KhoM(0?w2u}9S00HovR0J>tH+SFR%;CYFpPyga!oA~$wvd7&tvt1no?E*?!NHZ&fhzz^JbHS1`uUO>xbl)KXYI*f2V4b9 zQDI?Wb~Y={Xy}i@WDXp~xdHSZJT(2yo5ly$mlI#l#KJ;Hw~UzK*r1D939y-TbacHE z-3E7V+`LJOlDpLhu<0BU1P}0SDa-oRg}!||6L=Q@+=aj+mWM5ecDw;!34z*Q>k%cyQ6Wu$xoGbD_(sjO;K0Db1py$0 z;S$2-aA{L9pgeI(KXkH{ZVa_(Cnu+Xi?kqq=?IfdBvw@k@$;9108l0jZQl-2LdD#+ zyIof)v@Ia6d`xJ3(`I|_8jxwAYr~xrXKCrc5;O_k2ygGW_t631K4@8=Ur#!OE)~R- zP2zmL&(znhy^>AO^BXW{XJe}ZhDsM+l#-a32+ss|d*IBei)<9KfUR|%e;ALb=;ORq z+(s=Vi+{4SvVgh_4hs4?#?5$^00rwZeW~ljR)Ncy|9_7Bj!M)4$YP-U{eg+XTfq79 z?NAY1_hC0>cQ@vvqoapvyuJ5~uA0UJegZH*2%;i%=pl5%l~7AI(O`)J42wg^z!oBf z(7-MfOJOv1tk-iLp@ zQx}3RGf|L}f1~$YC>??pTT+RQm34J%i=UE+gYtUIn}`S_u6Ghja?{a9SW9{dY%dz`RHXzM2X+VXOR z-IR=>VbVcQcekRbsOVKcG^1wJe&bHz~%N;cHh{`G8&T{07iLMxy6Cx*K0! zU8pez!-(C2%Y;17!G&!oL!B|avgXgY-htySRupA`_PqZHM8Nj;y>ZAMum~4v_`ZJs zZC^D_LkRjOFLg*sUf--0sC8e!qit@2y);>Ty7un6`djB*59v%?La1{eYT6egM)k#a;BISAiisW5EK|t<5#l*ybc5>K7(B|(D)Pu;Q z{kP= z3((3jVZO!--)Cg>BT?4UqNbx8V_h0AO%~P7zs{Fu%DJ2dOb)QTG^-|4Rg(Bhh!-=Wt^tC0Xcsu!ecNbB@o+ew+3 z(&p)Xv*`*6i)}uq{f38!;k$K1LqktKyrL71AyL-UbcLM&m_&+tO)u)TI@t<(GYoAO z8?TnGc@~lt=seXp&KPmxj{BdRL(On+t{^MRc7qu)Q3kU-_d?A8)=fcZ1rK=xZmm^S z=?rHLn1_dlpF@IALd5&9s-zhBceo12L4E7RUi~YQ7k<#l8JU=juZDhq9u+)1v#|@Q zmxzY%FWl!En&0SE%2RtE8M*PdxJyk{)y3WYzV#QxGCg21o8?xfglhtJMsQn;c#|Fs zSNb(xy-sk#O0+CZO>wTL$E=Yh+;DFIY!IL`{%*!P&jp^E5CvX*f`OfVA?nhpmd?(_ zft=`thF7m%O->qVlSll8h-wK%UZlT{7zKK>mbSI4tE;0!*k+;@^q(IScV9s}TsFst zAqj7FSe~c@!v}#dC6Paf<|ePMAgsVRc`5>2^3ceF-T1v)&S%Ilpo@cl<2l;-@3)l+ zze~d+-~q_a%ZnUr`9|n#kYj>};P9bBzOd8EbAk(DV9x~Gb1{^rd$!33O0z-BWtZTt z=T&OzVYq6!$Cn`=HwQN`!u>BG%6%UY+GK$Hm*(plAri=4;%pA-4(d^cuPrULmzz%M zT<{^8cunXFqxWgb(FJqF*o43V abs2(expectation_value(state, (0,) => a_o ```` 7-element Vector{Float64}: - 0.31098779070601257 - 0.2881478589434881 - 0.2702000230423913 - 0.25712728516508654 - 0.24685385948652017 - 0.23539753899204166 - 0.22799654088348645 + 0.30974277430265373 + 0.28814775946586596 + 0.27020005963868154 + 0.25712729075508733 + 0.24685385782407282 + 0.23539787855732608 + 0.22799752254820496 ```` We may now also visualize the momentum distribution function, which is obtained as the diff --git a/docs/src/examples/quantum1d/8.bose-hubbard/main.ipynb b/docs/src/examples/groundstates/3.bose-hubbard/main.ipynb similarity index 100% rename from docs/src/examples/quantum1d/8.bose-hubbard/main.ipynb rename to docs/src/examples/groundstates/3.bose-hubbard/main.ipynb diff --git a/docs/src/examples/groundstates/4.haldane-spt/figure-1.png b/docs/src/examples/groundstates/4.haldane-spt/figure-1.png new file mode 100644 index 0000000000000000000000000000000000000000..31124b5a5ddb9cf04911c80c753d4fb676e55a9c GIT binary patch literal 34236 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 Ou6$lYK11%3_x}P>LODAC literal 0 HcmV?d00001 diff --git a/docs/src/examples/groundstates/4.haldane-spt/figure-2.png b/docs/src/examples/groundstates/4.haldane-spt/figure-2.png new file mode 100644 index 0000000000000000000000000000000000000000..f9d22360f133fc8811c5f63b8b04d9e047fbd663 GIT binary patch literal 32088 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

    >VQ!vZRplr!=+>tq{O&grFJkD$aFRYT2}vIX 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 JN!;Mw{{l5GIj8^t literal 0 HcmV?d00001 diff --git a/docs/src/examples/quantum1d/5.haldane-spt/figure-3.png b/docs/src/examples/groundstates/4.haldane-spt/figure-3.png similarity index 51% rename from docs/src/examples/quantum1d/5.haldane-spt/figure-3.png rename to docs/src/examples/groundstates/4.haldane-spt/figure-3.png index 8dfdfe224bb3a71a076634c0bde607650368d833..42c179c9fff8da1c4c5bb084364de02f84b0a6ec 100644 GIT binary patch delta 18080 zcmXY31yqz<*B-j0q)QMaq(woxLn#TRyBldx;Kcz+K><;bMiG(jPNfu(kd_qbRzmXM z-0x@Ibr;GEbKVpCseKH6k9qzMvt(HnA;-Zc;-=;`7~w}Z>ffha|2S4sVCDX?hKD6u)6-#oZ}-*L!$@o; zooW5kmVr?050~{GViTcIO@kvNadB}SZqAO5!nbbWkF?Qm*N;z3Nb}?hjT@!nm2M{e zcyx$E@n-dyikdpw`Js7=x{>j|#stD3zl(pH%K(Mi7NC#yoojpgTEH9^2WQ8!-pSGN zu7(ER_3JkT1t0qPMG$Fv-=L#Qma+Su=C`=4Ok+yrc$ZSHh$gVstj}N2o_}DVDJD9a z(5Q2s-X$-``P1hUmMytfOq938@87?@md=*U6(2kp{v1L2%dh>*7eYcp172!#MEFfa z-gAx~GcEU7GXZxN^B}oWE2Wd}&r*-~uZim)lsz0Lq#*iMvRz4h>uuzln%B>_8gIr6 z2?;4K9r5?|_3GyDRb5m5Ikk^9MZF^T%=J|Jd;CqG)EIJnt&(Mz_$d?WtZtlRK zpm7&p4UOIq3@pub$-La$(f!Vtn3$ZLoCo*s!&F5_M^6NiX!D!Y$@`?EEAxwgJahbj zm6(u#iHW_-{8%bws_4ZM;FDgzp2x2Cik5-F z>olb_;Ll>Z)Z=vNpt>fcX?kGb#?`Bqhud?mNCOP;-|p{Q^cseS|GMJYoSd9YsZJ)R z8_v75Ha-g*6uayfl|)90%7$ojy$s0u6RCOiB+~)|6&8`2Y9cF(idFtaFXOjq5*R3n zW}zgs{aNEd!*AkHZ6PKh!O6*qoM-R|2q63G$xohO`06Vv+6*BdG!A#(FD}~QhPLKE zFnP;OXcdrAGs3Ah5S>Kjy|%U%u*-RuGxzY|1BOiT<@;=h{$N5I9!r7uk);<g1sd*I5^lK zzQD%HD$kKvZ%5=}YC4tXOf4{VE3eS#l_WiXmC(nLxUVU;N-CM-8;5{ ztl)&Yx<|{Y^X3Ul*Ow>?LtZ^~ z^=HqX^%NRc*VzqIqB12y(Ky%)X`1%Jw?87?4qhbU&evTU{=NNpC&b{!jT;+r_mYKd zzrMU~nu3Gs54!l^dy0zhH&~)GO*6t|4>qS_&exoXD?18bPgY#lotwChLdo)q#*pEQ z2qp8%C!7ubXcK#5s99N2#=)&aV_j;%)`8nMefceSQj+`qI+=}+m5IHR)$UP!I4Be{ zMSn3>tiGG+Ud`J=~49~SEHjC^@#sQ#!a&aL!D1Wa#TTx29Zx@+hN9+^NQ&9%Fq)mTXUBu`ca z&QF^@?>GM=Y&mTPiR0~$8;>46QjEZCz|##w;bS>EI_m4|%gD$$=uZvJnHt~Me5MpF zR9c_yzWI@pcY=ma(}Al$4z{Fu^>mO!t$yI8B9dFX&U}R1yIp;K9Edp0tduAkb^_-2 z&r=(gfhJvLKJLGWloXXr7&i_$X2Pm^BlHB`Hh16stgVYtzxJW9LM6O{*Sjz6$1ST+ zjC9z`P}y64{*)A(V;#8Oa(kh%+k?@nPt2-->raj(jnaT`@evL-jXF6d3WYL#KSjdM ziY^&{sEjUo0&hi7C~tD&!YhY9je_QHjk?M_p;*B7XeOZKh1X}sxQtbKt^AsAJNGLX zJX$QlV-|5);~&-B(6b<>h8OfJnLIj>ez^H{w}i~dC+cG)zM-b2+In|Wdb;8g%n=kw z6lz&qQ&aO`FkL8Fol=SY+O^0ytYDf8%ty&0`V=$~2=dfKzo69#K#7;PApcj>6+ZYG zDn#pO1BZu?uXkn!`TaEskW9jF^JEGkL7{@lqqCEfllS)a6!9=n_$4!DB_^h(%+i7W zz#xA7_yK4AY*Pjgg=${z&r&cmGy9${#U_rAk`3``XME`8<)y7X(D?X3at=`>fJ4Z` z&#$SjzCP0|Ga!dTp=0fF@}d0f{{EKACiUnq?M=H&Xci?UB{;MQz*DN2m;c@pYPJw6 z*QwWeu+M`B_ar3l-Md#~*M84JC|SP5&94=WQ}4TBROfyD|9@jf_~px&fuW_c5fYjU z*g0BSdYl~Yyh2`4TU-AkXH(|7etl>4Ic5vRV?Q?;ABS@bQ!yNZg+nnrQP!Z%31STm zjchN1XKMtb`mQEZvhIpwk(IT>XQnrfj*b)~R(sy5Jde8~^;K-J-fzpW+>S}Yw+Bw^ z*w~wo7AREK&IWpKWhi%fdAXpVAUr($?_cl0RONTQ=~AZ0n^X0ws;cqv@lT#SX>Dx< z5YEYYs>pg3Up{xp*x0yq61Dw&;qif6x~O-+i{v+Opjh6KUE9#zc$ukPt$T%>Nkfn^ zQmRJE?e*d<1uC)2XcpUl!lx&VI*C`D5=$RYA=yeXqRj10WSbL}-+FpndfwcC#h9$| zc=z`0+saB|xd03ldSf!?r{k@+FzK0cp=D)dqMiChCgV_%3=I5dTb^9k{qXYDtE%H) z9v&Y2{QRM~#GW1=;}wpH&z@a!M`N|HAy>w3&nTNdv)1gdj9|^*_cAo3dy>_1>4?T=U};yUAYL>cqf$`*H#&?5l6z)XdDLySgI1Bzbtgb#--hcIK))zXG_V ztEE-)Pk@Pu30ux>s;<(yGw$O@E;Y4pbT{oDo?b?^6gxXO7?ikVmBvOjC1shqABQmz zC~_W|HU(jS8yxifv)Ef~)@W2}g(E$Nz@Jxt`ZotF8Sn-G`5git1jvWU_RSxb$UeYCAi-@Tm_&D46I4KbZ|_qj=~-n5ah&la0_+L=Ogv?42VdNg<& z2qpl!{(}cf%F3Q`5n*9rPoMIcHHb<`OioP&!5IOj<%%%o8{(t?u8#vRysxUdO7jPW z5(OzRon91qv$oUIOHnaQ&e^aes5}35v7Uf?t_*%%#!2q{Q0~3h*jNz}kug(a^ECgx_=y*^$(8FXJ={gQNHFit~= z>*)(bJ@g*B=-f`t|6;*tt)D@|mrJ!$7T2?eeBe z>s#Ms1b#%2GT*v&Yx}u71w~?ZHf#Ec-Gc`YbajWu#tZ_1e<|weQP=ZvbE~q(A1?Wj ziE>5H3vkTdhr=RurfTRB|Fkfuf6QZ}sIirh8fh+ke73ZMHEtH2%EoHN>Pa2_@87@E zqdhjRA6vVLIBJH5wY9Z$GCV2D@A5u=+`dJNGW{~y$@zHw|G;O-4n!tkGJ#GC4rMRAPLJ4BUI!B7GaZ)~gIezZhUO_Y>UzH~$ zxV!Dj>!o|P_F-`FWn?7I$=NwFLM``VwAg%de0=9(i1yu|gsst>>{GR-x(}!pmKQcQ zh$$#$1Rg48Hl?3s568$*FWtFw=kPDWP{QsL1IlZl_AKYa2jv`{o%+hk%D|==Y!p-X z*RRnsk7gS(uKSwB)stMdP|UdDcv7Ak_{89BZpyDEeku2Tr6`GdwnLCKRfatc#|%HH z# z@boLNo)o z^VpdG${@R~?QbYh`5!+%W0DZz<>h5%od*`)+uN%ULBcNX`1;Y#?(Z>2FX#6aMpQmu zzL^<+`j#qFXRe?Sx@Et?j%oJt3LE?)zQ)U+STPCQS|X6Ei>~u11koq<=&^l!ba~EfRdo&efTCJ zFYmhVgVr~1-uSGI^rngpwY0EYzkZj6L)RZxw8On;A^NU8d1bN0kKBdnJ-QqF?eA=~ z2i)DC;vYsgAyJNUzFAMdBAPXiXId`Z5@g{Xe6DlRX$mWt1DmVR$vUB+ne*!^3ZL_TS-Y8UzOqr-U0-nYf? z>HByCSwM=k^>t)dKh@%PYnW3~{*8*n3Qo#6XL-Ip3PjY_);9RntJGsptR_sH7(9Nn zD04C|x(TVvvx9voTZQ#hi69AUU!xt*w?5 znbKb)uwLBui~s7!YPjtnaIDYeRI-^K%LSBTzdsw*`BAsvxOJeD^5m0o5QODu6Pt^i^KcZTCPGZcyibyrdD{`+%T^NVRmUCdKm%!dyg+S=M6 z;jdp8gWuH`0YF>Au)n{Lk3Kv)0+VNHadCfjI3^_XWNz+rg#DG@!-(c{6-7ldY)ePO zz^dI8@$XxoW14J)l9#=aP8mYa+9Ecmg??}k?J(LjI~mzKbhqS#|@ zBRy+)SUBQ?aEuf+B|LDuv7@f0#>P*HYF+?n5@~$Y(O9cBSzYxEy_UWv@ob!}gNQIOF#!(%3lr0K zYr62mhmi+){{~*aH44lADm=zoXk=`xcIOHT37-1fPxn%mco<_sXH{s>sLV;h$FT1* z&q(3P{=GBNH>?XZKrWVwOayrOwx))xcE1oz1^&iE$*8ERIsun+?ff-AuUBlQ!5V+( z+F*s_(ER*-%?JD&pcg@*AD+n^0M7$Qczuymh?a)x1a1~g<<7S6$lZ&VEYc3W^0WIU&HJ*0VDv3M*0uf3;>by8D zuc%0lZAp7@y_#9fZX%LYVDLgZYvP5pSPRmE9t1}a88d~?YjiS4 z9|=}=0$Hx4^t3kMO;wc$1P_Pof0n{FWSH~C`tID9r<5bpyIDT(ZP_!iJhM}sX+d6m z;zeau*e-l0*P$&v7_}Xpl=Q&P?n8O`O*9J~9o@*th$81@S}-BtyX|O zw>>iovM|5e49N()8I?PB&0cN(#=?p5_sYE|E#}~zl+4L`>_cy`uz?jj5)HNKGQ%a5Tm_^f2w3zNdQJwp zB1dL#Zx1qyfP&-x{rl?al7>1up5PU3Zf+`eVx!2y)j6z<3D5OliR~>c$f`L#JJ7AY z;hP#|Z_8}I6SJ=tn~JG<^P{jYkK|7n0T-EXkEs{Egvy*mquXgtf`SOkB*8H^(uSnx z##l$k;-m}~iXMP07zZcD{6+UdQ_%6{vS8+0ny19y4U~(nT>2VFo%J@hmNMhSxNI>*`%Zpx#n{`TdQxR|2f!G^i8I|GkL% zmXBtghv1N#D4L}ge^An5ZZna>mG7Kh zgbDBb8dRl||1c_q8AR^Y?CkGSpPWF<$;;BC4ln=bGRY`wXb=}V4&^wh4i5`QMq;64 zz|w>`s*{V0>x~0<)WXaX#U80W-<%*p^efSH3ejwHcEky(^9-_Yg6zqj1~eCNQ;F#3@mxgmD)rmDbSEP;UR- zGY-hGda7t?S((s{8#^O~#^CmVfdj5XwicJ-Q%V!?Scqf-i|o#@6xA{1$hd{#j7|dk zm!oRw@)T9DGS_4;k}(>t=;+8u7X0jwAD8Fn+y1=(t$=0$$Mfv$3;~}AzBo8I+@~An z9?>6Oc^sGiiLM0GS>JqRLSOB`|IcD1%a=n)j!)BI(b%8T)YK1qfKcmNDID&xVX6K8&iMEq(FH|;u>7Kui>Dr zv`P@!1B{DIvMsdL0z3&X@K8W8rTzkM<)*N3&VU2JLb`~n5yWftGMnq`>u}QM<_3VL zE5%R)8TL_f$a+^igq1gM=D}|GCkvo8Yyl&L?1DwGNEQ@cd_jmIis$U?45Z;~b4mit z|J%23lafA%A@d_<4K-6UWLK^vi?AY2%zb~j)5)zzhlXc~N@X=k} z-8eWng@)xHK7F!U9n4XK9{{1@6u%A$5HNm}tUs8$1qP*9q#;pT6tFES3hD_%5Ol8_Uy7(ayKirv?}X%4u8+ zl3YKDdU!tvCjj)@>0dHgPq;h*;&n-5J3gAHSrjLi3vyIHNUCT0q}DZ zYinx)f+&7Xc195O!NE;X>jvboA9#3_LfuBor+8(e1VlweY3b<5)8;z`X`g|NiIXlS zBq9Qtc%4#}CigPEfO!*mf}8`_v4@wwXN__B84;mk zWAnbgUIHFxFos5e1G$%;nwADHlM{9x;Z;%TOujiMq&Qoz{zlMpd$#qz6BsEAri`$V z(5Jk-tKyNF02^?C!Gfn4kgF3I`vCI^h};QvVH*oZ7#WAcCTOrkY0oyQh?Z_|Kg_;) zf?{K1Q&CX?*A@nM4Qe?N5s`uX-yv@waUWM#*WU{Z0JGSk>FMc>jg4UJ!{{z2t8b2% z=SD>lz#o!cy`ttdW+=M*o%FEL;yM=>v{A50OG{t7_8!~{zpZKHA~uV- zd<`sn_zP&Ef!ye0QWDjV0%m#Ec&Kw{|CTbK$K%z@mw#7=BGfr3mX&!L(Z&Da6Ia{qW%f(Bf8PIqp=*a{pDrr{PtaWSr334PgOhU!PA1?roR~5EnD)0f?KPd8R)MO|?y9DN+9kar`Qqiv_0eKx z>6?f98^-SLTVh^|1t9y!{7;H&YDC%CKDV~YnVT~+|E%@0x3O7(3}O!1bqKp!H&+?j zZ9~E&{$qT6d~(uQRh65S74!TuWEu;zvnAG@Bvur=wGc4@egF_w1VQk2S6jOjc-5LN z!HWm^de?!rBqzffOCo2C%=YEu0QsrnKHN{nQO%a+<3!ZFTH4w`72v3LfBW{C*-9um zI5-$q58)KNa?ZoWRRUiX6)#`EW|r{fT~Yuc`yw&%TX*+W?iAU`s3`6G_bWFLJ$ zI%xID4Fl+OFoa&E(cH_FkXV6pg5(z#DrrM*;0?_*sn3J|?J7NZK(!czasx65Tg%7C z$3^7$xy%_p3CUt$MMcGZC8eCQvV@QRfpM)CKrxsl{mGOD1_yO;aGrKPXZDh|{Pv2^ zMBw_Y_fj8|lvE@9gi@*6b#ifbw&kCLmsdGB)uU>Jb(dtQ3r>#@5Ik(`SwETJlaFBE zT7Je2yvD_~3?ZtbA_WSh9hl|dBd?7XyH{JoSzcXR`}{TB_eOHh6{$zF0!Dgzuj1lJ zM!niTf4=QH@#FUZN+x?~1*i$or?DxB&!AisE%6$b*}!Hqy#kOc>d`hi$df4+V({AX32|LN10_IA2UxJwjq%reqmi|VY|7{S~IQ0vEH z6A~^9C7-Mg^PFV$^r#CZo9O7Ery9MM`p`H;_>o;R+cYH~KH%05Xm`>}2Oh#nt-HlI zlV4QSA^pXDs_rSN9+Y}6u7^_P@85sX`2M|E?K4Kx#q>jH(|7yQzUzxMMO5$az#UP8aOR7kN)B_ zMBG+4R_6d}EX0TK#d>fNGI!XWSXLL79kel8=hKHlNx<*B3f<+le>F+Ia*whEiEyAF>8UwKSt4qE#JNoF@z!2%$AXE z{#^S^I7$P+b|D=BjG6sKM8khAu^ZBI;8`RjB=BTmISbZ@L^WWiX}?ph43bw?4o9Qg zW{~r#%35r!v(-`qUN*LO#|K+p(i6~da`kE{qzyDQG~7w5veGRxaZC~&VyF71riGcA zf{*uI?%n$y9*&ENgc4wjq-@O3qnT-ywY_2X0gGXO%lNL-K54~Pdi1ESwpMJ3GAlg1 z0}dJ#T$!LFMGL`@t2GwCmzGjeQhupKflit(HkauWe&jyW6dM^i){Mvm8dW+U?{8q? zk+`_IDQj22CQ(yc>q)+udM|TmrK6*xzi0w%Xk;i~U*JUc2)1kNvu7n(>$Dt+Q7rfs zJpJTF0YwuNM%Z$hratd;a(+XvTdHx!!(J~X0RQM{`TEr^5KFaYsUaaDP}k@EDl00~ z)zvdicL-RC^mKI-8ylsn?%*3Qjg5^txVy`^{j33a#|$NihPlPY#U-H?Y=O29=E-VS zsI)Mf`I@jx$SGgU{5w2!nW(r6UX*cAyIr};Gg{Dm%qP4UluGwfMKLxAE%rAiJO4eW zTLk?8SavuCy%F;DPNT5<0muQ0yKFqc@06ZyM$Qip{nvfLwP}x`At3D9x=cXA}(VsK4tt4M30XlDxPJ^hf>MH((>a6rFr@#)M9HW9?&F6v~%)z$;^YWR@58rg6iaq3D27yk4+1#*S&J3`zp>9u1Vr~=6k6KvvWylo2 ze;>x=c!A2Kq>$~WiTkX=vz92m%cOvn{~=MfO$!AL0CX1{WxFt}>1i831_z4%0Ur z++T`%4Mo24_#Vwj=@F<0IO7Jx)8y1KIr;g=zrVfqWd^u~of>XYE%-(C}w4EAK~7Xo{%8)=O zy8`xmLCOH!Y_6^z9ql;>zEFO5{rdIFsh5nBfrnbajx%a089t7!ZE?k86BAbE4v-l1S_m$CAHnBoQ?~c9<`opI59N}Y z5agQX<>gTl;?xg5R8ne(s-#Uh1zRXh!taebM^%R}&}mnJMI10<%Ezx>y$aw1#slEt z&svIOm)(N{mGkp`u-Ac`j+No|Bd*{85Yq|0uc)A`mjKttap;4Glsz<0^cRVH?k?PI zxDRe%cXxMAZmyT~9F$p)nv2L|NUnfsAD+K>IAOslDnV^G(-d^u9hpwO<#^ebUB!P-ymh!# z5Ca1P96oxPU`byZvlchtbbZs)ueFEhr+= zaXbXBHLwrS=4x20Z2*64oCRn2Sm><+6a!vv&=oNB|=*Tg@oRUda$mC4i@e1dKNijLz(OP`qe6;Sc@_? zF3$Ji!;r=aiMG9c>+ zuTEdTa7LNn254d4FCro(jqt^psPz1;3d2~(%tP4O*@3%_-Q8s>oWM;jiK~1#C%?X# z#G?;(Cg>cn@k9^0v6;kt*WUn>tn!hFRVE@J(ALufb+HE&Iw}sgNll-zHTu~zm&sDF z27q*077pJANd@wxa>GFFHGexj_wrBpm3OXP*1uQr3x$z z_$sY;m7q@Sewma6_Tq^K2KE%p_hMgKOpvZ)wKcQ~Ui9RB!CCOT?e-I&l(dujta`E( z!oN}lBn0Ihmv8-qxox<#<@x-ofo#ahEA;T-;AL9c<&~B0fH2gW!J*9v_-&<9fpW%x z9>XIeX7#>&(iBg8c)|W#e=`I8qo=nQ8sqU}yPIF}8AETD&*_m*V7vH8>2}b@_cRH6 zXJ?{ON<7-4{GXtj%$tML{xt9{8>BfPk7F}048H>26MpZ4K99x_2r}WrQYAuVJ1=WB z=UDI=lvoVDzw2s04n>EHo&ERL7AUC2l@)^H{i-!UZfMp$+-$6Y)^}!RW*?uuQtQsu z<>i)PDT&Jr3~QU4)BBf-o6paT@80e1?RA9|;MJ>F4~0EK{{8tbqk_cJKON0mUw1J# zpMhYoN!h5(0Xi%3sREd~q^>4Vo98O=7`2_+?h z>phVduEGYiq(Vm=wV3Y$l)87yv2AYU1_dBbG%}=vwx%1^ITG8g*f}^lzI<6&T)fPX zkO7x&fY>nCn}VhdK0Sh7P)qYONWdUnezf^htO&<7Q{r=6F;FZkCg+g?L%0wCCG4<| z3A&kRXeP(TTF480VNX0$=P++Zf|-;CfbkYU(NP)zwDIV(00kp!{$nfxmXA8*~*h*Kf zTmk*xYwM(gLXn4E1o9j#H0?|i(xAMZPXm4d({0%~$-rhfeJLBzg~G5Z|>E+^*& zHr=Fs1`WJAT$Fx(2U!XcV2OG58KPPU)(k+d+X&Jc^g=r^txRwrh@Yk<#^7fd7474t zB{UBK0RSQ{&RtQOY>rNrsSoy=0g!m0mxu8`EI)@Qy?hxK9&Y6~x50@-`s)q zsd|y^j1-$c&vsBy_`E#u4yM!wT1w%|B;yW9p4W+qpMA+hJ?611^5YtUj`cJ&Hb7CN zhQhF+OtyU|X1?vlSivLLnSyS&5ef|rEoDn}Wd?*sKzLrbKCZVFDqX&nFe@|2}`OUTAK<^CjaDGjkLnwKSx7|{knxyqRRqx)7fAtDl zX%%rOC?V|u1>!te3MUbGpUQo1jI!X6(IA#wXZdxcElyldM`sWm zE-6V#i>+UMm6N5gHQ|BbJY~Oo7e&ayHL-D#UqBnLkg)L6@4O**RaM*KDxrh|01^j*ZpWf4{QcVph+z2K=Z5!;`bDyj;MvE^NxJ+S<_A_%m*oyaMGM`HdT;FvpON z9vvP+;X`JBfnEg`)#$gC4tLv%&t7Rk^WZ&A%{aJ_RqrPt&Be-^0GIw=ybwgr0x`=8 z!T>3tz1Ke=pb;EKJ=x-x&W)eM}rjwis9?S?`e;G0}i&pd#EIeudZPa6Vz}+-WKTl8ATO6}Y=|3uf-dZzQ_)6>J zPqbSI!X_%gQAqnvh4uyPc=h_Vb@jXKY?xsP!jQ;V>_aVo|C;7znb9(Cjzlr=r$Mek z!l&`}R(D$)W_{hwS@|3t;P{jL_aQ#IAtdDK>uc5=+!!0%3kC~*ROdOrNsWcIbts}U z2W%Tme_;r_;0hWrQxIxomq|}ZnvF^fct^l-fXh>03W8m*|L>3edJ9q?6GLQ@zxKEx z_;doAqQSJjd)E=z#8_lq-4W2Js5lNfn0cp2>N}l03Ey>m zgox;KUnuTIS!rqO!4epw0NfYXERXaaJvwT8N(6x2RV&Oxh6xV61uIEX z$Nb*dX!Q7{{P*1JDKzqwR5h}}r8QuuP}vTL4zphoaT)k$R zI0AX$O-iNaz<=3=g{}|+z~=DZws6rszG>eF#xOZ!{BtP1MMjl`^{lHvK<`|;=tX@h zKMt<5volX(_xfZts7dFjID+8U=G+Ds#`vpOX3+5_?FlCZj(}BlvO0&0^dtdwjIiV2 zHSmr5V&*~pkxmlRDIwY}h78O2BXXywr#tZ=QP-B2XZ_}I))xV>0R=(+JbnJN&Swp* zj8qy`$ZYF;H|WV%uw_k5QWFy?q+O5Tyn`R!r$!MBh6nVA+Ku7NX{FvMc=gGIoR81Sou82ZQiR*3rb;1$p+At~7aZ2%@I78qCme8zF^ zPGEzaf^f&c!Ug$i zRmyQM-Nn`xherAE1I*3ifB?8;Jk|IZx~oN`rLVYpF%qFPH+&2F`}-mPXiM&!dFR@B z@k!0Wr$uIssutXG18$uY&}abZb!ik4%a`B+3t{B;Z7?Z-+5ia+2|=yDyzPQxuBsXh zZt^}%X&0zCy#j+L*~{=g=wN`!|7KSXsp3c}^gmdPYb}Ah1$;xB(zL>10CH|aUh4h* zZ{NR<4h~K<1l%0Jz>tCT25!)#^-!Vve4ql0AN1DBvlKM>aUQ@bArJ~c(GW?Qf}51k z0}0$JN9}dlxQmQT^T>!EbVdN97BDEuEGpWp-h9TL2|E%(w7mOJCLHYS7MYO~a_Eh* zvhoCT5t`w^pT5{Q6BEkNC7Jf}9?)SHd>vzB9uAHw@ISee9xZf{!;5BTXF)n7zeV0c zHpDFM%_Si4eEEHdfXjFp6x_SeR{*RZq$0Qv{M_7xBqSaCjCg50*RQY4G&jST^YbC^ zk8W;0hlCBT)Of*m0;U)avjlknBr-jzVvtqrz>I*!0KF|xcOhdpU6zO$1B_69ex=t& z2*l|nc zWGIrx#%t^Ak{3=>(?EjvOM(o zt_ep3>=0-Qg~n7829chQ4rq0H(rN+R{*k|b1DxHeh;@#pd<&rBH88(pzJb7}hx+>= z|7r4G(YbRc658$<_t$?yHVp>S^IqgqHW&DidD+=zpfPlFH9@3qOgE-L>b3=p4Twm) z9d6!zZeMgeqyeK`JMF!qEQIgtTWERwYL!p0OO@(x|9t*Jwx2b32|}Z^?luL1#E=Rw2t!PH(ca! zpd|XAWyS=)vj8^?+y+20{~uxg+WHgKOQ_ z)s-(*Y>a?Db_A>t!l!KkxU!I=l@e)!y9nJZ4*F?#)YTydfL+$10#+_utt*+lgp1`X zvnk!AUBaR9mJ%*BzkVH&mNP7z9M%DA`*&{-E;Kkl>L)`UX)4{6clj!JK~t? z1OIu#ttQa)+0b45kcKx<=^Ly997#w}GoH&}Gp(fn`tA6PK)w#@JylIE%Q}eSY#$QT zfzi=}KYupVUw_HvBUd!wb<&@&4k1He z{lL>|W=O|QO+iN>*iQd;+0Vj2@8;>|&g&~=?&*LTDMG*!s~;o%2g2}BP_8|-Ubu;5Qc+@~Q1wD`}@URzm#{5YJc9#CmHlALWj zx79K9LZsfheH#$Mbp9U2N;d@`pN8==$hd<1Qc>FHNaWcE*M#797$tHd$hb-C6O z0WK+UkP;kz@Oy29#JIUvVcP;r7rc4%^T8hKVltm%r>@V~W__?J!sEkAAsH{zlpnJ1$R|zg;+*Q(4ERwfC{~wR0 B7DfO7 delta 18122 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 z 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 diff --git a/docs/src/examples/quantum1d/5.haldane-spt/index.md b/docs/src/examples/groundstates/4.haldane-spt/index.md similarity index 93% rename from docs/src/examples/quantum1d/5.haldane-spt/index.md rename to docs/src/examples/groundstates/4.haldane-spt/index.md index 8fb8dee4d..1f3fb8891 100644 --- a/docs/src/examples/quantum1d/5.haldane-spt/index.md +++ b/docs/src/examples/groundstates/4.haldane-spt/index.md @@ -1,10 +1,10 @@ ```@meta -EditURL = "../../../../../examples/quantum1d/5.haldane-spt/main.jl" +EditURL = "../../../../../examples/groundstates/4.haldane-spt/main.jl" ``` -[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/quantum1d/5.haldane-spt/main.ipynb) -[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/quantum1d/5.haldane-spt/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/quantum1d/5.haldane-spt) +[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/groundstates/4.haldane-spt/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/4.haldane-spt/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/4.haldane-spt) # Spin 1 Heisenberg model @@ -128,7 +128,7 @@ E_plus = expectation_value(ψ_plus, H) ```` ```` --1.4014193313393009 - 3.851708855717825e-17im +-1.4014193313393004 - 2.2233521403023605e-17im ```` ````julia @@ -139,7 +139,7 @@ E_minus = expectation_value(ψ_minus, H) ```` ```` --1.4014839739630844 - 5.800167584873572e-17im +-1.4014839739630827 + 6.744598315147384e-17im ```` ````julia @@ -188,8 +188,8 @@ println("S_plus = $S_plus") ```` ```` -S_minus + log(2) = 1.548622723541372 -S_plus = 1.5450323530299226 +S_minus + log(2) = 1.5486227235423025 +S_plus = 1.545032353055433 ```` diff --git a/docs/src/examples/quantum1d/5.haldane-spt/main.ipynb b/docs/src/examples/groundstates/4.haldane-spt/main.ipynb similarity index 100% rename from docs/src/examples/quantum1d/5.haldane-spt/main.ipynb rename to docs/src/examples/groundstates/4.haldane-spt/main.ipynb diff --git a/docs/src/examples/quantum1d/5.haldane-spt/spt-tensors.svg b/docs/src/examples/groundstates/4.haldane-spt/spt-tensors.svg similarity index 100% rename from docs/src/examples/quantum1d/5.haldane-spt/spt-tensors.svg rename to docs/src/examples/groundstates/4.haldane-spt/spt-tensors.svg diff --git a/docs/src/examples/groundstates/5.ising-cft/figure-1.png b/docs/src/examples/groundstates/5.ising-cft/figure-1.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4c4239a270672cd30f0a4367c5c19564646a9d GIT binary patch literal 15044 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 OgqVo5Z~^kQ=YIo`O)ud9 literal 0 HcmV?d00001 diff --git a/docs/src/examples/quantum1d/1.ising-cft/figure-2.png b/docs/src/examples/groundstates/5.ising-cft/figure-2.png similarity index 100% rename from docs/src/examples/quantum1d/1.ising-cft/figure-2.png rename to docs/src/examples/groundstates/5.ising-cft/figure-2.png diff --git a/docs/src/examples/groundstates/5.ising-cft/figure-3.png b/docs/src/examples/groundstates/5.ising-cft/figure-3.png new file mode 100644 index 0000000000000000000000000000000000000000..8b55ec3c9cff7942fa1f7d882c8e02fbda11652a GIT binary patch literal 22801 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 literal 0 HcmV?d00001 diff --git a/docs/src/examples/quantum1d/1.ising-cft/index.md b/docs/src/examples/groundstates/5.ising-cft/index.md similarity index 63% rename from docs/src/examples/quantum1d/1.ising-cft/index.md rename to docs/src/examples/groundstates/5.ising-cft/index.md index f634da5ff..e61ab7587 100644 --- a/docs/src/examples/quantum1d/1.ising-cft/index.md +++ b/docs/src/examples/groundstates/5.ising-cft/index.md @@ -1,10 +1,10 @@ ```@meta -EditURL = "../../../../../examples/quantum1d/1.ising-cft/main.jl" +EditURL = "../../../../../examples/groundstates/5.ising-cft/main.jl" ``` -[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/quantum1d/1.ising-cft/main.ipynb) -[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/quantum1d/1.ising-cft/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/quantum1d/1.ising-cft) +[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/groundstates/5.ising-cft/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/5.ising-cft/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/5.ising-cft) # The Ising CFT spectrum @@ -126,24 +126,24 @@ append!(momenta, fix_degeneracies(states[17:18])) ```` 18-element Vector{Float64}: - 1.0963150642957372e-17 - -2.4157081442786943e-17 - 9.150251499481629e-18 - -0.523598775598299 - 0.5235987755982987 - -1.0471975511965979 + -6.835457747908734e-17 + -1.5823223400041525e-17 + -2.117254204162227e-17 + -0.5235987755982994 + 0.5235987755982988 + -1.047197551196598 1.0471975511965976 - 0.5235987755982989 - -0.5235987755982993 - 1.047197551196598 + 0.5235987755982993 + -0.5235987755982985 -1.0471975511965976 - 1.4597368636872088e-17 + 1.0471975511965976 + -1.3705449793358471e-17 + 1.570796326794897 -1.5707963267948966 - 1.5707963267948963 + -1.0471975511965979 1.0471975511965976 - -1.0471975511965976 - -1.570796326794897 - 1.5707963267948963 + 1.5707963267948968 + -1.5707963267948966 ```` We can compute the scaling dimensions $\Delta_n$ of the operators in the CFT from the @@ -177,53 +177,7 @@ can reach higher system sizes. L_mps = 20 H_mps = periodic_boundary_conditions(transverse_field_ising(), L_mps) D = 64 -ψ, envs, δ = find_groundstate(FiniteMPS(L_mps, ℂ^2, ℂ^D), H_mps, DMRG()); -```` - -```` -[ Info: DMRG init: obj = -1.946908612087e+01 err = 7.7434e-02 -[ Info: DMRG 1: obj = -2.549098951719e+01 err = 8.0439536934e-03 time = 2.57 sec -[ Info: DMRG 2: obj = -2.549098968635e+01 err = 1.0703227324e-06 time = 0.80 sec -[ Info: DMRG 3: obj = -2.549098968636e+01 err = 1.4373447563e-07 time = 0.98 sec -[ Info: DMRG 4: obj = -2.549098968636e+01 err = 1.4665972881e-08 time = 0.42 sec -[ Info: DMRG 5: obj = -2.549098968636e+01 err = 6.8081026722e-09 time = 0.44 sec -[ Info: DMRG 6: obj = -2.549098968636e+01 err = 3.7573810815e-09 time = 0.43 sec -[ Info: DMRG 7: obj = -2.549098968636e+01 err = 2.5698292651e-09 time = 0.43 sec -[ Info: DMRG 8: obj = -2.549098968636e+01 err = 2.0113551709e-09 time = 0.43 sec -[ Info: DMRG 9: obj = -2.549098968636e+01 err = 1.6427286008e-09 time = 0.89 sec -[ Info: DMRG 10: obj = -2.549098968636e+01 err = 1.3479784013e-09 time = 0.55 sec -[ Info: DMRG 11: obj = -2.549098968636e+01 err = 1.2769471445e-09 time = 0.44 sec -[ Info: DMRG 12: obj = -2.549098968636e+01 err = 1.4168057275e-09 time = 0.48 sec -[ Info: DMRG 13: obj = -2.549098968636e+01 err = 1.5595217750e-09 time = 0.42 sec -[ Info: DMRG 14: obj = -2.549098968636e+01 err = 1.6950091915e-09 time = 0.41 sec -[ Info: DMRG 15: obj = -2.549098968636e+01 err = 1.8105744613e-09 time = 0.40 sec -[ Info: DMRG 16: obj = -2.549098968636e+01 err = 1.8924908787e-09 time = 0.96 sec -[ Info: DMRG 17: obj = -2.549098968636e+01 err = 1.9288336151e-09 time = 0.49 sec -[ Info: DMRG 18: obj = -2.549098968636e+01 err = 1.9133807885e-09 time = 0.31 sec -[ Info: DMRG 19: obj = -2.549098968636e+01 err = 1.8713994972e-09 time = 0.38 sec -[ Info: DMRG 20: obj = -2.549098968636e+01 err = 1.7813737815e-09 time = 0.41 sec -[ Info: DMRG 21: obj = -2.549098968636e+01 err = 1.6542099689e-09 time = 0.40 sec -[ Info: DMRG 22: obj = -2.549098968636e+01 err = 1.5039369007e-09 time = 0.40 sec -[ Info: DMRG 23: obj = -2.549098968636e+01 err = 1.3441838671e-09 time = 0.90 sec -[ Info: DMRG 24: obj = -2.549098968636e+01 err = 1.1858446625e-09 time = 0.28 sec -[ Info: DMRG 25: obj = -2.549098968636e+01 err = 1.0362811206e-09 time = 0.34 sec -[ Info: DMRG 26: obj = -2.549098968636e+01 err = 8.9963099646e-10 time = 0.35 sec -[ Info: DMRG 27: obj = -2.549098968636e+01 err = 7.7760121034e-10 time = 0.41 sec -[ Info: DMRG 28: obj = -2.549098968636e+01 err = 6.7030150822e-10 time = 0.40 sec -[ Info: DMRG 29: obj = -2.549098968636e+01 err = 5.7691780289e-10 time = 0.41 sec -[ Info: DMRG 30: obj = -2.549098968636e+01 err = 4.9618146296e-10 time = 0.91 sec -[ Info: DMRG 31: obj = -2.549098968636e+01 err = 4.2666435281e-10 time = 0.36 sec -[ Info: DMRG 32: obj = -2.549098968636e+01 err = 3.6694816435e-10 time = 0.40 sec -[ Info: DMRG 33: obj = -2.549098968636e+01 err = 3.1571200436e-10 time = 0.36 sec -[ Info: DMRG 34: obj = -2.549098968636e+01 err = 2.7176974363e-10 time = 0.38 sec -[ Info: DMRG 35: obj = -2.549098968636e+01 err = 2.3407977700e-10 time = 0.40 sec -[ Info: DMRG 36: obj = -2.549098968636e+01 err = 2.0173966270e-10 time = 0.40 sec -[ Info: DMRG 37: obj = -2.549098968636e+01 err = 1.7397391951e-10 time = 0.40 sec -[ Info: DMRG 38: obj = -2.549098968636e+01 err = 1.5011934910e-10 time = 0.87 sec -[ Info: DMRG 39: obj = -2.549098968636e+01 err = 1.2961022917e-10 time = 0.35 sec -[ Info: DMRG 40: obj = -2.549098968636e+01 err = 1.1196457020e-10 time = 0.38 sec -[ Info: DMRG conv 41: obj = -2.549098968636e+01 err = 9.6771723038e-11 time = 22.14 sec - +ψ, envs, δ = find_groundstate(FiniteMPS(L_mps, ℂ^2, ℂ^D), H_mps, DMRG(; verbosity = 0)); ```` Excitations on top of the ground state can be found through the use of the quasiparticle diff --git a/docs/src/examples/quantum1d/1.ising-cft/main.ipynb b/docs/src/examples/groundstates/5.ising-cft/main.ipynb similarity index 99% rename from docs/src/examples/quantum1d/1.ising-cft/main.ipynb rename to docs/src/examples/groundstates/5.ising-cft/main.ipynb index 54e1b0ed7..e21dc19cc 100644 --- a/docs/src/examples/quantum1d/1.ising-cft/main.ipynb +++ b/docs/src/examples/groundstates/5.ising-cft/main.ipynb @@ -197,7 +197,7 @@ "L_mps = 20\n", "H_mps = periodic_boundary_conditions(transverse_field_ising(), L_mps)\n", "D = 64\n", - "ψ, envs, δ = find_groundstate(FiniteMPS(L_mps, ℂ^2, ℂ^D), H_mps, DMRG());" + "ψ, envs, δ = find_groundstate(FiniteMPS(L_mps, ℂ^2, ℂ^D), H_mps, DMRG(; verbosity = 0));" ] }, { diff --git a/docs/src/examples/quantum1d/1.ising-cft/translation_mpo.svg b/docs/src/examples/groundstates/5.ising-cft/translation_mpo.svg similarity index 100% rename from docs/src/examples/quantum1d/1.ising-cft/translation_mpo.svg rename to docs/src/examples/groundstates/5.ising-cft/translation_mpo.svg diff --git a/docs/src/examples/index.md b/docs/src/examples/index.md index d56cc7397..c1fe9ad9b 100644 --- a/docs/src/examples/index.md +++ b/docs/src/examples/index.md @@ -1,15 +1,104 @@ -# Examples +# [Examples](@id examples_index) -## Quantum (1+1)d +This gallery collects the full worked examples that ship with MPSKit.jl. +Each one is a complete, runnable script (also available as a Jupyter notebook, linked from the example page itself) that goes well beyond the short snippets in the how-to guides. -```@contents -Pages = map(file -> joinpath("quantum1d", file, "index.md"), readdir("quantum1d")) -Depth = 1 -``` +The examples are grouped by the kind of computation they demonstrate rather than by the physical system. +Within each group they are listed roughly in order of increasing difficulty: start at the top if you are new to MPSKit, and work down as you get comfortable with symmetries, infinite systems, and the less common algorithms. -## Classical (2+0)d +## Ground states -```@contents -Pages = map(file -> joinpath("classic2d", file, "index.md"), readdir("classic2d")) -Depth = 1 -``` \ No newline at end of file +### [The transverse-field Ising model: a complete ground-state study](groundstates/0.tfim-groundstate/index.md) + +![](groundstates/0.tfim-groundstate/figure-1.png) + +Assembles the tools from the tutorials into one case study of the TFIM phase transition: finite-ring `DMRG` versus infinite-chain `VUMPS` magnetization curves in a single figure, plus the entanglement entropy and correlation length of the infinite state across the transition. +The natural first example after finishing the tutorial track. +**Level: introductory.** + +### [The XXZ model](groundstates/1.xxz-heisenberg/index.md) + +![](groundstates/1.xxz-heisenberg/figure-2.png) + +Walks through a ground-state search that first goes wrong: single-site `VUMPS` and `GradientGrassmann` stall on the spin-1/2 Heisenberg antiferromagnet, and `transferplot`/`entanglementplot` reveal a near-non-injective state with several almost-degenerate transfer-matrix eigenvalues. +The fix is a two-site unit cell together with the `SU2Irrep`-symmetric Hamiltonian, after which `IDMRG2` and `VUMPS` converge cleanly. +A useful, diagnostic-driven example for recognizing and debugging convergence failures. +**Level: intermediate.** + +### [Hubbard chain at half filling](groundstates/2.hubbard/index.md) + +![](groundstates/2.hubbard/figure-2.png) + +Studies the 1D Hubbard model at half filling with fermionic `InfiniteMPS`, first benchmarking a plain `VUMPS`/`GradientGrassmann` ground-state search against the exact Bethe-ansatz integral for the energy, then imposing the full particle-number and spin symmetry (`U1Irrep`, `SU2Irrep`, with `MPSKit.add_physical_charge` to pin the filling) and constructing the spinon/holon excitation spectrum with the `QuasiparticleAnsatz`. +Combines fermionic symmetry sectors with a more elaborate ground-state recipe (staged bond-dimension growth via `changebonds`/`OptimalExpand`, `SvdCut`, and mixed `VUMPS`/`GradientGrassmann` refinement). +**Level: advanced.** + +### [1D Bose-Hubbard model](groundstates/3.bose-hubbard/index.md) + +![](groundstates/3.bose-hubbard/figure-6.png) + +The most comprehensive ground-state example in the gallery: works directly in the thermodynamic limit with a truncated bosonic local Hilbert space, extracts correlation functions and the correlation length as a function of bond dimension, computes the momentum distribution, and maps out the Mott-insulator/superfluid structure of the phase diagram from the ground-state response to an applied phase twist. +Touches most of the ground-state toolbox (`InfiniteMPS`, `find_groundstate`, bond-dimension control, `expectation_value`-based observables) in a single, longer study. +**Level: advanced.** + +### [Spin 1 Heisenberg model](groundstates/4.haldane-spt/index.md) + +![](groundstates/4.haldane-spt/figure-3.png) + +Distinguishes the two symmetry-protected topological phases of the SU(2)-symmetric spin-1 Heisenberg chain by restricting the virtual `SU2Space` to integer or half-integer charges, then compares the two resulting ground states through their energy, transfer-matrix spectrum (`transferplot`), entanglement spectrum (`entanglementplot`), and entanglement entropy (`entropy`). +Builds directly on the symmetry machinery introduced in the Haldane gap example. +**Level: intermediate/advanced.** + +### [The Ising CFT spectrum](groundstates/5.ising-cft/index.md) + +![](groundstates/5.ising-cft/figure-2.png) + +Extracts the finite-size conformal spectrum of the critical transverse-field Ising chain, first by brute-force `exact_diagonalization` on a small periodic chain, then by extending to larger sizes with finite `DMRG` and the `QuasiparticleAnsatz`, using a translation MPO to assign a momentum label to each state. +No symmetries are used, which makes this a good entry point into the finite-MPS workflow. +**Level: introductory.** + +## Excitations & dispersions + +### [The Haldane gap](excitations/0.haldane/index.md) + +![](excitations/0.haldane/figure-3.png) + +Computes the Haldane gap of the spin-1 Heisenberg antiferromagnet in two complementary ways: finite-size `DMRG` with the `QuasiparticleAnsatz`, extrapolated over system size, and a direct infinite-chain `VUMPS` calculation with a momentum-resolved excitation scan. +Introduces `SU2Irrep`/`SU2Space` symmetric tensors for both `FiniteMPS` and `InfiniteMPS`. +**Level: intermediate.** + +### [The SU(3) Heisenberg chain](excitations/1.su3-heisenberg/index.md) + +![](excitations/1.su3-heisenberg/figure-1.png) + +Reproduces the setup of the SU(3) `[3 0 0]` Heisenberg chain [devos2022](@cite): the physical site carries the ten-dimensional `[3 0 0]` irrep, the SU(3)-invariant nearest-neighbour coupling is assembled by hand with [SUNRepresentations.jl](https://github.com/QuantumKitHub/SUNRepresentations.jl) (MPSKitModels has no built-in SU(N) Heisenberg), the uniform ground state is found with `VUMPS`, and the `[2 1 0]`-sector excitation dispersion is scanned across the Brillouin zone. +The natural non-abelian counterpart to the spin-1 Haldane gap example, and the only gallery example using an SU(N>2) symmetry. +**Level: advanced.** + +## Dynamics & finite temperature + +### [DQPT in the Ising model](dynamics/0.ising-dqpt/index.md) + +![](dynamics/0.ising-dqpt/infinite_timeev.png) + +Quenches the transverse-field Ising chain across its critical point and tracks the Loschmidt echo in search of non-analyticities (dynamical quantum phase transitions), on both a finite chain (`TDVP2`/`TDVP`) and directly in the thermodynamic limit (`changebonds` with `OptimalExpand`, then `TDVP`). +A compact introduction to real-time evolution and environment reuse, still without symmetries. +**Level: introductory/intermediate.** + +### [Finite temperature XY model](dynamics/1.xy-finiteT/index.md) + +![](dynamics/1.xy-finiteT/figure-1.png) + +Simulates the finite-temperature XY chain by purifying the infinite-temperature density matrix and evolving it in imaginary time, then compares the resulting partition function and free energy against exact diagonalization and, via BenchmarkFreeFermions.jl, the exact free-fermion solution. +A technical, comparison-heavy example built around `MPSKit.infinite_temperature_density_matrix` and imaginary-time evolution rather than ground-state search. +**Level: advanced.** + +## Statistical mechanics + +### [The Hard Hexagon model](statmech/0.hard-hexagon/index.md) + +![](statmech/0.hard-hexagon/figure-1.png) + +Extracts the central charge of the hard hexagon lattice gas by finding the leading boundary MPS of its transfer matrix with `VUMPS` (using Fibonacci-anyon virtual spaces), then fitting the CFT-predicted scaling relation between entanglement entropy and correlation length as the bond dimension is increased. +The only classical statistical-mechanics example in the gallery, and the only one demonstrating non-abelian anyonic symmetries (`FibonacciAnyon`) in MPSKit. +**Level: advanced.** diff --git a/docs/src/examples/quantum1d/1.ising-cft/figure-1.png b/docs/src/examples/quantum1d/1.ising-cft/figure-1.png deleted file mode 100644 index ec004e5a0b06d3d4b2e0ba997d9410a9b1332789..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15484 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 Z#}kjwqDiCzL4HCA^Gm$V<$Le;-vB(=O@ROa diff --git a/docs/src/examples/quantum1d/1.ising-cft/figure-3.png b/docs/src/examples/quantum1d/1.ising-cft/figure-3.png deleted file mode 100644 index 8f76b9208301d347170614d6ceda14e34139883e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22799 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

    3r%rG+ABF52ibdLb!<-*(}f@);VM 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 I&}W7J2ZMydKL7v# diff --git a/docs/src/examples/quantum1d/4.xxz-heisenberg/figure-1.png b/docs/src/examples/quantum1d/4.xxz-heisenberg/figure-1.png deleted file mode 100644 index f5e4a5ec20b392c7829aaf4cc658779666f717bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11462 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 Q7)(Z}C~DlwLp=!m4;1MVCjbBd diff --git a/docs/src/examples/quantum1d/4.xxz-heisenberg/figure-2.png b/docs/src/examples/quantum1d/4.xxz-heisenberg/figure-2.png deleted file mode 100644 index bd8dee7003b6750963e3ab40a66ea3455ec5d36f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19339 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�}cQ4>?i4EU>ho9yQS)|3! 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 1) -V1 = Rep[SU₂](1 // 2 => 10, 3 // 2 => 5, 5 // 2 => 2) -V2 = Rep[SU₂](0 => 15, 1 => 10, 2 => 5) -state = InfiniteMPS([P, P], [V1, V2]); -```` - -```` -┌ Warning: Constructing an MPS from tensors that are not full rank -└ @ MPSKit /home/ldevos/LocalProjects/MPSKit.jl/src/states/infinitemps.jl:160 - -```` - -Even though the bond dimension is higher than in the example without symmetry, convergence is reached much faster: - -````julia -println(dim(V1)) -println(dim(V2)) -groundstate, cache, delta = find_groundstate(state, H2, VUMPS(; maxiter = 400, tol = 1.0e-12)); -```` - -```` -52 -70 -[ Info: VUMPS init: obj = +8.454690130663e-02 err = 3.6812e-01 -[ Info: VUMPS 1: obj = -8.807747096663e-01 err = 7.4524923622e-02 time = 3.77 sec -[ Info: VUMPS 2: obj = -8.858788324414e-01 err = 6.9171953600e-03 time = 0.05 sec -[ Info: VUMPS 3: obj = -8.861621536444e-01 err = 2.6767683452e-03 time = 0.04 sec -[ Info: VUMPS 4: obj = -8.862392626495e-01 err = 1.6032192901e-03 time = 0.04 sec -[ Info: VUMPS 5: obj = -8.862672547653e-01 err = 9.5323528320e-04 time = 0.05 sec -[ Info: VUMPS 6: obj = -8.862784830480e-01 err = 7.0061763044e-04 time = 0.05 sec -[ Info: VUMPS 7: obj = -8.862834114803e-01 err = 5.7030493713e-04 time = 0.06 sec -[ Info: VUMPS 8: obj = -8.862857129161e-01 err = 4.5154675114e-04 time = 0.15 sec -[ Info: VUMPS 9: obj = -8.862868209497e-01 err = 3.5140725914e-04 time = 0.05 sec -[ Info: VUMPS 10: obj = -8.862873648329e-01 err = 2.6806862728e-04 time = 0.13 sec -[ Info: VUMPS 11: obj = -8.862876338388e-01 err = 2.0070574932e-04 time = 0.11 sec -[ Info: VUMPS 12: obj = -8.862877672196e-01 err = 1.4816530119e-04 time = 0.07 sec -[ Info: VUMPS 13: obj = -8.862878333408e-01 err = 1.0821757653e-04 time = 0.15 sec -[ Info: VUMPS 14: obj = -8.862878660733e-01 err = 7.8417469213e-05 time = 0.06 sec -[ Info: VUMPS 15: obj = -8.862878822601e-01 err = 5.6494124158e-05 time = 0.07 sec -[ Info: VUMPS 16: obj = -8.862878902612e-01 err = 4.0537829957e-05 time = 0.06 sec -[ Info: VUMPS 17: obj = -8.862878942156e-01 err = 2.9004225089e-05 time = 0.07 sec -[ Info: VUMPS 18: obj = -8.862878961706e-01 err = 2.0708366147e-05 time = 0.07 sec -[ Info: VUMPS 19: obj = -8.862878971378e-01 err = 1.4762413368e-05 time = 0.13 sec -[ Info: VUMPS 20: obj = -8.862878976166e-01 err = 1.0511055800e-05 time = 0.03 sec -[ Info: VUMPS 21: obj = -8.862878978539e-01 err = 7.4778223881e-06 time = 0.03 sec -[ Info: VUMPS 22: obj = -8.862878979715e-01 err = 5.3158051331e-06 time = 0.07 sec -[ Info: VUMPS 23: obj = -8.862878980299e-01 err = 3.7764425487e-06 time = 0.07 sec -[ Info: VUMPS 24: obj = -8.862878980589e-01 err = 2.6814072095e-06 time = 0.14 sec -[ Info: VUMPS 25: obj = -8.862878980733e-01 err = 1.9030014616e-06 time = 0.06 sec -[ Info: VUMPS 26: obj = -8.862878980805e-01 err = 1.3500577199e-06 time = 0.06 sec -[ Info: VUMPS 27: obj = -8.862878980841e-01 err = 9.5735794398e-07 time = 0.06 sec -[ Info: VUMPS 28: obj = -8.862878980859e-01 err = 6.7863772480e-07 time = 0.06 sec -[ Info: VUMPS 29: obj = -8.862878980867e-01 err = 4.8090393886e-07 time = 0.14 sec -[ Info: VUMPS 30: obj = -8.862878980872e-01 err = 3.4067956729e-07 time = 0.06 sec -[ Info: VUMPS 31: obj = -8.862878980874e-01 err = 2.4127441738e-07 time = 0.05 sec -[ Info: VUMPS 32: obj = -8.862878980875e-01 err = 1.7082422697e-07 time = 0.05 sec -[ Info: VUMPS 33: obj = -8.862878980876e-01 err = 1.2091935762e-07 time = 0.06 sec -[ Info: VUMPS 34: obj = -8.862878980876e-01 err = 8.5574898934e-08 time = 0.05 sec -[ Info: VUMPS 35: obj = -8.862878980876e-01 err = 6.0549094354e-08 time = 0.13 sec -[ Info: VUMPS 36: obj = -8.862878980877e-01 err = 4.2833729305e-08 time = 0.05 sec -[ Info: VUMPS 37: obj = -8.862878980877e-01 err = 3.0296142094e-08 time = 0.06 sec -[ Info: VUMPS 38: obj = -8.862878980877e-01 err = 2.1424846144e-08 time = 0.06 sec -[ Info: VUMPS 39: obj = -8.862878980877e-01 err = 1.5148957750e-08 time = 0.06 sec -[ Info: VUMPS 40: obj = -8.862878980877e-01 err = 1.0709953737e-08 time = 0.12 sec -[ Info: VUMPS 41: obj = -8.862878980877e-01 err = 7.5707891268e-09 time = 0.03 sec -[ Info: VUMPS 42: obj = -8.862878980877e-01 err = 5.3510570418e-09 time = 0.04 sec -[ Info: VUMPS 43: obj = -8.862878980877e-01 err = 3.7817943502e-09 time = 0.07 sec -[ Info: VUMPS 44: obj = -8.862878980877e-01 err = 2.6724193960e-09 time = 0.06 sec -[ Info: VUMPS 45: obj = -8.862878980877e-01 err = 1.8882939261e-09 time = 0.07 sec -[ Info: VUMPS 46: obj = -8.862878980877e-01 err = 1.3341314150e-09 time = 0.11 sec -[ Info: VUMPS 47: obj = -8.862878980877e-01 err = 9.4252990942e-10 time = 0.06 sec -[ Info: VUMPS 48: obj = -8.862878980877e-01 err = 6.6582278922e-10 time = 0.06 sec -[ Info: VUMPS 49: obj = -8.862878980877e-01 err = 4.7032251942e-10 time = 0.06 sec -[ Info: VUMPS 50: obj = -8.862878980877e-01 err = 3.3220639408e-10 time = 0.06 sec -[ Info: VUMPS 51: obj = -8.862878980878e-01 err = 2.3463502230e-10 time = 0.12 sec -[ Info: VUMPS 52: obj = -8.862878980878e-01 err = 1.6571486183e-10 time = 0.05 sec -[ Info: VUMPS 53: obj = -8.862878980878e-01 err = 1.1703442495e-10 time = 0.05 sec -[ Info: VUMPS 54: obj = -8.862878980878e-01 err = 8.2650109655e-11 time = 0.06 sec -[ Info: VUMPS 55: obj = -8.862878980878e-01 err = 5.8367474734e-11 time = 0.05 sec -[ Info: VUMPS 56: obj = -8.862878980878e-01 err = 4.1213417017e-11 time = 0.12 sec -[ Info: VUMPS 57: obj = -8.862878980878e-01 err = 2.9101697547e-11 time = 0.04 sec -[ Info: VUMPS 58: obj = -8.862878980878e-01 err = 2.0551179926e-11 time = 0.06 sec -[ Info: VUMPS 59: obj = -8.862878980878e-01 err = 1.4510549999e-11 time = 0.06 sec -[ Info: VUMPS 60: obj = -8.862878980878e-01 err = 1.0245548104e-11 time = 0.05 sec -[ Info: VUMPS 61: obj = -8.862878980878e-01 err = 7.2325909689e-12 time = 0.06 sec -[ Info: VUMPS 62: obj = -8.862878980878e-01 err = 5.1092588216e-12 time = 0.12 sec -[ Info: VUMPS 63: obj = -8.862878980878e-01 err = 3.6043616497e-12 time = 0.02 sec -[ Info: VUMPS 64: obj = -8.862878980878e-01 err = 2.5462748087e-12 time = 0.04 sec -[ Info: VUMPS 65: obj = -8.862878980878e-01 err = 1.7984804673e-12 time = 0.03 sec -[ Info: VUMPS 66: obj = -8.862878980878e-01 err = 1.2696913652e-12 time = 0.02 sec -[ Info: VUMPS conv 67: obj = -8.862878980879e-01 err = 8.9456922075e-13 time = 8.25 sec - -```` - ---- - -*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* - diff --git a/docs/src/examples/quantum1d/5.haldane-spt/figure-1.png b/docs/src/examples/quantum1d/5.haldane-spt/figure-1.png deleted file mode 100644 index 5d8edbbce382990db34b736598b756254f3ed724..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32871 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 diff --git a/docs/src/examples/quantum1d/5.haldane-spt/figure-2.png b/docs/src/examples/quantum1d/5.haldane-spt/figure-2.png deleted file mode 100644 index 1df134303b1bc1c9099bfcfd8322f961099235e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32025 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 dim(left_virtualspace(psi, x)), 1:length(psi)) - D′ = max(5, round(Int, D * expansionfactor)) - trunc = trunctol(; atol = svalue / 10) & truncrank(D′) - psi′, = changebonds(psi, H, OptimalExpand(; trunc = trunc)) - all( - left_virtualspace.(Ref(psi), 1:length(psi)) .== - left_virtualspace.(Ref(psi′), 1:length(psi)) - ) && break - psi, = find_groundstate(psi′, H, VUMPS(; tol = svalue / 5, maxiter = 10, verbosity)) - end - - # convergence steps - psi, = changebonds(psi, H, SvdCut(; trunc = trunctol(; atol = svalue))) - psi, = find_groundstate( - psi, H, - VUMPS(; tol = svalue / 100, verbosity, maxiter = 100) & - GradientGrassmann(; tol = svalue / 1000) - ) - - return psi -end - -H = hubbard_model(InfiniteChain(2); U, t, mu = U / 2) -Vspaces = fill(Vect[fℤ₂](0 => 10, 1 => 10), 2) -psi = InfiniteMPS(physicalspace(H), Vspaces) -psi = compute_groundstate(psi, H) -E = real(expectation_value(psi, H)) / 2 -@info """ -Groundstate energy: - * numerical: $E - * analytic: $(hubbard_energy(U / 4) - U / 4) -""" -```` - -```` -[ Info: VUMPS init: obj = -1.450454615857e+00 err = 5.5193e-01 -[ Info: VUMPS conv 7: obj = -4.377048688339e+00 err = 8.8092806195e-03 time = 4.49 sec -[ Info: VUMPS init: obj = -4.377048688339e+00 err = 1.6440e-02 -[ Info: VUMPS conv 6: obj = -4.378747269347e+00 err = 1.3129004135e-04 time = 0.25 sec -[ Info: VUMPS init: obj = -4.378747269347e+00 err = 7.9951e-03 -[ Info: VUMPS conv 6: obj = -4.379161081627e+00 err = 1.5539751336e-04 time = 0.37 sec -[ Info: VUMPS init: obj = -4.379161081627e+00 err = 6.1111e-03 -[ Info: VUMPS conv 5: obj = -4.379452169384e+00 err = 1.6927654674e-04 time = 0.27 sec -[ Info: VUMPS init: obj = -4.379452169384e+00 err = 5.6959e-03 -[ Info: VUMPS conv 4: obj = -4.379651733231e+00 err = 1.8162083040e-04 time = 0.26 sec -[ Info: VUMPS init: obj = -4.379651733231e+00 err = 4.1039e-03 -[ Info: VUMPS conv 4: obj = -4.379735601762e+00 err = 1.3801495045e-04 time = 0.42 sec -[ Info: VUMPS init: obj = -4.379735601762e+00 err = 3.5769e-03 -[ Info: VUMPS conv 3: obj = -4.379797886653e+00 err = 1.3472741143e-04 time = 0.39 sec -[ Info: VUMPS init: obj = -4.379797886653e+00 err = 2.7707e-03 -[ Info: VUMPS conv 2: obj = -4.379838526805e+00 err = 1.7752552389e-04 time = 0.33 sec -[ Info: VUMPS init: obj = -4.379838526805e+00 err = 2.7291e-03 -[ Info: VUMPS conv 3: obj = -4.379878849406e+00 err = 1.9781894590e-04 time = 0.74 sec -[ Info: VUMPS init: obj = -4.379878849406e+00 err = 2.6911e-03 -[ Info: VUMPS conv 3: obj = -4.379929229387e+00 err = 1.7761427615e-04 time = 0.82 sec -[ Info: VUMPS init: obj = -4.379929229387e+00 err = 2.5553e-03 -[ Info: VUMPS conv 3: obj = -4.379968040382e+00 err = 1.8461546636e-04 time = 2.21 sec -[ Info: VUMPS init: obj = -4.379968040382e+00 err = 1.7682e-03 -[ Info: VUMPS conv 2: obj = -4.379986877757e+00 err = 1.9131369028e-04 time = 0.98 sec -[ Info: VUMPS init: obj = -4.379986877757e+00 err = 1.5838e-03 -[ Info: VUMPS conv 2: obj = -4.380001005486e+00 err = 1.9231335759e-04 time = 1.05 sec -[ Info: VUMPS init: obj = -4.380001005486e+00 err = 1.5109e-03 -[ Info: VUMPS conv 2: obj = -4.380013169634e+00 err = 1.5225084116e-04 time = 1.32 sec -[ Info: VUMPS init: obj = -4.380013169634e+00 err = 1.4234e-03 -[ Info: VUMPS conv 2: obj = -4.380024401012e+00 err = 1.7737882775e-04 time = 1.59 sec -[ Info: VUMPS init: obj = -4.380024401012e+00 err = 1.3330e-03 -[ Info: VUMPS conv 2: obj = -4.380038158990e+00 err = 1.5757417636e-04 time = 2.60 sec -[ Info: VUMPS init: obj = -4.380038158990e+00 err = 1.0032e-03 -[ Info: VUMPS conv 1: obj = -4.380043682260e+00 err = 1.6736593859e-04 time = 0.89 sec -[ Info: VUMPS init: obj = -4.380043682260e+00 err = 9.0999e-04 -[ Info: VUMPS conv 1: obj = -4.380048641018e+00 err = 1.8573996574e-04 time = 1.19 sec -[ Info: VUMPS init: obj = -4.380048641018e+00 err = 8.3081e-04 -[ Info: VUMPS conv 1: obj = -4.380053199895e+00 err = 1.8060836975e-04 time = 2.30 sec -[ Info: VUMPS init: obj = -4.380053199895e+00 err = 6.8144e-04 -[ Info: VUMPS conv 1: obj = -4.380057143242e+00 err = 1.8854132138e-04 time = 1.71 sec -[ Info: VUMPS init: obj = -4.380057143242e+00 err = 6.0293e-04 -[ Info: VUMPS conv 1: obj = -4.380060551312e+00 err = 1.8083344266e-04 time = 2.45 sec -[ Info: VUMPS init: obj = -4.379609468445e+00 err = 4.0958e-03 -[ Info: VUMPS conv 19: obj = -4.379763157256e+00 err = 9.9415625365e-06 time = 8.41 sec -[ Info: CG: initializing with f = -4.379763156901e+00, ‖∇f‖ = 3.1520e-05 -[ Info: CG: converged after 158 iterations and time 1.36 m: f = -4.379763361376e+00, ‖∇f‖ = 9.9957e-07 -┌ Info: Groundstate energy: -│ * numerical: -2.1899960609769664 -└ * analytic: -2.190038374277775 - -```` - -## Symmetries - -The Hubbard model has a rich symmetry structure, which can be exploited to speed up simulations. -Apart from the fermionic parity, the model also has a $U(1)$ particle number symmetry, along with a $SU(2)$ spin symmetry. -Explicitly imposing these symmetries on the tensors can greatly reduce the computational cost of the simulation. - -Naively imposing these symmetries however, is not compatible with our desire to work at half-filling. -By construction, imposing symmetries restricts the optimization procedure to a single symmetry sector, which is the trivial sector. -In order to work at half-filling, we need to effectively inject one particle per site. -In MPSKit, this is achieved by the `add_physical_charge` function, which shifts the physical spaces of the tensors to the desired charge sector. - -````julia -H_u1_su2 = hubbard_model(ComplexF64, U1Irrep, SU2Irrep, InfiniteChain(2); U, t, mu = U / 2); -charges = fill(FermionParity(1) ⊠ U1Irrep(1) ⊠ SU2Irrep(0), 2); -H_u1_su2 = MPSKit.add_physical_charge(H_u1_su2, charges); - -pspaces = physicalspace.(Ref(H_u1_su2), 1:2) -vspaces = [oneunit(eltype(pspaces)), first(pspaces)] -psi = InfiniteMPS(pspaces, vspaces) -psi = compute_groundstate(psi, H_u1_su2; expansionfactor = 1 / 3) -E = real(expectation_value(psi, H_u1_su2)) / 2 -@info """ -Groundstate energy: - * numerical: $E - * analytic: $(hubbard_energy(U / 4) - U / 4) -""" -```` - -```` -[ Info: VUMPS init: obj = +2.092499297284e-01 err = 8.6283e-01 -[ Info: VUMPS conv 1: obj = -4.000000000000e+00 err = 1.4030299342e-15 time = 2.40 sec -[ Info: VUMPS init: obj = -4.000000000000e+00 err = 3.3634e-01 -[ Info: VUMPS conv 4: obj = -4.289650419749e+00 err = 1.8514003381e-04 time = 0.09 sec -[ Info: VUMPS init: obj = -4.289650419749e+00 err = 1.1203e-01 -[ Info: VUMPS conv 6: obj = -4.359865567620e+00 err = 1.0046942911e-04 time = 0.29 sec -[ Info: VUMPS init: obj = -4.359865567619e+00 err = 4.3643e-02 -[ Info: VUMPS conv 6: obj = -4.372880928482e+00 err = 1.3025843115e-04 time = 2.61 sec -[ Info: VUMPS init: obj = -4.372880928482e+00 err = 3.2693e-02 -[ Info: VUMPS conv 4: obj = -4.375236954488e+00 err = 1.1814239608e-04 time = 0.20 sec -[ Info: VUMPS init: obj = -4.375236954488e+00 err = 2.9487e-02 -[ Info: VUMPS conv 7: obj = -4.378159084364e+00 err = 1.1896740056e-04 time = 0.60 sec -[ Info: VUMPS init: obj = -4.378159084364e+00 err = 1.9312e-02 -[ Info: VUMPS conv 5: obj = -4.379272966040e+00 err = 1.5785413165e-04 time = 0.50 sec -[ Info: VUMPS init: obj = -4.379272966040e+00 err = 9.9128e-03 -[ Info: VUMPS conv 4: obj = -4.379592229143e+00 err = 1.5550378745e-04 time = 0.51 sec -[ Info: VUMPS init: obj = -4.379592229143e+00 err = 6.4841e-03 -[ Info: VUMPS conv 4: obj = -4.379819377264e+00 err = 1.7492038571e-04 time = 0.56 sec -[ Info: VUMPS init: obj = -4.379819377264e+00 err = 3.8754e-03 -┌ Warning: VUMPS cancel 10: obj = -4.379964033305e+00 err = 2.1228930049e-04 time = 1.76 sec -└ @ MPSKit ~/Projects/MPSKit.jl/docs/src/algorithms/groundstate/vumps.jl:83 -[ Info: VUMPS init: obj = -4.379964033305e+00 err = 2.8978e-03 -[ Info: VUMPS conv 3: obj = -4.380010384710e+00 err = 1.4775284542e-04 time = 0.88 sec -[ Info: VUMPS init: obj = -4.380010384710e+00 err = 2.0609e-03 -[ Info: VUMPS conv 3: obj = -4.380041751503e+00 err = 1.6327798118e-04 time = 1.81 sec -[ Info: VUMPS init: obj = -4.380041751502e+00 err = 1.2364e-03 -[ Info: VUMPS conv 2: obj = -4.380055778759e+00 err = 1.8366845284e-04 time = 0.83 sec -[ Info: VUMPS init: obj = -4.380055778759e+00 err = 8.5857e-04 -[ Info: VUMPS conv 2: obj = -4.380064749427e+00 err = 1.3905442267e-04 time = 1.14 sec -[ Info: VUMPS init: obj = -4.380064749427e+00 err = 5.2502e-04 -[ Info: VUMPS conv 1: obj = -4.380067974777e+00 err = 1.5646700070e-04 time = 0.79 sec -[ Info: VUMPS init: obj = -4.380067974777e+00 err = 3.3275e-04 -[ Info: VUMPS conv 1: obj = -4.380070351418e+00 err = 1.3123916502e-04 time = 1.05 sec -[ Info: VUMPS init: obj = -4.380070351418e+00 err = 2.0348e-04 -[ Info: VUMPS conv 1: obj = -4.380072125256e+00 err = 1.1119707628e-04 time = 2.15 sec -[ Info: VUMPS init: obj = -4.380072125256e+00 err = 1.3635e-04 -[ Info: VUMPS conv 1: obj = -4.380073467831e+00 err = 8.5045032311e-05 time = 2.22 sec -[ Info: VUMPS init: obj = -4.380073467830e+00 err = 9.7226e-05 -[ Info: VUMPS conv 1: obj = -4.380074455763e+00 err = 6.4430026631e-05 time = 3.60 sec -[ Info: VUMPS init: obj = -4.380074455763e+00 err = 7.3787e-05 -[ Info: VUMPS conv 1: obj = -4.380075159887e+00 err = 6.2144398833e-05 time = 8.05 sec -[ Info: VUMPS init: obj = -4.380075159887e+00 err = 5.9899e-05 -[ Info: VUMPS conv 1: obj = -4.380075661721e+00 err = 4.2515939994e-05 time = 12.11 sec -[ Info: VUMPS init: obj = -4.379308795201e+00 err = 7.9930e-03 -┌ Warning: VUMPS cancel 100: obj = -4.379692711472e+00 err = 1.5979764572e-05 time = 27.91 sec -└ @ MPSKit ~/Projects/MPSKit.jl/docs/src/algorithms/groundstate/vumps.jl:83 -[ Info: CG: initializing with f = -4.379692711472e+00, ‖∇f‖ = 5.7923e-05 -[ Info: CG: converged after 13 iterations and time 7.22 s: f = -4.379692712393e+00, ‖∇f‖ = 6.2087e-07 -┌ Info: Groundstate energy: -│ * numerical: -2.1900153475144695 -└ * analytic: -2.190038374277775 - -```` - -## Excitations - -Because of the integrability, it is known that the Hubbard model has a rich excitation spectrum. -The elementary excitations are known as spinons and holons, which are domain walls in the spin and charge sectors, respectively. -The fact that the spin and charge sectors are separate is a phenomenon known as spin-charge separation. - -The domain walls can be constructed by noticing that there are two equivalent groundstates, which differ by a translation over a single site. -In other words, the groundstates are ``\psi_{AB}` and ``\psi_{BA}``, where ``A`` and ``B`` are the two sites. -These excitations can be constructed as follows: - -````julia -alg = QuasiparticleAnsatz(; tol = 1.0e-3) -momenta = range(-π, π; length = 33) -psi_AB = psi -envs_AB = environments(psi_AB, H_u1_su2, psi_AB); -psi_BA = circshift(psi, 1) -envs_BA = environments(psi_BA, H_u1_su2, psi_BA); - -spinon_charge = FermionParity(0) ⊠ U1Irrep(0) ⊠ SU2Irrep(1 // 2) -E_spinon, ϕ_spinon = excitations( - H_u1_su2, alg, momenta, psi_AB, envs_AB, psi_BA, envs_BA; - sector = spinon_charge, num = 1 -); - -holon_charge = FermionParity(1) ⊠ U1Irrep(-1) ⊠ SU2Irrep(0) -E_holon, ϕ_holon = excitations( - H_u1_su2, alg, momenta, psi_AB, envs_AB, psi_BA, envs_BA; - sector = holon_charge, num = 1 -); -```` - -```` -[ Info: Found excitations for momentum = -3.141592653589793 -[ Info: Found excitations for momentum = -2.945243112740431 -[ Info: Found excitations for momentum = -2.748893571891069 -[ Info: Found excitations for momentum = -2.552544031041707 -[ Info: Found excitations for momentum = -2.356194490192345 -[ Info: Found excitations for momentum = -2.1598449493429825 -[ Info: Found excitations for momentum = -1.7671458676442586 -[ Info: Found excitations for momentum = -1.9634954084936207 -[ Info: Found excitations for momentum = -1.5707963267948966 -[ Info: Found excitations for momentum = -1.3744467859455345 -[ Info: Found excitations for momentum = -0.9817477042468103 -[ Info: Found excitations for momentum = -1.1780972450961724 -[ Info: Found excitations for momentum = -0.7853981633974483 -[ Info: Found excitations for momentum = -0.5890486225480862 -[ Info: Found excitations for momentum = -0.19634954084936207 -[ Info: Found excitations for momentum = -0.39269908169872414 -[ Info: Found excitations for momentum = 0.0 -[ Info: Found excitations for momentum = 0.19634954084936207 -[ Info: Found excitations for momentum = 0.39269908169872414 -[ Info: Found excitations for momentum = 0.5890486225480862 -[ Info: Found excitations for momentum = 0.7853981633974483 -[ Info: Found excitations for momentum = 0.9817477042468103 -[ Info: Found excitations for momentum = 1.3744467859455345 -[ Info: Found excitations for momentum = 1.1780972450961724 -[ Info: Found excitations for momentum = 1.5707963267948966 -[ Info: Found excitations for momentum = 1.7671458676442586 -[ Info: Found excitations for momentum = 2.356194490192345 -[ Info: Found excitations for momentum = 1.9634954084936207 -[ Info: Found excitations for momentum = 2.1598449493429825 -[ Info: Found excitations for momentum = 2.552544031041707 -[ Info: Found excitations for momentum = 2.748893571891069 -[ Info: Found excitations for momentum = 2.945243112740431 -[ Info: Found excitations for momentum = 3.141592653589793 -[ Info: Found excitations for momentum = -3.141592653589793 -[ Info: Found excitations for momentum = -2.748893571891069 -[ Info: Found excitations for momentum = -2.552544031041707 -[ Info: Found excitations for momentum = -2.945243112740431 -[ Info: Found excitations for momentum = -2.356194490192345 -[ Info: Found excitations for momentum = -2.1598449493429825 -[ Info: Found excitations for momentum = -1.9634954084936207 -[ Info: Found excitations for momentum = -1.7671458676442586 -[ Info: Found excitations for momentum = -1.5707963267948966 -[ Info: Found excitations for momentum = -1.3744467859455345 -[ Info: Found excitations for momentum = -1.1780972450961724 -[ Info: Found excitations for momentum = -0.9817477042468103 -[ Info: Found excitations for momentum = -0.7853981633974483 -[ Info: Found excitations for momentum = -0.5890486225480862 -[ Info: Found excitations for momentum = -0.39269908169872414 -[ Info: Found excitations for momentum = -0.19634954084936207 -[ Info: Found excitations for momentum = 0.0 -[ Info: Found excitations for momentum = 0.19634954084936207 -[ Info: Found excitations for momentum = 0.39269908169872414 -[ Info: Found excitations for momentum = 0.5890486225480862 -[ Info: Found excitations for momentum = 0.7853981633974483 -[ Info: Found excitations for momentum = 0.9817477042468103 -[ Info: Found excitations for momentum = 1.1780972450961724 -[ Info: Found excitations for momentum = 1.3744467859455345 -[ Info: Found excitations for momentum = 1.5707963267948966 -[ Info: Found excitations for momentum = 1.7671458676442586 -[ Info: Found excitations for momentum = 1.9634954084936207 -[ Info: Found excitations for momentum = 2.1598449493429825 -[ Info: Found excitations for momentum = 2.356194490192345 -[ Info: Found excitations for momentum = 2.552544031041707 -[ Info: Found excitations for momentum = 2.748893571891069 -[ Info: Found excitations for momentum = 3.141592653589793 -[ Info: Found excitations for momentum = 2.945243112740431 - -```` - -Again, we can compare the numerical results to the analytic solution. -Here, the formulae for the excitation energies are expressed in terms of dressed momenta: - -````julia -function spinon_momentum(Λ, u; rtol = 1.0e-12) - integrandum(ω) = besselj0(ω) * sin(ω * Λ) / ω / cosh(ω * u) - return π / 2 - quadgk(integrandum, 0, Inf; rtol = rtol)[1] -end -function spinon_energy(Λ, u; rtol = 1.0e-12) - integrandum(ω) = besselj1(ω) * cos(ω * Λ) / ω / cosh(ω * u) - return 2 * quadgk(integrandum, 0, Inf; rtol = rtol)[1] -end - -function holon_momentum(k, u; rtol = 1.0e-12) - integrandum(ω) = besselj0(ω) * sin(ω * sin(k)) / ω / (1 + exp(2u * abs(ω))) - return π / 2 - k - 2 * quadgk(integrandum, 0, Inf; rtol = rtol)[1] -end -function holon_energy(k, u; rtol = 1.0e-12) - integrandum(ω) = besselj1(ω) * cos(ω * sin(k)) * exp(-ω * u) / ω / cosh(ω * u) - return 2 * cos(k) + 2u + 2 * quadgk(integrandum, 0, Inf; rtol = rtol)[1] -end - -Λs = range(-10, 10; length = 51) -P_spinon_analytic = rem2pi.(spinon_momentum.(Λs, U / 4), RoundNearest) -E_spinon_analytic = spinon_energy.(Λs, U / 4) -I_spinon = sortperm(P_spinon_analytic) -P_spinon_analytic = P_spinon_analytic[I_spinon] -E_spinon_analytic = E_spinon_analytic[I_spinon] -P_spinon_analytic = [reverse(-P_spinon_analytic); P_spinon_analytic] -E_spinon_analytic = [reverse(E_spinon_analytic); E_spinon_analytic]; - -ks = range(0, 2π; length = 51) -P_holon_analytic = rem2pi.(holon_momentum.(ks, U / 4), RoundNearest) -E_holon_analytic = holon_energy.(ks, U / 4) -I_holon = sortperm(P_holon_analytic) -P_holon_analytic = P_holon_analytic[I_holon] -E_holon_analytic = E_holon_analytic[I_holon]; - -p = let p_excitations = plot(; xaxis = "momentum", yaxis = "energy") - scatter!(p_excitations, momenta, real(E_spinon); label = "spinon") - plot!(p_excitations, P_spinon_analytic, E_spinon_analytic; label = "spinon (analytic)") - - scatter!(p_excitations, momenta, real(E_holon); label = "holon") - plot!(p_excitations, P_holon_analytic, E_holon_analytic; label = "holon (analytic)") - - p_excitations -end -```` - -![](figure-1.png) - -The plot shows some discrepancies between the numerical and analytic results. -First and foremost, we must realize that in the thermodynamic limit, the momentum of a domain wall is actually not well-defined. -Concretely, only the difference in momentum between the two groundstates is well-defined, as we can always shift the momentum by multiplying one of the groundstates by a phase. -Here, we can fix this shift by realizing that our choice of shifting the groundstates by a single site, differs from the formula by a factor ``\pi/2``. - -````julia -momenta_shifted = rem2pi.(momenta .- π / 2, RoundNearest) -p = let p_excitations = plot(; xaxis = "momentum", yaxis = "energy", xlims = (-π, π)) - scatter!(p_excitations, momenta_shifted, real(E_spinon); label = "spinon") - plot!(p_excitations, P_spinon_analytic, E_spinon_analytic; label = "spinon (analytic)") - - scatter!(p_excitations, momenta_shifted, real(E_holon); label = "holon") - plot!(p_excitations, P_holon_analytic, E_holon_analytic; label = "holon (analytic)") - - p_excitations -end -```` - -![](figure-2.png) - -The second discrepancy is that while the spinon dispersion is well-reproduced, the holon dispersion is not. -This is due to the fact that the excitation ansatz captures the lowest-energy excitation, and not the elementary single-particle excitation. -To make this explicit, we can consider the scattering states comprising of a holon and two spinons. -If these are truly scattering states, the energy of the scattering state should be the sum of the energies of the individual excitations, and the momentum is the sum of the momenta. -Thus, we can find the lowest-energy scattering states by minimizing the energy over the combination of momenta for the constituent elementary excitations. - -````julia -holon_dispersion_itp = linear_interpolation( - P_holon_analytic, E_holon_analytic; - extrapolation_bc = Line() -) -spinon_dispersion_itp = linear_interpolation( - P_spinon_analytic, E_spinon_analytic; - extrapolation_bc = Line() -) -function scattering_energy(p1, p2, p3) - p1, p2, p3 = rem2pi.((p1, p2, p3), RoundNearest) - return holon_dispersion_itp(p1) + spinon_dispersion_itp(p2) + spinon_dispersion_itp(p3) -end; - -E_scattering_min = map(momenta_shifted) do p - e = Inf - for i in 1:10 # repeat for stability - res = optimize((rand(2) .* (2π) .- π)) do (p₁, p₂) - p₃ = p - p₁ - p₂ - return scattering_energy(p₁, p₂, p₃) - end - - e = min(Optim.minimum(res), e) - end - return e -end -E_scattering_max = map(momenta_shifted) do p - e = -Inf - for i in 1:10 # repeat for stability - res = optimize((rand(Float64, 2) .* (2π) .- π)) do (p₁, p₂) - p₃ = p - p₁ - p₂ - return -scattering_energy(p₁, p₂, p₃) - end - - e = max(-Optim.minimum(res), e) - end - return e -end; - -p = let p_excitations = plot(; - xaxis = "momentum", yaxis = "energy", xlims = (-π, π), ylims = (-0.1, 5) - ) - scatter!(p_excitations, momenta_shifted, real(E_spinon); label = "spinon") - plot!(p_excitations, P_spinon_analytic, E_spinon_analytic; label = "spinon (analytic)") - - scatter!(p_excitations, momenta_shifted, real(E_holon); label = "holon") - plot!(p_excitations, P_holon_analytic, E_holon_analytic; label = "holon (analytic)") - - I = sortperm(momenta_shifted) - plot!( - p_excitations, momenta_shifted[I], E_scattering_min[I]; label = "scattering states", - fillrange = E_scattering_max[I], fillalpha = 0.3, fillstyle = :x - ) - - p_excitations -end -```` - -![](figure-3.png) - ---- - -*This page was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).* - diff --git a/docs/src/examples/quantum1d/7.xy-finiteT/figure-1.png b/docs/src/examples/quantum1d/7.xy-finiteT/figure-1.png deleted file mode 100644 index da451a216034047e9d29582904616a531e934c13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37795 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 diff --git a/docs/src/examples/quantum1d/7.xy-finiteT/figure-5.png b/docs/src/examples/quantum1d/7.xy-finiteT/figure-5.png deleted file mode 100644 index 733496a0c3a48294a87cece46ecaea09b2207085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38446 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 diff --git a/docs/src/examples/quantum1d/8.bose-hubbard/figure-1.png b/docs/src/examples/quantum1d/8.bose-hubbard/figure-1.png deleted file mode 100644 index 2ab23add4762bc48733092ba0aa888d34f863735..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16373 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

    FnHG1xs{s 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 ieNr5xrV4E!B?BV8{nc5{D)36kh)Gv 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%0ALqp;THMSqm@q)|v*gNa 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 diff --git a/docs/src/examples/quantum1d/8.bose-hubbard/figure-5.png b/docs/src/examples/quantum1d/8.bose-hubbard/figure-5.png deleted file mode 100644 index a33028f2eb2ec4a897a1834e864b55c9c3cf237e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35226 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 TMSnMbg`};auU@KZf93xG({`+} diff --git a/docs/src/examples/quantum1d/8.bose-hubbard/figure-6.png b/docs/src/examples/quantum1d/8.bose-hubbard/figure-6.png deleted file mode 100644 index 805386dc73278b942b87c8a0974aa70b11ac28be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15426 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 literal 0 HcmV?d00001 diff --git a/docs/src/examples/classic2d/1.hard-hexagon/hexagon.svg b/docs/src/examples/statmech/0.hard-hexagon/hexagon.svg similarity index 100% rename from docs/src/examples/classic2d/1.hard-hexagon/hexagon.svg rename to docs/src/examples/statmech/0.hard-hexagon/hexagon.svg diff --git a/docs/src/examples/classic2d/1.hard-hexagon/index.md b/docs/src/examples/statmech/0.hard-hexagon/index.md similarity index 84% rename from docs/src/examples/classic2d/1.hard-hexagon/index.md rename to docs/src/examples/statmech/0.hard-hexagon/index.md index 6f103a911..6d5d0639d 100644 --- a/docs/src/examples/classic2d/1.hard-hexagon/index.md +++ b/docs/src/examples/statmech/0.hard-hexagon/index.md @@ -1,10 +1,10 @@ ```@meta -EditURL = "../../../../../examples/classic2d/1.hard-hexagon/main.jl" +EditURL = "../../../../../examples/statmech/0.hard-hexagon/main.jl" ``` -[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/classic2d/1.hard-hexagon/main.ipynb) -[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/classic2d/1.hard-hexagon/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/classic2d/1.hard-hexagon) +[![](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev/examples/statmech/0.hard-hexagon/main.ipynb) +[![](https://img.shields.io/badge/show-nbviewer-579ACA.svg)](https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev/examples/statmech/0.hard-hexagon/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/statmech/0.hard-hexagon) # The Hard Hexagon model @@ -24,7 +24,7 @@ The [hard hexagon model](https://en.wikipedia.org/wiki/Hard_hexagon_model) is a This can be encoded in a transfer matrix with a local MPO tensor using anyonic symmetries, and the resulting MPO has been implemented in MPSKitModels. In order to use these anyonic symmetries, we need to generalise the notion of the bond dimension and define how it interacts with the symmetry. -Thus, we implement away of converting integers to symmetric spaces of the given dimension, which provides a crude guess for how the final MPS would distribute its Schmidt spectrum. +Thus, we implement a way of converting integers to symmetric spaces of the given dimension, which provides a crude guess for how the final MPS would distribute its Schmidt spectrum. ````julia mpo = hard_hexagon() @@ -59,7 +59,7 @@ println("F = $F\tS = $S\tξ = $ξ") ```` ```` -F = 0.8839037051703852 S = 1.2807829621826905 ξ = 13.849682581482702 +F = 0.8839037051703854 S = 1.2807829621910287 ξ = 13.849682581985 ```` @@ -69,7 +69,7 @@ The dominant eigenvector is of course only an approximation. The finite bond dimension enforces a finite correlation length, which effectively introduces a length scale in the system. This can be exploited to formulate a scaling hypothesis [pollmann2009](@cite), which in turn allows to extract the central charge. -First we need to know the entropy and correlation length at a bunch of different bond dimensions. +First we need to know the entropy and correlation length at several different bond dimensions. Our approach will be to re-use the previous approximated dominant eigenvector, and then expanding its bond dimension and re-running VUMPS. According to the scaling hypothesis we should have ``S ∝ \frac{c}{6} log(ξ)``. Therefore we should find ``c`` using @@ -81,7 +81,7 @@ function scaling_simulations( entropies = similar(Ds, Float64) correlations = similar(Ds, Float64) alg = VUMPS(; verbosity, tol, alg_eigsolve) - sector = unit(sectortype(mpo)) # dominant correlation functions are in the trivial sector + sector = unit(sectortype(mpo)) # in this example the dominant correlation functions are in the trivial sector ψ, envs, = leading_boundary(ψ₀, mpo, alg) entropies[1] = real(entropy(ψ)[1]) @@ -105,7 +105,7 @@ c = f.coeffs[2] ```` ```` -0.802524639544328 +0.8025361167011884 ```` ````julia diff --git a/docs/src/examples/classic2d/1.hard-hexagon/main.ipynb b/docs/src/examples/statmech/0.hard-hexagon/main.ipynb similarity index 94% rename from docs/src/examples/classic2d/1.hard-hexagon/main.ipynb rename to docs/src/examples/statmech/0.hard-hexagon/main.ipynb index 129e5589a..29b854be8 100644 --- a/docs/src/examples/classic2d/1.hard-hexagon/main.ipynb +++ b/docs/src/examples/statmech/0.hard-hexagon/main.ipynb @@ -32,7 +32,7 @@ "This can be encoded in a transfer matrix with a local MPO tensor using anyonic symmetries, and the resulting MPO has been implemented in MPSKitModels.\n", "\n", "In order to use these anyonic symmetries, we need to generalise the notion of the bond dimension and define how it interacts with the symmetry.\n", - "Thus, we implement away of converting integers to symmetric spaces of the given dimension, which provides a crude guess for how the final MPS would distribute its Schmidt spectrum." + "Thus, we implement a way of converting integers to symmetric spaces of the given dimension, which provides a crude guess for how the final MPS would distribute its Schmidt spectrum." ] }, { @@ -92,7 +92,7 @@ "The finite bond dimension enforces a finite correlation length, which effectively introduces a length scale in the system.\n", "This can be exploited to formulate a scaling hypothesis [pollmann2009](@cite), which in turn allows to extract the central charge.\n", "\n", - "First we need to know the entropy and correlation length at a bunch of different bond dimensions.\n", + "First we need to know the entropy and correlation length at several different bond dimensions.\n", "Our approach will be to re-use the previous approximated dominant eigenvector, and then expanding its bond dimension and re-running VUMPS.\n", "According to the scaling hypothesis we should have $S ∝ \\frac{c}{6} log(ξ)$. Therefore we should find $c$ using" ] @@ -110,7 +110,7 @@ " entropies = similar(Ds, Float64)\n", " correlations = similar(Ds, Float64)\n", " alg = VUMPS(; verbosity, tol, alg_eigsolve)\n", - " sector = unit(sectortype(mpo)) # dominant correlation functions are in the trivial sector\n", + " sector = unit(sectortype(mpo)) # in this example the dominant correlation functions are in the trivial sector\n", "\n", " ψ, envs, = leading_boundary(ψ₀, mpo, alg)\n", " entropies[1] = real(entropy(ψ)[1])\n", diff --git a/examples/Cache.toml b/examples/Cache.toml index 1b15ac166..f3e9fa9fe 100644 --- a/examples/Cache.toml +++ b/examples/Cache.toml @@ -1,12 +1,16 @@ -[classic2d] -"1.hard-hexagon" = "059f9a5162d75323c7104a8fb178458f965db7bda1481021ae51d4fb8ec9cde9" +[excitations] +"0.haldane" = "c09df36c3be5cd452bec564d22f6e2815474a9dab71dd5528013a3fb46b2f7c0" -[quantum1d] -"2.haldane" = "c5a0eb70f0930d38053535c659ab39a87121b6ebda040ceadd9deb5f30921315" -"6.hubbard" = "cef140a6224350345735aac889ee7e33724fc0af9ce94f68be47a7e40107c09c" -"7.xy-finiteT" = "0f330a157bea739a43a82a937791c680b2fa6e5e479171ee5ef318d1fdae7bcf" -"8.bose-hubbard" = "cf0d9a543e784dc6053e413780d19e1b59bf956dd4598752fdf664804dd68ce6" -"3.ising-dqpt" = "a2900eed23de7655f600943fae72d1dc35f87f33d11947f707d302ce245399fe" -"5.haldane-spt" = "c8fd3a8d406b9ff3ea9a34b596c5910d81e4eb710b665d7fa04e30f795a46086" -"4.xxz-heisenberg" = "9033fb104c3f658ccb1b8e335b986b7abda59e0b5359be086d3b62e1cc32ebd6" -"1.ising-cft" = "3d34757eee7b95120b746c5e30e713203a876a87353ecd9937798f29183c9916" +[dynamics] +"0.ising-dqpt" = "f90e6a301a8bc6634f80d23957843ed0e721ac0fd6bf8c4fd07a152dbe264563" +"1.xy-finiteT" = "315b668d2e9ab114cbba396f4dbeb28cb2f7e97db280a0844f36dc17df26d3bc" + +[statmech] +"0.hard-hexagon" = "bd5e82948c6b7511e6c9c05565053113ce40df31102d70b544d82b6595306238" + +[groundstates] +"4.haldane-spt" = "c8fd3a8d406b9ff3ea9a34b596c5910d81e4eb710b665d7fa04e30f795a46086" +"2.hubbard" = "29e2469ac9307f1242bdfb76b97c6a2e04dc087f5d4b6c45c8b7a15df12ad36c" +"3.bose-hubbard" = "cf0d9a543e784dc6053e413780d19e1b59bf956dd4598752fdf664804dd68ce6" +"1.xxz-heisenberg" = "dae5f29dcad5fcfaffd12a7847916adb92c955276ce24166fd3f9c9534c50784" +"5.ising-cft" = "ebcae1e501347cb00a46d0889df1355707be77cf962f9ee0d16416393492529b" diff --git a/examples/README.md b/examples/README.md index 0aea9a7d9..84e3368e4 100644 --- a/examples/README.md +++ b/examples/README.md @@ -8,14 +8,16 @@ In order to Trigger the file generation, run: ``julia examples/make.jl` By default, this will only generate files when the input file has not changed. This is -achieved by keeping a checksum of the `main.jl` file in each example in a `cache.toml`. +achieved by keeping a checksum of the `main.jl` file in each example in `Cache.toml`. Total recompilation can be achieved by deleting this file, or alternatively you can just delete the entries for which you wish to generate new files. ## Contributing Contributions are welcome! Please open an issue or a pull request if you have any questions -or suggestions. The code should be placed in a folder in either of the `classic2d` or -`quantum1d` folders, and the `main.jl` file should be the entry point. Any other files will +or suggestions. The code should be placed in a folder in one of the topic groups (`groundstates`, +`excitations`, `dynamics`, `statmech`), and the `main.jl` file should be the entry point. +A new topic group is picked up automatically: any subdirectory of `examples/` is built, so +only the sidebar grouping in `docs/make.jl` needs updating. Any other files will be copied over to the `docs/src/examples` folder, so you can use this to include images or other files. \ No newline at end of file diff --git a/examples/quantum1d/3.ising-dqpt/finite_timeev.png b/examples/dynamics/0.ising-dqpt/finite_timeev.png similarity index 100% rename from examples/quantum1d/3.ising-dqpt/finite_timeev.png rename to examples/dynamics/0.ising-dqpt/finite_timeev.png diff --git a/examples/quantum1d/3.ising-dqpt/infinite_timeev.png b/examples/dynamics/0.ising-dqpt/infinite_timeev.png similarity index 100% rename from examples/quantum1d/3.ising-dqpt/infinite_timeev.png rename to examples/dynamics/0.ising-dqpt/infinite_timeev.png diff --git a/examples/quantum1d/3.ising-dqpt/main.jl b/examples/dynamics/0.ising-dqpt/main.jl similarity index 94% rename from examples/quantum1d/3.ising-dqpt/main.jl rename to examples/dynamics/0.ising-dqpt/main.jl index 50f7a3a23..78c09abcb 100644 --- a/examples/quantum1d/3.ising-dqpt/main.jl +++ b/examples/dynamics/0.ising-dqpt/main.jl @@ -28,7 +28,7 @@ First we construct the Hamiltonian in MPO form, and obtain the pre-quenched grou L = 20 H₀ = transverse_field_ising(FiniteChain(L); g = -0.5) ψ₀ = FiniteMPS(L, ℂ^2, ℂ^10) -ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG()); +ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0)); md""" ## Finite MPS quenching @@ -57,7 +57,7 @@ Putting it all together, we get function finite_sim(L; dt = 0.05, finaltime = 5.0) ψ₀ = FiniteMPS(L, ℂ^2, ℂ^10) H₀ = transverse_field_ising(FiniteChain(L); g = -0.5) - ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG()) + ψ₀, _ = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0)) H₁ = transverse_field_ising(FiniteChain(L); g = -2.0) ψₜ = deepcopy(ψ₀) @@ -85,7 +85,7 @@ Similarly we could start with an initial infinite state and find the pre-quench ψ₀ = InfiniteMPS([ℂ^2], [ℂ^10]) H₀ = transverse_field_ising(; g = -0.5) -ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS()); +ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS(; verbosity = 0)); md""" The dot product of two infinite matrix product states scales as ``\alpha ^N`` where ``α`` is the dominant eigenvalue of the transfer matrix. @@ -123,7 +123,7 @@ The final code is function infinite_sim(dt = 0.05, finaltime = 5.0) ψ₀ = InfiniteMPS([ℂ^2], [ℂ^10]) - ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS()) + ψ₀, _ = find_groundstate(ψ₀, H₀, VUMPS(; verbosity = 0)) ψₜ = deepcopy(ψ₀) envs = environments(ψₜ, H₁, ψₜ) diff --git a/examples/quantum1d/7.xy-finiteT/main.jl b/examples/dynamics/1.xy-finiteT/main.jl similarity index 97% rename from examples/quantum1d/7.xy-finiteT/main.jl rename to examples/dynamics/1.xy-finiteT/main.jl index 473006179..31a50d035 100644 --- a/examples/quantum1d/7.xy-finiteT/main.jl +++ b/examples/dynamics/1.xy-finiteT/main.jl @@ -56,8 +56,7 @@ The Hamiltonian can be diagonalized in terms of fermionic creation and annihilat E_0 = -\frac{1}{\pi} \text{EllipticE}\left( \sqrt{1 - \gamma^2} \right) ``` -!!! todo - Show the derivation of the ground state energy by diagonalizing the Hamiltonian in terms of fermionic operators. +The derivation, via a Jordan-Wigner transformation to free fermions followed by a Bogoliubov rotation, can be found in [Lieb, Schultz & Mattis, Ann. Phys. 16, 407 (1961)](https://doi.org/10.1016/0003-4916(61)90115-4). """ function groundstate_energy(J, N) @@ -95,7 +94,7 @@ D = 64 V_init = symmetry === Trivial ? ℂ^32 : U1Space(i => 10 for i in -1:(1 // 2):1) psi_init = FiniteMPS(N, physicalspace(H, 1), V_init) trunc = truncrank(D) -psi, envs, = find_groundstate(psi_init, H, DMRG2(; trunc, maxiter = 5)); +psi, envs, = find_groundstate(psi_init, H, DMRG2(; trunc, maxiter = 5, verbosity = 0)); E_0 = expectation_value(psi, H, envs) / N println("Numerical:\t", real(E_0)) @@ -141,8 +140,7 @@ The resulting expression is Z(\beta) = \prod_{k=1}^{N} \left( 1 + e^{-\beta \epsilon_k} \right)^{1/N} ``` -!!! todo - Show the derivation of the partition function for the XY model. +This expression follows from the same free-fermion diagonalization as the ground-state energy above: each single-particle mode $\epsilon_k$ is independently occupied or empty, giving the usual free-fermion partition function (see again [Lieb, Schultz & Mattis (1961)](https://doi.org/10.1016/0003-4916(61)90115-4)). """ function partition_function(β::Number, J::Number, N::Number) @@ -274,8 +272,6 @@ Z(\beta) = In other words, we can compute the partition function at $\beta$ by computing the overlap of two states evolved for $\beta / 2$, as long as the Hamiltonian is Hermitian. Otherwise, we could still use the same trick, but we would have to compute the evolved states twice, once for $H$ and once for $H^\dagger$. -!!! todo - Add a figure to illustrate this trick. """ double_logpartition(ρ₁, ρ₂ = ρ₁) = log(real(dot(ρ₁, ρ₂))) / length(ρ₁) diff --git a/examples/quantum1d/2.haldane/main.jl b/examples/excitations/0.haldane/main.jl similarity index 99% rename from examples/quantum1d/2.haldane/main.jl rename to examples/excitations/0.haldane/main.jl index 98ac72a0e..8ce58e3cf 100644 --- a/examples/quantum1d/2.haldane/main.jl +++ b/examples/excitations/0.haldane/main.jl @@ -106,7 +106,7 @@ virtual_space_inf = Rep[SU₂](1 // 2 => 16, 3 // 2 => 16, 5 // 2 => 8, 7 // 2 = ψ_inf, envs_inf, delta_inf = find_groundstate(ψ₀_inf, H; verbosity = 0) kspace = range(0, π, 16) -Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ_inf, envs_inf; sector = SU2Irrep(1)) +Es, _ = excitations(H, QuasiparticleAnsatz(), kspace, ψ_inf, envs_inf; sector = SU2Irrep(1), verbosity = 0) ΔE, idx = findmin(real.(Es)) println("minimum @k = $(kspace[idx]):\t ΔE = $(ΔE)") diff --git a/examples/quantum1d/4.xxz-heisenberg/main.jl b/examples/groundstates/1.xxz-heisenberg/main.jl similarity index 91% rename from examples/quantum1d/4.xxz-heisenberg/main.jl rename to examples/groundstates/1.xxz-heisenberg/main.jl index 36ce04d77..010cb2445 100644 --- a/examples/quantum1d/4.xxz-heisenberg/main.jl +++ b/examples/groundstates/1.xxz-heisenberg/main.jl @@ -7,9 +7,10 @@ The necessary packages to follow this tutorial are: using MPSKit, MPSKitModels, TensorKit, Plots -#src # for reproducibility: -#src using Random -#src Random.seed!(123) +# For reproducibility of this page, we fix the seed of the random number generator: + +using Random +Random.seed!(123); md""" ## Failure @@ -31,7 +32,7 @@ md""" The ground state can then be found by calling `find_groundstate`. """ -groundstate, cache, delta = find_groundstate(state, H, VUMPS()); +groundstate, cache, delta = find_groundstate(state, H, VUMPS(; verbosity = 1)); md""" As you can see, VUMPS struggles to converge. @@ -39,7 +40,7 @@ On its own, that is already quite curious. Maybe we can do better using another algorithm, such as gradient descent. """ -groundstate, cache, delta = find_groundstate(state, H, GradientGrassmann(; maxiter = 20)); +groundstate, cache, delta = find_groundstate(state, H, GradientGrassmann(; maxiter = 20, verbosity = 1)); md""" Convergence is quite slow and even fails after sufficiently many iterations. @@ -72,7 +73,7 @@ Alternatively, the Hamiltonian can be constructed directly on a two-site unit ce ## H2 = repeat(H, 2); -- copies the one-site version H2 = heisenberg_XXX(ComplexF64, Trivial, InfiniteChain(2); spin = 1 // 2) groundstate, envs, delta = find_groundstate( - state, H2, VUMPS(; maxiter = 100, tol = 1.0e-12) + state, H2, VUMPS(; maxiter = 100, tol = 1.0e-12, verbosity = 1) ); md""" @@ -81,7 +82,7 @@ The reason behind this becomes more obvious at higher bond dimensions: """ groundstate, envs, delta = find_groundstate( - state, H2, IDMRG2(; trunc = truncrank(50), maxiter = 20, tol = 1.0e-12) + state, H2, IDMRG2(; trunc = truncrank(50), maxiter = 20, tol = 1.0e-12, verbosity = 1) ); entanglementplot(groundstate) @@ -125,4 +126,4 @@ Even though the bond dimension is higher than in the example without symmetry, c println(dim(V1)) println(dim(V2)) -groundstate, cache, delta = find_groundstate(state, H2, VUMPS(; maxiter = 400, tol = 1.0e-12)); +groundstate, cache, delta = find_groundstate(state, H2, VUMPS(; maxiter = 400, tol = 1.0e-12, verbosity = 1)); diff --git a/examples/quantum1d/6.hubbard/main.jl b/examples/groundstates/2.hubbard/main.jl similarity index 90% rename from examples/quantum1d/6.hubbard/main.jl rename to examples/groundstates/2.hubbard/main.jl index 0c4057484..b3400dc13 100644 --- a/examples/quantum1d/6.hubbard/main.jl +++ b/examples/groundstates/2.hubbard/main.jl @@ -9,7 +9,7 @@ a kinetic term that allows electrons to hop between neighboring sites, and a pot Often, a third term is included which serves as a chemical potential to control the number of electrons in the system. ```math -H = -t \sum_{\langle i, j \rangle, \sigma} c^{\dagger}_{i,\sigma} c_{j,\sigma} + U \sum_i n_{i,\uparrow} n_{i,\downarrow} - \mu \sum_{i,\sigma} n_{i,\sigma} +H = -t ∑_{⟨i, j⟩, σ} c^{†}_{i,σ} c_{j,σ} + U ∑_i n_{i,↑} n_{i,↓} - μ ∑_{i,σ} n_{i,σ} ``` At half-filling, the system exhibits particle-hole symmetry, which can be made explicit by rewriting the Hamiltonian slightly. @@ -17,13 +17,13 @@ First, we fix the overall energy scale by setting `t = 1`, and then shift the to This results in the following Hamiltonian: ```math -H = - \sum_{\langle i, j \rangle, \sigma} c^{\dagger}_{i,\sigma} c_{j,\sigma} + U / 4 \sum_i (1 - 2 n_{i,\uparrow}) (1 - 2 n_{i,\downarrow}) - \mu \sum_{i,\sigma} n_{i,\sigma} +H = - ∑_{⟨i, j⟩, σ} c^{†}_{i,σ} c_{j,σ} + U / 4 ∑_i (1 - 2 n_{i,↑}) (1 - 2 n_{i,↓}) - μ ∑_{i,σ} n_{i,σ} ``` Finally, setting `\mu = 0` and defining `u = U / 4` we obtain the Hubbard model at half-filling. ```math -H = - \sum_{\langle i, j \rangle, \sigma} c^{\dagger}_{i,\sigma} c_{j,\sigma} + u \sum_i (1 - 2 n_{i,\uparrow}) (1 - 2 n_{i,\downarrow}) +H = - ∑_{⟨i, j⟩, σ} c^{†}_{i,σ} c_{j,σ} + u ∑_i (1 - 2 n_{i,↑}) (1 - 2 n_{i,↓}) ``` """ @@ -36,9 +36,10 @@ using Plots using Interpolations using Optim -#src # for reproducibility: -#src using Random -#src Random.seed!(123) +# For reproducibility of this page, we fix the seed of the random number generator: + +using Random +Random.seed!(123); const t = 1.0 const mu = 0.0 @@ -46,10 +47,10 @@ const U = 3.0 md""" For this case, the ground state energy has an analytic solution, which can be used to benchmark the numerical results. -It follows from Eq. (6.82) in [](). +It follows from Eq. (6.82) in [Essler, Frahm, Göhmann, Klümper & Korepin, The One-Dimensional Hubbard Model](https://doi.org/10.1017/CBO9780511534843). ```math -e(u) = - u - 4 \int_0^{\infty} \frac{d\omega}{\omega} \frac{J_0(\omega) J_1(\omega)}{1 + \exp(2u \omega)} +e(u) = - u - 4 ∫₀^{∞} \frac{dω}{ω} \frac{J₀(ω) J₁(ω)}{1 + \exp(2u ω)} ``` We can easily verify this by comparing the numerical results to the analytic solution. @@ -57,7 +58,7 @@ We can easily verify this by comparing the numerical results to the analytic sol function hubbard_energy(u; rtol = 1.0e-12) integrandum(ω) = besselj0(ω) * besselj1(ω) / (1 + exp(2u * ω)) / ω - int, err = quadgk(integrandum, 0, Inf; rtol = rtol) + int, err = quadgk(integrandum, 0, Inf; rtol) return -u - 4 * int end @@ -67,7 +68,7 @@ function compute_groundstate( expansionfactor = (1 / 10), expansioniter = 20 ) - verbosity = 2 + verbosity = 0 psi, = find_groundstate(psi, H; tol = svalue * 10, verbosity) for _ in 1:expansioniter D = maximum(x -> dim(left_virtualspace(psi, x)), 1:length(psi)) @@ -86,7 +87,7 @@ function compute_groundstate( psi, = find_groundstate( psi, H, VUMPS(; tol = svalue / 100, verbosity, maxiter = 100) & - GradientGrassmann(; tol = svalue / 1000) + GradientGrassmann(; tol = svalue / 1000, verbosity) ) return psi @@ -107,7 +108,7 @@ md""" ## Symmetries The Hubbard model has a rich symmetry structure, which can be exploited to speed up simulations. -Apart from the fermionic parity, the model also has a $U(1)$ particle number symmetry, along with a $SU(2)$ spin symmetry. +Apart from the fermionic parity, the model also has a ``U(1)`` particle number symmetry, along with a ``SU(2)`` spin symmetry. Explicitly imposing these symmetries on the tensors can greatly reduce the computational cost of the simulation. Naively imposing these symmetries however, is not compatible with our desire to work at half-filling. @@ -139,7 +140,7 @@ The elementary excitations are known as spinons and holons, which are domain wal The fact that the spin and charge sectors are separate is a phenomenon known as spin-charge separation. The domain walls can be constructed by noticing that there are two equivalent groundstates, which differ by a translation over a single site. -In other words, the groundstates are ``\psi_{AB}` and ``\psi_{BA}``, where ``A`` and ``B`` are the two sites. +In other words, the groundstates are ``\psi_{AB}`` and ``\psi_{BA}``, where ``A`` and ``B`` are the two sites. These excitations can be constructed as follows: """ @@ -153,13 +154,13 @@ envs_BA = environments(psi_BA, H_u1_su2, psi_BA); spinon_charge = FermionParity(0) ⊠ U1Irrep(0) ⊠ SU2Irrep(1 // 2) E_spinon, ϕ_spinon = excitations( H_u1_su2, alg, momenta, psi_AB, envs_AB, psi_BA, envs_BA; - sector = spinon_charge, num = 1 + sector = spinon_charge, num = 1, verbosity = 0 ); holon_charge = FermionParity(1) ⊠ U1Irrep(-1) ⊠ SU2Irrep(0) E_holon, ϕ_holon = excitations( H_u1_su2, alg, momenta, psi_AB, envs_AB, psi_BA, envs_BA; - sector = holon_charge, num = 1 + sector = holon_charge, num = 1, verbosity = 0 ); md""" @@ -215,7 +216,7 @@ md""" The plot shows some discrepancies between the numerical and analytic results. First and foremost, we must realize that in the thermodynamic limit, the momentum of a domain wall is actually not well-defined. Concretely, only the difference in momentum between the two groundstates is well-defined, as we can always shift the momentum by multiplying one of the groundstates by a phase. -Here, we can fix this shift by realizing that our choice of shifting the groundstates by a single site, differs from the formula by a factor ``\pi/2``. +Here, we can fix this shift by realizing that our choice of shifting the groundstates by a single site, differs from the formula by a factor ``π/2``. """ momenta_shifted = rem2pi.(momenta .- π / 2, RoundNearest) diff --git a/examples/quantum1d/8.bose-hubbard/main.jl b/examples/groundstates/3.bose-hubbard/main.jl similarity index 100% rename from examples/quantum1d/8.bose-hubbard/main.jl rename to examples/groundstates/3.bose-hubbard/main.jl diff --git a/examples/quantum1d/5.haldane-spt/main.jl b/examples/groundstates/4.haldane-spt/main.jl similarity index 100% rename from examples/quantum1d/5.haldane-spt/main.jl rename to examples/groundstates/4.haldane-spt/main.jl diff --git a/examples/quantum1d/5.haldane-spt/spt-tensors.svg b/examples/groundstates/4.haldane-spt/spt-tensors.svg similarity index 100% rename from examples/quantum1d/5.haldane-spt/spt-tensors.svg rename to examples/groundstates/4.haldane-spt/spt-tensors.svg diff --git a/examples/quantum1d/1.ising-cft/main.jl b/examples/groundstates/5.ising-cft/main.jl similarity index 99% rename from examples/quantum1d/1.ising-cft/main.jl rename to examples/groundstates/5.ising-cft/main.jl index a3f45887e..571e6ec74 100644 --- a/examples/quantum1d/1.ising-cft/main.jl +++ b/examples/groundstates/5.ising-cft/main.jl @@ -122,7 +122,7 @@ can reach higher system sizes. L_mps = 20 H_mps = periodic_boundary_conditions(transverse_field_ising(), L_mps) D = 64 -ψ, envs, δ = find_groundstate(FiniteMPS(L_mps, ℂ^2, ℂ^D), H_mps, DMRG()); +ψ, envs, δ = find_groundstate(FiniteMPS(L_mps, ℂ^2, ℂ^D), H_mps, DMRG(; verbosity = 0)); md""" Excitations on top of the ground state can be found through the use of the quasiparticle diff --git a/examples/quantum1d/1.ising-cft/translation_mpo.svg b/examples/groundstates/5.ising-cft/translation_mpo.svg similarity index 100% rename from examples/quantum1d/1.ising-cft/translation_mpo.svg rename to examples/groundstates/5.ising-cft/translation_mpo.svg diff --git a/examples/make.jl b/examples/make.jl index c6c9cfd72..13a9fb049 100644 --- a/examples/make.jl +++ b/examples/make.jl @@ -65,6 +65,18 @@ function attach_notebook_badge(root, name, str) return join(map(markdown_only, (mybinder, nbviewer, download)), "\n") * "\n\n" * str end +# Log messages captured from an executed example carry the absolute source location of +# whatever emitted them, e.g. +# +# └ @ MPSKit /home/someone/checkout/src/algorithms/groundstate/vumps.jl:87 +# └ @ OptimKit /home/someone/.julia/packages/OptimKit/K7Ujj/src/cg.jl:188 +# +# Both depend on who ran the pipeline — the checkout path for a dev'ed package, and the +# depot slug for an installed one — so committing them makes the rendered pages differ +# per machine. The module name is already printed, so keep only the in-package path. +normalize_log_locations(content::AbstractString) = + replace(content, r"(@ [A-Za-z_][A-Za-z0-9_]* )\S*?/(src/\S*\.jl:\d+)" => s"\1\2") + function build_example(root, name) source_dir = joinpath(@__DIR__, "..", "examples", root, name) source_file = joinpath(source_dir, "main.jl") @@ -74,7 +86,9 @@ function build_example(root, name) Literate.markdown( source_file, target_dir; execute = true, name = "index", preprocess = attach_notebook_badge(root, name), - postprocess = content -> externalize_figures(content, target_dir), + postprocess = content -> normalize_log_locations( + externalize_figures(content, target_dir) + ), mdstrings = true, nbviewer_root_url = "https://nbviewer.jupyter.org/github/QuantumKitHub/MPSKit.jl/blob/gh-pages/dev", binder_root_url = "https://mybinder.org/v2/gh/QuantumKitHub/MPSKit.jl/gh-pages?filepath=dev", @@ -103,5 +117,9 @@ end # Scripts # ---------------------------------------------------------------------------------------- # -build("classic2d") -build("quantum1d") +# build every topic group: each subdirectory of examples/ is one group +for group in readdir(@__DIR__) + startswith(group, '.') && continue + isdir(joinpath(@__DIR__, group)) || continue + build(group) +end diff --git a/examples/classic2d/1.hard-hexagon/hexagon.svg b/examples/statmech/0.hard-hexagon/hexagon.svg similarity index 100% rename from examples/classic2d/1.hard-hexagon/hexagon.svg rename to examples/statmech/0.hard-hexagon/hexagon.svg diff --git a/examples/classic2d/1.hard-hexagon/main.jl b/examples/statmech/0.hard-hexagon/main.jl similarity index 100% rename from examples/classic2d/1.hard-hexagon/main.jl rename to examples/statmech/0.hard-hexagon/main.jl From b7ecbd22b0cf887305fcb625227f5e0fcbe7465d Mon Sep 17 00:00:00 2001 From: lkdvos Date: Mon, 3 Aug 2026 13:09:14 -0400 Subject: [PATCH 2/8] docs(tutorials): add the tutorial track A hand-held, sequential path for someone who has never used the package: install it, find a ground state with DMRG, take the same model to the thermodynamic limit with VUMPS, quench it, extract excitations, then re-run the whole thing with symmetries. Each page ends where the next begins, and the transverse-field Ising model runs through all of them so the reader accumulates familiarity rather than meeting a new model per page. Co-Authored-By: Claude Opus 5 (1M context) --- docs/make.jl | 8 + docs/src/tutorials/excitations.md | 105 ++++++++++++++ docs/src/tutorials/first_groundstate.md | 150 +++++++++++++++++++ docs/src/tutorials/installation.md | 63 ++++++++ docs/src/tutorials/thermodynamic_limit.md | 134 +++++++++++++++++ docs/src/tutorials/time_evolution.md | 134 +++++++++++++++++ docs/src/tutorials/using_symmetries.md | 169 ++++++++++++++++++++++ 7 files changed, 763 insertions(+) create mode 100644 docs/src/tutorials/excitations.md create mode 100644 docs/src/tutorials/first_groundstate.md create mode 100644 docs/src/tutorials/installation.md create mode 100644 docs/src/tutorials/thermodynamic_limit.md create mode 100644 docs/src/tutorials/time_evolution.md create mode 100644 docs/src/tutorials/using_symmetries.md diff --git a/docs/make.jl b/docs/make.jl index 2d71a20a0..c64e8bb74 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -53,6 +53,14 @@ makedocs(; ), pages = [ "Home" => "index.md", + "Tutorials" => [ + "tutorials/installation.md", + "tutorials/first_groundstate.md", + "tutorials/thermodynamic_limit.md", + "tutorials/time_evolution.md", + "tutorials/excitations.md", + "tutorials/using_symmetries.md", + ], "Manual" => [ "man/intro.md", "man/states.md", diff --git a/docs/src/tutorials/excitations.md b/docs/src/tutorials/excitations.md new file mode 100644 index 000000000..a34346485 --- /dev/null +++ b/docs/src/tutorials/excitations.md @@ -0,0 +1,105 @@ +# [Quasiparticle excitations](@id tutorial_excitations) + +The previous tutorials ended with a ground state: the lowest-energy state of the transverse-field Ising model, first on a finite chain and then directly in [the thermodynamic limit](@ref tutorial_thermodynamic_limit). +The natural next question is what lies *above* it: how much energy does it cost to excite the system? +For a translation-invariant chain the answer is organized by momentum — for each momentum ``k`` there is a lowest excitation energy ``\Delta E(k)``, and the resulting curve is the **dispersion relation** of the model. +Its minimum over all momenta is the **energy gap**, one of the most basic characterizations of a quantum phase. + +In this tutorial we compute the dispersion relation of the infinite transverse-field Ising chain with MPSKit's quasiparticle ansatz, and finish with a plot of ``\Delta E(k)`` across the Brillouin zone — compared against the exact solution. + +## Loading the packages + +As in the previous tutorials, every code block on this page shares one Julia session, so we load the packages once. + +```@example excitations +using MPSKit, MPSKitModels, TensorKit +using Plots +``` + +## 1. Find the ground state + +Excitations are computed *on top of* a ground state, so the first step is the calculation you already know from [The thermodynamic limit](@ref tutorial_thermodynamic_limit): build the infinite Hamiltonian, make a random `InfiniteMPS`, and converge it with `VUMPS`. + +This time we set the field to `g = 2.0`, deep in the paramagnetic phase, where the model is **gapped**: the lowest excitation costs a finite amount of energy, which is exactly what we want to measure. + +```@example excitations +g = 2.0 +H = transverse_field_ising(; g) +ψ₀ = InfiniteMPS(ℂ^2, ℂ^12) +ψ, envs, ϵ = find_groundstate(ψ₀, H, VUMPS(; verbosity = 0)) +``` + +We keep all three return values this time: the optimized state `ψ` and the environments `envs` both feed directly into the excitation calculation below, so nothing has to be recomputed. + +## 2. One excitation at one momentum + +The **quasiparticle ansatz** builds an excited state directly on top of the uniform ground state. +The idea is simple to picture: take the converged ground state and perturb it locally, replacing the tensor at one site with a new one that we get to optimize. +Because the chain is infinite and translation invariant, we do not place this perturbation at any particular site; instead we superpose it across *all* sites with a plane-wave phase, which gives the excitation a definite momentum ``k``. +Optimizing the perturbation then yields the lowest excited state at that momentum. + +The call is [`excitations`](@ref) with the [`QuasiparticleAnsatz`](@ref) algorithm, a momentum (a real number, in radians per site), and the ground state with its environments. +Let us ask for the excitation at the edge of the Brillouin zone, ``k = \pi``: + +```@example excitations +E, ϕ = excitations(H, QuasiparticleAnsatz(), π, ψ, envs) +E +``` + +Two things to note about the return values: + +- `E` is a *vector* of excitation energies, of length `num` — the keyword controlling how many excitations to compute at this momentum, which defaults to `num = 1`, so here it has a single entry. +- The entries of `E` are energies **above the ground state** — gaps at this momentum, not total energies. The ground-state energy is subtracted internally, so you can read them off directly. + +The second return value `ϕ` holds the corresponding quasiparticle states, which can be used for further post-processing; we will not need them in this tutorial. + +## 3. The full dispersion + +To trace out the whole dispersion relation we simply pass a *range* of momenta instead of a single number. +By symmetry it is enough to scan from ``0`` to ``\pi``, and we use 16 points to keep the runtime modest. + +```@example excitations +momenta = range(0, π, 16) +Es, ϕs = excitations(H, QuasiparticleAnsatz(), momenta, ψ, envs; verbosity = 0) +size(Es) +``` + +With a range of momenta the energies come back as a matrix of size `(length(momenta), num)` — here `(16, 1)`, one row per momentum and one column because we kept the default `num = 1`. +We pass `verbosity = 0` to silence the progress line this method otherwise prints for every momentum. +The momenta are independent of one another, so MPSKit works on them in parallel by default. + +## 4. Plot the dispersion + +Now for the payoff. +This particular model is exactly solvable, so we can plot our numerical dispersion right on top of the known answer: + +```math +\Delta E(k) = 2\sqrt{1 + g^2 - 2 g \cos k}. +``` + +For this Hermitian problem the computed energies come back as real numbers; the `real.(...)` below is a harmless safeguard for the general case, where the eigenvalue solver may return a complex number type with numerically vanishing imaginary parts. + +```@example excitations +k_exact = range(0, π, 200) +ΔE_exact = @. 2 * sqrt(1 + g^2 - 2g * cos(k_exact)) +plot(k_exact, ΔE_exact; label = "exact", xlabel = "momentum k", ylabel = "ΔE(k)", title = "TFIM dispersion (g = $g)") +scatter!(momenta, real.(Es); label = "quasiparticle ansatz (D = 12)") +``` + +The 16 computed points fall right on the exact curve. +The dispersion rises monotonically from ``k = 0`` to ``k = \pi``, so its minimum — the gap — sits at zero momentum, where the exact value is ``\Delta E(0) = 2(g - 1)``. +Our first matrix entry is precisely that point, so we can close with a numerical check: + +```@example excitations +real(Es[1, 1]), 2 * (g - 1) +``` + +A ground state at bond dimension 12 plus a variational quasiparticle on top reproduces the exact gap of the model — that is the quasiparticle ansatz working as intended. + +## Where to go next + +You have computed a full dispersion relation on top of an infinite ground state and read off the energy gap. + +The [`excitations`](@ref) entry point can do considerably more than what we used here: it can target excitations carrying a nontrivial symmetry charge, build topological (domain-wall) excitations that interpolate between two different ground states, and compute excited states of *finite* chains, where momentum is no longer a good quantum number and different algorithms take over. +All of these are recipes in [Excited states](@ref howto_excitations). +For what each excitation algorithm actually does and when to choose it, see the library reference [Excitations](@ref lib_excitations). diff --git a/docs/src/tutorials/first_groundstate.md b/docs/src/tutorials/first_groundstate.md new file mode 100644 index 000000000..3b2473b74 --- /dev/null +++ b/docs/src/tutorials/first_groundstate.md @@ -0,0 +1,150 @@ +# [Your first ground state](@id tutorial_first_groundstate) + +This tutorial walks you through a complete MPSKit.jl calculation from start to finish: we build the transverse-field Ising model, find its ground state with DMRG, measure a few physical quantities, and finish with a plot of the magnetization across the model's phase transition. +It assumes only that you are comfortable with basic quantum mechanics and that you have finished [Installation](@ref tutorial_installation), so the packages used below are already available in your environment. + +The transverse-field Ising model (TFIM) is the "hello world" of quantum many-body physics: it is the simplest model that still shows a genuine quantum phase transition, so it is the natural place to learn the tools. +On a chain of ``L`` spin-1/2 sites it is + +```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. +The coupling ``J`` sets the overall energy scale, and the dimensionless field ``g`` tunes the competition between the ferromagnetic ``\sigma^z\sigma^z`` interaction and the transverse ``\sigma^x`` field. + +The ground state of ``H`` lives in a Hilbert space of dimension ``2^L``, which is far too large to store as a plain vector for any interesting ``L``. +A *matrix product state* (MPS) sidesteps this by storing the state as a chain of small tensors, one per site, whose sizes we control directly; this is what makes the calculation below tractable. +The details of that compression are the subject of the concept pages — here we simply use it. + +## Loading the packages + +Every code block on this page shares one Julia session, so we only need to load packages once. +We take the model and lattice from MPSKitModels, the local spin operators from TensorKitTensors, and `Plots` for the final figure. + +```@example first-groundstate +using MPSKit, MPSKitModels, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ +using Plots +``` + +## 1. Build the Hamiltonian + +We work with a chain of `L = 16` sites and fix the field to `g = 0.5` for now. +`transverse_field_ising` assembles the Hamiltonian above; passing `FiniteChain(L)` asks for a finite open chain of `L` sites. + +```@example first-groundstate +L = 16 +H = transverse_field_ising(FiniteChain(L); g = 0.5) +``` + +The returned object is an `MPOHamiltonian`: the Hamiltonian written in matrix-product-operator form, i.e. as a chain of small tensors just like the state it acts on. +You do not need to know its internals to use it — MPSKit's algorithms consume it directly. +For other ways to build Hamiltonians see [Building Hamiltonians](@ref howto_hamiltonians). + +## 2. Build the initial state + +DMRG is an optimization: it needs a starting state to improve. +We create a random `FiniteMPS` with the right structure. + +```@example first-groundstate +D = 4 +ψ₀ = FiniteMPS(L, ℂ^2, ℂ^D) +``` + +The two space arguments describe the two kinds of index every MPS tensor carries: + +- `ℂ^2` is the **physical space** — the local Hilbert space of a single spin-1/2 site, which has dimension 2. +- `ℂ^D` is the **virtual (bond) space** — the internal index linking neighbouring tensors, whose dimension `D` is the *bond dimension*. + +The bond dimension `D` is the accuracy knob of the whole method: a larger `D` lets the MPS capture more entanglement and represent the true ground state more faithfully, at the cost of more computation. +`D = 4` is deliberately small so this tutorial runs quickly; [Controlling bond dimension](@ref howto_bond_dimension) covers how to choose and grow it. + +!!! warning "Pass spaces, not integers" + The physical and virtual arguments must be *vector spaces* (`ℂ^2`, `ℂ^D`, or equivalently `ComplexSpace(2)`), never bare integers. + Writing `FiniteMPS(16, 2, 4)` throws a `MethodError` — this is the single most common beginner mistake. + +## 3. Find the ground state + +Now we run the calculation. +`find_groundstate` takes the starting state, the Hamiltonian, and an algorithm; we pass [`DMRG`](@ref) explicitly so the algorithm is visible. + +```@example first-groundstate +ψ, envs, ϵ = find_groundstate(ψ₀, H, DMRG()) +``` + +DMRG (the density-matrix renormalization group) sweeps back and forth along the chain, locally optimizing each tensor while holding the others fixed, and repeats until the state stops changing. +The lines printed above are the per-iteration convergence log (shown at the default `verbosity`); each reports the sweep number, the current energy, and a convergence measure (the same Galerkin residual returned as `ϵ` below). + +!!! note "The algorithm is optional" + Calling `find_groundstate(ψ₀, H)` with no algorithm argument selects DMRG automatically for a finite input, so the explicit `DMRG()` above is only for clarity. + `DMRG` accepts keywords such as `tol` (default `1e-10`), `maxiter` (default `200`), and `verbosity` (default `3`); we use `verbosity = 0` later to silence the log inside a loop. + +`find_groundstate` returns a triple: + +- `ψ` — the optimized ground-state MPS (a *new* state; `ψ₀` is left untouched, so we can reuse it below). A mutating variant `find_groundstate!` also exists. +- `envs` — the *environments*, cached partial contractions that later measurements can reuse to save work. +- `ϵ` — a convergence-error measure (the Galerkin residual). It quantifies how well the sweeps converged; note that it is **not** the error in the energy. + +## 4. Measure observables + +With a ground state in hand we can extract physical quantities. +The energy is the expectation value of the Hamiltonian itself — pass `H` directly, with no site index: + +```@example first-groundstate +E = expectation_value(ψ, H) +``` + +For a Hermitian `H` and a normalized state this is real up to floating-point noise. + +The order parameter of the TFIM is the local magnetization ``\langle\sigma^z_i\rangle``. +We measure it at every site by pairing each site index with the single-site operator `σᶻ()`: + +```@example first-groundstate +[expectation_value(ψ, i => σᶻ()) for i in 1:L] +``` + +Finally, a good "how converged am I really?" check is the energy variance ``\langle H^2\rangle - \langle H\rangle^2``, which vanishes exactly when `ψ` is a true eigenstate: + +```@example first-groundstate +variance(ψ, H) +``` + +A small variance indicates the state is close to an eigenstate of `H`. +More recipes for observables live in [Computing observables](@ref howto_observables). + +## 5. Magnetization across the transition + +The payoff: we sweep the field `g` from 0 to 2 and, for each value, find the ground state and record its average magnetization. +This traces out the phase transition. + +Each step of the sweep repeats the workflow of Sections 1–4 on the same open chain — only the value of `g` changes. + +```@example first-groundstate +g_values = 0:0.1:2 +M = map(g_values) do g + Hg = transverse_field_ising(FiniteChain(L); g = g) + ψg, = find_groundstate(ψ₀, Hg; verbosity = 0) + return abs(sum(expectation_value(ψg, i => σᶻ()) for i in 1:L)) / L +end +scatter(g_values, M; xlabel = "g", ylabel = "M", label = "D = $D", title = "TFIM magnetization") +``` + +Here we take the **absolute value** of the mean magnetization. +At finite `L` the exact ground state does not break the symmetry: it is the symmetric combination of the two oppositely magnetized states, and its raw magnetization ``\sum_i\langle\sigma^z_i\rangle`` is exactly zero. +DMRG at finite bond dimension, however, converges to one of the two symmetry-broken states instead, because either one carries far less entanglement than their symmetric superposition. +Which sign it lands on is arbitrary — it can differ from run to run and between values of `g` — so taking `abs` makes the order-parameter curve well-defined regardless of the branch. + +The plot shows the magnetization close to 1 deep on the ordered side, then dropping to zero — noticeably *below* the thermodynamic critical point `g = 1` (around `g ≈ 0.6` at these parameters). +Both features follow from how the state is computed rather than from the physics of the transition: +on the ordered side DMRG sits on one symmetry-broken branch, and past the drop it recovers the exactly symmetric ground state, whose magnetization vanishes. +Exactly where the drop lands depends on `L` and `D`, so its location by itself is *not yet* a measurement of the critical point. +The honest way to locate the transition is by performing a scaling analysis, taking the limit of infinite size and bond dimension. + +## Where to go next + +You have run a full MPSKit workflow: build a model, optimize an MPS ground state, measure observables, and scan a parameter. +A natural next step is [The thermodynamic limit](@ref tutorial_thermodynamic_limit): +the same calculation performed directly at infinite system size with an `InfiniteMPS`, which removes the finite-size effects seen above and lets you locate the critical point more cleanly. + +To go deeper on the individual steps, see [Constructing states](@ref howto_states), [Building Hamiltonians](@ref howto_hamiltonians), [Computing observables](@ref howto_observables), [Controlling bond dimension](@ref howto_bond_dimension), and [Entanglement entropy and spectrum](@ref howto_entanglement); the algorithm reference is [Ground-state algorithms](@ref lib_groundstate). diff --git a/docs/src/tutorials/installation.md b/docs/src/tutorials/installation.md new file mode 100644 index 000000000..78b67dc4b --- /dev/null +++ b/docs/src/tutorials/installation.md @@ -0,0 +1,63 @@ +# [Installation](@id tutorial_installation) + +This page walks you through setting up a Julia environment for working with MPSKit.jl, and ends with a small snippet you can run to check that everything works. + +## Prerequisites + +You need a working installation of Julia, version 1.10 or later. +If you don't have Julia yet, install it via [juliaup](https://github.com/JuliaLang/juliaup) or download it directly from [julialang.org](https://julialang.org/downloads/). +This tutorial assumes you are comfortable starting the Julia REPL and typing commands into it, but does not assume any prior experience with Julia's package manager. + +## Set up a project environment + +Before installing any packages, create a dedicated environment for this tutorial. +Working in a fresh, named environment (rather than the global default environment) keeps the exact package versions you use here reproducible, and avoids clashes with other projects on your machine. + +Start Julia, enter the package manager by pressing `]`, and activate a new environment: + +``` +pkg> activate mpskit-tutorial +``` + +Julia will create the environment the first time you add a package to it. + +## Install the packages + +With the environment activated, install MPSKit.jl and the packages used throughout this documentation: + +``` +pkg> add MPSKit TensorKit TensorOperations MPSKitModels TensorKitTensors Plots +``` + +- `MPSKit` provides the matrix product state and operator types, together with the ground-state, time-evolution, and bond-dimension algorithms. +- `TensorKit` supplies the tensor backend (`TensorMap`s and vector spaces) that MPSKit is built on; installing it alongside MPSKit also gives access to truncation-scheme constructors such as `truncrank`, which TensorKit re-exports from MatrixAlgebraKit. +- `TensorOperations` provides the `@tensor` macro used to contract tensors by hand. +- `MPSKitModels` collects pre-defined Hamiltonians (such as the transverse-field Ising model) and lattices for common physical models. +- `TensorKitTensors` provides ready-made local operators, such as the Pauli operators. +- `Plots` is used to visualize results in several of the how-to guides and examples; it is optional if you only intend to run computations without plotting. + +MPSKit.jl is registered in Julia's General registry, so `pkg> add` fetches it directly; you do not need to add any custom registries. + +!!! note "First `using` is slow" + The first time you load these packages with `using`, Julia precompiles them, which can take a minute or two. + Subsequent loads in the same environment are much faster. + +## Verify your setup + +Once the packages have finished installing, exit the package manager (backspace) and run the following in the same environment to check that MPSKit, TensorKit, and MPSKitModels work together. + +```@example verify-install +using MPSKit, TensorKit, MPSKitModels + +H = transverse_field_ising(FiniteChain(8); J = 1.0, g = 0.5) +ψ = FiniteMPS(8, ℂ^2, ℂ^8) +``` + +If this runs without error and prints a `FiniteMPS`, your environment is ready. + +From here, continue with [Your first ground state](@ref tutorial_first_groundstate), which uses this same Hamiltonian and initial state to find the ground state of the transverse-field Ising model with DMRG. + +## Troubleshooting + +- **Long precompilation on first use:** this is expected the first time you `using` a package (or after updating one), especially for a large dependency stack; it is not a sign that anything is wrong. +- **Version resolver conflicts:** if `pkg> add` reports that it cannot find a compatible set of versions, try creating a fresh environment (as above) rather than adding these packages to an existing environment that already has other constraints. diff --git a/docs/src/tutorials/thermodynamic_limit.md b/docs/src/tutorials/thermodynamic_limit.md new file mode 100644 index 000000000..0be68f69e --- /dev/null +++ b/docs/src/tutorials/thermodynamic_limit.md @@ -0,0 +1,134 @@ +# [The thermodynamic limit](@id tutorial_thermodynamic_limit) + +In [Your first ground state](@ref tutorial_first_groundstate) we put the transverse-field Ising model on a finite chain of `L = 16` sites. +That is a perfectly good calculation, but it carries two prices: the open ends of the chain are physically different from its middle (boundary effects), and every quantity we measured still depends on the length `L` (finite-size effects). +To read off the true physics of the model we would have to repeat the calculation at several lengths and extrapolate `L → ∞`. + +MPSKit lets you skip that extrapolation and work *directly* at `L = ∞`. +The trick is translation invariance: instead of storing one tensor per site, we store a single tensor and imagine it repeated forever along the chain — an [`InfiniteMPS`](@ref). +There are no ends, so there are no boundary effects, and there is no `L` to extrapolate. +Best of all, as you are about to see, the code barely changes: the same model, the same workflow, two edits. + +!!! note "Infinite states are always normalized" + An `InfiniteMPS` is normalized to 1 by construction, and you cannot choose otherwise. + Any other normalization would make expectation values either blow up or vanish as the (infinite) chain length is taken to infinity, so per-site quantities are the only ones that make sense here. + +## Loading the packages + +As before, every code block on this page shares one Julia session, so we load the packages once. + +```@example thermodynamic-limit +using MPSKit, MPSKitModels, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ +using Plots +``` + +## 1. Build the Hamiltonian and initial state + +Here are the only two lines that differ from the finite tutorial. + +For the Hamiltonian, we drop the lattice argument. +Where the finite version wrote `transverse_field_ising(FiniteChain(L); g = 0.5)`, we simply omit `FiniteChain(L)`: with no lattice, `transverse_field_ising` builds the Hamiltonian for the infinite chain. + +```@example thermodynamic-limit +H = transverse_field_ising(; g = 0.5) +``` + +For the state, we swap `FiniteMPS` for `InfiniteMPS`. +There is no length to pass, so the constructor takes just the physical and virtual spaces — the physical space `ℂ^2` of a spin-1/2 site and the bond space `ℂ^D` whose dimension `D` is again the accuracy knob. + +```@example thermodynamic-limit +D = 4 +ψ₀ = InfiniteMPS(ℂ^2, ℂ^D) +``` + +That is the whole difference. +The bond dimension means exactly what it did on the finite chain (see [Controlling bond dimension](@ref howto_bond_dimension)), and `ℂ^2`/`ℂ^D` are the same physical/virtual spaces. + +!!! note "`InfiniteMPS` also accepts bare integers" + Unlike `FiniteMPS`, the infinite constructor happily takes plain integers: `InfiniteMPS(2, D)` is equivalent to `InfiniteMPS(ℂ^2, ℂ^D)`. + We stick with the explicit spaces to match the rest of the documentation. + +## 2. Find the ground state + +We optimize with [`VUMPS`](@ref), the infinite-chain workhorse, passing it explicitly so it is visible. + +```@example thermodynamic-limit +ψ, envs, ϵ = find_groundstate(ψ₀, H, VUMPS()) +``` + +The lines printed above are VUMPS's per-iteration convergence log, shown at the default `verbosity`. +VUMPS (the variational uniform matrix product state algorithm) optimizes the single repeated tensor directly in the thermodynamic limit, iterating until it reaches a fixed point. + +The return value has the same shape as on the finite chain: the optimized state `ψ`, the reusable `envs`, and a convergence-error measure `ϵ`. + +!!! note "The algorithm is optional here too" + Just as `find_groundstate(ψ₀, H)` selected DMRG for a finite input, calling it with no algorithm on an *infinite* input selects VUMPS automatically. + `VUMPS` accepts the familiar keywords `tol` (default `1e-10`), `maxiter` (default `200`), and `verbosity` (default `3`); we use `verbosity = 0` later to silence the log inside a loop. + Note there is no `find_groundstate!` for infinite states — VUMPS returns a fresh state and leaves `ψ₀` untouched. + +## 3. Measure observables + +For the default single-site unit cell used here, `expectation_value(ψ, H)` returns the energy of that one-site unit cell, which is exactly the **energy per site**: + +```@example thermodynamic-limit +E = expectation_value(ψ, H) +``` + +The magnetization is the local order parameter ``\langle\sigma^z\rangle``. +Because the state is translation-invariant, every site is identical, so we measure it at site 1 of the unit cell: + +```@example thermodynamic-limit +expectation_value(ψ, 1 => σᶻ()) +``` + +So far these are the same quantities we computed on the finite chain. +The infinite setting also unlocks an observable with no finite-chain analogue: the [`correlation_length`](@ref), extracted from the transfer-matrix spectrum of the uniform state. + +```@example thermodynamic-limit +correlation_length(ψ) +``` + +The correlation length tells us how far apart two spins can still "feel" each other; it is measured in units of the lattice spacing. +It grows as we approach the critical point `g = 1`, where correlations become long-ranged. +We can see this by optimizing a second state right at criticality and comparing: + +```@example thermodynamic-limit +H_crit = transverse_field_ising(; g = 1.0) +ψ_crit, = find_groundstate(ψ₀, H_crit, VUMPS(; verbosity = 0)) +correlation_length(ψ_crit) +``` + +At a genuine critical point the correlation length diverges, 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. + +## 4. Magnetization across the transition + +As on the finite chain, we finish by sweeping the field `g` and recording the magnetization. +The structure mirrors the finite sweep exactly — only `InfiniteMPS` and `VUMPS` have changed. + +```@example thermodynamic-limit +g_values = 0.1:0.1:2 +M = map(g_values) do g + Hg = transverse_field_ising(; g = g) + ψg, = find_groundstate(ψ₀, Hg, VUMPS(; verbosity = 0)) + return abs(expectation_value(ψg, 1 => σᶻ())) +end +scatter(g_values, M; xlabel = "g", ylabel = "M", label = "D = $D", title = "TFIM magnetization (L = ∞)") +``` + +Compare this with the finite-chain sweep of the previous tutorial, where the magnetization dropped to zero well before `g = 1`, at a point set by the algorithm rather than by the physics. +The infinite curve instead tracks the transition itself: the magnetization stays on its ordered branch all the way up to the critical point and collapses to zero right at `g = 1`. +What little smearing remains around the critical point is a finite-bond-dimension effect, and it shrinks as `D` grows. + +We still take the **absolute value** of the magnetization, but for a subtly different reason than on the finite chain. +On the finite chain the nonzero magnetization was an artifact of the algorithm: the exact ground state there is symmetric, and DMRG landed on a symmetry-broken state only because it carries less entanglement. +In the thermodynamic limit the symmetry breaking is genuine — the two oppositely magnetized states become true ground states — and an infinite MPS at finite bond dimension settles into one of them on the ordered side, landing on a definite nonzero magnetization of either sign; `abs` again puts both branches onto a single order-parameter curve. + +## Where to go next + +You have now run the same TFIM calculation twice — once at finite size, once directly at `L = ∞` — and seen how little the code had to change. + +From here you can go beyond ground states. +A natural next step is to [compute the excitations above this infinite ground state](@ref tutorial_excitations) (the model's quasiparticle spectrum), or to [exploit the symmetries of the model](@ref tutorial_using_symmetries) to make the calculation cheaper and more accurate. + +To go deeper on the individual steps used here, see [Constructing states](@ref howto_states), [Controlling bond dimension](@ref howto_bond_dimension), and [Entanglement entropy and spectrum](@ref howto_entanglement); the algorithm reference is [Ground-state algorithms](@ref lib_groundstate). diff --git a/docs/src/tutorials/time_evolution.md b/docs/src/tutorials/time_evolution.md new file mode 100644 index 000000000..21e8474e4 --- /dev/null +++ b/docs/src/tutorials/time_evolution.md @@ -0,0 +1,134 @@ +# [A quantum quench](@id tutorial_time_evolution) + +The previous tutorials computed ground states — static snapshots of a model at its lowest energy. +This tutorial adds the time axis: we take a state that is *not* an eigenstate of its Hamiltonian and watch it evolve under the Schrödinger equation, + +```math +|\psi(t)\rangle = e^{-iHt}\,|\psi(0)\rangle , +``` + +tracking one local observable as a function of time. +The protocol we use is the simplest and most common one in the field, a *global quench*, and the workhorse algorithm is [`TDVP`](@ref), the time-dependent variational principle, driven one step at a time through [`timestep`](@ref). + +We stay with the transverse-field Ising model from [Your first ground state](@ref tutorial_first_groundstate), so the model-building and ground-state steps below should look familiar. + +## Loading the packages + +Every code block on this page shares one Julia session, so we load the packages once. +As before, the model comes from MPSKitModels, the local spin operators from TensorKitTensors, and `Plots` draws the final figure. + +```@example time-evolution +using MPSKit, MPSKitModels, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ +using Plots +``` + +## 1. Prepare the initial state + +Time evolution needs a definite starting state, and the standard choice is the ground state of some Hamiltonian. +We take a chain of `L = 12` sites with a transverse field `g₀ = 0.5` — the ordered side of the model — and find its ground state exactly as in [the first tutorial](@ref tutorial_first_groundstate), silencing the convergence log with `verbosity = 0`. +The bond dimension `D = 16` is comfortably large for a ground state of this size; we will see below why time evolution wants more headroom than a ground-state calculation. + +```@example time-evolution +L = 12 +D = 16 +g₀ = 0.5 +H₀ = transverse_field_ising(FiniteChain(L); g = g₀) +ψ₀ = FiniteMPS(L, ℂ^2, ℂ^D) +ψ, = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0)) +nothing # hide +``` + +The observable we will track through the evolution is the transverse magnetization ``\langle\sigma^x\rangle`` at the middle of the chain, away from the open ends. +We measure its baseline value in the pre-quench ground state: + +```@example time-evolution +i_mid = L ÷ 2 +real(expectation_value(ψ, i_mid => σˣ())) +``` + +## 2. The quench + +A *global quench* is the sudden change of a parameter of the Hamiltonian, everywhere at once: we prepare the ground state of `H₀`, then at `t = 0` switch the Hamiltonian to a different `H₁` and let the state evolve under it. +Because `ψ` is an eigenstate of `H₀` but not of `H₁`, it is no longer stationary — the quench injects energy into the system, and nontrivial dynamics follows. + +Our quench takes the transverse field from `g₀ = 0.5` all the way across the phase transition to `g₁ = 2.0`: + +```@example time-evolution +g₁ = 2.0 +H₁ = transverse_field_ising(FiniteChain(L); g = g₁) +``` + + +## 3. A single time step + +The elementary move of real-time evolution in MPSKit is [`timestep`](@ref), which advances a state by one small increment `dt`. +Its arguments are, in order: the state, the Hamiltonian to evolve under, the current time, the step size, and the algorithm. +Here we take the very first step, from `t = 0.0` to `t = dt`, with single-site [`TDVP`](@ref): + +```@example time-evolution +dt = 0.05 +ψ_t, envs = timestep(ψ, H₁, 0.0, dt, TDVP()) +real(expectation_value(ψ_t, i_mid => σˣ())) +``` + +TDVP integrates the Schrödinger equation projected onto the space of MPS with the current bond dimension, which is why it slots so naturally into an MPS workflow. + +`timestep` returns two things: + +- `ψ_t` — the evolved state at time `dt` (a new state; `ψ` is left untouched). +- `envs` — the environments, cached partial contractions belonging to the new state and `H₁`. + +The `envs` are the reason evolution loops are cheap to keep running: passing them back into the next `timestep` call lets it start from the cached contractions instead of recomputing them from scratch. + +The transverse magnetization has already moved slightly away from its `t = 0` value — the state is on its way. + +## 4. Evolving in a loop + +Real-time evolution is nothing more than this single step, repeated. +We already took step 1 above, so the loop below performs the remaining steps, up to `n_steps = 40` in total (a final time of `t = 2.0`), recording the transverse magnetization at the middle of the chain after every step. +Note how each iteration feeds the previous `envs` back in as the optional last argument, and how the current time `(n - 1) * dt` advances with the loop. + +```@example time-evolution +n_steps = 40 +times = (0:n_steps) .* dt +m = zeros(n_steps + 1) +m[1] = real(expectation_value(ψ, i_mid => σˣ())) # t = 0, before the quench dynamics +m[2] = real(expectation_value(ψ_t, i_mid => σˣ())) # t = dt, from the single step above +for n in 2:n_steps + global ψ_t, envs + ψ_t, envs = timestep(ψ_t, H₁, (n - 1) * dt, dt, TDVP(), envs) + m[n + 1] = real(expectation_value(ψ_t, i_mid => σˣ())) +end +m[end] +``` + +(The `global` keyword is needed because the loop rebinds `ψ_t` and `envs`, which live outside it; inside a function you would not need it.) + +Writing the loop by hand like this keeps every moving part visible, which is the point of a tutorial. +For production use, [`time_evolve`](@ref) wraps exactly this loop and steps through a whole vector of time points in one call — see [Time evolution](@ref howto_time_evolution). + +## 5. Magnetization over time + +The payoff: the transverse magnetization at the middle of the chain, as a function of time after the quench. + +```@example time-evolution +plot(times, m; + xlabel = "t", ylabel = "⟨σˣ⟩ at site $i_mid", + label = "TDVP, D = $D", title = "TFIM transverse magnetization after a quench") +``` + +The curve shows how the observable responds to the sudden change in the field: starting from its pre-quench value, ``\langle\sigma^x\rangle`` relaxes towards a new value set by `H₁`, with oscillations along the way. + +!!! warning "Fixed bond dimension means finite reach in time" + Single-site TDVP keeps the bond dimension fixed at whatever the initial state has. + After a quench, however, the entanglement of the evolving state grows with time, so a fixed bond dimension can only follow the true dynamics faithfully up to some finite time — beyond it, the simulation quietly loses accuracy rather than failing loudly. + The practical checks and remedies — two-site [`TDVP2`](@ref), which grows the bond dimension as it truncates, and bond-expansion options for single-site TDVP — are collected in [Time evolution](@ref howto_time_evolution). + +## Where to go next + +You have run your first dynamics simulation: prepare a ground state, quench the Hamiltonian, step the state forward in time, and read off an observable at every step. + +The natural reference for everything this page glossed over is the [Time evolution](@ref howto_time_evolution) how-to: evolving over a time span in one call, growing the bond dimension during evolution, imaginary time, and evolving infinite states. +Speaking of which — everything here was done on a finite chain, but `timestep` works just as well on the `InfiniteMPS` states introduced in [The thermodynamic limit](@ref tutorial_thermodynamic_limit). +And for measuring more than a single local magnetization on the evolved states, see [Computing observables](@ref howto_observables). diff --git a/docs/src/tutorials/using_symmetries.md b/docs/src/tutorials/using_symmetries.md new file mode 100644 index 000000000..95716596b --- /dev/null +++ b/docs/src/tutorials/using_symmetries.md @@ -0,0 +1,169 @@ +# [Using symmetries](@id tutorial_using_symmetries) + +In [Your first ground state](@ref tutorial_first_groundstate) and [The thermodynamic limit](@ref tutorial_thermodynamic_limit) we treated the transverse-field Ising model (TFIM) as a generic spin chain. +But the TFIM is not generic: it has a symmetry, and in this tutorial we teach MPSKit about it. + +Recall the Hamiltonian, + +```math +H = -J\left(\sum_{\langle i,j\rangle} \sigma^z_i\,\sigma^z_j + g\sum_i \sigma^x_i\right), +``` + +and consider the *global spin flip* ``P = \prod_i \sigma^x_i``, which flips every spin at once. +Conjugating by ``P`` sends ``\sigma^z_i \to -\sigma^z_i``, so the interaction term ``\sigma^z_i\sigma^z_j`` picks up two minus signs and is unchanged, while the field term ``\sigma^x_i`` commutes with ``P`` trivially. +Hence ``H`` commutes with ``P``. +Since ``P^2 = 1``, this is a ``\mathbb{Z}_2`` symmetry, and every eigenstate of ``H`` can be labelled by a parity quantum number: *even* (``P = +1``) or *odd* (``P = -1``). + +MPSKit, through the TensorKit tensor backend, can bake this symmetry directly into the tensors of the MPS. +Doing so buys you two things. +First, the tensors become **block-sparse**: at the same total bond dimension the computer multiplies smaller dense blocks, which is faster. +Second, every state you compute carries an explicit **sector label**, so "the lowest odd-parity excitation" becomes something you can ask for directly. +This tutorial demonstrates both, by redoing the finite-chain TFIM calculation once without and once with the symmetry. + +!!! note "Why ``\\mathbb{Z}_2`` and not U(1)?" + ``\\mathbb{Z}_2`` is the symmetry the TFIM actually has, and it is what `MPSKitModels.transverse_field_ising` supports: its `symmetry` argument accepts `Trivial`, `Z2Irrep` or `FermionParity`, and anything else — `U1Irrep` included — throws an `ArgumentError`. + Larger groups pay off more, but need a model that has them: for U(1) see [Constructing states](@ref howto_states), and for SU(2) the Heisenberg pages in the [examples gallery](@ref examples_index). + +## Loading the packages + +Every code block on this page shares one Julia session, so we load the packages once. +`Z2Irrep` and `Z2Space`, the symmetry-aware building blocks used below, come from TensorKit. + +```@example using-symmetries +using MPSKit, MPSKitModels, TensorKit +``` + +## 1. Recap: the ground state without symmetry + +We start from the workflow of the first tutorial: a chain of `L = 16` sites, a random `FiniteMPS`, and a DMRG ground-state search. +Two small changes from before: we set the field to `g = 2.0`, and we use a total bond dimension of 16. + +Why `g = 2.0`? +This puts us deep in the paramagnetic phase, where the ground state respects the spin-flip symmetry. +That matters for what comes next: an MPS built from symmetric tensors lives in exactly one parity sector and *cannot* spontaneously break the symmetry, so a fair comparison needs a point where the true ground state is symmetric to begin with. + +```@example using-symmetries +L = 16 +H = transverse_field_ising(FiniteChain(L); g = 2.0) +ψ₀ = FiniteMPS(L, ℂ^2, ℂ^16) +ψ, envs, ϵ = find_groundstate(ψ₀, H, DMRG(; verbosity = 0)) +E = expectation_value(ψ, H) +``` + +This is our reference number: the ground-state energy computed with plain, symmetry-oblivious tensors. + +## 2. The same model, with the symmetry made explicit + +To exploit the symmetry we change two lines: the Hamiltonian and the initial state. + +For the Hamiltonian, we pass the symmetry as an extra first argument. +`transverse_field_ising(Z2Irrep, ...)` builds the *same* Hamiltonian as before, but out of tensors that manifestly commute with the spin flip: + +```@example using-symmetries +H_Z2 = transverse_field_ising(Z2Irrep, FiniteChain(L); g = 2.0) +``` + +For the state, the plain spaces `ℂ^2` and `ℂ^16` are replaced by *graded* spaces that keep track of parity: + +```@example using-symmetries +ψ₀_Z2 = FiniteMPS(L, Z2Space(0 => 1, 1 => 1), Z2Space(0 => 8, 1 => 8)) +``` + +The syntax reads as a list of `sector => dimension` pairs, where sector `0` is the even (``P = +1``) irrep of ``\mathbb{Z}_2`` and sector `1` is the odd (``P = -1``) one: + +- The physical space `Z2Space(0 => 1, 1 => 1)` is the familiar two-dimensional spin-1/2 site, now split into its symmetry content: one even state and one odd state. +- The virtual space `Z2Space(0 => 8, 1 => 8)` says the bond carries 8 states of even parity and 8 of odd parity — 16 in total, matching the `ℂ^16` of the plain run, so the two calculations have exactly the same variational power. + +From here the workflow is unchanged: + +```@example using-symmetries +ψ_Z2, envs_Z2, ϵ_Z2 = find_groundstate(ψ₀_Z2, H_Z2, DMRG(; verbosity = 0)) +E_Z2 = expectation_value(ψ_Z2, H_Z2) +``` + +Both runs found the same ground state, and the two energies agree to numerical precision: + +```@example using-symmetries +E, E_Z2 +``` + +!!! note "Same physics, different bookkeeping" + Nothing about the model changed — only the way its tensors are stored. + The symmetric calculation restricts the search to states of definite (here: even) parity, and stores only the tensor blocks the symmetry allows to be nonzero. + +## 3. The payoff, part 1: block-sparse tensors + +Where did the symmetry go? +Into the *structure* of the state. +Ask for the virtual space at the central bond and you no longer get an anonymous `ℂ^16`, but a space that knows its sector decomposition: + +```@example using-symmetries +V = left_virtualspace(ψ_Z2, L ÷ 2) +``` + +Its total dimension is still 16: + +```@example using-symmetries +dim(V) +``` + +The same sector labels show up in every quantity derived from the state. +The entanglement spectrum at the central cut, for instance, now comes back resolved by sector — compare [Entanglement entropy and spectrum](@ref howto_entanglement), where the same call on an unsymmetric state produced a single `Trivial()` block: + +```@example using-symmetries +spectrum = entanglement_spectrum(ψ_Z2, L ÷ 2) +collect(keys(spectrum)) +``` + +Iterating `pairs` gives each sector together with its singular values: + +```@example using-symmetries +collect(pairs(spectrum)) +``` + +This block structure is where the speedup comes from: instead of multiplying one dense 16-dimensional bond index, the computer multiplies two independent blocks of roughly half that size, and the forbidden matrix elements between the sectors are never stored or touched at all. +At bond dimension 16 the difference is negligible, but the saving grows with the bond dimension and with the size of the symmetry group. + +## 4. The payoff, part 2: sectors label the physics + +The sector labels are not just an implementation detail — they classify the eigenstates of ``H``, and MPSKit lets you target a sector directly. + +In the paramagnetic phase the lowest excitation of the TFIM is, roughly speaking, a single flipped spin. +Flipping one spin changes the parity of the state, so this excitation lives in the *odd* sector — a different sector than the (even) ground state. + +The [`excitations`](@ref) function computes excited states on top of a converged ground state; on a finite chain it takes the Hamiltonian, an algorithm, the ground state, and its environments, and returns energies measured *above* the ground state. +By default it searches the trivial (even) sector: + +```@example using-symmetries +Es_even, ϕs_even = excitations(H_Z2, QuasiparticleAnsatz(), ψ_Z2, envs_Z2; num = 1) +Es_even[1] +``` + +The `sector` keyword redirects the search to the odd sector: + +```@example using-symmetries +Es_odd, ϕs_odd = excitations( + H_Z2, QuasiparticleAnsatz(), ψ_Z2, envs_Z2; + num = 1, sector = Z2Irrep(1) +) +Es_odd[1] +``` + +The odd-sector excitation is indeed the lower one: + +```@example using-symmetries +Es_odd[1] < Es_even[1] +``` + +Without the symmetry built into the tensors, this question could not even be posed: the plain calculation of Section 1 has no notion of parity to select on. +More ways to use `excitations` — dispersion relations, other algorithms, infinite chains — are collected in [Excited states](@ref howto_excitations). + +## Where to go next + +You have run the flagship TFIM calculation with its ``\mathbb{Z}_2`` symmetry made explicit: the same physics at the same total bond dimension, but with block-sparse tensors and sector labels on everything the calculation produces. + +The same syntax scales up to larger symmetry groups, where the payoff grows. +For a U(1) symmetry (particle number, magnetization) the graded spaces list integer or half-integer charges instead of parities — worked constructions are in [Constructing states](@ref howto_states), Section 9. +For non-abelian symmetries such as SU(2) the gains are more dramatic still, because each symmetric block then represents an entire multiplet of states; the spin-1 Haldane chain and XXZ Heisenberg pages in the [examples gallery](@ref examples_index) show this in action. + +To continue the tutorial track, [Quasiparticle excitations](@ref tutorial_excitations) develops the excitation calculation of Section 4 into a full dispersion relation; the recipe collection for excited states is [Excited states](@ref howto_excitations), and the one for building symmetric states is [Constructing states](@ref howto_states). From 82ff180f31355f1189e456de8e5763d813fcc1a0 Mon Sep 17 00:00:00 2001 From: lkdvos Date: Mon, 3 Aug 2026 13:09:39 -0400 Subject: [PATCH 3/8] docs(howto): add task-oriented recipe pages Where the tutorials teach, these answer "how do I do X" for someone who already knows what they want: build a state or a Hamiltonian, pick and configure a ground-state algorithm, grow or truncate a bond dimension, evolve in time, measure observables and entanglement, find excitations, run statistical-mechanics and quasi-1D calculations, diagnose a solve that will not converge, use threads and GPUs, and save results. `howto/index.md` is a browsable index so a reader can scan for their task instead of reading through. Co-Authored-By: Claude Opus 5 (1M context) --- docs/make.jl | 16 + docs/src/howto/bond_dimension.md | 293 ++++++++++++++++++ docs/src/howto/convergence_troubleshooting.md | 289 +++++++++++++++++ docs/src/howto/entanglement.md | 141 +++++++++ docs/src/howto/excitations.md | 165 ++++++++++ docs/src/howto/groundstate_algorithms.md | 202 ++++++++++++ docs/src/howto/hamiltonians.md | 107 +++++++ docs/src/howto/index.md | 89 ++++++ docs/src/howto/observables.md | 167 ++++++++++ docs/src/howto/parallelism_gpu.md | 156 ++++++++++ docs/src/howto/quasi_1d_geometries.md | 150 +++++++++ docs/src/howto/saving_loading.md | 139 +++++++++ docs/src/howto/states.md | 267 ++++++++++++++++ docs/src/howto/statmech.md | 161 ++++++++++ docs/src/howto/time_evolution.md | 155 +++++++++ 15 files changed, 2497 insertions(+) create mode 100644 docs/src/howto/bond_dimension.md create mode 100644 docs/src/howto/convergence_troubleshooting.md create mode 100644 docs/src/howto/entanglement.md create mode 100644 docs/src/howto/excitations.md create mode 100644 docs/src/howto/groundstate_algorithms.md create mode 100644 docs/src/howto/hamiltonians.md create mode 100644 docs/src/howto/index.md create mode 100644 docs/src/howto/observables.md create mode 100644 docs/src/howto/parallelism_gpu.md create mode 100644 docs/src/howto/quasi_1d_geometries.md create mode 100644 docs/src/howto/saving_loading.md create mode 100644 docs/src/howto/states.md create mode 100644 docs/src/howto/statmech.md create mode 100644 docs/src/howto/time_evolution.md diff --git a/docs/make.jl b/docs/make.jl index c64e8bb74..0e860d447 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -61,6 +61,22 @@ makedocs(; "tutorials/excitations.md", "tutorials/using_symmetries.md", ], + "How-to" => [ + "howto/index.md", + "howto/states.md", + "howto/hamiltonians.md", + "howto/groundstate_algorithms.md", + "howto/bond_dimension.md", + "howto/time_evolution.md", + "howto/observables.md", + "howto/entanglement.md", + "howto/excitations.md", + "howto/statmech.md", + "howto/quasi_1d_geometries.md", + "howto/convergence_troubleshooting.md", + "howto/parallelism_gpu.md", + "howto/saving_loading.md", + ], "Manual" => [ "man/intro.md", "man/states.md", diff --git a/docs/src/howto/bond_dimension.md b/docs/src/howto/bond_dimension.md new file mode 100644 index 000000000..4f41e2acf --- /dev/null +++ b/docs/src/howto/bond_dimension.md @@ -0,0 +1,293 @@ +# [Controlling bond dimension](@id howto_bond_dimension) + +The examples on this page use MPSKit.jl, TensorKit.jl, and TensorKitTensors.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +Bond dimension is the key knob in every MPS calculation: too small and the ansatz cannot represent the state, too large and computation slows to a crawl. +This page gives concrete recipes for inspecting, growing, and shrinking bond dimension in MPSKit.jl. +All examples share a single namespace: + +```@example bond_dim +using MPSKit, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ +``` + +--- + +## 1. Inspecting the current bond dimension + +MPSKit exposes the virtual spaces through `left_virtualspace` and `right_virtualspace`. +This returns the raw vector spaces, which carry the information about the different sectors, but we can obtain a single number using `dim`: + +```@example bond_dim +L = 10 +ψ = FiniteMPS(L, ℂ^2, ℂ^8) # finite MPS, max bond dim 8 + +# Bond dimension between sites i and i+1 equals dim(left_virtualspace(ψ, i+1)) +# or equivalently dim(right_virtualspace(ψ, i)). +dim(left_virtualspace(ψ, 5)) # bond to the left of site 5 +``` + +```@example bond_dim +# All bond dimensions in one go +[dim(left_virtualspace(ψ, i)) for i in 1:L] +``` + +!!! note + For a `FiniteMPS` the leftmost and rightmost virtual spaces are typically one-dimensional (the trivial boundary space), + so `left_virtualspace(ψ, 1)` and `left_virtualspace(ψ, L+1)` have dimension 1. + +For an `InfiniteMPS` the same call works per unit-cell site: + +```@example bond_dim +ψ_inf = InfiniteMPS(ℂ^2, ℂ^8) +dim(left_virtualspace(ψ_inf, 1)) +``` + +--- + +## 2. Growing bond dimension + +### 2a. Random expansion (no Hamiltonian required) + +[`RandExpand`](@ref) pads the MPS with orthogonal random vectors drawn from the two-site null space. +It does **not** need the Hamiltonian, so it is cheap and works for any MPS type. + +`trscheme` is **mandatory** and controls how many new directions are added. +Use `truncrank(n)` from MatrixAlgebraKit (re-exported by TensorKit) to add at most `n` extra singular values: + +```@example bond_dim +ψ_small = FiniteMPS(L, ℂ^2, ℂ^4) # start with D = 4 +dim(left_virtualspace(ψ_small, 5)) +``` + +```@example bond_dim +ψ_grown = changebonds(ψ_small, RandExpand(; trscheme = truncrank(8))) +dim(left_virtualspace(ψ_grown, 5)) # expanded, but ≤ 4 + 8 = 12 +``` + +The new vectors are orthogonal to the original state, so the state it represents is unchanged (its overlap with the original is 1) while the variational manifold grows. + +For an `InfiniteMPS` the call is identical: + +```@example bond_dim +ψ_inf_small = InfiniteMPS(ℂ^2, ℂ^4) +ψ_inf_grown = changebonds(ψ_inf_small, RandExpand(; trscheme = truncrank(8))) +dim(left_virtualspace(ψ_inf_grown, 1)) +``` + +### 2b. Optimal expansion (requires Hamiltonian) + +[`OptimalExpand`](@ref) selects the dominant contributions of the two-site-updated MPS tensor that are orthogonal to the current state, as described by [Zauner-Stauber et al., Phys. Rev. B 97, 045145 (2018)](https://doi.org/10.1103/PhysRevB.97.045145). +It needs both the state and the Hamiltonian: + +```@example bond_dim +# Build a finite TFIM Hamiltonian manually +J = 1.0; g = 0.5 +lattice = fill(ℂ^2, L) +X = σˣ() +Z = σᶻ() +H = FiniteMPOHamiltonian(lattice, (i, i + 1) => -J * X ⊗ X for i in 1:(L - 1)) + + FiniteMPOHamiltonian(lattice, (i,) => -g * Z for i in 1:L) + +ψ_opt, envs_opt = changebonds(ψ_small, H, OptimalExpand(; trscheme = truncrank(8))) +dim(left_virtualspace(ψ_opt, 5)) +``` + +`OptimalExpand` also works on `InfiniteMPS` with an `InfiniteMPOHamiltonian`. +The environment argument is optional and defaults to a freshly computed set: + +```@example bond_dim +lattice_inf = PeriodicVector([ℂ^2]) +H_inf = InfiniteMPOHamiltonian(lattice_inf, (1, 2) => -J * X ⊗ X, (1,) => -g * Z) + +ψ_inf_opt, _ = changebonds(ψ_inf_small, H_inf, OptimalExpand(; trscheme = truncrank(8))) +dim(left_virtualspace(ψ_inf_opt, 1)) +``` + +!!! note + `OptimalExpand` and `VUMPSSvdCut` (see [§5](#5-growing-during-infinite-mps-optimization)) + both require the Hamiltonian. + Pass environments as the optional fourth argument to avoid recomputing them if you + already have them from a previous `find_groundstate` call. + +--- + +## 3. Reducing bond dimension + +[`SvdCut`](@ref) truncates the bond dimension by an SVD sweep. +It does **not** need the Hamiltonian and is the standard tool for compression. + +```@example bond_dim +# compress ψ_grown (D up to 12) back to at most 6 singular values per bond +ψ_cut = changebonds(ψ_grown, SvdCut(; trscheme = truncrank(6))) +dim(left_virtualspace(ψ_cut, 5)) +``` + +An in-place variant, `changebonds!`, exists for `FiniteMPS` and avoids allocating a copy. +It also accepts a `normalize` keyword (default `true`): + +```@example bond_dim +ψ_inplace = FiniteMPS(L, ℂ^2, ℂ^12) +changebonds!(ψ_inplace, SvdCut(; trscheme = truncrank(6)); normalize = true) +dim(left_virtualspace(ψ_inplace, 5)) +``` + +`SvdCut` also works on `InfiniteMPS` (2-arg form only; no in-place variant): + +```@example bond_dim +ψ_inf_cut = changebonds(ψ_inf_grown, SvdCut(; trscheme = truncrank(6))) +dim(left_virtualspace(ψ_inf_cut, 1)) +``` + +--- + +## 4. Truncation schemes + +Every bond-change algorithm takes a mandatory `trscheme` keyword drawn from **MatrixAlgebraKit** (re-exported by TensorKit). +The main schemes are: + +| Scheme | Meaning | +|:-------|:--------| +| `truncrank(n)` | Keep at most `n` singular values | +| `trunctol(; atol)` | Drop singular values below `atol` times the largest | +| `notrunc()` | Keep all singular values (no truncation) | +| `truncspace(V)` | Keep only singular values whose index fits in the given space `V` | + +Schemes compose with `&` to apply multiple criteria simultaneously. +For example, to keep at most 16 singular values **and** also drop anything below `1e-8`: + +```@example bond_dim +trscheme_combined = trunctol(; atol = 1.0e-8) & truncrank(16) +ψ_combined = changebonds(ψ_grown, SvdCut(; trscheme = trscheme_combined)) +dim(left_virtualspace(ψ_combined, 5)) +``` + +!!! warning + `trscheme` is **required** on every algorithm; there is no default. + Omitting it will throw a `MethodError` at construction time. + +--- + +## 5. Growing during finite MPS optimization + +The two-site DMRG variant, [`DMRG2`](@ref), performs a bond expansion at every sweep step by keeping both sites together in the update. +Pass `trscheme` to control which singular values are retained: + +```@example bond_dim +ψ_dmrg2_start = FiniteMPS(L, ℂ^2, ℂ^2) # start small + +ψ_dmrg2, envs_dmrg2, _ = find_groundstate( + ψ_dmrg2_start, H, + DMRG2(; trscheme = truncrank(16), maxiter = 5) +) +dim(left_virtualspace(ψ_dmrg2, 5)) +``` + +A common pattern is to warm up with `DMRG2` to grow the bond dimension, then refine with single-site `DMRG` for efficiency. +The algorithm chaining operator `&` makes this easy (see [§7](#7-chaining-algorithms)): + +```@example bond_dim +warmup_then_refine = DMRG2(; trscheme = truncrank(16), maxiter = 3) & + DMRG(; maxiter = 20) + +ψ_dmrg2, envs_dmrg2, _ = find_groundstate(ψ_dmrg2_start, H, warmup_then_refine) +dim(left_virtualspace(ψ_dmrg2, 5)) +``` + +The `find_groundstate` convenience function also accepts a `trscheme` keyword that triggers the same warm-up automatically: + +```@example bond_dim +ψ_conv, envs_conv, _ = find_groundstate( + ψ_dmrg2_start, H; + trscheme = truncrank(16), maxiter = 20 +) +dim(left_virtualspace(ψ_conv, 5)) +``` + +The `trscheme` keyword makes `find_groundstate` prepend a `DMRG2` pass before switching to the default `DMRG`. + +TDVP2 also supports `trscheme` for two-site real- or imaginary-time evolution, but that is covered in the time-evolution documentation rather than here. + +--- + +## 6. Growing during infinite MPS optimization + +### IDMRG2 (two-site infinite DMRG) + +[`IDMRG2`](@ref) is the infinite analogue of `DMRG2`. + +!!! warning + `IDMRG2` requires a unit cell of **at least 2 sites**. + Passing a single-site `InfiniteMPS` will throw an `ArgumentError`. + +```@example bond_dim +# 2-site unit cell: lattice, Hamiltonian, and initial state +lattice_2 = PeriodicVector([ℂ^2, ℂ^2]) +H_inf_2 = InfiniteMPOHamiltonian( + lattice_2, + (1, 2) => -J * X ⊗ X, + (2, 3) => -J * X ⊗ X, + (1,) => -g * Z, + (2,) => -g * Z, +) + +ψ_idmrg2_start = InfiniteMPS([ℂ^2, ℂ^2], [ℂ^2, ℂ^2]) + +ψ_idmrg2, _, _ = find_groundstate( + ψ_idmrg2_start, H_inf_2, + IDMRG2(; trscheme = truncrank(16), maxiter = 5) +) +dim(left_virtualspace(ψ_idmrg2, 1)) +``` + +### VUMPSSvdCut + +[`VUMPSSvdCut`](@ref) grows the bond dimension of an `InfiniteMPS` by performing a two-site VUMPS update followed by an SVD truncation. +It requires the Hamiltonian and returns a new state with updated environments: + +```@example bond_dim +ψ_vs, _ = changebonds(ψ_inf_small, H_inf, VUMPSSvdCut(; trscheme = truncrank(16))) +dim(left_virtualspace(ψ_vs, 1)) +``` + +The typical workflow for infinite systems is to grow the bond dimension first (with `VUMPSSvdCut` or `IDMRG2`), then converge with [`VUMPS`](@ref) as a separate step, reusing the expanded state `ψ_vs` from above: + +```@example bond_dim +ψ_vc, = find_groundstate(ψ_vs, H_inf, VUMPS(; maxiter = 10)) +dim(left_virtualspace(ψ_vc, 1)) +``` + +!!! note + Bond-changing algorithms such as `VUMPSSvdCut` are applied through + [`changebonds`](@ref), not `find_groundstate`. Grow the state first, then pass + the result to a ground-state algorithm. + +--- + +## 7. Chaining algorithms + +The `&` operator chains any two algorithms that share the same interface, applying them in sequence. +This works for both ground-state algorithms and `changebonds` algorithms: + +```@example bond_dim +# Expand with random vectors, then compress to a target rank +grow_and_cut = RandExpand(; trscheme = truncrank(12)) & + SvdCut(; trscheme = truncrank(6)) + +ψ_final = changebonds(ψ_small, grow_and_cut) +dim(left_virtualspace(ψ_final, 5)) +``` + +```@example bond_dim +# Alternatively: combine changebonds with a ground-state algorithm +ψ_expanded, envs_expanded = changebonds( + ψ_small, H, OptimalExpand(; trscheme = truncrank(8)) +) +ψ_gs, _, _ = find_groundstate(ψ_expanded, H, DMRG(; maxiter = 10), envs_expanded) +dim(left_virtualspace(ψ_gs, 5)) +``` + +For background on when each algorithm is appropriate and how convergence is assessed, see [Ground-state algorithms](@ref lib_groundstate). +For constructing MPS objects from scratch, see [Constructing states](@ref howto_states). + diff --git a/docs/src/howto/convergence_troubleshooting.md b/docs/src/howto/convergence_troubleshooting.md new file mode 100644 index 000000000..c8deee887 --- /dev/null +++ b/docs/src/howto/convergence_troubleshooting.md @@ -0,0 +1,289 @@ +# [Troubleshooting convergence](@id howto_convergence_troubleshooting) + +```@meta +DocTestSetup = quote + using MPSKit, MPSKitModels, TensorKit +end +``` + +When [`find_groundstate`](@ref), [`leading_boundary`](@ref), or a time-evolution call does +not converge, the fix is almost always one of a handful of causes: too few iterations, a +bond dimension that is too small, a bad initial state, or a mismatch between the ansatz and +the physics (wrong unit cell, wrong symmetry sector). +This page is a diagnostic checklist: each section is a symptom, the diagnostic that +confirms it, and the concrete API knob that fixes it. +It assumes you already know how to run the algorithms — see +[Ground-state algorithms](@ref howto_groundstate_algorithms) and +[Controlling bond dimension](@ref howto_bond_dimension) for that. + +All examples share a single namespace: + +```@example conv +using MPSKit, MPSKitModels, TensorKit +``` + +--- + +## 1. Read the convergence report + +Every optimizer returns three things, `(ψ, envs, ϵ)`, and `ϵ` is your primary diagnostic: + +```@example conv +L = 16 +H = transverse_field_ising(FiniteChain(L); g = 1.0) +ψ₀ = FiniteMPS(L, ℂ^2, ℂ^16) + +ψ, envs, ϵ = find_groundstate(ψ₀, H, DMRG(; tol = 1.0e-10, maxiter = 30, verbosity = 0)) +ϵ +``` + +`ϵ` is the convergence-error measure of whichever algorithm ran last, compared against its +`tol` each sweep. +The algorithm has converged when `ϵ < tol`; if it stops because it hit `maxiter` first, `ϵ` +tells you how far it still had to go. +What `ϵ` actually measures differs by algorithm: + +| Algorithm | What `ϵ` measures | +|:----------|:------------------| +| [`DMRG`](@ref), [`VUMPS`](@ref) | Galerkin residual (norm of the projected gradient) | +| [`DMRG2`](@ref) | `1 - abs(overlap)` of the two-site tensor across the truncation | +| [`IDMRG`](@ref), [`IDMRG2`](@ref) | change in the bond matrix `C` between iterations | +| [`GradientGrassmann`](@ref) | norm of the Riemannian gradient | + +Because the measures differ, a raw `ϵ` value is only meaningful *within* one algorithm; do +not compare `ϵ` from a `DMRG2` warm-up against `ϵ` from the following `DMRG` refinement. + +To watch convergence as it happens rather than after the fact, raise `verbosity`. +The levels are shared by every algorithm and documented in +[Ground-state algorithms](@ref howto_groundstate_algorithms); the named constants +`MPSKit.VERBOSE_NONE` (`0`) through `MPSKit.VERBOSE_ALL` (`4`) are public but not exported. +`verbosity = 2` prints one convergence line per sweep, which is usually enough to see +whether `ϵ` is dropping, plateauing, or oscillating. + +--- + +## 2. Converged but wrong: check the variance + +A small `ϵ` does **not** by itself guarantee a good ground state. +At a fixed bond dimension the optimizer converges to the best MPS *within that manifold*, and +its convergence measure can drop below `tol` while the state is still far from the true +ground state. +The independent check is the energy variance +``\langle H^2 \rangle - \langle H \rangle^2``, which is zero only for an exact eigenstate: + +```@example conv +ψ_small, _, ϵ_small = find_groundstate( + FiniteMPS(L, ℂ^2, ℂ^2), H, DMRG(; tol = 1.0e-10, maxiter = 30, verbosity = 0) +) +(ϵ_small, variance(ψ_small, H)) +``` + +Here `ϵ` sits comfortably below `tol` — the run reports success — yet the variance is large: +a bond dimension of 2 simply cannot represent this (critical) ground state. +Grow the bond dimension and the variance collapses: + +```@example conv +ψ_big, _, ϵ_big = find_groundstate( + FiniteMPS(L, ℂ^2, ℂ^32), H, DMRG(; tol = 1.0e-10, maxiter = 30, verbosity = 0) +) +(ϵ_big, variance(ψ_big, H)) +``` + +!!! tip "Variance is your ground-truth check" + Whenever a result looks suspicious despite a small `ϵ`, compute [`variance`](@ref). + A variance that will not drop as you add bond dimension points at an undersized ansatz, + not at an unconverged optimization. + +The fix is to grow the bond dimension: use [`DMRG2`](@ref)/[`IDMRG2`](@ref), or expand +explicitly with [`changebonds`](@ref) and [`OptimalExpand`](@ref)/[`RandExpand`](@ref). +See [Controlling bond dimension](@ref howto_bond_dimension) for the full set of recipes. + +--- + +## 3. `ϵ` is still dropping, or stalls just above `tol` + +If the algorithm stopped on `maxiter` with `ϵ` still decreasing, it simply needs more +iterations — raise `maxiter`: + +```@example conv +ψ_more, _, ϵ_more = find_groundstate( + ψ₀, H, DMRG(; tol = 1.0e-10, maxiter = 100, verbosity = 0) +) +ϵ_more +``` + +You can also resume from an already-optimized state instead of restarting, passing the +previous environments as the optional fourth argument so they are reused rather than +recomputed: + +```@example conv +ψ_resume, _, ϵ_resume = find_groundstate( + ψ, H, DMRG(; tol = 1.0e-12, maxiter = 50, verbosity = 0), envs +) +ϵ_resume +``` + +If instead `ϵ` *plateaus* well above `tol` and more iterations do not help, the ansatz is +the bottleneck, not the iteration count: check the variance and grow the bond dimension as in +[§2](#2-converged-but-wrong-check-the-variance), or treat it as a local minimum +([§4](#4-stuck-in-a-local-minimum)). + +!!! note "Adaptive sub-tolerances" + By default MPSKit tightens the tolerances of the inner eigensolver, gauge, and + environment solvers automatically as the outer error `ϵ` shrinks (the `DynamicTol` + mechanism). + You therefore rarely need to touch `alg_eigsolve`/`alg_gauge`/`alg_environments` by + hand; set the outer `tol` and let the inner solvers follow. + +--- + +## 4. Stuck in a local minimum + +Symptom: `ϵ` plateaus above `tol`, adding bond dimension does not help, and the variance +stays stubbornly high. +Variational optimizers can get trapped in local minima, especially from an unlucky random +start or a symmetry-frustrated initial state. + +Things to try, roughly in order: + +- **Restart from a different initial state.** `FiniteMPS`/`InfiniteMPS` with a size argument + produce a *random* state, so simply rebuilding the initial guess reseeds the search: + + ```@example conv + ψ_restart, _, ϵ_restart = find_groundstate( + FiniteMPS(L, ℂ^2, ℂ^16), H, DMRG(; tol = 1.0e-10, maxiter = 100, verbosity = 0) + ) + ϵ_restart + ``` + +- **Mix algorithms.** Different optimizers have different failure modes, so chaining them + with `&` often escapes a minimum that traps one of them. + A robust infinite-system default is a [`VUMPS`](@ref) pass to get close, polished by + [`GradientGrassmann`](@ref) — exactly what `find_groundstate` does automatically once + `tol` is tighter than `1e-4`: + + ```@example conv + H_inf = transverse_field_ising(; g = 0.5) + ψ_inf, _, ϵ_inf = find_groundstate( + InfiniteMPS(ℂ^2, ℂ^6), H_inf, + VUMPS(; tol = 1.0e-8, maxiter = 50, verbosity = 0) & + GradientGrassmann(; tol = 1.0e-10, maxiter = 50, verbosity = 0) + ) + ϵ_inf + ``` + +- **Inject noise, then re-optimize.** Padding the state with orthogonal random directions via + [`RandExpand`](@ref) perturbs it off the current (possibly stuck) point without changing + what it represents, giving the next optimization new directions to explore: + + ```@example conv + ψ_noisy = changebonds(ψ_small, RandExpand(; trscheme = truncrank(8))) + ψ_kick, _, ϵ_kick = find_groundstate( + ψ_noisy, H, DMRG(; tol = 1.0e-10, maxiter = 100, verbosity = 0) + ) + (ϵ_kick, variance(ψ_kick, H)) + ``` + + A two-site algorithm ([`DMRG2`](@ref)) or the Hamiltonian-aware + [`OptimalExpand`](@ref)/CBE variants achieve a similar effect while also improving the + energy, and are usually the better first choice — see + [Controlling bond dimension](@ref howto_bond_dimension). + +--- + +## 5. Infinite MPS won't converge — look at the transfer matrix + +A distinctive infinite-system failure is a state whose transfer matrix has several +eigenvalues crowding the unit circle. +This signals that the state is close to *non-injective* — a superposition of several +injective states — which is numerically ill-conditioned and usually means the unit cell is +too small for the order you are trying to represent. + +Diagnose it with [`transfer_spectrum`](@ref) (the leading transfer-matrix eigenvalues) or its +distilled form [`correlation_length`](@ref): + +```@example conv +ψ_gs, _, _ = find_groundstate( + InfiniteMPS(ℂ^2, ℂ^16), transverse_field_ising(; g = 2.0), + VUMPS(; tol = 1.0e-10, maxiter = 100, verbosity = 0) +) +maximum(values(correlation_length(ψ_gs))) +``` + +```@example conv +abs.(transfer_spectrum(ψ_gs; howmany = 5)) +``` + +The leading eigenvalue is `1` (a normalized state); the *gap* between it and the next +eigenvalue sets the correlation length. +When several eigenvalues sit almost at `1`, the correlation length diverges and the state is +near-degenerate. + +!!! tip "The fix is usually a larger unit cell" + If the transfer spectrum is near-degenerate, rebuild the initial state and the + Hamiltonian on a larger unit cell (e.g. `InfiniteMPS(fill(ℂ^2, 2), fill(ℂ^16, 2))` and a + matching two-site `InfiniteMPOHamiltonian`) and re-optimize. + The gallery example [The XXZ model](@ref "The XXZ model") walks through exactly this + diagnostic — a VUMPS run that refuses to converge, a `transferplot` revealing + near-degeneracy, and the fix of moving to a two-site unit cell. + +For extracting a physically meaningful correlation length from the finite-bond-dimension +spectrum, [`marek_gap`](@ref) implements the standard finite-entanglement-scaling gap +extrapolation. + +--- + +## 6. Wrong symmetry sector + +With a symmetric Hamiltonian, an MPS is confined to the symmetry sector fixed by its virtual +spaces at construction time. +The optimizer never leaves that sector, so if you build the initial state in the wrong one +you converge to the lowest state *of that sector*, not the global ground state. + +Inspect the sector content of a state through its virtual spaces: + +```@example conv +using TensorKit: sectors +L2 = 12 +H_z2 = transverse_field_ising(Z2Irrep, FiniteChain(L2); g = 0.5) +ψ_z2 = FiniteMPS(L2, Z2Space(0 => 1, 1 => 1), Z2Space(0 => 8, 1 => 8)) +collect(sectors(left_virtualspace(ψ_z2, 1))) +``` + +If the sectors present are not the ones the physics requires, rebuild the initial state with +the intended sectors in its physical and virtual spaces (see +[Using symmetries](@ref tutorial_using_symmetries) and +[Constructing states](@ref howto_states) for the `sector => dimension` syntax) before +optimizing. + +--- + +## 7. `leading_boundary` and time evolution + +[`leading_boundary`](@ref) reuses the same infinite-MPS optimizers ([`VUMPS`](@ref), +[`VOMPS`](@ref), [`IDMRG`](@ref), and friends) and returns the same `(ψ, envs, ϵ)` triple, so +every recipe above applies: read `ϵ`, raise `maxiter`/`tol`, grow the bond dimension, and +watch the transfer-matrix spectrum of the boundary MPS. + +For time evolution, "non-convergence" instead means accumulated error over the trajectory. +The knobs are different: + +- **Time step.** A smaller `dt` reduces the per-step integration and (for + [`make_time_mpo`](@ref) with [`WII`](@ref)/[`TaylorCluster`](@ref)) Trotter-type error. +- **Bond dimension.** Real-time evolution grows entanglement, so a fixed bond dimension + eventually cannot follow the state. + Use the two-site [`TDVP2`](@ref) (which takes a `trscheme`) or a CBE-enabled + [`TDVP`](@ref) to let the bond dimension grow during evolution. + +See [Time evolution](@ref howto_time_evolution) for the full time-evolution interface. + +--- + +## Where to go next + +For growing and inspecting bond dimension, the most common single fix, see +[Controlling bond dimension](@ref howto_bond_dimension). +For choosing and chaining the ground-state algorithms referenced here, see +[Ground-state algorithms](@ref howto_groundstate_algorithms). +For the reasoning behind when each algorithm applies and how they compare, see +[The algorithm landscape](@ref concept_algorithm_landscape). diff --git a/docs/src/howto/entanglement.md b/docs/src/howto/entanglement.md new file mode 100644 index 000000000..88e446212 --- /dev/null +++ b/docs/src/howto/entanglement.md @@ -0,0 +1,141 @@ +# [Entanglement entropy and spectrum](@id howto_entanglement) + +The examples on this page use MPSKit.jl, TensorKit.jl, and TensorKitTensors.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +This page collects recipes for extracting the entanglement entropy and the entanglement spectrum from the gauge (bond) tensors of an MPS. +For general expectation values and correlators see [Computing observables](@ref howto_observables); for building the state objects used below see [Constructing states](@ref howto_states). +The reference page for these and related functions is [Observables and analysis](@ref lib_observables). + +```@example entanglement +using MPSKit, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ +``` + +--- + +## Setup: a TFIM ground state + +The examples below reuse a spin-1/2 `FiniteMPS` and the transverse-field Ising Hamiltonian, optimized with DMRG so the entanglement structure reflects an actual ground state rather than a random tensor: + +```@example entanglement +L = 8 +ψ0 = FiniteMPS(L, ℂ^2, ℂ^8) + +# single-site Pauli operators +X = σˣ() +Z = σᶻ() + +lattice = fill(ℂ^2, L) +H = FiniteMPOHamiltonian(lattice, (i, i + 1) => -(X ⊗ X) for i in 1:(L - 1)) + + FiniteMPOHamiltonian(lattice, (i,) => -0.5 * Z for i in 1:L) + +ψ, envs, _ = find_groundstate(ψ0, H, DMRG(; maxiter = 10)) +``` + +--- + +## 1. Entanglement entropy at a single cut + +[`entropy`](@ref) returns the von Neumann entanglement entropy across the cut to the right of a given site. +For a `FiniteMPS` the site is a required argument: + +```@example entanglement +entropy(ψ, L ÷ 2) # entropy across the central cut +``` + +--- + +## 2. Entropy profile across every cut + +Collecting `entropy(ψ, i)` over the valid range of sites gives the full entropy profile of the chain: + +```@example entanglement +[entropy(ψ, i) for i in 1:L] +``` + +!!! warning + For `FiniteMPS` the cut site is required and must lie in `1:length(ψ)`. + `site = 0` — a valid default for `InfiniteMPS` and `WindowMPS` (see recipe 5) — throws a `BoundsError` for `FiniteMPS`. + +--- + +## 3. The entanglement spectrum + +[`entanglement_spectrum`](@ref) returns the singular values of the gauge tensor to the right of a site, packaged as a sector-resolved vector: + +```@example entanglement +spectrum = entanglement_spectrum(ψ, L ÷ 2) +``` + +The entropy can equivalently be computed directly from this spectrum with [`entropy`](@ref): + +```@example entanglement +entropy(spectrum) +``` + +```@example entanglement +entropy(ψ, L ÷ 2) ≈ entropy(spectrum) +``` + +Both routes agree, since `entropy(ψ, site)` computes the entropy from exactly this spectrum internally. + +--- + +## 4. Sector-resolved spectrum + +Because the returned spectrum is indexed by symmetry sector, you can inspect the singular values sector by sector. +Use `keys` to list the sectors present at a cut, and index the spectrum with a sector to obtain its singular values: + +```@example entanglement +collect(keys(spectrum)) +``` + +```@example entanglement +spectrum[only(keys(spectrum))] +``` + +For the plain (no explicit symmetry) `FiniteMPS` built above there is a single sector, `Trivial()`, so all singular values live in one block. +`pairs(spectrum)` iterates `sector => values` pairs and is the natural entry point for a symmetric state where multiple sectors are populated at a cut: + +```@example entanglement +collect(pairs(spectrum)) +``` + +--- + +## 5. Entanglement of an infinite MPS + +For `InfiniteMPS`, the cut site defaults to `0`, and `entropy` without a site argument returns one entropy per site in the unit cell: + +```@example entanglement +ψ∞ = InfiniteMPS(ℂ^2, ℂ^8) +entropy(ψ∞) +``` + +```@example entanglement +entanglement_spectrum(ψ∞) # site defaults to 0 +``` + +!!! note + `ψ∞` here is a random `InfiniteMPS`, not a converged ground state, so the values above illustrate the interface rather than any physical entanglement profile. + For a physically meaningful result, compute the entropy of a state obtained from [`find_groundstate`](@ref) (for example via VUMPS). + +!!! note + `WindowMPS` also supports `entropy(ψ, site)` with a required site argument, mirroring the `FiniteMPS` form. + +--- + +## Plotting the spectrum + +MPSKit defines an `entanglementplot` recipe via `RecipesBase`, but does not depend on Plots.jl itself. +To use it, add `using Plots` (or another Plots-backed package) in your own environment: + +```julia +using Plots +entanglementplot(ψ; site = L ÷ 2) +``` + +!!! note + `entanglementplot` is a plotting *recipe*: it only becomes available once `Plots` (or a compatible plotting package) is loaded. + This block is not executed on this page to keep the docs build free of the Plots.jl dependency. diff --git a/docs/src/howto/excitations.md b/docs/src/howto/excitations.md new file mode 100644 index 000000000..b88cc7ab8 --- /dev/null +++ b/docs/src/howto/excitations.md @@ -0,0 +1,165 @@ +# [Excited states](@id howto_excitations) + +The examples on this page use MPSKit.jl, MPSKitModels.jl, and TensorKit.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +[`excitations`](@ref) is the single entry point for computing energy eigenstates beyond the ground state. +This page shows how to call it for a gap, a full dispersion relation, a charged excitation, and a handful of excited states on a finite chain. +For what each algorithm actually does and why you would choose one over another, see [Excitations](@ref lib_excitations). +All examples share a single namespace: + +```@example excitations_howto +using MPSKit, MPSKitModels, TensorKit +``` + +--- + +## 1. Get a single excitation gap on an infinite chain + +On an `InfiniteMPS`, [`QuasiparticleAnsatz`](@ref) perturbs every site of the unit cell in a plane-wave superposition with a fixed `momentum`, given as a `Real` in radians per unit cell. +Pass the ground state and (optionally) its environments straight through from [`find_groundstate`](@ref): + +```@example excitations_howto +g = 2.0 +H_inf = transverse_field_ising(; g) +ψ₀_inf = InfiniteMPS(ℂ^2, ℂ^12) +ψ_inf, envs_inf, = find_groundstate(ψ₀_inf, H_inf; verbosity = 0) + +Es_inf, ϕs_inf = excitations(H_inf, QuasiparticleAnsatz(), 0.0, ψ_inf, envs_inf; num = 1) +Es_inf[1] +``` + +The values in `Es_inf` are excitation *gaps* above the ground-state energy density, not total energies: internally the ground-state energy per site is subtracted before diagonalizing. +`ϕs_inf` holds the corresponding quasiparticle states (`num` of them), which behave like normal vectors for `eigsolve`-style post-processing but are not `FiniteMPS`/`InfiniteMPS` objects themselves. +Raise `num` to get more than one state at the same momentum, e.g. `num = 3` for the three lowest excitations at that momentum. + +--- + +## 2. Scan the dispersion relation + +Pass a range (or any vector) of momenta instead of a single number to sweep the whole Brillouin zone in one call: + +```@example excitations_howto +momenta = range(0, π, 5) +Es_disp, ϕs_disp = excitations( + H_inf, QuasiparticleAnsatz(), momenta, ψ_inf, envs_inf; + num = 1, verbosity = 0 +) +size(Es_disp) +``` + +With a vector of `length(momenta)` momenta, `Es_disp` and `ϕs_disp` come back as `(length(momenta), num)` matrices rather than plain vectors — index `Es_disp[:, n]` for the dispersion of the `n`-th branch, or use `vec(Es_disp)` when `num = 1`. +`verbosity = 0` silences the per-momentum `@info` line that this method otherwise prints; raise it to see progress on a longer scan. +Momenta are independent of each other, so this method also accepts `parallel = true` (the default) to distribute them over available threads/workers; pass `parallel = false` to force sequential evaluation. + +--- + +## 3. Target a symmetry sector + +By default the optimization looks for the lowest excitation with trivial (vacuum) total charge, `sector = leftunit(ψ)`. +Passing a different `TensorKit` sector targets a quasiparticle with that charge instead — only `QuasiparticleAnsatz` supports this keyword. +Build the ground state with symmetric tensors first, then request the sector on the excitation call: + +```@example excitations_howto +g = 10.0 +L = 12 +H_Z2 = transverse_field_ising(Z2Irrep, FiniteChain(L); g) +ψ₀_Z2 = FiniteMPS(L, Z2Space(0 => 1, 1 => 1), Z2Space(0 => 8, 1 => 8)) +ψ_Z2, envs_Z2, = find_groundstate(ψ₀_Z2, H_Z2; verbosity = 0) + +Es_triv, = excitations(H_Z2, QuasiparticleAnsatz(), ψ_Z2, envs_Z2; num = 1) +Es_charged, ϕs_charged = excitations( + H_Z2, QuasiparticleAnsatz(), ψ_Z2, envs_Z2; + num = 1, sector = Z2Irrep(1) +) +Es_triv[1], Es_charged[1] +``` + +Here the `Z2Irrep(1)` excitation corresponds to a single flipped spin, the lowest physical excitation of the transverse-field Ising model. +[`ChepigaAnsatz`](@ref)/[`ChepigaAnsatz2`](@ref) do not support charged excitations at all: passing a nontrivial `sector` to either raises an error, and [`FiniteExcited`](@ref) has no `sector` keyword in the first place. + +--- + +## 4. Excited states on a finite chain + +Momentum is not a conserved quantity on a finite chain, so the finite method of `excitations` has no momentum argument; drop it entirely and call `QuasiparticleAnsatz` on the ground state directly: + +```@example excitations_howto +L = 12 +H_fin = transverse_field_ising(FiniteChain(L); g) +ψ₀_fin = FiniteMPS(L, ℂ^2, ℂ^16) +ψ_fin, envs_fin, = find_groundstate(ψ₀_fin, H_fin; verbosity = 0) + +Es_qp, ϕs_qp = excitations(H_fin, QuasiparticleAnsatz(), ψ_fin, envs_fin; num = 1) +Es_qp[1] +``` + +[`FiniteExcited`](@ref) takes a different approach: it repeatedly finds the ground state of `H + weight * Σᵢ |ψᵢ⟩⟨ψᵢ|`, penalizing overlap with the ground state and any excited states already found, and returns full `FiniteMPS` objects instead of quasiparticle states: + +```@example excitations_howto +fe_alg = FiniteExcited(; gsalg = DMRG(; verbosity = 0), weight = 10.0) +Es_fe, ψs_fe = excitations(H_fin, fe_alg, ψ_fin; num = 2) +Es_fe +``` + +Unlike `QuasiparticleAnsatz`, the values in `Es_fe` are total energies of the excited states, directly comparable to `expectation_value(ψ_fin, H_fin)` on the ground state. +Because each call to `FiniteExcited` reruns a full ground-state optimization under the hood, it scales worse with `num` than the other methods here; reach for it when you need excited states of a genuinely different character than the ground state (so the projector penalty, rather than a local perturbation, is what finds them). + +[`ChepigaAnsatz`](@ref) is a cheaper alternative for excitations that are qualitatively similar to the ground state: it diagonalizes the effective Hamiltonian at a single site `pos` (default the middle of the chain) using the ground-state environments, with no extra sweeping: + +```@example excitations_howto +Es_ch, ψs_ch = excitations(H_fin, ChepigaAnsatz(), ψ_fin, envs_fin; num = 1, pos = L ÷ 2) +Es_ch[1] +``` + +[`ChepigaAnsatz2`](@ref) does the same with a two-site block at `pos, pos + 1`, which costs more but is typically more accurate; it truncates the optimized two-site tensor back down with a `trunc` keyword (`notrunc()` by default): + +```@example excitations_howto +Es_ch2, ψs_ch2 = excitations(H_fin, ChepigaAnsatz2(; trunc = truncrank(16)), ψ_fin, envs_fin; num = 1) +Es_ch2[1] +``` + +Like `FiniteExcited`, the energies returned by both Chepiga variants are total energies, not gaps. + +--- + +## 5. Check excitation quality + +[`variance`](@ref) accepts a quasiparticle state directly and reports the variance of the energy, with smaller values indicating a better-converged excitation: + +```@example excitations_howto +variance(ϕs_qp[1], H_fin) +``` + +It also works on the infinite quasiparticle states from §1–§3: + +```@example excitations_howto +variance(ϕs_inf[1], H_inf) +``` + +!!! warning "Variance of infinite quasiparticle states" + `variance` on an infinite quasiparticle state carries an unresolved implementation note in `src/algorithms/toolbox.jl` and may be unreliable; verify its output before relying on it as a convergence diagnostic. + It also throws an `ArgumentError` for domain-wall (topological) excitations, where it is not implemented at all. + +To measure other observables on a finite quasiparticle state, convert it to a plain `FiniteMPS` first: + +```@example excitations_howto +excited_state = convert(FiniteMPS, ϕs_qp[1]) +real(expectation_value(excited_state, H_fin)) +``` + +--- + +## 6. Domain-wall excitations + +`excitations` also accepts two *different* ground states, `excitations(H, QuasiparticleAnsatz(), momentum, ψ_left, envs_left, ψ_right, envs_right; ...)`, which builds a quasiparticle that interpolates between them — a domain-wall (topological) excitation rather than a local perturbation on top of a single ground state. +This is real, exported functionality, but it has no dedicated test or example in the repository at the time of writing, and constructing two genuinely distinct, well-converged ground states to feed it (for instance the two symmetry-broken ground states of an ordered phase) is itself nontrivial to set up reliably in a short recipe. + +--- + +## Where to go next + +For growing the bond dimension of the ground states these recipes start from, see [Controlling bond dimension](@ref howto_bond_dimension). +For background on the quasiparticle ansatz and the other algorithms used here, see [Excitations](@ref lib_excitations). +For general expectation values and correlators, including on the converted excited states from §5, see [Computing observables](@ref howto_observables). +Spectral functions built from these excitations (`propagator`, `DynamicalDMRG`, and related solvers) are a separate topic covered in the "Linear problems and spectral functions" section of the [Public API](@ref public_api) reference. diff --git a/docs/src/howto/groundstate_algorithms.md b/docs/src/howto/groundstate_algorithms.md new file mode 100644 index 000000000..98124df19 --- /dev/null +++ b/docs/src/howto/groundstate_algorithms.md @@ -0,0 +1,202 @@ +# [Ground-state algorithms](@id howto_groundstate_algorithms) + +The examples on this page use MPSKit.jl, MPSKitModels.jl, TensorKit.jl, and TensorKitTensors.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +[`find_groundstate`](@ref) is the single entry point for optimizing an MPS towards the ground state of a Hamiltonian. +This page shows how to pick and configure the algorithm it runs, for both finite and infinite systems. +For what each algorithm actually does and why you would choose one over another, see [Ground-state algorithms](@ref lib_groundstate). +All examples share a single namespace: + +```@example groundstate_algs +using MPSKit, MPSKitModels, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ +``` + +--- + +## 1. Get a ground state with defaults + +Called with just a state and a Hamiltonian, `find_groundstate` inspects the type of the initial state and picks a matching algorithm for you. +For a `FiniteMPS` it runs [`DMRG`](@ref) with the keywords you pass through (`tol`, `maxiter`, `verbosity`): + +```@example groundstate_algs +L = 8 +ψ₀ = FiniteMPS(L, ℂ^2, ℂ^8) +H = transverse_field_ising(FiniteChain(L); g = 0.5) + +ψ, envs, ϵ = find_groundstate(ψ₀, H; tol = 1.0e-8, maxiter = 50, verbosity = 0) +ϵ +``` + +For an `InfiniteMPS` it instead runs [`VUMPS`](@ref), and if the requested `tol` is tighter than `1e-4` it chains a [`GradientGrassmann`](@ref) pass afterwards to polish the last few digits (see [§4](#4-refine-convergence-with-gradientgrassmann)): + +```@example groundstate_algs +ψ₀_inf = InfiniteMPS(ℂ^2, ℂ^6) +H_inf = transverse_field_ising(; g = 0.5) + +ψ_inf, envs_inf, ϵ_inf = find_groundstate(ψ₀_inf, H_inf; verbosity = 0) +ϵ_inf +``` + +Passing a `trscheme` keyword switches on a two-site pre-pass that can grow the bond dimension before the single-site algorithm takes over. +On a `FiniteMPS` this prepends [`DMRG2`](@ref); on an `InfiniteMPS` it prepends [`IDMRG2`](@ref) (which needs a unit cell of at least two sites, see [§3](#3-configure-infinite-system-algorithms)). + +```@example groundstate_algs +ψ_auto, envs_auto, ϵ_auto = find_groundstate( + ψ₀, H; + trscheme = truncrank(16), verbosity = 0 +) +ϵ_auto +``` + +!!! note "When to reach for an explicit algorithm" + The keyword form above covers the common cases. + Reach for an explicit algorithm struct (`DMRG`, `DMRG2`, `VUMPS`, `IDMRG`, `IDMRG2`, `GradientGrassmann`), or a chain of them with `&`, whenever you need finer control than the heuristic provides — the rest of this page shows how. + +--- + +## 2. Configure finite-system DMRG + +Pass a [`DMRG`](@ref) struct explicitly to set `tol`, `maxiter`, and `verbosity` directly: + +```@example groundstate_algs +ψ_dmrg, envs_dmrg, ϵ_dmrg = find_groundstate( + ψ₀, H, + DMRG(; tol = 1.0e-8, maxiter = 50, verbosity = 0) +) +ϵ_dmrg +``` + +`DMRG` updates one site at a time, so with its defaults it cannot change the bond dimension: whatever bond dimension `ψ₀` starts with is what it keeps. +[`DMRG2`](@ref) optimizes two sites at once and truncates back down, which lets it grow (or shrink) the bond dimension as it sweeps, at extra cost per step. +Unlike `DMRG`, `DMRG2` has no default truncation scheme, so `trscheme` is required: + +```@example groundstate_algs +ψ_dmrg2, envs_dmrg2, ϵ_dmrg2 = find_groundstate( + ψ₀, H, + DMRG2(; trscheme = truncrank(16), maxiter = 5, verbosity = 0) +) +ϵ_dmrg2 +``` + +A common pattern is to warm up with `DMRG2` to grow the bond dimension, then refine with the cheaper single-site `DMRG`. +The `&` chaining operator runs the first algorithm to completion, then feeds its result into the second: + +```@example groundstate_algs +warmup_then_refine = DMRG2(; trscheme = truncrank(16), maxiter = 3, verbosity = 0) & + DMRG(; tol = 1.0e-8, maxiter = 30, verbosity = 0) + +ψ_c, envs_c, ϵ_c = find_groundstate(ψ₀, H, warmup_then_refine) +ϵ_c +``` + +For more on choosing `trscheme` and growing bond dimension in general, see [Controlling bond dimension](@ref howto_bond_dimension). + +--- + +## 3. Configure infinite-system algorithms + +[`VUMPS`](@ref) is the default single-site algorithm for an `InfiniteMPS`, and takes the same `tol`/`maxiter`/`verbosity` keywords: + +```@example groundstate_algs +ψ_v, envs_v, ϵ_v = find_groundstate( + ψ₀_inf, H_inf, + VUMPS(; tol = 1.0e-8, maxiter = 50, verbosity = 0) +) +ϵ_v +``` + +[`IDMRG`](@ref) is the infinite analogue of `DMRG`: it grows the system by repeatedly inserting sites in the middle and re-optimizing, until boundary effects wash out. + +```@example groundstate_algs +ψ_i, envs_i, ϵ_i = find_groundstate( + ψ₀_inf, H_inf, + IDMRG(; tol = 1.0e-8, maxiter = 50, verbosity = 0) +) +ϵ_i +``` + +In practice, prefer `VUMPS` unless you specifically need `IDMRG`'s ability to change the bond dimension one site at a time. + +[`IDMRG2`](@ref) is the two-site, bond-dimension-changing variant, and mirrors `DMRG2`: `trscheme` is required, and it needs a unit cell of at least two sites. + +!!! warning "Unit cell size" + `IDMRG2` throws an `ArgumentError` on a single-site `InfiniteMPS`. + Build the initial state and Hamiltonian with a unit cell of two (or more) sites instead. + +```@example groundstate_algs +J = 1.0 +g = 0.5 +X = σˣ() +Z = σᶻ() + +lattice_2 = PeriodicVector([ℂ^2, ℂ^2]) +H_inf_2 = InfiniteMPOHamiltonian( + lattice_2, + (1, 2) => -J * X ⊗ X, + (2, 3) => -J * X ⊗ X, + (1,) => -g * Z, + (2,) => -g * Z, +) +ψ₀_2 = InfiniteMPS([ℂ^2, ℂ^2], [ℂ^2, ℂ^2]) + +ψ_i2, envs_i2, ϵ_i2 = find_groundstate( + ψ₀_2, H_inf_2, + IDMRG2(; trscheme = truncrank(16), maxiter = 5, verbosity = 0) +) +ϵ_i2 +``` + +--- + +## 4. Refine convergence with GradientGrassmann + +[`GradientGrassmann`](@ref) performs Riemannian gradient descent directly on the manifold of (finite or infinite) MPS, using an optimizer from OptimKit (`ConjugateGradient` by default via the `method` keyword). +Chain it after `VUMPS` (or `DMRG`) with `&` to combine both regimes in one call — this is exactly what `find_groundstate`'s heuristic does once `tol` is tighter than `1e-4`: + +```@example groundstate_algs +refine = VUMPS(; tol = 1.0e-6, maxiter = 20, verbosity = 0) & + GradientGrassmann(; tol = 1.0e-10, maxiter = 50, verbosity = 0) + +ψ_g, envs_g, ϵ_g = find_groundstate(ψ₀_inf, H_inf, refine) +ϵ_g +``` + +Since `GradientGrassmann` is also a single-site algorithm, it cannot change the bond dimension either: grow it beforehand with `DMRG2`/`IDMRG2` or the `changebonds` recipes in [Controlling bond dimension](@ref howto_bond_dimension). + +--- + +## 5. Control output and tolerances + +Every algorithm accepts a `verbosity` keyword as a plain integer: + +| `verbosity` | Output | +|:-----------:|:-------| +| `0` | nothing | +| `1` | warnings only | +| `2` | convergence information | +| `3` | per-iteration information (the default) | +| `4` | everything | + +`find_groundstate` returns `(ψ, envs, ϵ)`. +`ϵ` is the final convergence-error measure (a Galerkin residual) of whichever algorithm ran last — it quantifies how well the sweeps converged, not the error in the energy itself. + +The optional third positional argument to `find_groundstate` lets you reuse `envs` from a previous call instead of recomputing it, which is useful when tightening the tolerance on a state you already optimized: + +```@example groundstate_algs +ψ_v2, envs_v2, ϵ_v2 = find_groundstate( + ψ_v, H_inf, + VUMPS(; tol = 1.0e-10, maxiter = 50, verbosity = 0), + envs_v +) +ϵ_v2 +``` + +--- + +## Where to go next + +For growing, shrinking, and inspecting bond dimension during or between these calculations, see [Controlling bond dimension](@ref howto_bond_dimension). +For background on when each algorithm applies and how it relates to the others, see [Ground-state algorithms](@ref lib_groundstate). +To see `find_groundstate` used end to end on a finite chain, start from [Your first ground state](@ref tutorial_first_groundstate); for the infinite-system counterpart, see [The thermodynamic limit](@ref tutorial_thermodynamic_limit). diff --git a/docs/src/howto/hamiltonians.md b/docs/src/howto/hamiltonians.md new file mode 100644 index 000000000..9b8206684 --- /dev/null +++ b/docs/src/howto/hamiltonians.md @@ -0,0 +1,107 @@ +# [Building Hamiltonians](@id howto_hamiltonians) + +The examples on this page use MPSKit.jl, TensorKit.jl, and TensorKitTensors.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +This page collects recipes for constructing MPO Hamiltonians from local operators, for both finite and infinite (translation-invariant) lattices. +It also covers converting an infinite Hamiltonian to finite open or periodic boundary conditions, and carving a finite window out of an infinite Hamiltonian. +For building the matching state objects see [Constructing states](@ref howto_states); for evaluating a Hamiltonian's energy on a state see [Computing observables](@ref howto_observables). +The reference page for the underlying MPO structure is [Operators](@ref lib_operators). + +```@example hamiltonians +using MPSKit, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ +``` + +--- + +## Setup: local operators + +The examples below build the transverse-field Ising model (TFIM), the same flagship model used elsewhere in these docs. +It couples neighbouring spins through `X ⊗ X` and applies a transverse field of strength `g` along `Z`. +The model has a quantum phase transition at `g = 1`, separating an ordered (ferromagnetic) phase at small `g` from a disordered (paramagnetic) phase at large `g`. +The single-site Pauli operators come from [TensorKitTensors.jl](https://github.com/QuantumKitHub/TensorKitTensors.jl), which returns `ComplexF64` `TensorMap`s on the spin-1/2 physical space `ℂ^2`: + +```@example hamiltonians +X = σˣ() +Z = σᶻ() +g = 0.5 +``` + +--- + +## 1. Finite Hamiltonian from local terms + +[`FiniteMPOHamiltonian`](@ref) takes an array of `VectorSpace` objects describing the local Hilbert spaces, followed by any number of `inds => operator` pairs. +A single-site term uses a one-element tuple `(i,) => O`; a nearest-neighbour term uses a two-element tuple `(i, i + 1) => O₁₂`, where `O₁₂` is a two-site operator built with `⊗`: + +```@example hamiltonians +L = 8 +lattice = fill(ℂ^2, L) + +H_finite = FiniteMPOHamiltonian(lattice, (i, i + 1) => -(X ⊗ X) for i in 1:(L - 1)) + + FiniteMPOHamiltonian(lattice, (i,) => -g * Z for i in 1:L) +``` + +Adding the two `FiniteMPOHamiltonian` objects combines the bond terms and the field terms into a single Jordan-block MPO. +Equivalently, all terms can be passed as one call by splatting a single collection of `inds => operator` pairs; see [Operators](@ref lib_operators) for that form. + +!!! note + The index tuples must refer to contiguous sites for the two-site pairs shown here. + See [Operators](@ref lib_operators) for the general, non-nearest-neighbour "expert mode" construction, which is not covered on this task-oriented page. + +--- + +## 2. Infinite (translation-invariant) Hamiltonian + +[`InfiniteMPOHamiltonian`](@ref) uses the same `inds => operator` convention, but the lattice argument is a single unit cell, and site indices wrap around it periodically. +For the 1-site TFIM unit cell, `(1, 2) => O₁₂` couples site 1 to site 2 of the *next* unit cell: + +```@example hamiltonians +unitcell = fill(ℂ^2, 1) +H_inf = InfiniteMPOHamiltonian(unitcell, (1, 2) => -(X ⊗ X), (1,) => -g * Z) +``` + +The resulting operator repeats this single bond-plus-field pattern along the whole infinite chain. +Use it directly with an [`InfiniteMPS`](@ref) in `expectation_value` or `find_groundstate`, exactly as described in [Computing observables](@ref howto_observables). + +!!! tip + Hand-assembling local operators works for any model, but for standard lattice models MPSKitModels.jl provides ready-made Hamiltonian builders and the `@mpoham` macro for a more compact syntax. + See the MPSKitModels.jl documentation for that higher-level interface; it is a separate package from MPSKit and not covered here. + +--- + +## 3. Converting between boundary conditions + +Starting from an `InfiniteMPOHamiltonian`, [`open_boundary_conditions`](@ref) truncates it to a finite chain of length `L` with open ends, and [`periodic_boundary_conditions`](@ref) instead closes it into a finite ring. +In both cases `L` must be a multiple of the unit-cell length: + +```@example hamiltonians +L_finite = 6 # multiple of the 1-site unit cell + +H_open = open_boundary_conditions(H_inf, L_finite) +``` + +```@example hamiltonians +H_periodic = periodic_boundary_conditions(H_inf, L_finite) +``` + +`H_open` is the same finite-chain Hamiltonian you would get from writing out the terms by hand, as in recipe 1 above, restricted to `L_finite` sites. +`H_periodic` additionally couples the last site back to the first, forming a ring. + +!!! note + Both functions return a [`FiniteMPOHamiltonian`](@ref). + There is no boundary-condition keyword on the `FiniteMPOHamiltonian`/`InfiniteMPOHamiltonian` constructors themselves; boundary conditions are chosen by picking which constructor (or conversion function) to call. + +--- + +## 4. A window Hamiltonian + +[`WindowMPOHamiltonian`](@ref) carves a finite interval out of an infinite Hamiltonian while keeping the infinite left and right environments intact. +This is the operator counterpart of a [`WindowMPS`](@ref) (see [Constructing states](@ref howto_states)), and the two are used together to study a finite region embedded in, and coupled to, an infinite bulk: + +```@example hamiltonians +H_window = WindowMPOHamiltonian(H_inf, 1:6) +``` + +The interval `1:6` selects which unit cells of `H_inf` become the mutable finite window; everything outside it is treated as the fixed infinite environment. diff --git a/docs/src/howto/index.md b/docs/src/howto/index.md new file mode 100644 index 000000000..909df5151 --- /dev/null +++ b/docs/src/howto/index.md @@ -0,0 +1,89 @@ +# [How-to guides](@id howto_index) + +These pages are task recipes: short, runnable answers to "how do I do X?". +They assume you already know the basics — if you are new to MPSKit, start with [Your first ground state](@ref tutorial_first_groundstate) instead. +Each recipe below stands on its own, so feel free to jump straight to the one you need. + +## States and operators + +**[Constructing states](@ref howto_states)** — building `FiniteMPS`, `InfiniteMPS`, `WindowMPS`, and `MultilineMPS` objects. +- A finite MPS — random states, initializers and element types, per-site spaces, product states, and wrapping your own site tensors. +- An infinite MPS — single- and multi-site unit cells, from spaces or from tensors. +- A window MPS — a mutable finite region embedded in infinite environments. +- A multiline MPS — stacking `InfiniteMPS` rows for boundary-MPS methods. +- States with symmetries — building MPS with `Rep[G]` graded spaces. + +**[Building Hamiltonians](@ref howto_hamiltonians)** — assembling MPO Hamiltonians from local operators. +- Finite Hamiltonian from local terms — `FiniteMPOHamiltonian` from `inds => operator` pairs. +- Infinite (translation-invariant) Hamiltonian — `InfiniteMPOHamiltonian` on a unit cell. +- Converting between boundary conditions — open vs. periodic finite chains from an infinite Hamiltonian. +- A window Hamiltonian — carving a finite interval out of an infinite Hamiltonian with `WindowMPOHamiltonian`. + +## Finding ground states + +**[Ground-state algorithms](@ref howto_groundstate_algorithms)** — configuring `find_groundstate`. +- Get a ground state with defaults — letting `find_groundstate` pick an algorithm for you. +- Configure finite-system DMRG — explicit `DMRG`/`DMRG2`, and chaining them with `&`. +- Configure infinite-system algorithms — `VUMPS`, `IDMRG`, and `IDMRG2`. +- Refine convergence with GradientGrassmann — Riemannian gradient descent after a cheaper warm-up. +- Control output and tolerances — `verbosity` levels and reusing `envs` between calls. + +**[Controlling bond dimension](@ref howto_bond_dimension)** — inspecting, growing, and shrinking bond dimension. +- Inspecting the current bond dimension — `left_virtualspace`/`right_virtualspace` and `dim`. +- Growing bond dimension — `RandExpand` (no Hamiltonian needed) and `OptimalExpand`. +- Reducing bond dimension — `SvdCut` and the in-place `changebonds!`. +- Truncation schemes — `truncrank`, `trunctol`, `notrunc`, `truncspace`, and combining them with `&`. +- Growing during finite MPS optimization — `DMRG2` and the `trscheme` keyword of `find_groundstate`. +- Growing during infinite MPS optimization — `IDMRG2` and `VUMPSSvdCut`. +- Chaining algorithms — composing bond-change and ground-state algorithms with `&`. + +## Dynamics + +**[Time evolution](@ref howto_time_evolution)** — real- and imaginary-time evolution of an MPS. +- Evolve a state through one time step — `timestep` with `TDVP`. +- Evolve over a time span — `time_evolve` across a vector of time points. +- Grow the bond dimension while evolving — `TDVP2` with a mandatory `trscheme`. +- Evolve an infinite state — single-site `TDVP` on an `InfiniteMPS`. +- Imaginary-time evolution — `imaginary_evolution = true` to cool towards the ground state. +- Build a time-evolution MPO — `make_time_mpo` (`WII`, `TaylorCluster`, `WI`) plus `approximate`. + +## Measurements + +**[Computing observables](@ref howto_observables)** — extracting physical quantities from an MPS. +- Local (one-site) expectation value — `expectation_value(ψ, i => O)`. +- Multi-site (contiguous) expectation value — tensor-product operators on an index tuple. +- Energy (full-MPO expectation value) — `expectation_value(ψ, H)` for a Hamiltonian MPO. +- Two-point correlators — `correlator`, including a full correlation profile over a range. +- Energy variance as a convergence check — `variance` as a diagnostic after a ground-state search. + +**[Entanglement entropy and spectrum](@ref howto_entanglement)** — reading off entanglement from the gauge tensors. +- Entanglement entropy at a single cut — `entropy(ψ, site)`. +- Entropy profile across every cut — collecting `entropy` over all sites. +- The entanglement spectrum — `entanglement_spectrum` as a sector-resolved vector. +- Sector-resolved spectrum — indexing the spectrum by symmetry sector with `keys`/`pairs`. +- Entanglement of an infinite MPS — `entropy`/`entanglement_spectrum` per unit-cell site. +- Plotting the spectrum — the `entanglementplot` recipe (requires Plots.jl). + +## Excitations + +**[Excited states](@ref howto_excitations)** — computing energy eigenstates beyond the ground state. +- Get a single excitation gap on an infinite chain — `QuasiparticleAnsatz` at a fixed momentum. +- Scan the dispersion relation — passing a range of momenta in one call. +- Target a symmetry sector — a charged quasiparticle via the `sector` keyword. +- Excited states on a finite chain — `QuasiparticleAnsatz`, `FiniteExcited`, and the Chepiga ansätze. +- Check excitation quality — `variance` on a quasiparticle state. +- Domain-wall excitations — quasiparticles interpolating between two distinct ground states. + +## Performance and hardware + +**[Parallelism and GPU support](@ref howto_parallelism_gpu)** — tuning how MPSKit uses the hardware. +- Setting BLAS threads — `BLAS.set_num_threads` and the OpenBLAS/MKL difference. +- Setting the MPSKit scheduler — `MPSKit.Defaults.set_scheduler!` with `:serial`/`:greedy`/`:dynamic`. +- Diagnosing the thread layout — ThreadPinning.jl `threadinfo`. +- Reducing memory usage — disabling multithreading to avoid `OutOfMemory`. +- GPU support — the experimental Adapt-based path for moving states onto a GPU. + +## Missing a recipe? + +If the task you're after isn't listed here, please open an issue at [QuantumKitHub/MPSKit.jl](https://github.com/QuantumKitHub/MPSKit.jl/issues) describing what you're trying to do. +Concrete task descriptions make the best new recipes. diff --git a/docs/src/howto/observables.md b/docs/src/howto/observables.md new file mode 100644 index 000000000..a69288767 --- /dev/null +++ b/docs/src/howto/observables.md @@ -0,0 +1,167 @@ +# [Computing observables](@id howto_observables) + +The examples on this page use MPSKit.jl, TensorKit.jl, and TensorKitTensors.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +This page collects recipes for extracting physical quantities from an MPS: local and multi-site expectation values, the energy of a Hamiltonian, two-point correlators, and the energy variance as a convergence diagnostic. +All examples share a single namespace and build on state and operator objects you would have in hand after a ground-state calculation. + +```@example observables +using MPSKit, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ +``` + +For building MPS objects see [Constructing states](@ref howto_states). +For controlling the bond dimension during optimization see [Controlling bond dimension](@ref howto_bond_dimension). +The reference page for ground-state algorithms is [Ground-state algorithms](@ref lib_groundstate). + +--- + +## Setup: state and operators + +The examples below use a spin-1/2 `FiniteMPS` together with the Pauli operators from [TensorKitTensors.jl](https://github.com/QuantumKitHub/TensorKitTensors.jl). +These are `ComplexF64` `TensorMap`s, matching the default element type of the state. + +```@example observables +L = 8 +ψ = FiniteMPS(L, ℂ^2, ℂ^8) # random finite MPS, bond dim ≤ 8 + +# single-site Pauli operators +X = σˣ() +Z = σᶻ() +``` + +The finite TFIM Hamiltonian used in recipes 3 and 5 is built from these: + +```@example observables +lattice = fill(ℂ^2, L) +H = FiniteMPOHamiltonian(lattice, (i, i + 1) => -(X ⊗ X) for i in 1:(L - 1)) + + FiniteMPOHamiltonian(lattice, (i,) => -0.5 * Z for i in 1:L) +``` + +--- + +## 1. Local (one-site) expectation value + +Use `expectation_value(ψ, i => O)` to evaluate ⟨ψ|Oᵢ|ψ⟩ at a single site `i`. +The pair `i => O` identifies the site and the single-site operator. + +```@example observables +expectation_value(ψ, 4 => Z) # ⟨Z⟩ at site 4 +``` + +To compute a local observable at every site, broadcast over the indices: + +```@example observables +[expectation_value(ψ, i => Z) for i in 1:L] +``` + +!!! note + The state `ψ` must be normalised for the expectation value to be meaningful. + A freshly constructed `FiniteMPS` is normalised by default; if you modified + the tensors by hand, call `normalize!(ψ)` first. + +--- + +## 2. Multi-site (contiguous) expectation value + +For a product of operators on a contiguous range of sites, pass a tuple of indices together with a multi-site operator formed by taking tensor products `⊗`: + +```@example observables +# ⟨X₂ X₃⟩ — two-site operator on sites 2 and 3 +expectation_value(ψ, (2, 3) => X ⊗ X) +``` + +The operator `X ⊗ X` is a `{2,2}` `TensorMap` (two incoming, two outgoing legs) matching the two-site index tuple `(2, 3)`. +The tuple must be contiguous; arbitrary non-adjacent index sets are not supported by this form. + +```@example observables +# ⟨Z₁ Z₂ Z₃⟩ — three-site operator +expectation_value(ψ, (1, 2, 3) => Z ⊗ Z ⊗ Z) +``` + +--- + +## 3. Energy (full-MPO expectation value) + +When the operator is an [`AbstractMPO`](@ref) (e.g. a Hamiltonian), pass it directly without an index argument. +MPSKit evaluates the full contraction ⟨ψ|H|ψ⟩: + +```@example observables +E = expectation_value(ψ, H) +``` + +The result is a scalar; for a Hermitian `H` and a normalised `ψ` its imaginary part is zero up to floating-point noise. + +The same form works for `InfiniteMPS` with an `InfiniteMPOHamiltonian`, where the returned value is the energy **per unit cell**. + +!!! note + The full-MPO form automatically computes and caches the environments. + If you already have environments from a prior `find_groundstate` call you can + pass them as a trailing argument to avoid recomputation, but this is optional; + omitting them is always safe and correct. + +--- + +## 4. Two-point correlators + +[`correlator`](@ref) computes ⟨O₁ᵢ O₂ⱼ⟩ for two sites with `i < j`. +The recommended call uses a single two-site operator `O₁₂`: + +```@example observables +# ⟨Z₂ Zⱼ⟩ for a single target site j = 6 +correlator(ψ, Z ⊗ Z, 2, 6) +``` + +!!! warning + `i` must be strictly less than `j`. + Calling `correlator(ψ, O₁₂, i, j)` with `i ≥ j` will throw an error. + +### Correlation profile over a range + +Pass a range as `j` to obtain a vector of correlators — one entry per target site. +This is the efficient route for a full correlation profile: + +```@example observables +# ⟨Z₂ Zⱼ⟩ for j = 3, 4, …, L +corr = correlator(ψ, Z ⊗ Z, 2, 3:L) +``` + +The result is a `Vector` whose `k`-th element corresponds to `j = 3 + k - 1`. + +A common pattern is to normalise the correlator by ⟨Z⟩² to extract the connected part: + +```@example observables +z_mean = expectation_value(ψ, 2 => Z) +connected = [c - z_mean * expectation_value(ψ, j => Z) for (j, c) in zip(3:L, corr)] +``` + +This subtracts the disconnected part ``\langle Z_i\rangle\langle Z_j\rangle`` to leave the connected correlator ``\langle Z_i Z_j\rangle - \langle Z_i\rangle\langle Z_j\rangle``. + +--- + +## 5. Energy variance as a convergence check + +[`variance`](@ref) returns ⟨H²⟩ − ⟨H⟩², which is zero if and only if `ψ` is an exact eigenstate of `H`. +Use it as a quantitative convergence diagnostic after a ground-state search: + +```@example observables +var_E = variance(ψ, H) +``` + +A smaller variance indicates that `ψ` is closer to a true eigenstate. + +After running a ground-state algorithm the variance should have dropped significantly compared to the random starting state above: + +```@example observables +ψ_gs, envs, _ = find_groundstate(ψ, H, DMRG(; maxiter = 10)) +variance(ψ_gs, H) +``` + +!!! note + The `variance` function also accepts an optional pre-computed `envs` argument. + Pass the environments returned by `find_groundstate` to skip recomputation: + + ```julia + variance(ψ_gs, H, envs) + ``` diff --git a/docs/src/howto/parallelism_gpu.md b/docs/src/howto/parallelism_gpu.md new file mode 100644 index 000000000..dd5b6fe9c --- /dev/null +++ b/docs/src/howto/parallelism_gpu.md @@ -0,0 +1,156 @@ +# [Parallelism and GPU support](@id howto_parallelism_gpu) + +This page collects the practical knobs for controlling how MPSKit uses the hardware: +how to set BLAS threads, how to pick the MPSKit multithreading scheduler, how to inspect +the resulting thread layout, and what to do when a calculation runs out of memory. +It closes with a short, experimental note on moving states onto a GPU. + +For the reasoning behind these settings — why Julia threads and BLAS threads interact the +way they do, and where MPSKit actually parallelizes — see +[The parallelism model](@ref concept_parallelism_model). + +!!! note + Threading performance depends heavily on the hardware, the BLAS vendor, the size of + the problem, and the availability of memory and memory bandwidth. + There is no single setting that is optimal everywhere; the recipes below are sensible + starting points, and you should measure on your own machine. + +## Setting the number of BLAS threads + +Most of the heavy linear algebra in MPSKit ends up in BLAS routines (in particular `gemm`, +general matrix-matrix multiplication). +The number of BLAS threads is controlled through `LinearAlgebra.BLAS.set_num_threads`: + +```julia +using LinearAlgebra: BLAS +BLAS.set_num_threads(1) +``` + +With OpenBLAS (the default vendor), `set_num_threads` sets the **total** number of BLAS +threads held in a shared pool across all Julia threads. +When Julia is started with multiple threads, setting this to `1` lets MPSKit drive the +parallelism through its own (Julia-thread) machinery instead, which is often the best +option for OpenBLAS. + +With [MKL.jl](https://github.com/JuliaLinearAlgebra/MKL.jl) the semantics differ: the BLAS +thread count applies **per Julia thread**, so 4 Julia threads with 4 BLAS threads each spawn +16 BLAS threads in total. +In that case you typically want to lower the BLAS thread count to avoid oversubscribing the +physical cores. + +## Setting the MPSKit scheduler + +When Julia runs with multiple threads, MPSKit parallelizes parts of its algorithms through +[OhMyThreads.jl](https://juliafolds2.github.io/OhMyThreads.jl/stable/). +The behaviour is controlled by a global scheduler, set with `MPSKit.Defaults.set_scheduler!`: + +```julia +MPSKit.Defaults.set_scheduler!(:serial) # disable multithreading +MPSKit.Defaults.set_scheduler!(:greedy) # multithreading with greedy load-balancing +MPSKit.Defaults.set_scheduler!(:dynamic) # multithreading with dynamic load-balancing +``` + +`set_scheduler!` also accepts an `OhMyThreads.Scheduler` directly, or a symbol together with +keyword arguments that are forwarded to the corresponding OhMyThreads scheduler. +When left unset, the default is a serial scheduler if Julia was started with a single thread, +and a dynamic scheduler otherwise. +For the full list of schedulers and their keyword arguments, see the +[OhMyThreads.jl documentation](https://juliafolds2.github.io/OhMyThreads.jl/stable/refs/api/#Schedulers). + +## Diagnosing the thread layout + +Because the interaction between Julia threads and BLAS threads is easy to get wrong, it helps +to inspect the actual layout. +[ThreadPinning.jl](https://github.com/carstenbauer/ThreadPinning.jl) provides `threadinfo`, +which reports the Julia threads, their CPU mapping, and the BLAS backend and thread count: + +```julia-repl +julia> Threads.nthreads() +4 + +julia> using ThreadPinning; threadinfo(; blas = true, hints = true) + +System: 8 cores (2-way SMT), 1 sockets, 1 NUMA domains + +| 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | + +# = Julia thread, # = HT, # = Julia thread on HT, | = Socket separator + +Julia threads: 4 +├ Occupied CPU-threads: 4 +└ Mapping (Thread => CPUID): 1 => 8, 2 => 5, 3 => 9, 4 => 2, + +BLAS: libopenblas64_.so +└ openblas_get_num_threads: 8 + +[ Info: jlthreads != 1 && blasthreads < cputhreads. You should either set BLAS.set_num_threads(1) (recommended!) or at least BLAS.set_num_threads(16). +[ Info: jlthreads < cputhreads. Perhaps increase number of Julia threads to 16? +``` + +Passing `hints = true` makes ThreadPinning emit the advisory messages shown above. +Loading a different BLAS backend changes the report; with MKL, for example, `threadinfo` +reports `libmkl_rt.so` and warns when the per-Julia-thread BLAS thread count exceeds the +available CPU threads per Julia thread: + +```julia-repl +julia> using MKL; threadinfo(; blas = true, hints = true) + +System: 8 cores (2-way SMT), 1 sockets, 1 NUMA domains + +| 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | + +# = Julia thread, # = HT, # = Julia thread on HT, | = Socket separator + +Julia threads: 4 +├ Occupied CPU-threads: 4 +└ Mapping (Thread => CPUID): 1 => 11, 2 => 12, 3 => 1, 4 => 2, + +BLAS: libmkl_rt.so +├ mkl_get_num_threads: 8 +└ mkl_get_dynamic: true + +┌ Warning: blasthreads_per_jlthread > cputhreads_per_jlthread. You should decrease the number of MKL threads, i.e. BLAS.set_num_threads(4). +└ @ ThreadPinning ~/.julia/packages/ThreadPinning/qV2Cd/src/threadinfo.jl:256 +[ Info: jlthreads < cputhreads. Perhaps increase number of Julia threads to 16? +``` + +## Reducing memory usage + +MPSKit's multithreading spawns tasks in a nested fashion, each allocating and deallocating +memory in a tight loop. +This can put enough pressure on the garbage collector that memory usage climbs and, in the +worst case, an `OutOfMemory` error occurs before the garbage can be cleared. + +If you hit this, the most effective remedy is usually to disable MPSKit's multithreading, +by setting the scheduler to serial: + +```julia +MPSKit.Defaults.set_scheduler!(:serial) +``` + +The `derivatives` (the effective local operators applied during the sweeps) are reported to +be the most memory-intensive part, so this is where switching off multithreading helps most. + +For why this pressure arises, see +[Why memory pressure arises](@ref concept_parallelism_model). + +## GPU support + +!!! warning "Experimental" + GPU support in MPSKit is **experimental and minimal**. + There are no GPU-specific algorithms, kernels, or tuning options; the only surface is + an [Adapt.jl](https://github.com/JuliaGPU/Adapt.jl)-based mechanism for moving a state + or operator onto a different array type. + Treat this as preparatory infrastructure rather than a supported workflow. + +The package extension `MPSKitAdaptExt` defines `Adapt.adapt_structure` for `FiniteMPS`, +`InfiniteMPS`, `MPO`, and `MPOHamiltonian`. +This lets you convert the underlying tensors to a GPU array type with `Adapt.adapt`, after +which the algorithms dispatch through that array type. +A move onto a CUDA array would look like the following: + +```julia +using Adapt, CUDA +ψ_gpu = adapt(CuArray, ψ) +``` + diff --git a/docs/src/howto/quasi_1d_geometries.md b/docs/src/howto/quasi_1d_geometries.md new file mode 100644 index 000000000..1142de805 --- /dev/null +++ b/docs/src/howto/quasi_1d_geometries.md @@ -0,0 +1,150 @@ +# [Quasi-1D geometries](@id howto_quasi_1d_geometries) + +```@meta +DocTestSetup = quote + using MPSKit, MPSKitModels, TensorKit +end +``` + +MPSKit works with matrix product states, which are intrinsically one-dimensional objects. +A two-dimensional lattice can still be studied by winding it onto a single chain: the sites of the 2D lattice are placed in a linear order, and a 2D coupling becomes a (possibly long-ranged) coupling between two positions on that chain. +This is the standard "quasi-1D" or "cylinder" approach to 2D systems with tensor networks. + +This page collects recipes for building such geometries. +The lattice types and the `@mpoham` helper used here come from [MPSKitModels.jl](https://quantumkithub.github.io/MPSKitModels.jl/dev/), a companion package that supplies lattices, local operators, and ready-made model Hamiltonians. +For the underlying one-dimensional Hamiltonian construction see [Building Hamiltonians](@ref howto_hamiltonians); for the algorithms that consume the resulting operator see [Ground-state algorithms](@ref lib_groundstate). + +```@example quasi1d +using MPSKit, MPSKitModels, TensorKit +``` + +--- + +## Available lattice geometries + +MPSKitModels exposes a small family of lattice types, all subtypes of `AbstractLattice`. +The one-dimensional lattices are `FiniteChain` and `InfiniteChain`. +The genuinely two-dimensional geometries, wrapped for use on a 1D chain, are: + +- `FiniteCylinder(L, N)` and `InfiniteCylinder(L, N)` — a strip of circumference `L` rolled into a tube, so the two edges in the transverse direction are identified (periodic around the circumference). +- `FiniteStrip(L, N)` and `InfiniteStrip(L, N)` — the same rectangular patch but with *open* boundaries in the transverse direction (no wrap-around). +- `FiniteLadder(N)` and `InfiniteLadder(N)` — convenience constructors for the width-2 strip, i.e. `FiniteStrip(2, N)` / `InfiniteStrip(2, N)`. +- `FiniteHelix(L, N)` and `InfiniteHelix(L, N)` — a helical winding of the cylinder. +- `HoneycombYC(L, N)` — a honeycomb lattice on an infinite cylinder. + +For the square-lattice geometries the two integer arguments are the circumference `L` (number of sites per rung) and the total number of sites `N`; `N` must be a multiple of `L`, and it defaults to `L` (a single rung). +Constructing a lattice does not build any operator; it only fixes the geometry and the site ordering. + +```@example quasi1d +InfiniteCylinder(3) # circumference 3, one rung per unit cell +``` + +```@example quasi1d +InfiniteLadder(4) # a two-leg ladder, four sites per unit cell +``` + +!!! note + The `Finite*` variants describe a finite patch and produce a [`FiniteMPOHamiltonian`](@ref); the `Infinite*` variants describe a unit cell that repeats along the chain axis and produce an [`InfiniteMPOHamiltonian`](@ref). + Choose the pair that matches the state you intend to optimize. + +--- + +## Building a Hamiltonian on a cylinder + +The model builders in MPSKitModels accept a lattice as an optional positional argument, so switching from a chain to a cylinder is a one-word change. +Here is the transverse-field Ising model on an infinite cylinder of circumference 3: + +```@example quasi1d +H_cyl = transverse_field_ising(InfiniteCylinder(3); g = 3.0) +``` + +The result is an ordinary [`InfiniteMPOHamiltonian`](@ref) with one MPO tensor per site of the unit cell. +It is used exactly like a chain Hamiltonian: pair it with an [`InfiniteMPS`](@ref) whose unit cell has the same length and feed it to `find_groundstate` (see [Ground-state algorithms](@ref lib_groundstate)). +Because the cylinder wraps a 2D coupling onto the chain, the bond dimension required for a converged result grows quickly with the circumference; see the note at the end of this page. + +--- + +## Building a Hamiltonian on a ladder + +The same model builders work for a ladder: + +```@example quasi1d +H_ladder = heisenberg_XXX(InfiniteLadder(4); spin = 1 // 2) +``` + +For couplings that are not covered by a ready-made model, assemble the Hamiltonian directly with the `@mpoham` macro. +It sums single-site and two-site local operators over the vertices and bonds that the lattice reports. +The building blocks are `vertices(lattice)` (all sites) and `nearest_neighbours(lattice)` (all nearest-neighbour bonds, including the transverse rung and wrap-around bonds): + +```@example quasi1d +lat = InfiniteLadder(4) +H_manual = @mpoham sum(σᶻᶻ(){i, j} for (i, j) in nearest_neighbours(lat)) + + sum(2.0 * σˣ(){i} for i in vertices(lat)) +``` + +The `O{i, j}` syntax marks `O` as a local operator acting on sites `i` and `j`, where the indices are lattice points; `@mpoham` handles their placement on the 1D chain. +This is the two-dimensional counterpart of the manual chain construction in [Building Hamiltonians](@ref howto_hamiltonians). + +--- + +## How the 2D lattice maps onto the 1D chain + +Each 2D lattice defines a linear order on its sites through `linearize_index`, which turns a `(row, column)` coordinate into a single position along the MPS chain. +For a cylinder the sites of one rung are numbered first, then the next rung, and so on. +The rung index runs fastest: + +```@example quasi1d +cyl = InfiniteCylinder(3) +linearize_index.(collect(vertices(cyl))) +``` + +The bonds that `nearest_neighbours` returns reveal how far apart coupled sites end up on the chain. +Listing them as linear-index pairs for the same circumference-3 cylinder: + +```@example quasi1d +[linearize_index(i) => linearize_index(j) for (i, j) in nearest_neighbours(cyl)] +``` + +Two kinds of bonds appear. +Bonds along the chain axis connect a site to the corresponding site one rung over, at chain distance `L` (here `1 => 4`, `2 => 5`, `3 => 6`). +Bonds around the circumference connect neighbours within a rung; the bond that closes the ring connects the first and last site of a rung (here `3 => 1`), spanning `L - 1` sites on the chain. +This wrap-around bond is the longest-ranged coupling in the problem, and it is what makes a wider cylinder more expensive: the MPO must carry that coupling across `L - 1` sites, and the entanglement cut through the chain now spans the whole circumference. + +!!! warning "Circumference controls the cost" + The bond dimension needed for a given accuracy grows rapidly with the circumference `L`, because the entanglement across a cut scales with the length of the boundary it severs (the circumference). + Keep `L` small in exploratory runs and increase it while watching convergence. + +--- + +## Choosing the site ordering + +The default ordering above is not the only option: any permutation of the sites is a valid 1D chain, and a better ordering can shorten the longest-ranged bonds. +`SnakePattern` wraps a lattice together with a permutation function that maps the lattice's natural linear index to its position on the chain. +The wrapped lattice reports the same vertices and bonds, but re-indexed through the pattern. + +The example below reverses the site order within every second rung of a finite circumference-3 cylinder — a "boustrophedon" (back-and-forth) snake that keeps successive rungs adjacent: + +```@example quasi1d +finite_cyl = FiniteCylinder(3, 6) +pattern = i -> [1, 2, 3, 6, 5, 4][i] # reverse the second rung +snake = SnakePattern(finite_cyl, pattern) + +before = [linearize_index(i) => linearize_index(j) for (i, j) in nearest_neighbours(finite_cyl)] +after = [linearize_index(i) => linearize_index(j) for (i, j) in nearest_neighbours(snake)] +(before, after) +``` + +Passing `snake` to `@mpoham` (in place of `finite_cyl`) then builds the Hamiltonian in this reordered basis. +A `SnakePattern` built without a pattern, `SnakePattern(lattice)`, uses the identity ordering. + +!!! warning "Ordering helpers are broken at v0.4.7" + MPSKitModels also exports `backandforth_pattern` and `frontandback_pattern` as pre-built cylinder orderings, but at the pinned version (v0.4.7) they error: the returned closure indexes a lazy `Iterators.flatten` object, which has no `getindex` method. + This is a known upstream bug, so this page shows an explicit permutation instead. + + Any custom permutation must be defined for every linear index that the lattice's bonds reference. + On an *infinite* lattice the nearest-neighbour bonds reach into the next unit cell, so a permutation defined only on `1:N` errors there with a `BoundsError`; a pattern for an infinite cylinder has to wrap periodically, e.g. `pattern(i) = ((i - 1) ÷ N) * N + perm[mod1(i, N)]`. + The finite cylinder above sidesteps this. + +```@meta +DocTestSetup = nothing +``` diff --git a/docs/src/howto/saving_loading.md b/docs/src/howto/saving_loading.md new file mode 100644 index 000000000..8c4ebeba7 --- /dev/null +++ b/docs/src/howto/saving_loading.md @@ -0,0 +1,139 @@ +# [Saving and loading](@id howto_saving_loading) + +The examples on this page use MPSKit.jl and TensorKit.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +MPSKit does **not** ship its own save/load functions. +States such as [`FiniteMPS`](@ref) and [`InfiniteMPS`](@ref) are ordinary Julia objects that wrap TensorKit `TensorMap`s, so any general-purpose Julia serializer stores and restores them. +Two options cover essentially all use cases: + +- **`Serialization`** — a standard-library module, always available, no extra dependency. + Best for quick "save a result and pick it up in the next session" workflows. + Its file format is **not** guaranteed stable across Julia or package versions (see [Caveats](@ref howto_saving_loading_caveats)). +- **[JLD2.jl](https://github.com/JuliaIO/JLD2.jl)** — a widely used HDF5-compatible format with named datasets and better long-term robustness. + Recommended when you want to archive data or share files between machines. + JLD2 is a separate package you must add with `] add JLD2`. + +The runnable recipes below use `Serialization` so they execute with no extra dependency. +The JLD2 variants are shown separately and are equivalent in what they store. + +```@example saveload +using MPSKit, TensorKit +using Serialization +``` + +--- + +## 1. Save and reload a finite MPS + +[`serialize`](https://docs.julialang.org/en/v1/stdlib/Serialization/#Serialization.serialize) writes any object to a file; `deserialize` reads it back. +Here we write to a temporary path and check that the reloaded state is identical by taking the overlap `⟨ψ | ψ_loaded⟩`, which is `1` (up to rounding) when the two states coincide. + +```@example saveload +ψ = FiniteMPS(10, ℂ^2, ℂ^16) + +path = tempname() # a fresh temporary file path +serialize(path, ψ) + +ψ_loaded = deserialize(path) +abs(dot(ψ, ψ_loaded)) # ≈ 1: the reloaded state equals the original +``` + +The reloaded object is a genuine [`FiniteMPS`](@ref), ready for any further computation: + +```@example saveload +ψ_loaded isa FiniteMPS +``` + +Nothing here is specific to a *random* state — the same holds for a state returned by [`find_groundstate`](@ref) or [`timestep`](@ref). +Save the state you actually care about the moment you have it. + +## 2. Save and reload an infinite MPS + +[`InfiniteMPS`](@ref) works exactly the same way. +Because an infinite state is normalized by its gauge, the overlap check above is not the natural diagnostic; instead compare the gauged tensors directly. + +```@example saveload +ψ∞ = InfiniteMPS(ℂ^2, ℂ^16) + +path∞ = tempname() +serialize(path∞, ψ∞) + +ψ∞_loaded = deserialize(path∞) +ψ∞_loaded.AL[1] ≈ ψ∞.AL[1] # left-gauged tensors match +``` + +## 3. Store several objects together + +To keep a state alongside metadata (parameters, a description, the energy you measured), serialize a `NamedTuple` or `Dict` in one file. +This keeps everything that belongs together in a single artifact. + +```@example saveload +result = (state = ψ, χ = 16, note = "TFIM ground state") + +path_result = tempname() +serialize(path_result, result) + +back = deserialize(path_result) +back.note +``` + +```@example saveload +abs(dot(back.state, ψ)) # the embedded state round-trips too +``` + +## 4. The JLD2 variant + +[JLD2.jl](https://github.com/JuliaIO/JLD2.jl) stores objects under string keys and is the more portable choice for archival data. +Add it with `] add JLD2` first. +The following is equivalent to the `Serialization` recipes above; it is not executed here because JLD2 is not a dependency of this documentation build. + +```julia +using JLD2 + +# save one or more named objects +jldsave("state.jld2"; ψ, χ = 16, note = "TFIM ground state") + +# load them back by name +ψ_loaded = load("state.jld2", "ψ") +note = load("state.jld2", "note") +``` + +Symmetric states round-trip through JLD2 without any extra work: the `TensorMap`s carry their own symmetry sectors and vector spaces, so a state built on, e.g., `Z2Space` is restored with its full symmetry structure intact. + +--- + +## Environments + +Cached [environments](@ref concept_environments) (the objects returned by `environments`, held inside the value from [`find_groundstate`](@ref) and friends) are serializable in exactly the same way as states — they are also just tensors. +In practice, however, **it is usually not worth saving them**: environments are derived data, tied to one specific state, and recomputing them from a stored state is cheap compared to the optimization that produced the state. + +The recommended workflow is therefore to save only the *state* and rebuild the environments after loading: + +```@example saveload +using MPSKitModels # for the Hamiltonian +H = transverse_field_ising(FiniteChain(10)) + +envs = environments(ψ_loaded, H, ψ_loaded) # rebuilt from the reloaded state +nothing # hide +``` + +If you do have a reason to persist environments (e.g. to resume an expensive iterative build), `serialize`/`deserialize` them just like a state. + +## [Caveats](@id howto_saving_loading_caveats) + +- **Version compatibility.** + `Serialization` files are **not** guaranteed to be readable by a different Julia version, nor after MPSKit or TensorKit change their internal type layout. + Treat `Serialization` output as a scratch artifact within one environment; use **JLD2** for anything you need to reopen weeks later or on another machine. + +- **Symmetric tensors are self-describing.** + A saved state carries the vector spaces and symmetry sectors of every tensor, so you do not need to record the symmetry separately — loading reconstructs the full space structure. + This was verified for a `Z2`-symmetric state round-tripping through both `Serialization` and JLD2. + +- **File size.** + A stored state is roughly the size of its tensors, which grows with the bond dimension (and, for symmetric states, the sector structure). + For large-bond-dimension states these files can be substantial; write them to scratch/bulk storage rather than a quota-limited home directory, and consider saving only the final state rather than every intermediate. + +- **What to save.** + Prefer saving the state (and the parameters needed to rebuild its Hamiltonian) over saving derived caches like environments. + A state plus its model definition is enough to reconstruct everything else. diff --git a/docs/src/howto/states.md b/docs/src/howto/states.md new file mode 100644 index 000000000..3ea69ea04 --- /dev/null +++ b/docs/src/howto/states.md @@ -0,0 +1,267 @@ +# [Constructing states](@id howto_states) + +The examples on this page use MPSKit.jl and TensorKit.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +This page collects recipes for building [`FiniteMPS`](@ref), [`InfiniteMPS`](@ref), [`WindowMPS`](@ref), and [`MultilineMPS`](@ref) objects. +All constructors live in the `MPSKit` namespace; the examples below assume + +```@example howto_states +using MPSKit, TensorKit +``` + +For background on what these types represent and how gauging works, see the [States](@ref lib_states) reference page. + +--- + +## 1. A finite MPS + +### From length, physical space, and maximum bond dimension + +The most common starting point: give the chain length `N`, the local physical `VectorSpace`, and the maximum allowed virtual space. +The constructor fills the tensors with random `ComplexF64` entries and trims the actual bond dimensions to full rank, so passing an over-large `maxVspace` is safe. + +```@example howto_states +L = 10 +d = ℂ^2 # spin-1/2 physical space (dim 2) +D = ℂ^16 # maximum bond dimension + +ψ = FiniteMPS(L, d, D) +``` + +Inspect the resulting virtual spaces with `left_virtualspace` and `right_virtualspace`. +To get the numeric bond dimension at bond `i` use `dim`: + +```@example howto_states +dim(left_virtualspace(ψ, 3)) # bond dimension between sites 2 and 3 +``` + +```@example howto_states +physicalspace(ψ, 1) # local Hilbert space at site 1 +``` + +### Choosing the initializer and element type + +Pass an initializer function (`rand` or `randn`) and an element type as the first two arguments: + +```@example howto_states +ψ_rand = FiniteMPS(rand, ComplexF64, L, d, D) # default — same as FiniteMPS(L, d, D) +ψ_randn = FiniteMPS(randn, ComplexF64, L, d, D) # normally distributed entries +``` + +The element type sets the scalar type of the tensors, e.g. `ComplexF64` (the default) or `Float64` for a real-valued state. + +### Per-site physical and virtual spaces + +When the physical space varies from site to site — or you want fine control over which bond gets which maximum dimension — pass vectors instead of scalars. +The `maxVspaces` vector must have length `N - 1` (one entry per bond): + +```@example howto_states +Pspaces = [ℂ^2, ℂ^3, ℂ^2, ℂ^3, ℂ^2] # alternating physical spaces +maxVspaces = [ℂ^8, ℂ^8, ℂ^8, ℂ^8] # one per bond (length N-1) + +ψ_het = FiniteMPS(rand, ComplexF64, Pspaces, maxVspaces) +``` + +```@example howto_states +physicalspace(ψ_het, 2) # ℂ^3 +``` + +### A product state (trivial virtual space) + +A product (bond-dimension-1) state has no entanglement: each site carries its own single-site state, independent of the others (with `rand`, a random such state per site). +Achieve this by passing `oneunit(d)` — the one-dimensional unit space of the same symmetry sector — as the maximum virtual space: + +```@example howto_states +ψ_prod = FiniteMPS(rand, ComplexF64, L, ℂ^2, oneunit(ℂ^2)) +dim(left_virtualspace(ψ_prod, 5)) # should be 1 +``` + +!!! note + `oneunit(V)` returns the one-dimensional trivial space matching the symmetry type of `V`. + For plain complex spaces, `oneunit(ℂ^2) == ℂ^1`. + +### From your own site tensors + +If you already have a vector of `TensorMap` objects with the correct index structure (virtual ⊗ physical ← virtual), pass them directly. +The constructor performs a left-to-right QR sweep to bring the state into a canonical form: + +```@example howto_states +# build three-site rank-1 tensors by hand +site_tensors = [rand(ComplexF64, ℂ^1 ⊗ ℂ^2 ← ℂ^1) for _ in 1:L] +ψ_from_tensors = FiniteMPS(site_tensors) +``` + +Set `normalize = true` to also normalize the state during construction (the default is `false` when passing raw tensors): + +```@example howto_states +ψ_normed = FiniteMPS(site_tensors; normalize = true) +``` + +--- + +## 2. An infinite MPS + +### Scalar convenience form + +Provide `d` and `D` as integers or spaces; the constructor builds a single-site unit cell: + +```@example howto_states +ψ_inf = InfiniteMPS(2, 20) # integers → plain ComplexSpace dimensions +``` + +```@example howto_states +ψ_inf2 = InfiniteMPS(ℂ^2, ℂ^20) # same, spelled out as spaces +``` + +### Multi-site unit cell + +Pass vectors of physical and virtual spaces. +The virtual spaces are those to the *right* of the corresponding sites: + +```@example howto_states +ψ_2site = InfiniteMPS([ℂ^2, ℂ^2], [ℂ^20, ℂ^20]) +``` + +```@example howto_states +physicalspace(ψ_2site, 1) +``` + +```@example howto_states +right_virtualspace(ψ_2site, 1) # virtual space to the right of site 1 +``` + +### Choosing element type and initializer + +```@example howto_states +ψ_inf_r = InfiniteMPS(rand, Float64, [ℂ^2], [ℂ^10]) +``` + +### From site tensors + +Tensors must form a valid periodic chain (virtual spaces must match across the unit-cell boundary): + +```@example howto_states +inf_tensors = [rand(ComplexF64, ℂ^4 ⊗ ℂ^2 ← ℂ^4)] +ψ_inf_t = InfiniteMPS(inf_tensors) +``` + +--- + +## 3. A window MPS + +A [`WindowMPS`](@ref) embeds a mutable finite window inside two infinite environments. + +### Slice an existing InfiniteMPS + +The simplest route: pick a region of length `L` from an `InfiniteMPS`. +Both environments are set to the same object (the original infinite state): + +```@example howto_states +ψ_bulk = InfiniteMPS(ℂ^2, ℂ^8) +ψ_win = WindowMPS(ψ_bulk, 6) # window of 6 sites +``` + +```@example howto_states +length(ψ_win) # 6 +``` + +### From space specifications + +Provide the window dimensions together with the infinite environments. +The boundary virtual spaces are taken automatically from `ψₗ`/`ψᵣ`: + +```@example howto_states +ψ_win2 = WindowMPS(rand, ComplexF64, 6, ℂ^2, ℂ^8, ψ_bulk) +``` + +### From a FiniteMPS and two environments + +Build a `FiniteMPS` with matching boundary virtual spaces first, then wrap: + +```@example howto_states +finite_part = FiniteMPS(6, ℂ^2, ℂ^8; left = ℂ^8, right = ℂ^8) +ψ_win3 = WindowMPS(ψ_bulk, finite_part, ψ_bulk) +``` + +!!! warning + When `ψᵣ` is omitted in the outer constructors, the right environment is + **the same object** as the left environment (no copy is made). + If you later evolve the two environments independently, pass `copy(ψ_bulk)` + explicitly as the right argument to avoid aliasing: + + ```julia + ψ_win_safe = WindowMPS(rand, ComplexF64, 6, ℂ^2, ℂ^8, ψ_bulk, copy(ψ_bulk)) + ``` + +--- + +## 4. A multiline MPS + +[`MultilineMPS`](@ref) stacks several [`InfiniteMPS`](@ref) rows and is used in boundary-MPS methods for 2D classical partition functions. + +### From a vector of InfiniteMPS rows + +```@example howto_states +row1 = InfiniteMPS(ℂ^2, ℂ^8) +row2 = InfiniteMPS(ℂ^2, ℂ^8) +ψ_ml = MultilineMPS([row1, row2]) +``` + +Access tensors with Cartesian `[row, col]` indexing: + +```@example howto_states +ψ_ml.AL[1, 1] # left-gauged tensor of row 1, unit-cell site 1 +``` + +### From space matrices + +Pass matrices whose rows correspond to MPS rows and columns to unit-cell sites: + +```@example howto_states +pspaces = fill(ℂ^2, 2, 2) # 2 rows × 2-site unit cell +Dspaces = fill(ℂ^8, 2, 2) +ψ_ml2 = MultilineMPS(pspaces, Dspaces) +``` + +--- + +## 5. States with symmetries + +All constructors accept TensorKit graded spaces. +Pass a `Rep[G]` physical space and a `Rep[G]` maximum virtual space; the constructor automatically selects the consistent fusion channels. + +### Finite MPS with U(1) symmetry + +```@example howto_states +# U(1) spin-1/2: physical space = spin up (charge +1/2) + spin down (charge -1/2) +d_u1 = Rep[U₁](1 // 2 => 1, -1 // 2 => 1) # dim 2 total +# the virtual space must span both charge parities (integer and half-integer): +# with only ±1/2 on each site, the total charge alternates parity bond to bond, +# so a purely half-integer virtual space would starve every even bond +D_u1 = Rep[U₁](0 => 2, 1 // 2 => 2, -1 // 2 => 2, 1 => 1, -1 => 1) + +ψ_u1 = FiniteMPS(rand, ComplexF64, L, d_u1, D_u1) +physicalspace(ψ_u1, 1) +``` + +```@example howto_states +dim(left_virtualspace(ψ_u1, 5)) # actual trimmed bond dimension ≤ dim(D_u1) +``` + +!!! note + The boundary virtual spaces default to `oneunit(spacetype(d_u1))`, i.e. the charge-0 sector. + Use the `left` and `right` keywords to target a different total charge: + + ```julia + # state in total charge-sector +1 (one more up-spin than down-spin) + ψ_charged = FiniteMPS(rand, ComplexF64, L, d_u1, D_u1; + right = Rep[U₁](1 => 1)) + ``` + +### Infinite MPS with U(1) symmetry + +```@example howto_states +ψ_inf_u1 = InfiniteMPS(d_u1, D_u1) +physicalspace(ψ_inf_u1, 1) +``` diff --git a/docs/src/howto/statmech.md b/docs/src/howto/statmech.md new file mode 100644 index 000000000..ff41f49c5 --- /dev/null +++ b/docs/src/howto/statmech.md @@ -0,0 +1,161 @@ +# [Statistical mechanics](@id howto_statmech) + +```@meta +DocTestSetup = quote + using MPSKit, MPSKitModels, TensorKit +end +``` + +This page collects recipes for the *boundary-MPS* (transfer-matrix) approach to two-dimensional classical statistical mechanics. +The partition function of a classical lattice model is written as a contraction of a two-dimensional tensor network, one row of which is an [`InfiniteMPO`](@ref) — the *transfer matrix*. +Contracting the network in the thermodynamic limit amounts to finding the leading eigenvector of that transfer matrix, which MPSKit approximates by an [`InfiniteMPS`](@ref) via [`leading_boundary`](@ref). + +The examples on this page use MPSKit.jl, MPSKitModels.jl, and TensorKit.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +```@example statmech +using MPSKit, MPSKitModels, TensorKit +``` + +For the structure of MPOs see [Operators and Hamiltonians](@ref concept_operators_and_hamiltonians). +For a full worked case using anyonic symmetries, see the gallery example [The Hard Hexagon model](@ref "The Hard Hexagon model"). + +--- + +## 1. Build the transfer matrix + +MPSKitModels ships ready-made transfer-matrix MPOs for several classical models. +The two-dimensional classical Ising model is provided by `classical_ising`; other options include `sixvertex` and `hard_hexagon`. + +```@example statmech +mpo = classical_ising() +``` + +The returned object is an `InfiniteMPO` with a single-site unit cell: one tensor whose four legs are the two horizontal (virtual) and two vertical (physical) bonds of the Boltzmann-weight tensor. +Its physical space is read off with `physicalspace`: + +```@example statmech +P = physicalspace(mpo, 1) +``` + +By default `classical_ising` uses the inverse temperature `beta = log(1 + sqrt(2)) / 2`. + +--- + +## 2. Find the leading boundary MPS + +[`leading_boundary`](@ref) approximates the dominant eigenvector of the transfer matrix by an `InfiniteMPS`. +Supply an initial guess with a chosen bond dimension and an optimization algorithm — [`VUMPS`](@ref) is the usual choice. + +The transfer matrix of a classical model is generally **not Hermitian**, so pass a non-Hermitian eigensolver to `VUMPS`: + +```@example statmech +alg = VUMPS(; + verbosity = 0, + alg_eigsolve = MPSKit.Defaults.alg_eigsolve(; ishermitian = false), +) + +ψ₀ = InfiniteMPS([P], [ℂ^16]) # initial guess, bond dimension 16 +ψ, envs, ϵ = leading_boundary(ψ₀, mpo, alg) +ϵ # final convergence error +``` + +`leading_boundary` returns a triple `(ψ, environments, ϵ)`: the converged boundary MPS, its environment manager, and the final convergence error. +Reuse the returned `envs` in subsequent calls to avoid recomputing environments. + +!!! note + The initial guess sets the bond dimension `D` of the boundary MPS. + A larger `D` gives a better approximation of the leading eigenvector; near a critical point the accessible correlation length grows with `D` (see [Controlling bond dimension](@ref howto_bond_dimension) for growing `D` on the fly). + +--- + +## 3. Free energy and partition function per site + +The expectation value of the transfer matrix in the converged boundary MPS is the partition function per site ``\Lambda = \mathcal{Z}^{1/N}`` in the thermodynamic limit: + +```@example statmech +Λ = expectation_value(ψ, mpo) +``` + +For a Hermitian-normalised model the imaginary part is zero up to floating-point noise. +The free energy per site follows from ``f = -\tfrac{1}{\beta}\log\Lambda``: + +```@example statmech +β = log(1 + sqrt(2)) / 2 +f = -1 / β * log(real(Λ)) +``` + +--- + +## 4. Correlation length and entanglement entropy + +The boundary MPS encodes the correlations of the two-dimensional system. +[`correlation_length`](@ref) returns the (largest) correlation length of the transfer matrix, and [`entropy`](@ref) the entanglement entropy of the boundary MPS across a virtual bond: + +```@example statmech +ξ = maximum(values(correlation_length(ψ))) +``` + +```@example statmech +S = real(first(entropy(ψ))) +``` + +At a critical point the true correlation length diverges; the finite bond dimension of the boundary MPS cuts it off at a finite value that grows with `D`. +This finite-entanglement scaling of `S` against `log(ξ)` is exactly what the gallery example [The Hard Hexagon model](@ref "The Hard Hexagon model") exploits to extract a central charge. + +--- + +## 5. Symmetric transfer matrices + +When the classical model has a global symmetry, the transfer matrix can be built from symmetric tensors, which makes the boundary computation cheaper and more stable. +`classical_ising` accepts a symmetry type; the ``\mathbb{Z}_2`` spin-flip symmetry gives a `Z2Irrep`-graded MPO: + +```@example statmech +mpo_z2 = classical_ising(Z2Irrep) +P_z2 = physicalspace(mpo_z2, 1) +``` + +The workflow is identical — only the virtual space of the initial guess is now a graded space: + +```@example statmech +V_z2 = Z2Space(0 => 8, 1 => 8) +ψ_z2, = leading_boundary(InfiniteMPS([P_z2], [V_z2]), mpo_z2, alg) +real(expectation_value(ψ_z2, mpo_z2)) +``` + +For anyonic (non-invertible) symmetries the same recipe applies with a `Vect[FibonacciAnyon]` virtual space — this is the case worked out in [The Hard Hexagon model](@ref "The Hard Hexagon model"). +See [Symmetries](@ref concept_symmetries) for how to choose graded spaces. + +--- + +## 6. Multi-row unit cells + +If the transfer matrix has a unit cell spanning several rows, the boundary object becomes a [`MultilineMPS`](@ref) and the operator a [`MultilineMPO`](@ref). +`repeat` stacks copies of a single-row MPO into a multi-row transfer matrix: + +```@example statmech +mmpo = repeat(mpo, 2, 1) # 2 rows × 1 column +``` + +Build a `MultilineMPS` with one `InfiniteMPS` per row and call `leading_boundary` exactly as before; the returned environments are a `MultilineEnvironments`: + +```@example statmech +mψ = MultilineMPS([InfiniteMPS([P], [ℂ^12]), InfiniteMPS([P], [ℂ^12])]) +mψ, menvs, = leading_boundary(mψ, mmpo, alg) +real(expectation_value(mψ, mmpo)) +``` + +The `expectation_value` of a multi-row transfer matrix is the product of the per-site weights over the rows of the unit cell; divide `log` of it by the number of rows to recover the per-site free energy. + +--- + +## See also + +- [The Hard Hexagon model](@ref "The Hard Hexagon model") — a full worked study (central charge from finite-entanglement scaling) using an anyonic transfer matrix. +- [Operators and Hamiltonians](@ref concept_operators_and_hamiltonians) — MPO structure and construction. +- [Controlling bond dimension](@ref howto_bond_dimension) — growing the boundary-MPS bond dimension. +- [Computing observables](@ref howto_observables) — `expectation_value`, `correlation_length`, and related tools. + +```@meta +DocTestSetup = nothing +``` diff --git a/docs/src/howto/time_evolution.md b/docs/src/howto/time_evolution.md new file mode 100644 index 000000000..f6d85c450 --- /dev/null +++ b/docs/src/howto/time_evolution.md @@ -0,0 +1,155 @@ +# [Time evolution](@id howto_time_evolution) + +The examples on this page use MPSKit.jl, MPSKitModels.jl, TensorKit.jl, and TensorKitTensors.jl. +See [Installation](@ref tutorial_installation) for how to add these packages to your environment. + +MPSKit solves the (real- or imaginary-time) Schrödinger equation `i ∂ψ/∂t = H ψ` in two ways: by projecting the equation onto the MPS tangent space at every step ([`TDVP`](@ref)/[`TDVP2`](@ref)), or by first building an approximate evolution operator as an MPO ([`make_time_mpo`](@ref)) and repeatedly applying it. +This page gives task recipes for both routes. +All examples share a single namespace: + +```@example time_evo +using MPSKit, MPSKitModels, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ +``` + +--- + +## 1. Evolve a state through one time step + +[`timestep`](@ref) advances a state by a single `dt` under a Hamiltonian, using whichever [`TDVP`](@ref)-family algorithm you pass. +Its argument order is state, Hamiltonian, current time, time step, algorithm: + +```@example time_evo +L = 8 +g₀ = 0.5 +H₀ = transverse_field_ising(FiniteChain(L); g = g₀) + +ψ₀ = FiniteMPS(L, ℂ^2, ℂ^8) +ψ₀, = find_groundstate(ψ₀, H₀, DMRG(; verbosity = 0)) +expectation_value(ψ₀, 4 => σᶻ()) +``` + +Now quench to a different transverse field `g₁` and take a single step: + +```@example time_evo +g₁ = 2.0 +H₁ = transverse_field_ising(FiniteChain(L); g = g₁) + +dt = 0.05 +ψ₁, envs₁ = timestep(ψ₀, H₁, 0.0, dt, TDVP()) +expectation_value(ψ₁, 4 => σᶻ()) +``` + +`timestep` returns the updated state together with an `envs` cache; reuse `envs₁` in the next call to avoid recomputation. +An in-place `timestep!` also exists, but only for finite MPS. + +--- + +## 2. Evolve over a time span + +[`time_evolve`](@ref) steps through an explicit vector of time points instead of a single `dt`, carrying the algorithm and environments through the whole span: + +```@example time_evo +t_span = 0:dt:(4dt) +ψ_span, envs_span = time_evolve(ψ₀, H₁, t_span, TDVP(); verbosity = 0) +expectation_value(ψ_span, 4 => σᶻ()) +``` + +`t_span` need not be uniformly spaced — `time_evolve` steps pairwise between consecutive entries, so any `AbstractVector` of increasing times works. +There is no exported `time_evolve!`; use `time_evolve` and rebind the result. + +--- + +## 3. Grow the bond dimension while evolving + +Single-site `TDVP` cannot change the bond dimension: whatever `ψ₀` starts with is what it keeps. +After a quench, entanglement typically grows and a fixed bond dimension eventually becomes insufficient. +[`TDVP2`](@ref) updates two sites at a time and truncates back down, so it can grow (or shrink) the bond dimension as it evolves. +Unlike `TDVP`, `TDVP2` requires `trscheme` — there is no default: + +```@example time_evo +ψ_tdvp2, envs_tdvp2 = timestep(ψ₀, H₁, 0.0, dt, TDVP2(; trscheme = truncrank(16))) +dim(left_virtualspace(ψ_tdvp2, 4)) +``` + +`TDVP2` only has a finite-MPS method. +For finite systems, an alternative to switching algorithms entirely is single-site `TDVP` with `alg_expand` set to a bond-expansion algorithm such as [`OptimalExpand`](@ref) (Controlled Bond Expansion, "CBE-TDVP"); see [Controlling bond dimension](@ref howto_bond_dimension) for `OptimalExpand` and other `changebonds` recipes. + +--- + +## 4. Evolve an infinite state + +Single-site `TDVP` also works directly on an `InfiniteMPS`: + +```@example time_evo +ψ₀_inf = InfiniteMPS(ℂ^2, ℂ^8) +H₀_inf = transverse_field_ising(; g = g₀) +ψ₀_inf, = find_groundstate(ψ₀_inf, H₀_inf, VUMPS(; verbosity = 0)) + +H₁_inf = transverse_field_ising(; g = g₁) +ψ₁_inf, envs₁_inf = timestep(ψ₀_inf, H₁_inf, 0.0, dt, TDVP()) +expectation_value(ψ₁_inf, 1 => σᶻ()) +``` + +`TDVP2` has no `InfiniteMPS` method, and single-site `TDVP` cannot change the bond dimension on an infinite state either. +Grow the bond dimension beforehand with `changebonds` (e.g. `OptimalExpand` or `VUMPSSvdCut`) — see [Controlling bond dimension](@ref howto_bond_dimension) — then evolve at the fixed, larger bond dimension. + +--- + +## 5. Imaginary-time evolution + +Passing `imaginary_evolution = true` evolves under `exp(-H dt)` instead of `exp(-iH dt)`, using the same real `dt`: + +```@example time_evo +ψ_im, envs_im = timestep(ψ₀, H₁, 0.0, dt, TDVP(); imaginary_evolution = true) +norm(ψ_im) +``` + +Imaginary-time evolution renormalizes the state at every step, so `norm(ψ_im)` stays `1` regardless of how the un-normalized weight would otherwise change. +Repeated imaginary-time steps damp excited-state components faster than the ground state, so this is often used as a (slower) alternative to `find_groundstate` for driving a state towards the ground state of `H₁`. +`time_evolve` accepts the same `imaginary_evolution` keyword for a span of imaginary-time steps. + +--- + +## 6. Build a time-evolution MPO + +When `H` is time-independent and `dt` is fixed, an alternative to repeated `timestep` calls is to build the evolution operator once as an MPO with [`make_time_mpo`](@ref), then apply it repeatedly with [`approximate`](@ref). + +[`WII`](@ref) builds a low-order MPO approximation and works for both finite and infinite Hamiltonians: + +```@example time_evo +O = make_time_mpo(H₁, dt, WII()) +``` + +[`TaylorCluster`](@ref) gives higher-order control via its `N` keyword (and accepts an additional `tol` keyword in `make_time_mpo`): + +```@example time_evo +O_taylor = make_time_mpo(H₁, dt, TaylorCluster(; N = 2); tol = 1.0e-10) +``` + +[`WI`](@ref) is a ready-made first-order `TaylorCluster` constant, so it is used as a value, not called as a constructor: + +```@example time_evo +O_wi = make_time_mpo(H₁, dt, WI) +``` + +Applying the MPO to a finite state uses [`approximate`](@ref) with a finite ground-state-style algorithm such as [`DMRG2`](@ref), which returns a 3-tuple including the final convergence error: + +```@example time_evo +ψ_mpo, envs_mpo, ϵ_mpo = approximate( + ψ₀, (O, ψ₀), DMRG2(; trscheme = truncrank(16), verbosity = 0) +) +expectation_value(ψ_mpo, 4 => σᶻ()) +``` + +Repeat the `approximate` call with the same `O` for successive time steps to build up a longer evolution. +Imaginary-time MPOs are built the same way, by passing `imaginary_evolution = true` to `make_time_mpo`; a real `dt` is promoted internally, so no manual complex conversion is needed. + +--- + +## Where to go next + +For choosing and configuring ground-state algorithms to prepare the pre-quench state, see [Ground-state algorithms](@ref howto_groundstate_algorithms). +For growing or shrinking bond dimension between or during evolution steps, see [Controlling bond dimension](@ref howto_bond_dimension). +For extracting expectation values and correlators from the evolved state, see [Computing observables](@ref howto_observables). +For background on the TDVP and time-evolution-MPO approaches and how they relate, see [Time evolution](@ref lib_time_evolution). From f5fe2b0865ee135fc09ce8eb95704a2027fd73de Mon Sep 17 00:00:00 2001 From: lkdvos Date: Mon, 3 Aug 2026 13:10:10 -0400 Subject: [PATCH 4/8] docs(concepts): add explanation pages and retire man/ The `man/` section mixed explanation, recipes and reference on the same page, which made it hard to know what any given page was for. These nine pages take over its explanatory role and nothing else: what TensorKit's vector spaces mean for MPS, what an MPS is and what the gauge freedom buys, how finite and infinite differ, how operators and Hamiltonians are represented, what symmetries do to the tensors, how to choose among the algorithms, what environments are, how parallelism is structured, and which numerical errors matter. Recipe material from `man/` moved to the how-to pages and reference material to `lib/`, so `man/` is deleted rather than left as a stale duplicate. The two diagrams worth keeping are moved across; the three parallelism benchmark plots are dropped, since they described machine-specific timings with no provenance. Co-Authored-By: Claude Opus 5 (1M context) --- docs/make.jl | 18 +- docs/src/concepts/algorithm_landscape.md | 99 +++++ docs/src/concepts/environments.md | 99 +++++ .../finite_mps_definition.png | Bin docs/src/concepts/finite_vs_infinite.md | 110 +++++ docs/src/concepts/matrix_product_states.md | 130 ++++++ .../{man => concepts}/mps_gauge_freedom.png | Bin docs/src/concepts/numerics.md | 153 +++++++ .../concepts/operators_and_hamiltonians.md | 149 +++++++ docs/src/concepts/parallelism_model.md | 73 ++++ docs/src/concepts/symmetries.md | 151 +++++++ docs/src/concepts/vector_spaces.md | 179 ++++++++ docs/src/man/D_100_strided.png | Bin 25345 -> 0 bytes docs/src/man/D_500_blas.png | Bin 17064 -> 0 bytes docs/src/man/D_500_strided.png | Bin 21638 -> 0 bytes docs/src/man/algorithms.md | 390 ------------------ docs/src/man/environments.md | 66 --- docs/src/man/intro.md | 93 ----- docs/src/man/lattices.md | 4 - docs/src/man/operators.md | 276 ------------- docs/src/man/parallelism.md | 116 ------ docs/src/man/states.md | 174 -------- 22 files changed, 1153 insertions(+), 1127 deletions(-) create mode 100644 docs/src/concepts/algorithm_landscape.md create mode 100644 docs/src/concepts/environments.md rename docs/src/{man => concepts}/finite_mps_definition.png (100%) create mode 100644 docs/src/concepts/finite_vs_infinite.md create mode 100644 docs/src/concepts/matrix_product_states.md rename docs/src/{man => concepts}/mps_gauge_freedom.png (100%) create mode 100644 docs/src/concepts/numerics.md create mode 100644 docs/src/concepts/operators_and_hamiltonians.md create mode 100644 docs/src/concepts/parallelism_model.md create mode 100644 docs/src/concepts/symmetries.md create mode 100644 docs/src/concepts/vector_spaces.md delete mode 100644 docs/src/man/D_100_strided.png delete mode 100644 docs/src/man/D_500_blas.png delete mode 100644 docs/src/man/D_500_strided.png delete mode 100644 docs/src/man/algorithms.md delete mode 100644 docs/src/man/environments.md delete mode 100644 docs/src/man/intro.md delete mode 100644 docs/src/man/lattices.md delete mode 100644 docs/src/man/operators.md delete mode 100644 docs/src/man/parallelism.md delete mode 100644 docs/src/man/states.md diff --git a/docs/make.jl b/docs/make.jl index 0e860d447..79213e777 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -77,14 +77,16 @@ makedocs(; "howto/parallelism_gpu.md", "howto/saving_loading.md", ], - "Manual" => [ - "man/intro.md", - "man/states.md", - "man/operators.md", - "man/algorithms.md", - # "man/environments.md", - "man/parallelism.md", - "man/lattices.md", + "Concepts" => [ + "concepts/vector_spaces.md", + "concepts/matrix_product_states.md", + "concepts/finite_vs_infinite.md", + "concepts/operators_and_hamiltonians.md", + "concepts/symmetries.md", + "concepts/algorithm_landscape.md", + "concepts/environments.md", + "concepts/parallelism_model.md", + "concepts/numerics.md", ], "Examples" => [ "Overview" => "examples/index.md", diff --git a/docs/src/concepts/algorithm_landscape.md b/docs/src/concepts/algorithm_landscape.md new file mode 100644 index 000000000..2827fa5da --- /dev/null +++ b/docs/src/concepts/algorithm_landscape.md @@ -0,0 +1,99 @@ +# [The algorithm landscape](@id concept_algorithm_landscape) + +MPSKit deliberately separates *what* you want to compute from *how* it gets computed. +Entry points such as [`find_groundstate`](@ref), [`timestep`](@ref), [`excitations`](@ref), [`leading_boundary`](@ref), and [`approximate`](@ref) each accept several interchangeable algorithm structs, and the package ships more than a dozen of them. +That flexibility exists because no single algorithm wins everywhere: some only apply to finite or only to infinite systems, some can grow the bond dimension while others cannot, and their relative performance depends on the model at hand. + +This page is the decision guide. +It starts from a table that maps each task onto the algorithm(s) of choice, and then walks through the reasoning behind each row. +It explains *why* you would pick one algorithm over another; for the *how* — the actual calls, keywords, and worked recipes — follow the links into the how-to pages. + +## The decision table + +| Task | Finite system | Infinite system | +|:-----|:--------------|:----------------| +| **Ground state** ([`find_groundstate`](@ref)) | [`DMRG`](@ref) (workhorse, fixed bond dimension); [`DMRG2`](@ref) (grows bond dimension, requires `trscheme`); [`GradientGrassmann`](@ref) (final polish) | [`VUMPS`](@ref) (workhorse, needs a unique ground state); [`IDMRG`](@ref) / [`IDMRG2`](@ref) (two-site requires `trscheme` and a unit cell of at least two sites); [`GradientGrassmann`](@ref) (final polish) | +| **Time evolution** ([`timestep`](@ref) / [`time_evolve`](@ref)) | [`TDVP`](@ref) (fixed bond dimension); [`TDVP2`](@ref) (grows bond dimension, requires `trscheme`); or [`make_time_mpo`](@ref) ([`WI`](@ref) / [`WII`](@ref) / [`TaylorCluster`](@ref)) applied with [`approximate`](@ref) | [`TDVP`](@ref) (no two-site variant exists); or [`make_time_mpo`](@ref) applied with [`approximate`](@ref) | +| **Excitations** ([`excitations`](@ref)) | [`QuasiparticleAnsatz`](@ref) (the only one supporting charged `sector`s); [`FiniteExcited`](@ref) (penalty method); [`ChepigaAnsatz`](@ref) / [`ChepigaAnsatz2`](@ref) (cheap, from ground-state environments) | [`QuasiparticleAnsatz`](@ref) (momentum-resolved, the only choice) | +| **Boundary / statistical mechanics** ([`leading_boundary`](@ref)) | apply the transfer MPO row by row with [`approximate`](@ref) | [`VUMPS`](@ref); [`VOMPS`](@ref) (power method); [`IDMRG`](@ref) / [`IDMRG2`](@ref); [`GradientGrassmann`](@ref) (hermitian, positive transfer matrices) | +| **Compression / approximation** ([`approximate`](@ref), [`changebonds`](@ref)) | [`approximate`](@ref) with [`DMRG`](@ref) / [`DMRG2`](@ref); [`SvdCut`](@ref) via [`changebonds`](@ref) for local truncation | [`approximate`](@ref) with [`IDMRG`](@ref) / [`IDMRG2`](@ref) / [`VOMPS`](@ref); [`SvdCut`](@ref) via [`changebonds`](@ref) for local truncation | + + +A few structural facts hold across the whole table and are worth internalizing early. +Every two-site algorithm (`DMRG2`, `IDMRG2`, `TDVP2`) requires an explicit `trscheme` keyword and can change the bond dimension as it runs; the single-site variants with their default settings cannot. +`IDMRG2` additionally needs a unit cell of at least two sites, and `TDVP2` exists only for finite MPS. +Finally, algorithms compose: the `&` operator chains two algorithms into one, running the first to completion and handing its result to the second, which is how two-site warm-up passes and gradient-descent polishing stages are combined with a workhorse algorithm in a single call. + +## Ground states + +The classic approach is alternating local optimization: [`DMRG`](@ref) sweeps back and forth through a finite chain, optimizing one site while all others are held fixed, which in practice converges to the ground state. +The catch is the fixed bond dimension: a single-site update can never enlarge the virtual spaces, so the precision of the calculation is locked in by the initial state. +This bites hardest when symmetries are involved, because then not just the total bond dimension but its distribution over charge sectors is frozen, and a poor initial distribution cannot be repaired. +[`DMRG2`](@ref) fixes this by optimizing two neighbouring sites jointly and truncating back down, which lets the bond dimension (and its sector distribution) adapt, at a higher cost per sweep. + +For infinite systems, two philosophies compete. +[`IDMRG`](@ref) grows the system from the middle outwards, repeatedly inserting and optimizing new sites until the boundary is no longer felt; [`IDMRG2`](@ref) is its two-site, bond-growing variant. +Because convergence requires the effective system to outgrow the correlation length, IDMRG can be slow to converge for critical systems, where that length diverges. +[`VUMPS`](@ref) instead works with a genuinely uniform state: each local update is followed by a re-gauging step that replaces *every* tensor in the infinite chain with the updated one, so the effect of an update is felt throughout the system immediately. +This often gives VUMPS a higher convergence rate than IDMRG, which is why it is the default infinite-system workhorse. +The price is an injectivity requirement: VUMPS assumes a unique ground state, and it is not the right tool when the state it should converge to is non-injective. +Like DMRG, VUMPS is single-site and cannot alter the bond dimension. + +[`GradientGrassmann`](@ref) approaches the problem from a third direction: the MPS tensors form a Riemannian manifold (a Grassmann manifold), and one can run gradient descent directly on it, for finite and infinite states alike. +Its niche is the tail of the optimization: close to convergence its rate is often the best of the lot, while far from convergence the sweeping algorithms tend to make faster progress. +The practical consequence is the chaining pattern: run a cheap workhorse first, then hand over to gradient descent, e.g. `VUMPS(...) & GradientGrassmann(...)`. +This pattern is baked into `find_groundstate` itself: called with only keywords, it picks `DMRG` for a finite state and `VUMPS` for an infinite one, appends a `GradientGrassmann` stage on infinite states when the requested tolerance is tighter than `1e-4`, and prepends a two-site pass (`DMRG2` or `IDMRG2`) whenever you supply a `trscheme`. +Since gradient descent is also a single-site method, growing the bond dimension remains the job of that two-site pre-pass or of [`changebonds`](@ref). + +For call syntax, keyword tables, and worked chaining examples, see [Ground-state algorithms](@ref howto_groundstate_algorithms). + +## Time evolution + +MPSKit solves the time-dependent Schrödinger equation along two distinct routes, and the choice between them is a genuine trade-off rather than a finite/infinite split. + +The first route, [`TDVP`](@ref), never builds the evolution operator at all. +It projects the Schrödinger equation onto the tangent space of the current MPS, solves the projected equation for a small time step, and repeats. +Its two-site variant [`TDVP2`](@ref) plays the same role as `DMRG2` does for `DMRG`: it lets the bond dimension grow to absorb the entanglement generated by the evolution, at extra cost, and it exists only for finite systems. + +The second route splits the problem in two: first approximate the evolution operator ``\exp(-iH\,dt)`` itself as an MPO using [`make_time_mpo`](@ref) — with [`WI`](@ref), [`WII`](@ref), or [`TaylorCluster`](@ref) as the approximation scheme — and then apply that MPO to the state with [`approximate`](@ref). +The appeal is amortization: for a time-independent Hamiltonian and a fixed step size the MPO is built once and reused for every step, and the accuracy of the operator approximation is controlled independently of the accuracy of its application. + +Both routes accept an `imaginary_evolution` keyword for evolution in imaginary time. +For step-by-step recipes along either route, see [Time evolution](@ref howto_time_evolution). + +## Excitations + +Resolving states deep in the spectrum is generally out of reach, but three families of algorithms target the low-lying part, each with a distinct character. + +The [`QuasiparticleAnsatz`](@ref) is the most broadly applicable: it works for finite and infinite systems, and it is the only algorithm that can target excitations carrying a nontrivial symmetry charge, via the `sector` keyword. +It builds an excited state by replacing a single tensor of the ground-state MPS — summed over all positions on a finite chain, or in a momentum-carrying plane-wave superposition on an infinite one — and solves the resulting eigenvalue problem. +Because the variational class consists of local perturbations on top of the ground state, it is the natural choice for quasiparticle-like excitations, and on infinite systems it is the only option, giving direct access to dispersion relations. + +[`FiniteExcited`](@ref) takes a brute-force approach available only on finite chains: it reruns a full ground-state optimization on a modified Hamiltonian that carries an energy penalty for overlapping with all previously found states. +Each new excited state therefore costs another complete ground-state search, and the orthogonality to earlier states is only approximate (enforced by the penalty `weight`, not exactly). +Its advantage is that it makes no assumption about the *form* of the excited state: since each state is a fully variational `FiniteMPS`, it can in principle capture excitations that a local perturbation of the ground state would describe poorly. + +The [`ChepigaAnsatz`](@ref) (and its two-site refinement [`ChepigaAnsatz2`](@ref)) is the cheapest of the three, also finite-only. +It observes that the gauged ground-state MPS tensors act as isometries projecting the Hamiltonian into a low-energy subspace, so the low-lying spectrum can be read off by diagonalizing the effective Hamiltonian already available from the ground-state environments, with no additional sweeping. +This works best precisely where excitations are hard for the other methods: in critical systems with long-range correlations, where the excitation weight is spread across the whole chain. + +For the call signatures, momentum scans, and sector-targeting recipes, see [Excited states](@ref howto_excitations). + +## Boundaries and statistical mechanics + +MPS algorithms are not limited to Hamiltonian problems. +A two-dimensional classical partition function can be written as an infinite power of a row-to-row transfer MPO, and contracting the network amounts to finding that operator's dominant eigenvector — a boundary MPS. +This is the job of [`leading_boundary`](@ref), which accepts a familiar cast: [`VUMPS`](@ref) and [`IDMRG`](@ref)/[`IDMRG2`](@ref) carry over directly from the ground-state problem, [`GradientGrassmann`](@ref) applies when the transfer MPO is hermitian and positive, and [`VOMPS`](@ref) is a power method specific to this setting, which iteratively approximates the operator-times-state product by a new state of the same bond dimension. + +## Compression and changing bond dimension + +Two mechanisms round out the landscape by manipulating states rather than solving for new ones. +[`approximate`](@ref) variationally fits a new MPS, typically of different bond dimension, to the result of applying an MPO to a state; the sweeping ground-state algorithms (`DMRG`/`DMRG2` for finite, `IDMRG`/`IDMRG2`/`VOMPS` for infinite) double as its optimization engines. +This is the same machinery that applies time-evolution MPOs, and combined with [`SvdCut`](@ref) it yields a globally optimal truncation of a state. +[`changebonds`](@ref), by contrast, performs direct local surgery on a state: truncating with [`SvdCut`](@ref), or expanding with [`OptimalExpand`](@ref), [`RandExpand`](@ref), or [`VUMPSSvdCut`](@ref) so that the single-site algorithms above have room to work with. +The trade-offs between those expansion schemes, and recipes for when to grow, are covered in [Controlling bond dimension](@ref howto_bond_dimension). + +## Where to go next + +The how-to pages turn each row of the table into runnable recipes: [Ground-state algorithms](@ref howto_groundstate_algorithms), [Time evolution](@ref howto_time_evolution), and [Excited states](@ref howto_excitations), with [Controlling bond dimension](@ref howto_bond_dimension) supporting all three. +For the complete signatures, keyword lists, and docstrings of every algorithm named here, see the library reference: [Ground-state algorithms](@ref lib_groundstate), [Time evolution](@ref lib_time_evolution), and [Excitations](@ref lib_excitations). diff --git a/docs/src/concepts/environments.md b/docs/src/concepts/environments.md new file mode 100644 index 000000000..6f4ea355c --- /dev/null +++ b/docs/src/concepts/environments.md @@ -0,0 +1,99 @@ +# [Environments](@id concept_environments) + +Almost every MPS algorithm spends most of its time contracting the same tensor network over and over. +In DMRG, optimizing the tensor on one site requires the sum of all Hamiltonian contributions sitting to its left and to its right; in time evolution the same partial contractions reappear at every step. +Recomputing them from scratch each time would be wasteful, because moving attention from one site to a neighbour changes only a little of the network. +The *environment* objects are what let MPSKit avoid that waste. + +This page explains what environments are and why they exist, so that the optional `environments` argument that appears throughout the API stops looking like a mystery. +It is about understanding, not tuning: for the mechanics of a particular algorithm follow the links into the how-to pages. + +## What an environment is + +An environment is a partially contracted piece of a tensor network — the part that does not change when you shift your focus by one site. +Consider the network whose value an algorithm ultimately wants: a state `below` (the bra), an operator, and a state `above` (the ket), all contracted together. +Fixing attention on a single site splits that network into three parts: the tensor at the site itself, everything to its left, and everything to its right. +The left and right parts are exactly the *left environment* and *right environment* of that site. + +The key observation is that these two blocks are shared between neighbouring sites. +The left environment at site `i+1` is the left environment at site `i` with a single extra column contracted onto it. +So once you have paid to build the environment at one site, advancing to the next is cheap: you add one new contribution instead of recontracting the whole chain. +Caching the environments and reusing them across a sweep is what turns an algorithm that would be quadratic in the system size into a linear one. + +In MPSKit these cached blocks live in an environment object, constructed with the exported [`environments`](@ref) function. +The canonical form sandwiches an operator between two states, + +```julia +using MPSKit, MPSKitModels, TensorKit + +state = FiniteMPS(20, ℂ^2, ℂ^10) +H = transverse_field_ising(FiniteChain(20); g = 0.5) +envs = environments(state, H, state) +``` + +while the two-argument form `environments(below, above)` builds the operator-free *overlap* environments between two states. +The individual blocks are then queried with the exported [`leftenv`](@ref) and [`rightenv`](@ref) functions, + +```julia +GL = leftenv(envs, 10, state) # everything to the left of site 10 +GR = rightenv(envs, 10, state) # everything to the right of site 10 +``` + +each of which returns a tensor gauge-compatible with the state tensor at that site, ready to be contracted onto it. + +## Why you rarely build them yourself + +Most of the time you never touch an environment object at all. +The high-level entry points — [`find_groundstate`](@ref), [`timestep`](@ref), [`excitations`](@ref), and the rest — build whatever environments they need internally. +What they also do, uniformly, is accept an *optional* environments argument and return an updated environment object alongside their main result. + +That return value is the reason to care about environments even when you never construct one. +Handing the environments from one call into the next lets the algorithm reuse the cached blocks instead of rebuilding them from nothing. +For iterated procedures such as time evolution — where each step starts from a state only slightly different from the last — feeding the updated environments back in every step avoids repeating work that the previous step already did. +The [Time evolution](@ref howto_time_evolution) how-to shows this threading pattern in a concrete recipe. + +## Finite environments and the `===` cache + +For a finite state the environment object manages its own validity automatically, and understanding how is worthwhile because it comes with one sharp edge. + +When it computes a left environment, the cache records *which* state tensors it contracted to get there — the gauged tensors of `state` up to that site. +On a later query it compares the tensors it would need now against the ones it used before, testing them with Julia's identity operator `===`. +If they are the same objects, the cached block is still valid and is returned immediately. +If some differ, the cache recomputes only the affected part of the network and updates its record. +This is what makes repeated queries during a sweep cheap: the first `leftenv` at a far site pays for the full contraction, and neighbouring queries reuse almost all of it. + +The sharp edge is that `===` tests object identity, not numerical equality. +If you mutate a state tensor *in place* — changing its data while keeping the same object — the cache still sees the same object under `===` and concludes, wrongly, that its stored environment is still valid. +It will then hand back a block computed from the old data. +Building a *new* tensor and assigning it into the state is fine, because that is a different object and the `===` check catches it; only in-place mutation defeats the mechanism. +Because algorithms that use the public API replace tensors rather than mutating them, this is rarely a problem in normal use, but it is the thing to suspect if a hand-written routine that mutates tensors starts returning stale results. + +!!! warning "In-place mutation is invisible to the cache" + The finite-environment cache detects changes by object identity (`===`), so mutating a + state tensor in place leaves the cache convinced its stored environment is still current. + The internal, non-exported helper `MPSKit.poison!(envs, i)` marks the dependencies at + site `i` as stale so the next query recomputes them; needing it is a sign that a tensor + was mutated in place rather than replaced. + +## Infinite environments + +Infinite environments serve the same role but are computed differently, and the difference matters for how you use them. + +A finite chain has genuine boundaries, so its environments can be built by contracting inward from the ends in a finite number of steps. +An infinite chain has no ends. +Its environments are instead the fixed points of the transfer operator — the object you get by contracting one repeating unit cell — and finding a fixed point means solving a linear or eigenvalue problem. +Those problems are solved *iteratively*, to a finite tolerance, rather than by an exact finite contraction. +Building an infinite environment is therefore a small numerical solve, and its result is only as accurate as the tolerance of that solve. + +The precision of that solve is controlled by the `tol`, `maxiter`, and `krylovdim` keyword arguments to [`environments`](@ref), which configure the underlying iterative solver — an Arnoldi eigensolver for a transfer-matrix fixed point, or GMRES for the linear problem that arises with an `InfiniteMPOHamiltonian`. +It is fixed when the environments are built, rather than read from or written to the environment object afterwards. + +The second difference is that infinite environments are **not** recomputed automatically. +The finite cache re-validates itself against the current state on every query; the infinite one does not. +If the state changes, the stored fixed points no longer correspond to it, and there is no automatic re-solve. +Bringing an infinite environment up to date for a changed state is an explicit step, handled internally by the non-exported `MPSKit.recalculate!`.In practice the high-level algorithms perform this recomputation for you as part of their own iteration, which is again why threading the returned environments through successive calls is the efficient pattern. + +## Where to go next + +For the full signatures and docstrings of the environment functions, see [`environments`](@ref), [`leftenv`](@ref), and [`rightenv`](@ref) in the library reference. +For the algorithm-facing side — how ground-state and time-evolution routines consume and return environments — see [Ground-state algorithms](@ref howto_groundstate_algorithms) and [Time evolution](@ref howto_time_evolution). diff --git a/docs/src/man/finite_mps_definition.png b/docs/src/concepts/finite_mps_definition.png similarity index 100% rename from docs/src/man/finite_mps_definition.png rename to docs/src/concepts/finite_mps_definition.png diff --git a/docs/src/concepts/finite_vs_infinite.md b/docs/src/concepts/finite_vs_infinite.md new file mode 100644 index 000000000..99de33e2e --- /dev/null +++ b/docs/src/concepts/finite_vs_infinite.md @@ -0,0 +1,110 @@ +```@meta +DocTestSetup = quote + using MPSKit, TensorKit +end +``` + +# [Finite versus infinite MPS](@id concept_finite_vs_infinite) + +The [matrix product state](@ref concept_matrix_product_states) machinery — the site tensors, the virtual bonds, the canonical gauge — is shared by two rather different physical objects, and MPSKit gives each its own type. +A [`FiniteMPS`](@ref) is the wavefunction of a chain with a definite number of sites and two open ends: a genuine vector in a finite-dimensional Hilbert space. +An [`InfiniteMPS`](@ref) instead stores a small, repeating *unit cell* of tensors and imagines it tiled forever along the chain, so that it represents a translation-invariant state directly in the thermodynamic limit `L = ∞`. +This page explains what that difference *means* — why the two share almost all of their code yet answer subtly different questions, and in particular why an infinite state is always normalized to one while a finite state is not. +It is about understanding rather than construction: to *build* either kind of state see [Constructing states](@ref howto_states), and for the type signatures see the [States](@ref lib_states) reference. + +## Two different objects + +A [`FiniteMPS`](@ref) is what you reach for whenever the system genuinely has a fixed size and boundaries: a chain of `N` sites, each a separate mutable tensor, with trivial (dimension-one) bonds capping the two ends. +It is a literal, if compressed, representation of a state vector `|ψ⟩` living in the tensor-product Hilbert space of those `N` sites, and every question you could ask of an ordinary state vector — its norm, its overlap with another state, an expectation value at a particular site — has a finite, exactly computable answer. +The open ends are part of the physics: sites near a boundary are in a different environment from sites in the bulk, and any measured quantity still carries a dependence on the length `N`. + +An [`InfiniteMPS`](@ref) throws both of those features away on purpose. +It represents a state that is exactly invariant under translation by one unit cell, so there is no boundary anywhere and no length `N` left to depend on. +What is actually stored is a finite list of tensors — the unit cell — together with the gauge data needed to treat the infinite periodic contraction; indexing the state is periodic, so `ψ.AL[i]` and `ψ.AL[i + length(ψ)]` return the same tensor. +This is the representation used throughout [The thermodynamic limit](@ref tutorial_thermodynamic_limit), where the payoff — no boundary effects, no finite-size extrapolation — is put to work on the transverse-field Ising model. + +## The unit cell + +The single number that characterizes the periodicity of an [`InfiniteMPS`](@ref) is its unit-cell length, returned by `length`. +The most common choice is a one-site unit cell, in which a single tensor is repeated across the whole chain: + +```@example finite-infinite +using MPSKit, TensorKit # hide +ψ_infinite = InfiniteMPS(ℂ^2, ℂ^8) +length(ψ_infinite) +``` + +A larger unit cell is specified by passing a vector of physical and virtual spaces, one entry per site of the cell: + +```@example finite-infinite +ψ_cell = InfiniteMPS([ℂ^2, ℂ^2], [ℂ^8, ℂ^8]) +length(ψ_cell) +``` + +The unit-cell length is not a free accuracy knob like the bond dimension; it is a physical statement about the *period* of the state you intend to represent. +A translation-invariant ansatz of period `L` can only capture states whose own spatial period divides `L`. +Choosing a cell that is commensurate with the physical period of the model — the magnetic period of an ordered phase, or a period imposed by the Hamiltonian's own unit cell — is therefore a modelling decision, not a numerical one, and picking too small a cell forces the algorithm to approximate a state it structurally cannot represent. +A [`FiniteMPS`](@ref), by contrast, has no notion of a unit cell at all: its `length` is simply the number of physical sites, and each of those sites carries its own independent tensor. + +## Why an infinite MPS is normalized to one + +The sharpest practical consequence of the finite/infinite distinction shows up in the norm, and it is worth understanding rather than memorizing. + +For a [`FiniteMPS`](@ref) the norm is exactly the Euclidean norm `√⟨ψ|ψ⟩` of the state vector it represents — a genuine, finite number. +The space-based constructors normalize by default, so a freshly built state has norm one, but nothing forces that: the norm is a real degree of freedom you can set at will, and rescaling the state rescales it in the obvious way. + +```@example finite-infinite +ψ_finite = FiniteMPS(rand, ComplexF64, 16, ℂ^2, ℂ^8) +norm(ψ_finite) +``` + +```@example finite-infinite +norm(3 * ψ_finite) +``` + +For an [`InfiniteMPS`](@ref) that same quantity does not exist. +The overlap `⟨ψ|ψ⟩` of an infinite state is, formally, a product of one transfer-matrix factor per unit cell, so for a chain of `n` cells it grows (or decays) like `λⁿ`, where `λ` is the leading eigenvalue of the transfer matrix. +As `n → ∞` this is `0` if `λ < 1` and `∞` if `λ > 1`, and the *only* value that yields a finite, well-defined state is `λ = 1`. +MPSKit therefore fixes the gauge so that the transfer matrix has leading eigenvalue exactly one, which we can read straight off its spectrum: + +```@example finite-infinite +first(transfer_spectrum(ψ_infinite)) ≈ 1 +``` + +With that fixed, `norm` of an [`InfiniteMPS`](@ref) is defined *per site* rather than globally: it is the norm of a single center-gauged unit-cell tensor, and it is always one. + +```@example finite-infinite +norm(ψ_infinite) ≈ 1 +``` + +```@example finite-infinite +norm(ψ_infinite) ≈ norm(ψ_infinite.AC[1]) +``` + +Because the normalization is intensive, it does not grow with the unit cell: a two-site cell is normalized to one just as a one-site cell is. + +```@example finite-infinite +norm(ψ_cell) ≈ 1 +``` + +This is why scalar multiplication of an [`InfiniteMPS`](@ref) is simply not defined — there is no overall amplitude to rescale — and why every physically meaningful quantity in the infinite setting is a *density*. +The energy returned for the state is an energy per site, an order parameter is measured at one representative site of the cell, and quantities with no finite-chain analogue, such as the [`correlation_length`](@ref), are extracted from the transfer-matrix spectrum of the uniform state rather than from any global overlap. + +## The same algorithms, two settings + +Because the two types share the canonical-form vocabulary, most of MPSKit's high-level entry points accept either one, and it is the *algorithm* passed to them that is specialized to the finite or the infinite case. +Ground-state search is the clearest example: [`find_groundstate`](@ref) dispatches on the state it is handed, running [`DMRG`](@ref) — which sweeps back and forth across a chain with two ends — for a [`FiniteMPS`](@ref), and [`VUMPS`](@ref) or [`IDMRG`](@ref)/[`IDMRG2`](@ref) — which converge a single uniform unit cell — for an [`InfiniteMPS`](@ref). +The distinction is not incidental: a boundary-sweeping method like DMRG has no meaning without ends to sweep between, while VUMPS' re-gauging step, which replaces every tensor in the chain at once, only makes sense for a genuinely translation-invariant state. +Some routines instead span both worlds: [`TDVP`](@ref) time-evolves finite and infinite states alike, its two-site bond-growing variant existing only for the finite case. +For which algorithm fits which task — and why one is preferred over another within each column — see [The algorithm landscape](@ref concept_algorithm_landscape). + +Two further state types sit between the finite and infinite poles rather than at them, reusing the same machinery: a [`WindowMPS`](@ref) embeds a finite, mutable window inside two infinite environments, and a [`MultilineMPS`](@ref) stacks several infinite states to represent two-dimensional networks. +Both are introduced in [Constructing states](@ref howto_states). + +## Where to go next + +- For the flagship finite-then-infinite walkthrough of the same model, see [The thermodynamic limit](@ref tutorial_thermodynamic_limit). +- For the gauge and canonical-form machinery both types share, see [Matrix product states](@ref concept_matrix_product_states). +- For choosing the right algorithm in each setting, see [The algorithm landscape](@ref concept_algorithm_landscape). +- For how to construct each state type, see [Constructing states](@ref howto_states); for type signatures, the [States](@ref lib_states) reference. +``` diff --git a/docs/src/concepts/matrix_product_states.md b/docs/src/concepts/matrix_product_states.md new file mode 100644 index 000000000..89eabfa25 --- /dev/null +++ b/docs/src/concepts/matrix_product_states.md @@ -0,0 +1,130 @@ +```@meta +DocTestSetup = quote + using MPSKit, TensorKit +end +``` + +# [Matrix product states](@id concept_matrix_product_states) + +A matrix product state (MPS) represents the wavefunction of a one-dimensional quantum system as a chain of tensors, one per site, contracted along shared *virtual* bonds. +The physical indices carry the local degrees of freedom, while the virtual bonds carry the entanglement between the two halves of the system that meet at that bond. + +```@raw html +A finite MPS drawn as a chain of tensors, each with one physical leg pointing out and virtual legs joining it to its neighbours. +``` + +*The diagram shows a finite MPS as a row of site tensors, each carrying a physical index and linked to its neighbours through virtual bonds; the two ends carry trivial (dimension-one) boundary bonds.* + +This page explains the *gauge freedom* inherent in that representation and the *canonical forms* MPSKit uses to fix it, so that the `AL`, `AR`, `C`, and `AC` you see throughout the API stop looking like arbitrary labels. +It is about understanding rather than construction: for how to *build* a state see [Constructing states](@ref howto_states), and for the full type signatures see the [States](@ref lib_states) reference. + +## Gauge freedom + +The tensors that make up an MPS are not uniquely determined by the physical state they encode. +On any virtual bond you can insert an invertible matrix `C` together with its inverse `C⁻¹`, since their product is the identity and leaves the contracted network unchanged. +Absorbing `C` into the tensor on one side of the bond and `C⁻¹` into the tensor on the other redefines both local tensors while representing exactly the same physical state. + +```@raw html +Inserting C times its inverse on a virtual bond and reabsorbing each factor into the neighbouring tensor, leaving the physical state unchanged. +``` + +*The diagram shows an identity `C · C⁻¹` inserted on a virtual bond, with each factor then absorbed into the tensor on its side of the bond — a change of representation that leaves the physical state untouched.* + +This freedom is not a nuisance to be tolerated; it is a resource. +Because the local tensors can be reshaped at will, we can choose the gauge on every bond to give the tensors especially convenient properties, without ever changing the state they describe. +The two choices below are the ones that matter in practice. + +## Canonical forms + +At each site there are two particularly convenient gauges, the *left*- and *right-canonical* forms. + +In the left-canonical form a site tensor is a **left isometry**: contracting it with its own conjugate over the left virtual and physical indices yields the identity on the right virtual space. +By convention these tensors are called `AL`. + +```jldoctest mps_states +julia> state = FiniteMPS(rand, ComplexF64, 10, ℂ^2, ℂ^4); + +julia> al = state.AL[3]; + +julia> al' * al ≈ id(right_virtualspace(al)) +true +``` + +In the right-canonical form a site tensor is instead a **right isometry**, an identity when contracted over its right virtual and physical indices; these are called `AR`. +The check uses TensorKit's `repartition` to regroup the tensor's indices so that the isometry contraction can be written directly. + +```jldoctest mps_states +julia> ar = state.AR[3]; + +julia> repartition(ar, 1, 2) * repartition(ar, 1, 2)' ≈ id(left_virtualspace(ar)) +true +``` + +The two forms can be mixed: every tensor to the left of a chosen bond is put in the left gauge and every tensor to its right in the right gauge. +The gauge transformation sitting on that one bond can no longer be absorbed without spoiling the isometry property on one side, so it remains as an explicit **center bond tensor** `C`. +`C` is exactly the transformation that relates the left- and right-gauged tensors across its bond. +For convenience a single site tensor can also be left in the *center-site* form `AC`, which is the center tensor absorbed into the neighbouring isometry from either side: + +```jldoctest mps_states +julia> al * state.C[3] ≈ state.AC[3] +true +``` + +Equivalently, absorbing the center tensor on bond `2` into the right isometry at site `3` reproduces the same center-site tensor: + +```jldoctest mps_states +julia> repartition(state.C[2] * repartition(ar, 1, 2), 2, 1) ≈ state.AC[3] +true +``` + +These relations — `AL' * AL = 1`, `AR * AR' = 1`, and `AC = AL · C = C · AR` — hold for any validly gauged MPS, which is why the checks above return `true` even for a random state. + +## Automatic gauge management + +MPS algorithms move through these forms constantly: a DMRG sweep, for instance, carries the center site across the chain, gauging each tensor as it goes. +Doing that bookkeeping by hand would be tedious and error-prone, so the state objects do it for you. +A [`FiniteMPS`](@ref) (and likewise an [`InfiniteMPS`](@ref)) behaves as an automatic gauge manager: querying `state.AL`, `state.AR`, `state.C`, or `state.AC` returns the requested form, computing and caching it on demand and recomputing it when the underlying tensors have changed. +The intended experience is that you never think about how the state is gauged — it is handled automagically. + +!!! warning "In-place mutation defeats the cache" + A `FiniteMPS` detects that a form needs recomputing only when a tensor is *replaced* through an indexing assignment. + Changing a tensor's data in place keeps the same object, so the automatic recomputation is not triggered and stale gauged tensors may be returned. + Assign a new tensor rather than mutating an existing one. + +### The center-gauge overlap insight + +The payoff of the mixed gauge is visible in a computation as basic as the norm. +To compute the overlap of a state with itself, bring any bond into the center gauge. +Everything to the left of that bond is built from left isometries and contracts to the identity, everything to the right is built from right isometries and does the same, and the entire network collapses to the overlap of the center bond tensor `C` with itself. +The overlap is therefore the same whichever bond you pick: + +```jldoctest mps_states +julia> using LinearAlgebra + +julia> d = dot(state, state); + +julia> all(c -> dot(c, c) ≈ d, state.C) +true +``` + +This is not a special trick for the norm; the same collapse-to-the-center reasoning is what makes environments (see [Environments](@ref concept_environments)) and local expectation values cheap to evaluate in the canonical gauge. + +## Finite versus infinite gauging + +The gauge machinery is shared between finite and infinite states, but the way the forms are kept current differs, because the two have very different structure. + +A [`FiniteMPS`](@ref) has genuine boundaries and mutable per-site tensors, so it gauges *lazily*: each form is recomputed only for the tensors it actually depends on, and invalidation is decided by object identity (`===`) — replacing a tensor marks the left-gauged tensors to its right and the right-gauged tensors to its left as stale, leaving the rest cached. +An [`InfiniteMPS`](@ref) instead repeats a finite unit cell periodically, so there is no left or right end to anchor a partial recompute: every tensor lies both to the right and to the left of any change, and all forms are recomputed together whenever a tensor changes. + +## Variants + +Two further state types reuse the same canonical-form vocabulary for more specialized settings: + +- A [`WindowMPS`](@ref) represents a finite window of mutable tensors embedded in an infinite environment on both sides — a finite region living inside two [`InfiniteMPS`](@ref) tails. +- A [`MultilineMPS`](@ref) is a stack of [`InfiniteMPS`](@ref) objects used to represent the two-dimensional networks that arise in boundary-MPS methods. + +## Where to go next + +- To build states from tensors, from spaces, or as product states, see [Constructing states](@ref howto_states). +- For the full type signatures and docstrings, see the [States](@ref lib_states) reference. +- For how the canonical gauge makes contractions cheap, see [Environments](@ref concept_environments). diff --git a/docs/src/man/mps_gauge_freedom.png b/docs/src/concepts/mps_gauge_freedom.png similarity index 100% rename from docs/src/man/mps_gauge_freedom.png rename to docs/src/concepts/mps_gauge_freedom.png diff --git a/docs/src/concepts/numerics.md b/docs/src/concepts/numerics.md new file mode 100644 index 000000000..dac47e3d9 --- /dev/null +++ b/docs/src/concepts/numerics.md @@ -0,0 +1,153 @@ +```@meta +DocTestSetup = quote + using MPSKit, TensorKit +end +``` + +# [Numerical considerations](@id concept_numerics) + +Every MPSKit calculation is an approximation controlled by a handful of numerical knobs, and understanding what those knobs actually measure is what separates a trustworthy result from a plausible-looking one. +A ground state is only approached to a finite tolerance; a bond dimension only captures so much entanglement; a floating-point number only stores so many digits. +This page explains the three quantities that govern accuracy — the *truncation error* that bounds how well the ansatz can represent a state, the *convergence criterion* that tells an iterative algorithm when to stop, and the *precision* of the underlying element type — and then surveys the failure modes that these considerations give rise to. +It is about understanding *why* a calculation is or is not accurate; for the diagnostic recipe when one goes wrong, follow the links into [Convergence troubleshooting](@ref howto_convergence_troubleshooting). + +## Truncation and the bond dimension + +The single most important approximation in the whole framework is truncation. +An MPS represents the wavefunction as a chain of tensors joined along virtual bonds, and the dimension of those bonds — the *bond dimension* — is the ansatz's capacity: it is the number of Schmidt coefficients kept when the state is split into two halves at that bond. +Cutting the chain at one bond and performing a singular value decomposition of the resulting bipartition yields exactly the Schmidt decomposition, whose singular values are the Schmidt coefficients. +Keeping only the largest of them is the truncation, and the bond dimension is the number kept. + +The quality of that truncation is measured by the *discarded weight*: the sum of the squares of the Schmidt coefficients that were thrown away. +Because the Schmidt coefficients of a normalized state satisfy ``\sum_i \lambda_i^2 = 1``, the discarded weight is the fraction of the state's norm that the truncation sacrifices, and it is the natural error measure of the approximation. +A small discarded weight means the kept bond dimension already captures almost all of the state's entanglement across that cut, so enlarging it further buys little. + +We can watch this directly. +After optimizing a ground state we read off its Schmidt spectrum at the central bond with [`entanglement_spectrum`](@ref), and see how quickly the coefficients decay: + +```@example numerics +using MPSKit, MPSKitModels, TensorKit +ψ = FiniteMPS(16, ℂ^2, ℂ^24) +H = transverse_field_ising(FiniteChain(16); g = 1.0) +ψ, envs, ϵ = find_groundstate(ψ, H, DMRG(; tol = 1e-10, verbosity = 0)) +schmidt = sort(collect(entanglement_spectrum(ψ, 8)); rev = true) +round.(schmidt[1:6]; digits = 4) +``` + +The tail beyond the first few coefficients is tiny, so truncating the bond back down to keep only the six largest discards only a small weight: + +```@example numerics +discarded = sum(abs2, schmidt[7:end]) +``` + +Performing that truncation with [`SvdCut`](@ref) through [`changebonds`](@ref) and comparing the energy before and after shows the corresponding cost in the observable of interest: + +```@example numerics +ψcut = changebonds(ψ, SvdCut(; trscheme = truncrank(6))) +ΔE = real(expectation_value(ψcut, H) - expectation_value(ψ, H, envs)) +``` + +The bond dimension is thus a genuine accuracy/cost dial: a larger bond dimension lowers the discarded weight and the truncation error, at the price of more expensive tensor contractions. + +How much bond dimension a state actually *needs* is set by its entanglement. +Ground states of gapped, local one-dimensional Hamiltonians obey an entanglement *area law* — their bipartite entanglement entropy saturates to a constant as the system grows — which is precisely why a finite bond dimension can represent them efficiently; at a critical point the entropy instead grows without bound and no fixed bond dimension suffices. + +### Choosing what to truncate + +The rule for *which* coefficients to discard is a truncation scheme. +MPSKit itself does not define these; they come from the tensor backend, so the schemes below require `using TensorKit` (which re-exports them from `MatrixAlgebraKit`) rather than `using MPSKit` alone. +The ones you will meet most often are: + +- `truncrank(n)` — keep a fixed number of coefficients (a hard bond-dimension cap). +- `trunctol(; atol)` — discard every coefficient below a threshold. +- `truncerror(; atol)` — keep as many coefficients as needed to hold the discarded weight below a target. +- `truncspace(V)` — truncate to a prescribed vector space, used mostly internally to match bond spaces. +- `notrunc()` — keep everything; this is the default `trscheme` of the bond-preserving single-site algorithms. + +These schemes compose with `&`, so `trunctol(; atol = 1e-8) & truncrank(16)` applies both bounds at once. + +Every bond-growing algorithm — [`DMRG2`](@ref), [`IDMRG2`](@ref), [`TDVP2`](@ref) — and every explicit bond-surgery tool — [`SvdCut`](@ref), [`OptimalExpand`](@ref) — requires a `trscheme` keyword, because their whole job is to decide a new bond dimension. +The single-site workhorses ([`DMRG`](@ref), [`VUMPS`](@ref), [`TDVP`](@ref)) default to `notrunc()` and keep the bond dimension fixed. +The recipes for growing and shrinking bonds live in [Controlling bond dimension](@ref howto_bond_dimension). + +## Convergence criteria + +Every iterative algorithm needs a rule for when it has done enough, and "converged" means something specific and measurable rather than "looks stable." +For the single-site variational algorithms the measure is the **Galerkin error**: the norm of the component of the local energy gradient that points out of the current tangent space of the MPS. +Intuitively, it is how far the exact update at a site wants to push the state in a direction the fixed-bond-dimension ansatz cannot follow; when it is small everywhere, the state is a fixed point of the update to within the ansatz's reach. +This is the quantity [`DMRG`](@ref), [`VUMPS`](@ref), and [`VOMPS`](@ref) drive to zero, and it is returned to you as the third output of the entry point: + +```@example numerics +ϵ +``` + +That returned `ϵ` is the final Galerkin error, and convergence is declared when it drops below the algorithm's `tol`. +The default tolerance is `1e-10`, defined together with the other numerical defaults in the (public but unexported) `MPSKit.Defaults` module, alongside a default `maxiter` of `200` and a default Krylov dimension of `30`: + +```@example numerics +MPSKit.Defaults.tol +``` + +Not every algorithm reports the same measure, and the differences matter when comparing runs: + +- The two-site [`DMRG2`](@ref) does not use the Galerkin error during its sweep; it monitors instead the local infidelity between each two-site tensor before and after truncation, which is a different — and generally less directly interpretable — proxy for convergence. +- [`IDMRG`](@ref) and [`IDMRG2`](@ref) judge convergence by the change in the bond matrix between successive iterations, ``\lVert C - C_\text{old}\rVert``, rather than by a gradient norm. +- [`GradientGrassmann`](@ref) converges on the Riemannian gradient norm reported by its underlying optimizer, with `tol` passed through as the gradient tolerance. + +A subtlety worth knowing is that these tolerances are, by default, *dynamic*: MPSKit tightens the tolerances of the inner linear and eigenvalue solvers as the outer iteration converges, so that early iterations are not over-solved and late ones are not under-solved. +This adaptive behavior is on by default (`dynamic_tols = true` in `Defaults`) and is why the inner solvers do not simply run at the outer `tol` from the first sweep. + +The Galerkin error certifies that the algorithm reached a fixed point of *its own* update, which is necessary but not sufficient for the state to be a good eigenstate. +An independent check is the energy [`variance`](@ref) ``\langle H^2\rangle - \langle H\rangle^2``, which vanishes exactly for a true eigenstate and does not rely on the ansatz's tangent space: + +```@example numerics +variance(ψ, H, envs) +``` + +## Precision and the element type + +Underneath the tensors is an ordinary floating-point element type, and by default it is complex double precision, `ComplexF64`. +A randomly initialized state carries that type unless you ask for another: + +```@example numerics +scalartype(FiniteMPS(16, ℂ^2, ℂ^24)) +``` + +Double precision is the right default: at `Float64` the relative rounding error is about ``10^{-16}``, comfortably below the `1e-10` convergence tolerance, so floating-point noise is rarely what limits an MPSKit result — truncation and incomplete convergence dominate long before precision does. + +The choice between a real and a complex element type is occasionally load-bearing rather than cosmetic. +Real-time evolution and the ``W^{II}`` time-evolution MPO intrinsically require complex arithmetic, so a real-valued state must be promoted before it can be evolved; MPSKit provides `Base.complex` on an MPS for exactly this, and it is a no-op when the state is already complex. +Conversely, a purely real problem — a real Hamiltonian with a real ground state — can in principle be run in `Float64` to save memory and time, but this is an optimization to reach for deliberately, not the default. + +## Common pitfalls + +Most non-convergence has one of a small number of causes, and recognizing them conceptually is half the battle; the concrete diagnostics are collected in [Convergence troubleshooting](@ref howto_convergence_troubleshooting). + +**Too small a bond dimension.** +If the state genuinely needs more entanglement than the bond dimension can hold, no amount of iterating will converge it — the discarded weight is bounded away from zero by the ansatz itself. +This is aggravated by the single-site algorithms, which cannot enlarge the bond dimension: with a symmetry, a single-site sweep freezes not only the total bond dimension but its distribution over charge sectors, so a poor initial distribution cannot be repaired without a two-site pass or an explicit [`changebonds`](@ref) expansion. + +**Local minima.** +The variational optimization is non-convex, and an algorithm can settle into a state that is a fixed point of its update but not the global ground state. +The single-site methods are more prone to this than bond-growing ones, which is part of why a two-site warm-up (or a gradient-descent polishing stage, chained with `&`) is often used before or after a single-site run. + +**Symmetry-sector trapping.** +When the state carries a conserved quantum number, the optimization runs within a fixed set of symmetry sectors on each bond. +If the true ground state lives in a sector distribution the initial state does not span, the algorithm converges — cleanly, by its own criterion — to the best state in the *wrong* variational space. +This is a sharper, symmetry-specific version of the too-small-bond-dimension trap, and it is why the sector structure of the initial state matters. + +**Non-injectivity and a near-degenerate transfer matrix (infinite systems).** +[`VUMPS`](@ref) assumes a unique, injective fixed point. +When the state it should converge to is non-injective — for instance a cat state superposing symmetry-broken sectors, or a genuinely degenerate ground space — the transfer matrix has more than one eigenvalue of magnitude one, and the algorithm has no well-defined single fixed point to find. +MPSKit's [`correlation_length`](@ref) machinery detects this: it is computed from the gap between the leading and next-to-leading transfer-matrix eigenvalues (the correlation length is the inverse of that gap), and [`transfer_spectrum`](@ref) exposes the spectrum directly. +Internally the routine emits a `"Non-injective mps?"` warning when it finds more than one eigenvalue near magnitude one at the same complex angle — a heuristic flag, not a hard error, so it is worth watching for. + +**Finite-entanglement effects at criticality.** +At or near a critical point the true correlation length diverges, but a finite bond dimension can only support a finite correlation length, so the simulated correlation length saturates at a value set by the bond dimension rather than by the physics. +Extracting critical data therefore requires studying how results drift as the bond dimension grows, rather than trusting any single bond dimension. + +## Where to go next + +For the step-by-step diagnosis of a calculation that will not converge, see [Convergence troubleshooting](@ref howto_convergence_troubleshooting). +For the mechanics of changing the bond dimension, see [Controlling bond dimension](@ref howto_bond_dimension), and for the reasoning behind each algorithm's convergence behavior see [The algorithm landscape](@ref concept_algorithm_landscape). +The full signatures of the diagnostic functions named here — [`entanglement_spectrum`](@ref), [`entropy`](@ref), [`variance`](@ref), [`correlation_length`](@ref), and [`transfer_spectrum`](@ref) — are in the library reference. diff --git a/docs/src/concepts/operators_and_hamiltonians.md b/docs/src/concepts/operators_and_hamiltonians.md new file mode 100644 index 000000000..469d90b58 --- /dev/null +++ b/docs/src/concepts/operators_and_hamiltonians.md @@ -0,0 +1,149 @@ +# [Operators and Hamiltonians](@id concept_operators_and_hamiltonians) + +Just as a matrix product state factorises a wavefunction into a chain of local tensors, an operator on a one-dimensional system can be factorised in exactly the same way. +The result is a *matrix product operator* (MPO): the operator analogue of an MPS. +This page explains what that factorisation is, why the local tensors are not unique, and — above all — the particular upper-triangular *Jordan-block* structure that lets a sum of local terms be written as a single MPO. +It is about understanding rather than construction: for how to *build* a Hamiltonian see [Building Hamiltonians](@ref howto_hamiltonians), and for the full type signatures see the [Operators](@ref lib_operators) reference. + +## What an MPO is + +An MPO is a collection of local [`MPOTensor`](@ref MPSKit.MPOTensor) objects contracted along a line. +Where an MPS site tensor has one physical leg and two virtual legs, an MPO site tensor has *two* physical legs — one incoming and one outgoing — because it maps states to states, and again two virtual legs that thread the operator together along the chain. + +```@raw html +An MPO drawn as a chain of tensors, each with an incoming and an outgoing physical leg and virtual legs joining it to its neighbours. +``` + +*The diagram shows an MPO as a row of site tensors, each carrying a pair of physical indices (one in, one out) and linked to its neighbours through virtual bonds.* + +As with states, the construction comes in a finite and an infinite flavour. +A [`FiniteMPO`](@ref) is a plain vector of `MPOTensor` objects with trivial (dimension-one) virtual spaces at the two ends, so that the network describes a genuine operator on a finite chain. +An [`InfiniteMPO`](@ref) instead repeats a finite unit cell periodically, and is therefore stored as a periodic array of `MPOTensor` objects rather than an ordinary vector. + +### Gauge non-uniqueness + +The local tensors of an MPO are not uniquely determined by the operator they encode. +Exactly as for an MPS, an invertible gauge transformation can be inserted on any virtual bond and reabsorbed into the two neighbouring tensors without changing the contracted network. +The individual site tensors are therefore defined only up to this virtual-space gauge freedom. + +!!! warning "Element-wise comparison is unsafe" + Because two different sets of local tensors can represent the very same operator, comparing MPOs tensor-by-tensor is not meaningful. + Test for equality through gauge-invariant quantities instead. + +### Products and sums grow the virtual dimension + +MPOs support the usual linear-algebra operations — addition, subtraction, and multiplication, either among themselves or acting on an MPS. +Each such operation combines the virtual spaces of its operands, so the virtual dimension of the result is (generically) the *product* or *sum* of the input dimensions rather than staying fixed. +Composing operators naively therefore makes the representation grow, and the growth compounds under repeated multiplication. +This growth is precisely what motivates the *approximate* algorithms that re-express a product or sum within a bounded virtual dimension; see the [algorithm landscape](@ref concept_algorithm_landscape) for where those methods fit. + +## MPO Hamiltonians and the Jordan-block form + +A quantum Hamiltonian is a *sum* of local terms rather than a single dense operator, yet it too can be written as one MPO. +The trick is a characteristic upper-triangular block structure, so distinctive that the resulting object is usually called a *Jordan-block MPO*. +In MPSKit this is the [`MPOHamiltonian`](@ref) family — [`FiniteMPOHamiltonian`](@ref) and [`InfiniteMPOHamiltonian`](@ref) — and it is what the Hamiltonian constructors assemble under the hood. + +In its most general form, the per-site block matrix ``W`` reads + +```math +W = \begin{pmatrix} +1 & C & D \\ +0 & A & B \\ +0 & 0 & 1 +\end{pmatrix} +``` + +where the corner entries `1` are identity operators and ``A``, ``B``, ``C``, ``D`` are (blocks of) local operators. +The Hamiltonian on ``N`` sites is recovered by contracting one copy of ``W`` per site between two boundary vectors, + +```math +v_L = \begin{pmatrix} 1 & 0 & 0 \end{pmatrix}, +\qquad +v_R = \begin{pmatrix} 0 \\ 0 \\ 1 \end{pmatrix}, +\qquad +H = V_L\, W^{\otimes N}\, V_R . +``` + +### A finite-state automaton + +The upper-triangular shape makes ``W`` behave like a finite-state automaton that reads the chain from left to right. +The boundary vector ``v_L`` starts in the top-left "identity" state; the automaton may stay there (the leading `1`), it may *finish* immediately by placing a single-site term through ``D``, or it may *start* an interaction through ``C``, propagate it across intermediate sites through ``A``, and *close* it through ``B`` into the bottom-right "identity" state selected by ``v_R``. +Every complete left-to-right path through the block matrix contributes one term of the Hamiltonian: + +- ``D`` alone generates the single-site terms, +- ``C \cdot B`` generates the two-site terms, +- ``C \cdot A \cdot B`` generates the three-site terms, +- and in general ``C \cdot A^{k} \cdot B`` generates a term spanning ``k+2`` sites. + +The repeated ``A`` block is what makes longer-range interactions possible at fixed virtual dimension: choosing ``A`` to be (a multiple of) the identity gives every additional site the same weight, while a decaying ``A`` gives geometrically decaying couplings. +A sum of such geometric series can approximate a power-law interaction to any desired accuracy, which is how (exponentially decaying) infinite-range and approximate power-law couplings are represented. + +### The transverse-field Ising Hamiltonian + +For the [transverse-field Ising model](https://en.wikipedia.org/wiki/Transverse-field_Ising_model), + +```math +H = -J \sum_{\langle i, j \rangle} X_i X_j - h \sum_j Z_j , +``` + +the block matrix specialises to + +```math +W = \begin{pmatrix} +1 & X & -hZ \\ +0 & 0 & -JX \\ +0 & 0 & 1 +\end{pmatrix} . +``` + +Here ``D = -hZ`` is the single-site field term, and the nearest-neighbour coupling ``-J X_i X_{i+1}`` is produced by ``C = X`` on one site meeting ``B = -JX`` on the next. +The middle block ``A = 0`` truncates the automaton after two sites, which is exactly what a nearest-neighbour model needs — there are no longer-range paths. + +### Verifying the expansion symbolically + +Because ``H = V_L\, W^{\otimes N}\, V_R`` is just repeated matrix multiplication, the term-generation rule above can be checked with a symbolic algebra system. +Filling ``W`` with abstract symbols ``A``, ``B``, ``C``, ``D`` on each site and expanding the product exposes exactly which combinations survive. + +```@example operators +using Symbolics +L = 4 +# generate W matrices, one per site +@variables A[1:L] B[1:L] C[1:L] D[1:L] +Ws = map(1:L) do l + return [1 C[l] D[l] + 0 A[l] B[l] + 0 0 1] +end + +# left and right boundary vectors +Vₗ = [1, 0, 0]' +Vᵣ = [0, 0, 1] + +# expand the contraction H = V_L W^{⊗L} V_R +expand(Vₗ * prod(Ws) * Vᵣ) +``` + +Reading off the result, the lone ``D`` terms are the single-site contributions, the ``C \cdot B`` products are the two-site terms, the ``C \cdot A \cdot B`` products are the three-site terms, and so on — precisely the automaton paths described above. + +## Sparse and block structure + +Because an [`MPOHamiltonian`](@ref) is an MPO with the extra Jordan-block structure, its virtual space is not a single space but a *direct sum* of spaces, one for each row (or column) of the block matrix ``W``. +The site tensors are therefore stored as [`BlockTensorMap`](@extref BlockTensorKit.BlockTensorMap) objects rather than ordinary dense tensor maps, with each block occupying one cell of the ``W`` matrix. +MPSKit exposes the specialised [`JordanMPOTensor`](@ref) for exactly this layout. + +!!! note "Sparsity is what keeps it efficient" + Most cells of ``W`` are zero — the whole lower-left triangle, and typically much of the interior ``A`` block. + Storing only the non-zero blocks is what makes the Jordan-block representation compact, so the cost tracks the number of distinct interaction terms rather than the nominal size of ``W``. + +The [`JordanMPOTensor`](@ref) type and its internal accessors are implementation detail and may change; treat them as unstable and prefer the public constructors and `@ref`-documented interface. + +## Beyond nearest-neighbour, 1D chains + +The same machinery is not limited to nearest-neighbour couplings or to strictly one-dimensional systems: quasi-1D cylinders and 2D lattices are obtained by snaking the MPO through a multi-dimensional array of physical spaces, and longer-range interactions slot into the ``A`` block as described above. +See [Building Hamiltonians](@ref howto_hamiltonians) for the construction recipes and [MPSKitModels.jl](https://quantumkithub.github.io/MPSKitModels.jl/dev/) for ready-made lattices and models. + +## Where to go next + +- To build Hamiltonians from local terms, in 1D or on lattices, see [Building Hamiltonians](@ref howto_hamiltonians). +- For the full type signatures and docstrings, see the [Operators](@ref lib_operators) reference. +- For the approximate algorithms that keep MPO products and sums bounded, see the [algorithm landscape](@ref concept_algorithm_landscape). diff --git a/docs/src/concepts/parallelism_model.md b/docs/src/concepts/parallelism_model.md new file mode 100644 index 000000000..e8e3bccbc --- /dev/null +++ b/docs/src/concepts/parallelism_model.md @@ -0,0 +1,73 @@ +# [The parallelism model](@id concept_parallelism_model) + +Julia has excellent [parallelism infrastructure](https://julialang.org/blog/2019/07/multithreading/), +but there is a caveat that touches every algorithm in MPSKit: Julia's own threads do not +compose cleanly with the threads that BLAS uses internally for linear algebra. +Since `gemm` (general matrix-matrix multiplication) is a core routine throughout MPSKit, +this interaction has a real effect on performance. + +This page explains the model behind the settings, so that the recipes on +[Parallelism and GPU support](@ref howto_parallelism_gpu) are more than a list of magic +incantations. + +## Julia threads versus BLAS threads + +Much of the confusion here comes from the fact that BLAS threading behaviour is not +consistent between vendors, and that performance depends strongly on the hardware, the +specifics of the problem, and the availability of resources such as total memory and memory +bandwidth. +There is no one-size-fits-all setting, which is why the how-to page frames its advice as +starting points to be measured rather than guarantees. + +The two vendors most commonly used with Julia treat the BLAS thread count differently. +With OpenBLAS (the default), the configured number of BLAS threads is the **total** size of a +single thread pool that is shared by all Julia threads: 4 Julia threads and 4 BLAS threads +means all 4 Julia threads draw from the same pool of 4 BLAS threads. +Setting the BLAS thread count to `1` instead frees OpenBLAS to run its work on the Julia +threads themselves, so that MPSKit's Julia-level parallelism is the thing that scales. + +With [MKL.jl](https://github.com/JuliaLinearAlgebra/MKL.jl), which often outperforms OpenBLAS, +the count is instead the number of threads spawned by **each** Julia thread: 4 Julia threads +with 4 BLAS threads each gives 16 BLAS threads in total. +Getting this wrong oversubscribes the physical cores — more software threads than hardware +can run — which degrades rather than improves performance. + +## Where MPSKit parallelizes + +When Julia is started with more than one thread, MPSKit uses +[OhMyThreads.jl](https://juliafolds2.github.io/OhMyThreads.jl/stable/) to parallelize its +algorithms wherever possible. +In practice this happens where a unit cell (or a chain of sites) lets local updates run +independently: the work is distributed across the sites of the system, with the tensor at +each site updated in parallel. +This is exactly why setting the BLAS thread count to `1` on OpenBLAS tends to help: it keeps +the Julia threads free to work through the sites, rather than contending with a shared BLAS +pool. + +The amount of speedup you can expect therefore tracks how much independent per-site work an +algorithm exposes. + +## Parallelism over symmetry sectors + +There is a second, orthogonal layer of parallelism for tensors that carry an internal +symmetry. +Such tensors are block-diagonal over their symmetry sectors, and the work can be spread +across those blocks. +This is handled by [TensorKit](https://quantumkithub.github.io/TensorKit.jl/stable/) at the +level of the individual tensor operations, below MPSKit's site-level parallelism, so the two +layers are independent of one another. + +## Why memory pressure arises + +The same task-based parallelism that speeds MPSKit up can also drive its memory usage high. +The algorithms spawn tasks in a nested fashion, and each of those tasks allocates and +deallocates a fair amount of memory in a tight loop. +This can produce enough garbage, quickly enough, that the garbage collector cannot keep up; +in the worst case memory is exhausted and an `OutOfMemory` error is thrown before the garbage +can be cleared. + +The most memory-intensive step is reportedly the application of the `derivatives` — the +effective local operators built during the sweeps — which is why the practical mitigation is +to disable MPSKit's multithreading there. +The concrete recipe for doing so is on +[Parallelism and GPU support](@ref howto_parallelism_gpu). diff --git a/docs/src/concepts/symmetries.md b/docs/src/concepts/symmetries.md new file mode 100644 index 000000000..10e75c695 --- /dev/null +++ b/docs/src/concepts/symmetries.md @@ -0,0 +1,151 @@ +```@meta +DocTestSetup = quote + using MPSKit, MPSKitModels, TensorKit +end +``` + +# [Symmetries](@id concept_symmetries) + +[TensorKit for MPS users](@ref concept_vector_spaces) already showed the key fact: a symmetry in MPSKit is not a flag passed to an algorithm, it is a property of the vector *spaces* that a tensor is built from, and every algorithm is written once, generically, for any such space. +That page built the mental model of a `TensorMap` and introduced graded spaces through a single ℤ₂ example. +This page stays at the same level of abstraction but widens the lens: what kinds of symmetry a graded space can encode, what changes qualitatively as you move from an abelian group to a non-abelian one or to fermionic or anyonic statistics, and — the question every user eventually asks — when the extra bookkeeping of a bigger symmetry group is actually worth it. +For the hands-on version of the ℤ₂ case worked all the way through a ground-state search, see [Using symmetries](@ref tutorial_using_symmetries); this page explains the reasoning behind that recipe and extends it to the other symmetry classes MPSKit supports. + +As on the sibling page, none of the symmetry machinery lives in `MPSKit` or `MPSKitModels` itself: `using MPSKit` does not bring a single sector or space type into scope, and neither does `using MPSKitModels`. +Every symmetric object — `Z2Irrep`, `U1Irrep`, `SU2Irrep`, `Z2Space`, `U1Space`, and so on — comes from `TensorKit`, so every example on this page loads all three packages explicitly. + +```@example symmetries +using MPSKit, MPSKitModels, TensorKit +``` + +## Sectors, charges, and block-sparsity + +A **sector** is a label for an irreducible representation of the symmetry: for a group symmetry it is one irrep, and a graded space is built by declaring how many copies ("degeneracy" or "multiplicity") of each sector it contains. +[TensorKit for MPS users](@ref concept_vector_spaces) did this for ℤ₂ with `Z2Space(0 => 1, 1 => 1)`; the same `sector => degeneracy` syntax works for every symmetry, so a U(1)-graded space that keeps track of, say, a conserved particle number or magnetization from `-1` to `1` reads: + +```@example symmetries +V = U1Space(-1 => 1, 0 => 1, 1 => 1) +dim(V) +``` + +The space still knows its full sector content, queryable with [`sectors`](https://quantumkithub.github.io/TensorKit.jl/stable/) and [`dim`](https://quantumkithub.github.io/TensorKit.jl/stable/) applied to a specific sector: + +```@example symmetries +collect(sectors(V)) +``` + +```@example symmetries +[dim(V, c) for c in sectors(V)] +``` + +Charge conservation is the statement that a symmetric tensor may only have nonzero entries between sectors whose charges add up correctly (for a Hamiltonian term, incoming and outgoing charge must match). +Concretely this means the tensor is **block-diagonal** in the sector label: what would be one dense array for a plain `ℂ^n` space becomes a handful of smaller, independent dense blocks, one per allowed sector combination, and the entries that connect different sectors are not merely zero — they are never allocated or touched at all. +This is the mechanism behind everything that follows: the *type* of symmetry only changes what the sector labels are and how they combine (their *fusion rules*); the block-sparse storage and the charge-conservation bookkeeping are handled identically underneath. + +## A taxonomy of symmetry types + +MPSKitModels' [`heisenberg_XXX`](https://quantumkithub.github.io/MPSKitModels.jl/stable/) model is a convenient single thread through the taxonomy, because the same Heisenberg Hamiltonian can be built with a trivial symmetry or with any of the three main non-trivial types below, purely by passing a different sector type as the first argument: + +```@example symmetries +H_triv = heisenberg_XXX(FiniteChain(4); spin = 1 // 2) +H_Z2 = heisenberg_XXX(Z2Irrep, FiniteChain(4); spin = 1 // 2) +H_U1 = heisenberg_XXX(U1Irrep, FiniteChain(4); spin = 1 // 2) +H_SU2 = heisenberg_XXX(SU2Irrep, FiniteChain(4); spin = 1 // 2) +``` + +Four `Hamiltonian`s, four different tensor structures, one physical model. + +### Abelian symmetries: ℤ_N and U(1) + +`Z2Irrep`, `Z3Irrep`, `Z4Irrep`, and the general `ZNIrrep`, together with `U1Irrep`, are the abelian family: their sectors are literally the elements of ℤ_N or of the integers (or half-integers), and two sectors fuse by addition modulo N, or ordinary addition for U(1). +Every irrep is one-dimensional, so an abelian symmetry buys exactly the block-sparsity described above and nothing more: `H_Z2` above encodes the same spin-flip parity used throughout [Using symmetries](@ref tutorial_using_symmetries), while `H_U1` encodes conservation of total magnetization ``S^z_{\mathrm{tot}}``, with sectors running over the possible values of ``S^z_{\mathrm{tot}}``. +`transverse_field_ising` is a useful reminder that not every model has every symmetry available: it accepts `Trivial`, `Z2Irrep`, or `FermionParity`, but raises an error for `U1Irrep`, because the transverse-field Ising model genuinely only has the ℤ₂ spin-flip symmetry — there is no conserved U(1) charge to exploit. + +### Non-abelian symmetries: SU(2) + +`SU2Irrep` sectors are labelled by a total spin ``j = 0, \tfrac12, 1, \tfrac32, \dots``, and fusing two of them follows the angular-momentum addition (Clebsch–Gordan) rule rather than simple addition: fusing spin ``j_1`` and ``j_2`` can produce any ``j`` from ``|j_1-j_2|`` to ``j_1+j_2``. +The qualitative difference from the abelian case is that each sector ``j`` is not one-dimensional but ``(2j+1)``-dimensional, and a symmetric tensor need only store the multiplicity of each ``j`` — the internal ``(2j+1)`` structure of every multiplet is fixed by representation theory and is never stored explicitly. +`H_SU2` above is built exactly this way: it is the same Heisenberg chain, only now every eigenstate additionally carries a total-spin label, and the tensors only ever store one number per multiplet rather than one number per individual magnetic sublevel. +The next section makes this saving concrete. + +### Fermionic symmetries and product sectors + +`FermionParity` grades a space into an even and an odd fermion-number sector, and — crucially — TensorKit's fermionic tensor category attaches the anticommutation sign directly to the braiding of `FermionParity`-graded legs, so that once physical and virtual legs carry this sector, index permutations automatically pick up the correct fermionic signs instead of requiring the sign rule to be implemented by hand in every algorithm [mortier2025](@cite). +Models with more than one physical species combine sectors with `⊠` (typed `\boxtimes`) into a `ProductSector`, for instance an odd fermion paired with unit U(1) charge: + +```@example symmetries +FermionParity(1) ⊠ U1Irrep(1) +``` + +`hubbard_model` exercises this directly: it takes an independent *particle* symmetry and *spin* symmetry, and assembles the physical space internally out of `FermionParity ⊠ (particle symmetry)` and `FermionParity ⊠ (spin symmetry)` pieces. +Choosing U(1) for particle number and SU(2) for spin gives the maximally symmetric Hubbard chain: + +```@example symmetries +H_hub = hubbard_model(ComplexF64, U1Irrep, SU2Irrep, FiniteChain(4); t = 1.0, U = 8.0) +``` + +The first argument is the scalar element type, required here because a lattice is given explicitly; the two symmetry types then set the particle-number and spin symmetries in that order. + +By contrast, `bose_hubbard_model` only accepts `Trivial` or `U1Irrep`: bosons carry no parity grading, so there is no fermionic sign to encode and no spin degree of freedom to make non-abelian. +At the far end of this spectrum, `quantum_chemistry_hamiltonian` does not expose a symmetry choice at all — it always builds its tensors with the fixed, maximal ``U(1) \boxtimes SU(2) \boxtimes \mathrm{FermionParity}`` symmetry (particle number, total spin, and fermionic sign), because for realistic molecular Hamiltonians that full symmetry is essentially always worth imposing. + +### Anyonic symmetries + +The generality goes further than groups. +Sectors such as `FibonacciAnyon` or `IsingAnyon` are not group representations at all — their fusion rules come from a modular tensor category — yet because every MPSKit algorithm is written against the abstract `Sector` interface, they are handled by exactly the same code paths, with no special-casing. +The [hard-hexagon model](@ref "The Hard Hexagon model") example puts this to work: its transfer matrix is built from `FibonacciAnyon`-graded tensors (`Vect[FibonacciAnyon](:I => …, :τ => …)`), and the standard statistical-mechanics workflow computes its partition function just as it would for an ordinary symmetry. + +## When does SU(2) pay off + +Two distinct effects are at play whenever a symmetry is switched on, and it is worth separating them because only one of them scales with the size of the symmetry group. + +The first effect is the block-sparsity already described: at a fixed total bond dimension, the computer multiplies several smaller dense blocks instead of one large one, and the (forbidden) cross-sector entries are never stored. +[Using symmetries](@ref tutorial_using_symmetries) demonstrates this concretely for ℤ₂: the same 16-dimensional bond becomes two roughly-8-dimensional blocks. +This first effect is present for *any* symmetry, abelian or not, and its benefit grows with the number of distinct sectors the bond dimension gets spread over. + +The second effect is specific to non-abelian symmetries and is qualitatively larger: because a whole ``(2j+1)``-dimensional multiplet is represented by a single stored block, the *number of stored parameters* needed to reach a given *total*, physical bond dimension shrinks. +This can be checked directly: build a graded SU(2) space and compare its total dimension against the multiplicities it actually stores per sector. + +```@example symmetries +V_SU2 = SU2Space(0 => 2, 1 // 2 => 4) +dim(V_SU2) +``` + +```@example symmetries +[dim(V_SU2, c) for c in sectors(V_SU2)] +``` + +The total dimension `dim(V_SU2)` is `10`, because each spin-``j`` sector contributes its ``(2j+1)``-fold multiplet: ``2 \times (2\cdot 0 + 1) + 4 \times (2\cdot\tfrac12 + 1) = 2 + 8 = 10``. +But `dim(V_SU2, c)` returns the *stored* multiplicity of each sector — here `[2, 4]`, just six numbers in total — because the ``(2j+1)`` internal structure of every multiplet is fixed by representation theory and never stored. +For an abelian symmetry the two coincide (every irrep is one-dimensional, so the multiplicities and the total dimension agree, as with the U(1) space above); it is precisely for a non-abelian group that the stored count falls below the physical dimension. + +The gap between the physical dimension (`10`) and the six numbers actually stored is the source of SU(2)'s reputation for letting DMRG reach much larger effective bond dimensions at the same computational cost — the same principle used to push non-abelian symmetric uniform MPS to large SU(3) bond dimensions in practice [devos2022](@cite). + +None of this is free. +Every symmetric block carries the overhead of tracking fusion trees and recombining Clebsch–Gordan coefficients whenever legs are permuted or contracted, and for a non-abelian group this bookkeeping is genuinely more expensive per block than for an abelian one. +In practice this means SU(2) (or any non-abelian symmetry) is worth reaching for when the physics genuinely has that symmetry — a spin chain with full rotational invariance, for instance — and when the bond dimension is large enough that the multiplet-reduction saving dominates the per-block overhead; for small bond dimensions, or for a symmetry the Hamiltonian does not actually have, the abelian or even trivial case is often simpler and just as fast. + +## Fixing the total charge + +Sector labels are not only a storage optimization: they are physical quantum numbers, and MPSKit lets a calculation target a specific one directly. + +For an MPS, the total charge is fixed by giving the state a non-trivial `left` or `right` virtual space, rather than the default unit (trivial-charge) one: + +```@example symmetries +ψ_odd = FiniteMPS( + 4, Z2Space(0 => 1, 1 => 1), Z2Space(0 => 2, 1 => 2); + left = Z2Space(1 => 1) +) +left_virtualspace(ψ_odd, 1) +``` + +Every tensor in `ψ_odd` is now forced, by charge conservation, to represent a state of odd total parity — there is no way for a symmetric MPS built this way to drift into the even sector. +The same idea appears for excited states and for transfer-matrix spectra: the `sector` keyword of [`excitations`](@ref) and of `transfer_spectrum` restricts the search to a chosen total charge instead of the default trivial one, exactly as used to isolate the odd-parity excitation of the TFIM in [Using symmetries](@ref tutorial_using_symmetries). +[Excited states](@ref howto_excitations) collects further recipes for working with `sector`, and [Constructing states](@ref howto_states) collects the analogous recipes for building states with a prescribed symmetry and charge. + +## Where to go next + +- For the tensor mechanics underneath all of this — spaces, `TensorMap`s, index conventions — see [TensorKit for MPS users](@ref concept_vector_spaces). +- For the fully worked ℤ₂ example, from Hamiltonian to ground state to a sector-targeted excitation, see [Using symmetries](@ref tutorial_using_symmetries). +- For how symmetric tensors assemble into states and operators, see [Matrix product states](@ref concept_matrix_product_states) and [Operators and Hamiltonians](@ref concept_operators_and_hamiltonians). +- For task recipes that use a `sector` or a charged virtual space, see [Constructing states](@ref howto_states), [Excited states](@ref howto_excitations), and [Entanglement entropy and spectrum](@ref howto_entanglement). diff --git a/docs/src/concepts/vector_spaces.md b/docs/src/concepts/vector_spaces.md new file mode 100644 index 000000000..38beb36da --- /dev/null +++ b/docs/src/concepts/vector_spaces.md @@ -0,0 +1,179 @@ +```@meta +DocTestSetup = quote + using MPSKit, TensorKit +end +``` + +# [TensorKit for MPS users](@id concept_vector_spaces) + +Every tensor in MPSKit is a TensorKit [`TensorMap`](https://quantumkithub.github.io/TensorKit.jl/stable/), and this single choice is what makes the library generic over symmetry. +The same MPS and MPO code runs for a plain complex vector space, an abelian symmetry such as ℤ₂ or U(1), a non-abelian symmetry such as SU(2), and for fermionic or anyonic systems, because the symmetry lives inside the tensor rather than in the algorithms. +This page builds the mental model you need to read that API comfortably: what a `TensorMap` is, how its indices are typed by vector *spaces*, and the index conventions MPSKit adopts for its state and operator tensors. +It is about understanding rather than construction: once the tensors introduced here feel familiar they are put to work in [Matrix product states](@ref concept_matrix_product_states) and [Operators and Hamiltonians](@ref concept_operators_and_hamiltonians). + +## Tensors as linear maps + +The mental shift from a multi-dimensional array to a `TensorMap` is small but important. +An array is a bag of numbers indexed by integer sizes; a `TensorMap` is a **linear map** from one space to another, and its indices carry *types* — vector spaces — rather than bare sizes. +The legs are partitioned into a **codomain** (the outputs of the map) and a **domain** (its inputs), so that a tensor with codomain `W` and domain `V` is read as a map `W ← V`. + +Throughout this page we use a single running example: the two-dimensional complex space of a spin-1/2 degree of freedom. +It is written `ℂ^2` (the `ℂ` is typed `\bbC`), which constructs a [`ComplexSpace`](https://quantumkithub.github.io/TensorKit.jl/stable/) of dimension two. + +```jldoctest vspace +julia> V = ℂ^2 +ℂ^2 + +julia> dim(V) +2 +``` + +A space knows its dimension, and that dimension — not a Julia integer — is what a tensor's legs are built from. + +## Building tensors + +Constructing a tensor mirrors constructing an array, with the `axes`/`size` specifiers replaced by spaces. +The two most common constructors are `rand` and `zeros`, which take a scalar type followed by the codomain and domain. +The domain and codomain can be passed as two separate arguments, or joined with the `←` arrow (typed `\leftarrow`): + +```jldoctest vspace +julia> t = rand(Float64, V ⊗ V, V); + +julia> space(t) +(ℂ^2 ⊗ ℂ^2) ← ℂ^2 + +julia> codomain(t) +(ℂ^2 ⊗ ℂ^2) +``` + +Here `t` is a map from one spin-1/2 space to two of them, built with `⊗` (typed `\otimes`) to combine spaces. +Querying [`space`](https://quantumkithub.github.io/TensorKit.jl/stable/), [`codomain`](https://quantumkithub.github.io/TensorKit.jl/stable/), and [`domain`](https://quantumkithub.github.io/TensorKit.jl/stable/) always prints deterministically, even though the tensor's entries are random. +The `zeros` form takes the codomain and domain as separate positional arguments: + +```jldoctest vspace +julia> z = zeros(ComplexF64, V, V); + +julia> space(z) +ℂ^2 ← ℂ^2 +``` + +## Symmetric tensors: the payoff + +The reason for all of this typing of indices is that the very same interface represents *symmetric* tensors, at no extra cost to the code that uses them. +Instead of `ℂ^2` we hand the constructor a space that has been split into charge **sectors**. +For a ℤ₂ symmetry, `Z2Space(0 => 1, 1 => 1)` is a two-dimensional space whose dimension is distributed as one dimension in the even (charge `0`) sector and one in the odd (charge `1`) sector: + +```jldoctest vspace +julia> V2 = Z2Space(0 => 1, 1 => 1) +Rep[ℤ₂](…) of dim 2: + 0 => 1 + 1 => 1 + +julia> dim(V2) +2 +``` + +A tensor built on this space is a genuinely block-sparse, symmetry-respecting object, yet it is constructed and queried exactly like the plain one above: + +```jldoctest vspace +julia> t3 = rand(Float64, V2 ⊗ V2, V2); + +julia> space(t3) +(Rep[ℤ₂](0 => 1, 1 => 1) ⊗ Rep[ℤ₂](0 => 1, 1 => 1)) ← Rep[ℤ₂](0 => 1, 1 => 1) +``` + +Only the space changed; the tensor stores just the symmetry-allowed blocks and enforces charge conservation for you. +Swapping `Z2Space` for a U(1), SU(2), or fermionic space would be an equally local change, and this is exactly why MPSKit's algorithms never mention a symmetry: it is carried entirely by the spaces. +See [Using symmetries](@ref tutorial_using_symmetries) for the full progression of symmetry types. + +## Reading a partition error + +One feature of `TensorMap`s has no counterpart in plain arrays and is worth meeting deliberately, because it produces an error message that is puzzling the first time. +The partition of legs into codomain and domain is *part of a tensor's type*: two tensors are compatible for addition only when their codomains and domains match, arrows included. +Take a tensor and re-partition it so that every leg sits in the codomain (moving a leg across the `←` also flips its arrow to the dual space): + +```@example vspace +using MPSKit, TensorKit # hide +V = ℂ^2 # hide +t = rand(Float64, V ⊗ V, V) +t2 = permute(t, ((1, 2, 3), ())) +space(t), space(t2) +``` + +`t` and `t2` describe the same legs but with different partitions, so adding them directly fails: + +```@example vspace +try #hide +t + t2 # partitions do not match +catch err; Base.showerror(stderr, err); end #hide +``` + +The fix is [`permute`](https://quantumkithub.github.io/TensorKit.jl/stable/), which regroups the legs into a chosen partition. +Bringing `t2` back to the partition of `t` makes the addition well-defined again: + +```@example vspace +space(t + permute(t2, ((1, 2), (3,)))) +``` + +The lesson is not to avoid re-partitioning but to read such an error as "the same legs, grouped differently" and reach for `permute`. + +## MPSKit's index conventions + +With the `TensorMap` model in hand, we can state the leg conventions MPSKit uses for its own tensors — and, more importantly, *why* it uses them. + +An MPS site tensor has a left virtual space `Vₗ`, one or more physical spaces `P`, and a right virtual space `Vᵣ`, and MPSKit orders them so that the left virtual and physical legs form the codomain while the right virtual leg forms the domain, i.e. `Vₗ ⊗ P ← Vᵣ` (an MPO tensor, with an incoming and an outgoing physical leg, reads `Vₗ ⊗ P ← P ⊗ Vᵣ`). +At first glance this ordering looks arbitrary, but it is chosen to keep the tensor networks **planar**: the legs run left-to-right without any lines having to cross. +Planarity is what lets the algorithms be written without spurious crossings, and this matters most for **fermionic systems**, where every extra line crossing carries a sign and unnecessary crossings would reintroduce a sign problem. + + +### The MPS tensor + +```@raw html +An MPS tensor drawn as a box: a left virtual leg and one or more physical legs on the left, a right virtual leg on the right. +``` + +The diagram encodes the ordering + +```math +V_\ell \otimes P_1 \otimes \cdots \otimes P_{k} \leftarrow V_r, +``` + +i.e. leg 1 is the left virtual space, the physical spaces come next (the picture labels them `physical (2:N-1)`), and the final leg is the right virtual space. +Crucially, an MPS tensor may carry an **arbitrary number of physical legs**, and both [`FiniteMPS`](@ref) and [`InfiniteMPS`](@ref) handle the resulting objects. +This is what allows, for example, boundary tensors in PEPS code, which carry two physical legs. + +### The bond tensor + +```@raw html +A bond tensor drawn as a box with one virtual leg on the left and one virtual leg on the right. +``` + +A bond tensor sits between two MPS site tensors and has only the two virtual legs, ordered + +```math +V_\ell \leftarrow V_r, +``` + +i.e. the left virtual space is the codomain and the right virtual space is the domain. + +### The MPO tensor + +```@raw html +An MPO tensor drawn as a box: a left virtual leg and an outgoing physical leg on the left, an incoming physical leg and a right virtual leg on the right. +``` + +An MPO tensor, used to represent both quantum Hamiltonians and classical statistical-mechanics problems, carries two physical legs (one outgoing, one incoming) and two virtual legs, ordered + +```math +V_\ell \otimes P \leftarrow P \otimes V_r. +``` + +The picture labels these `virtual (1)` and `physical (2)` in the codomain, and `physical (3)` and `virtual (4)` in the domain. + +## Where to go next + +- To see these tensors assembled into states and gauged into canonical form, read [Matrix product states](@ref concept_matrix_product_states). +- For the operator side and the Jordan-block structure of Hamiltonians, read [Operators and Hamiltonians](@ref concept_operators_and_hamiltonians). +- For the full range of symmetry types and when each pays off, see [Using symmetries](@ref tutorial_using_symmetries). +- For the underlying tensor library, consult the [TensorKit documentation](https://quantumkithub.github.io/TensorKit.jl/stable/). +``` diff --git a/docs/src/man/D_100_strided.png b/docs/src/man/D_100_strided.png deleted file mode 100644 index 585beb543f81cfec9e7c1cad28c894c2f93da66e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25345 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

    %`^Li!QKx2$H-r*-qm^A|bK1W{c2h-@Eq0db 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 DicEex diff --git a/docs/src/man/D_500_blas.png b/docs/src/man/D_500_blas.png deleted file mode 100644 index 6e29383760dbb7952f4fbf40640ce6398841583a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17064 zcmaic1yohvx9&kv51?=a5eb1Kf|P)Cmnceir-GD-bV>a103y;U5+V)KA&mmkEg+4A zbT?9O9{=~=|GVS9H!eB`oXy^A&$ZT!Z_fEG0+bY_ui#VQBM^uyj~_{?AQ0!Y5D1)5 z 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 diff --git a/docs/src/man/D_500_strided.png b/docs/src/man/D_500_strided.png deleted file mode 100644 index d7a896e8cb2417cebb90057c3a90853a72f3cb62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21638 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 KIbO97Nd6Dy$y=`g diff --git a/docs/src/man/algorithms.md b/docs/src/man/algorithms.md deleted file mode 100644 index 02b078b61..000000000 --- a/docs/src/man/algorithms.md +++ /dev/null @@ -1,390 +0,0 @@ -```@meta -DocTestSetup = :(using MPSKit, TensorKit, MPSKitModels) -``` - -# [Algorithms](@id um_algorithms) - -Here is a collection of the algorithms that have been added to MPSKit.jl. -If a particular algorithm is missing, feel free to let us know via an issue, or contribute via a PR. - -## Groundstates - -One of the most prominent use-cases of MPS is to obtain the ground state of a given (quasi-) one-dimensional quantum Hamiltonian. -In MPSKit.jl, this can be achieved through `find_groundstate`: - -```@docs; canonical=false -find_groundstate -``` - -There are a variety of algorithms that have been developed over the years, and many of them have been implemented in MPSKit. -Keep in mind that some of them are exclusive to finite or infinite systems, while others may work for both. -Many of these algorithms have different advantages and disadvantages, and figuring out the optimal algorithm is not always straightforward, since this may strongly depend on the model. -Here, we enumerate some of their properties in hopes of pointing you in the right direction. For convenience, the full list of algorithms is: - -- [DMRG](@ref) -- [DMRG2](@ref) -- [VUMPS](@ref) -- [Gradient descent](@ref) -- [TDVP](@ref) -- [Time evolution MPO](@ref) -- [Quasiparticle Ansatz](@ref) -- [Finite excitations](@ref) -- ["Chepiga Ansatz"](@ref) - -### DMRG - -Probably the most widely used algorithm for optimizing groundstates with MPS is [`DMRG`](@ref) and its variants. -This algorithm sweeps through the system, optimizing a single site or pair of sites while keeping all others fixed. -Since this local problem can be solved efficiently, the global optimal state follows by alternating through the system. -However, because of the single-site nature of this algorithm, this can never alter the bond dimension of the state, such that there is no way of dynamically increasing the precision. -This can become particularly relevant in the cases where symmetries are involved, since then finding a good distribution of charges is also required. -To circumvent this, it is also possible to optimize over two sites at the same time with [`DMRG2`](@ref), followed by a truncation back to the single site states. -This can dynamically change the bond dimension but comes at an increase in cost. - -```@docs; canonical=false -DMRG -DMRG2 -``` - -For infinite systems, a similar approach can be used by dynamically adding new sites to the middle of the system and optimizing over them. -This gradually increases the system size until the boundary effects are no longer felt. -However, because of this approach, for critical systems this algorithm can be quite slow to converge, since the number of steps needs to be larger than the correlation length of the system. -Again, both a single-site and a two-site version are implemented, to have the option to dynamically increase the bonddimension at a higher cost. - -```@docs; canonical=false -IDMRG -IDMRG2 -``` - -### VUMPS - -[`VUMPS`](@ref) is an (I)DMRG inspired algorithm that can be used to variationally find the ground state as a Uniform (infinite) Matrix Product State. -In particular, a local update is followed by a re-gauging procedure that effectively replaces the entire network with the newly updated tensor. -Compared to IDMRG, this often achieves a higher rate of convergence, since updates are felt throughout the system immediately. -Nevertheless, this algorithm only works whenever the state is injective, i.e. there is a unique ground state. -Since VUMPS is a single-site algorithm, it cannot alter the bond dimension. - -```@docs; canonical=false -VUMPS -``` - -### Gradient descent - -Both finite and infinite matrix product states can be parametrized by a set of isometric tensors, -which we can optimize over. -Making use of the geometry of the manifold (a Grassmann manifold), we can greatly outperform naive optimization strategies. -Compared to the other algorithms, quite often the convergence rate in the tail of the optimization procedure is higher, such that often the fastest method combines a different algorithm far from convergence with this algorithm close to convergence. -Since this is again a single-site algorithm, there is no way to alter the bond dimension. - -```@docs; canonical=false -GradientGrassmann -``` - -## Time evolution - -Given a particular state, it can also often be useful to examine the evolution of certain properties over time. -To that end, there are two main approaches to solving the Schrödinger equation in MPSKit. - -```math -i \hbar \frac{d}{dt} \Psi = H \Psi \implies \Psi(t) = \exp{\left(-iH(t - t_0)\right)} \Psi(t_0) -``` - -```@docs; canonical=false -timestep -time_evolve -make_time_mpo -``` - -### TDVP - -The first is focused around approximately solving the equation for a small timestep, and repeating this until the desired evolution is achieved. -This can be achieved by projecting the equation onto the tangent space of the MPS, and then solving the results. -This procedure is commonly referred to as the [`TDVP`](@ref) algorithm, which again has a two-site variant to allow for dynamically altering the bond dimension. - -```@docs; canonical=false -TDVP -TDVP2 -BUG -``` - -### Time evolution MPO - -The other approach instead tries to first approximately represent the evolution operator, and only then attempts to apply this operator to the initial state. -Typically the first step happens through [`make_time_mpo`](@ref), while the second can be achieved through [`approximate`](@ref). -Here, there are several algorithms available - -```@docs; canonical=false -WI -WII -TaylorCluster -``` - -## Excitations - -It might also be desirable to obtain information beyond the lowest energy state of a given system, and study the dispersion relation. -While it is typically not feasible to resolve states in the middle of the energy spectrum, there are several ways to target a few of the lowest-lying energy states. - -```@docs; canonical=false -excitations -``` - -```@setup excitations -using TensorKit, MPSKit, MPSKitModels -``` - -### Quasiparticle Ansatz - -The Quasiparticle Ansatz offers an approach to compute low-energy eigenstates in quantum -systems, playing a key role in both finite and infinite systems. It leverages localized -perturbations for approximations, as detailed in [haegeman2013](@cite). - -#### Finite Systems: - -In finite systems, we approximate low-energy states by altering a single tensor in the -Matrix Product State (MPS) for each site, and summing these across all sites. This method -introduces additional gauge freedoms, utilized to ensure orthogonality to the ground state. -Optimizing within this framework translates to solving an eigenvalue problem. For example, -in the transverse field Ising model, we calculate the first excited state as shown in the -provided code snippet, and check the accuracy against theoretical values. Some deviations -are expected, both due to finite-bond-dimension and finite-size effects. - -```@example excitations -# Model parameters -g = 10.0 -L = 16 -H = transverse_field_ising(FiniteChain(L); g) - -# Finding the ground state -ψ₀ = FiniteMPS(L, ℂ^2, ℂ^32) -ψ, = find_groundstate(ψ₀, H; verbosity=0) - -# Computing excitations using the Quasiparticle Ansatz -Es, ϕs = excitations(H, QuasiparticleAnsatz(), ψ; num=1) -isapprox(Es[1], 2(g - 1); rtol=1e-2) -``` - -#### Infinite Systems: - -The ansatz in infinite systems maintains translational invariance by perturbing every site -in the unit cell in a plane-wave superposition, requiring momentum specification. The -[Haldane gap](https://iopscience.iop.org/article/10.1088/0953-8984/1/19/001) computation in -the Heisenberg model illustrates this approach. - -```@example excitations -# Setting up the model and momentum -momentum = π -H = heisenberg_XXX() - -# Ground state computation -ψ₀ = InfiniteMPS(ℂ^3, ℂ^48) -ψ, = find_groundstate(ψ₀, H; verbosity=0) - -# Excitation calculations -Es, ϕs = excitations(H, QuasiparticleAnsatz(), momentum, ψ) -isapprox(Es[1], 0.41047925; atol=1e-4) -``` - -#### Charged excitations: - -When dealing with symmetric systems, the default optimization is for eigenvectors with -trivial total charge. However, quasiparticles with different charges can be obtained using -the sector keyword. For instance, in the transverse field Ising model, we consider an -excitation built up of flipping a single spin, aligning with `Z2Irrep(1)`. - -```@example excitations -g = 10.0 -L = 16 -H = transverse_field_ising(Z2Irrep, FiniteChain(L); g) -ψ₀ = FiniteMPS(L, Z2Space(0 => 1, 1 => 1), Z2Space(0 => 16, 1 => 16)) -ψ, = find_groundstate(ψ₀, H; verbosity=0) -Es, ϕs = excitations(H, QuasiparticleAnsatz(), ψ; num=1, sector=Z2Irrep(1)) -isapprox(Es[1], 2(g - 1); rtol=1e-2) # infinite analytical result -``` - -```@docs; canonical=false -QuasiparticleAnsatz -``` - -### Finite excitations - -For finite systems we can also do something else - find the ground state of the Hamiltonian + -``\\text{weight} \sum_i | \\psi_i ⟩ ⟨ \\psi_i ``. This is also supported by calling - -```@example excitations -# Model parameters -g = 10.0 -L = 16 -H = transverse_field_ising(FiniteChain(L); g) - -# Finding the ground state -ψ₀ = FiniteMPS(L, ℂ^2, ℂ^32) -ψ, = find_groundstate(ψ₀, H; verbosity=0) - -Es, ϕs = excitations(H, FiniteExcited(), ψ; num=1) -isapprox(Es[1], 2(g - 1); rtol=1e-2) -``` - -```@docs; canonical=false -FiniteExcited -``` - -### "Chepiga Ansatz" - -Computing excitations in critical systems poses a significant challenge due to the diverging -correlation length, which requires very large bond dimensions. However, we can leverage this -long-range correlation to effectively identify excitations. In this context, the left/right -gauged MPS, serving as isometries, are effectively projecting the Hamiltonian into the -low-energy sector. This projection method is particularly effective in long-range systems, -where excitations are distributed throughout the entire system. Consequently, the low-lying -energy spectrum can be extracted by diagonalizing the effective Hamiltonian (without any -additional DMRG costs!). The states of these excitations are then represented by the ground -state MPS, with one site substituted by the corresponding eigenvector. This approach is -often referred to as the 'Chepiga ansatz', named after one of the authors of this paper -[chepiga2017](@cite). - -This is supported via the following syntax: - -```@example excitations -g = 10.0 -L = 16 -H = transverse_field_ising(FiniteChain(L); g) -ψ₀ = FiniteMPS(L, ComplexSpace(2), ComplexSpace(32)) -ψ, envs, = find_groundstate(ψ₀, H; verbosity=0) -E₀ = real(sum(expectation_value(ψ, H, envs))) -Es, ϕs = excitations(H, ChepigaAnsatz(), ψ, envs; num=1) -isapprox(Es[1] - E₀, 2(g - 1); rtol=1e-2) # infinite analytical result -``` - -In order to improve the accuracy, a two-site version also exists, which varies two -neighbouring sites: - -```@example excitations -Es, ϕs = excitations(H, ChepigaAnsatz2(), ψ, envs; num=1) -isapprox(Es[1] - E₀, 2(g - 1); rtol=1e-2) # infinite analytical result -``` - -## `changebonds` - -Many of the previously mentioned algorithms do not possess a way to dynamically change to -bond dimension. This is often a problem, as the optimal bond dimension is often not a priori -known, or needs to increase because of entanglement growth throughout the course of a -simulation. [`changebonds`](@ref) exposes a way to change the bond dimension of a given -state. - -```@docs; canonical=false -changebonds -``` - -There are several different algorithms implemented, each having their own advantages and -disadvantages: - -* [`SvdCut`](@ref): The simplest method for changing the bonddimension is found by simply - locally truncating the state using an SVD decomposition. This yields a (locally) optimal - truncation, but clearly cannot be used to increase the bond dimension. Note that a - globally optimal truncation can be obtained by using the [`SvdCut`](@ref) algorithm in - combination with [`approximate`](@ref). Since the output of this method might have a - truncated bonddimension, the new state might not be identical to the input state. - The truncation is controlled through `trunc`, which dictates how the singular values of - the original state are truncated. - - -* [`OptimalExpand`](@ref): This algorithm is based on the idea of expanding the bond - dimension by investigating the two-site derivative, and adding the most important blocks - which are orthogonal to the current state. From the point of view of a local two-site - update, this procedure is *optimal*, but it requires to evaluate a two-site derivative, - which can be costly when the physical space is large. The state will remain unchanged, but - a one-site scheme will now be able to push the optimization further. The subspace used for - expansion can be truncated through `trunc`, which dictates how many singular values will - be added. - -* [`RandExpand`](@ref): This algorithm similarly adds blocks orthogonal to the current - state, but does not attempt to select the most important ones, and rather just selects - them at random. The advantage here is that this is much cheaper than the optimal expand, - and if the bond dimension is grown slow enough, this still obtains a very good expansion - scheme. Again, The state will remain unchanged and a one-site scheme will now be able to - push the optimization further. The subspace used for expansion can be truncated through - `trunc`, which dictates how many orthogonal vectors will be added. - -* [`VUMPSSvdCut`](@ref): This algorithm is based on the [`VUMPS`](@ref) algorithm, and - consists of performing a two-site update, and then truncating the state back down. Because - of the two-site update, this can again become expensive, but the algorithm has the option - of both expanding as well as truncating the bond dimension. Here, `trunc` controls the - truncation of the full state after the two-site update. - -## Leading boundary - -For statistical mechanics partition functions we want to find the approximate leading -boundary MPS. Again this can be done with VUMPS: - -```julia -th = nonsym_ising_mpo() -ts = InfiniteMPS([ℂ^2],[ℂ^20]); -(ts,envs,_) = leading_boundary(ts,th,VUMPS(maxiter=400,verbosity=false)); -``` - -If the mpo satisfies certain properties (positive and hermitian), it may also be possible to -use GradientGrassmann. - -```@docs; canonical=false -leading_boundary -``` - -## `approximate` - -Often, it is useful to approximate a given MPS by another, typically by one of a different -bond dimension. This is achieved by approximating an application of an MPO to the initial -state, by a new state. - -```@docs; canonical=false -approximate -``` - -## Varia - -What follows is a medley of lesser known (or used) algorithms and don't entirely fit under -one of the above categories. - -### Dynamical DMRG - -Dynamical DMRG has been described in other papers and is a way to find the propagator. The -basic idea is that to calculate ``G(z) = ⟨ V | (H-z)^{-1} | V ⟩ `` , one can variationally -find ``(H-z) |W ⟩ = | V ⟩ `` and then the propagator simply equals ``G(z) = ⟨ V | W ⟩``. - -```@docs; canonical=false -propagator -DynamicalDMRG -NaiveInvert -Jeckelmann -``` - -### fidelity susceptibility - -The fidelity susceptibility measures how much the ground state changes when tuning a -parameter in your Hamiltonian. Divergences occur at phase transitions, making it a valuable -measure when no order parameter is known. - -```@docs; canonical=false -fidelity_susceptibility -``` - -### Boundary conditions - -You can impose periodic or open boundary conditions on an infinite Hamiltonian, to generate a finite counterpart. -In particular, for periodic boundary conditions we still return an MPO that does not form a closed loop, such that it can be used with regular matrix product states. -This is straightforward to implement but, and while this effectively squares the bond dimension, it is still competitive with more advanced periodic MPS algorithms. - -```@docs; canonical=false -open_boundary_conditions -periodic_boundary_conditions -``` - -### Exact diagonalization - -As a side effect, our code supports exact diagonalization. The idea is to construct a finite -matrix product state with maximal bond dimension, and then optimize the middle site. Because -we never truncate the bond dimension, this single site effectively parametrizes the entire -Hilbert space. - -```@docs; canonical=false -exact_diagonalization -``` diff --git a/docs/src/man/environments.md b/docs/src/man/environments.md deleted file mode 100644 index 6d431e05e..000000000 --- a/docs/src/man/environments.md +++ /dev/null @@ -1,66 +0,0 @@ -# [Environments](@id um_environments) - -In many tensor network algorithms we encounter partially contracted tensor networks. -In DMRG for example, one needs to know the sum of all the Hamiltonian contributions left and right of the site that we want to optimize. -If you then optimize the neighboring site to the right, you only need to add one new contribution to the previous sum of Hamiltonian contributions. - -This kind of information is stored in the environment objects. -The goal is that the user should preferably never have to deal with these objects, but being aware of the inner workings may allow you to write more efficient code. -That is why they are nonetheless included in the manual. - -## Finite Environments - -When you create a state and a Hamiltonian: - -```julia -state = FiniteMPS(rand, ComplexF64, 20, ℂ^2, ℂ^10); -operator = nonsym_ising_ham(); -``` - -an environment object can be created by calling -```julia -envs = environments(state, operator, state) -``` - -The partially contracted mpohamiltonian left of site i can then be queried using: - -```julia -@time leftenv(envs, i, state) -``` - -This may take some time, but a subsequent call should be a lot quicker - -```julia -@time leftenv(envs, i - 1, state) -``` - -Behind the scenes the `envs` stored all tensors it used to calculate leftenv (state.AL[1 .. i]) and when queried again, it checks if the tensors it previously used are identical (using ===). If so, it can simply return the previously stored results. If not, it will recalculate again. If you update a tensor in-place, the caches cannot know using === that the actual tensors have changed. If you do this, you have to call poison!(state,i). - -As an optional argument, many algorithms allow you to pass in an environment object, and they also return an updated one. Therefore, for time evolution code, it is more efficient to give it the updated caches every time step, instead of letting it recalculate. - -## Infinite Environments - -Infinite Environments are very similar : -```julia -state = InfiniteMPS(ℂ^2, ℂ^10) -operator = transverse_field_ising() -envs = environments(state, operator, state) -``` - -There are also some notable differences. Infinite environments typically require solving linear problems or eigenvalue problems iteratively with finite precision. To find out what precision we used we can type: -```julia -(cache.tol,cache.maxiter) -``` - -To recalculate with a different precision : -```julia -cache.tol=1e-8; -recalculate!(cache,state) -``` - -Unlike their finite counterparts, recalculating is not done automatically. To get the environment for a different state one has to recalculate explicitly! -```julia -different_state = InfiniteMPS([ℂ^2],[ℂ^10]); -recalculate!(cache,different_state) -leftenv(cache,3,different_state) -``` diff --git a/docs/src/man/intro.md b/docs/src/man/intro.md deleted file mode 100644 index ee6c3ddeb..000000000 --- a/docs/src/man/intro.md +++ /dev/null @@ -1,93 +0,0 @@ -# Prerequisites - -The following sections describe the prerequisites for using MPSKit. If you are already -familiar with the concepts of MPSKit and TensorKit, you can skip to the [Conventions](@ref) -sections. - -## TensorKit - -```@example tensorkit -using TensorKit -``` - -MPSKit uses the tensors defined in [TensorKit.jl](https://github.com/Jutho/TensorKit.jl) as -its underlying data structure. This is what allows the library to be generic with respect to -the symmetry of the tensors. The main difference with regular multi-dimensional arrays is -the notion of a partition of the dimensions in **incoming** and **outgoing**, which are -respectively called **domain** and **codomain**. In other words, a `TensorMap` can be -interpreted as a linear map from its domain to its codomain. Additionally, as generic -symmetries are supported, in general the structure of the indices are not just integers, but -are given by spaces. - -The general syntax for creating a tensor is similar to the creation of arrays, where the -`axes` or `size` specifiers are replaced with `VectorSpace` objects: -```julia -zeros(scalartype, codomain, domain) -rand(scalartype, codomain ← domain) # ← is the `\leftarrow` operator -``` - -For example, the following creates a random tensor with three legs, each of which has -dimension two, however with different partitions. - -```@example tensorkit -V1 = ℂ^2 # ℂ is the `\bbC` operator, equivalent to ComplexSpace(10) -t1 = rand(Float64, V1 ⊗ V1 ⊗ V1) # all spaces in codomain -t2 = rand(Float64, V1, V1 ⊗ V1) # one space in codomain, two in domain -``` - -We can now no longer trivially add them together: - -```@example tensorkit -try #hide -t1 + t2 # incompatible partition -catch err; Base.showerror(stderr, err); end #hide -``` -But this can be resolved by permutation: - -```@example tensorkit -try #hide -t1 + permute(t2, (1, 2, 3), ()) # incompatible arrows -catch err; Base.showerror(stderr, err); end #hide -``` - -These abstract objects can represent not only plain arrays but also symmetric tensors. The -following creates a symmetric tensor with ℤ₂ symmetry, again with three legs of dimension -two. However, now the dimension two is now split over even and odd sectors of ℤ₂. - -```@example tensorkit -V2 = Z2Space(0 => 1, 1 => 1) -t3 = rand(Float64, V2 ⊗ V2, V2) -``` - -For more information, check out the [TensorKit documentation](https://quantumkithub.github.io/TensorKit.jl/stable/)! - -## Conventions - -The general definition of an MPS tensor is as follows: - -```@raw html -convention MPSTensor -``` - -These tensors are allowed to have an arbitrary number of physical legs, and both `FiniteMPS` -as well as `InfiniteMPS` will be able to handle the resulting objects. This allows for -example for the definition of boundary tensors in PEPS code, which have two physical legs. - -Similarly, the definition of a bond tensor, appearing in between two MPS tensors, is as -follows: - -```@raw html -convention BondTensor -``` - -Finally, the definition of a MPO tensor, which is used to represent statistical mechanics -problems as well as quantum Hamiltonians, is represented as: - -```@raw html -convention MPOTensor -``` - -While this results at first glance in the not very intuitive ordering of spaces as $V_l -\otimes P \leftarrow P \otimes V_r$, this is actually the most natural ordering for keeping -the algorithms planar. In particular, this is relevant for dealing with fermionic systems, -where additional crossings would lead to sign problems. diff --git a/docs/src/man/lattices.md b/docs/src/man/lattices.md deleted file mode 100644 index 7ec0c4ad0..000000000 --- a/docs/src/man/lattices.md +++ /dev/null @@ -1,4 +0,0 @@ -# [Lattices](@id lattices) - -!!! warning - This section is still under construction. Coming soon! \ No newline at end of file diff --git a/docs/src/man/operators.md b/docs/src/man/operators.md deleted file mode 100644 index 05525add2..000000000 --- a/docs/src/man/operators.md +++ /dev/null @@ -1,276 +0,0 @@ -# [Operators](@id um_operators) - -In analogy to how we can define matrix product states as a contraction of local tensors, a -similar construction exist for operators. To that end, a Matrix Product Operator (MPO) is -nothing more than a collection of local [`MPOTensor`](@ref MPSKit.MPOTensor) objects, contracted along a -line. Again, we can distinguish between finite and infinite operators, with the latter being -represented by a periodic array of MPO tensors. - -## FiniteMPO - -Starting off with the simplest case, a basic [`FiniteMPO`](@ref) is a vector of `MPOTensor` objects. -These objects can be created either directly from a vector of `MPOTensor`s, or starting from -a dense operator (a subtype of `AbstractTensorMap`), which is then decomposed into a -product of local tensors. - -```@raw html -MPO -``` - -```@setup operators -using TensorKit, MPSKit, MPSKitModels -``` - -```@example operators -S_x = TensorMap(ComplexF64[0 1; 1 0], ℂ^2 ← ℂ^2) -S_z = TensorMap(ComplexF64[1 0; 0 -1], ℂ^2 ← ℂ^2) -O_xzx = FiniteMPO(S_x ⊗ S_z ⊗ S_x); -``` - -The individual tensors are accessible via regular indexing. Note that the tensors are -internally converted to the `MPOTensor` objects, thus having four indices. In this specific -case, the left- and right virtual spaces are trivial, but this is not a requirement. - -```@example operators -O_xzx[1] -``` - -!!! warning - The local tensors are defined only up to a gauge transformation of the virtual spaces. - This means that the tensors are not uniquely defined, and special care must be taken - when comparing MPOs on an element-wise basis. - -For convenience, a number of utility functions are defined for probing the structure of the -constructed MPO. For example, the spaces can be queried as follows: - -```@example operators -left_virtualspace(O_xzx, 2) -right_virtualspace(O_xzx, 2) -physicalspace(O_xzx, 2) -``` - -MPOs also support a range of linear algebra operations, such as addition, subtraction and -multiplication, either among themselves or with a finite MPS. Here, it is important to note -that these operations will increase the virtual dimension of the resulting MPO or MPS, and -this naive application is thus typically not optimal. For approximate operations that do not -increase the virtual dimension, the more advanced algorithms in the [um_algorithms](@ref) -sections should be used. - -```@example operators -O_xzx² = O_xzx * O_xzx -println("Virtual dimension of O_xzx²: ", left_virtualspace(O_xzx², 2)) -O_xzx_sum = 0.1 * O_xzx + O_xzx² -println("Virtual dimension of O_xzx_sum: ", left_virtualspace(O_xzx_sum, 2)) -``` - -```@example operators -O_xzx_sum * FiniteMPS(3, ℂ^2, ℂ^4) -``` - -!!! note - The virtual spaces of the resulting MPOs typically grow exponentially with the - number of multiplications. Nevertheless, a number of optimizations are in place that - make sure that the virtual spaces do not increase past the maximal virtual space that - is dictated by the requirement of being full-rank tensors. - -## InfiniteMPO - -This construction can again be extended to the infinite case, where the tensors are repeated periodically. -Therefore, an [`InfiniteMPO`](@ref) is simply a `PeriodicVector` of `MPOTensor` objects. -These can only be constructed from vectors of `MPOTensor`s, since it is impossible to create the infinite operators directly. - -```@example operators -mpo = InfiniteMPO(O_xzx[1:2]) -``` - -Otherwise, their behavior is mostly similar to that of their finite counterparts. - -## FiniteMPOHamiltonian - -We can also represent quantum Hamiltonians in the same form. This is done by converting a -sum of local operators into a single MPO operator. The resulting operator has a very -specific structure, and is often referred to as a *Jordan block MPO*. - -This object can be constructed as an MPO by using the [`FiniteMPOHamiltonian`](@ref) constructor, -which takes two crucial pieces of information: - -1. An array of `VectorSpace` objects, which determines the local Hilbert spaces of the - system. The resulting MPO will snake through the array in linear indexing order. - -2. A set of local operators, which are characterised by a number of indices that specify on - which sites the operator acts, along with an operator to define the action. These are - specified as a `inds => operator` pairs, or any other iterable collection thereof. The - `inds` should be tuples of valid indices for the array of `VectorSpace` objects, or a - single integer for single-site operators. - -As a concrete example, we consider the -[Transverse-field Ising model](https://en.wikipedia.org/wiki/Transverse-field_Ising_model) -defined by the Hamiltonian - -```math -H = -J \sum_{\langle i, j \rangle} X_i X_j - h \sum_j Z_j -``` - -```@example operators -J = 1.0 -h = 0.5 -chain = fill(ℂ^2, 3) # a finite chain of 4 sites, each with a 2-dimensional Hilbert space -single_site_operators = [1 => -h * S_z, 2 => -h * S_z, 3 => -h * S_z] -two_site_operators = [(1, 2) => -J * S_x ⊗ S_x, (2, 3) => -J * S_x ⊗ S_x] -H_ising = FiniteMPOHamiltonian(chain, single_site_operators..., two_site_operators...) -``` - -Various alternative constructions are possible, such as using a `Dict` with key-value pairs -that specify the operators, or using generator expressions to simplify the construction. - -```@example operators -H_ising′ = -J * FiniteMPOHamiltonian(chain, - (i, i + 1) => S_x ⊗ S_x for i in 1:(length(chain) - 1)) - - h * FiniteMPOHamiltonian(chain, i => S_z for i in 1:length(chain)) -isapprox(H_ising, H_ising′; atol=1e-6) -``` - -Note that this construction is not limited to nearest-neighbour interactions, or 1D systems. -In particular, it is possible to construct quasi-1D realisations of 2D systems, by using -different arrays of [`VectorSpace`](@extref TensorKit.VectorSpace) objects. -For example, the 2D Ising model on a square lattice can be constructed as follows: - -```@example operators -square = fill(ℂ^2, 3, 3) # a 3x3 square lattice -operators = Dict() - -local_operators = Dict() -for I in eachindex(square) - local_operators[(I,)] = -h * S_z # single site operators still require tuples of indices -end - -# horizontal and vertical interactions are easier using Cartesian indices -horizontal_operators = Dict() -I_horizontal = CartesianIndex(0, 1) -for I in eachindex(IndexCartesian(), square) - if I[2] < size(square, 2) - horizontal_operators[(I, I + I_horizontal)] = -J * S_x ⊗ S_x - end -end - -vertical_operators = Dict() -I_vertical = CartesianIndex(1, 0) -for I in eachindex(IndexCartesian(), square) - if I[1] < size(square, 1) - vertical_operators[(I, I + I_vertical)] = -J * S_x ⊗ S_x - end -end - -H_ising_2d = FiniteMPOHamiltonian(square, local_operators) + - FiniteMPOHamiltonian(square, horizontal_operators) + - FiniteMPOHamiltonian(square, vertical_operators); -``` - -There are various utility functions available for constructing more advanced lattices, for -which the [lattices](@ref) section should be consulted. - -## InfiniteMPOHamiltonian - -Again, this construction can be extended straightforwardly to the infinite case. -To that end, we simply need to specify all interactions per unit cell. -In particular, an [`InfiniteMPOHamiltonian`](@ref) for the Ising model is obtained via - -```@example operators -J = 1.0 -h = 0.5 -infinite_chain = PeriodicVector([ℂ^2]) # an infinite chain of a local 2-dimensional Hilbert space -H_ising_infinite = InfiniteMPOHamiltonian(infinite_chain, 1 => -h * S_z, (1, 2) => -J * S_x ⊗ S_x) -``` - -### Expert mode - -The `MPOHamiltonian` constructor is in fact an automated way of constructing the -aforementioned *Jordan block MPO*. In its most general form, the matrix $W$ takes on the -form of the following block matrix: - -```math -\begin{pmatrix} -1 & C & D \\ -0 & A & B \\ -0 & 0 & 1 -\end{pmatrix} -``` - -which generates all single-site local operators $D$, all two-site operators $CB$, three-site -operators $CAB$, and so on. Additionally, this machinery can also be used to construct -interaction that are of (exponentially decaying) infinite range, and to approximate -power-law interactions. - -In order to illustrate this, consider the following explicit example of the Transverse-field -Ising model: - -```math -W = \begin{pmatrix} -1 & X & -hZ \\ -0 & 0 & -JX \\ -0 & 0 & 1 -\end{pmatrix} -``` - -If we add in the left and right boundary vectors - -```math -v_L = \begin{pmatrix} -1 & 0 & 0 -\end{pmatrix} -, \qquad -v_R = \begin{pmatrix} -0 \\ 0 \\ 1 -\end{pmatrix} -``` - -One can easily check that the Hamiltonian on $N$ sites is given by the contraction - -```math -H = V_L W^{\otimes N} V_R -``` - -We can even verify this symbolically: - -```@example operators -using Symbolics -L = 4 -# generate W matrices -@variables A[1:L] B[1:L] C[1:L] D[1:L] -Ws = map(1:L) do l - return [1 C[l] D[l] - 0 A[l] B[l] - 0 0 1] -end - -# generate boundary vectors -Vₗ = [1, 0, 0]' -Vᵣ = [0, 0, 1] - -# expand the MPO -expand(Vₗ * prod(Ws) * Vᵣ) -``` - -The [`FiniteMPOHamiltonian`](@ref) constructor can also be used to construct the operator from this most -general form, by supplying a vector of [`BlockTensorMap`](@extref BlockTensorKit.BlockTensorMap) objects -to the constructor. Here, the vector specifies the sites in the unit cell, while the blocktensors contain -the rows and columns of the matrix. We can verify this explicitly: - -```@example operators -H_ising[2] # print the blocktensor -``` - -### Working with `MPOHamiltonian` objects - -!!! warning - This part is still a work in progress - -Because of the discussion above, the `FiniteMPOHamiltonian` object is in fact just an `AbstractMPO`, -with some additional structure. This means that similar operations and properties are -available, such as the virtual spaces, or the individual tensors. However, the block -structure of the operator means that now the virtual spaces are not just a single space, but -a collection (direct sum) of spaces, one for each row/column. - -```@example operators -left_virtualspace(H_ising, 1), right_virtualspace(H_ising, 1), physicalspace(H_ising, 1) -``` diff --git a/docs/src/man/parallelism.md b/docs/src/man/parallelism.md deleted file mode 100644 index 683be061c..000000000 --- a/docs/src/man/parallelism.md +++ /dev/null @@ -1,116 +0,0 @@ -# Parallelism in julia - -Julia has great -[parallelism infrastructure](https://julialang.org/blog/2019/07/multithreading/), but there -is a caveat that is relevant for all algorithms implemented in MPSKit. The Julia threads do -not play nicely together with the BLAS threads, which are the threads used for many of the -linear algebra routines, and in particular for `gemm` (general matrix-matrix -multiplication). As this is a core routine in MPSKit, this has a significant impact on the -overall performance. - -## Julia threads vs BLAS threads - -A lot of the confusion stems from the fact that the BLAS threading behaviour is not -consistent between different vendors. Additionally, performance behaviour is severely -dependent on hardware, the specifics of the problem, and the availability of other resources -such as total memory, or memory bandwidth. This means that there is no one size fits all -solution, and that you will have to experiment with the settings to get optimal performance. -Nevertheless, there are some general guidelines that can be followed, which seem to at least -work well in most cases. - -The number of threads that are set by `BLAS.set_num_threads()`, in the case of OpenBLAS (the -default vendor), is equal to the **total number** of BLAS threads that is kept in a pool, -which is then shared by all Julia threads. This means that if you have 4 julia threads and 4 -BLAS threads, then all julia threads will share the same 4 BLAS threads. On the other hand, -using `BLAS.set_num_threads(1)`, OpenBLAS will now utilize the julia threads to run the BLAS -jobs. Thus, for OpenBLAS, very often setting the number of BLAS threads to 1 is the best -option, which will then maximally utilize the julia threading infrastructure of MPSKit. - -In the case of [MKL.jl](), which often outperforms OpenBLAS, the situation is a bit -different. Here, the number of BLAS threads corresponds to the number of threads that are -spawned by **each** julia thread. Thus, if you have 4 julia threads and 4 BLAS threads, then -each julia thread will spawn 4 BLAS threads, for a total of 16 BLAS threads. As such, it -might become necessary to adapt the settings to avoid oversubscription of the cores. - -A careful analysis of the different cases and benefits can be inspected by making use of -[`ThreadPinning.jl`](https://github.com/carstenbauer/ThreadPinning.jl)'s tool -`threadinfo(; blas=true, info=true)`. In particular, the following might demonstrate the -difference between OpenBLAS and MKL: - -```julia-repl -julia> Threads.nthreads() -4 - -julia> using ThreadPinning; threadinfo(; blas=true, hints=true) - -System: 8 cores (2-way SMT), 1 sockets, 1 NUMA domains - -| 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | - -# = Julia thread, # = HT, # = Julia thread on HT, | = Socket separator - -Julia threads: 4 -├ Occupied CPU-threads: 4 -└ Mapping (Thread => CPUID): 1 => 8, 2 => 5, 3 => 9, 4 => 2, - -BLAS: libopenblas64_.so -└ openblas_get_num_threads: 8 - -[ Info: jlthreads != 1 && blasthreads < cputhreads. You should either set BLAS.set_num_threads(1) (recommended!) or at least BLAS.set_num_threads(16). -[ Info: jlthreads < cputhreads. Perhaps increase number of Julia threads to 16? -julia> using MKL; threadinfo(; blas=true, hints=true) - -System: 8 cores (2-way SMT), 1 sockets, 1 NUMA domains - -| 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 | - -# = Julia thread, # = HT, # = Julia thread on HT, | = Socket separator - -Julia threads: 4 -├ Occupied CPU-threads: 4 -└ Mapping (Thread => CPUID): 1 => 11, 2 => 12, 3 => 1, 4 => 2, - -BLAS: libmkl_rt.so -├ mkl_get_num_threads: 8 -└ mkl_get_dynamic: true - -┌ Warning: blasthreads_per_jlthread > cputhreads_per_jlthread. You should decrease the number of MKL threads, i.e. BLAS.set_num_threads(4). -└ @ ThreadPinning ~/.julia/packages/ThreadPinning/qV2Cd/src/threadinfo.jl:256 -[ Info: jlthreads < cputhreads. Perhaps increase number of Julia threads to 16? -``` - -## MPSKit multithreading - -Within MPSKit, when Julia is started with multiple threads, by default the `OhMyThreads.jl` -machinery will be used to parallelize the code as much as possible. In particular, this mostly -occurs whenever there is a unitcell and local updates can take place at each site in parallel. - -The multithreading behaviour can be controlled through a global `scheduler`, which can be set -using the `MPSKit.Defaults.set_scheduler!(arg; kwargs...)` function. This function accepts -either a `Symbol`, an `OhMyThreads.Scheduler` or keywords to determine a scheduler automatically. - -```julia -MPSKit.Defaults.set_scheduler!(:serial) # disable multithreading -MPSKit.Defaults.set_scheduler!(:greedy) # multithreading with greedy load-balancing -MPSKit.Defaults.set_scheduler!(:dynamic) # default: multithreading with some load-balancing -``` - -For further reference on the available schedulers and finer control, please refer to the -[`OhMyThreads.jl` documentation](https://juliafolds2.github.io/OhMyThreads.jl/stable/) - -## TensorKit multithreading - -Finally, when dealing with tensors that have some internal symmetry, it is also possible to -parallelize over the symmetry sectors. This is handled by TensorKit, and more information -can be found in its documentation (Soon TM). - -## Memory management - -Because of the way julia threads work, it is possible that the total memory usage of your -program becomes rather high. This seems to be because of the fact that MPSKit spawns several -tasks (in a nested way), which each allocate and deallocate quite a bit of memory in a tight -loop. This seems to lead to a situation where the garbage collector is not able to keep up, -and can even fail to clear the garbage before an `OutOfMemory` error occurs. In this case, -often the best thing to do is disable the multithreading of MPSKit, specifically for the -`derivatives`, as this seems to be the most memory intensive part. This is something that is -under investigation, and hopefully will be fixed in the future. diff --git a/docs/src/man/states.md b/docs/src/man/states.md deleted file mode 100644 index 168b2117c..000000000 --- a/docs/src/man/states.md +++ /dev/null @@ -1,174 +0,0 @@ -# [States](@id um_states) - -```@setup states -using MPSKit -using TensorKit -using LinearAlgebra: dot -``` - -## FiniteMPS - -A [`FiniteMPS`](@ref) is - at its core - a chain of mps tensors. - -```@raw html -finite MPS -``` - -### Usage - -A `FiniteMPS` can be created by passing in a vector of tensormaps: - -```@example states -L = 10 -data = [rand(ComplexF64, ℂ^1 ⊗ ℂ^2 ← ℂ^1) for _ in 1:L]; -state = FiniteMPS(data) -``` - -Or alternatively by specifying its structure - -```@example states -max_bond_dimension = ℂ^4 -physical_space = ℂ^2 -state = FiniteMPS(rand, ComplexF64, L, physical_space, max_bond_dimension) -``` - -You can take dot products, renormalize!, expectation values,.... - -### Gauging and canonical forms - -An MPS representation is not unique: for every virtual bond we can insert $C \cdot C^{-1}$ without altering the state. -Then, by redefining the tensors on both sides of the bond to include one factor each, we can change the representation. - -```@raw html -MPS gauge freedom -``` - -There are two particularly convenient choices for the gauge at a site, the so-called left and right canonical form. -For the left canonical form, all tensors to the left of a site are gauged such that they become left-isometries. -By convention, we call these tensors `AL`. - -```@example states -al = state.AL[3] -al' * al ≈ id(right_virtualspace(al)) -``` - -Similarly, the right canonical form turns the tensors into right-isometries. -By convention, these are called `AR`. - -```@example states -ar = state.AR[3] -repartition(ar, 1, 2) * repartition(ar, 1, 2)' ≈ id(left_virtualspace(ar)) -``` - -It is also possible to mix and match these two forms, where all tensors to the left of a given site are in the left gauge, while all tensors to the right are in the right gauge. -In this case, the final gauge transformation tensor can no longer be absorbed, since that would spoil the gauge either to the left or the right. -This center-gauged tensor is called `C`, which is also the gauge transformation to relate left- and right-gauged tensors. -Finally, for convenience it is also possible to leave a single MPS tensor in the center gauge, which we call `AC = AL * C` - -```@example states -c = state.C[3] # to the right of site 3 -c′ = state.C[2] # to the left of site 3 -al * c ≈ state.AC[3] ≈ repartition(c′ * repartition(ar, 1, 2), 2, 1) -``` - -These forms are often used throughout MPS algorithms, and the [`FiniteMPS`](@ref) object acts as an automatic manager for this. -It will automatically compute and cache the different forms, and detect when to recompute whenever needed. -For example, in order to compute the overlap of an MPS with itself, we can choose any site and bring that into the center gauge. -Since then both the left and right side simplify to the identity, this simply becomes the overlap of the gauge tensors: - -```@example states -d = dot(state, state) -all(c -> dot(c, c) ≈ d, state.C) -``` - -### Implementation details - -Behind the scenes, a `FiniteMPS` has 4 fields - -```julia -ALs::Vector{Union{Missing,A}} -ARs::Vector{Union{Missing,A}} -ACs::Vector{Union{Missing,A}} -Cs::Vector{Union{Missing,B}} -``` - -and calling `AL`, `AR`, `C` or `AC` returns lazy views over these vectors that instantiate the tensors whenever they are requested. -Similarly, changing a tensor will poison the `ARs` to the left of that tensor, and the `ALs` to the right. -The idea behind this construction is that one never has to worry about how the state is gauged, as this gets handled automagically. - -!!! warning - While a `FiniteMPS` can automatically detect when to recompute the different gauges, this requires that one of the tensors is set using an indexing operation. - In particular, in-place changes to the different tensors will not trigger the recomputation. - -## InfiniteMPS - -An [`InfiniteMPS`](@ref) can be thought of as being very similar to a finite mps, where the set of tensors is repeated periodically. - -It can also be created by passing in a vector of `TensorMap`s: - -```@example states -data = [rand(ComplexF64, ℂ^4 ⊗ ℂ^2 ← ℂ^4) for _ in 1:2] -state = InfiniteMPS(data) -``` - -or by initializing it from given spaces - -```@example states -phys_spaces = fill(ℂ^2, 2) -virt_spaces = [ℂ^4, ℂ^5] # by convention to the right of a site -state = InfiniteMPS(phys_spaces, virt_spaces) -``` - -Note that the code above creates an `InfiniteMPS` with a two-site unit cell, where the given virtual spaces are located to the right of their respective sites. - -### Gauging and canonical forms - -Much like for `FiniteMPS`, we can again query the gauged tensors `AL`, `AR`, `C` and `AC`. -Here however, the implementation is much easier, since they all have to be recomputed whenever a single tensor changes. -This is a result of periodically repeating the tensors, every `AL` is to the right of the changed site, and every `AR` is to the left. -As a result, the fields are simply - -```julia -AL::PeriodicArray{A,1} -AR::PeriodicArray{A,1} -C::PeriodicArray{B,1} -AC::PeriodicArray{A,1} -``` - -## WindowMPS - -A [`WindowMPS`](@ref) or segment MPS can be seen as a mix between an [`InfiniteMPS`](@ref) and a [`FiniteMPS`](@ref). -It represents a window of mutable tensors (a finite MPS), embedded in an infinite environment (two infinite MPSs). -It can therefore be created accordingly, ensuring that the edges match: - -```@example states -infinite_state = InfiniteMPS(ℂ^2, ℂ^4) -finite_state = FiniteMPS(5, ℂ^2, ℂ^4; left=ℂ^4, right=ℂ^4) -window = WindowMPS(infinite_state, finite_state, infinite_state) -``` - -Algorithms will then act on this window of tensors, while leaving the left and right infinite states invariant. - -## MultilineMPS - -A two-dimensional classical partition function can often be represented by an infinite tensor network. -There are many ways to evaluate such a network, but here we focus on the so-called boundary MPS methods. -These first reduce the problem from contracting a two-dimensional network to the contraction of a one-dimensional MPS, by finding the fixed point of the row-to-row (or column-to-column) transfer matrix. -In these cases however, there might be a non-trivial periodicity in both the horizontal as well as vertical direction. -Therefore, in MPSKit they are represented by [`MultilineMPS`](@ref), which are simply a repeating set of [`InfiniteMPS`](@ref). - -```@example states -state = MultilineMPS(fill(infinite_state, 2)) -``` - -They offer some convenience functionality for using cartesian indexing (row - column): - -You can access properties by calling -```@example states -row = 2 -col = 2 -al = state.AL[row, col]; -``` - -These objects are also used extensively in the context of [PEPSKit.jl](https://github.com/QuantumKitHub/PEPSKit.jl). - From dc7859eff1461f1821df58c385762835211f986a Mon Sep 17 00:00:00 2001 From: lkdvos Date: Mon, 3 Aug 2026 13:10:30 -0400 Subject: [PATCH 5/8] docs(lib): split the library reference by topic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A single `@autodocs Modules = [MPSKit]` dump gives no way to find the function you want. Split it into topic pages that mirror the how-to structure — states, operators, ground states, bond dimension, time evolution, excitations, observables, environments — with `lib/public.md` as the annotated entry point to the exported API. `lib/internals.md` collects what is deliberately not part of the public interface and is marked as unstable. `lib/lib.md` keeps the exhaustive autodocs listing as a backstop, so nothing is unreachable if a docstring is missing from a topic page. Co-Authored-By: Claude Opus 5 (1M context) --- docs/make.jl | 14 ++++++- docs/src/lib/bond_dimension.md | 35 ++++++++++++++++ docs/src/lib/environments.md | 34 +++++++++++++++ docs/src/lib/excitations.md | 30 ++++++++++++++ docs/src/lib/groundstate.md | 21 ++++++++++ docs/src/lib/internals.md | 53 ++++++++++++++++++++++++ docs/src/lib/lib.md | 2 +- docs/src/lib/observables.md | 48 ++++++++++++++++++++++ docs/src/lib/operators.md | 37 +++++++++++++++++ docs/src/lib/public.md | 75 ++++++++++++++++++++++++++++++++++ docs/src/lib/states.md | 25 ++++++++++++ docs/src/lib/time_evolution.md | 31 ++++++++++++++ 12 files changed, 403 insertions(+), 2 deletions(-) create mode 100644 docs/src/lib/bond_dimension.md create mode 100644 docs/src/lib/environments.md create mode 100644 docs/src/lib/excitations.md create mode 100644 docs/src/lib/groundstate.md create mode 100644 docs/src/lib/internals.md create mode 100644 docs/src/lib/observables.md create mode 100644 docs/src/lib/operators.md create mode 100644 docs/src/lib/public.md create mode 100644 docs/src/lib/states.md create mode 100644 docs/src/lib/time_evolution.md diff --git a/docs/make.jl b/docs/make.jl index 79213e777..5b620acdd 100644 --- a/docs/make.jl +++ b/docs/make.jl @@ -92,7 +92,19 @@ makedocs(; "Overview" => "examples/index.md", example_pages..., ], - "Library" => "lib/lib.md", + "Library" => [ + "lib/public.md", + "lib/states.md", + "lib/operators.md", + "lib/groundstate.md", + "lib/bond_dimension.md", + "lib/time_evolution.md", + "lib/excitations.md", + "lib/observables.md", + "lib/environments.md", + "lib/internals.md", + "lib/lib.md", + ], "References" => "references.md", "Changelog" => "changelog.md", ], diff --git a/docs/src/lib/bond_dimension.md b/docs/src/lib/bond_dimension.md new file mode 100644 index 000000000..ff6dc5bf6 --- /dev/null +++ b/docs/src/lib/bond_dimension.md @@ -0,0 +1,35 @@ +# [Bond dimension](@id lib_bond_dimension) + +Reference for changing the bond dimension of a state — expanding or truncating its virtual spaces — and for inspecting those virtual spaces directly. +For a task-oriented walkthrough see [Controlling bond dimension](@ref howto_bond_dimension); the full, canonical docstrings for the whole package live in the [Library](@ref lib_index) index. + +## Interface + +```@docs; canonical=false +changebonds +changebonds! +``` + +## Expansion and truncation algorithms + +```@docs; canonical=false +OptimalExpand +RandExpand +SvdCut +VUMPSSvdCut +SketchedExpand +``` + +!!! note + `SketchedExpand` is experimental: it uses randomized controlled bond expansion (CBE), so its reported error estimate is itself randomized, and it is only defined for `FiniteMPS`. + +## Inspecting the virtual spaces + +The bond dimension of an MPS or MPO is the dimension of the virtual space living on a given bond. +The accessors below return that `VectorSpace`, whose `dim` gives the numeric bond dimension. + +```@docs; canonical=false +left_virtualspace +right_virtualspace +physicalspace +``` diff --git a/docs/src/lib/environments.md b/docs/src/lib/environments.md new file mode 100644 index 000000000..98ccf7720 --- /dev/null +++ b/docs/src/lib/environments.md @@ -0,0 +1,34 @@ +# [Environments](@id lib_environments) + +Reference for MPSKit's environment machinery — the caches that store the partially contracted tensor networks reused throughout the algorithms. +For an explanation of what environments are and why they exist see the concept page on [Environments](@ref concept_environments); this page only lists the API. +The full, canonical docstrings for the whole package live in the [Library](@ref lib_index) index. + +```@meta +CurrentModule = MPSKit +``` + +## Constructing environments + +```@docs; canonical=false +environments +``` + +## Querying environments + +```@docs; canonical=false +leftenv +rightenv +``` + +## Environment types + +The concrete environment types below are returned by [`environments`](@ref) and are managed automatically by the algorithms. +They are implementation details — you normally obtain them from `environments` rather than constructing them directly — and are not part of the public API. + +```@docs; canonical=false +AbstractMPSEnvironments +FiniteEnvironments +InfiniteEnvironments +InfiniteQPEnvironments +``` diff --git a/docs/src/lib/excitations.md b/docs/src/lib/excitations.md new file mode 100644 index 000000000..ce17ec23e --- /dev/null +++ b/docs/src/lib/excitations.md @@ -0,0 +1,30 @@ +# [Excitations](@id lib_excitations) + +Reference for the excitation interface, its algorithms, and the quasiparticle state types it produces. +For a task-oriented walkthrough see the how-to guides. +The full, canonical docstrings for the whole package live in the [Library](@ref lib_index) index. + +## Interface + +```@docs; canonical=false +excitations +``` + +## Algorithms + +```@docs; canonical=false +QuasiparticleAnsatz +FiniteExcited +ChepigaAnsatz +ChepigaAnsatz2 +``` + +## Quasiparticle states + +These are the ansatz states produced by, and passed to, `excitations` on top of a ground state. + +```@docs; canonical=false +QP +LeftGaugedQP +RightGaugedQP +``` diff --git a/docs/src/lib/groundstate.md b/docs/src/lib/groundstate.md new file mode 100644 index 000000000..7ec0b3425 --- /dev/null +++ b/docs/src/lib/groundstate.md @@ -0,0 +1,21 @@ +# [Ground-state algorithms](@id lib_groundstate) + +Reference for the ground-state search interface and its algorithms. +For a task-oriented walkthrough see the how-to guides; the full, canonical docstrings for the whole package live in the [Library](@ref lib_index) index. + +## Interface + +```@docs; canonical=false +find_groundstate +``` + +## Algorithms + +```@docs; canonical=false +DMRG +DMRG2 +VUMPS +IDMRG +IDMRG2 +GradientGrassmann +``` diff --git a/docs/src/lib/internals.md b/docs/src/lib/internals.md new file mode 100644 index 000000000..ba9402633 --- /dev/null +++ b/docs/src/lib/internals.md @@ -0,0 +1,53 @@ +# [Internals](@id lib_internals) + +!!! warning "Non-public API" + The symbols documented on this page are **internal**: they are unexported, not + part of the public API, and may change or be removed in any release without notice + or a deprecation cycle. They are collected here as a reference for contributors and + advanced users reading the source, not as a stable interface to build on. For the + supported surface see the [Public API](@ref public_api). Experimental features (for + example the current GPU support, discussed in [Parallelism and GPU support](@ref howto_parallelism_gpu)) are + likewise unstable and subject to change. + +```@meta +CurrentModule = MPSKit +``` + +## Effective (derivative) operators + +The local eigenvalue and time-evolution problems solved by DMRG, VUMPS, TDVP and friends are phrased in terms of effective "derivative" operators acting on a single gauge tensor. +These are built internally from the Hamiltonian and the surrounding [environments](@ref lib_environments). + +```@docs; canonical=false +DerivativeOperator +C_hamiltonian +AC_hamiltonian +AC2_hamiltonian +``` + +## Transfer matrices + +Low-level application of (regularized) transfer matrices to boundary vectors, used when building infinite-MPS environments. + +```@docs; canonical=false +transfer_left +transfer_right +``` + +## Environment algorithm resolution + +Helpers that pick and instantiate the iterative solver used to compute environments for a given bra/operator/ket combination. + +```@docs; canonical=false +environment_alg +resolve_environment_solver +``` + +## Defaults and scheduling + +Global configuration lives in the `MPSKit.Defaults` submodule, including the multi-threading scheduler used across the package. + +```@docs +Defaults +Defaults.set_scheduler! +``` diff --git a/docs/src/lib/lib.md b/docs/src/lib/lib.md index b1645c273..7f7b23eb0 100644 --- a/docs/src/lib/lib.md +++ b/docs/src/lib/lib.md @@ -1,4 +1,4 @@ -# Library documentation +# [Library documentation](@id lib_index) ```@autodocs Modules = [MPSKit] diff --git a/docs/src/lib/observables.md b/docs/src/lib/observables.md new file mode 100644 index 000000000..1431a7cec --- /dev/null +++ b/docs/src/lib/observables.md @@ -0,0 +1,48 @@ +# [Observables and analysis](@id lib_observables) + +Reference for extracting physical quantities and analysis diagnostics from an MPS. +For a task-oriented walkthrough see the how-to guide [Computing observables](@ref howto_observables). +The full, canonical docstrings for the whole package live in the [Library](@ref lib_index) index. + +## Expectation values + +```@docs; canonical=false +expectation_value +``` + +!!! note "Environments are ignored in the multiline varargs method" + `expectation_value(::MultilineMPS, ::MultilineMPO, envs...)` accepts environments but does + not use them: it evaluates the expectation value line by line, and each line recomputes its + own. Passing environments here therefore saves no work — the result is correct either way. + +## Correlators + +```@docs; canonical=false +correlator +``` + +## Convergence diagnostics + +```@docs; canonical=false +variance +``` + +## Transfer matrix and correlation length + +```@docs; canonical=false +correlation_length +marek_gap +transfer_spectrum +transferplot +``` + +## Entanglement + +Entropy and entanglement spectrum are computed from the state's bond/gauge tensors. +See the how-to [Entanglement entropy and spectrum](@ref howto_entanglement) for worked recipes. + +```@docs; canonical=false +entropy +entanglement_spectrum +entanglementplot +``` diff --git a/docs/src/lib/operators.md b/docs/src/lib/operators.md new file mode 100644 index 000000000..a6fbe02e3 --- /dev/null +++ b/docs/src/lib/operators.md @@ -0,0 +1,37 @@ +# [Operators](@id lib_operators) + +Reference for matrix product operators and Hamiltonians. +The full, canonical docstrings for the whole package live in the [Library](@ref lib_index) index. + +## Matrix product operators + +```@docs; canonical=false +AbstractMPO +MPO +FiniteMPO +InfiniteMPO +MultilineMPO +``` + +## Hamiltonians + +```@docs; canonical=false +MPOHamiltonian +FiniteMPOHamiltonian +InfiniteMPOHamiltonian +``` + +## Jordan-block MPO tensors + +```@docs; canonical=false +JordanMPOTensor +``` + +## Operator algebra + +```@docs; canonical=false +MultipliedOperator +TimedOperator +UntimedOperator +LazySum +``` diff --git a/docs/src/lib/public.md b/docs/src/lib/public.md new file mode 100644 index 000000000..788c269d1 --- /dev/null +++ b/docs/src/lib/public.md @@ -0,0 +1,75 @@ +# [Public API](@id public_api) + +This page is the curated, stable public API surface of MPSKit — the symbols that are exported and intended for direct use. +Each entry links to its full docstring in the [Library](@ref lib_index) index. +The category reference pages ([States](@ref lib_states), [Operators](@ref lib_operators), [Ground-state algorithms](@ref lib_groundstate)) group the same docstrings by topic. + +!!! note + Anything not listed here (or marked internal in the [Library](@ref lib_index) index) is + not part of the public API and may change without notice. + +## States + +The matrix product state types — finite, infinite, windowed, and multi-line. + +[`FiniteMPS`](@ref), [`InfiniteMPS`](@ref), [`WindowMPS`](@ref), [`MultilineMPS`](@ref) + +## Operators and Hamiltonians + +Matrix product operators and Hamiltonians, finite and infinite, plus the wrappers used to build time-dependent and summed operators. + +[`AbstractMPO`](@ref), [`MPO`](@ref), [`FiniteMPO`](@ref), [`InfiniteMPO`](@ref), [`MultilineMPO`](@ref), [`MPOHamiltonian`](@ref), [`FiniteMPOHamiltonian`](@ref), [`InfiniteMPOHamiltonian`](@ref), [`JordanMPOTensor`](@ref), [`MultipliedOperator`](@ref), [`TimedOperator`](@ref), [`UntimedOperator`](@ref), [`LazySum`](@ref) + +## Environments + +The caches that store partially contracted tensor networks and are reused throughout the algorithms; see the concept page on [Environments](@ref concept_environments) for why they exist. + +[`environments`](@ref) + +## Ground states and boundaries + +The ground-state search and 2D leading-boundary interface, and the DMRG/VUMPS/IDMRG family of algorithms that implement it. + +[`find_groundstate`](@ref), [`leading_boundary`](@ref), [`approximate`](@ref), [`VUMPS`](@ref), [`VOMPS`](@ref), [`DMRG`](@ref), [`DMRG2`](@ref), [`IDMRG`](@ref), [`IDMRG2`](@ref), [`GradientGrassmann`](@ref) + +## Bond dimension + +Expanding or truncating a state's virtual spaces, and the algorithms that drive it. + +[`changebonds`](@ref), [`OptimalExpand`](@ref), [`RandExpand`](@ref), [`SvdCut`](@ref), [`VUMPSSvdCut`](@ref) + +## Time evolution + +Real- and imaginary-time evolution drivers and the algorithms and MPO approximations that implement them. + +[`time_evolve`](@ref), [`timestep`](@ref), [`make_time_mpo`](@ref), [`TDVP`](@ref), [`TDVP2`](@ref), [`WI`](@ref), [`WII`](@ref), [`TaylorCluster`](@ref) + +## Excitations + +The excitation interface and the quasiparticle-ansatz and finite-excited-state algorithms that produce excited states on top of a ground state. + +[`excitations`](@ref), [`FiniteExcited`](@ref), [`QuasiparticleAnsatz`](@ref), [`ChepigaAnsatz`](@ref), [`ChepigaAnsatz2`](@ref) + +## Linear problems and spectral functions + +Solving the MPS linear problems behind dynamical/spectral quantities, such as propagators and susceptibilities. + +[`propagator`](@ref), [`DynamicalDMRG`](@ref), [`NaiveInvert`](@ref), [`Jeckelmann`](@ref), [`exact_diagonalization`](@ref), [`fidelity_susceptibility`](@ref) + +## Observables and analysis + +Extracting physical quantities and analysis diagnostics from an MPS — expectation values, correlators, spectra, and entanglement. + +[`expectation_value`](@ref), [`correlator`](@ref), [`variance`](@ref), [`correlation_length`](@ref), [`marek_gap`](@ref), [`transfer_spectrum`](@ref), [`entropy`](@ref), [`entanglement_spectrum`](@ref) + +## Boundary conditions + +Converting an infinite MPO into a finite one of a given length, either wrapping it (periodic) or truncating it (open). + +[`open_boundary_conditions`](@ref), [`periodic_boundary_conditions`](@ref) + +## Utility + +Periodic and windowed array containers, virtual/physical space accessors, and a compact "braille" visualization of an MPO's sparsity structure. + +[`PeriodicArray`](@ref), [`PeriodicVector`](@ref), [`PeriodicMatrix`](@ref), [`WindowArray`](@ref), [`left_virtualspace`](@ref), [`right_virtualspace`](@ref), [`physicalspace`](@ref), [`braille`](@ref) diff --git a/docs/src/lib/states.md b/docs/src/lib/states.md new file mode 100644 index 000000000..dc7f14587 --- /dev/null +++ b/docs/src/lib/states.md @@ -0,0 +1,25 @@ +# [States](@id lib_states) + +Reference for the matrix product state types. +The full, canonical docstrings for the whole package live in the [Library](@ref lib_index) index. + +## Matrix product states + +```@docs; canonical=false +FiniteMPS +InfiniteMPS +WindowMPS +MultilineMPS +``` + +## Quasiparticle states + +Excitation ansätze produced by [`excitations`](@ref). +These behave as vectors and are normally obtained from `excitations` rather than constructed directly. + +```@docs; canonical=false +QP +LeftGaugedQP +RightGaugedQP +``` + diff --git a/docs/src/lib/time_evolution.md b/docs/src/lib/time_evolution.md new file mode 100644 index 000000000..254d6350d --- /dev/null +++ b/docs/src/lib/time_evolution.md @@ -0,0 +1,31 @@ +# [Time evolution](@id lib_time_evolution) + +Reference for the time-evolution drivers and algorithms. +For a task-oriented walkthrough see the how-to guides. +The full, canonical docstrings for the whole package live in the [Library](@ref lib_index) index. + +## Drivers + +```@docs; canonical=false +time_evolve +timestep +timestep! +``` + +## MPS time-evolution algorithms + +```@docs; canonical=false +TDVP +TDVP2 +``` + +## Time-evolution MPOs + +For evolving with an explicitly constructed propagator MPO, e.g. for an [`InfiniteMPS`](@ref), use [`make_time_mpo`](@ref) with one of the expansion algorithms below. + +```@docs; canonical=false +make_time_mpo +TaylorCluster +WI +WII +``` From 4319fc1a5b6f9f1bce27ff7bef40320dc8f61a1a Mon Sep 17 00:00:00 2001 From: lkdvos Date: Mon, 3 Aug 2026 13:10:46 -0400 Subject: [PATCH 6/8] docs: rewrite the landing page The old landing page was a short paragraph and a link list, which told a visitor nothing about whether the package solves their problem. It now leads with what MPSKit does, a runnable transverse-field Ising ground-state example, feature cards for the properties that actually differentiate it (symmetries, finite and infinite on the same footing, the algorithm coverage, performance), and pointers into the tutorial track. Co-Authored-By: Claude Opus 5 (1M context) --- docs/src/index.md | 278 +++++++++++++++++++--------------------------- 1 file changed, 112 insertions(+), 166 deletions(-) diff --git a/docs/src/index.md b/docs/src/index.md index dd86bb1ba..efbb2bb9b 100644 --- a/docs/src/index.md +++ b/docs/src/index.md @@ -6,14 +6,14 @@ layout: home hero: name: MPSKit.jl text: Matrix product states in Julia - tagline: Efficient and versatile tools for working with matrix product states + tagline: Finite and infinite systems through one interface, with abelian, non-abelian, fermionic, and anyonic symmetries built in. image: src: /logo.svg alt: MPSKit.jl actions: - theme: brand - text: Manual - link: /man/intro + text: Get started + link: /tutorials/installation - theme: alt text: Examples link: /examples/ @@ -22,211 +22,157 @@ hero: link: https://github.com/QuantumKitHub/MPSKit.jl features: - - icon: 🔗 - title: States - details: Construction and manipulation of finite and infinite Matrix Product States (MPS). - - icon: 📏 - title: Observables - details: Calculation of observables and expectation values. - - icon: 🎯 - title: Optimization - details: Various optimization methods for obtaining MPS fixed points. - - icon: ⚛️ - title: Symmetries - details: Support for a wide variety of symmetries, including Abelian, non-Abelian, fermionic and anyonic symmetries. + - icon: + src: /icons/finite-infinite.svg + alt: A finite chain above an infinite one + title: Finite & infinite, one interface + details: Run the same calculation on a finite chain or directly in the thermodynamic limit. FiniteMPS and InfiniteMPS share an API, so switching between them is a one-line change. + - icon: + src: /icons/symmetry.svg + alt: A symmetric hexagon + title: Every symmetry + details: Abelian, non-Abelian, fermionic, and anyonic symmetries out of the box via the TensorKit backend — smaller bond dimensions and exact quantum numbers. + - icon: + src: /icons/algorithms.svg + alt: An energy minimum + title: A complete algorithm suite + details: Ground states with DMRG, VUMPS, and IDMRG; real- and imaginary-time evolution with TDVP; and momentum-resolved excitations via the quasiparticle ansatz. + - icon: + src: /icons/fast.svg + alt: A lightning bolt + title: Fast by design + details: Type-stable code paths and deliberate allocation strategies keep calculations quick out of the box, and non-Abelian symmetries such as SU(2) shrink the tensors you store and contract. --- ``` -## Table of contents - -- [Prerequisites](@ref) -- [States](@ref um_states) -- [Operators](@ref um_operators) -- [Algorithms](@ref um_algorithms) -- [Parallelism in julia](@ref) -- [Lattices](@ref lattices) +MPSKit.jl simulates one-dimensional quantum many-body systems with matrix product states and operators, at finite size or directly in the thermodynamic limit. +Built on the [TensorKit.jl](https://github.com/Jutho/TensorKit.jl) tensor backend, it is aimed at researchers and students who want tensor-network calculations without reimplementing the underlying machinery. ## Installation -MPSKit.jl is a part of the general registry, and can be installed via the package manager -as: +MPSKit.jl is a part of the general registry. +Together with the packages used throughout this documentation, it can be installed via the +package manager as: ``` -pkg> add MPSKit +pkg> add MPSKit TensorKit MPSKitModels TensorKitTensors Plots ``` +- `MPSKit` provides the matrix product state and operator types, together with the + ground-state, time-evolution, and bond-dimension algorithms. +- `TensorKit` supplies the tensor backend (`TensorMap`s and vector spaces) that MPSKit is + built on; it also re-exports the `@tensor` macro for contracting tensors by hand, along + with truncation-scheme constructors such as `truncrank` (from MatrixAlgebraKit). +- `MPSKitModels` collects pre-defined Hamiltonians and local operators for common physical + models. +- `TensorKitTensors` provides ready-made local operators, such as the Pauli operators used throughout the documentation. +- `Plots` is used to visualize results in several of the how-to guides and examples. -## Usage - -To get started with MPSKit, we recommend also including -[TensorKit.jl](https://github.com/Jutho/TensorKit.jl) and -[MPSKitModels.jl](https://github.com/QuantumKitHub/MPSKitModels.jl). The former defines the -tensor backend which is used throughout MPSKit, while the latter includes some common -operators and models. +For a step-by-step walkthrough that sets up a dedicated environment and verifies the installation, see [Installation](@ref tutorial_installation). -```julia -using TensorOperations -using TensorKit -using MPSKit -using LinearAlgebra: norm -``` +## A first calculation -### Finite Matrix Product States +Almost every MPSKit calculation follows the same three steps: build a Hamiltonian, optimize a state, and read off observables. +The transverse-field Ising chain (TFIM) makes each step concrete in a few lines. -```@setup finitemps -using LinearAlgebra -using TensorOperations -using TensorKit -using MPSKit +```@raw html +A matrix product state: a chain of tensors joined by virtual bonds, each with a physical leg ``` -Finite MPS are characterised by a set of tensors, one for each site, which each have 3 legs. -They can be constructed by specifying the virtual spaces and the physical spaces, i.e. the -dimensions of each of the legs. These are then contracted to form the MPS. In MPSKit, they -are represented by `FiniteMPS`, which can be constructed either by passing in the tensors -directly, or by specifying the dimensions of the legs. +A matrix product state is a chain of tensors: the horizontal bonds carry the virtual indices, and the leg hanging off each site is its physical index. -```@example finitemps -d = 2 # physical dimension -D = 5 # virtual dimension -L = 10 # number of sites +### 1. Build a Hamiltonian -mps = FiniteMPS(L, ComplexSpace(d), ComplexSpace(D)) # random MPS with maximal bond dimension D -``` +MPO Hamiltonians are assembled directly from local operators, so an arbitrary model — not just the built-in ones — takes only a couple of lines. +Here the single-site Pauli operators come from TensorKitTensors, and the TFIM is a nearest-neighbour `σᶻσᶻ` coupling plus a transverse `σˣ` field: -The `FiniteMPS` object then handles the gauging of the MPS, which is necessary for many of -the algorithms. This is done automatically when needed, and the user can access the gauged -tensors by getting and setting the `AL`, `AR`, `CR`/`CL` and `AC` fields, which each -represent a vector of these tensors. +```@example index +using MPSKit, TensorKit +using TensorKitTensors.SpinOperators: σˣ, σᶻ -```@example finitemps -al = mps.AL[3] # left gauged tensor of the third site -@tensor E[a; b] := al[c, d, b] * conj(al[c, d, a]) -@show isapprox(E, id(right_virtualspace(mps, 3))) -``` -```@example finitemps -ar = mps.AR[3] # right gauged tensor of the third site -@tensor E[a; b] := ar[a, d, c] * conj(ar[b, d, c]) -@show isapprox(E, id(left_virtualspace(mps, 3))) +L = 16 +g = 0.5 +lattice = fill(ℂ^2, L) +H = FiniteMPOHamiltonian(lattice, (i, i + 1) => -(σᶻ() ⊗ σᶻ()) for i in 1:(L - 1)) + + FiniteMPOHamiltonian(lattice, (i,) => -g * σˣ() for i in 1:L) ``` -As the mps will be kept in a gauged form, updating a tensor will also update the gauged -tensors. For example, we can set the tensor of the third site to the identity, and the -gauged tensors will be updated accordingly. +See [Building Hamiltonians](@ref howto_hamiltonians) for infinite lattices, longer-range terms, and boundary conditions. -```@example finitemps -mps.C[3] = id(domain(mps.C[3])) -mps -``` +### 2. Optimize a state -These objects can then be used to compute observables and expectation values. For example, -the expectation value of the identity operator at the third site, which is equal to the norm -of the MPS, can be computed as: +Start from an initial [`FiniteMPS`](@ref) of bond dimension 16 and pass it, together with the Hamiltonian, to [`find_groundstate`](@ref). +The algorithm — here [`DMRG`](@ref) — is an ordinary argument, and its keywords (tolerance, iteration count, verbosity) tune the optimization: -```@example finitemps -N1 = LinearAlgebra.norm(mps) -N2 = expectation_value(mps, 3 => id(physicalspace(mps, 3))) -println("‖mps‖ = $N1") -println(" = $N2") +```@example index +ψ₀ = FiniteMPS(L, ℂ^2, ℂ^16) +ψ, envs, ϵ = find_groundstate(ψ₀, H, DMRG(; tol = 1e-10, verbosity = 0)) +ϵ # final convergence error ``` -Finally, the MPS can be optimized in order to determine groundstates of given Hamiltonians. -Using the pre-defined models in `MPSKitModels`, we can construct the ground state for the -transverse field Ising model: +Choosing a different optimizer such as [`VUMPS`](@ref), or raising the bond dimension, is a one-line change; see [Ground-state algorithms](@ref howto_groundstate_algorithms). -```@example finitemps -J = 1.0 -g = 0.5 -lattice = fill(ComplexSpace(2), 10) -X = TensorMap(ComplexF64[0 1; 1 0], ComplexSpace(2), ComplexSpace(2)) -Z = TensorMap(ComplexF64[1 0; 0 -1], space(X)) -H = FiniteMPOHamiltonian(lattice, (i, i+1) => -J * X ⊗ X for i in 1:length(lattice)-1) + - FiniteMPOHamiltonian(lattice, (i,) => - g * Z for i in 1:length(lattice)) -find_groundstate!(mps, H, DMRG(; maxiter=10)) -E0 = expectation_value(mps, H) -println(" = $real(E0)") -``` +### 3. Read off observables -### Infinite Matrix Product States +Expectation values are a single call. +The ground-state energy is just the Hamiltonian evaluated on the state: -```@setup infinitemps -using LinearAlgebra -using TensorOperations -using TensorKit -using MPSKit +```@example index +E = expectation_value(ψ, H) ``` -Similarly, an infinite MPS can be constructed by specifying the tensors for the unit cell, -characterised by the spaces (dimensions) thereof. +Local operators, correlators, and entanglement measures work the same way. +For instance, the von Neumann [`entropy`](@ref) across each bond traces out the entanglement profile of the chain: -```@example infinitemps -d = 2 # physical dimension -D = 5 # virtual dimension -mps = InfiniteMPS(d, D) # random MPS +```@example index +using Plots +S = [real(entropy(ψ, i)) for i in 1:(L - 1)] +plot( + 1:(L - 1), S; xlabel = "cut position", ylabel = "entanglement entropy", + marker = :circle, legend = false, title = "Entanglement across the chain" +) ``` -The `InfiniteMPS` object then handles the gauging of the MPS, which is necessary for many of -the algorithms. This is done automatically upon creation of the object, and the user can -access the gauged tensors by getting and setting the `AL`, `AR`, `C` and `AC` fields, -which each represent a (periodic) vector of these tensors. +See [Computing observables](@ref howto_observables) and [Entanglement entropy and spectrum](@ref howto_entanglement) for the full set, and [Your first ground state](@ref tutorial_first_groundstate) for a guided walkthrough of this calculation. -```@example infinitemps -al = mps.AL[1] # left gauged tensor of the first site -@tensor E[a; b] := al[c, d, b] * conj(al[c, d, a]) -@show isapprox(E, id(left_virtualspace(mps, 1))) -``` -```@example infinitemps -ar = mps.AR[1] # right gauged tensor of the first site -@tensor E[a; b] := ar[a, d, c] * conj(ar[b, d, c]) -@show isapprox(E, id(right_virtualspace(mps, 2))) -``` +## Beyond this example -As regauging the MPS is not possible without recomputing all the tensors, setting a single -tensor is not supported. Instead, the user should construct a new mps object with the -desired tensor, which will then be gauged upon construction. +The same three steps carry over to harder problems, usually by changing only the vector spaces or the state type: -```@example infinitemps -als = 3 .* mps.AL -mps = InfiniteMPS(als) -``` +- [**The thermodynamic limit**](@ref tutorial_thermodynamic_limit) works at infinite system size: replace `FiniteMPS` with an [`InfiniteMPS`](@ref) and `DMRG` with [`VUMPS`](@ref), and the rest of the code is unchanged. +- [**Using symmetries**](@ref tutorial_using_symmetries) imposes abelian or non-abelian symmetries by swapping the plain `ℂ^2` spaces for symmetric ones (for example an `SU2Space`), which also shrinks the bond dimension; see also the [Haldane gap](examples/excitations/0.haldane/index.md) example. +- [**The Hubbard model**](examples/groundstates/2.hubbard/index.md) treats fermions with the same machinery, through TensorKit's graded vector spaces. -These objects can then be used to compute observables and expectation values. For example, -the norm of the MPS, which is equal to the expectation value of the identity operator can be -computed by: +## Where next -```@example infinitemps -N1 = norm(mps) -N2 = expectation_value(mps, 1 => id(physicalspace(mps, 1))) -println("‖mps‖ = $N1") -println(" = $N2") -``` +- [**Installation**](@ref tutorial_installation) and [**Your first ground state**](@ref tutorial_first_groundstate) open the tutorial track, walking through complete calculations from scratch. +- [**How-to guides**](@ref howto_index) are focused recipes for a known task, such as [constructing states](@ref howto_states), [building Hamiltonians](@ref howto_hamiltonians), and [computing observables](@ref howto_observables). +- [**Concepts**](@ref concept_vector_spaces) explain the ideas behind the library, from [vector spaces and TensorKit](@ref concept_vector_spaces) through [matrix product states](@ref concept_matrix_product_states), [operators and Hamiltonians](@ref concept_operators_and_hamiltonians), and [the algorithm landscape](@ref concept_algorithm_landscape). +- [**The examples gallery**](examples/index.md) collects longer, fully worked case studies across symmetries, infinite systems, and less common algorithms. +- [**The public API**](@ref public_api) is the curated, stable entry point to the full library reference. -!!! note "Normalization of infinite MPS" - Because infinite MPS cannot sensibly be normalized to anything but $1$, the `norm` of - an infinite MPS is always set to be $1$ at construction. If this were not the case, any - observable computed from the MPS would either blow up to infinity or vanish to zero. +## Ecosystem -Finally, the MPS can be optimized in order to determine groundstates of given Hamiltonians. -There are plenty of pre-defined models in `MPSKitModels`, but we can also manually construct -the ground state for the transverse field Ising model: +MPSKit builds on [TensorKit.jl](https://github.com/Jutho/TensorKit.jl), which supplies the tensors and vector spaces and handles the symmetries. +Models and ready-made operators come from [MPSKitModels.jl](https://github.com/QuantumKitHub/MPSKitModels.jl) and [TensorKitTensors.jl](https://github.com/QuantumKitHub/TensorKitTensors.jl). +All of these are part of the [QuantumKitHub](https://github.com/QuantumKitHub) organization; the TensorKit documentation is available [here](https://quantumkithub.github.io/TensorKit.jl/stable/). -```@example infinitemps -J = 1.0 -g = 0.5 -lattice = PeriodicVector([ComplexSpace(2)]) -X = TensorMap(ComplexF64[0 1; 1 0], ComplexSpace(2), ComplexSpace(2)) -Z = TensorMap(ComplexF64[1 0; 0 -1], space(X)) -H = InfiniteMPOHamiltonian(lattice, (1, 2) => -J * X ⊗ X, (1,) => - g * Z) -mps, = find_groundstate(mps, H, VUMPS(; maxiter=10)) -E0 = expectation_value(mps, H) -println(" = $(sum(real(E0)) / length(mps))") -``` +## Community and support -### Additional Resources +Questions and general discussion are welcome on [GitHub Discussions](https://github.com/QuantumKitHub/MPSKit.jl/discussions); bug reports belong on the [issue tracker](https://github.com/QuantumKitHub/MPSKit.jl/issues). +If you would like to contribute, see [CONTRIBUTING.md](https://github.com/QuantumKitHub/MPSKit.jl/blob/main/CONTRIBUTING.md) on GitHub. -For more detailed information on the functionality and capabilities of MPSKit, refer to the -Manual section, or have a look at the [Examples](@ref) page. +## Citing MPSKit -Keep in mind that the documentation is still a work in progress, and that some features may -not be fully documented yet. If you encounter any issues or have questions, please check the -library's [issue tracker](https://github.com/QuantumKitHub/MPSKit.jl/issues) on the GitHub -repository and open a new issue. +If MPSKit.jl is useful for your research, please consider citing it — a citation is the most direct way to support the project and helps others find it. +The package is archived on Zenodo under the DOI [10.5281/zenodo.10654900](https://doi.org/10.5281/zenodo.10654900). +The [`CITATION.cff`](https://github.com/QuantumKitHub/MPSKit.jl/blob/main/CITATION.cff) file in the repository always holds the up-to-date metadata, or you can use the BibTeX entry below: +```bibtex +@software{mpskitjl, + author = {Devos, Lukas and Van Damme, Maarten and Haegeman, Jutho}, + title = {{MPSKit.jl}}, + version = {v0.13.13}, + doi = {10.5281/zenodo.10654900}, + url = {https://github.com/QuantumKitHub/MPSKit.jl}, + year = {2026} +} +``` From 331e03ea6f01488766b44e0d6b28c671b68288d0 Mon Sep 17 00:00:00 2001 From: lkdvos Date: Mon, 3 Aug 2026 13:12:11 -0400 Subject: [PATCH 7/8] docs: adapt to the trunc rename and the explicit normalize keyword MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These pages were drafted before #482, which renamed every `trscheme` keyword to `trunc` and split renormalization out of `imaginary_evolution` into its own `normalize` keyword. The rename is mechanical. The `normalize` change is not: the pages claimed that imaginary-time evolution renormalizes at every step so the norm stays at one, which is now false — `normalize` defaults to `false` and the norm is preserved in both real and imaginary time. Corrected where imaginary-time evolution is introduced, with the recipe page showing both behaviors. Co-Authored-By: Claude Opus 5 (1M context) --- docs/src/concepts/algorithm_landscape.md | 9 ++-- docs/src/concepts/numerics.md | 6 +-- docs/src/howto/bond_dimension.md | 48 +++++++++---------- docs/src/howto/convergence_troubleshooting.md | 4 +- docs/src/howto/groundstate_algorithms.md | 16 +++---- docs/src/howto/index.md | 6 +-- docs/src/howto/time_evolution.md | 22 ++++++--- 7 files changed, 61 insertions(+), 50 deletions(-) diff --git a/docs/src/concepts/algorithm_landscape.md b/docs/src/concepts/algorithm_landscape.md index 2827fa5da..4c7996786 100644 --- a/docs/src/concepts/algorithm_landscape.md +++ b/docs/src/concepts/algorithm_landscape.md @@ -12,15 +12,15 @@ It explains *why* you would pick one algorithm over another; for the *how* — t | Task | Finite system | Infinite system | |:-----|:--------------|:----------------| -| **Ground state** ([`find_groundstate`](@ref)) | [`DMRG`](@ref) (workhorse, fixed bond dimension); [`DMRG2`](@ref) (grows bond dimension, requires `trscheme`); [`GradientGrassmann`](@ref) (final polish) | [`VUMPS`](@ref) (workhorse, needs a unique ground state); [`IDMRG`](@ref) / [`IDMRG2`](@ref) (two-site requires `trscheme` and a unit cell of at least two sites); [`GradientGrassmann`](@ref) (final polish) | -| **Time evolution** ([`timestep`](@ref) / [`time_evolve`](@ref)) | [`TDVP`](@ref) (fixed bond dimension); [`TDVP2`](@ref) (grows bond dimension, requires `trscheme`); or [`make_time_mpo`](@ref) ([`WI`](@ref) / [`WII`](@ref) / [`TaylorCluster`](@ref)) applied with [`approximate`](@ref) | [`TDVP`](@ref) (no two-site variant exists); or [`make_time_mpo`](@ref) applied with [`approximate`](@ref) | +| **Ground state** ([`find_groundstate`](@ref)) | [`DMRG`](@ref) (workhorse, fixed bond dimension); [`DMRG2`](@ref) (grows bond dimension, requires `trunc`); [`GradientGrassmann`](@ref) (final polish) | [`VUMPS`](@ref) (workhorse, needs a unique ground state); [`IDMRG`](@ref) / [`IDMRG2`](@ref) (two-site requires `trunc` and a unit cell of at least two sites); [`GradientGrassmann`](@ref) (final polish) | +| **Time evolution** ([`timestep`](@ref) / [`time_evolve`](@ref)) | [`TDVP`](@ref) (fixed bond dimension); [`TDVP2`](@ref) (grows bond dimension, requires `trunc`); or [`make_time_mpo`](@ref) ([`WI`](@ref) / [`WII`](@ref) / [`TaylorCluster`](@ref)) applied with [`approximate`](@ref) | [`TDVP`](@ref) (no two-site variant exists); or [`make_time_mpo`](@ref) applied with [`approximate`](@ref) | | **Excitations** ([`excitations`](@ref)) | [`QuasiparticleAnsatz`](@ref) (the only one supporting charged `sector`s); [`FiniteExcited`](@ref) (penalty method); [`ChepigaAnsatz`](@ref) / [`ChepigaAnsatz2`](@ref) (cheap, from ground-state environments) | [`QuasiparticleAnsatz`](@ref) (momentum-resolved, the only choice) | | **Boundary / statistical mechanics** ([`leading_boundary`](@ref)) | apply the transfer MPO row by row with [`approximate`](@ref) | [`VUMPS`](@ref); [`VOMPS`](@ref) (power method); [`IDMRG`](@ref) / [`IDMRG2`](@ref); [`GradientGrassmann`](@ref) (hermitian, positive transfer matrices) | | **Compression / approximation** ([`approximate`](@ref), [`changebonds`](@ref)) | [`approximate`](@ref) with [`DMRG`](@ref) / [`DMRG2`](@ref); [`SvdCut`](@ref) via [`changebonds`](@ref) for local truncation | [`approximate`](@ref) with [`IDMRG`](@ref) / [`IDMRG2`](@ref) / [`VOMPS`](@ref); [`SvdCut`](@ref) via [`changebonds`](@ref) for local truncation | A few structural facts hold across the whole table and are worth internalizing early. -Every two-site algorithm (`DMRG2`, `IDMRG2`, `TDVP2`) requires an explicit `trscheme` keyword and can change the bond dimension as it runs; the single-site variants with their default settings cannot. +Every two-site algorithm (`DMRG2`, `IDMRG2`, `TDVP2`) requires an explicit `trunc` keyword and can change the bond dimension as it runs; the single-site variants with their default settings cannot. `IDMRG2` additionally needs a unit cell of at least two sites, and `TDVP2` exists only for finite MPS. Finally, algorithms compose: the `&` operator chains two algorithms into one, running the first to completion and handing its result to the second, which is how two-site warm-up passes and gradient-descent polishing stages are combined with a workhorse algorithm in a single call. @@ -42,7 +42,7 @@ Like DMRG, VUMPS is single-site and cannot alter the bond dimension. [`GradientGrassmann`](@ref) approaches the problem from a third direction: the MPS tensors form a Riemannian manifold (a Grassmann manifold), and one can run gradient descent directly on it, for finite and infinite states alike. Its niche is the tail of the optimization: close to convergence its rate is often the best of the lot, while far from convergence the sweeping algorithms tend to make faster progress. The practical consequence is the chaining pattern: run a cheap workhorse first, then hand over to gradient descent, e.g. `VUMPS(...) & GradientGrassmann(...)`. -This pattern is baked into `find_groundstate` itself: called with only keywords, it picks `DMRG` for a finite state and `VUMPS` for an infinite one, appends a `GradientGrassmann` stage on infinite states when the requested tolerance is tighter than `1e-4`, and prepends a two-site pass (`DMRG2` or `IDMRG2`) whenever you supply a `trscheme`. +This pattern is baked into `find_groundstate` itself: called with only keywords, it picks `DMRG` for a finite state and `VUMPS` for an infinite one, appends a `GradientGrassmann` stage on infinite states when the requested tolerance is tighter than `1e-4`, and prepends a two-site pass (`DMRG2` or `IDMRG2`) whenever you supply a `trunc`. Since gradient descent is also a single-site method, growing the bond dimension remains the job of that two-site pre-pass or of [`changebonds`](@ref). For call syntax, keyword tables, and worked chaining examples, see [Ground-state algorithms](@ref howto_groundstate_algorithms). @@ -59,6 +59,7 @@ The second route splits the problem in two: first approximate the evolution oper The appeal is amortization: for a time-independent Hamiltonian and a fixed step size the MPO is built once and reused for every step, and the accuracy of the operator approximation is controlled independently of the accuracy of its application. Both routes accept an `imaginary_evolution` keyword for evolution in imaginary time. +Renormalization is a separate concern, controlled by `normalize` (default `false`): left off, the norm is preserved and carries information — the accumulated truncation error in real time, the decaying weight in imaginary time — while `normalize = true` is what an imaginary-time ground-state search wants. For step-by-step recipes along either route, see [Time evolution](@ref howto_time_evolution). ## Excitations diff --git a/docs/src/concepts/numerics.md b/docs/src/concepts/numerics.md index dac47e3d9..541fa8763 100644 --- a/docs/src/concepts/numerics.md +++ b/docs/src/concepts/numerics.md @@ -43,7 +43,7 @@ discarded = sum(abs2, schmidt[7:end]) Performing that truncation with [`SvdCut`](@ref) through [`changebonds`](@ref) and comparing the energy before and after shows the corresponding cost in the observable of interest: ```@example numerics -ψcut = changebonds(ψ, SvdCut(; trscheme = truncrank(6))) +ψcut = changebonds(ψ, SvdCut(; trunc = truncrank(6))) ΔE = real(expectation_value(ψcut, H) - expectation_value(ψ, H, envs)) ``` @@ -62,11 +62,11 @@ The ones you will meet most often are: - `trunctol(; atol)` — discard every coefficient below a threshold. - `truncerror(; atol)` — keep as many coefficients as needed to hold the discarded weight below a target. - `truncspace(V)` — truncate to a prescribed vector space, used mostly internally to match bond spaces. -- `notrunc()` — keep everything; this is the default `trscheme` of the bond-preserving single-site algorithms. +- `notrunc()` — keep everything; this is the default `trunc` of the bond-preserving single-site algorithms. These schemes compose with `&`, so `trunctol(; atol = 1e-8) & truncrank(16)` applies both bounds at once. -Every bond-growing algorithm — [`DMRG2`](@ref), [`IDMRG2`](@ref), [`TDVP2`](@ref) — and every explicit bond-surgery tool — [`SvdCut`](@ref), [`OptimalExpand`](@ref) — requires a `trscheme` keyword, because their whole job is to decide a new bond dimension. +Every bond-growing algorithm — [`DMRG2`](@ref), [`IDMRG2`](@ref), [`TDVP2`](@ref) — and every explicit bond-surgery tool — [`SvdCut`](@ref), [`OptimalExpand`](@ref) — requires a `trunc` keyword, because their whole job is to decide a new bond dimension. The single-site workhorses ([`DMRG`](@ref), [`VUMPS`](@ref), [`TDVP`](@ref)) default to `notrunc()` and keep the bond dimension fixed. The recipes for growing and shrinking bonds live in [Controlling bond dimension](@ref howto_bond_dimension). diff --git a/docs/src/howto/bond_dimension.md b/docs/src/howto/bond_dimension.md index 4f41e2acf..18ed88ad4 100644 --- a/docs/src/howto/bond_dimension.md +++ b/docs/src/howto/bond_dimension.md @@ -53,7 +53,7 @@ dim(left_virtualspace(ψ_inf, 1)) [`RandExpand`](@ref) pads the MPS with orthogonal random vectors drawn from the two-site null space. It does **not** need the Hamiltonian, so it is cheap and works for any MPS type. -`trscheme` is **mandatory** and controls how many new directions are added. +`trunc` is **mandatory** and controls how many new directions are added. Use `truncrank(n)` from MatrixAlgebraKit (re-exported by TensorKit) to add at most `n` extra singular values: ```@example bond_dim @@ -62,7 +62,7 @@ dim(left_virtualspace(ψ_small, 5)) ``` ```@example bond_dim -ψ_grown = changebonds(ψ_small, RandExpand(; trscheme = truncrank(8))) +ψ_grown = changebonds(ψ_small, RandExpand(; trunc = truncrank(8))) dim(left_virtualspace(ψ_grown, 5)) # expanded, but ≤ 4 + 8 = 12 ``` @@ -72,7 +72,7 @@ For an `InfiniteMPS` the call is identical: ```@example bond_dim ψ_inf_small = InfiniteMPS(ℂ^2, ℂ^4) -ψ_inf_grown = changebonds(ψ_inf_small, RandExpand(; trscheme = truncrank(8))) +ψ_inf_grown = changebonds(ψ_inf_small, RandExpand(; trunc = truncrank(8))) dim(left_virtualspace(ψ_inf_grown, 1)) ``` @@ -90,7 +90,7 @@ Z = σᶻ() H = FiniteMPOHamiltonian(lattice, (i, i + 1) => -J * X ⊗ X for i in 1:(L - 1)) + FiniteMPOHamiltonian(lattice, (i,) => -g * Z for i in 1:L) -ψ_opt, envs_opt = changebonds(ψ_small, H, OptimalExpand(; trscheme = truncrank(8))) +ψ_opt, envs_opt = changebonds(ψ_small, H, OptimalExpand(; trunc = truncrank(8))) dim(left_virtualspace(ψ_opt, 5)) ``` @@ -101,7 +101,7 @@ The environment argument is optional and defaults to a freshly computed set: lattice_inf = PeriodicVector([ℂ^2]) H_inf = InfiniteMPOHamiltonian(lattice_inf, (1, 2) => -J * X ⊗ X, (1,) => -g * Z) -ψ_inf_opt, _ = changebonds(ψ_inf_small, H_inf, OptimalExpand(; trscheme = truncrank(8))) +ψ_inf_opt, _ = changebonds(ψ_inf_small, H_inf, OptimalExpand(; trunc = truncrank(8))) dim(left_virtualspace(ψ_inf_opt, 1)) ``` @@ -120,7 +120,7 @@ It does **not** need the Hamiltonian and is the standard tool for compression. ```@example bond_dim # compress ψ_grown (D up to 12) back to at most 6 singular values per bond -ψ_cut = changebonds(ψ_grown, SvdCut(; trscheme = truncrank(6))) +ψ_cut = changebonds(ψ_grown, SvdCut(; trunc = truncrank(6))) dim(left_virtualspace(ψ_cut, 5)) ``` @@ -129,14 +129,14 @@ It also accepts a `normalize` keyword (default `true`): ```@example bond_dim ψ_inplace = FiniteMPS(L, ℂ^2, ℂ^12) -changebonds!(ψ_inplace, SvdCut(; trscheme = truncrank(6)); normalize = true) +changebonds!(ψ_inplace, SvdCut(; trunc = truncrank(6)); normalize = true) dim(left_virtualspace(ψ_inplace, 5)) ``` `SvdCut` also works on `InfiniteMPS` (2-arg form only; no in-place variant): ```@example bond_dim -ψ_inf_cut = changebonds(ψ_inf_grown, SvdCut(; trscheme = truncrank(6))) +ψ_inf_cut = changebonds(ψ_inf_grown, SvdCut(; trunc = truncrank(6))) dim(left_virtualspace(ψ_inf_cut, 1)) ``` @@ -144,7 +144,7 @@ dim(left_virtualspace(ψ_inf_cut, 1)) ## 4. Truncation schemes -Every bond-change algorithm takes a mandatory `trscheme` keyword drawn from **MatrixAlgebraKit** (re-exported by TensorKit). +Every bond-change algorithm takes a mandatory `trunc` keyword drawn from **MatrixAlgebraKit** (re-exported by TensorKit). The main schemes are: | Scheme | Meaning | @@ -158,13 +158,13 @@ Schemes compose with `&` to apply multiple criteria simultaneously. For example, to keep at most 16 singular values **and** also drop anything below `1e-8`: ```@example bond_dim -trscheme_combined = trunctol(; atol = 1.0e-8) & truncrank(16) -ψ_combined = changebonds(ψ_grown, SvdCut(; trscheme = trscheme_combined)) +trunc_combined = trunctol(; atol = 1.0e-8) & truncrank(16) +ψ_combined = changebonds(ψ_grown, SvdCut(; trunc = trunc_combined)) dim(left_virtualspace(ψ_combined, 5)) ``` !!! warning - `trscheme` is **required** on every algorithm; there is no default. + `trunc` is **required** on every algorithm; there is no default. Omitting it will throw a `MethodError` at construction time. --- @@ -172,14 +172,14 @@ dim(left_virtualspace(ψ_combined, 5)) ## 5. Growing during finite MPS optimization The two-site DMRG variant, [`DMRG2`](@ref), performs a bond expansion at every sweep step by keeping both sites together in the update. -Pass `trscheme` to control which singular values are retained: +Pass `trunc` to control which singular values are retained: ```@example bond_dim ψ_dmrg2_start = FiniteMPS(L, ℂ^2, ℂ^2) # start small ψ_dmrg2, envs_dmrg2, _ = find_groundstate( ψ_dmrg2_start, H, - DMRG2(; trscheme = truncrank(16), maxiter = 5) + DMRG2(; trunc = truncrank(16), maxiter = 5) ) dim(left_virtualspace(ψ_dmrg2, 5)) ``` @@ -188,26 +188,26 @@ A common pattern is to warm up with `DMRG2` to grow the bond dimension, then ref The algorithm chaining operator `&` makes this easy (see [§7](#7-chaining-algorithms)): ```@example bond_dim -warmup_then_refine = DMRG2(; trscheme = truncrank(16), maxiter = 3) & +warmup_then_refine = DMRG2(; trunc = truncrank(16), maxiter = 3) & DMRG(; maxiter = 20) ψ_dmrg2, envs_dmrg2, _ = find_groundstate(ψ_dmrg2_start, H, warmup_then_refine) dim(left_virtualspace(ψ_dmrg2, 5)) ``` -The `find_groundstate` convenience function also accepts a `trscheme` keyword that triggers the same warm-up automatically: +The `find_groundstate` convenience function also accepts a `trunc` keyword that triggers the same warm-up automatically: ```@example bond_dim ψ_conv, envs_conv, _ = find_groundstate( ψ_dmrg2_start, H; - trscheme = truncrank(16), maxiter = 20 + trunc = truncrank(16), maxiter = 20 ) dim(left_virtualspace(ψ_conv, 5)) ``` -The `trscheme` keyword makes `find_groundstate` prepend a `DMRG2` pass before switching to the default `DMRG`. +The `trunc` keyword makes `find_groundstate` prepend a `DMRG2` pass before switching to the default `DMRG`. -TDVP2 also supports `trscheme` for two-site real- or imaginary-time evolution, but that is covered in the time-evolution documentation rather than here. +TDVP2 also supports `trunc` for two-site real- or imaginary-time evolution, but that is covered in the time-evolution documentation rather than here. --- @@ -236,7 +236,7 @@ H_inf_2 = InfiniteMPOHamiltonian( ψ_idmrg2, _, _ = find_groundstate( ψ_idmrg2_start, H_inf_2, - IDMRG2(; trscheme = truncrank(16), maxiter = 5) + IDMRG2(; trunc = truncrank(16), maxiter = 5) ) dim(left_virtualspace(ψ_idmrg2, 1)) ``` @@ -247,7 +247,7 @@ dim(left_virtualspace(ψ_idmrg2, 1)) It requires the Hamiltonian and returns a new state with updated environments: ```@example bond_dim -ψ_vs, _ = changebonds(ψ_inf_small, H_inf, VUMPSSvdCut(; trscheme = truncrank(16))) +ψ_vs, _ = changebonds(ψ_inf_small, H_inf, VUMPSSvdCut(; trunc = truncrank(16))) dim(left_virtualspace(ψ_vs, 1)) ``` @@ -272,8 +272,8 @@ This works for both ground-state algorithms and `changebonds` algorithms: ```@example bond_dim # Expand with random vectors, then compress to a target rank -grow_and_cut = RandExpand(; trscheme = truncrank(12)) & - SvdCut(; trscheme = truncrank(6)) +grow_and_cut = RandExpand(; trunc = truncrank(12)) & + SvdCut(; trunc = truncrank(6)) ψ_final = changebonds(ψ_small, grow_and_cut) dim(left_virtualspace(ψ_final, 5)) @@ -282,7 +282,7 @@ dim(left_virtualspace(ψ_final, 5)) ```@example bond_dim # Alternatively: combine changebonds with a ground-state algorithm ψ_expanded, envs_expanded = changebonds( - ψ_small, H, OptimalExpand(; trscheme = truncrank(8)) + ψ_small, H, OptimalExpand(; trunc = truncrank(8)) ) ψ_gs, _, _ = find_groundstate(ψ_expanded, H, DMRG(; maxiter = 10), envs_expanded) dim(left_virtualspace(ψ_gs, 5)) diff --git a/docs/src/howto/convergence_troubleshooting.md b/docs/src/howto/convergence_troubleshooting.md index c8deee887..d5372f5ce 100644 --- a/docs/src/howto/convergence_troubleshooting.md +++ b/docs/src/howto/convergence_troubleshooting.md @@ -177,7 +177,7 @@ Things to try, roughly in order: what it represents, giving the next optimization new directions to explore: ```@example conv - ψ_noisy = changebonds(ψ_small, RandExpand(; trscheme = truncrank(8))) + ψ_noisy = changebonds(ψ_small, RandExpand(; trunc = truncrank(8))) ψ_kick, _, ϵ_kick = find_groundstate( ψ_noisy, H, DMRG(; tol = 1.0e-10, maxiter = 100, verbosity = 0) ) @@ -272,7 +272,7 @@ The knobs are different: [`make_time_mpo`](@ref) with [`WII`](@ref)/[`TaylorCluster`](@ref)) Trotter-type error. - **Bond dimension.** Real-time evolution grows entanglement, so a fixed bond dimension eventually cannot follow the state. - Use the two-site [`TDVP2`](@ref) (which takes a `trscheme`) or a CBE-enabled + Use the two-site [`TDVP2`](@ref) (which takes a `trunc`) or a CBE-enabled [`TDVP`](@ref) to let the bond dimension grow during evolution. See [Time evolution](@ref howto_time_evolution) for the full time-evolution interface. diff --git a/docs/src/howto/groundstate_algorithms.md b/docs/src/howto/groundstate_algorithms.md index 98124df19..362ee8a76 100644 --- a/docs/src/howto/groundstate_algorithms.md +++ b/docs/src/howto/groundstate_algorithms.md @@ -39,13 +39,13 @@ H_inf = transverse_field_ising(; g = 0.5) ϵ_inf ``` -Passing a `trscheme` keyword switches on a two-site pre-pass that can grow the bond dimension before the single-site algorithm takes over. +Passing a `trunc` keyword switches on a two-site pre-pass that can grow the bond dimension before the single-site algorithm takes over. On a `FiniteMPS` this prepends [`DMRG2`](@ref); on an `InfiniteMPS` it prepends [`IDMRG2`](@ref) (which needs a unit cell of at least two sites, see [§3](#3-configure-infinite-system-algorithms)). ```@example groundstate_algs ψ_auto, envs_auto, ϵ_auto = find_groundstate( ψ₀, H; - trscheme = truncrank(16), verbosity = 0 + trunc = truncrank(16), verbosity = 0 ) ϵ_auto ``` @@ -70,12 +70,12 @@ Pass a [`DMRG`](@ref) struct explicitly to set `tol`, `maxiter`, and `verbosity` `DMRG` updates one site at a time, so with its defaults it cannot change the bond dimension: whatever bond dimension `ψ₀` starts with is what it keeps. [`DMRG2`](@ref) optimizes two sites at once and truncates back down, which lets it grow (or shrink) the bond dimension as it sweeps, at extra cost per step. -Unlike `DMRG`, `DMRG2` has no default truncation scheme, so `trscheme` is required: +Unlike `DMRG`, `DMRG2` has no default truncation scheme, so `trunc` is required: ```@example groundstate_algs ψ_dmrg2, envs_dmrg2, ϵ_dmrg2 = find_groundstate( ψ₀, H, - DMRG2(; trscheme = truncrank(16), maxiter = 5, verbosity = 0) + DMRG2(; trunc = truncrank(16), maxiter = 5, verbosity = 0) ) ϵ_dmrg2 ``` @@ -84,14 +84,14 @@ A common pattern is to warm up with `DMRG2` to grow the bond dimension, then ref The `&` chaining operator runs the first algorithm to completion, then feeds its result into the second: ```@example groundstate_algs -warmup_then_refine = DMRG2(; trscheme = truncrank(16), maxiter = 3, verbosity = 0) & +warmup_then_refine = DMRG2(; trunc = truncrank(16), maxiter = 3, verbosity = 0) & DMRG(; tol = 1.0e-8, maxiter = 30, verbosity = 0) ψ_c, envs_c, ϵ_c = find_groundstate(ψ₀, H, warmup_then_refine) ϵ_c ``` -For more on choosing `trscheme` and growing bond dimension in general, see [Controlling bond dimension](@ref howto_bond_dimension). +For more on choosing `trunc` and growing bond dimension in general, see [Controlling bond dimension](@ref howto_bond_dimension). --- @@ -119,7 +119,7 @@ For more on choosing `trscheme` and growing bond dimension in general, see [Cont In practice, prefer `VUMPS` unless you specifically need `IDMRG`'s ability to change the bond dimension one site at a time. -[`IDMRG2`](@ref) is the two-site, bond-dimension-changing variant, and mirrors `DMRG2`: `trscheme` is required, and it needs a unit cell of at least two sites. +[`IDMRG2`](@ref) is the two-site, bond-dimension-changing variant, and mirrors `DMRG2`: `trunc` is required, and it needs a unit cell of at least two sites. !!! warning "Unit cell size" `IDMRG2` throws an `ArgumentError` on a single-site `InfiniteMPS`. @@ -143,7 +143,7 @@ H_inf_2 = InfiniteMPOHamiltonian( ψ_i2, envs_i2, ϵ_i2 = find_groundstate( ψ₀_2, H_inf_2, - IDMRG2(; trscheme = truncrank(16), maxiter = 5, verbosity = 0) + IDMRG2(; trunc = truncrank(16), maxiter = 5, verbosity = 0) ) ϵ_i2 ``` diff --git a/docs/src/howto/index.md b/docs/src/howto/index.md index 909df5151..380840326 100644 --- a/docs/src/howto/index.md +++ b/docs/src/howto/index.md @@ -33,7 +33,7 @@ Each recipe below stands on its own, so feel free to jump straight to the one yo - Growing bond dimension — `RandExpand` (no Hamiltonian needed) and `OptimalExpand`. - Reducing bond dimension — `SvdCut` and the in-place `changebonds!`. - Truncation schemes — `truncrank`, `trunctol`, `notrunc`, `truncspace`, and combining them with `&`. -- Growing during finite MPS optimization — `DMRG2` and the `trscheme` keyword of `find_groundstate`. +- Growing during finite MPS optimization — `DMRG2` and the `trunc` keyword of `find_groundstate`. - Growing during infinite MPS optimization — `IDMRG2` and `VUMPSSvdCut`. - Chaining algorithms — composing bond-change and ground-state algorithms with `&`. @@ -42,9 +42,9 @@ Each recipe below stands on its own, so feel free to jump straight to the one yo **[Time evolution](@ref howto_time_evolution)** — real- and imaginary-time evolution of an MPS. - Evolve a state through one time step — `timestep` with `TDVP`. - Evolve over a time span — `time_evolve` across a vector of time points. -- Grow the bond dimension while evolving — `TDVP2` with a mandatory `trscheme`. +- Grow the bond dimension while evolving — `TDVP2` with a mandatory `trunc`. - Evolve an infinite state — single-site `TDVP` on an `InfiniteMPS`. -- Imaginary-time evolution — `imaginary_evolution = true` to cool towards the ground state. +- Imaginary-time evolution — `imaginary_evolution = true` to cool towards the ground state, with `normalize = true` to keep the state normalized. - Build a time-evolution MPO — `make_time_mpo` (`WII`, `TaylorCluster`, `WI`) plus `approximate`. ## Measurements diff --git a/docs/src/howto/time_evolution.md b/docs/src/howto/time_evolution.md index f6d85c450..91129a655 100644 --- a/docs/src/howto/time_evolution.md +++ b/docs/src/howto/time_evolution.md @@ -65,10 +65,10 @@ There is no exported `time_evolve!`; use `time_evolve` and rebind the result. Single-site `TDVP` cannot change the bond dimension: whatever `ψ₀` starts with is what it keeps. After a quench, entanglement typically grows and a fixed bond dimension eventually becomes insufficient. [`TDVP2`](@ref) updates two sites at a time and truncates back down, so it can grow (or shrink) the bond dimension as it evolves. -Unlike `TDVP`, `TDVP2` requires `trscheme` — there is no default: +Unlike `TDVP`, `TDVP2` requires `trunc` — there is no default: ```@example time_evo -ψ_tdvp2, envs_tdvp2 = timestep(ψ₀, H₁, 0.0, dt, TDVP2(; trscheme = truncrank(16))) +ψ_tdvp2, envs_tdvp2 = timestep(ψ₀, H₁, 0.0, dt, TDVP2(; trunc = truncrank(16))) dim(left_virtualspace(ψ_tdvp2, 4)) ``` @@ -105,9 +105,19 @@ Passing `imaginary_evolution = true` evolves under `exp(-H dt)` instead of `exp( norm(ψ_im) ``` -Imaginary-time evolution renormalizes the state at every step, so `norm(ψ_im)` stays `1` regardless of how the un-normalized weight would otherwise change. -Repeated imaginary-time steps damp excited-state components faster than the ground state, so this is often used as a (slower) alternative to `find_groundstate` for driving a state towards the ground state of `H₁`. -`time_evolve` accepts the same `imaginary_evolution` keyword for a span of imaginary-time steps. +The norm is *not* renormalized by default, so `norm(ψ_im)` carries the decaying weight of the un-normalized state rather than staying at `1`. +Pass `normalize = true` to renormalize after every step: + +```@example time_evo +ψ_norm, = timestep(ψ₀, H₁, 0.0, dt, TDVP(); imaginary_evolution = true, normalize = true) +norm(ψ_norm) +``` + +Repeated imaginary-time steps damp excited-state components faster than the ground state, so this is often used as a (slower) alternative to `find_groundstate` for driving a state towards the ground state of `H₁` — and that is the case where `normalize = true` is wanted, since otherwise the state's weight decays away. +`time_evolve` accepts both keywords for a span of imaginary-time steps. + +!!! note "`normalize` is independent of `imaginary_evolution`" + Renormalization used to be tied to imaginary time. It is now a separate `normalize` keyword defaulting to `false`, so the norm is preserved in both real and imaginary time — in real time it accumulates the truncation error, and in imaginary time it holds the decaying weight. --- @@ -137,7 +147,7 @@ Applying the MPO to a finite state uses [`approximate`](@ref) with a finite grou ```@example time_evo ψ_mpo, envs_mpo, ϵ_mpo = approximate( - ψ₀, (O, ψ₀), DMRG2(; trscheme = truncrank(16), verbosity = 0) + ψ₀, (O, ψ₀), DMRG2(; trunc = truncrank(16), verbosity = 0) ) expectation_value(ψ_mpo, 4 => σᶻ()) ``` From 9c884ca94b0c6ebd94e6e48afc3f0d437a844b86 Mon Sep 17 00:00:00 2001 From: lkdvos Date: Mon, 3 Aug 2026 13:17:08 -0400 Subject: [PATCH 8/8] docs: cover the BUG integrator and Zipup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both landed after these pages were drafted, and the pages enumerate the time-evolution options, so leaving them out would have shipped a listing that is wrong by omission. `BUG` (#468) gets a how-to recipe, a paragraph in the algorithm landscape, and a row in the decision table. Two things are worth stating explicitly and are easy to get wrong from the name alone: it is the one single-site integrator that can change bond dimension, and a `truncrank(D)` leaves the state at `2D`, because each half-sweep only truncates the previous one's basis augmentation — so a follow-up `SvdCut` is needed to actually land on `D`. `Zipup` (#470) is documented alongside the propagator-MPO route it belongs to, including the two API differences from the variational path: no initial guess, and a 2-tuple return. It is not mentioned on the statistical-mechanics page, since it is finite open-boundary only. `approximate`/`approximate!` had no topical reference home at all; they now live on the time-evolution reference page next to `Zipup`. Co-Authored-By: Claude Opus 5 (1M context) --- docs/src/concepts/algorithm_landscape.md | 10 ++++- docs/src/howto/index.md | 3 +- docs/src/howto/time_evolution.md | 47 +++++++++++++++++++++++- docs/src/lib/time_evolution.md | 12 ++++++ 4 files changed, 68 insertions(+), 4 deletions(-) diff --git a/docs/src/concepts/algorithm_landscape.md b/docs/src/concepts/algorithm_landscape.md index 4c7996786..d57e3114b 100644 --- a/docs/src/concepts/algorithm_landscape.md +++ b/docs/src/concepts/algorithm_landscape.md @@ -13,14 +13,15 @@ It explains *why* you would pick one algorithm over another; for the *how* — t | Task | Finite system | Infinite system | |:-----|:--------------|:----------------| | **Ground state** ([`find_groundstate`](@ref)) | [`DMRG`](@ref) (workhorse, fixed bond dimension); [`DMRG2`](@ref) (grows bond dimension, requires `trunc`); [`GradientGrassmann`](@ref) (final polish) | [`VUMPS`](@ref) (workhorse, needs a unique ground state); [`IDMRG`](@ref) / [`IDMRG2`](@ref) (two-site requires `trunc` and a unit cell of at least two sites); [`GradientGrassmann`](@ref) (final polish) | -| **Time evolution** ([`timestep`](@ref) / [`time_evolve`](@ref)) | [`TDVP`](@ref) (fixed bond dimension); [`TDVP2`](@ref) (grows bond dimension, requires `trunc`); or [`make_time_mpo`](@ref) ([`WI`](@ref) / [`WII`](@ref) / [`TaylorCluster`](@ref)) applied with [`approximate`](@ref) | [`TDVP`](@ref) (no two-site variant exists); or [`make_time_mpo`](@ref) applied with [`approximate`](@ref) | +| **Time evolution** ([`timestep`](@ref) / [`time_evolve`](@ref)) | [`TDVP`](@ref) (fixed bond dimension); [`TDVP2`](@ref) (grows bond dimension, requires `trunc`); [`BUG`](@ref) (rank-adaptive with a truncating `trunc`); or [`make_time_mpo`](@ref) ([`WI`](@ref) / [`WII`](@ref) / [`TaylorCluster`](@ref)) applied with [`approximate`](@ref) | [`TDVP`](@ref) (no two-site variant exists); or [`make_time_mpo`](@ref) applied with [`approximate`](@ref) | | **Excitations** ([`excitations`](@ref)) | [`QuasiparticleAnsatz`](@ref) (the only one supporting charged `sector`s); [`FiniteExcited`](@ref) (penalty method); [`ChepigaAnsatz`](@ref) / [`ChepigaAnsatz2`](@ref) (cheap, from ground-state environments) | [`QuasiparticleAnsatz`](@ref) (momentum-resolved, the only choice) | | **Boundary / statistical mechanics** ([`leading_boundary`](@ref)) | apply the transfer MPO row by row with [`approximate`](@ref) | [`VUMPS`](@ref); [`VOMPS`](@ref) (power method); [`IDMRG`](@ref) / [`IDMRG2`](@ref); [`GradientGrassmann`](@ref) (hermitian, positive transfer matrices) | -| **Compression / approximation** ([`approximate`](@ref), [`changebonds`](@ref)) | [`approximate`](@ref) with [`DMRG`](@ref) / [`DMRG2`](@ref); [`SvdCut`](@ref) via [`changebonds`](@ref) for local truncation | [`approximate`](@ref) with [`IDMRG`](@ref) / [`IDMRG2`](@ref) / [`VOMPS`](@ref); [`SvdCut`](@ref) via [`changebonds`](@ref) for local truncation | +| **Compression / approximation** ([`approximate`](@ref), [`changebonds`](@ref)) | [`approximate`](@ref) with [`DMRG`](@ref) / [`DMRG2`](@ref), or [`Zipup`](@ref) for a single-sweep MPO–MPS product; [`SvdCut`](@ref) via [`changebonds`](@ref) for local truncation | [`approximate`](@ref) with [`IDMRG`](@ref) / [`IDMRG2`](@ref) / [`VOMPS`](@ref); [`SvdCut`](@ref) via [`changebonds`](@ref) for local truncation | A few structural facts hold across the whole table and are worth internalizing early. Every two-site algorithm (`DMRG2`, `IDMRG2`, `TDVP2`) requires an explicit `trunc` keyword and can change the bond dimension as it runs; the single-site variants with their default settings cannot. +`BUG` is the exception on the single-site side: it defaults to no truncation, but given a truncating `trunc` it becomes rank-adaptive. `IDMRG2` additionally needs a unit cell of at least two sites, and `TDVP2` exists only for finite MPS. Finally, algorithms compose: the `&` operator chains two algorithms into one, running the first to completion and handing its result to the second, which is how two-site warm-up passes and gradient-descent polishing stages are combined with a workhorse algorithm in a single call. @@ -55,6 +56,11 @@ The first route, [`TDVP`](@ref), never builds the evolution operator at all. It projects the Schrödinger equation onto the tangent space of the current MPS, solves the projected equation for a small time step, and repeats. Its two-site variant [`TDVP2`](@ref) plays the same role as `DMRG2` does for `DMRG`: it lets the bond dimension grow to absorb the entanglement generated by the evolution, at extra cost, and it exists only for finite systems. +[`BUG`](@ref) is a third option on that same route, also finite-only. +It is a single-site integrator built on the Basis-Update & Galerkin scheme [ceruti2022](@cite), and its distinguishing feature is structural: it advances the basis and the core tensor both *forward* in time, with none of the backward-in-time substep that projector splitting gives `TDVP`. +That backward step is what can misbehave at large imaginary-time steps, so `BUG` is the more natural choice for dissipative evolution. +Given a truncating `trunc` it is rank-adaptive, letting the bond dimension follow the entanglement rather than being fixed in advance — at the cost of ending each sweep at twice the requested rank, since the basis augmentation of one half-sweep is only truncated by the next. + The second route splits the problem in two: first approximate the evolution operator ``\exp(-iH\,dt)`` itself as an MPO using [`make_time_mpo`](@ref) — with [`WI`](@ref), [`WII`](@ref), or [`TaylorCluster`](@ref) as the approximation scheme — and then apply that MPO to the state with [`approximate`](@ref). The appeal is amortization: for a time-independent Hamiltonian and a fixed step size the MPO is built once and reused for every step, and the accuracy of the operator approximation is controlled independently of the accuracy of its application. diff --git a/docs/src/howto/index.md b/docs/src/howto/index.md index 380840326..b8fcac55f 100644 --- a/docs/src/howto/index.md +++ b/docs/src/howto/index.md @@ -45,7 +45,8 @@ Each recipe below stands on its own, so feel free to jump straight to the one yo - Grow the bond dimension while evolving — `TDVP2` with a mandatory `trunc`. - Evolve an infinite state — single-site `TDVP` on an `InfiniteMPS`. - Imaginary-time evolution — `imaginary_evolution = true` to cool towards the ground state, with `normalize = true` to keep the state normalized. -- Build a time-evolution MPO — `make_time_mpo` (`WII`, `TaylorCluster`, `WI`) plus `approximate`. +- Let the bond dimension adapt — `BUG` with a truncating `trunc`. +- Build a time-evolution MPO — `make_time_mpo` (`WII`, `TaylorCluster`, `WI`) plus `approximate`, or `Zipup` for a single-sweep application. ## Measurements diff --git a/docs/src/howto/time_evolution.md b/docs/src/howto/time_evolution.md index 91129a655..ef80595a2 100644 --- a/docs/src/howto/time_evolution.md +++ b/docs/src/howto/time_evolution.md @@ -121,7 +121,29 @@ Repeated imaginary-time steps damp excited-state components faster than the grou --- -## 6. Build a time-evolution MPO +## 6. Let the bond dimension adapt with `BUG` + +[`BUG`](@ref) is a single-site integrator for finite MPS that, unlike [`TDVP`](@ref), advances both the basis and the core tensor *forward* in time — it has no backward-in-time substep, which is what makes `TDVP`'s core step awkward at large imaginary-time steps. +Passing a truncating `trunc` makes it rank-adaptive, so the bond dimension tracks the entanglement instead of being fixed up front: + +```@example time_evo +ψ_bug, envs_bug = timestep(ψ₀, H₁, 0.0, dt, BUG(; trunc = truncrank(8))) +maximum(i -> dim(left_virtualspace(ψ_bug, i)), 1:length(ψ_bug)) +``` + +!!! warning "`truncrank(D)` leaves a state of dimension `2D`" + Each local update truncates the bond *ahead* of it and then augments the basis with the newly discovered directions without truncating, so the augmentation of one half-sweep is what the next half-sweep truncates. A `truncrank(D)` therefore ends the sweep at dimension `2D`. To come back down to `D`, follow up with [`changebonds`](@ref) and an [`SvdCut`](@ref): + + ```@example time_evo + ψ_bug_cut = changebonds(ψ_bug, SvdCut(; trunc = truncrank(8))) + ``` + +`BUG` is finite-only; there is no `InfiniteMPS` method. +Like the other integrators it leaves the norm alone unless you pass `normalize = true`. + +--- + +## 7. Build a time-evolution MPO When `H` is time-independent and `dt` is fixed, an alternative to repeated `timestep` calls is to build the evolution operator once as an MPO with [`make_time_mpo`](@ref), then apply it repeatedly with [`approximate`](@ref). @@ -155,6 +177,29 @@ expectation_value(ψ_mpo, 4 => σᶻ()) Repeat the `approximate` call with the same `O` for successive time steps to build up a longer evolution. Imaginary-time MPOs are built the same way, by passing `imaginary_evolution = true` to `make_time_mpo`; a real `dt` is promoted internally, so no manual complex conversion is needed. +### A cheaper alternative, with a caveat + +[`Zipup`](@ref) approximates a finite MPO–MPS product in a single sweep instead of optimizing variationally: it contracts one site at a time and truncates the enlarged bond immediately. +It needs no initial guess, so the state is passed only as the operand, and it returns just `(ψ, ϵ)` rather than the variational 3-tuple. +The call shape, on an MPO built from plain tensors: + +```@example time_evo +Vs = [oneunit(ℂ^3); fill(ℂ^3, L - 1); oneunit(ℂ^3)] +O_plain = FiniteMPO([rand(ComplexF64, Vs[i] ⊗ ℂ^2 ← ℂ^2 ⊗ Vs[i + 1]) for i in 1:L]) + +ψ_zip, ϵ_zip = approximate((O_plain, ψ₀), Zipup(; trunc = truncrank(16))) +ϵ_zip +``` + +Following [paeckel2019](@cite), a sharper result for a target bond dimension comes from zipping up permissively and imposing the final truncation on the way back, which `trunc` accepts as a tuple: + +```@example time_evo +ψ_zip2, ϵ_zip2 = approximate((O_plain, ψ₀), Zipup(; trunc = (truncrank(32), truncrank(16)))) +ϵ_zip2 +``` + +`Zipup` is for finite, open-boundary MPO–MPS products only. + --- ## Where to go next diff --git a/docs/src/lib/time_evolution.md b/docs/src/lib/time_evolution.md index 254d6350d..1bc598db6 100644 --- a/docs/src/lib/time_evolution.md +++ b/docs/src/lib/time_evolution.md @@ -17,6 +17,7 @@ timestep! ```@docs; canonical=false TDVP TDVP2 +BUG ``` ## Time-evolution MPOs @@ -29,3 +30,14 @@ TaylorCluster WI WII ``` + +## MPO–MPS products + +Applying an MPO to a state — a propagator MPO among others — goes through [`approximate`](@ref). +The variational algorithms ([`DMRG2`](@ref) and friends) treat the destination as an initial guess, whereas [`Zipup`](@ref) sweeps the product out in one pass and needs none. + +```@docs; canonical=false +approximate +approximate! +Zipup +```