What additional options are available in CDR?#

In addition to the four necessary ingredients shown in How do I use CDR?, there are additional parameters in CDR.

One option is how many circuits are in the training set (default is 10). This can be changed as follows.

import warnings
warnings.filterwarnings("ignore")

import numpy as np

import cirq
from mitiq import cdr, Observable, PauliString
from mitiq.interface.mitiq_cirq import compute_density_matrix

a, b = cirq.LineQubit.range(2)
circuit = cirq.Circuit(
    cirq.H.on(a), # Clifford
    cirq.H.on(b), # Clifford
    cirq.rz(1.75).on(a),
    cirq.rz(2.31).on(b),
    cirq.CNOT.on(a, b),  # Clifford
    cirq.rz(-1.17).on(b),
    cirq.rz(3.23).on(a),
    cirq.rx(np.pi / 2).on(a),  # Clifford
    cirq.rx(np.pi / 2).on(b),  # Clifford
)
circuit = 5 * circuit

obs = Observable(PauliString("ZZ"), PauliString("X", coeff=-1.75))

def simulate(circuit: cirq.Circuit) -> np.ndarray:
    return compute_density_matrix(circuit, noise_level=(0.0,))

cdr.execute_with_cdr(
    circuit,
    compute_density_matrix,
    observable=obs,
    simulator=simulate,
    seed=0,
    num_training_circuits=20,
).real
1.0289710216444377

Fit function#

Another option is which fit function to use for regression (default is cdr.linear_fit_function()).

cdr.execute_with_cdr(
    circuit,
    compute_density_matrix,
    observable=obs,
    simulator=simulate,
    seed=0,
    fit_function=cdr.linear_fit_function_no_intercept,
).real
1.0297313552824006

Beyond the built-in cdr.linear_fit_function() and cdr.linear_fit_function_no_intercept(), the user could also define other custom functions.

Variable noise CDR#

The circuit and the associated training circuits can also be run at different noise scale factors to implement variable noise Clifford data regression [2].

from mitiq.zne import scaling

cdr.execute_with_cdr(
    circuit,
    compute_density_matrix,
    observable=obs,
    simulator=simulate,
    seed=0,
    scale_factors=(1.0, 3.0),
).real
1.0294348861413898