diff --git a/QRW Linear Systems Problem.ipynb b/QRW Linear Systems Problem.ipynb new file mode 100644 index 0000000..585e999 --- /dev/null +++ b/QRW Linear Systems Problem.ipynb @@ -0,0 +1,265 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": "/opt/conda/lib/python3.7/site-packages/qiskit/providers/ibmq/ibmqfactory.py:192: UserWarning: Timestamps in IBMQ backend properties, jobs, and job results are all now in local time instead of UTC.\n warnings.warn('Timestamps in IBMQ backend properties, jobs, and job results '\n" + } + ], + "source": "%matplotlib inline\n# Importing standard Qiskit libraries and configuring account\nfrom qiskit import QuantumCircuit, execute, Aer, IBMQ\nfrom qiskit.compiler import transpile, assemble\nfrom qiskit.tools.jupyter import *\nfrom qiskit.visualization import *\n# Loading your IBM Q account(s)\nprovider = IBMQ.load_account()" + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "import numpy as np\nimport random as rand\nimport qiskit\nimport timeit\nfrom qiskit.providers.ibmq.managed import IBMQJobManager" + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "## common code\ndef error(x, x_estimate):\n return np.linalg.norm(x - x_estimate) / np.linalg.norm(x)\n\ndef binarylist_to_int(binary_list):\n \n sum = 0\n \n two_power = 1\n \n for digit in binary_list[-1::-1]:\n sum += two_power * digit\n \n two_power *= 2\n \n return sum\n\n\n\ndef int_to_binarylist(integer, num_digits):\n \"\"\"\n integer: int\n \n num_digits: int, at least 1\n \n returns a list of length num_digits, including leading 0s if necessary\n \"\"\"\n \n if num_digits < len(bin(integer)) - 2:\n raise Exception(\"num_digits too short\")\n\n \n binary_list = []\n \n for i in range(num_digits)[::-1]:\n two_power = 2**(i)\n \n binary_list.append(int(integer/two_power))\n \n integer -= int(integer/two_power) * two_power\n \n return binary_list" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "# Classical Random Walk LSP" + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "class ClassicalRandomWalkHamming:\n \n \"\"\"\n code for classical random walk (?) \n \"\"\"\n \n import numpy as np\n import random as rand\n \n def __init__(self, theta_list):\n \n \"\"\"\n theta_list: list of angles, whose cos and sin correspond to non-flip and flip probabilities\n [theta_n-1, theta_n-2, ..., theta_1, theta_0]\n \n \"\"\"\n \n self.theta_list = theta_list\n \n self.n = len(theta_list)\n \n def p_matrix(self):\n \"\"\"\n generates and returns P matrix denoted by thetas\n \n the J', J-th element is defined by prod_{l=0,...,n-1} cos^2(theta_l/2)^(1-i_l) * sin^2(theta_l/2)^i_l\n \n \"\"\"\n \n matrix = np.ones((2**self.n, 2**self.n)) # start with one, to be multiplied\n \n for i in range(2**self.n):\n for j in range(2**self.n):\n \n xor_int = i ^ j\n \n xor_binary = int_to_binarylist(xor_int, self.n)\n \n for idx, digit in enumerate(xor_binary):\n if digit == 1: # flip\n matrix[i,j] *= np.sin(self.theta_list[idx]/2)**2\n elif digit == 0:\n matrix[i,j] *= np.cos(self.theta_list[idx]/2)**2\n else:\n raise Exception(\"Value error\")\n \n return matrix \n \n \n def random_step(self, current_node):\n \"\"\"\n current_node: list of 0s and 1s [b_n-1, b_n-2, ..., b_1, b_0]\n \n iterates through each digit and flips according to probabilities given by thetas\n \n returns a list of 0s and 1s\n \"\"\"\n \n def bit_flip(one_or_zero):\n if one_or_zero == 0:\n return 1\n elif one_or_zero == 1:\n return 0\n else:\n raise Exception(\"Value not 0 or 1\")\n \n# for idx, theta in enumerate(self.theta_list):\n# rand_val = rand.random() # simulate coin flip with value between 0 and 1\n \n# if rand_val < (np.sin(theta/2))**2: # flip\n# current_node[idx] = bit_flip(current_node[idx])\n \n# else: # if rand_val < (np.sin(theta))**2 + (np.cos(theta))**2\n# pass # don't flip\n\n for idx, theta in enumerate(self.theta_list): # start with theta_{n-1}, end with theta_0\n rand_val = rand.random() # generate random value between 0 and 1\n \n if rand_val > (np.sin(theta/2))**2: \n pass\n else: # if rand_val < (np.sin(theta))**2) + np.cos((theta))**2\n current_node[idx] = bit_flip(current_node[idx])\n \n return current_node\n \n def random_walk(self, initial_node, num_steps):\n \"\"\"\n initial_node: list of 0s and 1s [b_n-1, b_n-2, ..., b_1, b_0]\n \n returns a list of 0s and 1s\n \"\"\"\n \n current_node = initial_node\n \n for step in range(num_steps):\n current_node = self.random_step(current_node)\n \n return current_node\n \n \ndef x_component_crw(theta_list, gamma, b, x_component_index, c, d):\n \"\"\"\n theta_list: list of angles, whose cos and sin correspond to non-flip and flip probabilities\n [theta_n-1, theta_n-2, ..., theta_1, theta_0]\n \n for A = 1 - gamma*P,\n \n A @ x = b\n \n A_inv = sum_{s=0,...,inf} (gamma^s * P^s)\n A_inv_c = sum_{s=0,...,c} (gamma^s * P^s)\n \n x_c = A_inv_c @ b\n \n b: 1D list or np.array representing end result vector\n x_component_index: int\n c: int; truncation of series (deptH)\n d: int; number of times to perform each step (num_shots)\n \n returns the appropriate index value of x_c (truncated up to error ~ gamma^c)\n \"\"\"\n crw = ClassicalRandomWalkHamming(theta_list)\n \n prep_node = int_to_binarylist(x_component_index, num_digits = crw.n)\n \n x_component = 0\n \n for s in range(0, c+1): # number of steps starting at 0\n \n total_sum = 0\n \n for iter in range(d):\n final_node = crw.random_walk(prep_node, s)\n final_node_int = binarylist_to_int(final_node)\n total_sum += b[final_node_int]\n \n avg_sum = total_sum / d\n \n avg_sum *= gamma**s\n \n ## add to component value\n x_component += avg_sum\n \n return x_component" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "### 32 x 32 Random Matrix Test" + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "n = 5\ntheta_list = [rand.random()*np.pi for i in range(n)] ## generate random angles\n\ncrw = ClassicalRandomWalkHamming(theta_list)\nP = crw.p_matrix() ## get stochastic matrix\n\ngamma = 0.5 * rand.random() # multiplicative constant between 0 and 1 - made smaller for illustrative purposes\n\nA = np.eye(2**n) - gamma*P\nb = np.array([-1+2*rand.random() for i in range(2**n)]) ## generate random vector\nx = np.linalg.inv(A) @ b ## calculate exact solution" + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "0.32903943794434065\n[[0.00066927 0.07664998 0.00018832 ... 0.07114605 0.00017479 0.02001869]\n [0.07664998 0.00066927 0.02156735 ... 0.00062121 0.02001869 0.00017479]\n [0.00018832 0.02156735 0.00066927 ... 0.02001869 0.00062121 0.07114605]\n ...\n [0.07114605 0.00062121 0.02001869 ... 0.00066927 0.02156735 0.00018832]\n [0.00017479 0.02001869 0.00062121 ... 0.02156735 0.00066927 0.07664998]\n [0.02001869 0.00017479 0.07114605 ... 0.00018832 0.07664998 0.00066927]]\n[[ 9.99779784e-01 -2.52208672e-02 -6.19633200e-05 ... -2.34098561e-02\n -5.75139780e-05 -6.58693790e-03]\n [-2.52208672e-02 9.99779784e-01 -7.09651036e-03 ... -2.04403619e-04\n -6.58693790e-03 -5.75139780e-05]\n [-6.19633200e-05 -7.09651036e-03 9.99779784e-01 ... -6.58693790e-03\n -2.04403619e-04 -2.34098561e-02]\n ...\n [-2.34098561e-02 -2.04403619e-04 -6.58693790e-03 ... 9.99779784e-01\n -7.09651036e-03 -6.19633200e-05]\n [-5.75139780e-05 -6.58693790e-03 -2.04403619e-04 ... -7.09651036e-03\n 9.99779784e-01 -2.52208672e-02]\n [-6.58693790e-03 -5.75139780e-05 -2.34098561e-02 ... -6.19633200e-05\n -2.52208672e-02 9.99779784e-01]]\n[ 0.27738457 -0.43997708 0.24858126 -0.64119325 0.95831478 0.10323327\n 0.79821222 0.76007852 -0.71660015 -0.67060899 0.69950272 0.63839389\n 0.27261371 0.76314578 0.56428877 0.74000234 0.72547628 0.45592842\n -0.40658708 0.70081588 0.03855794 -0.87243825 0.23276107 0.42350044\n 0.8050136 -0.17920948 0.32607003 -0.28856041 0.52889852 0.64552415\n -0.67626816 -0.36839715]\n[ 0.2985103 -0.33680684 0.3164614 -0.53023054 1.07900319 0.23268531\n 0.91537249 0.85315736 -0.68798994 -0.54005659 0.77699867 0.72479348\n 0.31628107 0.92235101 0.69040503 0.87339903 0.74074382 0.54261715\n -0.33176126 0.81946174 0.16670658 -0.74244845 0.36715817 0.53536646\n 0.82176215 -0.05456947 0.39188783 -0.19130458 0.58254367 0.81512192\n -0.54221076 -0.21760448]\n" + } + ], + "source": "print(gamma)\nprint(P)\nprint(A)\nprint(b)\nprint(x)" + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "time elapsed: 29.29904199996963\n" + } + ], + "source": "## get solution with random walk\nstart = timeit.default_timer()\n### timing\ndepth = 6 \nnum_shots = 5000 ## num_shots\n\nx_estimate = np.array([x_component_crw(theta_list, gamma, b, x_component_index, depth, num_shots) \n for x_component_index in range(2**n)]) ## get solution vector with CRW\n\n###########\nend = timeit.default_timer()\nprint(f\"time elapsed: {end-start}\")" + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "data": { + "text/plain": "0.0685673645532875" + }, + "execution_count": 14, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": "## getting error rate\nerror(x, x_estimate)" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "# Quantum Random Walk LSP - With Simulated Backend" + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "def int_to_binarylist(integer, num_digits):\n \"\"\"\n integer: int\n \n num_digits: int, at least 1\n \n returns a list of length num_digits, including leading 0s if necessary\n \"\"\"\n \n if num_digits < len(bin(integer)) - 2:\n raise Exception(\"num_digits too short\")\n\n \n binary_list = []\n \n for i in range(num_digits)[::-1]:\n two_power = 2**(i)\n \n binary_list.append(int(integer/two_power))\n \n integer -= int(integer/two_power) * two_power\n \n return binary_list\n\n\nclass QuantumRandomWalkHamming:\n \n import numpy as np\n import qiskit\n \n def __init__(self, angle_list):\n \"\"\"\n angle_list: list of [theta, phi, lambda] triples, starting with index n-1 and ending with 0 (left to right)\n \n \"\"\"\n self.angle_list = angle_list\n \n self.n = len(angle_list)\n \n \n def p_matrix(self):\n \"\"\"\n generates the appropriate numpy matrix\n \n \"\"\"\n matrix = np.ones( (2**self.n, 2**self.n) ) # start with ones, values will be multiplied\n \n for i in range(2**self.n): # rows\n for j in range(2**self.n): # columns\n \n xor_int = i ^ j\n \n xor_binarylist = int_to_binarylist(xor_int, self.n)\n \n # test pairs n-1,n-2; n-2,n-3; ...; 1,0\n for idx in range(len(xor_binarylist) - 1):\n \n power = xor_binarylist[idx] ^ xor_binarylist[idx+1]\n \n if power == 1:\n matrix[i][j] *= np.sin(self.angle_list[idx][0]/2)**2 # sin(theta_idx/2) ^ 2\n elif power == 0:\n matrix[i][j] *= np.cos(self.angle_list[idx][0]/2)**2 # cos(theta_idx/2) ^ 2\n else:\n raise Exception(\"Value error\")\n \n # test pair 0,-1\n idx = len(xor_binarylist) - 1\n power = xor_binarylist[idx]\n \n if power == 1:\n matrix[i][j] *= np.sin(self.angle_list[idx][0]/2)**2\n elif power == 0:\n matrix[i][j] *= np.cos(self.angle_list[idx][0]/2)**2\n else:\n raise Exception(\"Value error\")\n \n return matrix\n \n \n def random_step(self, initial_node):\n \"\"\"\n initial_node: an int as a binary_list\n \n returns the final node as a binary_list\n \"\"\"\n \n ## instantiate circuit stuff\n qr = qiskit.QuantumRegister(self.n + 1) # nth index qubit is coin \n cr = qiskit.ClassicalRegister(self.n)\n \n qc = qiskit.QuantumCircuit(qr, cr)\n \n ## initialize registers according to initial_node\n for idx, bit in enumerate(initial_node[-1::-1]):\n if bit == 1:\n qc.x(idx)\n elif bit == 0:\n pass\n else:\n raise Exception(\"Value error\")\n \n \n ## perform coin flip unitary operations and cnots\n # iterate from back to front, since self.angle_list goes from n-1 to 0\n for idx, triple in enumerate(self.angle_list[-1::-1]):\n \n # apply u3 to coin qubit\n qc.u(triple[0], triple[1], triple[2], self.n) # (theta, phi, lambda, coin_idx)\n \n # apply cnot, with control on coin qubit, target on idx-th qubit \n qc.cnot(self.n, idx) # (control, target)\n \n # apply measurement operation\n qc.measure(qr[0:self.n], cr[0:self.n]) # exclude coin qubit\n \n ## readout final result, then convert to binary_list\n # use qasm simulator by default\n result = qiskit.execute(qc, backend = qiskit.Aer.get_backend('qasm_simulator'), shots = 1).result()\n counts = result.get_counts()\n \n# print(counts)\n \n # convert dict_keys to list, then get key\n final_node_str = list(counts.keys())[0] # returned as str\n \n final_node_list = [digit_char for digit_char in final_node_str]\n \n final_node_binarylist = [int(digit_char) for digit_char in final_node_list]\n \n return final_node_binarylist\n \n def random_walk(self, initial_node, num_steps):\n \"\"\"\n initial_node: an int as a binary_list\n num_steps: int\n \n \"\"\"\n \n current_node = initial_node\n \n for step in range(num_steps):\n \n current_node = self.random_step(current_node)\n \n return current_node\n \n \n \n## code for qrw linear solver\ndef x_component_qrw(angle_list, gamma, b, x_component_index, c, d):\n \"\"\"\n angle_list: list of [theta, phi, lambda] triples that correspond to coin unitaries\n listed n-1, n-2, ..., 0 from left to right\n \n for A = 1 - gamma*P,\n \n A @ x = b\n \n A_inv = sum_{s=0,...,inf} (gamma^s * P^s)\n A_inv_c = sum_{s=0,...,c} (gamma^s * P^s)\n \n x_c = A_inv_c @ b\n \n b: 1D list or np.array representing end result vector\n x_component_index: int\n c: int; cutoff \n d: int; number of times to perform each step - a value from 100 to 10000 can be used \n \n returns the appropriate index value of x_c (truncated up to error ~ gamma^c)\n \"\"\"\n qrw = QuantumRandomWalkHamming(angle_list)\n \n prep_node = int_to_binarylist(x_component_index, num_digits = qrw.n)\n \n x_component = 0\n \n for s in range(0, c+1): # number of steps starting at 0\n \n total_sum = 0\n \n for iter in range(d):\n final_node = qrw.random_walk(prep_node, s)\n final_node_int = binarylist_to_int(final_node)\n total_sum += b[final_node_int]\n \n avg_sum = total_sum / d\n \n avg_sum *= gamma**s\n \n ## add to component value\n x_component += avg_sum\n \n return x_component" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "### 4 x 4 Random Matrix Test" + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "n = 2 # for 2^2 = 4\n\nangle_list = [(rand.random()*np.pi, 0, 0) for i in range(n)] ## generate random triplets\n\nqrw = QuantumRandomWalkHamming(angle_list)\nP = qrw.p_matrix()\n\ngamma = 0.5 * rand.random() # multiplicative constant between 0 and 1 - made smaller for illustrative purposes\n\nA = np.eye(2**n) - gamma*P\nb = np.array([-1+2*rand.random() for i in range(2**n)])\nx = np.linalg.inv(A) @ b" + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "0.1666172355114866\n[[0.82203621 0.00660186 0.0419287 0.12943324]\n [0.00660186 0.82203621 0.12943324 0.0419287 ]\n [0.0419287 0.12943324 0.82203621 0.00660186]\n [0.12943324 0.0419287 0.00660186 0.82203621]]\n[[ 0.8630346 -0.00109998 -0.00698604 -0.02156581]\n [-0.00109998 0.8630346 -0.02156581 -0.00698604]\n [-0.00698604 -0.02156581 0.8630346 -0.00109998]\n [-0.02156581 -0.00698604 -0.00109998 0.8630346 ]]\n[-0.44112706 0.17299481 -0.4602122 -0.20322823]\n[-0.5214052 0.18445667 -0.53317591 -0.24769647]\n" + } + ], + "source": "print(gamma)\nprint(P)\nprint(A)\nprint(b)\nprint(x)" + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "time elapsed: 32.44782046799082\n" + } + ], + "source": "## get solution with random walk\nstart = timeit.default_timer()\n### timing\n\ndepth = 6 \nnum_shots = 100 ## num_shots\n\nx_estimate = np.array([x_component_qrw(angle_list, gamma, b, x_component_index, depth, num_shots) \n for x_component_index in range(2**n)])\n\n###########\nend = timeit.default_timer()\nprint(f\"time elapsed: {end-start}\")" + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "data": { + "text/plain": "0.009133708604856367" + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": "## getting error rate\nerror(x, x_estimate)" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "# Quantum Random Walk LSP - With Real Backend\nNote: this might take a while to execute on real systems due to long queue wait times" + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "class QuantumRandomWalkHamming:\n \n import numpy as np\n import qiskit\n \n def __init__(self, angle_list):\n \"\"\"\n angle_list: list of [theta, phi, lambda] triples, starting with index n-1 and ending with 0 (left to right)\n \n \"\"\"\n self.angle_list = angle_list\n \n self.n = len(angle_list)\n \n \n def p_matrix(self):\n \"\"\"\n generates the appropriate numpy matrix\n \n \"\"\"\n matrix = np.ones( (2**self.n, 2**self.n) ) # start with ones, values will be multiplied\n \n for i in range(2**self.n): # rows\n for j in range(2**self.n): # columns\n \n xor_int = i ^ j\n \n xor_binarylist = int_to_binarylist(xor_int, self.n)\n \n # test pairs n-1,n-2; n-2,n-3; ...; 1,0\n for idx in range(len(xor_binarylist) - 1):\n \n power = xor_binarylist[idx] ^ xor_binarylist[idx+1]\n \n if power == 1:\n matrix[i][j] *= np.sin(self.angle_list[idx][0]/2)**2 # sin(theta_idx/2) ^ 2\n elif power == 0:\n matrix[i][j] *= np.cos(self.angle_list[idx][0]/2)**2 # cos(theta_idx/2) ^ 2\n else:\n raise Exception(\"Value error\")\n \n # test pair 0,-1\n idx = len(xor_binarylist) - 1\n power = xor_binarylist[idx]\n \n if power == 1:\n matrix[i][j] *= np.sin(self.angle_list[idx][0]/2)**2\n elif power == 0:\n matrix[i][j] *= np.cos(self.angle_list[idx][0]/2)**2\n else:\n raise Exception(\"Value error\")\n \n return matrix\n \n \n def random_step(self, initial_node):\n \"\"\"\n initial_node: an int as a binary_list\n \n returns the final node as a binary_list\n \"\"\"\n \n ## instantiate circuit stuff\n qr = qiskit.QuantumRegister(self.n + 1) # nth index qubit is coin \n cr = qiskit.ClassicalRegister(self.n)\n \n qc = qiskit.QuantumCircuit(qr, cr)\n \n ## initialize registers according to initial_node\n for idx, bit in enumerate(initial_node[-1::-1]):\n if bit == 1:\n qc.x(idx)\n elif bit == 0:\n pass\n else:\n raise Exception(\"Value error\")\n \n \n ## perform coin flip unitary operations and cnots\n # iterate from back to front, since self.angle_list goes from n-1 to 0\n for idx, triple in enumerate(self.angle_list[-1::-1]):\n \n # apply u3 to coin qubit\n qc.u(triple[0], triple[1], triple[2], self.n) # (theta, phi, lambda, coin_idx)\n \n # apply cnot, with control on coin qubit, target on idx-th qubit \n qc.cnot(self.n, idx) # (control, target)\n \n# # apply measurement operation\n qc.measure(qr[0:self.n], cr[0:self.n]) # exclude coin qubit\n ### note: previously I forgot to uncomment this \n \n ### unused code from qasm_simulator implementation \n# ## readout final result, then convert to binary_list\n# # use qasm simulator by default\n# result = qiskit.execute(qc, backend = qiskit.Aer.get_backend('qasm_simulator'), shots = 1).result()\n# counts = result.get_counts()\n \n# # print(counts)\n \n# # convert dict_keys to list, then get key\n# final_node_str = list(counts.keys())[0] # returned as str\n \n# final_node_list = [digit_char for digit_char in final_node_str]\n \n# final_node_binarylist = [int(digit_char) for digit_char in final_node_list]\n \n# return final_node_binarylist\n\n return qc\n \n def random_walk(self, initial_node, num_steps):\n \"\"\"\n initial_node: an int as a binary_list\n num_steps: int\n \n \"\"\"\n \n current_node = initial_node\n \n for step in range(num_steps):\n \n current_node = self.random_step(current_node)\n \n return current_node\n \n## code for qrw linear solver\ndef x_component_qrw(angle_list, gamma, b, x_component_index, c, d, backend_obj):\n \"\"\"\n angle_list: list of [theta, phi, lambda] triples that correspond to coin unitaries\n listed n-1, n-2, ..., 0 from left to right\n \n for A = 1 - gamma*P,\n \n A @ x = b\n \n A_inv = sum_{s=0,...,inf} (gamma^s * P^s)\n A_inv_c = sum_{s=0,...,c} (gamma^s * P^s)\n \n x_c = A_inv_c @ b\n \n b: 1D list or np.array representing end result vector\n x_component_index: int\n c: int; cutoff \n d: int; number of times to perform each step - a value from 100 to 10000 can be used \n \n returns the appropriate index value of x_c (truncated up to error ~ gamma^c)\n \"\"\"\n from qiskit.providers.ibmq.managed import IBMQJobManager\n import time\n \n qrw = QuantumRandomWalkHamming(angle_list)\n \n prep_node = int_to_binarylist(x_component_index, num_digits = qrw.n)\n \n x_component = 0 ## final value to be returned\n \n walk_nodes = [prep_node for i in range(d)]\n \n \n ## total number of batches\n completed_jobs = 0\n total_jobs = 0\n for s in range(1, c+1):\n for sub_step in range(s):\n total_jobs += int(np.ceil(d/75))\n \n ## for 0 steps\n total_sum = 0\n \n for i in range(d):\n final_node_list = walk_nodes[i]\n\n final_node_int = binarylist_to_int(final_node_list)\n total_sum += b[final_node_int]\n \n avg_sum = total_sum / d\n \n avg_sum *= gamma**0\n \n x_component += avg_sum\n \n \n for s in range(1, c+1): # number of steps starting at 1\n \n total_sum = 0\n \n walk_nodes = [prep_node for i in range(d)]\n \n for sub_step in range(s): ## don't reuse steps \n \n ## submit jobs\n qc_list = []\n\n for node in walk_nodes:\n qc_list.append(qrw.random_step(node))\n\n transpiled_thing = qiskit.transpile(qc_list, backend = backend_obj)\n\n job_manager = IBMQJobManager()\n\n job_set = job_manager.run(transpiled_thing, backend = backend_obj, shots = 1)\n\n ## get results\n start = timeit.default_timer()\n while True:\n time.sleep(2)\n\n completed_idx = job_set.report().find('Successful jobs: ')\n # queue_idx = job_set.report().find('queue position: ')\n\n current_completed_jobs = job_set.report()[completed_idx:][len('Successful jobs: ')]\n\n # if queue_idx == -1:\n # queue_position = -1\n # else:\n # queue_position = job_set.report()[queue_idx:][len('queue position: ')]\n\n ## for each step, 1st number is # of batches completed, 2nd number is # of total batches, 3rd is time elapsed\n# print('\\r', current_completed_jobs, str(int(np.ceil(d/75))), (timeit.default_timer()-start), end = '', flush = True)\n# print('\\r', str(completed_batches+int(current_completed_jobs)), \n# str(total_batches), (timeit.default_timer()-start), end = '', flush = True)\n print(f\"\\r jobs done: {completed_jobs+int(current_completed_jobs)}/{total_jobs}, current batch time: {timeit.default_timer()-start}\", end = '', flush = True)\n if current_completed_jobs == str(int(np.ceil(d/75))):\n completed_jobs += int(current_completed_jobs)\n break # jobs are finished\n\n results = job_set.results()\n\n for i in range(d):\n final_node_str = list(results.get_counts(i).keys())[0]\n final_node_list = [int(digit_char) for digit_char in final_node_str]\n\n # update nodes\n walk_nodes[i] = final_node_list.copy()\n \n ## calculate addend at the end\n for i in range(d):\n final_node_str = list(results.get_counts(i).keys())[0]\n final_node_list = [int(digit_char) for digit_char in final_node_str]\n \n final_node_int = binarylist_to_int(final_node_list)\n total_sum += b[final_node_int]\n \n avg_sum = total_sum / d\n \n avg_sum *= gamma**s\n \n ## add to component value\n x_component += avg_sum\n \n return x_component" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": "### 4 x 4 Random Matrix Test" + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "n = 2 # for 2^2 = 4\n\nangle_list = [(rand.random()*np.pi, 0, 0) for i in range(n)] ## generate random triplets\n\nqrw = QuantumRandomWalkHamming(angle_list)\nP = qrw.p_matrix()\n\ngamma = 0.5 * rand.random() # multiplicative constant between 0 and 1 - made smaller for illustrative purposes\n\nA = np.eye(2**n) - gamma*P\nb = np.array([-1+2*rand.random() for i in range(2**n)])\nx = np.linalg.inv(A) @ b" + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "0.10963546816737957\n[[0.83965326 0.00657658 0.05715513 0.09661503]\n [0.00657658 0.83965326 0.09661503 0.05715513]\n [0.05715513 0.09661503 0.83965326 0.00657658]\n [0.09661503 0.05715513 0.00657658 0.83965326]]\n[[ 9.07944222e-01 -7.21026177e-04 -6.26622996e-03 -1.05924338e-02]\n [-7.21026177e-04 9.07944222e-01 -1.05924338e-02 -6.26622996e-03]\n [-6.26622996e-03 -1.05924338e-02 9.07944222e-01 -7.21026177e-04]\n [-1.05924338e-02 -6.26622996e-03 -7.21026177e-04 9.07944222e-01]]\n[ 0.81120779 -0.37702974 0.63761067 0.11690127]\n[ 0.89958965 -0.40538519 0.70384553 0.13700992]\n" + } + ], + "source": "print(gamma)\nprint(P)\nprint(A)\nprint(b)\nprint(x)" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "trusted": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": "component #0:\n jobs done: 27/42, current batch time: 3860.4572056260662" + } + ], + "source": "## get solution with random walk\nstart = timeit.default_timer()\n### timing\n\nbackend_string = 'ibmq_santiago' ## change according to backend\nbackend = provider.get_backend(backend_string)\n\ndepth = 6 \nnum_shots = 100 ## num_shots\n\nx_estimate = np.array([0 for idx in range(2**n)])\nfor x_component_index in range(2**n):\n print(f\"component #{x_component_idx}:\")\n x_estimate[x_component_index] = x_component_qrw(angle_list, gamma, b, x_component_index, depth, num_shots, backend)\n print()\n\n###########\nend = timeit.default_timer()\nprint(f\"time elapsed: {end-start}\")" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "trusted": true + }, + "outputs": [], + "source": "## getting error rate\nerror(x, x_estimate)" + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file diff --git a/Quantum Random Walk Search.ipynb b/Quantum Random Walk Search.ipynb new file mode 100644 index 0000000..88dcbb5 --- /dev/null +++ b/Quantum Random Walk Search.ipynb @@ -0,0 +1,777 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quantum Random Walk Search\n", + "Source: \n", + "* https://arxiv.org/pdf/quant-ph/0210064.pdf\n", + "* https://digitalcommons.calpoly.edu/cgi/viewcontent.cgi?article=1202&context=physsp\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Operator + State Definitions" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "n = 2\n", + "\n", + "psi_c = 1/2**0.5 * np.array([[1],\n", + " [1]]) # equal superposition\n", + "\n", + "G = 2*np.outer(psi_c, psi_c.T) - np.eye(n)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "G = np.round(G)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[-0. 1.]\n", + " [ 1. -0.]]\n" + ] + } + ], + "source": [ + "print(G)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0 1 0 0 0 0 0 0]\n", + " [1 0 0 0 0 0 0 0]\n", + " [0 0 0 1 0 0 0 0]\n", + " [0 0 1 0 0 0 0 0]\n", + " [0 0 0 0 0 0 1 0]\n", + " [0 0 0 0 0 0 0 1]\n", + " [0 0 0 0 1 0 0 0]\n", + " [0 0 0 0 0 1 0 0]]\n" + ] + } + ], + "source": [ + "S = np.kron(np.array([[1,0],[0,0]]), np.array([[0,1,0,0],[1,0,0,0],[0,0,0,1],[0,0,1,0]])) \\\n", + " + np.kron(np.array([[0,0],[0,1]]), np.array([[0,0,1,0], [0,0,0,1], [1,0,0,0], [0,1,0,0]]))\n", + "\n", + "print(S)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "U = S @ (np.kron(G, np.eye(2**n)))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0. 0. 0. 0. 0. 1. 0. 0.]\n", + " [0. 0. 0. 0. 1. 0. 0. 0.]\n", + " [0. 0. 0. 0. 0. 0. 0. 1.]\n", + " [0. 0. 0. 0. 0. 0. 1. 0.]\n", + " [0. 0. 1. 0. 0. 0. 0. 0.]\n", + " [0. 0. 0. 1. 0. 0. 0. 0.]\n", + " [1. 0. 0. 0. 0. 0. 0. 0.]\n", + " [0. 1. 0. 0. 0. 0. 0. 0.]]\n" + ] + } + ], + "source": [ + "print(U)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "## instantiate target state\n", + "\n", + "x_target = np.array([[0],\n", + " [1],\n", + " [0],\n", + " [0]]) ## |x_target> = |01>\n", + "\n", + "# x_target = np.array([[1],[0],[0],[0]])\n", + "# x_target = np.array([[0], [0], [0], [1]])" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "C = - np.eye(n)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "C_prime = np.kron(G, np.eye(2**n)) + np.kron((C - G), np.outer(x_target, x_target.T) )" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Revised C_prime operator: \n", + "\"the oracle\n", + "acts instead by applying a marking coin, C1, to the marked node and a different coin, C, to the unmarked nodes\"\n", + "\n", + "Accordingly, instead of combining (C-G) with |x_target> |01> + |0>|11> + |1>|00> + |1>|01>" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": {}, + "outputs": [], + "source": [ + "## third evolution\n", + "psi_3 = U_prime_revised @ psi_2" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0. ]\n", + " [0.35355339]\n", + " [0. ]\n", + " [0. ]\n", + " [0. ]\n", + " [0.35355339]\n", + " [0. ]\n", + " [0. ]]\n" + ] + } + ], + "source": [ + "print(psi_3) # note: here, the probability of measuring the target state is greatly improved to 100% (accounting for renormalization)\n", + "# state: |0>|01> + |1>|01>" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "## fourth evolution\n", + "psi_4 = U_prime_revised @ psi_3" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]]\n" + ] + } + ], + "source": [ + "print(psi_4) # note: after this point, the evolutions no longer benefit the search" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "## fifth evolution\n", + "psi_5 = U_prime_revised @ psi_4" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]\n", + " [0.]]\n" + ] + } + ], + "source": [ + "print(psi_5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Result:\n", + "The repeated evolutions eliminate the amplitudes of non-target states, thereby increasing the amplitude of the desired target state, until there is a 50% chance of measuring the target state after the third evolution. \n", + "\n", + "However, evolutions beyond the optimal number will have a negative effect on the search result" + ] + } + ], + "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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Quantum Random Walk Visualization.ipynb b/Quantum Random Walk Visualization.ipynb new file mode 100644 index 0000000..79fe957 --- /dev/null +++ b/Quantum Random Walk Visualization.ipynb @@ -0,0 +1,571 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\__init__.py:53: RuntimeWarning: Could not import the Aer provider from the qiskit-aer package. Install qiskit-aer or check your installation.\n", + " warnings.warn('Could not import the Aer provider from the qiskit-aer '\n", + "C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\__init__.py:60: RuntimeWarning: Could not import the IBMQ provider from the qiskit-ibmq-provider package. Install qiskit-ibmq-provider or check your installation.\n", + " warnings.warn('Could not import the IBMQ provider from the '\n" + ] + }, + { + "ename": "ModuleNotFoundError", + "evalue": "No module named 'qiskit.transpiler.passes.routing.cython.stochastic_swap.utils'", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnumpy\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mrandom\u001b[0m \u001b[1;32mas\u001b[0m \u001b[0mrand\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 4\u001b[1;33m \u001b[1;32mimport\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\__init__.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 65\u001b[0m \u001b[1;31m# Moved to after IBMQ and Aer imports due to import issues\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 66\u001b[0m \u001b[1;31m# with other modules that check for IBMQ (tools)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 67\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mexecute\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mexecute\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 68\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcompiler\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtranspile\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0massemble\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mschedule\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 69\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\execute.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[1;33m.\u001b[0m\u001b[1;33m.\u001b[0m \u001b[0mautofunction\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mexecute\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 23\u001b[0m \"\"\"\n\u001b[1;32m---> 24\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcompiler\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtranspile\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0massemble\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 25\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mqobj\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mMeasLevel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mMeasReturnType\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 26\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\compiler\\__init__.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 33\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 34\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0massemble\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0massemble\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 35\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mtranspile\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtranspile\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 36\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mschedule\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mschedule\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\compiler\\transpile.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 14\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 15\u001b[0m \u001b[1;34m\"\"\"Circuit transpile function\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 16\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtranspiler\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mLayout\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mCouplingMap\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 17\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtools\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mparallel\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mparallel_map\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtranspiler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtranspile_config\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mTranspileConfig\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\transpiler\\__init__.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 74\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mcoupling\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mCouplingMap\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 75\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mlayout\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mLayout\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 76\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mtranspile_circuit\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mtranspile_circuit\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\transpiler\\transpile_circuit.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 15\u001b[0m \u001b[1;34m\"\"\"Circuit transpile function\"\"\"\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 16\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 17\u001b[1;33m from qiskit.transpiler.preset_passmanagers import (level_0_pass_manager,\n\u001b[0m\u001b[0;32m 18\u001b[0m \u001b[0mlevel_1_pass_manager\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 19\u001b[0m \u001b[0mlevel_2_pass_manager\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\transpiler\\preset_passmanagers\\__init__.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 29\u001b[0m \"\"\"\n\u001b[0;32m 30\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 31\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mlevel0\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mlevel_0_pass_manager\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 32\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mlevel1\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mlevel_1_pass_manager\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 33\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mlevel2\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mlevel_2_pass_manager\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\transpiler\\preset_passmanagers\\level0.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 21\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mextensions\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstandard\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mSwapGate\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 22\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 23\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtranspiler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpasses\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mUnroller\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 24\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtranspiler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpasses\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mDecompose\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 25\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtranspiler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mpasses\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mCheckMap\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\transpiler\\passes\\__init__.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 114\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 115\u001b[0m \u001b[1;31m# routing\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 116\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mrouting\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mBasicSwap\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 117\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mrouting\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mLookaheadSwap\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 118\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mrouting\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mStochasticSwap\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\transpiler\\passes\\routing\\__init__.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 17\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mbasic_swap\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mBasicSwap\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mlookahead_swap\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mLookaheadSwap\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 19\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mstochastic_swap\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mStochasticSwap\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[1;32m~\\Miniconda3\\envs\\av\\lib\\site-packages\\qiskit\\transpiler\\passes\\routing\\stochastic_swap.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 28\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mqiskit\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mtranspiler\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlayout\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mLayout\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 29\u001b[0m \u001b[1;31m# pylint: disable=no-name-in-module\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 30\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mcython\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstochastic_swap\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutils\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mnlayout_from_layout\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 31\u001b[0m \u001b[1;31m# pylint: disable=no-name-in-module\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 32\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[1;33m.\u001b[0m\u001b[0mcython\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstochastic_swap\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mswap_trial\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mswap_trial\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'qiskit.transpiler.passes.routing.cython.stochastic_swap.utils'" + ] + } + ], + "source": [ + "### imports\n", + "import numpy as np\n", + "import random as rand\n", + "import qiskit" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Classical Random Walk, For Reference" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from platform import python_version" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'3.8.5'" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "python_version()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "from matplotlib import animation\n", + "\n", + "def barlist(n): \n", + " return [1/float(n*k) for k in range(1,6)]\n", + "\n", + "fig=plt.figure()\n", + "\n", + "n=1000 #Number of frames\n", + "x=range(1,6)\n", + "barcollection = plt.bar(x,barlist(1))\n", + "\n", + "def animate(i):\n", + " y=barlist(i+1)\n", + " for i, b in enumerate(barcollection):\n", + " b.set_height(y[i])\n", + "\n", + "anim=animation.FuncAnimation(fig,animate,repeat=False,blit=False,frames=n,\n", + " interval=100)\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "x_points = [1, 2, 3, 4, 5]\n", + "y_heights = [2, 3, 5, 7, 8]\n", + "width = 4\n", + "\n", + "def init():\n", + " plt.cla()\n", + "\n", + "p1 = plt.bar(x_points,y_heights,width,color='b')\n", + "\n", + "def animate(i):\n", + " for rect, y in zip(p1, y_heights):\n", + " rect.set_height(y)\n", + "\n", + "anim = animation.FuncAnimation(fig,animate,init_func=init,frames=400,interval=10,blit=False)\n", + "\n", + "for i in range(3):\n", + " y_heights[2] += 1\n", + " anim = animation.FuncAnimation(fig,animate,init_func=init,frames=400,interval=10,blit=False)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "import time" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib\n", + "matplotlib.use('TKAgg')\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "def animated_barplot():\n", + " # http://www.scipy.org/Cookbook/Matplotlib/Animations\n", + " mu, sigma = 100, 15\n", + " N = 4\n", + " x = mu + sigma*np.random.randn(N)\n", + " rects = plt.bar(range(N), x, align = 'center')\n", + " for i in range(50):\n", + " time.sleep(1)\n", + " x = mu + sigma*np.random.randn(N)\n", + " for rect, h in zip(rects, x):\n", + " rect.set_height(h)\n", + " fig.canvas.draw()\n", + "\n", + "fig = plt.figure()\n", + "win = fig.canvas.manager.window\n", + "win.after(100, animated_barplot)\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [ + { + "ename": "TypeError", + "evalue": "tuple indices must be integers or slices, not tuple", + "output_type": "error", + "traceback": [ + "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[0;32m 14\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 15\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0mi\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnumEvents\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 16\u001b[1;33m \u001b[1;32mfor\u001b[0m \u001b[0mrect\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mh\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mrects\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mhistogramSeries\u001b[0m\u001b[1;33m[\u001b[0m\u001b[0mi\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 17\u001b[0m \u001b[0mrect\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mset_height\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mh\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 18\u001b[0m \u001b[0mfig\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcanvas\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdraw\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", + "\u001b[1;31mTypeError\u001b[0m: tuple indices must be integers or slices, not tuple" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Exception in Tkinter callback\n", + "Traceback (most recent call last):\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n", + " return self.func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 804, in callit\n", + " func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n", + " self.draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n", + " super(FigureCanvasTkAgg, self).draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n", + " self.figure.draw(self.renderer)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n", + " def _draw(renderer): raise Done(renderer)\n", + "matplotlib.backend_bases._get_renderer..Done: \n", + "Exception in Tkinter callback\n", + "Traceback (most recent call last):\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n", + " return self.func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 242, in resize\n", + " self.draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n", + " super(FigureCanvasTkAgg, self).draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n", + " self.figure.draw(self.renderer)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n", + " def _draw(renderer): raise Done(renderer)\n", + "matplotlib.backend_bases._get_renderer..Done: \n", + "Exception in Tkinter callback\n", + "Traceback (most recent call last):\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n", + " return self.func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 804, in callit\n", + " func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n", + " self.draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n", + " super(FigureCanvasTkAgg, self).draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n", + " self.figure.draw(self.renderer)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n", + " def _draw(renderer): raise Done(renderer)\n", + "matplotlib.backend_bases._get_renderer..Done: \n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "numBins = 100\n", + "numEvents = 100000\n", + "\n", + "mu, sigma = 100, 15\n", + "N = 4\n", + "x = mu + sigma*np.random.randn(N)\n", + "histogramSeries = plt.bar(range(N), x, align = 'center')\n", + "\n", + "fig, ax = plt.subplots()\n", + "rects = ax.bar(range(numBins), np.ones(numBins)*40) # 40 is upper bound of y-axis \n", + "\n", + "for i in range(numEvents):\n", + " for rect,h in zip(rects,histogramSeries[i,:]):\n", + " rect.set_height(h)\n", + " fig.canvas.draw()\n", + " plt.pause(0.001)" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Exception in Tkinter callback\n", + "Traceback (most recent call last):\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n", + " return self.func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 804, in callit\n", + " func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n", + " self.draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n", + " super(FigureCanvasTkAgg, self).draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n", + " self.figure.draw(self.renderer)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n", + " def _draw(renderer): raise Done(renderer)\n", + "matplotlib.backend_bases._get_renderer..Done: \n", + "Exception in Tkinter callback\n", + "Traceback (most recent call last):\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n", + " return self.func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 242, in resize\n", + " self.draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n", + " super(FigureCanvasTkAgg, self).draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n", + " self.figure.draw(self.renderer)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n", + " def _draw(renderer): raise Done(renderer)\n", + "matplotlib.backend_bases._get_renderer..Done: \n", + "Exception in Tkinter callback\n", + "Traceback (most recent call last):\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n", + " return self.func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 804, in callit\n", + " func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n", + " self.draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n", + " super(FigureCanvasTkAgg, self).draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n", + " self.figure.draw(self.renderer)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n", + " def _draw(renderer): raise Done(renderer)\n", + "matplotlib.backend_bases._get_renderer..Done: \n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.animation as animation\n", + "\n", + "fig = plt.figure()\n", + "\n", + "\n", + "def f(x, y):\n", + " return np.sin(x) + np.cos(y)\n", + "\n", + "x = np.linspace(0, 2 * np.pi, 120)\n", + "y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1)\n", + "# ims is a list of lists, each row is a list of artists to draw in the\n", + "# current frame; here we are just animating one artist, the image, in\n", + "# each frame\n", + "ims = []\n", + "for i in range(60):\n", + " x += np.pi / 15.\n", + " y += np.pi / 20.\n", + " im = plt.imshow(f(x, y), animated=True)\n", + " ims.append([im])\n", + "\n", + "ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True,\n", + " repeat_delay=1000)\n", + "\n", + "# ani.save('dynamic_images.mp4')\n", + "\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Exception in Tkinter callback\n", + "Traceback (most recent call last):\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n", + " return self.func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 804, in callit\n", + " func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n", + " self.draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n", + " super(FigureCanvasTkAgg, self).draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n", + " self.figure.draw(self.renderer)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n", + " def _draw(renderer): raise Done(renderer)\n", + "matplotlib.backend_bases._get_renderer..Done: \n", + "Exception in Tkinter callback\n", + "Traceback (most recent call last):\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n", + " return self.func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 242, in resize\n", + " self.draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n", + " super(FigureCanvasTkAgg, self).draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n", + " self.figure.draw(self.renderer)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n", + " def _draw(renderer): raise Done(renderer)\n", + "matplotlib.backend_bases._get_renderer..Done: \n", + "Exception in Tkinter callback\n", + "Traceback (most recent call last):\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 1883, in __call__\n", + " return self.func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\tkinter\\__init__.py\", line 804, in callit\n", + " func(*args)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\_backend_tk.py\", line 253, in idle_draw\n", + " self.draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_tkagg.py\", line 9, in draw\n", + " super(FigureCanvasTkAgg, self).draw()\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backends\\backend_agg.py\", line 407, in draw\n", + " self.figure.draw(self.renderer)\n", + " File \"C:\\Users\\Ben\\Miniconda3\\envs\\av\\lib\\site-packages\\matplotlib\\backend_bases.py\", line 1544, in _draw\n", + " def _draw(renderer): raise Done(renderer)\n", + "matplotlib.backend_bases._get_renderer..Done: \n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from matplotlib import animation\n", + "\n", + "\n", + "fig = plt.figure()\n", + "\n", + "position = np.arange(6) + .5 \n", + "\n", + "plt.tick_params(axis = 'x', colors = '#072b57')\n", + "plt.tick_params(axis = 'y', colors = '#072b57')\n", + "\n", + "speeds = [1, 2, 3, 4, 1, 2]\n", + "heights = [0, 0, 0, 0, 0, 0]\n", + "rects = plt.bar(position, heights, align = 'center', color = '#b8ff5c') \n", + "plt.xticks(position, ('A', 'B', 'C', 'D', 'E', 'F'))\n", + "\n", + "plt.xlabel('X Axis', color = '#072b57')\n", + "plt.ylabel('Y Axis', color = '#072b57')\n", + "plt.title('My Chart', color = '#072b57')\n", + "\n", + "plt.ylim((0,100))\n", + "plt.xlim((0,6))\n", + "\n", + "plt.grid(True)\n", + "\n", + "rs = [r for r in rects]\n", + "\n", + "def init():\n", + " return rs\n", + "\n", + "def animate(i):\n", + " global rs, heights\n", + " if all(map(lambda x: x==100, heights)):\n", + " heights = [0, 0, 0, 0, 0, 0]\n", + " else:\n", + " heights = [min(h+s,100) for h,s in zip(heights,speeds)]\n", + " for h,r in zip(heights,rs):\n", + " r.set_height(h)\n", + " return rs\n", + "\n", + "anim = animation.FuncAnimation(fig, animate, init_func=init,frames=200, interval=20, blit=True)\n", + "\n", + "plt.show()" + ] + }, + { + "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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +}