-
Pulse level access
Q20 Service in MyCSC
There are currently some issues with the Q20 service for projects that have Q20 allocations. If you cannot find the Aalto-Q20 service or are otherwise experiencing issues please contact the CSC Service Desk at servicedesk@csc.fi.
Pulse level access
Pulse level access gives the user a lower level of control over their quantum jobs. Instead of only defining jobs via circuits using gates with pulse level access the user has control over the control pulses of the quantum computer. Pulse level access to both VTT Q50 and Aalto Q20 is enabled through the IQM Pulla python package. IQM Pulla is already installed in the module for each quantum computer. Below you'll find an overview on running pulse level jobs from LUMI on the available quantum computers. For more advanced documentation on using IQM Pulla see IQM's documentation
Device-specific values
The examples on this page use placeholders <DEVICE_VALUE>, <QUANTUM_COMPUTER_ID>, and <CORTEX_URL>. Replace them with the runtime identifiers for your target device, listed under "Runtime identifiers" on the Aalto Q20 or VTT Q50 page.
Load the environment
Import packages
import os
from qiskit import QuantumCircuit
from qiskit.compiler import transpile
from iqm.iqm_client.util import print_env_vars
from iqm.qiskit_iqm import IQMProvider
from iqm.pulla.pulla import Pulla
from iqm.pulla.utils_qiskit import qiskit_to_pulla, sweep_job_to_qiskit
Define Pulla client and backend
DEVICE_CORTEX_URL = os.getenv('<CORTEX_URL>')
p = Pulla(DEVICE_CORTEX_URL, quantum_computer="<QUANTUM_COMPUTER_ID>")
provider = IQMProvider(DEVICE_CORTEX_URL, quantum_computer="<QUANTUM_COMPUTER_ID>")
backend = provider.get_backend()
Define a quantum circuit
Transpile to backend
Convert to Pulla
circuits, compiler = qiskit_to_pulla(p, backend, qc_transpiled)
shots = 100
settings = compiler.get_settings(circuits=circuits)
settings.set_shots(shots)
job_definition, context = compiler.compile(circuits, settings=settings)
Visualise pulse scheduling
Optionally it is possible to visualise the pulse scheduling before submitting the job.
from iqm.pulse.playlist.visualisation.base import inspect_playlist
from IPython.core.display import HTML
HTML(inspect_playlist(job_definition.sweep_definition.playlist, [0]))
Submit through Pulla
job = p.submit_playlist(job_definition, context=context)
job.wait_for_completion()
qiskit_result = sweep_job_to_qiskit(job, shots=shots)
print(f"Raw results:\n{job.result().circuit_measurement_results}\n")
print(f"Qiskit result counts:\n{qiskit_result.get_counts()}\n")
Running through LUMI
For instructions on running the job on LUMI, see the example batch scripts or use the Lumi web Interface