qml.pulse.transmon_interaction¶
- transmon_interaction(qubit_freq, connections, coupling, wires, anharmonicity=None, d=2)[source]¶
Returns a
ParametrizedHamiltonianrepresenting 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=2corresponds 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=2with 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 inconnectionsare 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=2and is currently the only supported value.
- Returns:
a
ParametrizedHamiltonianrepresenting the transmon interaction- Return type:
Example
We can set up the transmon interaction Hamiltonian with uniform coefficients by passing
floatvalues.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 of4coupling terms and6qubits 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().