import%20marimo%0A%0A__generated_with%20%3D%20%220.10.19%22%0Aapp%20%3D%20marimo.App(%0A%20%20%20%20width%3D%22medium%22%2C%0A%20%20%20%20app_title%3D%22Spenso%22%2C%0A%20%20%20%20layout_file%3D%22layouts%2Fspenso.slides.json%22%2C%0A%20%20%20%20css_file%3D%22custom.css%22%2C%0A)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20symbolica_community%0A%20%20%20%20from%20symbolica_community.tensors%20import%20(%0A%20%20%20%20%20%20%20%20TensorStructure%2C%0A%20%20%20%20%20%20%20%20TensorIndices%2C%0A%20%20%20%20%20%20%20%20Tensor%2C%0A%20%20%20%20)%0A%20%20%20%20import%20random%0A%20%20%20%20import%20timeit%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20Tensor%2C%0A%20%20%20%20%20%20%20%20TensorIndices%2C%0A%20%20%20%20%20%20%20%20TensorStructure%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20random%2C%0A%20%20%20%20%20%20%20%20symbolica_community%2C%0A%20%20%20%20%20%20%20%20timeit%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Spenso%3A%20Compiled%20Concrete%20Contractions%0A%20%20%20%20%20%20%20%20%23%23%20A%20rust-based%20framework%20for%20symbolic%20and%20numerical%20tensor%20computation%0A%20%20%20%20%20%20%20%20Lucien%20Huber%0A%0A%20%20%20%20%20%20%20%20Bern%20University%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Outline%0A%0A%20%20%20%20%20%20%20%201.%20Motivation%0A%20%20%20%20%20%20%20%202.%20Walk-Through%20%2F%20Tutorial%20%0A%20%20%20%20%20%20%20%203.%20Real%20world%20example%20(ALOHA%20and%20beyond)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%3Cbr%3E%0A%20%20%20%20%20%20%20%20%3Cbr%3E%0A%20%20%20%20%20%20%20%20%3Cbr%3E%0A%20%20%20%20%20%20%20%20%3Cbr%3E%0A%20%20%20%20%20%20%20%20Tensors%20are%20pervasive%20in%20High%20Energy%20Physics.%0A%0A%20%20%20%20%20%20%20%20We%20wanted%20a%20library%20that%20implements%20tensor%20contractions%2C%20and%20arithmetic%2C%20component%20wise%20and%20synergises%20well%20with%20symbolica.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20It%20already%20exists%2C%20no%3F%0A%0A%20%20%20%20%20%20%20%20Not%20really%0A%0A%20%20%20%20%20%20%20%20-%20Mathematica%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20Too%20slow%0A%20%20%20%20%20%20%20%20-%20NDarray%20(Rust)%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20Wanted%20Einstein%2FAbstract%20Index%20notation%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20Needed%20Generic%20Dimensions%20(FD%20gauge!)%0A%20%20%20%20%20%20%20%20-%20cuTensorNet%20(CUDA)%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20Support%20for%20non-euclidean%20metric%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20Physical%20indices%0A%20%20%20%20%20%20%20%20-%20ITensors.jl%20(Julia%2FC%2B%2B)%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20Wanted%20Rust%20(for%20LU%2Fgammaloop)%2C%20zero-cost%20abstractions%20FTW%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20Does%20not%20talk%20Symbolica%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20title%20%3D%20mo.md(r%22%22%22%23%20Introducing%20Spenso%22%22%22)%0A%20%20%20%20logo%20%3D%20mo.Html(%0A%20%20%20%20%20%20%20%20f'%3Cimg%20src%3D%22public%2Fspensologo.svg%22%2C%20width%3D%22400%22%2F%3E'%0A%20%20%20%20).center()%0A%20%20%20%20body%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20-%20Provides%20two%20data%20storage%20layouts%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20Dense%20(flat%20vector)%0A%20%20%20%20%20%20%20%20%20%20%20%20-%20Sparse%20(hashmap%20based)%0A%0A%20%20%20%20%20%20%20%20-%20The%20components%20can%20be%20any%20type%0A%20%20%20%20%20%20%20%20%20%20-%20Crucially%20Symbolica%20%60Atom%60%0A%20%20%20%20%20%20%20%20-%20Can%20create%20tensor%20%22networks%22%20for%20deferred%20contraction%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20mo%0A%20%20%20%20mo.output.append(title)%0A%20%20%20%20mo.output.append(logo)%0A%20%20%20%20mo.output.append(body)%0A%20%20%20%20return%20body%2C%20logo%2C%20title%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20image%20%3D%20mo.Html(%0A%20%20%20%20%20%20%20%20f'%3Cimg%20src%3D%22public%2Fgammastructure.svg%22%2C%20width%3D%22300%22%2F%3E'%0A%20%20%20%20).center()%0A%20%20%20%20structure_body%20%3D%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%23%23%20Tensor%20structures%20and%20representations%3A%0A%0A%20%20%20%20Tensors%20in%20physics%20are%20usually%20defined%20through%20their%20structure%3A%0A%20%20%20%20%7Bimage%7D%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20structure_body%0A%20%20%20%20return%20image%2C%20structure_body%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20from%20symbolica_community.tensors%20import%20Representation%0A%0A%20%20%20%20bis%20%3D%20Representation(%22bis%22%2C%204)%0A%20%20%20%20bis2%20%3D%20Representation(%22bis%22%2C%202)%0A%20%20%20%20mink%20%3D%20Representation(%22mink%22%2C%204)%0A%20%20%20%20foo%20%3D%20Representation(%22foo%22%2C%2024)%0A%0A%20%20%20%20bis%2C%20mink%2C%20foo%2C%20type(bis2)%0A%20%20%20%20return%20Representation%2C%20bis%2C%20bis2%2C%20foo%2C%20mink%0A%0A%0A%40app.cell%0Adef%20_(bis%2C%20mink)%3A%0A%20%20%20%20from%20symbolica_community.tensors%20import%20Slot%0A%0A%20%20%20%20%23%20Slots%20are%20created%20from%20a%20representation%20and%20an%20index%0A%20%20%20%20mu%20%3D%20mink(%22mu%22)%0A%20%20%20%20%23%20They%20can%20be%20built%20independently%20as%20well%3A%0A%20%20%20%20nu%20%3D%20Slot(%22mink%22%2C%204%2C%20%22nu%22)%0A%0A%20%20%20%20%23%20.to_expression()%0A%20%20%20%20i%20%3D%20bis(%22i%22)%0A%20%20%20%20%23%20The%20index%20can%20also%20be%20an%20integer%0A%20%20%20%20j%20%3D%20bis(2)%0A%20%20%20%20k%20%3D%20bis(%22k%22)%0A%20%20%20%20i%2C%20j%2C%20k%2C%20nu%2C%20type(nu)%0A%20%20%20%20return%20Slot%2C%20i%2C%20j%2C%20k%2C%20mu%2C%20nu%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20%5BSymbolica%5D(https%3A%2F%2Fsymbolica.io%2F)%0A%0A%0A%0A%20%20%20%20%20%20%20%20%3E%20Symbolica%20is%20a%20modern%20computer%20algebra%20system%20%5B(CAS)%5D.%20It%20can%20easily%20be%20incorporated%20into%20existing%20projects%20using%20its%20Python%2C%20Rust%20or%20C%20bindings.%0A%20%20%20%20%20%20%20%20%3E%20%20%0A%20%20%20%20%20%20%20%20%3E%20-Ben%20Ruijl%0A%0A%20%20%20%20%20%20%20%20It%20is%20%60FORM%60%20for%20the%20modern%20era.%0A%0A%20%20%20%20%20%20%20%20Exactly%20like%20spenso%2C%20it%20is%20a%20full%20Rust%20crate%2C%20that%20uses%20Pyo3%20to%20interface%20with%20Python.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20from%20symbolica_community%20import%20Expression%2C%20S%2C%20E%0A%0A%20%20%20%20x%20%3D%20Expression.symbol(%22x%22)%0A%20%20%20%20%23%20print(x)%0A%20%20%20%20y%20%3D%20S(%22y%22)%0A%20%20%20%20e%20%3D%20(Expression.COS(Expression.PI%20*%20Expression.I%20*%20x%20%2F%203)%20%2B%202)%20**%20(%0A%20%20%20%20%20%20%20%203%20%0A%20%20%20%20)%0A%20%20%20%20print(e)%0A%20%20%20%20mo.md(e.expand().to_latex())%0A%20%20%20%20print(e.series(x%2C%200%2C%203).to_expression())%0A%20%20%20%20return%20E%2C%20Expression%2C%20S%2C%20e%2C%20x%2C%20y%0A%0A%0A%40app.cell%0Adef%20_(S%2C%20TensorIndices%2C%20i%2C%20k%2C%20mu)%3A%0A%20%20%20%20gamma%20%3D%20S(%22%CE%B3%22)%0A%20%20%20%20%23%20print(gamma)%0A%0A%20%20%20%20g_muik%20%3D%20TensorIndices(gamma%2C%20mu%2C%20i%2C%20k)%0A%20%20%20%20print(type(g_muik))%0A%20%20%20%20print(len(g_muik))%0A%20%20%20%20%23%20gexp%20%3D%20g_muik.to_expression()%0A%20%20%20%20%23%20type(g_muik)%2C%20type(gexp)%2C%20gexp%2C%20g_muik%2C%20len(g_muik)%0A%20%20%20%20print(g_muik%5B%5B1%2C0%2C3%5D%5D)%0A%20%20%20%20%23%20g_muik%5B%5B2%2C3%2C1%5D%5D%0A%20%20%20%20%23%20g_muik%5B45%3A63%3A3%5D%0A%20%20%20%20return%20g_muik%2C%20gamma%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Storing%20Data%0A%0A%20%20%20%20%20%20%20%20Tensors%20also%20%22store%22%20data.%0A%0A%20%20%20%20%20%20%20%20In%20spenso%20this%20can%20be%20done%20using%20two%20types%20of%20tensors%3A%0A%0A%20%20%20%20%20%20%20%20-%20Sparse%20(%60HashMap%60%20backed)%0A%20%20%20%20%20%20%20%20-%20Dense%20(%60Vec%60%20backed)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(g_muik)%3A%0A%20%20%20%20import%20symbolica_community.tensors%20as%20tensors%0A%0A%20%20%20%20print(type(g_muik))%0A%0A%20%20%20%20g_muik_tensor%20%3D%20tensors.sparse_empty(g_muik%2C%20type(1.0))%0A%20%20%20%20g_muik_tensor%5B1%5D%20%3D%201.0%0A%20%20%20%20g_muik_tensor%5B%5B2%2C%203%2C%201%5D%5D%20%3D%202.0%0A%20%20%20%20print(g_muik_tensor)%0A%20%20%20%20g_muik_tensor.to_dense()%0A%20%20%20%20%23%20print(g_muik_tensor)%0A%20%20%20%20return%20g_muik_tensor%2C%20tensors%0A%0A%0A%40app.cell%0Adef%20_(bis%2C%20tensors)%3A%0A%20%20%20%20%23%20fmt%3A%20off%0A%20%20%20%20dense_tensor%20%3D%20tensors.dense(%0A%20%20%20%20%20%20%20%20%5Bbis%2Cbis%5D%2C%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%200.2%20%20%20%20%2C0%20%2C0%20%2C0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%2C.3%2C0%20%2C0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%200%20%20%20%20%20%20%2C-1%2C.2%2C0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%201%20%2F%2013.%2C0%20%2C0%20%2C0%2C%0A%20%20%20%20%20%20%20%20%5D%2C%0A%20%20%20%20)%0A%0A%0A%20%20%20%20print(dense_tensor.structure())%0A%20%20%20%20return%20(dense_tensor%2C)%0A%0A%0A%40app.cell%0Adef%20_(E%2C%20bis%2C%20mink%2C%20tensors)%3A%0A%20%20%20%20atom_tensor%20%3D%20tensors.sparse_empty(%5Bmink%2C%20bis%5D%2C%20type(E(%22x%22)))%0A%0A%0A%20%20%20%20atom_tensor%5B1%5D%20%3D%20E(%22x%22)%0A%20%20%20%20atom_tensor%5B%5B2%2C%203%5D%5D%20%3D%20E(%22y%2Bsin(3*s)%22)%0A%20%20%20%20print(atom_tensor.structure())%0A%20%20%20%20atom_tensor.to_dense()%0A%20%20%20%20print(atom_tensor)%0A%20%20%20%20return%20(atom_tensor%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Arithmetic%20through%20Tensor%20Networks%0A%0A%20%20%20%20%20%20%20%20Notice%20I%20haven't%20mentioned%20any%20arithmetic%20operations%20yet.%20%0A%0A%20%20%20%20%20%20%20%20This%20is%20because%20the%20arithmetic%20is%20done%20through%20tensor%20networks.%0A%0A%20%20%20%20%20%20%20%20For%20tensors%20you%20need%20additional%20checks%20if%20you%20have%20structure%3A%20%0A%0A%20%20%20%20%20%20%20%20-%20multiplication%20%24%5Crightarrow%24%20match%20indices%2C%0A%20%20%20%20%20%20%20%20-%20addition%20%24%5Crightarrow%24%20must%20have%20same%20structure%20(up%20to%20permutation)%0A%0A%20%20%20%20%20%20%20%20Symbolica%20%60Expressions%60%20already%20represents%20these%20operations!%0A%0A%20%20%20%20%20%20%20%20We%20just%20need%20to%20process%20them%20further%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(S%2C%20g_muik%2C%20gamma%2C%20i%2C%20j%2C%20k%2C%20mu%2C%20nu%2C%20tensor_display)%3A%0A%20%20%20%20from%20symbolica_community.tensors%20import%20TensorNetwork%0A%0A%20%20%20%20p%2C%20w%2C%20m%2C%20id%20%3D%20S(%22P%22%2C%20%22W%22%2C%20%22MT%22%2C%20%22id%22)%0A%0A%20%20%20%20%5Bnue%2C%20mue%2C%20ie%2C%20je%2C%20ke%5D%20%3D%20%5B%0A%20%20%20%20%20%20%20%20a.to_expression()%20for%20a%20in%20%5Bnu%2C%20mu%2C%20i%2C%20j%2C%20k%5D%0A%20%20%20%20%5D%0A%20%20%20%20g_muik_expr%20%3D%20g_muik.to_expression()%0A%0A%20%20%20%20wavefunction_expr%20%3D%20g_muik_expr*%20(p(2%2C%20nue)%20*%20gamma(nue%2C%20ke%2C%20je)%20%2B%20m%20*%20id(ke%2C%20je))*%20w(1%2C%20ie)*%20w(3%2C%20mue)%23*p(1%2Cje)%0A%0A%20%20%20%20print(wavefunction_expr)%0A%20%20%20%20wf_net%20%3D%20TensorNetwork(wavefunction_expr)%0A%20%20%20%20print(type(wf_net))%0A%20%20%20%20tensor_display(wf_net)%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20TensorNetwork%2C%0A%20%20%20%20%20%20%20%20g_muik_expr%2C%0A%20%20%20%20%20%20%20%20id%2C%0A%20%20%20%20%20%20%20%20ie%2C%0A%20%20%20%20%20%20%20%20je%2C%0A%20%20%20%20%20%20%20%20ke%2C%0A%20%20%20%20%20%20%20%20m%2C%0A%20%20%20%20%20%20%20%20mue%2C%0A%20%20%20%20%20%20%20%20nue%2C%0A%20%20%20%20%20%20%20%20p%2C%0A%20%20%20%20%20%20%20%20w%2C%0A%20%20%20%20%20%20%20%20wavefunction_expr%2C%0A%20%20%20%20%20%20%20%20wf_net%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(TensorNetwork%2C%20g_muik%2C%20tensor_display%2C%20wf_net)%3A%0A%20%20%20%20wf_net.contract()%0A%20%20%20%20tensor_display(wf_net)%0A%20%20%20%20print(%20wf_net.result())%0A%20%20%20%20print(TensorNetwork(g_muik.to_expression()).result())%0A%20%20%20%20%23%20print(%20TensorNetwork(w(1%2C%20ie)).result())%0A%20%20%20%20%23%20print(g_muik_tensor)%0A%20%20%20%20%23%20tensors.register(g_muik_tensor)%20%23%20Do%20not%20do%20on%20first%20pass!%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20Why%20is%20this%20useful%3F%0A%0A%20%20%20%20%20%20%20%20Deferred%20evaluation!%20%0A%0A%20%20%20%20%20%20%20%20You%20might%20only%20have%20partial%20information%20now%2C%20but%20can%20complete%20it%20later.%20%0A%0A%20%20%20%20%20%20%20%20How%20do%20you%20do%20this%3F%0A%0A%20%20%20%20%20%20%20%20Using%20Symbolica's%20fast%20evaluators%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(E%2C%20Expression%2C%20TensorNetwork%2C%20ie%2C%20m%2C%20mue%2C%20nue%2C%20p%2C%20random%2C%20w%2C%20wf_net)%3A%0A%20%20%20%20params%20%3D%20%5BExpression.I%5D%0A%20%20%20%20params%20%2B%3D%20TensorNetwork(w(1%2C%20ie)).result()%0A%20%20%20%20params%20%2B%3D%20TensorNetwork(w(3%2C%20mue)).result()%0A%20%20%20%20params%20%2B%3D%20TensorNetwork(p(2%2C%20nue)).result()%0A%20%20%20%20constants%20%3D%20%7Bm%3A%20E(%22173%22)%7D%0A%20%20%20%20wf_ev%20%3D%20wf_net.result().evaluator(%0A%20%20%20%20%20%20%20%20constants%3Dconstants%2C%20params%3Dparams%2C%20funs%3D%7B%7D%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20print(type(wf_ev))%0A%20%20%20%20%23%20fmt%3A%20off%0A%20%20%20%20wf_params%20%3D%20%5B%5Brandom.random()%20%2B%201j%20*%20random.random()for%20i%20in%20range(len(params))%5Dfor%20j%20in%20range(1000)%5D%0A%20%20%20%20print(wf_ev.evaluate_complex(wf_params)%5B1%5D)%0A%20%20%20%20return%20constants%2C%20params%2C%20wf_ev%2C%20wf_params%0A%0A%0A%40app.cell%0Adef%20_(wf_ev%2C%20wf_params)%3A%0A%20%20%20%20%23%20Want%20even%20more%20speed%3F%20Compile%20it%20with%20c%2B%2B!%0A%0A%20%20%20%20compiled_wf%20%3D%20wf_ev.compile(%0A%20%20%20%20%20%20%20%20function_name%3D%22wf%22%2C%0A%20%20%20%20%20%20%20%20filename%3D%22public%2Fwf.cpp%22%2C%0A%20%20%20%20%20%20%20%20library_name%3D%22wf.so%22%2C%0A%20%20%20%20%20%20%20%20inline_asm%3DTrue%2C%0A%20%20%20%20)%0A%20%20%20%20print(compiled_wf.evaluate_complex(wf_params)%5B0%5D)%0A%20%20%20%20return%20(compiled_wf%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%23%20%60ALOHA%60%0A%0A%20%20%20%20%20%20%20%20Note%20this%20is%20exactly%20what%20%60ALOHA%60%20does%2C%20but%20much%20more%20flexible!%20I.e%20in%20%60FFV1_2.f%60%3A%0A%0A%20%20%20%20%20%20%20%20%60%60%60fortran%0A%20%20%20%20%20%20%20%20%20%20F2(3)%3D%20DENOM*CI*(F1(3)*(P2(0)*(V3(3)%2BV3(6))%2B(P2(1)*(-1D0)*(V3(4)%0A%20%20%20%20%20%20%20%20%24%20%2BCI*(V3(5)))%2B(P2(2)*(%2BCI*(V3(4))-V3(5))-P2(3)*(V3(3)%2BV3(6)))))%0A%20%20%20%20%20%20%20%20%24%20%2B(F1(4)*(P2(0)*(V3(4)-CI*(V3(5)))%2B(P2(1)*(-V3(3)%2BV3(6))%2B(P2(2)%0A%20%20%20%20%20%20%20%20%24%20*(%2BCI*(V3(3))-CI*(V3(6)))%2BP2(3)*(-V3(4)%2BCI*(V3(5))))))%2BM2*(F1(5)%0A%20%20%20%20%20%20%20%20%24%20*(V3(3)-V3(6))%2BF1(6)*(-V3(4)%2BCI*(V3(5))))))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20F2(4)%3D%20DENOM*(-CI)*(F1(3)*(P2(0)*(-1D0)*(V3(4)%2BCI*(V3(5)))%2B(P2(1)%0A%20%20%20%20%20%20%20%20%24%20*(V3(3)%2BV3(6))%2B(P2(2)*(%2BCI*(V3(3)%2BV3(6)))-P2(3)*(V3(4)%2BCI*(V3(5)%0A%20%20%20%20%20%20%20%20%24%20)))))%2B(F1(4)*(P2(0)*(-V3(3)%2BV3(6))%2B(P2(1)*(V3(4)-CI*(V3(5)))%0A%20%20%20%20%20%20%20%20%24%20%2B(P2(2)*(%2BCI*(V3(4))%2BV3(5))%2BP2(3)*(-V3(3)%2BV3(6)))))%2BM2*(F1(5)%0A%20%20%20%20%20%20%20%20%24%20*(V3(4)%2BCI*(V3(5)))-F1(6)*(V3(3)%2BV3(6)))))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20F2(5)%3D%20DENOM*(-CI)*(F1(5)*(P2(0)*(-V3(3)%2BV3(6))%2B(P2(1)*(V3(4)%2BCI%0A%20%20%20%20%20%20%20%20%24%20*(V3(5)))%2B(P2(2)*(-CI*(V3(4))%2BV3(5))%2BP2(3)*(-V3(3)%2BV3(6)))))%0A%20%20%20%20%20%20%20%20%24%20%2B(F1(6)*(P2(0)*(V3(4)-CI*(V3(5)))%2B(P2(1)*(-1D0)*(V3(3)%2BV3(6))%0A%20%20%20%20%20%20%20%20%24%20%2B(P2(2)*(%2BCI*(V3(3)%2BV3(6)))%2BP2(3)*(V3(4)-CI*(V3(5))))))%2BM2%0A%20%20%20%20%20%20%20%20%24%20*(F1(3)*(-1D0)*(V3(3)%2BV3(6))%2BF1(4)*(-V3(4)%2BCI*(V3(5))))))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20F2(6)%3D%20DENOM*CI*(F1(5)*(P2(0)*(-1D0)*(V3(4)%2BCI*(V3(5)))%2B(P2(1)%0A%20%20%20%20%20%20%20%20%24%20*(V3(3)-V3(6))%2B(P2(2)*(%2BCI*(V3(3))-CI*(V3(6)))%2BP2(3)*(V3(4)%2BCI%0A%20%20%20%20%20%20%20%20%24%20*(V3(5))))))%2B(F1(6)*(P2(0)*(V3(3)%2BV3(6))%2B(P2(1)*(-V3(4)%2BCI%0A%20%20%20%20%20%20%20%20%24%20*(V3(5)))%2B(P2(2)*(-1D0)*(%2BCI*(V3(4))%2BV3(5))-P2(3)*(V3(3)%2BV3(6)))%0A%20%20%20%20%20%20%20%20%24%20))%2BM2*(F1(3)*(V3(4)%2BCI*(V3(5)))%2BF1(4)*(V3(3)-V3(6)))))%0A%20%20%20%20%20%20%20%20%60%60%60%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20file_path%20%3D%20%22public%2Fwf.cpp%22%0A%0A%20%20%20%20with%20open(file_path%2C%20%22r%22)%20as%20file%3A%0A%20%20%20%20%20%20%20%20file_content%20%3D%20file.read()%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%23%23%20Compiled%20Spenso%0A%0A%20%20%20%20Similarly%20the%20compiled%20file%20creates%20a%20template%20function%3A%20%0A%0A%20%20%20%20Note%20the%20number%20of%20multiplications%20is%20reduced%20by%20a%20factor%20of%202!%0A%20%20%20%20%60%60%60cpp%0A%20%20%20%20%7Bfile_content%7D%0A%20%20%20%20%60%60%60%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20file%2C%20file_content%2C%20file_path%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(E%2C%20mo)%3A%0A%20%20%20%20threelooplbl%20%3D%20E(%0A%20%20%20%20%20%20%20%20r%22%22%22-64%2F729*G%5E4*ee%5E6%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C47)%2Cbis(4%2C135))%2BQ(15%2Cmink(4%2C149))*%CE%B3(mink(4%2C149)%2Cbis(4%2C47)%2Cbis(4%2C135)))%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C83)%2Cbis(4%2C46))%2BQ(6%2Cmink(4%2C138))*%CE%B3(mink(4%2C138)%2Cbis(4%2C83)%2Cbis(4%2C46)))%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C88)%2Cbis(4%2C82))%2B%CE%B3(mink(4%2C140)%2Cbis(4%2C88)%2Cbis(4%2C82))*Q(7%2Cmink(4%2C140)))%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C96)%2Cbis(4%2C142))%2B%CE%B3(mink(4%2C141)%2Cbis(4%2C96)%2Cbis(4%2C142))*Q(8%2Cmink(4%2C141)))%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C103)%2Cbis(4%2C95))%2B%CE%B3(mink(4%2C143)%2Cbis(4%2C103)%2Cbis(4%2C95))*Q(9%2Cmink(4%2C143)))%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C110)%2Cbis(4%2C102))%2B%CE%B3(mink(4%2C144)%2Cbis(4%2C110)%2Cbis(4%2C102))*Q(10%2Cmink(4%2C144)))%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C117)%2Cbis(4%2C109))%2B%CE%B3(mink(4%2C145)%2Cbis(4%2C117)%2Cbis(4%2C109))*Q(11%2Cmink(4%2C145)))%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C122)%2Cbis(4%2C116))%2B%CE%B3(mink(4%2C146)%2Cbis(4%2C122)%2Cbis(4%2C116))*Q(12%2Cmink(4%2C146)))%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C129)%2Cbis(4%2C123))%2B%CE%B3(mink(4%2C147)%2Cbis(4%2C129)%2Cbis(4%2C123))*Q(13%2Cmink(4%2C147)))%0A%20%20%20%20%20%20%20%20(MT*id(bis(4%2C134)%2Cbis(4%2C130))%2B%CE%B3(mink(4%2C148)%2Cbis(4%2C134)%2Cbis(4%2C130))*Q(14%2Cmink(4%2C148)))%0A%20%20%20%20%20%20%20%20%CE%B3(mink(4%2C45)%2Cbis(4%2C47)%2Cbis(4%2C46))*%CE%B3(mink(4%2C81)%2Cbis(4%2C83)%2Cbis(4%2C82))*%CE%B3(mink(4%2C87)%2Cbis(4%2C88)%2Cbis(4%2C142))*%CE%B3(mink(4%2C94)%2Cbis(4%2C96)%2Cbis(4%2C95))%0A%20%20%20%20%20%20%20%20%CE%B3(mink(4%2C101)%2Cbis(4%2C103)%2Cbis(4%2C102))*%CE%B3(mink(4%2C108)%2Cbis(4%2C110)%2Cbis(4%2C109))*%CE%B3(mink(4%2C115)%2Cbis(4%2C117)%2Cbis(4%2C116))*%CE%B3(mink(4%2C121)%2Cbis(4%2C122)%2Cbis(4%2C123))%0A%20%20%20%20%20%20%20%20%CE%B3(mink(4%2C128)%2Cbis(4%2C129)%2Cbis(4%2C130))*%CE%B3(mink(4%2C133)%2Cbis(4%2C134)%2Cbis(4%2C135))*Metric(mink(4%2C121)%2Cmink(4%2C87))*Metric(mink(4%2C133)%2Cmink(4%2C101))%0A%0A%20%20%20%20%20%20%20%20%CF%B5(0%2Cmink(4%2C45))*%CF%B5(1%2Cmink(4%2C81))*%CF%B5bar(2%2Cmink(4%2C94))*%CF%B5bar(3%2Cmink(4%2C108))*%CF%B5bar(4%2Cmink(4%2C115))*%CF%B5bar(5%2Cmink(4%2C128))%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%0A%0A%20%20%20%20prettylbl%20%3D%20threelooplbl.pretty_str(multiplication_operator%3D%22%5Cn%22)%0A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20f%22%22%22%0A%20%20%20%20%23%23%20Benchmarking%20the%20speedup%0A%0A%20%20%20%20We%20can%20look%20at%20another%20(more%20sizable)%20example%20network%20and%20this%20time%20use%20the%20library%20in%20rust%20to%20see%20the%20speedup%20that%20compilation%20gives%20us.%20%0A%0A%20%20%20%20let%20us%20consider%20this%20expression%3A%0A%0A%20%20%20%20%60%60%60%0A%20%20%20%20threelooplbl%3D%7Bprettylbl%7D%0A%20%20%20%20%60%60%60%0A%0A%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%20prettylbl%2C%20threelooplbl%0A%0A%0A%40app.cell%0Adef%20_(TensorNetwork%2C%20tensor_display%2C%20threelooplbl)%3A%0A%20%20%20%20lbl_net%20%3D%20TensorNetwork(threelooplbl)%0A%20%20%20%20tensor_display(lbl_net)%0A%20%20%20%20return%20(lbl_net%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(%0A%20%20%20%20%20%20%20%20r%22%22%22%0A%20%20%20%20%20%20%20%20%23%20Outlook%0A%0A%20%20%20%20%20%20%20%20-%20Integrating%20into%20MadGraph!%0A%20%20%20%20%20%20%20%20-%20Better%20Network%20Representation%0A%20%20%20%20%20%20%20%20-%20Network%20aware%20symbolic%20symplifications%0A%20%20%20%20%20%20%20%20-%20Symbolica%20compilation%20to%20CUDA%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20import%20pydot%0A%0A%0A%20%20%20%20def%20tensor_display(tensor)%3A%0A%20%20%20%20%20%20%20%20dot_string%20%3D%20tensor.__str__()%0A%20%20%20%20%20%20%20%20graphs%20%3D%20pydot.graph_from_dot_data(dot_string)%0A%20%20%20%20%20%20%20%20graphs%5B0%5D.write_svg(%22public%2Ftensor.svg%22%2C%20prog%3D%22neato%22)%0A%20%20%20%20%20%20%20%20return%20mo.image(%22public%2Ftensor.svg%22)%0A%20%20%20%20return%20pydot%2C%20tensor_display%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
19cb75fe52e0546ace7d078a1817afc268c0159b213f50be287976863d1a6257