{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Germ Selection\n", "The purpose of this tutorial is to illustrate \"germ selection\". Germ selection is the process by which a complete set of germ gate sequences is constructed. The defining property which makes a set of gate sequences a \"complete germ set\" is the amplification of *all* possible gate errors. More precisely, the repetition of a complete set of germs, sandwiched between preparation and measurement fiducial sequences, will yield a sensitivity to *all* gate errors that scales with the number of times each germ is repeated. This completeness is relative to the set of gates under consideration, typically a set of desired or \"target\" gates.\n", "\n", "In this tutorial, we find a complete germ set for the standard $X(\\pi/2)$, $Y(\\pi/2)$, $I$ gate set.\n", "\n", "Before proceeding, however, we note the following: This tutorial notebook is slightly different from others. At present, germ selection is a bit of a \"dark art\". While we have a simple function (pygsti.algorithms.germselection.test_germ_list_infl) for determining whether or not a germ set is \"amplificationally complete\" (AC), we do not at present have a method for *optimally* selecting such a set (in particular, selecting a set that is as small as possible). This is in part because the germ list scoring function does a good job of distinguishing between AC and non-AC sets, it does less well distinguishing between sets that are both AC.\n", "\n", "This notebook demonstrates how to generate an AC germ set, as well as demonstrating the functionality of several auxiliary functions we've developed to assist in the process. However, it should not be taken as optimal; in particular, one may find better (smaller) AC germ sets by repeatedly running the germ selection function, seeded with an AC germ set plus a collection of further candidate germs, as demonstrated below.\n", "\n", "For more details on the theory of germ selection, please see arXiv:1605.07674." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import print_function" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import pygsti\n", "from pygsti.construction import std1Q_XYI as std\n", "import time\n", "%matplotlib inline\n", "from matplotlib import pyplot as plt\n", "import numpy as _np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Is the standard germ set AC? True\n", "Is the germ set {Gx, Gy, Gi} AC? False\n" ] } ], "source": [ "#A germ set is AC if and only if there are a number of non-zero eigenvalues (to machine precision) of J^\\dagger J equal\n", "#to the number of non-SPAM non-gauge parameters in a gate set, where J is the \"twirled derivative\" of the germ set with\n", "#respect to the gate set.\n", "\n", "#The gate set(s) we wish to test should have random unitary noise added to it, in order to break any accidental degeneracies.\n", "#Additionally, even though experimental gate sets will have stochastic error,\n", "#the gate set used for testing MUST have only unitary error, otherwise the selection procedure will fail.\n", "#When actually running germ selection, the germ selection function can add random unitary noise; however,\n", "#this does not automatically happen when calling test_germ_list_infl to test if a particular germ set is AC for a particular\n", "#gate set. Hence we manually randomize:\n", "\n", "gs_real = std.gs_target.randomize_with_unitary(.1,seed=0)\n", "\n", "#Let's see if a couple different germ sets are AC:\n", "\n", "print(\"Is the standard germ set AC?\", pygsti.algorithms.germselection.test_germ_list_infl(gs_real,std.germs))\n", "print(\"Is the germ set {Gx, Gy, Gi} AC?\", pygsti.algorithms.germselection.test_germ_list_infl(gs_real,pygsti.construction.gatestring_list([('Gx',),('Gy',),('Gi',)])))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nA2yDiIiIJFFgiYW7ryLO0Iq7LwQWBlWniIiIpJZkrwoRERGRNkSJhYiIiARGiYWIiIgERomFiIiI\nBEaJhYiIiARGiYWIiIgERomFiIiIBEaJhYiIiARGiYWIiIgERomFiIiIBEaJhYiIiARGiYWIiIgE\nRomFiIiIBEaJhYiIiARGiYWIiIgERomFiIiIBCYlEgsze87MdpjZ0405JyIiIqklJRILIB+4ognn\nREREJIWkRGLh7quALxp7TkRERFJLSiQWIiIi0jY0OrEwsxFmttTMSs0sYma5MWJuMLPNZrbHzN4w\ns5OCaa6IiIiksqb0WKQDG4AbAK990swuAeYBM4AhwFvAcjPrWi1mopn9wczWm1n7JrVcREREUk67\nxj7B3ZcBywDMzGKETAV+4e6PVcRMAM4FxgNzK8pYCCys9TyreMTS0DkRERFJEY1OLBpiZmEgB7ir\n8pi7u5mtBIY18LwiYDCQbmYfABe5+5vxzsUyatQowuEwmZmZZGZmApCXl0deXl7zX6CIiMhBrqCg\ngIKCAgBKS0spLS2lvLw8sPIDTSyArkAasK3W8W3ACfU9yd1HNeVcLEVFRWRnZzfmKSIiIoeMWF+2\n169fT05OTiDlt9aqECPGfAwRERFpW4JOLLYD+4EetY53p24vhoiIiLQxgSYW7l4OFAMjK49VTPAc\nCawJsi4RERFJPY2eY2Fm6UB/DqzS6GdmJwI73H0rMB9YZGbFwDqiq0Q6AY8G0mIRERFJWU2ZvDkU\neJXonAknumcFwCJgvLs/XbFnxSyiQyIbgNHu/nEA7RUREZEU1pR9LFYRZwilnn0qREREpI3TvUJE\nREQkMEosREREJDBKLERERCQwSixEREQkMEosREREJDBKLERERCQwSixEREQkMEosREREJDBKLERE\nRCQwSixEREQkMEosREREJDBKLERERCQwSixEREQkMEosREREJDBKLERERCQwSixEREQkMCmRWJjZ\nc2a2w8yernW8i5n9r5mtN7ONZnZ1stooIiIi8aVEYgHkA1fEOL4TGOHu2cApwI/N7MhWbZmIiIgk\nLCUSC3dfBXwR47i7+5cVP3as+NNarWEiIiLSKCmRWDSkYjhkA/AB8FN335HsNomIiEhsjU4szGyE\nmS01s1Izi5hZboyYG8xss5ntMbM3zOykpjbQ3T93928CfYHLzKxbU8sSERGRltWUHot0YANwA+C1\n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\ng2124hKdOyEiEk9jhldTsXyAoUOHcvrpp1NeXs5zzz1X53xlD+0XX3xR43j//v1ZuXIlRUVF9Q41\nXHLJJZx33nmsW7eOa665hm9/+9tx21NffZ07d66q75ZbbqnzZe/KK69k9+7d/OY3vwHgz3/+M8XF\nxVx55ZVNqg9g6dKlrFy5knnz5jX6y+VTTz3F3r17GTFiBEOHDm3Uc9uaoCdvphxtICUiQWns8Gqq\nlQ/w+OOPs3DhQr766ivGjRtX5/yAAQNwd955550ax9PT0znzzDM588wz6devX8yyd+zYwe9//3vM\njD/96U8JtWfAgAEAdepLS0urqu+f//mf6zxv4MCB5OTkVA2HPPHEE7Rv356LLrqowfr69+9Pu3bt\n6tQHMGLECM4880yys7MbnbxdffXV7N27l5///Oc8/vjjjXpuW9PmEwvQ3AkRCU5Th1dTpfzTTjuN\nCRMmMGnSJDZs2MDmzZtrnB8xYgRdunTh17/+daPLnjhxImVlZfzkJz/ht7/9Lffdd1/c5xx//PEc\nd9xxPP/88+zZk+DNqytceeWVvPLKK3z00UcUFBRw7rnnVs13qE+nTp0444wzqjbFCsJnn33G66+/\nzqRJk7j22msZPnx4IOUerA6JxKI6zZ0QkeZo6eHV1hq+7dOnDxC9KFbXsWNHbr31Vt555x1+9KMf\nxXxurNUPzz77LE8//TR33303t9xyC5deeinTp0/nvffei9uWmTNn8vHHH3P11Vezb9++hOoDyMvL\nA+DGG29k8+bNDa4Gqe72229n3759XH755TXmaMSrrz6V8zaOPvroRj2vrTqYbpsuIpJ0TdkoL5XK\nr9TQ3gv/8R//waZNm7jnnntYsWIFY8eO5eijj+azzz6juLiYZ599lh49etC+fXsA/vGPfzBx4kRG\njhzJxIkTAViwYAGvvfYa48aN4/XXX68q+6qrruKxxx5jy5YtVclNXl4e77zzDj/5yU9Yt24dl156\nKX379mXXrl288847FBQUcPjhh3PkkUfWaGfXrl0555xzeOaZZzjyyCP513/91zqvZebMmcyaNYvX\nXnuNb33rW0C01+aBBx5gypQpHHfccVU7b+7du5e//OUvPPnkk7Rv356jjjoqofey8j2svXT3kOXu\nbeIBZANeXFzscugqLnaH6J8iTVFcXOyN+SyJRCIt2p6WKv/xxx/3UCjkr7/+er0xS5Ys8fPOO897\n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\nC+uUcIPgucR9AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#Let's plot the sorted* eigenvalues of AC and non-AC germ sets.\n", "#The horizontal line delineates gauge from non-gauge parameters. We can never be sensitive to gauge parameters,\n", "#but to be AC, we must be sensitive to all other parameters.\n", "\n", "#*Due to numerical stability issues, some of the vanishingly small eigenvalues are negative;\n", "#we plot their absolute values here.\n", "\n", "plt.semilogy(sorted(_np.abs(pygsti.algorithms.germselection.test_germ_list_infl(gs_real,std.germs,returnSpectrum=True)[1])),'o',label='Std. XYI germs')\n", "plt.semilogy(sorted(_np.abs(pygsti.algorithms.germselection.test_germ_list_infl(gs_real,pygsti.construction.gatestring_list([('Gx',),('Gy',),('Gi',)]),returnSpectrum=True)[1])),'o',label='{Gx,Gy,Gi}')\n", "plt.axvline(pygsti.algorithms.germselection.num_non_spam_gauge_params(gs_real))\n", "plt.legend(loc='best')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's now try to actually pick out a gate set. The germ selection output will strongly depend on several different inputs to the function optimize_integer_germs_slack (argument name given in parenthesis):\n", "\n", "1. The gate set(s) to be optimized for. (gatesetList)\n", "2. How strong the unitary randomization added is. (randomizationStrength; default is 1e-3. Can be turned off by setting to 0 or by setting randomize=False; this should only be done if the input gate set(s) have already been subjected to some random unitary errors.\n", "3. How many different randomized instances of the input gate set to be tested (numCopies; only to be used if only one gate set is passed in. The larger this number (or the larger the size of gatesetList), the more robust the output germ list will be in general, but the slower the runtime.\n", "4. How much adding a germ to the germ set \"costs\". (l1Penalty; default is 1e-2. Increasing this *may* nudge the optimizer towards picking a smaller germ set.)\n", "5. How much making an individual germ longer \"costs\". (gatePenalty; default is 0. Increasing this *may* nudge the optimizer towards picking a germ set with shorter germs.\n", "6. Whether the entire non-gauge portion of the spectrum to contributes to the germ score, or only the smallest eigenvalue. (scoreFunc = 'all' or 'worst', respectively.)\n", "7. The relaxation scheme used to reduce the germ list size:\n", "\n", " 7a. The absolute score a germ set is allowed to achieve (fixedSlack) OR\n", " \n", " 7b. The relative score a germ set is allowed to achieve (slackFrac)\n", "8. Whether or not the germ set *must* contain each bare gate as a germ (forceSingletons)\n", "\n", "The output should depend much more weakly (but not necessarily not at all) on the tolerance value (tol) passed to the optimizer.\n", "\n", "Here we demonstrate particular choices for the above inputs. However, we make no claims of optimality for these choices. End users are encouraged to experiment themselves with these inputs. They are also welcome to email pygsti@sandia.gov; the pyGSTi development team will try to assist." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The germ selection algorithm works by throwing unnecessary germs away from an initial (large) list that is assumed to be complete. In this example, our initial list includes all gatestrings up to length six that are distinct up to powers and cycles. Since germ sequences are repeated and sandwiched between fiducial sequences, a germ that is a power of another germ (i.e. the other germ repeated some number of times) or that is a cyclic permutation of another germ is effectively the same as the other germ. (I.e., if Gx is included as a germ, then GxGx will not be.\n", "Similarly, if GxGyGi is included as a germ, then GxiGxGy will not be.)\n", "The `list_all_gatestrings_without_powers_and_cycles` function provides a convenient way to list sequences gate sequences that are distinct up to such powers and cycles. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "max_length = 6\n", "gates = std.gs_target.gates.keys()\n", "\n", "testGermList = pygsti.construction.list_all_gatestrings_without_powers_and_cycles(gates,max_length)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "testGermList has 196 germs in it.\n", "testGermList is AC.\n" ] } ], "source": [ "print(\"testGermList has\", len(testGermList), \"germs in it.\")\n", "print(\"testGermList is\", \"not \"*(1-pygsti.algorithms.germselection.test_germ_list_infl(gs_real,testGermList))+\"AC.\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Complete initial germ set succeeds on all input gatesets.\n", "Now searching for best germ set.\n", "Starting germ set optimization. Lower score is better.\n", "Gateset has 14 gauge params.\n", "Progress: Iter 001 of 300 score=11.3492, nGerms=196: \n", " Found better neighbor: nGerms = 195 score = 11.3463\n", " Found better neighbor: nGerms = 195 score = 11.3455\n", " Found better neighbor: nGerms = 195 score = 11.3452\n", "Moving to better neighbor\n", "Progress: Iter 002 of 300 score=11.3452, nGerms=195: \n", " Found better neighbor: nGerms = 194 score = 11.3424\n", " Found better neighbor: nGerms = 194 score = 11.3415\n", "Moving to better neighbor\n", "Progress: Iter 003 of 300 score=11.3415, nGerms=194: \n", " Found better neighbor: nGerms = 193 score = 11.3387\n", "Moving to better neighbor\n", "Progress: Iter 004 of 300 score=11.3387, nGerms=193: \n", " Found better neighbor: nGerms = 192 score = 11.3384\n", " Found better neighbor: nGerms = 192 score = 11.3382\n", " Found better neighbor: nGerms = 192 score = 11.3381\n", " Found better neighbor: nGerms = 192 score = 11.3375\n", "Moving to better neighbor\n", "Progress: Iter 005 of 300 score=11.3375, nGerms=192: \n", " Found better neighbor: nGerms = 191 score = 11.3372\n", " Found better neighbor: nGerms = 191 score = 11.337\n", " Found better neighbor: nGerms = 191 score = 11.3369\n", " Found better neighbor: nGerms = 191 score = 11.3365\n", "Moving to better neighbor\n", "Progress: Iter 006 of 300 score=11.3365, nGerms=191: \n", " Found better neighbor: nGerms = 190 score = 11.3362\n", " Found better neighbor: nGerms = 190 score = 11.336\n", " Found better neighbor: nGerms = 190 score = 11.3358\n", " Found better neighbor: nGerms = 190 score = 11.3355\n", "Moving to better neighbor\n", "Progress: Iter 007 of 300 score=11.3355, nGerms=190: \n", " Found better neighbor: nGerms = 189 score = 11.3353\n", " Found better neighbor: nGerms = 189 score = 11.3352\n", " Found better neighbor: nGerms = 189 score = 11.335\n", " Found better neighbor: nGerms = 189 score = 11.3349\n", "Moving to better neighbor\n", "Progress: Iter 008 of 300 score=11.3349, nGerms=189: \n", " Found better neighbor: nGerms = 188 score = 11.3347\n", " Found better neighbor: nGerms = 188 score = 11.3345\n", " Found better neighbor: nGerms = 188 score = 11.3344\n", " Found better neighbor: nGerms = 188 score = 11.3343\n", "Moving to better neighbor\n", "Progress: Iter 009 of 300 score=11.3343, nGerms=188: \n", " Found better neighbor: nGerms = 187 score = 11.3342\n", " Found better neighbor: nGerms = 187 score = 11.334\n", "Moving to better neighbor\n", "Progress: Iter 010 of 300 score=11.334, nGerms=187: \n", " Found better neighbor: nGerms = 186 score = 11.3339\n", " Found better neighbor: nGerms = 186 score = 11.3337\n", " Found better neighbor: nGerms = 186 score = 11.3337\n", "Moving to better neighbor\n", "Progress: Iter 011 of 300 score=11.3337, nGerms=186: \n", " Found better neighbor: nGerms = 185 score = 11.3336\n", " Found better neighbor: nGerms = 185 score = 11.3336\n", "Moving to better neighbor\n", "Progress: Iter 012 of 300 score=11.3336, nGerms=185: \n", " Found better neighbor: nGerms = 184 score = 11.3335\n", "Moving to better neighbor\n", "Progress: Iter 013 of 300 score=11.3335, nGerms=184: \n", " No better neighbor. Relaxing score w/slack: 11.3335 => 12.4668\n", " Found better neighbor: nGerms = 183 score = 11.3396\n", "Moving to better neighbor\n", "Progress: Iter 014 of 300 score=11.3396, nGerms=183: \n", " No better neighbor. Relaxing score w/slack: 11.3396 => 12.4736\n", " Found better neighbor: nGerms = 182 score = 11.3453\n", "Moving to better neighbor\n", "Progress: Iter 015 of 300 score=11.3453, nGerms=182: \n", " No better neighbor. Relaxing score w/slack: 11.3453 => 12.4798\n", " Found better neighbor: nGerms = 181 score = 11.4208\n", "Moving to better neighbor\n", "Progress: Iter 016 of 300 score=11.4208, nGerms=181: \n", " No better neighbor. Relaxing score w/slack: 11.4208 => 12.5629\n", " Found better neighbor: nGerms = 180 score = 11.4577\n", "Moving to better neighbor\n", "Progress: Iter 017 of 300 score=11.4577, nGerms=180: \n", " No better neighbor. Relaxing score w/slack: 11.4577 => 12.6035\n", " Found better neighbor: nGerms = 179 score = 11.492\n", "Moving to better neighbor\n", "Progress: Iter 018 of 300 score=11.492, nGerms=179: \n", " No better neighbor. Relaxing score w/slack: 11.492 => 12.6412\n", " Found better neighbor: nGerms = 178 score = 11.5109\n", "Moving to better neighbor\n", "Progress: Iter 019 of 300 score=11.5109, nGerms=178: \n", " No better neighbor. Relaxing score w/slack: 11.5109 => 12.662\n", " Found better neighbor: nGerms = 177 score = 11.5314\n", "Moving to better neighbor\n", "Progress: Iter 020 of 300 score=11.5314, nGerms=177: \n", " No better neighbor. Relaxing score w/slack: 11.5314 => 12.6845\n", " Found better neighbor: nGerms = 176 score = 11.5494\n", "Moving to better neighbor\n", "Progress: Iter 021 of 300 score=11.5494, nGerms=176: \n", " No better neighbor. Relaxing score w/slack: 11.5494 => 12.7043\n", " Found better neighbor: nGerms = 175 score = 11.5681\n", "Moving to better neighbor\n", "Progress: Iter 022 of 300 score=11.5681, nGerms=175: \n", " No better neighbor. Relaxing score w/slack: 11.5681 => 12.7249\n", " Found better neighbor: nGerms = 174 score = 11.6282\n", "Moving to better neighbor\n", "Progress: Iter 023 of 300 score=11.6282, nGerms=174: \n", " No better neighbor. Relaxing score w/slack: 11.6282 => 12.791\n", " Found better neighbor: nGerms = 173 score = 11.6852\n", "Moving to better neighbor\n", "Progress: Iter 024 of 300 score=11.6852, nGerms=173: \n", " No better neighbor. Relaxing score w/slack: 11.6852 => 12.8537\n", " Found better neighbor: nGerms = 172 score = 11.7657\n", "Moving to better neighbor\n", "Progress: Iter 025 of 300 score=11.7657, nGerms=172: \n", " No better neighbor. Relaxing score w/slack: 11.7657 => 12.9422\n", " Found better neighbor: nGerms = 171 score = 11.8409\n", "Moving to better neighbor\n", "Progress: Iter 026 of 300 score=11.8409, nGerms=171: \n", " No better neighbor. Relaxing score w/slack: 11.8409 => 13.025\n", " Found better neighbor: nGerms = 170 score = 11.8542\n", "Moving to better neighbor\n", "Progress: Iter 027 of 300 score=11.8542, nGerms=170: \n", " No better neighbor. Relaxing score w/slack: 11.8542 => 13.0396\n", " Found better neighbor: nGerms = 169 score = 11.8863\n", "Moving to better neighbor\n", "Progress: Iter 028 of 300 score=11.8863, nGerms=169: \n", " No better neighbor. Relaxing score w/slack: 11.8863 => 13.0749\n", " Found better neighbor: nGerms = 168 score = 11.9233\n", "Moving to better neighbor\n", "Progress: Iter 029 of 300 score=11.9233, nGerms=168: \n", " No better neighbor. Relaxing score w/slack: 11.9233 => 13.1156\n", " Found better neighbor: nGerms = 167 score = 11.9356\n", "Moving to better neighbor\n", "Progress: Iter 030 of 300 score=11.9356, nGerms=167: \n", " No better neighbor. Relaxing score w/slack: 11.9356 => 13.1292\n", " Found better neighbor: nGerms = 166 score = 11.9839\n", "Moving to better neighbor\n", "Progress: Iter 031 of 300 score=11.9839, nGerms=166: \n", " No better neighbor. Relaxing score w/slack: 11.9839 => 13.1823\n", " Found better neighbor: nGerms = 165 score = 12.0229\n", "Moving to better neighbor\n", "Progress: Iter 032 of 300 score=12.0229, nGerms=165: \n", " No better neighbor. Relaxing score w/slack: 12.0229 => 13.2252\n", " Found better neighbor: nGerms = 164 score = 12.0398\n", "Moving to better neighbor\n", "Progress: Iter 033 of 300 score=12.0398, nGerms=164: \n", " No better neighbor. Relaxing score w/slack: 12.0398 => 13.2438\n", " Found better neighbor: nGerms = 163 score = 12.0796\n", "Moving to better neighbor\n", "Progress: Iter 034 of 300 score=12.0796, nGerms=163: \n", " No better neighbor. Relaxing score w/slack: 12.0796 => 13.2875\n", " Found better neighbor: nGerms = 162 score = 12.1171\n", "Moving to better neighbor\n", "Progress: Iter 035 of 300 score=12.1171, nGerms=162: \n", " No better neighbor. Relaxing score w/slack: 12.1171 => 13.3288\n", " Found better neighbor: nGerms = 161 score = 12.1338\n", "Moving to better neighbor\n", "Progress: Iter 036 of 300 score=12.1338, nGerms=161: \n", " No better neighbor. Relaxing score w/slack: 12.1338 => 13.3472\n", " Found better neighbor: nGerms = 160 score = 12.1698\n", "Moving to better neighbor\n", "Progress: Iter 037 of 300 score=12.1698, nGerms=160: \n", " No better neighbor. Relaxing score w/slack: 12.1698 => 13.3867\n", " Found better neighbor: nGerms = 159 score = 12.2194\n", "Moving to better neighbor\n", "Progress: Iter 038 of 300 score=12.2194, nGerms=159: \n", " No better neighbor. Relaxing score w/slack: 12.2194 => 13.4413\n", " Found better neighbor: nGerms = 158 score = 12.2644\n", "Moving to better neighbor\n", "Progress: Iter 039 of 300 score=12.2644, nGerms=158: \n", " No better neighbor. Relaxing score w/slack: 12.2644 => 13.4909\n", " Found better neighbor: nGerms = 157 score = 12.293\n", "Moving to better neighbor\n", "Progress: Iter 040 of 300 score=12.293, nGerms=157: \n", " No better neighbor. Relaxing score w/slack: 12.293 => 13.5223\n", " Found better neighbor: nGerms = 156 score = 12.337\n", "Moving to better neighbor\n", "Progress: Iter 041 of 300 score=12.337, nGerms=156: \n", " No better neighbor. Relaxing score w/slack: 12.337 => 13.5707\n", " Found better neighbor: nGerms = 155 score = 12.4856\n", "Moving to better neighbor\n", "Progress: Iter 042 of 300 score=12.4856, nGerms=155: \n", " No better neighbor. Relaxing score w/slack: 12.4856 => 13.7342\n", " Found better neighbor: nGerms = 154 score = 12.624\n", "Moving to better neighbor\n", "Progress: Iter 043 of 300 score=12.624, nGerms=154: \n", " No better neighbor. Relaxing score w/slack: 12.624 => 13.8863\n", " Found better neighbor: nGerms = 153 score = 12.6754\n", "Moving to better neighbor\n", "Progress: Iter 044 of 300 score=12.6754, nGerms=153: \n", " No better neighbor. Relaxing score w/slack: 12.6754 => 13.9429\n", " Found better neighbor: nGerms = 152 score = 12.7422\n", "Moving to better neighbor\n", "Progress: Iter 045 of 300 score=12.7422, nGerms=152: \n", " No better neighbor. Relaxing score w/slack: 12.7422 => 14.0164\n", " Found better neighbor: nGerms = 151 score = 12.8284\n", "Moving to better neighbor\n", "Progress: Iter 046 of 300 score=12.8284, nGerms=151: \n", " No better neighbor. Relaxing score w/slack: 12.8284 => 14.1113\n", " Found better neighbor: nGerms = 150 score = 12.8761\n", "Moving to better neighbor\n", "Progress: Iter 047 of 300 score=12.8761, nGerms=150: \n", " No better neighbor. Relaxing score w/slack: 12.8761 => 14.1637\n", " Found better neighbor: nGerms = 149 score = 12.9373\n", "Moving to better neighbor\n", "Progress: Iter 048 of 300 score=12.9373, nGerms=149: \n", " No better neighbor. Relaxing score w/slack: 12.9373 => 14.231\n", " Found better neighbor: nGerms = 148 score = 12.9569\n", "Moving to better neighbor\n", "Progress: Iter 049 of 300 score=12.9569, nGerms=148: \n", " No better neighbor. Relaxing score w/slack: 12.9569 => 14.2525\n", " Found better neighbor: nGerms = 147 score = 12.9811\n", "Moving to better neighbor\n", "Progress: Iter 050 of 300 score=12.9811, nGerms=147: \n", " No better neighbor. Relaxing score w/slack: 12.9811 => 14.2792\n", " Found better neighbor: nGerms = 146 score = 13.0605\n", "Moving to better neighbor\n", "Progress: Iter 051 of 300 score=13.0605, nGerms=146: \n", " No better neighbor. Relaxing score w/slack: 13.0605 => 14.3666\n", " Found better neighbor: nGerms = 145 score = 13.0793\n", "Moving to better neighbor\n", "Progress: Iter 052 of 300 score=13.0793, nGerms=145: \n", " No better neighbor. Relaxing score w/slack: 13.0793 => 14.3872\n", " Found better neighbor: nGerms = 144 score = 13.1623\n", "Moving to better neighbor\n", "Progress: Iter 053 of 300 score=13.1623, nGerms=144: \n", " No better neighbor. Relaxing score w/slack: 13.1623 => 14.4785\n", " Found better neighbor: nGerms = 143 score = 13.1907\n", "Moving to better neighbor\n", "Progress: Iter 054 of 300 score=13.1907, nGerms=143: \n", " No better neighbor. Relaxing score w/slack: 13.1907 => 14.5098\n", " Found better neighbor: nGerms = 142 score = 13.2487\n", "Moving to better neighbor\n", "Progress: Iter 055 of 300 score=13.2487, nGerms=142: \n", " No better neighbor. Relaxing score w/slack: 13.2487 => 14.5736\n", " Found better neighbor: nGerms = 141 score = 13.3277\n", "Moving to better neighbor\n", "Progress: Iter 056 of 300 score=13.3277, nGerms=141: \n", " No better neighbor. Relaxing score w/slack: 13.3277 => 14.6605\n", " Found better neighbor: nGerms = 140 score = 13.3522\n", "Moving to better neighbor\n", "Progress: Iter 057 of 300 score=13.3522, nGerms=140: \n", " No better neighbor. Relaxing score w/slack: 13.3522 => 14.6874\n", " Found better neighbor: nGerms = 139 score = 13.433\n", "Moving to better neighbor\n", "Progress: Iter 058 of 300 score=13.433, nGerms=139: \n", " No better neighbor. Relaxing score w/slack: 13.433 => 14.7763\n", " Found better neighbor: nGerms = 138 score = 13.4574\n", "Moving to better neighbor\n", "Progress: Iter 059 of 300 score=13.4574, nGerms=138: \n", " No better neighbor. Relaxing score w/slack: 13.4574 => 14.8032\n", " Found better neighbor: nGerms = 137 score = 13.4867\n", "Moving to better neighbor\n", "Progress: Iter 060 of 300 score=13.4867, nGerms=137: \n", " No better neighbor. Relaxing score w/slack: 13.4867 => 14.8354\n", " Found better neighbor: nGerms = 136 score = 13.5122\n", "Moving to better neighbor\n", "Progress: Iter 061 of 300 score=13.5122, nGerms=136: \n", " No better neighbor. Relaxing score w/slack: 13.5122 => 14.8634\n", " Found better neighbor: nGerms = 135 score = 13.5398\n", "Moving to better neighbor\n", "Progress: Iter 062 of 300 score=13.5398, nGerms=135: \n", " No better neighbor. Relaxing score w/slack: 13.5398 => 14.8937\n", " Found better neighbor: nGerms = 134 score = 13.6221\n", "Moving to better neighbor\n", "Progress: Iter 063 of 300 score=13.6221, nGerms=134: \n", " No better neighbor. Relaxing score w/slack: 13.6221 => 14.9843\n", " Found better neighbor: nGerms = 133 score = 13.6716\n", "Moving to better neighbor\n", "Progress: Iter 064 of 300 score=13.6716, nGerms=133: \n", " No better neighbor. Relaxing score w/slack: 13.6716 => 15.0387\n", " Found better neighbor: nGerms = 132 score = 13.7159\n", "Moving to better neighbor\n", "Progress: Iter 065 of 300 score=13.7159, nGerms=132: \n", " No better neighbor. Relaxing score w/slack: 13.7159 => 15.0875\n", " Found better neighbor: nGerms = 131 score = 13.7546\n", "Moving to better neighbor\n", "Progress: Iter 066 of 300 score=13.7546, nGerms=131: \n", " No better neighbor. Relaxing score w/slack: 13.7546 => 15.1301\n", " Found better neighbor: nGerms = 130 score = 13.7828\n", "Moving to better neighbor\n", "Progress: Iter 067 of 300 score=13.7828, nGerms=130: \n", " No better neighbor. Relaxing score w/slack: 13.7828 => 15.1611\n", " Found better neighbor: nGerms = 129 score = 13.833\n", "Moving to better neighbor\n", "Progress: Iter 068 of 300 score=13.833, nGerms=129: \n", " No better neighbor. Relaxing score w/slack: 13.833 => 15.2163\n", " Found better neighbor: nGerms = 128 score = 13.9334\n", "Moving to better neighbor\n", "Progress: Iter 069 of 300 score=13.9334, nGerms=128: \n", " No better neighbor. Relaxing score w/slack: 13.9334 => 15.3268\n", " Found better neighbor: nGerms = 127 score = 13.9788\n", "Moving to better neighbor\n", "Progress: Iter 070 of 300 score=13.9788, nGerms=127: \n", " No better neighbor. Relaxing score w/slack: 13.9788 => 15.3767\n", " Found better neighbor: nGerms = 126 score = 14.0385\n", "Moving to better neighbor\n", "Progress: Iter 071 of 300 score=14.0385, nGerms=126: \n", " No better neighbor. Relaxing score w/slack: 14.0385 => 15.4423\n", " Found better neighbor: nGerms = 125 score = 14.0681\n", "Moving to better neighbor\n", "Progress: Iter 072 of 300 score=14.0681, nGerms=125: \n", " No better neighbor. Relaxing score w/slack: 14.0681 => 15.4749\n", " Found better neighbor: nGerms = 124 score = 14.0991\n", "Moving to better neighbor\n", "Progress: Iter 073 of 300 score=14.0991, nGerms=124: \n", " No better neighbor. Relaxing score w/slack: 14.0991 => 15.5091\n", " Found better neighbor: nGerms = 123 score = 14.154\n", "Moving to better neighbor\n", "Progress: Iter 074 of 300 score=14.154, nGerms=123: \n", " No better neighbor. Relaxing score w/slack: 14.154 => 15.5694\n", " Found better neighbor: nGerms = 122 score = 14.2017\n", "Moving to better neighbor\n", "Progress: Iter 075 of 300 score=14.2017, nGerms=122: \n", " No better neighbor. Relaxing score w/slack: 14.2017 => 15.6219\n", " Found better neighbor: nGerms = 121 score = 14.3076\n", "Moving to better neighbor\n", "Progress: Iter 076 of 300 score=14.3076, nGerms=121: \n", " No better neighbor. Relaxing score w/slack: 14.3076 => 15.7384\n", " Found better neighbor: nGerms = 120 score = 14.3604\n", "Moving to better neighbor\n", "Progress: Iter 077 of 300 score=14.3604, nGerms=120: \n", " No better neighbor. Relaxing score w/slack: 14.3604 => 15.7964\n", " Found better neighbor: nGerms = 119 score = 14.4009\n", "Moving to better neighbor\n", "Progress: Iter 078 of 300 score=14.4009, nGerms=119: \n", " No better neighbor. Relaxing score w/slack: 14.4009 => 15.8409\n", " Found better neighbor: nGerms = 118 score = 14.4586\n", "Moving to better neighbor\n", "Progress: Iter 079 of 300 score=14.4586, nGerms=118: \n", " No better neighbor. Relaxing score w/slack: 14.4586 => 15.9044\n", " Found better neighbor: nGerms = 117 score = 14.5195\n", "Moving to better neighbor\n", "Progress: Iter 080 of 300 score=14.5195, nGerms=117: \n", " No better neighbor. Relaxing score w/slack: 14.5195 => 15.9714\n", " Found better neighbor: nGerms = 116 score = 14.6239\n", "Moving to better neighbor\n", "Progress: Iter 081 of 300 score=14.6239, nGerms=116: \n", " No better neighbor. Relaxing score w/slack: 14.6239 => 16.0863\n", " Found better neighbor: nGerms = 115 score = 14.6536\n", "Moving to better neighbor\n", "Progress: Iter 082 of 300 score=14.6536, nGerms=115: \n", " No better neighbor. Relaxing score w/slack: 14.6536 => 16.119\n", " Found better neighbor: nGerms = 114 score = 14.7145\n", "Moving to better neighbor\n", "Progress: Iter 083 of 300 score=14.7145, nGerms=114: \n", " No better neighbor. Relaxing score w/slack: 14.7145 => 16.186\n", " Found better neighbor: nGerms = 113 score = 14.7667\n", "Moving to better neighbor\n", "Progress: Iter 084 of 300 score=14.7667, nGerms=113: \n", " No better neighbor. Relaxing score w/slack: 14.7667 => 16.2434\n", " Found better neighbor: nGerms = 112 score = 14.8264\n", "Moving to better neighbor\n", "Progress: Iter 085 of 300 score=14.8264, nGerms=112: \n", " No better neighbor. Relaxing score w/slack: 14.8264 => 16.3091\n", " Found better neighbor: nGerms = 111 score = 14.88\n", "Moving to better neighbor\n", "Progress: Iter 086 of 300 score=14.88, nGerms=111: \n", " No better neighbor. Relaxing score w/slack: 14.88 => 16.368\n", " Found better neighbor: nGerms = 110 score = 14.9159\n", "Moving to better neighbor\n", "Progress: Iter 087 of 300 score=14.9159, nGerms=110: \n", " No better neighbor. Relaxing score w/slack: 14.9159 => 16.4075\n", " Found better neighbor: nGerms = 109 score = 15.3234\n", "Moving to better neighbor\n", "Progress: Iter 088 of 300 score=15.3234, nGerms=109: \n", " No better neighbor. Relaxing score w/slack: 15.3234 => 16.8557\n", " Found better neighbor: nGerms = 108 score = 15.6977\n", "Moving to better neighbor\n", "Progress: Iter 089 of 300 score=15.6977, nGerms=108: \n", " No better neighbor. Relaxing score w/slack: 15.6977 => 17.2674\n", " Found better neighbor: nGerms = 107 score = 15.9624\n", "Moving to better neighbor\n", "Progress: Iter 090 of 300 score=15.9624, nGerms=107: \n", " No better neighbor. Relaxing score w/slack: 15.9624 => 17.5586\n", " Found better neighbor: nGerms = 106 score = 16.1616\n", "Moving to better neighbor\n", "Progress: Iter 091 of 300 score=16.1616, nGerms=106: \n", " No better neighbor. Relaxing score w/slack: 16.1616 => 17.7778\n", " Found better neighbor: nGerms = 105 score = 16.4501\n", "Moving to better neighbor\n", "Progress: Iter 092 of 300 score=16.4501, nGerms=105: \n", " No better neighbor. Relaxing score w/slack: 16.4501 => 18.0951\n", " Found better neighbor: nGerms = 104 score = 16.6941\n", "Moving to better neighbor\n", "Progress: Iter 093 of 300 score=16.6941, nGerms=104: \n", " No better neighbor. Relaxing score w/slack: 16.6941 => 18.3636\n", " Found better neighbor: nGerms = 103 score = 17.0848\n", "Moving to better neighbor\n", "Progress: Iter 094 of 300 score=17.0848, nGerms=103: \n", " No better neighbor. Relaxing score w/slack: 17.0848 => 18.7933\n", " Found better neighbor: nGerms = 102 score = 17.2119\n", "Moving to better neighbor\n", "Progress: Iter 095 of 300 score=17.2119, nGerms=102: \n", " No better neighbor. Relaxing score w/slack: 17.2119 => 18.9331\n", " Found better neighbor: nGerms = 101 score = 17.3988\n", "Moving to better neighbor\n", "Progress: Iter 096 of 300 score=17.3988, nGerms=101: \n", " No better neighbor. Relaxing score w/slack: 17.3988 => 19.1386\n", " Found better neighbor: nGerms = 100 score = 17.7383\n", "Moving to better neighbor\n", "Progress: Iter 097 of 300 score=17.7383, nGerms=100: \n", " No better neighbor. Relaxing score w/slack: 17.7383 => 19.5121\n", " Found better neighbor: nGerms = 99 score = 17.8199\n", "Moving to better neighbor\n", "Progress: Iter 098 of 300 score=17.8199, nGerms=99: \n", " No better neighbor. Relaxing score w/slack: 17.8199 => 19.6018\n", " Found better neighbor: nGerms = 98 score = 18.1677\n", "Moving to better neighbor\n", "Progress: Iter 099 of 300 score=18.1677, nGerms=98: \n", " No better neighbor. Relaxing score w/slack: 18.1677 => 19.9844\n", " Found better neighbor: nGerms = 97 score = 18.391\n", "Moving to better neighbor\n", "Progress: Iter 100 of 300 score=18.391, nGerms=97: \n", " No better neighbor. Relaxing score w/slack: 18.391 => 20.2301\n", " Found better neighbor: nGerms = 96 score = 18.7934\n", "Moving to better neighbor\n", "Progress: Iter 101 of 300 score=18.7934, nGerms=96: \n", " No better neighbor. Relaxing score w/slack: 18.7934 => 20.6727\n", " Found better neighbor: nGerms = 95 score = 19.2049\n", "Moving to better neighbor\n", "Progress: Iter 102 of 300 score=19.2049, nGerms=95: \n", " No better neighbor. Relaxing score w/slack: 19.2049 => 21.1254\n", " Found better neighbor: nGerms = 94 score = 19.3664\n", "Moving to better neighbor\n", "Progress: Iter 103 of 300 score=19.3664, nGerms=94: \n", " No better neighbor. Relaxing score w/slack: 19.3664 => 21.3031\n", " Found better neighbor: nGerms = 93 score = 19.7834\n", "Moving to better neighbor\n", "Progress: Iter 104 of 300 score=19.7834, nGerms=93: \n", " No better neighbor. Relaxing score w/slack: 19.7834 => 21.7618\n", " Found better neighbor: nGerms = 92 score = 19.9919\n", "Moving to better neighbor\n", "Progress: Iter 105 of 300 score=19.9919, nGerms=92: \n", " No better neighbor. Relaxing score w/slack: 19.9919 => 21.9911\n", " Found better neighbor: nGerms = 91 score = 20.2937\n", "Moving to better neighbor\n", "Progress: Iter 106 of 300 score=20.2937, nGerms=91: \n", " No better neighbor. Relaxing score w/slack: 20.2937 => 22.3231\n", " Found better neighbor: nGerms = 90 score = 20.6508\n", "Moving to better neighbor\n", "Progress: Iter 107 of 300 score=20.6508, nGerms=90: \n", " No better neighbor. Relaxing score w/slack: 20.6508 => 22.7159\n", " Found better neighbor: nGerms = 89 score = 20.9049\n", "Moving to better neighbor\n", "Progress: Iter 108 of 300 score=20.9049, nGerms=89: \n", " No better neighbor. Relaxing score w/slack: 20.9049 => 22.9954\n", " Found better neighbor: nGerms = 88 score = 21.1631\n", "Moving to better neighbor\n", "Progress: Iter 109 of 300 score=21.1631, nGerms=88: \n", " No better neighbor. Relaxing score w/slack: 21.1631 => 23.2794\n", " Found better neighbor: nGerms = 87 score = 21.3744\n", "Moving to better neighbor\n", "Progress: Iter 110 of 300 score=21.3744, nGerms=87: \n", " No better neighbor. Relaxing score w/slack: 21.3744 => 23.5118\n", " Found better neighbor: nGerms = 86 score = 21.975\n", "Moving to better neighbor\n", "Progress: Iter 111 of 300 score=21.975, nGerms=86: \n", " No better neighbor. Relaxing score w/slack: 21.975 => 24.1725\n", " Found better neighbor: nGerms = 85 score = 22.2654\n", "Moving to better neighbor\n", "Progress: Iter 112 of 300 score=22.2654, nGerms=85: \n", " No better neighbor. Relaxing score w/slack: 22.2654 => 24.492\n", " Found better neighbor: nGerms = 84 score = 22.5543\n", "Moving to better neighbor\n", "Progress: Iter 113 of 300 score=22.5543, nGerms=84: \n", " No better neighbor. Relaxing score w/slack: 22.5543 => 24.8098\n", " Found better neighbor: nGerms = 83 score = 22.9896\n", "Moving to better neighbor\n", "Progress: Iter 114 of 300 score=22.9896, nGerms=83: \n", " No better neighbor. Relaxing score w/slack: 22.9896 => 25.2885\n", " Found better neighbor: nGerms = 82 score = 23.3538\n", "Moving to better neighbor\n", "Progress: Iter 115 of 300 score=23.3538, nGerms=82: \n", " No better neighbor. Relaxing score w/slack: 23.3538 => 25.6892\n", " Found better neighbor: nGerms = 81 score = 23.5247\n", "Moving to better neighbor\n", "Progress: Iter 116 of 300 score=23.5247, nGerms=81: \n", " No better neighbor. Relaxing score w/slack: 23.5247 => 25.8772\n", " Found better neighbor: nGerms = 80 score = 24.0524\n", "Moving to better neighbor\n", "Progress: Iter 117 of 300 score=24.0524, nGerms=80: \n", " No better neighbor. Relaxing score w/slack: 24.0524 => 26.4576\n", " Found better neighbor: nGerms = 79 score = 24.501\n", "Moving to better neighbor\n", "Progress: Iter 118 of 300 score=24.501, nGerms=79: \n", " No better neighbor. Relaxing score w/slack: 24.501 => 26.9511\n", " Found better neighbor: nGerms = 78 score = 24.8828\n", "Moving to better neighbor\n", "Progress: Iter 119 of 300 score=24.8828, nGerms=78: \n", " No better neighbor. Relaxing score w/slack: 24.8828 => 27.3711\n", " Found better neighbor: nGerms = 77 score = 25.3037\n", "Moving to better neighbor\n", "Progress: Iter 120 of 300 score=25.3037, nGerms=77: \n", " No better neighbor. Relaxing score w/slack: 25.3037 => 27.8341\n", " Found better neighbor: nGerms = 76 score = 25.7762\n", "Moving to better neighbor\n", "Progress: Iter 121 of 300 score=25.7762, nGerms=76: \n", " No better neighbor. Relaxing score w/slack: 25.7762 => 28.3539\n", " Found better neighbor: nGerms = 75 score = 26.6372\n", "Moving to better neighbor\n", "Progress: Iter 122 of 300 score=26.6372, nGerms=75: \n", " No better neighbor. Relaxing score w/slack: 26.6372 => 29.301\n", " Found better neighbor: nGerms = 74 score = 27.0938\n", "Moving to better neighbor\n", "Progress: Iter 123 of 300 score=27.0938, nGerms=74: \n", " No better neighbor. Relaxing score w/slack: 27.0938 => 29.8031\n", " Found better neighbor: nGerms = 73 score = 27.7327\n", "Moving to better neighbor\n", "Progress: Iter 124 of 300 score=27.7327, nGerms=73: \n", " No better neighbor. Relaxing score w/slack: 27.7327 => 30.506\n", " Found better neighbor: nGerms = 72 score = 28.1142\n", "Moving to better neighbor\n", "Progress: Iter 125 of 300 score=28.1142, nGerms=72: \n", " No better neighbor. Relaxing score w/slack: 28.1142 => 30.9256\n", " Found better neighbor: nGerms = 71 score = 29.0001\n", "Moving to better neighbor\n", "Progress: Iter 126 of 300 score=29.0001, nGerms=71: \n", " No better neighbor. Relaxing score w/slack: 29.0001 => 31.9001\n", " Found better neighbor: nGerms = 70 score = 29.7588\n", "Moving to better neighbor\n", "Progress: Iter 127 of 300 score=29.7588, nGerms=70: \n", " No better neighbor. Relaxing score w/slack: 29.7588 => 32.7346\n", " Found better neighbor: nGerms = 69 score = 30.6467\n", "Moving to better neighbor\n", "Progress: Iter 128 of 300 score=30.6467, nGerms=69: \n", " No better neighbor. Relaxing score w/slack: 30.6467 => 33.7114\n", " Found better neighbor: nGerms = 68 score = 31.8267\n", "Moving to better neighbor\n", "Progress: Iter 129 of 300 score=31.8267, nGerms=68: \n", " No better neighbor. Relaxing score w/slack: 31.8267 => 35.0094\n", " Found better neighbor: nGerms = 67 score = 32.9384\n", "Moving to better neighbor\n", "Progress: Iter 130 of 300 score=32.9384, nGerms=67: \n", " No better neighbor. Relaxing score w/slack: 32.9384 => 36.2322\n", " Found better neighbor: nGerms = 66 score = 33.6263\n", "Moving to better neighbor\n", "Progress: Iter 131 of 300 score=33.6263, nGerms=66: \n", " No better neighbor. Relaxing score w/slack: 33.6263 => 36.9889\n", " Found better neighbor: nGerms = 65 score = 35.2724\n", "Moving to better neighbor\n", "Progress: Iter 132 of 300 score=35.2724, nGerms=65: \n", " No better neighbor. Relaxing score w/slack: 35.2724 => 38.7996\n", " Found better neighbor: nGerms = 64 score = 35.6932\n", "Moving to better neighbor\n", "Progress: Iter 133 of 300 score=35.6932, nGerms=64: \n", " No better neighbor. Relaxing score w/slack: 35.6932 => 39.2625\n", " Found better neighbor: nGerms = 63 score = 38.6285\n", "Moving to better neighbor\n", "Progress: Iter 134 of 300 score=38.6285, nGerms=63: \n", " No better neighbor. Relaxing score w/slack: 38.6285 => 42.4914\n", " Found better neighbor: nGerms = 62 score = 39.1288\n", "Moving to better neighbor\n", "Progress: Iter 135 of 300 score=39.1288, nGerms=62: \n", " No better neighbor. Relaxing score w/slack: 39.1288 => 43.0417\n", " Found better neighbor: nGerms = 61 score = 40.8754\n", "Moving to better neighbor\n", "Progress: Iter 136 of 300 score=40.8754, nGerms=61: \n", " No better neighbor. Relaxing score w/slack: 40.8754 => 44.963\n", " Found better neighbor: nGerms = 60 score = 42.5476\n", "Moving to better neighbor\n", "Progress: Iter 137 of 300 score=42.5476, nGerms=60: \n", " No better neighbor. Relaxing score w/slack: 42.5476 => 46.8024\n", " Found better neighbor: nGerms = 59 score = 43.7306\n", "Moving to better neighbor\n", "Progress: Iter 138 of 300 score=43.7306, nGerms=59: \n", " No better neighbor. Relaxing score w/slack: 43.7306 => 48.1037\n", " Found better neighbor: nGerms = 58 score = 45.014\n", "Moving to better neighbor\n", "Progress: Iter 139 of 300 score=45.014, nGerms=58: \n", " No better neighbor. Relaxing score w/slack: 45.014 => 49.5154\n", " Found better neighbor: nGerms = 57 score = 46.231\n", "Moving to better neighbor\n", "Progress: Iter 140 of 300 score=46.231, nGerms=57: \n", " No better neighbor. Relaxing score w/slack: 46.231 => 50.8541\n", " Found better neighbor: nGerms = 56 score = 48.3127\n", "Moving to better neighbor\n", "Progress: Iter 141 of 300 score=48.3127, nGerms=56: \n", " No better neighbor. Relaxing score w/slack: 48.3127 => 53.1439\n", " Found better neighbor: nGerms = 55 score = 49.1455\n", "Moving to better neighbor\n", "Progress: Iter 142 of 300 score=49.1455, nGerms=55: \n", " No better neighbor. Relaxing score w/slack: 49.1455 => 54.0601\n", " Found better neighbor: nGerms = 54 score = 50.4693\n", "Moving to better neighbor\n", "Progress: Iter 143 of 300 score=50.4693, nGerms=54: \n", " No better neighbor. Relaxing score w/slack: 50.4693 => 55.5162\n", " Found better neighbor: nGerms = 53 score = 51.5241\n", "Moving to better neighbor\n", "Progress: Iter 144 of 300 score=51.5241, nGerms=53: \n", " No better neighbor. Relaxing score w/slack: 51.5241 => 56.6765\n", " Found better neighbor: nGerms = 52 score = 52.5701\n", "Moving to better neighbor\n", "Progress: Iter 145 of 300 score=52.5701, nGerms=52: \n", " No better neighbor. Relaxing score w/slack: 52.5701 => 57.8271\n", " Found better neighbor: nGerms = 51 score = 56.5001\n", "Moving to better neighbor\n", "Progress: Iter 146 of 300 score=56.5001, nGerms=51: \n", " No better neighbor. Relaxing score w/slack: 56.5001 => 62.1501\n", " Found better neighbor: nGerms = 50 score = 57.978\n", "Moving to better neighbor\n", "Progress: Iter 147 of 300 score=57.978, nGerms=50: \n", " No better neighbor. Relaxing score w/slack: 57.978 => 63.7758\n", " Found better neighbor: nGerms = 49 score = 59.5596\n", "Moving to better neighbor\n", "Progress: Iter 148 of 300 score=59.5596, nGerms=49: \n", " No better neighbor. Relaxing score w/slack: 59.5596 => 65.5155\n", " Found better neighbor: nGerms = 48 score = 60.1267\n", "Moving to better neighbor\n", "Progress: Iter 149 of 300 score=60.1267, nGerms=48: \n", " No better neighbor. Relaxing score w/slack: 60.1267 => 66.1394\n", " Found better neighbor: nGerms = 47 score = 64.5931\n", "Moving to better neighbor\n", "Progress: Iter 150 of 300 score=64.5931, nGerms=47: \n", " No better neighbor. Relaxing score w/slack: 64.5931 => 71.0525\n", " Found better neighbor: nGerms = 46 score = 66.46\n", "Moving to better neighbor\n", "Progress: Iter 151 of 300 score=66.46, nGerms=46: \n", " No better neighbor. Relaxing score w/slack: 66.46 => 73.106\n", " Found better neighbor: nGerms = 45 score = 67.6399\n", "Moving to better neighbor\n", "Progress: Iter 152 of 300 score=67.6399, nGerms=45: \n", " No better neighbor. Relaxing score w/slack: 67.6399 => 74.4039\n", " Found better neighbor: nGerms = 44 score = 67.9172\n", "Moving to better neighbor\n", "Progress: Iter 153 of 300 score=67.9172, nGerms=44: \n", " No better neighbor. Relaxing score w/slack: 67.9172 => 74.7089\n", " Found better neighbor: nGerms = 43 score = 69.3683\n", "Moving to better neighbor\n", "Progress: Iter 154 of 300 score=69.3683, nGerms=43: \n", " No better neighbor. Relaxing score w/slack: 69.3683 => 76.3051\n", " Found better neighbor: nGerms = 42 score = 71.3768\n", "Moving to better neighbor\n", "Progress: Iter 155 of 300 score=71.3768, nGerms=42: \n", " No better neighbor. Relaxing score w/slack: 71.3768 => 78.5145\n", " Found better neighbor: nGerms = 41 score = 73.8704\n", "Moving to better neighbor\n", "Progress: Iter 156 of 300 score=73.8704, nGerms=41: \n", " No better neighbor. Relaxing score w/slack: 73.8704 => 81.2574\n", " Found better neighbor: nGerms = 40 score = 74.3672\n", "Moving to better neighbor\n", "Progress: Iter 157 of 300 score=74.3672, nGerms=40: \n", " No better neighbor. Relaxing score w/slack: 74.3672 => 81.8039\n", " Found better neighbor: nGerms = 39 score = 76.678\n", "Moving to better neighbor\n", "Progress: Iter 158 of 300 score=76.678, nGerms=39: \n", " No better neighbor. Relaxing score w/slack: 76.678 => 84.3458\n", " Found better neighbor: nGerms = 38 score = 79.3627\n", "Moving to better neighbor\n", "Progress: Iter 159 of 300 score=79.3627, nGerms=38: \n", " No better neighbor. Relaxing score w/slack: 79.3627 => 87.299\n", " Found better neighbor: nGerms = 37 score = 81.2294\n", "Moving to better neighbor\n", "Progress: Iter 160 of 300 score=81.2294, nGerms=37: \n", " No better neighbor. Relaxing score w/slack: 81.2294 => 89.3523\n", " Found better neighbor: nGerms = 36 score = 85.5126\n", "Moving to better neighbor\n", "Progress: Iter 161 of 300 score=85.5126, nGerms=36: \n", " No better neighbor. Relaxing score w/slack: 85.5126 => 94.0638\n", " Found better neighbor: nGerms = 35 score = 91.7223\n", "Moving to better neighbor\n", "Progress: Iter 162 of 300 score=91.7223, nGerms=35: \n", " No better neighbor. Relaxing score w/slack: 91.7223 => 100.894\n", " Found better neighbor: nGerms = 34 score = 92.0657\n", "Moving to better neighbor\n", "Progress: Iter 163 of 300 score=92.0657, nGerms=34: \n", " No better neighbor. Relaxing score w/slack: 92.0657 => 101.272\n", " Found better neighbor: nGerms = 33 score = 96.62\n", "Moving to better neighbor\n", "Progress: Iter 164 of 300 score=96.62, nGerms=33: \n", " No better neighbor. Relaxing score w/slack: 96.62 => 106.282\n", " Found better neighbor: nGerms = 32 score = 99.6037\n", "Moving to better neighbor\n", "Progress: Iter 165 of 300 score=99.6037, nGerms=32: \n", " No better neighbor. Relaxing score w/slack: 99.6037 => 109.564\n", " Found better neighbor: nGerms = 31 score = 103.453\n", "Moving to better neighbor\n", "Progress: Iter 166 of 300 score=103.453, nGerms=31: \n", " No better neighbor. Relaxing score w/slack: 103.453 => 113.798\n", " Found better neighbor: nGerms = 30 score = 109.497\n", "Moving to better neighbor\n", "Progress: Iter 167 of 300 score=109.497, nGerms=30: \n", " No better neighbor. Relaxing score w/slack: 109.497 => 120.447\n", " Found better neighbor: nGerms = 29 score = 115.956\n", "Moving to better neighbor\n", "Progress: Iter 168 of 300 score=115.956, nGerms=29: \n", " No better neighbor. Relaxing score w/slack: 115.956 => 127.552\n", " Found better neighbor: nGerms = 28 score = 124.145\n", "Moving to better neighbor\n", "Progress: Iter 169 of 300 score=124.145, nGerms=28: \n", " No better neighbor. Relaxing score w/slack: 124.145 => 136.56\n", " Found better neighbor: nGerms = 27 score = 131.878\n", "Moving to better neighbor\n", "Progress: Iter 170 of 300 score=131.878, nGerms=27: \n", " No better neighbor. Relaxing score w/slack: 131.878 => 145.066\n", " Found better neighbor: nGerms = 26 score = 141.839\n", "Moving to better neighbor\n", "Progress: Iter 171 of 300 score=141.839, nGerms=26: \n", " No better neighbor. Relaxing score w/slack: 141.839 => 156.023\n", " Found better neighbor: nGerms = 25 score = 143.558\n", "Moving to better neighbor\n", "Progress: Iter 172 of 300 score=143.558, nGerms=25: \n", " No better neighbor. Relaxing score w/slack: 143.558 => 157.914\n", " Found better neighbor: nGerms = 24 score = 147.169\n", "Moving to better neighbor\n", "Progress: Iter 173 of 300 score=147.169, nGerms=24: \n", " No better neighbor. Relaxing score w/slack: 147.169 => 161.886\n", " Found better neighbor: nGerms = 23 score = 153.03\n", "Moving to better neighbor\n", "Progress: Iter 174 of 300 score=153.03, nGerms=23: \n", " No better neighbor. Relaxing score w/slack: 153.03 => 168.333\n", " Found better neighbor: nGerms = 22 score = 163.703\n", "Moving to better neighbor\n", "Progress: Iter 175 of 300 score=163.703, nGerms=22: \n", " No better neighbor. Relaxing score w/slack: 163.703 => 180.073\n", " Found better neighbor: nGerms = 21 score = 177.36\n", "Moving to better neighbor\n", "Progress: Iter 176 of 300 score=177.36, nGerms=21: \n", " No better neighbor. Relaxing score w/slack: 177.36 => 195.096\n", " Found better neighbor: nGerms = 20 score = 190.053\n", "Moving to better neighbor\n", "Progress: Iter 177 of 300 score=190.053, nGerms=20: \n", " No better neighbor. Relaxing score w/slack: 190.053 => 209.058\n", " Found better neighbor: nGerms = 19 score = 193.461\n", "Moving to better neighbor\n", "Progress: Iter 178 of 300 score=193.461, nGerms=19: \n", " No better neighbor. Relaxing score w/slack: 193.461 => 212.807\n", " Found better neighbor: nGerms = 18 score = 194.579\n", "Moving to better neighbor\n", "Progress: Iter 179 of 300 score=194.579, nGerms=18: \n", " No better neighbor. Relaxing score w/slack: 194.579 => 214.037\n", " Found better neighbor: nGerms = 17 score = 196.325\n", "Moving to better neighbor\n", "Progress: Iter 180 of 300 score=196.325, nGerms=17: \n", " No better neighbor. Relaxing score w/slack: 196.325 => 215.958\n", " Found better neighbor: nGerms = 16 score = 199.369\n", "Moving to better neighbor\n", "Progress: Iter 181 of 300 score=199.369, nGerms=16: \n", " No better neighbor. Relaxing score w/slack: 199.369 => 219.306\n", " Found better neighbor: nGerms = 15 score = 212.154\n", "Moving to better neighbor\n", "Progress: Iter 182 of 300 score=212.154, nGerms=15: \n", " No better neighbor. Relaxing score w/slack: 212.154 => 233.369\n", " Found better neighbor: nGerms = 14 score = 213.519\n", "Moving to better neighbor\n", "Progress: Iter 183 of 300 score=213.519, nGerms=14: \n", " No better neighbor. Relaxing score w/slack: 213.519 => 234.871\n", " Found better neighbor: nGerms = 13 score = 227.376\n", "Moving to better neighbor\n", "Progress: Iter 184 of 300 score=227.376, nGerms=13: \n", " No better neighbor. Relaxing score w/slack: 227.376 => 250.114\n", "Stationary point found!\n", "score = 250.114088818\n", "weights = [1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1\n", " 0 0 0 0 0 0 0 1 0 0 1]\n", "L1(weights) = 13\n", "\n", "Germ selection completed in 586.3810129165649 seconds.\n", "germList1 is AC.\n" ] } ], "source": [ "#Can we reduce the number of germs and still be AC?\n", "#Let's start with:\n", "#All 196 germs (germsList=testGermList, initialWeights=None),\n", "#slackFrac=0.1, forceSingletons=True.\n", "#Let's also try to score against 5 randomized gate sets (numCopies=5)\n", "\n", "start = time.time()\n", "germList1 = pygsti.algorithms.germselection.optimize_integer_germs_slack(std.gs_target,testGermList,numCopies=5,\n", " initialWeights=None,slackFrac=0.1,\n", " force=\"singletons\",\n", " maxIter=300,\n", " verbosity=2)\n", "end = time.time()\n", "print()\n", "print(\"Germ selection completed in\", end-start, \"seconds.\")\n", "print(\"germList1 is\", \"not \"*(1-pygsti.algorithms.germselection.test_germ_list_infl(gs_real,germList1))+\"AC.\")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Gi\n", "Gx\n", "Gy\n", "GiGxGyGyGiGy\n", "GiGxGyGyGyGx\n", "GiGyGiGyGxGy\n", "GiGyGiGyGyGx\n", "GiGyGxGyGxGy\n", "GiGyGyGxGxGy\n", "GiGyGyGyGxGx\n", "GiGyGyGyGxGy\n", "GxGxGyGyGxGy\n", "GxGyGyGyGyGy\n" ] } ], "source": [ "#We have a germ set now! Let's see what it looks like:\n", "for germ in germList1:\n", " print(germ)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Complete initial germ set succeeds on all input gatesets.\n", "Now searching for best germ set.\n", "Starting germ set optimization. Lower score is better.\n", "Gateset has 14 gauge params.\n", "Progress: Iter 001 of 300 score=233.247, nGerms=46: \n", " Found better neighbor: nGerms = 45 score = 227.666\n", " Found better neighbor: nGerms = 45 score = 227.478\n", " Found better neighbor: nGerms = 45 score = 227.328\n", "Moving to better neighbor\n", "Progress: Iter 002 of 300 score=227.328, nGerms=45: \n", " Found better neighbor: nGerms = 44 score = 221.748\n", " Found better neighbor: nGerms = 44 score = 221.561\n", " Found better neighbor: nGerms = 44 score = 221.413\n", "Moving to better neighbor\n", "Progress: Iter 003 of 300 score=221.413, nGerms=44: \n", " Found better neighbor: nGerms = 43 score = 215.833\n", " Found better neighbor: nGerms = 43 score = 215.647\n", "Moving to better neighbor\n", "Progress: Iter 004 of 300 score=215.647, nGerms=43: \n", " Found better neighbor: nGerms = 42 score = 210.072\n", "Moving to better neighbor\n", "Progress: Iter 005 of 300 score=210.072, nGerms=42: \n", " Found better neighbor: nGerms = 41 score = 209.755\n", " Found better neighbor: nGerms = 41 score = 205.29\n", " Found better neighbor: nGerms = 41 score = 205.191\n", " Found better neighbor: nGerms = 41 score = 205.164\n", "Moving to better neighbor\n", "Progress: Iter 006 of 300 score=205.164, nGerms=41: \n", " Found better neighbor: nGerms = 40 score = 204.851\n", " Found better neighbor: nGerms = 40 score = 200.381\n", " Found better neighbor: nGerms = 40 score = 200.282\n", " Found better neighbor: nGerms = 40 score = 200.268\n", "Moving to better neighbor\n", "Progress: Iter 007 of 300 score=200.268, nGerms=40: \n", " Found better neighbor: nGerms = 39 score = 199.961\n", " Found better neighbor: nGerms = 39 score = 195.485\n", " Found better neighbor: nGerms = 39 score = 195.387\n", "Moving to better neighbor\n", "Progress: Iter 008 of 300 score=195.387, nGerms=39: \n", " Found better neighbor: nGerms = 38 score = 195.08\n", " Found better neighbor: nGerms = 38 score = 190.604\n", "Moving to better neighbor\n", "Progress: Iter 009 of 300 score=190.604, nGerms=38: \n", " Found better neighbor: nGerms = 37 score = 190.478\n", " Found better neighbor: nGerms = 37 score = 189.023\n", " Found better neighbor: nGerms = 37 score = 189.023\n", " Found better neighbor: nGerms = 37 score = 187.997\n", " Found better neighbor: nGerms = 37 score = 187.982\n", " Found better neighbor: nGerms = 37 score = 187.147\n", " Found better neighbor: nGerms = 37 score = 186.928\n", " Found better neighbor: nGerms = 37 score = 186.793\n", " Found better neighbor: nGerms = 37 score = 186.755\n", " Found better neighbor: nGerms = 37 score = 185.882\n", "Moving to better neighbor\n", "Progress: Iter 010 of 300 score=185.882, nGerms=37: \n", " Found better neighbor: nGerms = 36 score = 185.771\n", " Found better neighbor: nGerms = 36 score = 184.304\n", " Found better neighbor: nGerms = 36 score = 184.304\n", " Found better neighbor: nGerms = 36 score = 183.279\n", " Found better neighbor: nGerms = 36 score = 183.259\n", " Found better neighbor: nGerms = 36 score = 182.423\n", " Found better neighbor: nGerms = 36 score = 182.213\n", " Found better neighbor: nGerms = 36 score = 182.077\n", " Found better neighbor: nGerms = 36 score = 182.035\n", " Found better neighbor: nGerms = 36 score = 181.552\n", " Found better neighbor: nGerms = 36 score = 181.165\n", "Moving to better neighbor\n", "Progress: Iter 011 of 300 score=181.165, nGerms=36: \n", " Found better neighbor: nGerms = 35 score = 181.062\n", " Found better neighbor: nGerms = 35 score = 179.588\n", " Found better neighbor: nGerms = 35 score = 178.562\n", " Found better neighbor: nGerms = 35 score = 178.562\n", " Found better neighbor: nGerms = 35 score = 177.879\n", " Found better neighbor: nGerms = 35 score = 177.497\n", " Found better neighbor: nGerms = 35 score = 177.429\n", " Found better neighbor: nGerms = 35 score = 177.318\n", " Found better neighbor: nGerms = 35 score = 177.043\n", " Found better neighbor: nGerms = 35 score = 176.552\n", "Moving to better neighbor\n", "Progress: Iter 012 of 300 score=176.552, nGerms=35: \n", " Found better neighbor: nGerms = 34 score = 176.461\n", " Found better neighbor: nGerms = 34 score = 174.977\n", " Found better neighbor: nGerms = 34 score = 174.977\n", " Found better neighbor: nGerms = 34 score = 173.949\n", " Found better neighbor: nGerms = 34 score = 173.555\n", " Found better neighbor: nGerms = 34 score = 172.884\n", " Found better neighbor: nGerms = 34 score = 172.705\n", "Moving to better neighbor\n", "Progress: Iter 013 of 300 score=172.705, nGerms=34: \n", " Found better neighbor: nGerms = 33 score = 172.639\n", " Found better neighbor: nGerms = 33 score = 171.13\n", " Found better neighbor: nGerms = 33 score = 171.13\n", " Found better neighbor: nGerms = 33 score = 170.107\n", " Found better neighbor: nGerms = 33 score = 170.107\n", " Found better neighbor: nGerms = 33 score = 169.708\n", " Found better neighbor: nGerms = 33 score = 169.042\n", " Found better neighbor: nGerms = 33 score = 168.996\n", " Found better neighbor: nGerms = 33 score = 168.934\n", "Moving to better neighbor\n", "Progress: Iter 014 of 300 score=168.934, nGerms=33: \n", " Found better neighbor: nGerms = 32 score = 167.366\n", " Found better neighbor: nGerms = 32 score = 166.344\n", " Found better neighbor: nGerms = 32 score = 165.276\n", " Found better neighbor: nGerms = 32 score = 165.237\n", "Moving to better neighbor\n", "Progress: Iter 015 of 300 score=165.237, nGerms=32: \n", " Found better neighbor: nGerms = 31 score = 163.686\n", " Found better neighbor: nGerms = 31 score = 163.686\n", " Found better neighbor: nGerms = 31 score = 162.662\n", " Found better neighbor: nGerms = 31 score = 161.595\n", "Moving to better neighbor\n", "Progress: Iter 016 of 300 score=161.595, nGerms=31: \n", " Found better neighbor: nGerms = 30 score = 160.065\n", " Found better neighbor: nGerms = 30 score = 159.135\n", " Found better neighbor: nGerms = 30 score = 159.135\n", " Found better neighbor: nGerms = 30 score = 158.3\n", "Moving to better neighbor\n", "Progress: Iter 017 of 300 score=158.3, nGerms=30: \n", " Found better neighbor: nGerms = 29 score = 156.778\n", " Found better neighbor: nGerms = 29 score = 155.84\n", " Found better neighbor: nGerms = 29 score = 155.84\n", " Found better neighbor: nGerms = 29 score = 155.076\n", "Moving to better neighbor\n", "Progress: Iter 018 of 300 score=155.076, nGerms=29: \n", " Found better neighbor: nGerms = 28 score = 153.558\n", " Found better neighbor: nGerms = 28 score = 153.558\n", " Found better neighbor: nGerms = 28 score = 152.616\n", " Found better neighbor: nGerms = 28 score = 152.151\n", "Moving to better neighbor\n", "Progress: Iter 019 of 300 score=152.151, nGerms=28: \n", " Found better neighbor: nGerms = 27 score = 150.647\n", " Found better neighbor: nGerms = 27 score = 150.647\n", " Found better neighbor: nGerms = 27 score = 149.692\n", " Found better neighbor: nGerms = 27 score = 149.692\n", " Found better neighbor: nGerms = 27 score = 149.35\n", " Found better neighbor: nGerms = 27 score = 149.329\n", "Moving to better neighbor\n", "Progress: Iter 020 of 300 score=149.329, nGerms=27: \n", " Found better neighbor: nGerms = 26 score = 147.824\n", " Found better neighbor: nGerms = 26 score = 146.925\n", "Moving to better neighbor\n", "Progress: Iter 021 of 300 score=146.925, nGerms=26: \n", " Found better neighbor: nGerms = 25 score = 145.526\n", " Found better neighbor: nGerms = 25 score = 144.727\n", "Moving to better neighbor\n", "Progress: Iter 022 of 300 score=144.727, nGerms=25: \n", " Found better neighbor: nGerms = 24 score = 143.332\n", " Found better neighbor: nGerms = 24 score = 143.332\n", " Found better neighbor: nGerms = 24 score = 142.559\n", " Found better neighbor: nGerms = 24 score = 142.559\n", "Moving to better neighbor\n", "Progress: Iter 023 of 300 score=142.559, nGerms=24: \n", " Found better neighbor: nGerms = 23 score = 141.296\n", " Found better neighbor: nGerms = 23 score = 141.296\n", " Found better neighbor: nGerms = 23 score = 141.236\n", " Found better neighbor: nGerms = 23 score = 140.482\n", "Moving to better neighbor\n", "Progress: Iter 024 of 300 score=140.482, nGerms=23: \n", " Found better neighbor: nGerms = 22 score = 139.228\n", " Found better neighbor: nGerms = 22 score = 139.18\n", " Found better neighbor: nGerms = 22 score = 138.972\n", "Moving to better neighbor\n", "Progress: Iter 025 of 300 score=138.972, nGerms=22: \n", " Found better neighbor: nGerms = 21 score = 137.956\n", " Found better neighbor: nGerms = 21 score = 137.956\n", "Moving to better neighbor\n", "Progress: Iter 026 of 300 score=137.956, nGerms=21: \n", " Found better neighbor: nGerms = 20 score = 137.427\n", "Moving to better neighbor\n", "Progress: Iter 027 of 300 score=137.427, nGerms=20: \n", " Found better neighbor: nGerms = 19 score = 137.076\n", "Moving to better neighbor\n", "Progress: Iter 028 of 300 score=137.076, nGerms=19: \n", " No better neighbor. Relaxing score w/slack: 137.076 => 171.346\n", " Found better neighbor: nGerms = 18 score = 148.089\n", "Moving to better neighbor\n", "Progress: Iter 029 of 300 score=148.089, nGerms=18: \n", " No better neighbor. Relaxing score w/slack: 148.089 => 185.111\n", " Found better neighbor: nGerms = 17 score = 183.271\n", "Moving to better neighbor\n", "Progress: Iter 030 of 300 score=183.271, nGerms=17: \n", " No better neighbor. Relaxing score w/slack: 183.271 => 229.089\n", " Found better neighbor: nGerms = 16 score = 186.65\n", "Moving to better neighbor\n", "Progress: Iter 031 of 300 score=186.65, nGerms=16: \n", " No better neighbor. Relaxing score w/slack: 186.65 => 233.312\n", " Found better neighbor: nGerms = 15 score = 187.688\n", "Moving to better neighbor\n", "Progress: Iter 032 of 300 score=187.688, nGerms=15: \n", " No better neighbor. Relaxing score w/slack: 187.688 => 234.61\n", " Found better neighbor: nGerms = 14 score = 189.09\n", "Moving to better neighbor\n", "Progress: Iter 033 of 300 score=189.09, nGerms=14: \n", " No better neighbor. Relaxing score w/slack: 189.09 => 236.362\n", " Found better neighbor: nGerms = 13 score = 190.07\n", "Moving to better neighbor\n", "Progress: Iter 034 of 300 score=190.07, nGerms=13: \n", " No better neighbor. Relaxing score w/slack: 190.07 => 237.587\n", " Found better neighbor: nGerms = 12 score = 197.23\n", "Moving to better neighbor\n", "Progress: Iter 035 of 300 score=197.23, nGerms=12: \n", " No better neighbor. Relaxing score w/slack: 197.23 => 246.537\n", " Found better neighbor: nGerms = 11 score = 198.403\n", "Moving to better neighbor\n", "Progress: Iter 036 of 300 score=198.403, nGerms=11: \n", " No better neighbor. Relaxing score w/slack: 198.403 => 248.004\n", "Stationary point found!\n", "score = 248.004162285\n", "weights = [1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 0 0 0 0 0 1 0\n", " 0 0 0 0 0 0 0 0 0]\n", "L1(weights) = 11\n", "\n", "Germ selection completed in 5.898771047592163 seconds.\n", "germList2 is AC.\n" ] } ], "source": [ "#Can we reduce this set in size and make some of the germs shorter by:\n", "#1. Adding extra random germs of varying lengths\n", "#2. Turning up the gatePenalty parameter\n", "#3. Relaxing slackFrac to 0.25?\n", "\n", "testGermList1 = germList1 +\\\n", " pygsti.construction.list_random_gatestrings_onelen(std.gates,2,10,0)+\\\n", " pygsti.construction.list_random_gatestrings_onelen(std.gates,3,10,0)+\\\n", " pygsti.construction.list_random_gatestrings_onelen(std.gates,4,10,1)+\\\n", " pygsti.construction.list_random_gatestrings_onelen(std.gates,5,10,2)\n", "\n", "testGermList1 = pygsti.listtools.remove_duplicates(testGermList1)\n", "\n", "start = time.time()\n", "germList2 = pygsti.algorithms.germselection.optimize_integer_germs_slack(std.gs_target,testGermList1,numCopies=5,\n", " initialWeights=None,slackFrac=0.25,\n", " gatePenalty = 1e0,\n", " force=\"singletons\",\n", " maxIter=300,\n", " verbosity=2)\n", "end = time.time()\n", "print()\n", "print(\"Germ selection completed in\", end-start, \"seconds.\")\n", "print(\"germList2 is\", \"not \"*(1-pygsti.algorithms.germselection.test_germ_list_infl(gs_real,germList1))+\"AC.\")" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Gi\n", "Gx\n", "Gy\n", "GiGyGyGxGxGy\n", "GiGyGyGyGxGx\n", "GxGxGyGyGxGy\n", "GxGyGy\n", "GiGiGy\n", "GxGyGiGi\n", "GiGiGiGx\n", "GiGyGiGx\n" ] } ], "source": [ "for germ in germList2:\n", " print(germ)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Germ set fails on 0 gate sets out of 100.\n" ] } ], "source": [ "#Success! Let's see if this germ set is AC for a bunch of random gate sets:\n", "\n", "num_fails = 0\n", "for i in range(100):\n", " if not pygsti.alg.germselection.test_germ_list_infl(std.gs_target.randomize_with_unitary(0.01,i),germList2):\n", " num_fails += 1\n", "print('Germ set fails on', num_fails, 'gate sets out of 100.')" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "#Success! We've selected a single-qubit germ set that has only 11 germs and is robust against noise.\n", "#Further testing is possible by simulating GST data on a unitarily noisy gate set using these germs, and\n", "#examinining whether or not 1/L scaling is achieved.\n", "\n", "#Also, you can write your newfound germs to file: \n", "#pygsti.io.write_gatestring_list(\"mygerms.lst\",germList2,\"List of germs from tutorial\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": 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": 0 }