qml.pulse.transmon_interaction

transmon_interaction(qubit_freq, connections, coupling, wires, anharmonicity=None, d=2)[source]

Returns a ParametrizedHamiltonian representing the circuit QED Hamiltonian of a superconducting transmon system.

The Hamiltonian is given by

\[H = \sum_{q\in \text{wires}} \omega_q b^\dagger_q b_q + \sum_{(i, j) \in \mathcal{C}} g_{ij} \left(b^\dagger_i b_j + b_j^\dagger b_i \right) + \sum_{q\in \text{wires}} \alpha_q b^\dagger_q b^\dagger_q b_q b_q\]

where \([b_p, b_q^\dagger] = \delta_{pq}\) are creation and annihilation operators. The first term describes the effect of the dressed qubit frequencies qubit_freq \(= \omega_q/ (2\pi)\), the second term their coupling \(= g_{ij}/(2\pi)\) and the last the anharmonicity \(= \alpha_q/(2\pi)\), which all can vary for different qubits. In practice, these operators are restricted to a finite dimension of the local Hilbert space (default d=2 corresponds to qubits). In that case, the anharmonicity is set to \(\alpha=0\) and ignored.

The values of \(\omega\) and \(\alpha\) are typically around \(5 \times 2\pi \text{GHz}\) and \(0.3 \times 2\pi \text{GHz}\), respectively. It is common for different qubits to be out of tune with different energy gaps. The coupling strength \(g\) typically varies between \([0.001, 0.1] \times 2\pi \text{GHz}\). For some example parameters, see e.g. arXiv:1804.04073, arXiv:2203.06818, or arXiv:2210.15812.

Note

Currently only supporting d=2 with qudit support planned in the future. For d=2, we have \(b:=\frac{1}{2}(\sigma^x + i \sigma^y)\).

See also

transmon_drive()

Parameters
  • qubit_freq (Union[float, list[float], Callable]) – List of dressed qubit frequencies. This should be in units of frequency (GHz), and will be converted to angular frequency \(\omega\) internally where needed, i.e. multiplied by \(2 \pi\). When passing a single float all qubits are assumed to have that same frequency. When passing a parametrized function, it must have two arguments, the first one being the trainable parameters and the second one being time.

  • connections (list[tuple(int)]) – List of connections (i, j) between qubits i and j. When the wires in connections are not contained in wires, a warning is raised.

  • coupling (Union[float, list[float]]) – List of coupling strengths. This should be in units of frequency (GHz), and will be converted to angular frequency internally where needed, i.e. multiplied by \(2 \pi\). Needs to match the length of connections. When passing a single float need explicit wires.

  • anharmonicity (Union[float, list[float]]) – List of anharmonicities. This should be in units of frequency (GHz), and will be converted to angular frequency internally where needed, i.e. multiplied by \(2 \pi\). Ignored when d=2. When passing a single float all qubits are assumed to have that same anharmonicity.

  • wires (list) – Needs to be of the same length as qubit_freq. Note that there can be additional wires in the resulting operator from the connections, which are treated independently.

  • d (int) – Local Hilbert space dimension. Defaults to d=2 and is currently the only supported value.

Returns

a ParametrizedHamiltonian representing the transmon interaction

Return type

ParametrizedHamiltonian

Example

We can set up the transmon interaction Hamiltonian with uniform coefficients by passing float values.

connections = [[0, 1], [1, 3], [2, 1], [4, 5]]
H = qml.pulse.transmon_interaction(qubit_freq=0.5, connections=connections, coupling=1., wires=range(6))

The resulting HardwareHamiltonian: consists of 4 coupling terms and 6 qubits because there are six different wire indices in connections.

>>> print(H)
HardwareHamiltonian: terms=10

We can also provide individual values for each of the qubit energies and coupling strengths, here of order \(0.1 \times 2\pi\text{GHz}\) and \(1 \times 2\pi\text{GHz}\), respectively.

qubit_freqs = [0.5, 0.4, 0.3, 0.2, 0.1, 0.]
couplings= [1., 2., 3., 4.]
H = qml.pulse.transmon_interaction(qubit_freq=qubit_freqs,
                                   connections=connections,
                                   coupling=couplings,
                                   wires=range(6))

The interaction term is dependent only on the typically fixed transmon energies and coupling strengths. Executing this as a pulse program via evolve() would correspond to all driving fields being turned off. To add a driving field, see transmon_drive().