{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Robust Phase Estimation (RPE) Tutorial\n", "This notebook demonstrates how to use Robust Phase Estimation (RPE) to estimate certain parameters of a standard single-qubit model. The RPE protocol is contained within the `extras` package of pyGSTi." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Import relevant namespaces.\n", "\n", "import pygsti\n", "from pygsti.modelpacks.legacy import std1Q_XY as Std1Q_XY\n", "from pygsti.extras import rpe\n", "\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Declare the particular RPE instance we are interested in\n", "#(X and Y pi/2 rotations)\n", "#(Prep and measurement are for the |0> state. See below for prep and measure in |0> and |1>, respectively.)\n", "rpeconfig_inst = rpe.rpeconfig_GxPi2_GyPi2_00" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Declare a variety of relevant parameters\n", "\n", "target_model = Std1Q_XY.target_model()\n", "target_model.set_all_parameterizations('TP')\n", "maxLengths_1024 = [1,2,4,8,16,32,64,128,256,512,1024]\n", "\n", "stringListsRPE = rpe.rpeconstruction.create_rpe_angle_circuits_dict(10,rpeconfig_inst)\n", "\n", "angleList = ['alpha','epsilon','theta']\n", "\n", "numStrsD = {}\n", "numStrsD['RPE'] = [6*i for i in np.arange(1,12)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Create noisy model\n", "mdl_real = target_model.randomize_with_unitary(.01,seed=0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Extract noisy model angles\n", "true_alpha = rpe.extract_alpha(mdl_real,rpeconfig_inst)\n", "true_epsilon = rpe.extract_epsilon(mdl_real,rpeconfig_inst)\n", "true_theta = rpe.extract_theta(mdl_real,rpeconfig_inst)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Simulate dataset\n", "N=1000\n", "DS = pygsti.construction.simulate_data(mdl_real,stringListsRPE['totalStrList'],N,sample_error='binomial',seed=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Analyze dataset\n", "resultsRPE = rpe.analyze_rpe_data(DS,mdl_real,stringListsRPE,rpeconfig_inst)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Print results\n", "print('alpha_true - pi/2 =',true_alpha-np.pi/2)\n", "print('epsilon_true - pi/2 =',true_epsilon-np.pi/2)\n", "print('theta_true =',true_theta)\n", "print()\n", "print('alpha_true - alpha_est_final =',resultsRPE['alphaErrorList'][-1])\n", "print('epsilon_true - epsilon_est_final =',resultsRPE['epsilonErrorList'][-1])\n", "print('theta_true - theta_est_final =',resultsRPE['thetaErrorList'][-1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Repeat above with prep and measure in |0> and |1>, respectively.)\n", "rpeconfig_inst = rpe.rpeconfig_GxPi2_GyPi2_UpDn" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Declare a variety of relevant parameters\n", "target_model = pygsti.construction.create_explicit_model([('Q0',)], ['Gx','Gy'],[ \"X(pi/2,Q0)\", \"Y(pi/2,Q0)\"],\n", " effect_expressions=['1','0'])\n", "target_model.set_all_parameterizations('TP')\n", "maxLengths_1024 = [1,2,4,8,16,32,64,128,256,512,1024]\n", "\n", "stringListsRPE = rpe.rpeconstruction.create_rpe_angle_circuits_dict(10,rpeconfig_inst)\n", "\n", "angleList = ['alpha','epsilon','theta']\n", "\n", "numStrsD = {}\n", "numStrsD['RPE'] = [6*i for i in np.arange(1,12)]" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Create noisy model\n", "mdl_real = target_model.randomize_with_unitary(.01,seed=0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Extract noisy model angles\n", "true_alpha = rpe.extract_alpha(mdl_real,rpeconfig_inst)\n", "true_epsilon = rpe.extract_epsilon(mdl_real,rpeconfig_inst)\n", "true_theta = rpe.extract_theta(mdl_real,rpeconfig_inst)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Simulate dataset\n", "N=1000\n", "DS = pygsti.construction.simulate_data(mdl_real,stringListsRPE['totalStrList'],N,sample_error='binomial',seed=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Analyze dataset\n", "resultsRPE = rpe.analyze_rpe_data(DS,mdl_real,stringListsRPE,rpeconfig_inst)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Print results\n", "print('alpha_true - pi/2 =',true_alpha-np.pi/2)\n", "print('epsilon_true - pi/2 =',true_epsilon-np.pi/2)\n", "print('theta_true =',true_theta)\n", "print()\n", "print('alpha_true - alpha_est_final =',resultsRPE['alphaErrorList'][-1])\n", "print('epsilon_true - epsilon_est_final =',resultsRPE['epsilonErrorList'][-1])\n", "print('theta_true - theta_est_final =',resultsRPE['thetaErrorList'][-1])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.6" } }, "nbformat": 4, "nbformat_minor": 1 }