def test_MultiCouplingModel_explicit(): fermion_lat_cyl = lattice.Square(1, 2, fermion_site, bc='periodic', bc_MPS='infinite') M = model.MultiCouplingModel(fermion_lat_cyl) # create a wired fermionic model with 3-body interactions M.add_onsite(0.125, 0, 'N') M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, 1)) M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, -1), 'JW') M.add_coupling(1.5, 0, 'Cd', 0, 'C', (1, 0), 'JW') M.add_coupling(1.5, 0, 'Cd', 0, 'C', (-1, 0), 'JW') M.add_multi_coupling(4., 0, 'N', [(0, 'N', (2, 1))], 'Id') # a full unit cell inbetween! # some wired mediated hopping along the diagonal M.add_multi_coupling(1.125, 0, 'N', other_ops=[(0, 'Cd', (0, 1)), (0, 'C', (1, 0))]) H_mpo = M.calc_H_MPO() W0_new = H_mpo.get_W(0) W1_new = H_mpo.get_W(1) W2_new = H_mpo.get_W(2) Id, JW, N = fermion_site.Id, fermion_site.JW, fermion_site.N Cd, C = fermion_site.Cd, fermion_site.C CdJW = Cd.matvec(JW) JWC = JW.matvec(C) NJW = N.matvec(JW) # yapf: disable W0_ex = [[Id, None, None, CdJW, None, JWC, N, None, None, None, N*0.125], [None, None, Id, None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, None, JW, None, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, None, Cd*1.5], [None, Id, None, None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, None, C*1.125], [None, None, None, None, None, None, None, JW, None, None, None], [None, None, None, None, None, None, None, None, JW, None, None], [None, None, None, None, None, None, None, None, None, Id, None], [None, None, None, None, None, None, None, None, None, None, Id]] W1_ex = [[Id, None, None, None, None, None, None, None, CdJW, JWC, N, N*0.125], [None, Id, None, None, None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, JW, NJW, None, None, None, None, None, None, C*0.5], [None, None, None, None, None, None, None, None, None, None, None, C*1.125], [None, None, None, None, None, JW, None, None, None, None, None, Cd*0.5], [None, None, None, None, None, None, Id, CdJW, None, None, None, None], [None, None, None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, None, None, None, None, None, None, None, None, Cd*1.5], [None, None, Id, None, None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, None, None, Id]] # yapf: enable W0_ex = npc.grid_outer(W0_ex, W0_new.legs[:2]) W1_ex = npc.grid_outer(W1_ex, W1_new.legs[:2]) assert npc.norm(W0_new - W0_ex) == 0. # coupling constants: no rounding errors assert npc.norm(W1_new - W1_ex) == 0. # coupling constants: no rounding errors
def test_CouplingModel_multi_couplings_explicit(use_plus_hc, JW): fermion_lat_cyl = lattice.Square(1, 2, fermion_site, bc='periodic', bc_MPS='infinite') M = model.CouplingModel(fermion_lat_cyl) # create a wired fermionic model with 3-body interactions M.add_onsite(0.125, 0, 'N') M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, 1), plus_hc=use_plus_hc) M.add_coupling(1.5, 0, 'Cd', 0, 'C', (1, 0), JW, plus_hc=use_plus_hc) if not use_plus_hc: M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, -1), JW) M.add_coupling(1.5, 0, 'Cd', 0, 'C', (-1, 0), JW) # multi_coupling with a full unit cell inbetween the operators! M.add_multi_coupling(4., [('N', (0, 0), 0), ('N', (-2, -1), 0)]) # some wired mediated hopping along the diagonal M.add_multi_coupling(1.125, [('N', (0, 0), 0), ('Cd', (0, 1), 0), ('C', (1, 0), 0)]) H_mpo = M.calc_H_MPO() W0_new = H_mpo.get_W(0) W1_new = H_mpo.get_W(1) Id, JW, N = fermion_site.Id, fermion_site.JW, fermion_site.N Cd, C = fermion_site.Cd, fermion_site.C CdJW = Cd.matvec(JW) # = Cd CJW = C.matvec(JW) # = -C NJW = N.matvec(JW) # print(M.H_MPO_graph._build_grids()) # yapf: disable W0_ex = [[Id, CJW, CdJW, None, N, None, None, None, None, None, N*0.125], [None, None, None, None, None, None, None, None, None, None, Cd*-1.5], [None, None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, JW, None, None, None, None, None, None, None], [None, None, None, None, None, Id, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, None, C*1.125], [None, None, None, None, None, None, Id, None, None, None, None], [None, None, None, None, None, None, None, JW, None, None, None], [None, None, None, None, None, None, None, None, JW, None, None], [None, None, None, None, None, None, None, None, None, Id, None], [None, None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, None, None, None, None, None, None, None, Id]] W1_ex = [[Id, None, None, None, None, None, None, CJW, CdJW, N, None, N*0.125], [None, JW, None, None, None, None, None, None, None, None, None, Cd*-0.5], [None, None, JW, NJW, None, None, None, None, None, None, None, C*0.5], [None, None, None, None, None, None, None, None, None, None, None, C*1.125], [None, None, None, None, Id, CdJW, None, None, None, None, None, None], [None, None, None, None, None, None, Id, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, None, None, None, None, None, None, None, None, Cd*-1.5], [None, None, None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, None, None, None, None, None, None, None, Id, None], [None, None, None, None, None, None, None, None, None, None, None, Id]] # yapf: enable W0_ex = npc.grid_outer(W0_ex, W0_new.legs[:2]) W1_ex = npc.grid_outer(W1_ex, W1_new.legs[:2]) assert npc.norm(W0_new - W0_ex) == 0. # coupling constants: no rounding errors assert npc.norm(W1_new - W1_ex) == 0. # coupling constants: no rounding errors
def test_CouplingModel_explicit(): fermion_lat_cyl = lattice.Square(1, 2, fermion_site, bc='periodic', bc_MPS='infinite') M = model.CouplingModel(fermion_lat_cyl) M.add_onsite(0.125, 0, 'N') M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, 1), None) # auto-determine JW-string! M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, -1), None) M.add_coupling(1.5, 0, 'Cd', 0, 'C', (1, 0), None) M.add_coupling(1.5, 0, 'Cd', 0, 'C', (-1, 0), None) M.add_coupling(4., 0, 'N', 0, 'N', (-2, -1), None) # a full unit cell inbetween! H_mpo = M.calc_H_MPO() W0_new = H_mpo.get_W(0) W1_new = H_mpo.get_W(1) Id, JW, N = fermion_site.Id, fermion_site.JW, fermion_site.N Cd, C = fermion_site.Cd, fermion_site.C CdJW = Cd.matvec(JW) # = Cd CJW = C.matvec(JW) # = -C # yapf: disable W0_ex = [[Id, CJW, CdJW, N, None, None, None, None, None, N*0.125], [None, None, None, None, None, None, None, None, None, Cd*-1.5], [None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, None, Id, None, None, None, None, None], [None, None, None, None, None, Id, None, None, None, None], [None, None, None, None, None, None, JW, None, None, None], [None, None, None, None, None, None, None, JW, None, None], [None, None, None, None, None, None, None, None, Id, None], [None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, None, None, None, None, None, None, Id]] W1_ex = [[Id, None, None, None, None, CJW, CdJW, N, None, N*0.125], [None, JW, None, None, None, None, None, None, None, Cd*-0.5], [None, None, JW, None, None, None, None, None, None, C*0.5], [None, None, None, Id, None, None, None, None, None, None], [None, None, None, None, Id, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, None, None, None, None, None, None, Cd*-1.5], [None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, None, None, None, None, None, Id, None], [None, None, None, None, None, None, None, None, None, Id]] # yapf: enable W0_ex = npc.grid_outer(W0_ex, W0_new.legs[:2]) W1_ex = npc.grid_outer(W1_ex, W1_new.legs[:2]) assert npc.norm(W0_new - W0_ex) == 0. # coupling constants: no rounding errors assert npc.norm(W1_new - W1_ex) == 0. # coupling constants: no rounding errors
def test_CouplingModel_explicit(): fermion_lat_cyl = lattice.SquareLattice(1, 2, fermion_site, bc_MPS='infinite') M = model.CouplingModel(fermion_lat_cyl, 'periodic') M.add_onsite(0.125, 0, 'N') M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, 1), 'JW') M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, -1), 'JW') M.add_coupling(1.5, 0, 'Cd', 0, 'C', (1, 0), 'JW') M.add_coupling(1.5, 0, 'Cd', 0, 'C', (-1, 0), 'JW') M.add_coupling(4., 0, 'N', 0, 'N', (2, 1), 'Id') # a full unit cell inbetween! H_mpo = M.calc_H_MPO() # MPO should be translation invariant! W0_new = H_mpo.get_W(0) W1_new = H_mpo.get_W(1) Id, JW, N = fermion_site.Id, fermion_site.JW, fermion_site.N Cd, C = fermion_site.Cd, fermion_site.C CdJW = Cd.matvec(JW) JWC = JW.matvec(C) # yapf: disable W0_ex = [[Id, None, None, CdJW, JWC, N, None, None, None, N*0.125], [None, None, Id, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, None, None, None, None, None, None, Cd*1.5], [None, Id, None, None, None, None, None, None, None, None], [None, None, None, None, None, None, JW, None, None, None], [None, None, None, None, None, None, None, JW, None, None], [None, None, None, None, None, None, None, None, Id, None], [None, None, None, None, None, None, None, None, None, Id]] W1_ex = [[Id, None, None, None, None, None, CdJW, JWC, N, N*0.125], [None, Id, None, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, JW, None, None, None, None, None, C*0.5], [None, None, None, None, JW, None, None, None, None, Cd*0.5], [None, None, None, None, None, Id, None, None, None, None], [None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, None, None, None, None, None, None, Cd*1.5], [None, None, Id, None, None, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, Id]] # yapf: enable W0_ex = npc.grid_outer(W0_ex, W0_new.legs[:2]) W1_ex = npc.grid_outer(W1_ex, W1_new.legs[:2]) assert npc.norm(W0_new - W0_ex) == 0. # coupling constants: no rounding errors assert npc.norm(W1_new - W1_ex) == 0. # coupling constants: no rounding errors
def test_npc_grid_outer(): ci = chinfo3 p_leg = gen_random_legcharge(ci, 4) legs_op = [p_leg, p_leg.conj()] op_0 = 1.j * npc.Array.from_func(np.random.random, legs_op, qtotal=[0], shape_kw='size') op_pl = npc.Array.from_func(np.random.random, legs_op, qtotal=[1], shape_kw='size') op_min = npc.Array.from_func(np.random.random, legs_op, qtotal=[-1], shape_kw='size') op_id = npc.eye_like(op_0) grid = [[op_id, op_pl, op_min, op_0, None], [None, None, None, None, op_min], [None, None, None, None, op_pl], [None, None, None, None, op_0], [None, None, None, None, op_id]] # yapf: disable leg_WL = npc.LegCharge.from_qflat(ci, ci.make_valid([[0], [1], [-1], [0], [0]])) leg_WR = npc.LegCharge.from_qflat(ci, ci.make_valid([[0], [1], [-1], [0], [0]]), -1) leg_WR_calc = npc.detect_grid_outer_legcharge(grid, [leg_WL, None], qconj=-1)[1] leg_WR.test_equal(leg_WR_calc) W = npc.grid_outer(grid, [leg_WL, leg_WR]) W.test_sanity() Wflat = np.zeros([5, 5, 4, 4], dtype=W.dtype) for idx, op in [[(0, 0), op_id], [(0, 1), op_pl], [(0, 2), op_min], [(0, 3), op_0], [(1, 4), op_min], [(2, 4), op_pl], [(3, 4), op_0], [(4, 4), op_id]]: Wflat[idx] = op.to_ndarray() npt.assert_equal(W.to_ndarray(), Wflat)
def test_MPO(): s = spin_half for bc in mpo.MPO._valid_bc: for L in [4, 2, 1]: print(bc, ", L =", L) grid = [[s.Id, s.Sp, s.Sz], [None, None, s.Sm], [None, None, s.Id]] legW = npc.LegCharge.from_qflat(s.leg.chinfo, [[0], s.Sp.qtotal, [0]]) W = npc.grid_outer(grid, [legW, legW.conj()]) W.iset_leg_labels(['wL', 'wR', 'p', 'p*']) Ws = [W] * L if bc == 'finite': Ws[0] = Ws[0][0:1, :, :, :] Ws[-1] = Ws[-1][:, 2:3, :, :] H = mpo.MPO([s] * L, Ws, bc=bc, IdL=[0] * L + [None], IdR=[None] + [-1] * (L)) H.test_sanity() print(H.dim) print(H.chi) if L == 4: H2 = H.group_sites(n=2) H2.test_sanity() assert H2.L == 2
def test_MPO(): s = spin_half for bc in mpo.MPO._valid_bc: for L in [4, 2, 1]: print(bc, ", L =", L) grid = [[s.Id, s.Sp, s.Sm, s.Sz], [None, None, None, s.Sm], [None, None, None, s.Sp], [None, None, None, s.Id]] legW = npc.LegCharge.from_qflat(s.leg.chinfo, [[0], s.Sp.qtotal, s.Sm.qtotal, [0]]) W = npc.grid_outer(grid, [legW, legW.conj()], grid_labels=['wL', 'wR']) Ws = [W] * L if bc == 'finite': Ws[0] = Ws[0][0:1, :, :, :] Ws[-1] = Ws[-1][:, 3:4, :, :] H = mpo.MPO([s] * L, Ws, bc=bc, IdL=[0] * L + [None], IdR=[None] + [-1] * (L)) H_copy = mpo.MPO([s] * L, Ws, bc=bc, IdL=[0] * L + [None], IdR=[None] + [-1] * (L)) H.test_sanity() print(H.dim) print(H.chi) assert H.is_equal(H) # everything should be equal to itself assert H.is_hermitian() H.sort_legcharges() H.test_sanity() assert H.is_equal(H_copy) if L == 4: H2 = H.group_sites(n=2) H2.test_sanity() assert H2.L == 2
def Ws(Aml, m): "MPO for d_m^\dag (spin up)" Cdu, Id = [site.get_op(op) for op in ('Cdu', 'Id')] Wm = [] wL_leg = npc.LegCharge.from_qflat(chinfo, [op.qtotal for op in [Cdu, Id]], qconj=+1) # set charge on the leg for l in range(L): Wml_grid = [[Id, None], [Aml[m, l] * Cdu, Id]] Wml = npc.grid_outer(Wml_grid, [wL_leg, wL_leg.conj()], grid_labels=['wL', 'wR']) # wL, wR, p, p* Wm.append(Wml) # Boundary case Wm[0] = Wm[0][1:2, :] # second row Wm[-1] = Wm[-1][:, 0:1] # first column return Wm
psi = MPS.from_product_state(lat.mps_sites(), state, lat.bc_MPS) print("2) create an MPO representing the AFM Heisenberg Hamiltonian") # predefined physical spin-1/2 operators Sz, S+, S- Sz, Sp, Sm, Id = site.Sz, site.Sp, site.Sm, site.Id mpo_leg = npc.LegCharge.from_qflat(chinfo, [[0], [2], [-2], [0], [0]]) W_grid = [[Id, Sp, Sm, Sz, None ], [None, None, None, None, 0.5 * Jxx * Sm], [None, None, None, None, 0.5 * Jxx * Sp], [None, None, None, None, Jz * Sz ], [None, None, None, None, Id ]] # yapf:disable W = npc.grid_outer(W_grid, [mpo_leg, mpo_leg.conj()]) W.iset_leg_labels(['wL', 'wR', 'p', 'p*']) # wL/wR = virtual left/right of the MPO Ws = [W] * L Ws[0] = W[:1, :] Ws[-1] = W[:, -1:] H = MPO(psi.sites, Ws, psi.bc, IdL=0, IdR=-1) print("3) define 'environments' left and right") # this is automatically done during initialization of MPOEnvironment env = MPOEnvironment(psi, H, psi) envL = env.get_LP(0) envR = env.get_RP(L - 1) print("4) contract MPS and MPO to calculate the energy <psi|H|psi>")
psi = MPS.from_product_state(lat.mps_sites(), state, lat.bc_MPS) print("2) create an MPO representing the AFM Heisenberg Hamiltonian") # predefined physical spin-1/2 operators Sz, S+, S- Sz, Sp, Sm, Id = site.Sz, site.Sp, site.Sm, site.Id mpo_leg = npc.LegCharge.from_qflat(chinfo, [[0], [2], [-2], [0], [0]]) W_grid = [[Id, Sp, Sm, Sz, None ], [None, None, None, None, 0.5 * Jxx * Sm], [None, None, None, None, 0.5 * Jxx * Sp], [None, None, None, None, Jz * Sz ], [None, None, None, None, Id ]] # yapf:disable W = npc.grid_outer(W_grid, [mpo_leg, mpo_leg.conj()], grid_labels=['wL', 'wR']) # wL/wR = virtual left/right of the MPO Ws = [W] * L Ws[0] = W[:1, :] Ws[-1] = W[:, -1:] H = MPO(psi.sites, Ws, psi.bc, IdL=0, IdR=-1) print("3) define 'environments' left and right") # this is automatically done during initialization of MPOEnvironment env = MPOEnvironment(psi, H, psi) envL = env.get_LP(0) envR = env.get_RP(L - 1) print("4) contract MPS and MPO to calculate the energy <psi|H|psi>")
def test_CouplingModel_multi_couplings_explicit(use_plus_hc, JW): fermion_lat_cyl = lattice.Square(1, 2, fermion_site, bc='periodic', bc_MPS='infinite') M = model.CouplingModel(fermion_lat_cyl) # create a weird fermionic model with 3-body interactions M.add_onsite(0.125, 0, 'N') M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, 1), plus_hc=use_plus_hc) M.add_coupling(1.5, 0, 'Cd', 0, 'C', (1, 0), JW, plus_hc=use_plus_hc) if not use_plus_hc: M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, -1), JW) M.add_coupling(1.5, 0, 'Cd', 0, 'C', (-1, 0), JW) # multi_coupling with a full unit cell inbetween the operators! M.add_multi_coupling(4., [('N', (0, 0), 0), ('N', (-2, -1), 0)]) # some weird mediated hopping along the diagonal M.add_multi_coupling(1.125, [('N', (0, 0), 0), ('Cd', (0, 1), 0), ('C', (1, 0), 0)]) H_mpo = M.calc_H_MPO() W0_new = H_mpo.get_W(0) W1_new = H_mpo.get_W(1) Id, JW, N = fermion_site.Id, fermion_site.JW, fermion_site.N Cd, C = fermion_site.Cd, fermion_site.C CdJW = Cd.matvec(JW) # = Cd JWC = JW.matvec(C) # = C NJW = N.matvec(JW) # yapf: disable H_MPO_graph = tenpy.networks.mpo.MPOGraph.from_terms((M.all_onsite_terms(), M.all_coupling_terms(), M.exp_decaying_terms), M.lat.mps_sites(), M.lat.bc_MPS) H_MPO_graph._set_ordered_states() from pprint import pprint pprint(H_MPO_graph._ordered_states) pprint(H_MPO_graph._build_grids()) print(M.all_coupling_terms().to_TermList()) # 0.50000 * Cd JW_0 C_1 + # 1.50000 * Cd JW_0 C_2 + # 0.50000 * JW C_0 Cd_1 + # 1.50000 * JW C_0 Cd_2 + # 1.50000 * Cd JW_1 C_3 + # 1.50000 * JW C_1 Cd_3 + # 4.00000 * N_0 N_5 + # 4.00000 * N_1 N_4 + # 1.12500 * N_0 Cd JW_1 C_2 + # 1.12500 * Cd JW_0 N JW_1 C_3 W0_ex = [[Id, CdJW, JWC, N, None, None, None, None, None, N*0.125], [None, None, None, None, None, Id, None, None, None, None], [None, None, None, None, None, None, JW*1.5, None, None, None], [None, None, None, None, None, None, None, JW*1.5, None, None], [None, None, None, None, Id, None, None, None, None, None], [None, None, None, None, None, None, JW*1.125, None, None, None], [None, None, None, None, None, None, None, None, None, C], [None, None, None, None, None, None, None, None, None, Cd], [None, None, None, None, None, None, None, None, None, N], [None, None, None, None, None, None, None, None, Id, None], [None, None, None, None, None, None, None, None, None, Id]] W1_ex = [[Id, None, CdJW, JWC, N, None, None, None, None, None, N*0.125], [None, None, None, None, None, NJW, JW*1.5, None, None, None, C*0.5], [None, None, None, None, None, None, None, JW*1.5, None, None, Cd*0.5], [None, Id, None, None, None, None, CdJW*1.125, None, None, None, None], [None, None, None, None, None, None, None, None, Id*4., None, None], [None, None, None, None, None, None, None, None, None, Id*4., None], [None, None, None, None, None, None, None, None, None, None, C], [None, None, None, None, None, None, None, None, None, None, Cd], [None, None, None, None, None, None, None, None, None, None, N], [None, None, None, None, None, None, None, None, None, None, Id]] # yapf: enable W0_ex = npc.grid_outer(W0_ex, W0_new.legs[:2]) assert npc.norm(W0_new - W0_ex) == 0. # coupling constants: no rounding errors W1_ex = npc.grid_outer(W1_ex, W1_new.legs[:2]) assert npc.norm(W1_new - W1_ex) == 0. # coupling constants: no rounding errors
def test_CouplingModel_explicit(): fermion_lat_cyl = lattice.Square(1, 2, fermion_site, bc='periodic', bc_MPS='infinite') M = model.CouplingModel(fermion_lat_cyl) M.add_onsite(0.125, 0, 'N') M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, 1), None) # auto-determine JW-string! M.add_coupling(0.25, 0, 'Cd', 0, 'C', (0, -1), None) M.add_coupling(1.5, 0, 'Cd', 0, 'C', (1, 0), None) M.add_coupling(1.5, 0, 'Cd', 0, 'C', (-1, 0), None) M.add_coupling(4., 0, 'N', 0, 'N', (-2, -1), None) # a full unit cell inbetween! H_mpo = M.calc_H_MPO() W0_new = H_mpo.get_W(0) W1_new = H_mpo.get_W(1) Id, JW, N = fermion_site.Id, fermion_site.JW, fermion_site.N Cd, C = fermion_site.Cd, fermion_site.C CdJW = Cd.matvec(JW) # = Cd JWC = JW.matvec(C) # = C # H_MPO_graph = tenpy.networks.mpo.MPOGraph.from_terms((M.all_onsite_terms(), # M.all_coupling_terms(), # M.exp_decaying_terms), # M.lat.mps_sites(), # M.lat.bc_MPS) # H_MPO_graph._set_ordered_states() # from pprint import pprint # pprint(H_MPO_graph._ordered_states) # print(M.all_coupling_terms().to_TermList()) # [{'IdL': 0, # ('left', 0, 'Cd JW', 'JW'): 1, # ('left', 0, 'JW C', 'JW'): 2, # ('left', 0, 'N', 'Id'): 3, # ('left', 1, 'Cd JW', 'JW'): 4, # ('left', 1, 'JW C', 'JW'): 5, # ('left', 1, 'N', 'Id'): 6, # ('left', 0, 'N', 'Id', 2, 'Id', 'Id'): 7, # ('left', 1, 'N', 'Id', 3, 'Id', 'Id'): 8}, # 'IdR': 9, # {'IdL': 0, # ('left', 0, 'Cd JW', 'JW'): 1, # ('left', 0, 'JW C', 'JW'): 2, # ('left', 0, 'N', 'Id'): 3, # ('left', 1, 'Cd JW', 'JW'): 4, # ('left', 1, 'JW C', 'JW'): 5, # ('left', 1, 'N', 'Id'): 6}, # ('left', 0, 'N', 'Id', 2, 'Id', 'Id'): 7, # ('left', 0, 'N', 'Id', 2, 'Id', 'Id', 4, 'Id', 'Id'): 8, # 'IdR': 9, # 0.50000 * Cd JW_0 C_1 + # 1.50000 * Cd JW_0 C_2 + # 0.50000 * JW C_0 Cd_1 + # 1.50000 * JW C_0 Cd_2 + # 4.00000 * N_0 N_5 + # 1.50000 * Cd JW_1 C_3 + # 1.50000 * JW C_1 Cd_3 + # 4.00000 * N_1 N_4 # yapf: disable W0_ex = [[Id, CdJW, JWC, N, None, None, None, None, None, N*0.125], [None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, None, None, None, None, None, None, Cd*1.5], [None, None, None, None, None, None, None, Id, None, None], [None, None, None, None, JW, None, None, None, None, None], [None, None, None, None, None, JW, None, None, None, None], [None, None, None, None, None, None, Id, None, None, None], [None, None, None, None, None, None, None, None, Id, None], [None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, None, None, None, None, None, None, Id]] W1_ex = [[Id, None, None, None, CdJW, JWC, N, None, None, N*0.125], [None, JW, None, None, None, None, None, None, None, C*0.5], [None, None, JW, None, None, None, None, None, None, Cd*0.5], [None, None, None, Id, None, None, None, None, None, None], [None, None, None, None, None, None, None, None, None, C*1.5], [None, None, None, None, None, None, None, None, None, Cd*1.5], [None, None, None, None, None, None, None, None, Id, None], [None, None, None, None, None, None, None, Id, None, None], [None, None, None, None, None, None, None, None, None, N*4.0], [None, None, None, None, None, None, None, None, None, Id]] # yapf: enable W0_ex = npc.grid_outer(W0_ex, W0_new.legs[:2]) W1_ex = npc.grid_outer(W1_ex, W1_new.legs[:2]) assert npc.norm(W0_new - W0_ex)**2 == 0. # coupling constants: no rounding errors assert npc.norm(W1_new - W1_ex)**2 == 0. # coupling constants: no rounding errors