#
# Copyright 2021 Keysight Technologies Inc.
#
"""
Extended Randomized Benchmarking (XRB)
======================================
"""
#%%
# This example illustrates how to generate extended randomized benchmarking
# (:tqdoc:`XRB`\) circuits and use them to estimate the probability of a stochastic
# error acting on the specified system(s) during a random gate. While this example uses
# a :doc:`simulator<../../guides/run/simulator>` to execute the circuits, the same
# procedure can be followed for hardware applications.
#%%
# Isolated XRB
# ------------
#
# This section illustrates how to generate :tqdoc:`XRB` circuits to characterize a pair
# of qubits in isolation. Here, we are performing two-qubit :tqdoc:`XRB` which learns
# the stochastic infidelity over the two-qubit Clifford gateset.
#%%
import trueq as tq
# generate XRB circuits to characterize a pair of qubits [0, 1]
# with 9 * 30 random circuits for each circuit depth [2, 4, 16]
circuits = tq.make_xrb([[0, 1]], [2, 4, 16], 30)
# initialize a noisy simulator with stochastic Pauli and overrotation
sim = tq.Simulator().add_stochastic_pauli(px=0.02).add_overrotation(0.04)
# run the circuits on the simulator to populate their results
sim.run(circuits, n_shots=1000)
# plot the exponential decay of the purities
circuits.plot.raw()
#%%
# print the fit summary
circuits.fit()
#%%
# Simultaneous XRB
# ----------------
#
# This section demonstrates how to generate :tqdoc:`XRB` circuits that characterize the
# amount of stochastic noise while gates are applied simultaneously on a device.
#%%
# generate XRB circuits to simultaneously characterize a single qubit [0],
# a pair of qubits [1, 2], and another single qubit [3] with 9 * 30 random circuits
# for each circuit depth [2, 4, 16]
circuits = tq.make_xrb([[0], [1, 2], [3]], [2, 4, 16], 30)
# initialize a noisy simulator with stochastic Pauli and overrotation
sim = tq.Simulator().add_stochastic_pauli(px=0.02).add_overrotation(0.04)
# run the circuits on the simulator to populate their results
sim.run(circuits, n_shots=1000)
# plot the exponential decay of the purities
circuits.plot.raw()
#%%
# print the fit summary
circuits.fit()