Introduction to Protocols
TrueQ™ provides a number of diagnostic and assessment protocols for generating and characterizing gates, cycles and full circuits. These protocols are described in detail in Error Diagnostics.
To get a sense of what these different protocol methods create, here is a simple example generating circuits for single qubit Streamlined Randomized Benchmarking (SRB) experiment:
import trueq as tq
circuits = tq.make_srb(labels=[0], n_random_cycles=[4, 32], n_circuits=25)
In this example circuits
is a single qubit CircuitCollection
, a
collection of circuits to be run. The CircuitCollection
object is
essentially an iterable object of Circuit
s, each of which describes
a single circuit to be run on a quantum device. A circuit stores both the quantum
operations to be performed in each cycle of the circuit, and the experimental or
simulated results once it has been run.
There are three essential steps for every protocol:
Generate a circuit collection using a function such as
make_srb()
as above or any of the other functions in Error Diagnostics.Iterate through the circuit objects and perform them experimentally, recording their worked examples using any of the methods outlined in Running Circuits.
Analyze the data using the
fit()
method of the circuit collection.
Inspecting Generated Circuits
Since a CircuitCollection
is effectively a list of circuits,
individual circuits can be inspected using standard list indexing:
circuits[0].draw()
Every circuit generated using a make_*
protocol in TrueQ™ additionally contains a
Key
used to store information about the generation method used. This
meta data can be viewed using trueq.Circuit.key
.
circuits[0].key
Key(compiled_pauli=Weyls('I'), measurement_basis=Weyls('Z'), n_random_cycles=4, protocol='SRB', twirl=Twirl({(0,): 'C'}, dim=2))
The Key
of each circuit is essentially a hashable frozen dictionary
containing data about how the circuits were generated. This information is used
internally by TrueQ™ during analysis, but it is often useful for the user to be able
to read them. Some of the more frequently generated keys entries are listed below:
 protocol 
The characterization protocol used to generate a circuit.
 cycle 
A “clock cycle” of a circuit; a set of operations that happen in parallel to a disjoint set of systems.
 n_random_cycles 
The number of independent random cycles in the circuit.
 measurement_basis 
An nqubit Pauli operator describing the changeofbasis gates added prior to measurement.
 twirl 
The twirling group used to generate a circuit.
 compiled_pauli 
The nqubit Pauli operator that was compiled into the circuit immediately before measurement.
 seq_label 
A number to group related sequences used internally by some fitting tools.
 subsystems 
The subsystems to analyze for a given protocol.
Each circuit generated by one of the protocol generation methods will have its own key.
All keys present in any CircuitCollection
can be viewed using its
keys()
method. Here we can view all keys present in the
SRB circuit collection created above:
circuits.keys()
KeySet
List of all the keys in the KeySet

protocol
The characterization protocol used to generate a circuit.

twirl
The twirling group used to generate a circuit.

n_random_cycles
The number of independent random cycles in the circuit.

compiled_pauli
The nqubit Pauli operator that was compiled into the circuit immediately before measurement.

measurement_basis
An nqubit Pauli operator describing the changeofbasis gates added prior to measurement.

Key

SRB  Cliffords on [0]  4  Y  Z 
Key

SRB  Cliffords on [0]  4  I  Z 
Key

SRB  Cliffords on [0]  4  X  Z 
Key

SRB  Cliffords on [0]  4  Z  Z 
Key

SRB  Cliffords on [0]  32  Z  Z 
Key

SRB  Cliffords on [0]  32  Y  Z 
Key

SRB  Cliffords on [0]  32  X  Z 
Key

SRB  Cliffords on [0]  32  I  Z 
Analyzing Results
To analyze the results of a given protocol, we call the
fit()
method, which is a universal function for
CircuitCollection
s containing Circuit
s from any
subset of TrueQ™'s error diagnostic protocols. The
fit()
method returns estimates for the set of
protocolspecific parameters.
In order to use the fit()
method, we need to populate
the Results
attribute of each circuit in the collection (see
Example: Recording Results).
Let’s walk through a quick example with our builtin Simulator
:
import trueq as tq
# generate SRB circuits on a single qubit
circuit_collection = tq.make_srb(0, [4, 20, 60])
# create a noisy simulator
sim = tq.Simulator().add_overrotation(0.03)
# run the circuits on the noisy simulator and populate the results attribute
sim.run(circuit_collection)
Call the fit()
method:
circuit_collection.fit()
SRB
Streamlined Randomized Benchmarking

Cliffords
(0,)

${e}_{F}$
The probability of an error acting on the targeted systems during a random gate.

1.6e03 (4.0e04)
0.0016378020825551232, 0.00040093340665422545

${p}$
Decay parameter of the exponential decay $Ap^m$.

1.0e+00 (5.3e04)
0.9978162638899265, 0.0005345778755389673

${A}$
SPAM parameter of the exponential decay $Ap^m$.

1.0e+00 (7.4e03)
1.0050948266930644, 0.007388588222718004

The printed table contains the parameter estimates returned when the results are
analyzed. Every protocol will return different estimates corresponding to the parameters
the protocol is characterizing. Mousing over a parameter will give a short description
of what the parameter means. If a circuit collection contains circuits from more than
one error diagnostic protocol, fit
will return fits
for each protocol. For example, if we add some XRB circuits to the circuit
collection we defined above, we get the following:
# generate XRB circuits and append them to the circuit_collection
circuit_collection += tq.make_xrb(1, [4, 20, 60])
# run circuits again to populate XRB circuits. We set overwrite = False to keep the
# results obtained above for the SRB circuits
sim.run(circuit_collection, overwrite=False)
# analyze results
circuit_collection.fit()
SRB
Streamlined Randomized Benchmarking

Cliffords
(0,)

${e}_{F}$
The probability of an error acting on the targeted systems during a random gate.

1.4e03 (3.2e04)
0.0014023195863078763, 0.0003190657229743686

${p}$
Decay parameter of the exponential decay $Ap^m$.

1.0e+00 (4.3e04)
0.9981302405515895, 0.0004254209639658249

${A}$
SPAM parameter of the exponential decay $Ap^m$.

1.0e+00 (5.5e03)
1.0017680382404182, 0.005505629985970824

XRB
Extended Randomized Benchmarking

Cliffords
(1,)

${e}_{S}$
The probability of a stochastic error acting on the specified systems during a random gate.

2.7e04 (2.1e04)
0.0002656601690663729, 0.0002082603753938353

${u}$
The unitarity of the noise, that is, the average decrease in the purity of an initial state.

1.0e+00 (5.6e04)
0.9992916669829236, 0.0005552134637527956

${A}$
SPAM parameter of the exponential decay $Au^m$.

1.1e+00 (1.4e02)
1.0594030797914422, 0.013577998381868493

Optional Fitting Arguments
Valid options for the trueq.CircuitCollection.fit()
method.
Certain analysis routines use optional arguments. The table below is an
exhaustive list of possible arguments. These arguments can be passed into
the fit()
method as keyword arguments.
type 
object 

properties 


A small prime to be used as the qudit dimension during analysis. This can be used to account for leakage levels. 

default 
null 

oneOf 
type 
null 

type 
number 

oneOf 
enum 
2, 3, 5, 7 


A list of strings that specify the observables to compute expectation values of. The supported observables include computational basis states, e.g. 

type 
array 

default 

items 
type 
string 

pattern 
^([\dIXYZ]W\d\d)+$ 