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 theircoupling
\(= g_{ij}/(2\pi)\) and the last theanharmonicity
\(= \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 (defaultd=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. Ford=2
, we have \(b:=\frac{1}{2}(\sigma^x + i \sigma^y)\).See also
- 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 inconnections
are not contained inwires
, 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 explicitwires
.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
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 of4
coupling terms and6
qubits because there are six different wire indices inconnections
.>>> 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, seetransmon_drive()
.