def test_hamiltonian_eigenvalues(dtype, sparse_type, dense):
    """Testing hamiltonian eigenvalues scaling."""
    if sparse_type is None:
        H1 = hamiltonians.XXZ(nqubits=2, delta=0.5, dense=dense)
    else:
        from scipy import sparse
        H1 = hamiltonians.XXZ(nqubits=5, delta=0.5)
        m = getattr(sparse, f"{sparse_type}_matrix")(K.to_numpy(H1.matrix))
        H1 = hamiltonians.Hamiltonian(5, m)

    H1_eigen = sorted(K.to_numpy(H1.eigenvalues()))
    hH1_eigen = sorted(K.to_numpy(K.eigvalsh(H1.matrix)))
    K.assert_allclose(sorted(H1_eigen), hH1_eigen)

    c1 = dtype(2.5)
    H2 = c1 * H1
    H2_eigen = sorted(K.to_numpy(H2._eigenvalues))
    hH2_eigen = sorted(K.to_numpy(K.eigvalsh(c1 * H1.matrix)))
    K.assert_allclose(H2_eigen, hH2_eigen)

    c2 = dtype(-11.1)
    H3 = H1 * c2
    if sparse_type is None:
        H3_eigen = sorted(K.to_numpy(H3._eigenvalues))
        hH3_eigen = sorted(K.to_numpy(K.eigvalsh(H1.matrix * c2)))
        K.assert_allclose(H3_eigen, hH3_eigen)
    else:
        assert H3._eigenvalues is None
Beispiel #2
0
def test_gap(backend, dense, check_degenerate):
    from qibo import hamiltonians
    h0 = hamiltonians.X(4, dense=dense)
    if check_degenerate:
        # use h=0 to make this Hamiltonian degenerate
        h1 = hamiltonians.TFIM(4, h=0, dense=dense)
    else:
        h1 = hamiltonians.TFIM(4, h=1, dense=dense)

    ham = lambda t: (1 - t) * h0.matrix + t * h1.matrix
    targets = {"ground": [], "excited": [], "gap": []}
    for t in np.linspace(0, 1, 11):
        eigvals = K.real(K.eigvalsh(ham(t)))
        targets["ground"].append(eigvals[0])
        targets["excited"].append(eigvals[1])
        targets["gap"].append(eigvals[1] - eigvals[0])
    if check_degenerate:
        targets["gap"][-1] = eigvals[3] - eigvals[0]

    gap = callbacks.Gap(check_degenerate=check_degenerate)
    ground = callbacks.Gap(0)
    excited = callbacks.Gap(1)
    evolution = AdiabaticEvolution(h0,
                                   h1,
                                   lambda t: t,
                                   dt=1e-1,
                                   callbacks=[gap, ground, excited])
    final_state = evolution(final_time=1.0)
    targets = {k: K.stack(v) for k, v in targets.items()}
    K.assert_allclose(ground[:], targets["ground"])
    K.assert_allclose(excited[:], targets["excited"])
    K.assert_allclose(gap[:], targets["gap"])
Beispiel #3
0
 def entropy(self, rho):
     """Calculates entropy of a density matrix via exact diagonalization."""
     # Diagonalize
     eigvals = K.real(K.eigvalsh(rho))
     # Treating zero and negative eigenvalues
     drop_condition = eigvals > EIGVAL_CUTOFF
     masked_eigvals = K.gather(eigvals, condition=drop_condition)
     spectrum = -1 * K.log(masked_eigvals)
     if self.compute_spectrum:
         self.spectrum.append(spectrum)
     entropy = K.sum(masked_eigvals * spectrum)
     return entropy / self._log2