Skip to content

Managing the knowledge base

At the heart of QruiseOS is the knowledge base: a comprehensive record of all your QPU data – past and present – so you can track performance trends, reproduce experiments, and maintain a single source of truth. Its role is to preserve:

  • QPU configuration: an explicit record of device settings required to set up and run experiments (drive and readout frequencies, control-line bandwidths, etc.)
  • gate definitions and calibrations: the logical operations you can perform (e.g. X\(\pi\), iSWAP, CZ, ...), together with their calibrated parameters (pulse durations, phases, etc.)
  • experimental results: measured values such as resonance frequencies, \(\pi\)-pulse amplitudes, decay timescales, etc.

Note

To avoid implicit assumptions, these attributes are stored explicitly in the knowledge base so you or your colleagues can retrieve them easily at any point in the future.

Retrieving current qubit data

Let's look at some typical qubit characterisation data stored in the knowledge base. First we need to create a session with create_session(load=True) to load the existing records, and then check we're connected to the correct QPU and on the right branch.

from kb_backend_adapter import create_session

# start session and load existing records from knowledge base
session = create_session(load=True)

# check QPU and branch
session.client.database, session.branch
('onboarding-chip', 'main')

We can retrieve the current attributes of a qubit Q1 by running the following:

from rich.pretty import pprint

qubit = session.Qubit["Q1"]
pprint(qubit)
Qubit(name='Q1', anhar=Quantity(std=254464.40386484083, unit='Hz', value=-327969913.1114249), anhar_coarse=Quantity(default=-230000000.0, range=Range(max_val=-70000000.0, min_val=-300000000.0), std=438376.2100868581, step=1000000.0, unit='Hz', value=-227486396.8502202, window=40000000.0), flux=Quantity(unit='V', value=0.0), flux_crosstalks={}, freq=Quantity(std=3662.132772416767, unit='Hz', value=4307918394.732011), freq_coarse=Quantity(event=PulsedSpectroscopy(_backend_id='PulsedSpectroscopy/clxlimvne0000vkqsyzd8hxww'), std=103114.5478234089, step=1000000.0, unit='Hz', value=3981005314.119921, window=80000000.0), index=0, lo_freq=Quantity(unit='Hz', value=4100000000.0), readout=ReadoutResonator(name='r1'), t1=Quantity(std=8.689329438925107e-07, step=2e-06, unit='s', value=2.4621991856170855e-05), t2star=Quantity(std=1.1273000325659814e-06, step=2e-06, unit='s', value=2.0436006805116355e-05), x180=GateCharacterization(amplitude=Quantity(event=AmplitudeRabi(_backend_id='AmplitudeRabi/ha6ii7udgyv1u4c77yia2dkp'), range=Range(max_val=0.8, min_val=0.05), std=0.0006713481234471507, step=0.01, unit='V', value=0.21384627866541256), drag=Quantity(std=0.014219276863106369, value=0.1365174934091704), duration=Quantity(unit='s', value=5e-08)), x180_amplitude_spectroscopy=Quantity(range=Range(max_val=0.8, min_val=0.05), std=0.0006713479362279471, step=0.01, unit='V', value=0.21384627869581443), x180_ef=GateCharacterization(amplitude=Quantity(std=0.000755780783562164, unit='V', value=0.15887324771995304), duration=Quantity(unit='s', value=5e-08), freq=Quantity(unit='Hz', value=3979948481.620586)), x90=GateCharacterization(amplitude=Quantity(range=Range(max_val=0.4, min_val=0.025), std=0.00013265883629368064, step=0.005, unit='V', value=0.10646839630742695), drag=Quantity(std=0.014219276863106369, value=0.1365174934091704), duration=Quantity(unit='S', value=5e-08)))

Retrieving historical qubit data

Every task executed is given a unique ID, allowing users to easily load it again later to inspect its configuration and results.

If we focus on the x180 attribute, we see there is an event registered alongside the amplitude value within the Quantity object.

pprint(qubit.x180)
GateCharacterization(amplitude=Quantity(event=AmplitudeRabi(_backend_id='AmplitudeRabi/ha6ii7udgyv1u4c77yia2dkp'), range=Range(max_val=0.8, min_val=0.05), std=0.0006713481234471507, step=0.01, unit='V', value=0.21384627866541256), drag=Quantity(std=0.014219276863106369, value=0.1365174934091704), duration=Quantity(unit='s', value=5e-08))

This allows you to trace the origin of the current value of the x180 amplitude. In this case, it came from an AmplitudeRabi task with the unique ID 'AmplitudeRabi/ha6ii7udgyv1u4c77yia2dkp'. To load the amplitude of x180 from this experiment, you can run the following:

# obtain experiment ID
experiment_id = qubit.x180.amplitude.event.get_id()

# load the experiment object
obj = session.load_document(experiment_id)

# access stored data
obj.data

The data is returned as an xarray.Dataset, as shown in the screen capture below.

x180 amplitude

If the data is not available, obj.data will return None.