From 604d971200ecc48388436c1ae6aff9e1277c5d0e Mon Sep 17 00:00:00 2001 From: Tian Huang Date: Tue, 31 May 2022 14:28:30 +0800 Subject: [PATCH] Remove duplicated documentation --- examples/mvc/demo.ipynb | 722 ---------------------------------------- 1 file changed, 722 deletions(-) delete mode 100644 examples/mvc/demo.ipynb diff --git a/examples/mvc/demo.ipynb b/examples/mvc/demo.ipynb deleted file mode 100644 index 5992618622..0000000000 --- a/examples/mvc/demo.ipynb +++ /dev/null @@ -1,722 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-31T02:55:01.248175Z", - "start_time": "2022-05-31T02:55:01.244897Z" - } - }, - "outputs": [], - "source": [ - "import networkx as nx\n", - "import csv\n", - "import matplotlib.pyplot as plt\n", - "\n", - "from mvc import hamiltonian_mvc, qubo_mvc, qubo_mvc_penalty, mvc_feasibility, mvc_easy_fix, mvc_energy\n", - "from utils import binary2spin, spin2QiboHamiltonian" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# MVC Definition" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Given an undirected graph with a set of nodes V and edges E, A vertex cover of a graph is a set of nodes that includes at\n", - "least one endpoint of every edge of the graph. The Minimum Vertex Cover (MVC) problem is an optimisation problem\n", - "that find smallest vertex cover of a given graph." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Load graph from csv" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-31T02:55:02.395619Z", - "start_time": "2022-05-31T02:55:02.388048Z" - } - }, - "outputs": [], - "source": [ - "def load_csv(filename:str):\n", - " \"\"\" Load graph from csv file\n", - " \"\"\"\n", - " \n", - " with open(filename, 'r', newline='') as f:\n", - " reader = csv.reader(f)\n", - " data = [[int(row[0]), int(row[1]), float(row[2])] for row in reader]\n", - " \n", - " nodes = [k0 for k0, k1, v in data if k0 == k1]\n", - " edges = [[k0, k1] for k0, k1, v in data if k0 != k1]\n", - " \n", - " g = nx.Graph()\n", - " g.add_nodes_from(nodes)\n", - " g.add_edges_from(edges)\n", - " \n", - " node_weights = {k0: {'weight': v} for k0, k1, v in data if k0 == k1}\n", - " edge_weights = {(k0, k1): {'weight': v} for k0, k1, v in data if k0 != k1}\n", - "\n", - " nx.set_edge_attributes(g, edge_weights)\n", - " nx.set_node_attributes(g, node_weights)\n", - "\n", - " return g" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "csv Format: \n", - "\n", - "0,0,0.4696822179283675 \n", - "1,1,0.6917392308135916 \n", - "2,2,0.7130420958314817 \n", - "3,3,0.49342677332980056 \n", - "4,4,0.49661600571433673 \n", - "5,5,0.55601135361347 \n", - "6,6,0.2831095711244086 \n", - "7,7,0.18737823232636885 \n", - "0,1,0.98602725407379 \n", - "1,2,0.935853268681996 \n", - "2,3,0.23080434023289664 \n", - "4,5,0.25521731195623476 \n", - "5,6,0.37096743935296606 \n", - "6,7,0.04408120693490547 \n", - "0,2,0.5619060764177991 \n", - "4,7,0.48402095290884917 \n", - "1,6,0.7106584134580318 \n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-31T02:55:03.911228Z", - "start_time": "2022-05-31T02:55:03.899101Z" - } - }, - "outputs": [], - "source": [ - "g = load_csv('mvc.csv')" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:37.424689Z", - "start_time": "2022-05-17T06:39:37.037771Z" - }, - "scrolled": true - }, - "outputs": [ - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "pos = nx.spring_layout(g, seed=1234)\n", - "nx.draw(g, pos)" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:37.435635Z", - "start_time": "2022-05-17T06:39:37.432673Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of node is 8\n", - "Number of edge is 9\n" - ] - } - ], - "source": [ - "print(f'Number of node is {len(g.nodes)}')\n", - "print(f'Number of edge is {len(g.edges)}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# QUBO formulation" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Estimate penalty" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:37.509869Z", - "start_time": "2022-05-17T06:39:37.437436Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The penalty is 1.6548482220717595\n" - ] - } - ], - "source": [ - "penalty = qubo_mvc_penalty(g)\n", - "print(f'The penalty is {penalty}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Formulate QUBO (weighted minimum vertex cover)" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:37.576856Z", - "start_time": "2022-05-17T06:39:37.511677Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of linear terms: 8\n", - "Number of quadratic terms: 9\n", - "\n" - ] - } - ], - "source": [ - "linear, quadratic = qubo_mvc(g, penalty=penalty)\n", - "print(f'Number of linear terms: {len(linear)}')\n", - "print(f'Number of quadratic terms: {len(quadratic)}\\n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Generate random solutions" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:37.653842Z", - "start_time": "2022-05-17T06:39:37.578476Z" - }, - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The random solution is {0: 1, 1: 1, 2: 1, 3: 0, 4: 0, 5: 1, 6: 0, 7: 0}\n", - "\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "rng = np.random.default_rng(seed=1234)\n", - "random_solution = {i: rng.integers(2) for i in g.nodes}\n", - "print(f'The random solution is {random_solution}\\n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Check feasibility" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:37.716830Z", - "start_time": "2022-05-17T06:39:37.655228Z" - } - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The feasibility is False\n", - "\n" - ] - } - ], - "source": [ - "feasibility = mvc_feasibility(g, random_solution)\n", - "print(f'The feasibility is {feasibility}\\n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Fix broken constraints" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:37.786963Z", - "start_time": "2022-05-17T06:39:37.718776Z" - }, - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "After fixation, the solution is {0: 1, 1: 1, 2: 1, 3: 0, 4: 1, 5: 1, 6: 1, 7: 0}\n", - "\n" - ] - } - ], - "source": [ - "fixed_solution = mvc_easy_fix(g, random_solution)\n", - "print(f'After fixation, the solution is {fixed_solution}\\n')" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:37.851498Z", - "start_time": "2022-05-17T06:39:37.788716Z" - }, - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The feasibility is True\n", - "\n" - ] - } - ], - "source": [ - "feasibility = mvc_feasibility(g, fixed_solution)\n", - "print(f'The feasibility is {feasibility}\\n')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Visualisation" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:38.112368Z", - "start_time": "2022-05-17T06:39:37.853236Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "Text(0.5, 1.0, 'Vertex cover in orange after fix')" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "fig, (ax0, ax1) = plt.subplots(1, 2, figsize=(12.8,4.8))\n", - "colour_b4fix = ['C1' if random_solution[n] else 'C0' for n in g.nodes]\n", - "colour_fixed = ['C1' if fixed_solution[n] else 'C0' for n in g.nodes]\n", - "nx.draw(g, pos, node_color=colour_b4fix, ax=ax0)\n", - "ax0.set_title(f'Vertex cover in orange before fix')\n", - "nx.draw(g, pos, node_color=colour_fixed, ax=ax1)\n", - "ax1.set_title(f'Vertex cover in orange after fix')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Calculate energy" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-17T06:39:38.117077Z", - "start_time": "2022-05-17T06:39:38.114019Z" - }, - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "The energy is 3.2102004750256556\n" - ] - } - ], - "source": [ - "energy = mvc_energy(g, fixed_solution)\n", - "print(f'The energy is {energy}')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Create Hamiltonian" - ] - }, - { - "cell_type": "code", - "execution_count": 23, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-31T03:18:49.341363Z", - "start_time": "2022-05-31T03:18:48.893413Z" - } - }, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[Qibo 0.1.6|WARNING|2022-05-31 11:18:48]: Calculating the dense form of a symbolic Hamiltonian. This operation is memory inefficient.\n" - ] - } - ], - "source": [ - "ham = hamiltonian_mvc(g, dense=True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Simulate adiabatic time evolution" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-31T03:18:55.405956Z", - "start_time": "2022-05-31T03:18:51.472669Z" - } - }, - "outputs": [], - "source": [ - "from qibo import hamiltonians, models\n", - "\n", - "# total evolution time\n", - "T = 1 \n", - "\n", - "# Define the mixer\n", - "mixer = hamiltonians.X(ham.nqubits)\n", - "\n", - "# Define the interpolation scheduling\n", - "s = lambda t: t\n", - "\n", - "# Define evolution model\n", - "evolve = models.AdiabaticEvolution(mixer, ham, s, dt=1e-2)\n", - "\n", - "# Get the final state of the evolution\n", - "final_state = evolve(final_time=T)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "ExecuteTime": { - "end_time": "2022-05-31T03:18:58.052324Z", - "start_time": "2022-05-31T03:18:58.042668Z" - } - }, - "outputs": [ - { - "data": { - "text/plain": [ - "array([-1.90700213e-02+0.05344501j, -2.14835715e-02+0.06002869j,\n", - " -2.31677484e-02+0.06365599j, 2.18491113e-02+0.05598789j,\n", - " -3.26370223e-02+0.05697636j, -3.49474076e-02+0.06200228j,\n", - " 1.19611949e-02+0.06065593j, 4.29624810e-02+0.03157601j,\n", - " -3.09800961e-02+0.05744297j, 1.29923098e-02+0.05633733j,\n", - " -3.55919573e-02+0.06628206j, 4.35074811e-02+0.03016436j,\n", - " 2.92789181e-03+0.05940212j, 3.62604611e-02+0.03594315j,\n", - " 3.83208963e-02+0.03848788j, 2.84282749e-02-0.02420623j,\n", - " -3.18342392e-02+0.05361466j, -3.58267073e-02+0.06020296j,\n", - " -3.83940285e-02+0.0636951j , 1.17240344e-02+0.06493123j,\n", - " -4.72106409e-02+0.05455927j, -5.07636648e-02+0.05948954j,\n", - " 8.58475161e-05+0.06787373j, 3.96207005e-02+0.04308494j,\n", - " -4.55213886e-02+0.05541467j, 2.12954264e-03+0.06349283j,\n", - " -5.23344346e-02+0.06390258j, 4.05079176e-02+0.04168034j,\n", - " -9.37002807e-03+0.06467535j, 3.15204139e-02+0.04640798j,\n", - " 3.31633922e-02+0.04955333j, 3.57351849e-02-0.0200782j ,\n", - " -3.72624778e-02+0.05945607j, -4.19234436e-02+0.06669293j,\n", - " -4.37647437e-02+0.06956883j, 1.15718983e-02+0.07193734j,\n", - " -5.45657004e-02+0.06003673j, -5.86940678e-02+0.06541872j,\n", - " -1.34007424e-03+0.07494018j, 4.28082919e-02+0.04835552j,\n", - " -5.27112678e-02+0.0611052j , 6.49392649e-04+0.07142891j,\n", - " -5.91743199e-02+0.06949939j, 4.38390001e-02+0.04687291j,\n", - " -1.23097114e-02+0.07244264j, 3.41130634e-02+0.05301956j,\n", - " 3.55636149e-02+0.05540985j, 3.98355987e-02-0.02140243j,\n", - " -1.92500288e-03+0.06069724j, -2.25499246e-03+0.06813829j,\n", - " -2.38603804e-03+0.07103905j, 3.99837369e-02+0.04869938j,\n", - " -1.46083325e-02+0.06867574j, -1.53493018e-02+0.07449807j,\n", - " 3.16460426e-02+0.05656765j, 5.30434003e-02+0.01747447j,\n", - " -1.27546663e-02+0.06866761j, 3.16351024e-02+0.05311288j,\n", - " -1.39283832e-02+0.07770058j, 5.31694992e-02+0.01591822j,\n", - " 2.23897187e-02+0.05952207j, 4.86211476e-02+0.02475893j,\n", - " 5.07064426e-02+0.02590083j, 2.04346700e-02-0.03334114j,\n", - " -3.61407780e-02+0.06001255j, -3.97169769e-02+0.06628496j,\n", - " 1.13259613e-02+0.06502277j, 4.57203455e-02+0.03556779j,\n", - " -5.22569332e-02+0.06002044j, -5.54760194e-02+0.06430287j,\n", - " 3.98335319e-02+0.04431206j, 5.10426644e-02+0.00379261j,\n", - " -5.15009012e-02+0.0618113j , 2.09344387e-03+0.06995051j,\n", - " 2.08824285e-03+0.07316655j, 5.08388981e-02+0.00344058j,\n", - " -1.05888658e-02+0.07121175j, 3.38822267e-02+0.05054225j,\n", - " 5.06543713e-02+0.01288621j, 1.07056864e-02-0.03418807j,\n", - " -5.03877772e-02+0.05626784j, -5.54424934e-02+0.06218729j,\n", - " -1.13593934e-03+0.07109892j, 4.12058039e-02+0.0468664j ,\n", - " -6.74593692e-02+0.05302162j, -7.17344712e-02+0.05690561j,\n", - " 3.32114024e-02+0.05493205j, 5.32484006e-02+0.01431317j,\n", - " -6.70192546e-02+0.05507324j, -1.19006231e-02+0.07450783j,\n", - " -1.25558634e-02+0.07785307j, 5.31058369e-02+0.01390072j,\n", - " -2.55871385e-02+0.07328402j, 2.56827276e-02+0.06036877j,\n", - " 5.10043532e-02+0.02385934j, 1.82274527e-02-0.03401762j,\n", - " -2.28814256e-03+0.0670265j , -2.37417096e-03+0.07388407j,\n", - " 3.99387788e-02+0.04789348j, 5.41773123e-02+0.00751293j,\n", - " -1.57708436e-02+0.07447927j, -1.64897048e-02+0.07950745j,\n", - " 5.34891505e-02+0.01744263j, 4.34971871e-02-0.02102473j,\n", - " -1.43024657e-02+0.07567902j, 3.42788849e-02+0.05750224j,\n", - " 3.62128455e-02+0.05891386j, 4.31977770e-02-0.02117816j,\n", - " 2.42634122e-02+0.06445462j, 5.17902554e-02+0.0264994j ,\n", - " 4.75043138e-02-0.01336622j, -7.41420984e-03-0.032991j ,\n", - " 2.78841893e-02+0.05002293j, 3.08434371e-02+0.05507398j,\n", - " 5.03013328e-02+0.01736481j, 4.28858562e-02-0.01841323j,\n", - " 2.13096908e-02+0.06141654j, 2.29993199e-02+0.06540907j,\n", - " 4.67637773e-02-0.01085691j, 2.24930546e-02-0.03454611j,\n", - " 2.29139471e-02+0.06164821j, 5.04218532e-02+0.02693264j,\n", - " 5.24411199e-02+0.02705828j, 2.22088717e-02-0.03452559j,\n", - " 4.61638023e-02+0.03643287j, 4.95548847e-02-0.00345849j,\n", - " 2.88006815e-02-0.03071957j, -1.99703283e-02-0.02082429j,\n", - " -3.03825146e-02+0.0581976j , -3.41976092e-02+0.06529035j,\n", - " -3.57009680e-02+0.06810579j, 1.60851764e-02+0.06624381j,\n", - " -4.64790499e-02+0.06001183j, -4.99338274e-02+0.06533531j,\n", - " 4.26324002e-03+0.06999441j, 4.34840919e-02+0.04195123j,\n", - " -4.46708160e-02+0.06087216j, 5.85977393e-03+0.06657623j,\n", - " -5.00784394e-02+0.06917465j, 4.43364013e-02+0.04049271j,\n", - " -6.15302550e-03+0.06847499j, 3.57181657e-02+0.04694375j,\n", - " 3.72460825e-02+0.0490638j , 3.55795816e-02-0.02289235j,\n", - " -4.39205112e-02+0.05550538j, -4.93940592e-02+0.0622459j ,\n", - " -5.15663293e-02+0.0648745j , 3.62775809e-03+0.07337649j,\n", - " -6.13357576e-02+0.05417703j, -6.60708417e-02+0.05911661j,\n", - " -9.64509172e-03+0.07495546j, 3.75427394e-02+0.05320327j,\n", - " -5.95928536e-02+0.05545484j, -7.22998002e-03+0.0716918j ,\n", - " -6.70022941e-02+0.06309812j, 3.87419202e-02+0.05183201j,\n", - " -2.03356220e-02+0.07127841j, 2.83532223e-02+0.05692641j,\n", - " 2.95027000e-02+0.05947083j, 4.22930309e-02-0.01703455j,\n", - " 1.76529832e-03+0.06278503j, 1.85020296e-03+0.07045065j,\n", - " 1.82927119e-03+0.07232938j, 4.35080883e-02+0.04707338j,\n", - " -1.08644195e-02+0.07176262j, -1.13076676e-02+0.07778563j,\n", - " 3.55096494e-02+0.05556112j, 5.48672631e-02+0.01457408j,\n", - " -8.92728646e-03+0.07168182j, 3.58970680e-02+0.05286931j,\n", - " -9.50446570e-03+0.07978851j, 5.49418364e-02+0.01299807j,\n", - " 2.67494570e-02+0.06004954j, 5.16606220e-02+0.02258949j,\n", - " 5.30353343e-02+0.02328256j, 1.87496203e-02-0.03504728j,\n", - " 2.89794080e-02+0.0451301j , 3.24199000e-02+0.05069732j,\n", - " 3.32029656e-02+0.05204418j, 5.25281600e-02+0.0152277j ,\n", - " 2.37015687e-02+0.05726348j, 2.60314195e-02+0.06186273j,\n", - " 5.04231992e-02+0.02495314j, 4.65086205e-02-0.01352212j,\n", - " 2.50842964e-02+0.05635101j, 4.95617819e-02+0.0228282j ,\n", - " 2.82076714e-02+0.06248785j, 4.58705535e-02-0.0147071j ,\n", - " 4.60393828e-02+0.03211223j, 4.77349172e-02-0.00626223j,\n", - " 4.90083381e-02-0.00635262j, -1.74002411e-03-0.0338666j ,\n", - " 2.89009471e-03+0.06265396j, 3.32381132e-03+0.06905284j,\n", - " 4.08220414e-02+0.0416491j , 5.10658390e-02+0.00293942j,\n", - " -9.11999679e-03+0.07061166j, -9.41332743e-03+0.07535261j,\n", - " 5.11691914e-02+0.01224718j, 3.89694321e-02-0.0228615j ,\n", - " -7.66129635e-03+0.07162025j, 3.62641834e-02+0.0510348j ,\n", - " 3.81754421e-02+0.05220141j, 3.86789227e-02-0.02298188j,\n", - " 2.74487591e-02+0.0582664j , 5.02647657e-02+0.02082153j,\n", - " 4.32793127e-02-0.01602289j, -9.38612066e-03-0.03019691j,\n", - " -9.48727983e-03+0.06582005j, -1.03140056e-02+0.07256891j,\n", - " 3.41699872e-02+0.051476j , 5.25454962e-02+0.01324113j,\n", - " -2.35829114e-02+0.07170976j, -2.48361313e-02+0.07658732j,\n", - " 5.07970120e-02+0.02294603j, 4.51023469e-02-0.01601549j,\n", - " -2.22633993e-02+0.07305238j, 2.75815699e-02+0.0603777j ,\n", - " 2.93117704e-02+0.0619279j , 4.48261970e-02-0.01619867j,\n", - " 1.69593046e-02+0.06614952j, 4.81869474e-02+0.03171035j,\n", - " 4.82250191e-02-0.00804083j, -3.74469425e-03-0.03328841j,\n", - " 4.56726398e-02+0.01208492j, 5.03226763e-02+0.01320265j,\n", - " 3.84327764e-02-0.02068693j, 1.26880041e-02-0.03610475j,\n", - " 4.86324973e-02+0.02248792j, 5.19251755e-02+0.02375752j,\n", - " 1.94011482e-02-0.0342514j , -8.41208045e-03-0.03274511j,\n", - " 4.97257758e-02+0.02169363j, 4.48214567e-02-0.01451001j,\n", - " 4.54643845e-02-0.01658905j, -8.51554214e-03-0.03256421j,\n", - " 4.80226216e-02-0.00654912j, 2.62780673e-02-0.03135239j,\n", - " -2.55997918e-03-0.03443062j, -2.36571153e-02+0.00053062j,\n", - " 3.81905006e-02-0.01211543j, 4.20251346e-02-0.01342974j,\n", - " 1.80633266e-02-0.03230767j, -7.37770338e-03-0.03160449j,\n", - " 4.50370524e-02-0.00601462j, 4.79690234e-02-0.00660283j,\n", - " -1.73179615e-03-0.03333801j, -2.09399914e-02-0.01958567j,\n", - " 4.54607450e-02-0.00707965j, 2.54868553e-02-0.03076571j,\n", - " 2.49596221e-02-0.03258042j, -2.09295645e-02-0.01940993j,\n", - " 3.13979399e-02-0.02652261j, 4.55494545e-03-0.03438908j,\n", - " -1.75205458e-02-0.02345868j, -1.66778338e-02+0.01116144j])" - ] - }, - "execution_count": 25, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "final_state" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "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.7.7" - }, - "toc": { - "base_numbering": 1, - "nav_menu": {}, - "number_sections": true, - "sideBar": true, - "skip_h1_title": false, - "title_cell": "Table of Contents", - "title_sidebar": "Contents", - "toc_cell": false, - "toc_position": {}, - "toc_section_display": true, - "toc_window_display": false - }, - "varInspector": { - "cols": { - "lenName": 16, - "lenType": 16, - "lenVar": 40 - }, - "kernels_config": { - "python": { - "delete_cmd_postfix": "", - "delete_cmd_prefix": "del ", - "library": "var_list.py", - "varRefreshCmd": "print(var_dic_list())" - }, - "r": { - "delete_cmd_postfix": ") ", - "delete_cmd_prefix": "rm(", - "library": "var_list.r", - "varRefreshCmd": "cat(var_dic_list()) " - } - }, - "types_to_exclude": [ - "module", - "function", - "builtin_function_or_method", - "instance", - "_Feature" - ], - "window_display": false - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}