{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "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 gate set. The RPE protocol is contained within the `extras` package of pyGSTi." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Import relevant namespaces.\n", "from __future__ import print_function\n", "\n", "import pygsti\n", "import pygsti.construction.std1Q_XY as Std1Q_XY\n", "from pygsti.extras import rpe\n", "\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "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": 3, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Declare a variety of relevant parameters\n", "\n", "gs_target = Std1Q_XY.gs_target.copy()\n", "gs_target.set_all_parameterizations('TP')\n", "maxLengths_1024 = [1,2,4,8,16,32,64,128,256,512,1024]\n", "\n", "stringListsRPE = rpe.rpeconstruction.make_rpe_angle_string_list_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": 4, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Create noisy gateset\n", "gs_real = gs_target.randomize_with_unitary(.01,seed=0)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Extract noisy gateset angles\n", "true_alpha = rpe.extract_alpha(gs_real,rpeconfig_inst)\n", "true_epsilon = rpe.extract_epsilon(gs_real,rpeconfig_inst)\n", "true_theta = rpe.extract_theta(gs_real,rpeconfig_inst)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Simulate dataset\n", "N=1000\n", "DS = pygsti.construction.generate_fake_data(gs_real,stringListsRPE['totalStrList'],N,sampleError='binomial',seed=1)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Analyze dataset\n", "resultsRPE = rpe.analyze_rpe_data(DS,gs_real,stringListsRPE,rpeconfig_inst)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "alpha_true - pi/2 = 0.027964941551336997\n", "epsilon_true - pi/2 = 0.006715911233777128\n", "theta_true = 0.023304121047909736\n", "\n", "alpha_true - alpha_est_final = 4.136221313455479e-05\n", "epsilon_true - epsilon_est_final = 4.843096931717028e-05\n", "theta_true - theta_est_final = 0.012088866000948092\n" ] } ], "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": 9, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "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": 10, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Declare a variety of relevant parameters\n", "\n", "gs_target = pygsti.construction.build_gateset([2],[('Q0',)], ['Gx','Gy'],[ \"X(pi/2,Q0)\", \"Y(pi/2,Q0)\"],\n", " effectExpressions=['1','0'])\n", "gs_target.set_all_parameterizations('TP')\n", "maxLengths_1024 = [1,2,4,8,16,32,64,128,256,512,1024]\n", "\n", "stringListsRPE = rpe.rpeconstruction.make_rpe_angle_string_list_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": 11, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Create noisy gateset\n", "gs_real = gs_target.randomize_with_unitary(.01,seed=0)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Extract noisy gateset angles\n", "true_alpha = rpe.extract_alpha(gs_real,rpeconfig_inst)\n", "true_epsilon = rpe.extract_epsilon(gs_real,rpeconfig_inst)\n", "true_theta = rpe.extract_theta(gs_real,rpeconfig_inst)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Simulate dataset\n", "N=1000\n", "DS = pygsti.construction.generate_fake_data(gs_real,stringListsRPE['totalStrList'],N,sampleError='binomial',seed=1)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [ "#Analyze dataset\n", "resultsRPE = rpe.analyze_rpe_data(DS,gs_real,stringListsRPE,rpeconfig_inst)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "alpha_true - pi/2 = 0.027964941551336997\n", "epsilon_true - pi/2 = 0.006715911233777128\n", "theta_true = 0.023304121047909736\n", "\n", "alpha_true - alpha_est_final = 4.136221313455479e-05\n", "epsilon_true - epsilon_est_final = 4.843096931717028e-05\n", "theta_true - theta_est_final = 0.012088866000948092\n" ] } ], "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": { "collapsed": true, "deletable": true, "editable": true }, "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.5.2" } }, "nbformat": 4, "nbformat_minor": 1 }