## "Excitations with DMRG and segment boundary conditions" notebook questions

How do I use this algorithm? What does that parameter do?
kieran_c
Posts: 1
Joined: 09 Apr 2024, 15:07

### "Excitations with DMRG and segment boundary conditions" notebook questions

I'm working through the "Excitations with DMRG and segment boundary conditions" notebook (https://tenpy.readthedocs.io/en/latest/ ... inite.html) and encountering a few issues. Ultimately I'm trying to implement segment boundary conditions to evaluate the expectation value of an MPO acting on a finite number of sites of a translationally invariant MPS.

Issues:

1) When running all cells of the notebook without alterations, I encounter the following error when runnnig

Code: Select all

E1_s, _ = eng.run()

Code: Select all

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[26], line 2
1 eng = dmrg.TwoSiteDMRGEngine(psi1_s, M_s, dmrg_params, resume_data=resume_psi1_s)
----> 2 E1_s, _ = eng.run()

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/algorithms/dmrg.py:459, in DMRGEngine.run(self)
448 def run(self):
449     """Run the DMRG simulation to find the ground state.
450
451     Returns
(...)
457         i.e. just a reference to :attr:psi.
458     """
--> 459     return super().run()

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/algorithms/mps_common.py:779, in IterativeSweeps.run(self)
777 if not is_first_sweep:
778     self.checkpoint.emit(self)
--> 779 result = self.run_iteration()
780 self.status_update(iteration_start_time=iteration_start_time)
781 is_first_sweep = False

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/algorithms/dmrg.py:307, in DMRGEngine.run_iteration(self)
305 logger.info('Running sweep with optimization')
306 for i in range(self.N_sweeps_check - 1):
--> 307     self.sweep(meas_E_trunc=False)
308 max_trunc_err = self.sweep(meas_E_trunc=True)
309 max_E_trunc = np.max(self.E_trunc_list)

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/algorithms/dmrg.py:544, in DMRGEngine.sweep(self, optimize, meas_E_trunc)
538 """One 'sweep' of the algorithm.
539
540 Thin wrapper around :meth:tenpy.algorithms.mps_common.Sweep.sweep with one additional
541 parameter meas_E_trunc specifying whether to measure truncation energies.
542 """
543 self._meas_E_trunc = meas_E_trunc
--> 544 return super().sweep(optimize)

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/algorithms/mps_common.py:381, in Sweep.sweep(self, optimize)
379     update_data = self.update_local(theta, optimize=optimize)
380     self.update_env(**update_data)
--> 381     self.post_update_local(**update_data)
382     self.free_no_longer_needed_envs()
384 if optimize:  # count optimization sweeps

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/algorithms/dmrg.py:632, in DMRGEngine.post_update_local(self, E0, age, N, ov_change, err, **update_data)
629 self.E_trunc_list.append(E_trunc)
631 if self.psi.bc == 'segment':
--> 632     self.update_segment_boundaries()

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/algorithms/dmrg.py:656, in DMRGEngine.update_segment_boundaries(self)
653 psi.set_B(j, A_new, form='A')
655 old_UL, old_VR = psi.segment_boundaries
--> 656 new_UL = npc.tensordot(old_UL, U, axes=['vR', 'vL'])
657 psi.segment_boundaries = (new_UL, old_VR)
659 for env in self._all_envs:

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/linalg/np_conserved.py:3476, in tensordot(a, b, axes)
3448 """Similar as np.tensordot but for :class:Array.
3449
3450 Builds the tensor product of a and b and sums over the specified axes.
(...)
3473     Returns a scalar in case of a full contraction.
3474 """
3475 # for details on the implementation, see _tensordot_worker.
-> 3476 a, b, axes = _tensordot_transpose_axes(a, b, axes)
3478 # optimize/check for special cases
3479 no_block = (a.stored_blocks == 0 or b.stored_blocks == 0)  # result is zero

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/linalg/_npc_helper.pyx:1261, in tenpy.linalg._npc_helper._tensordot_transpose_axes()

AttributeError: 'NoneType' object has no attribute 'rank'

2) I have tried reproducing the work of this notebook for a different model:

Code: Select all

class TransverseCluster(CouplingModel):
def __init__(self, model_params):
name = "Cluster Ising model"
L = model_params.get('L', 2)
B = model_params.get('B', 0)
bc_MPS = model_params.get('bc_MPS', 'infinite')

# sites
site = SpinHalfSite(conserve=None)

# lattice
bc = 'periodic'
lat = Chain(L, site, bc=bc, bc_MPS=bc_MPS)

# initialize CouplingModel
CouplingModel.__init__(self, lat)

# add terms of the Hamiltonian
-1,
[
('Sigmaz', -1, 0),
('Sigmax', 0, 0),
('Sigmaz', 1, 0),
]
)

# initialize H_MPO
MPOModel.__init__(self, lat, self.calc_H_MPO())

However when proceeding through the same steps as in the notebook, I encounter the following error when initializing the DMRGEngine with the additional initialization environment data:

Code: Select all

File ~/Desktop/numerical_spt_classification/code/venv/lib/python3.11/site-packages/tenpy/networks/mpo.py:2192, in MPOEnvironment.test_sanity(self)
2190 def test_sanity(self):
2191     """Sanity check, raises ValueErrors, if something is wrong."""
-> 2192     assert (self.bra.finite == self.ket.finite == self.H.finite == self.finite)
2193     # check that the physical legs are contractable
2194     for b_s, H_s, k_s in zip(self.bra.sites, self.H.sites, self.ket.sites):

AssertionError:

Tracing back through the errors, this seems to be because for an instance of m of TransverseCluster, m.H_MPO.finite is False whereas it is true for the TFIChain model used in the notebook. I'm not sure how to proceed.

Thanks in advance for any help provided!