{ "cells": [ { "cell_type": "markdown", "metadata": { "deletable": true, "editable": true }, "source": [ "# Running germ selection on multiple processors\n", "The code below should be put into a script and run using mpiexec. It's primary function is to pass a MPI Comm object to `pygsti.algorithms.germselection.build_up_breadth`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false, "deletable": true, "editable": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "201 available germs\n", "Starting germ set optimization. Lower score is better.\n", "Memory estimate of 13.6 GB (0.5 GB limit) for all-Jac mode.\n", "Memory estimate of 0.2 GB (0.5 GB limit) for single-Jac mode.\n", " Initial germ set computation Iter 1 of 6 Gii: \n", " Initial germ set computation Iter 2 of 6 Gix: \n", " Initial germ set computation Iter 3 of 6 Giy: \n", " Initial germ set computation Iter 4 of 6 Gxi: \n", " Initial germ set computation Iter 5 of 6 Gyi: \n", " Initial germ set computation Iter 6 of 6 Gcnot: \n", " Outer iteration: 1 of 1282 amplified, 6 germs\n", " Inner iter over candidate germs Iter 001 of 195 GiiGix: \n", " Score: major=-114.0 minor=275.75502325607516, N: 194\n", " Inner iter over candidate germs Iter 002 of 195 GiiGiy: \n", " Score: major=-114.0 minor=275.7522442827053, N: 194\n", " Inner iter over candidate germs Iter 003 of 195 GiiGxi: \n", " Score: major=-114.0 minor=303.1298571245524, N: 194\n", " Inner iter over candidate germs Iter 004 of 195 GiiGyi: \n", " Score: major=-114.0 minor=359.3300959231139, N: 194\n", " Inner iter over candidate germs Iter 005 of 195 GiiGcnot: \n", " Score: major=-114.0 minor=276.2687268384213, N: 194\n", " Inner iter over candidate germs Iter 006 of 195 GixGiy: \n", " Score: major=-114.0 minor=257.4426897879868, N: 194\n", " Inner iter over candidate germs Iter 007 of 195 GixGxi: \n", " Score: major=-114.0 minor=341.56964685981245, N: 194\n", " Inner iter over candidate germs Iter 008 of 195 GixGyi: \n", " Score: major=-114.0 minor=282.3386744924068, N: 194\n", " Inner iter over candidate germs Iter 009 of 195 GixGcnot: \n", " Score: major=-114.0 minor=577.5866443200778, N: 194\n", " Inner iter over candidate germs Iter 010 of 195 GiyGxi: \n", " Score: major=-114.0 minor=294.80873540346374, N: 194\n", " Inner iter over candidate germs Iter 011 of 195 GiyGyi: \n", " Score: major=-114.0 minor=274.01388120453817, N: 194\n", " Inner iter over candidate germs Iter 012 of 195 GiyGcnot: \n", " Score: major=-114.0 minor=292.41877705095874, N: 194\n", " Inner iter over candidate germs Iter 013 of 195 GxiGyi: \n", " Score: major=-114.0 minor=257.14469808616434, N: 194\n", " Inner iter over candidate germs Iter 014 of 195 GxiGcnot: \n", " Score: major=-114.0 minor=295.1901473400719, N: 194\n", " Inner iter over candidate germs Iter 015 of 195 GyiGcnot: \n", " Score: major=-114.0 minor=262.2444012232528, N: 194\n", " Inner iter over candidate germs Iter 016 of 195 GiiGiiGix: \n", " Score: major=-104.0 minor=245.73088449107456, N: 194\n", " Inner iter over candidate germs Iter 017 of 195 GiiGiiGiy: \n", " Score: major=-104.0 minor=236.1043493154918, N: 194\n", " Inner iter over candidate germs Iter 018 of 195 GiiGiiGxi: \n", " Score: major=-104.0 minor=257.48113898508547, N: 194\n", " Inner iter over candidate germs Iter 019 of 195 GiiGiiGyi: \n", " Score: major=-104.0 minor=295.3201744814378, N: 194\n", " Inner iter over candidate germs Iter 020 of 195 GiiGiiGcnot: \n", " Score: major=-104.0 minor=274.60740870875316, N: 194\n", " Inner iter over candidate germs Iter 021 of 195 GiiGixGix: \n", " Score: major=-104.0 minor=453.2493918611676, N: 194\n", " Inner iter over candidate germs Iter 022 of 195 GiiGixGiy: \n", " Score: major=-104.0 minor=275.15640639818946, N: 194\n", " Inner iter over candidate germs Iter 023 of 195 GiiGixGxi: \n", " Score: major=-104.0 minor=304.4741877376942, N: 194\n", " Inner iter over candidate germs Iter 024 of 195 GiiGixGyi: \n", " Score: major=-104.0 minor=278.44120228187865, N: 194\n", " Inner iter over candidate germs Iter 025 of 195 GiiGixGcnot: \n" ] }, { "ename": "KeyboardInterrupt", "evalue": "", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 44\u001b[0m \u001b[0mseedStart\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m4\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 45\u001b[0m do_greedy_germsel(gs_target, forced_germs, candidate_counts,\n\u001b[0;32m---> 46\u001b[0;31m seedStart, \"germs_EXAMPLE.pkl\", comm)\n\u001b[0m", "\u001b[0;32m\u001b[0m in \u001b[0;36mdo_greedy_germsel\u001b[0;34m(gs_target, forced_germs, candidate_counts, seedStart, outFilename, comm)\u001b[0m\n\u001b[1;32m 30\u001b[0m \u001b[0mrandomizationStrength\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1e-3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnumCopies\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mseed\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1234\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 31\u001b[0m \u001b[0mgatePenalty\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m10.0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mscoreFunc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'all'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtol\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1e-6\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mthreshold\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m1e5\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 32\u001b[0;31m pretest=False, force=forced_germs, verbosity=5, comm=comm, memLimit=0.5*(1024**3))\n\u001b[0m\u001b[1;32m 33\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 34\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcomm\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mcomm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mGet_rank\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Users/enielse/research/pyGSTi/packages/pygsti/algorithms/germselection.py\u001b[0m in \u001b[0;36mbuild_up_breadth\u001b[0;34m(gatesetList, germsList, randomize, randomizationStrength, numCopies, seed, gatePenalty, scoreFunc, tol, threshold, check, force, pretest, memLimit, comm, profiler, verbosity)\u001b[0m\n\u001b[1;32m 1307\u001b[0m worstScore = max( worstScore, compute_composite_germ_score(\n\u001b[1;32m 1308\u001b[0m \u001b[0mpartialDerivDaggerDeriv\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtestDDD\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0minitN\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitN\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1309\u001b[0;31m **nonAC_kwargs))\n\u001b[0m\u001b[1;32m 1310\u001b[0m \u001b[0mtestDDDs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtestDDD\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;31m#save in case this is a keeper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1311\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Users/enielse/research/pyGSTi/packages/pygsti/algorithms/germselection.py\u001b[0m in \u001b[0;36mcompute_composite_germ_score\u001b[0;34m(scoreFn, thresholdAC, initN, partialDerivDaggerDeriv, gateset, partialGermsList, eps, numGaugeParams, gatePenalty, germLengths, l1Penalty)\u001b[0m\n\u001b[1;32m 429\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 430\u001b[0m \u001b[0mcombinedDDD\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_np\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpartialDerivDaggerDeriv\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 431\u001b[0;31m \u001b[0msortedEigenvals\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_np\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msort\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_np\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mreal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_nla\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0meigvalsh\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcombinedDDD\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 432\u001b[0m \u001b[0mobservableEigenvals\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msortedEigenvals\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mnumGaugeParams\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 433\u001b[0m \u001b[0mN_AC\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36meigvalsh\u001b[0;34m(a, UPLO)\u001b[0m\n\u001b[1;32m 1007\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mresult_t\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_commonType\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1008\u001b[0m \u001b[0msignature\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m'D->d'\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0misComplexType\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m'd->d'\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1009\u001b[0;31m \u001b[0mw\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgufunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msignature\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msignature\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mextobj\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mextobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1010\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mw\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mastype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_realType\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult_t\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcopy\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1011\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ "from __future__ import print_function\n", "import time\n", "\n", "import pygsti\n", "import pygsti.construction as pc\n", "from pygsti.construction import std2Q_XYICNOT\n", "from pygsti.algorithms import germselection as germsel\n", "\n", "from mpi4py import MPI\n", "comm = MPI.COMM_WORLD\n", "\n", "def do_greedy_germsel(gs_target, forced_germs, candidate_counts,\n", " seedStart, outFilename, comm):\n", " #candidate_counts is a dict of keys = germ lengths, values = # of germs at that length \n", "\n", " tStart = time.time()\n", "\n", " candidate_germs = []\n", " for i,(germLength, count) in enumerate(candidate_counts.items()):\n", " if count == \"all upto\":\n", " candidate_germs.extend( pc.list_all_gatestrings_without_powers_and_cycles(\n", " gs_target.gates.keys(), maxLength=germLength) )\n", " else:\n", " candidate_germs.extend( pc.list_random_gatestrings_onelen(\n", " gs_target.gates.keys(), germLength, count, seed=seedStart+i))\n", "\n", " available_germs = pygsti.tools.remove_duplicates( forced_germs + candidate_germs )\n", " print(\"%d available germs\" % len(available_germs))\n", " germs = germsel.build_up_breadth(gs_target, available_germs,\n", " randomizationStrength=1e-3, numCopies=3, seed=1234,\n", " gatePenalty=10.0, scoreFunc='all', tol=1e-6, threshold=1e5,\n", " pretest=False, force=forced_germs, verbosity=5, comm=comm, memLimit=0.5*(1024**3))\n", "\n", " if comm is None or comm.Get_rank() == 0:\n", " print(\"Germs (%d) = \\n\" % len(germs), \"\\n\".join(map(str,germs)))\n", " print(\"Total time = %gs\" % (time.time()-tStart))\n", " pickle.dump(germs,open(outFilename,\"wb\"))\n", " return germs\n", " \n", "#2Q case \n", "gs_target = std2Q_XYICNOT.gs_target\n", "forced_germs = pygsti.construction.gatestring_list([(gl,) for gl in gs_target.gates.keys()]) #singletons \n", "candidate_counts = { 3:\"all upto\", 4:30, 5:20, 6:20, 7:20, 8:20} # germLength:num_candidates \n", "seedStart = 4\n", "do_greedy_germsel(gs_target, forced_germs, candidate_counts,\n", " seedStart, \"germs_EXAMPLE.pkl\", comm)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true, "deletable": true, "editable": true }, "source": [ "Above is **keyboard-interrupted on purpose**, as this output was produced with a single processor and it would have taken a very long time.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true, "deletable": true, "editable": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }