A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/qutip/qutip/issues/2595 below:

Dimension mismatch in solving energy restricted eigenstates · Issue #2595 · qutip/qutip · GitHub

Bug Description

Calling Qobj.eigenstates() of an operator created with energy restricted functionality raises an error. I believe this is due to the dimension refactoring of v5. The dimension of the solved eigenvectors are set by this list representation from Qobj.dims instead of the underlying Dimension/Space instances. Specifically here, the list is used instead of the EnrSpace instance, and thus information about the excitation limit is lost, raising a dimension/shape mismatch error in the Qobj constructor.

The simplest solution, inspired by another ENR issue #2387, would be to use _dims instead of dims in lines 1509-1512 (master at the time of writing) of qobj.py:

        if self.type == 'super':
            new_dims = [self._dims[0], [1]]
        else:
            new_dims = [self._dims[0], [1]*len(self.dims[0])]

I quickly checked that the superoperators work as well, but I am not sure how general the approach is.

Code to Reproduce the Bug
# Hamiltonian of two uncoupled qubits (harmonic oscillators limited to 2 levels) with energies e1 and e2, and only one excitation allowed in the system.

import qutip as qt
dims = [2, 2]
excitations = 1
e1, e2 = 1, 2
a1, a2 = qt.enr_destroy(dims, excitations)
H = e1*a1.dag()*a1 + e2*a2.dag()*a2
H.eigenstates()
Code Output
ValueError                                Traceback (most recent call last)
Cell In[3], line 6
      4 a1, a2 = qt.enr_destroy(dims, excitations)
      5 H = e1*a1.dag()*a1 + e2*a2.dag()*a2
----> 6 H.eigenstates()

File ~\anaconda3\envs\bare_qt5\Lib\site-packages\qutip\core\qobj.py:1514, in Qobj.eigenstates(self, sparse, sort, eigvals, tol, maxiter, phase_fix)
   1512     new_dims = [self.dims[0], [1]*len(self.dims[0])]
   1513 ekets = np.empty((evecs.shape[1],), dtype=object)
-> 1514 ekets[:] = [Qobj(vec, dims=new_dims, copy=False)
   1515             for vec in _data.split_columns(evecs, False)]
   1516 norms = np.array([ket.norm() for ket in ekets])
   1517 if phase_fix is None:

File ~\anaconda3\envs\bare_qt5\Lib\site-packages\qutip\core\qobj.py:279, in Qobj.__init__(self, arg, dims, copy, superrep, isherm, isunitary)
    277 self._isherm = isherm
    278 self._isunitary = isunitary
--> 279 self._initialize_data(arg, dims, copy)
    281 if superrep is not None:
    282     self.superrep = superrep

File ~\anaconda3\envs\bare_qt5\Lib\site-packages\qutip\core\qobj.py:265, in Qobj._initialize_data(self, arg, dims, copy)
    261     self._dims = Dimensions(
    262         dims or [[self._data.shape[0]], [self._data.shape[1]]]
    263     )
    264 if self._dims.shape != self._data.shape:
--> 265     raise ValueError('Provided dimensions do not match the data: ' +
    266                      f"{self._dims.shape} vs {self._data.shape}")

ValueError: Provided dimensions do not match the data: (np.int64(4), np.int64(1)) vs (3, 1)
Expected Behaviour

I expect v5 to work like v4.7.5, where the same code gives the following output:

(array([0., 1., 2.]),
 array([Quantum object: dims = [[2, 2], [1, 1]], shape = (3, 1), type = ket
        Qobj data =
        [[1.]
         [0.]
         [0.]]                                                             ,
        Quantum object: dims = [[2, 2], [1, 1]], shape = (3, 1), type = ket
        Qobj data =
        [[0.]
         [0.]
         [1.]]                                                             ,
        Quantum object: dims = [[2, 2], [1, 1]], shape = (3, 1), type = ket
        Qobj data =
        [[0.]
         [1.]
         [0.]]                                                             ],
       dtype=object))
Your Environment
QuTiP Version:      5.1.0
Numpy Version:      2.2.1
Scipy Version:      1.15.0
Cython Version:     None
Matplotlib Version: 3.10.0
Python Version:     3.12.8
Number of CPUs:     8
BLAS Info:          Generic
INTEL MKL Ext:      None
Platform Info:      Windows (AMD64)
Additional Context

Contributing to the Qutip community is new territory for me, so please bare with me as learn the ropes. I'm happy to create a PR with additional testing for this issue, if the suggested solution seems reasonable.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4