{ "cells": [ { "cell_type": "markdown", "metadata": {}, "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": {}, "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.7550232560748, N: 194\n", " Inner iter over candidate germs Iter 002 of 195 GiiGiy: \n", " Score: major=-114.0 minor=275.75224428270565, N: 194\n", " Inner iter over candidate germs Iter 003 of 195 GiiGxi: \n", " Score: major=-114.0 minor=303.12985712455384, N: 194\n", " Inner iter over candidate germs Iter 004 of 195 GiiGyi: \n", " Score: major=-114.0 minor=359.3300959231123, N: 194\n", " Inner iter over candidate germs Iter 005 of 195 GiiGcnot: \n", " Score: major=-114.0 minor=276.26872683842225, N: 194\n", " Inner iter over candidate germs Iter 006 of 195 GixGiy: \n", " Score: major=-114.0 minor=257.4426897879849, N: 194\n", " Inner iter over candidate germs Iter 007 of 195 GixGxi: \n", " Score: major=-114.0 minor=341.5696468598034, N: 194\n", " Inner iter over candidate germs Iter 008 of 195 GixGyi: \n", " Score: major=-114.0 minor=282.338674492408, N: 194\n", " Inner iter over candidate germs Iter 009 of 195 GixGcnot: \n", " Score: major=-114.0 minor=577.5866443200878, N: 194\n", " Inner iter over candidate germs Iter 010 of 195 GiyGxi: \n", " Score: major=-114.0 minor=294.80873540347477, N: 194\n", " Inner iter over candidate germs Iter 011 of 195 GiyGyi: \n", " Score: major=-114.0 minor=274.01388120453754, N: 194\n", " Inner iter over candidate germs Iter 012 of 195 GiyGcnot: \n", " Score: major=-114.0 minor=292.4187770509611, N: 194\n", " Inner iter over candidate germs Iter 013 of 195 GxiGyi: \n", " Score: major=-114.0 minor=257.14469808616536, N: 194\n", " Inner iter over candidate germs Iter 014 of 195 GxiGcnot: \n", " Score: major=-114.0 minor=295.19014734007106, N: 194\n", " Inner iter over candidate germs Iter 015 of 195 GyiGcnot: \n", " Score: major=-114.0 minor=262.24440122325194, 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.10434931549185, N: 194\n", " Inner iter over candidate germs Iter 018 of 195 GiiGiiGxi: \n", " Score: major=-104.0 minor=257.4811389850852, N: 194\n", " Inner iter over candidate germs Iter 019 of 195 GiiGiiGyi: \n", " Score: major=-104.0 minor=295.32017448143534, N: 194\n", " Inner iter over candidate germs Iter 020 of 195 GiiGiiGcnot: \n", " Score: major=-104.0 minor=274.607408708754, N: 194\n", " Inner iter over candidate germs Iter 021 of 195 GiiGixGix: \n", " Score: major=-104.0 minor=453.2493918611686, N: 194\n", " Inner iter over candidate germs Iter 022 of 195 GiiGixGiy: \n", " Score: major=-104.0 minor=275.1564063981899, N: 194\n", " Inner iter over candidate germs Iter 023 of 195 GiiGixGxi: \n", " Score: major=-104.0 minor=304.47418773769414, N: 194\n", " Inner iter over candidate germs Iter 024 of 195 GiiGixGyi: \n", " Score: major=-104.0 minor=278.44120228187916, N: 194\n", " Inner iter over candidate germs Iter 025 of 195 GiiGixGcnot: \n", " Score: major=-104.0 minor=352.1721810679982, N: 194\n", " Inner iter over candidate germs Iter 026 of 195 GiiGiyGix: \n", " Score: major=-104.0 minor=266.57020870563014, N: 194\n", " Inner iter over candidate germs Iter 027 of 195 GiiGiyGiy: \n", " Score: major=-104.0 minor=448.32104717482, N: 194\n", " Inner iter over candidate germs Iter 028 of 195 GiiGiyGxi: \n", " Score: major=-104.0 minor=297.3316824804599, N: 194\n", " Inner iter over candidate germs Iter 029 of 195 GiiGiyGyi: \n", " Score: major=-104.0 minor=283.54615357575017, N: 194\n", " Inner iter over candidate germs Iter 030 of 195 GiiGiyGcnot: \n", " Score: major=-104.0 minor=297.12854592193526, N: 194\n", " Inner iter over candidate germs Iter 031 of 195 GiiGxiGix: \n", " Score: major=-104.0 minor=307.71199183761695, N: 194\n", " Inner iter over candidate germs Iter 032 of 195 GiiGxiGiy: \n", " Score: major=-104.0 minor=307.7674841723881, N: 194\n", " Inner iter over candidate germs Iter 033 of 195 GiiGxiGxi: \n", " Score: major=-104.0 minor=410.0988255344368, N: 194\n", " Inner iter over candidate germs Iter 034 of 195 GiiGxiGyi: \n", " Score: major=-104.0 minor=284.3153092741726, N: 194\n", " Inner iter over candidate germs Iter 035 of 195 GiiGxiGcnot: \n", " Score: major=-104.0 minor=303.8102280854164, N: 194\n", " Inner iter over candidate germs Iter 036 of 195 GiiGyiGix: \n", " Score: major=-104.0 minor=283.5892520489328, N: 194\n", " Inner iter over candidate germs Iter 037 of 195 GiiGyiGiy: \n", " Score: major=-104.0 minor=283.3226206509195, N: 194\n", " Inner iter over candidate germs Iter 038 of 195 GiiGyiGxi: \n", " Score: major=-104.0 minor=273.5504913809546, N: 194\n", " Inner iter over candidate germs Iter 039 of 195 GiiGyiGyi: \n", " Score: major=-104.0 minor=563.1049081486988, N: 194\n", " Inner iter over candidate germs Iter 040 of 195 GiiGyiGcnot: \n", " Score: major=-104.0 minor=277.18869907206283, N: 194\n", " Inner iter over candidate germs Iter 041 of 195 GiiGcnotGix: \n", " Score: major=-104.0 minor=352.3317810063291, N: 194\n", " Inner iter over candidate germs Iter 042 of 195 GiiGcnotGiy: \n", " Score: major=-104.0 minor=298.1019089981339, N: 194\n", " Inner iter over candidate germs Iter 043 of 195 GiiGcnotGxi: \n", " Score: major=-104.0 minor=309.6778947901517, N: 194\n", " Inner iter over candidate germs Iter 044 of 195 GiiGcnotGyi: \n", " Score: major=-104.0 minor=279.3478112644729, N: 194\n", " Inner iter over candidate germs Iter 045 of 195 GiiGcnotGcnot: \n", " Score: major=-104.0 minor=375.6548612782157, N: 194\n", " Inner iter over candidate germs Iter 046 of 195 GixGixGiy: \n", " Score: major=-104.0 minor=327.9840714902066, N: 194\n", " Inner iter over candidate germs Iter 047 of 195 GixGixGxi: \n", " Score: major=-104.0 minor=755.1272055918537, N: 194\n", " Inner iter over candidate germs Iter 048 of 195 GixGixGyi: \n", " Score: major=-104.0 minor=362.97934478595647, N: 194\n", " Inner iter over candidate germs Iter 049 of 195 GixGixGcnot: \n", " Score: major=-104.0 minor=532.4198103374531, N: 194\n", " Inner iter over candidate germs Iter 050 of 195 GixGiyGiy: \n", " Score: major=-104.0 minor=293.57122809494956, N: 194\n", " Inner iter over candidate germs Iter 051 of 195 GixGiyGxi: \n", " Score: major=-104.0 minor=313.06071440109775, N: 194\n", " Inner iter over candidate germs Iter 052 of 195 GixGiyGyi: \n", " Score: major=-104.0 minor=291.50473798603565, N: 194\n", " Inner iter over candidate germs Iter 053 of 195 GixGiyGcnot: \n", " Score: major=-104.0 minor=284.2173572664501, N: 194\n", " Inner iter over candidate germs Iter 054 of 195 GixGxiGiy: \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(target_model, 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(target_model, 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[0mopPenalty\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~/research/pyGSTi/packages/pygsti/algorithms/germselection.py\u001b[0m in \u001b[0;36mbuild_up_breadth\u001b[0;34m(modelList, germsList, randomize, randomizationStrength, numCopies, seed, opPenalty, scoreFunc, tol, threshold, check, force, pretest, memLimit, comm, profiler, verbosity)\u001b[0m\n\u001b[1;32m 1309\u001b[0m worstScore = max( worstScore, compute_composite_germ_score(\n\u001b[1;32m 1310\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-> 1311\u001b[0;31m **nonAC_kwargs))\n\u001b[0m\u001b[1;32m 1312\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 1313\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/research/pyGSTi/packages/pygsti/algorithms/germselection.py\u001b[0m in \u001b[0;36mcompute_composite_germ_score\u001b[0;34m(scoreFn, thresholdAC, initN, partialDerivDaggerDeriv, model, partialGermsList, eps, numGaugeParams, opPenalty, 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/usr/local/lib/python3.7/site-packages/numpy/linalg/linalg.py\u001b[0m in \u001b[0;36meigvalsh\u001b[0;34m(a, UPLO)\u001b[0m\n\u001b[1;32m 1126\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 1127\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-> 1128\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 1129\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 1130\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(target_model, 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_circuits_without_powers_and_cycles(\n", " target_model.operations.keys(), maxLength=germLength) )\n", " else:\n", " candidate_germs.extend( pc.list_random_circuits_onelen(\n", " target_model.operations.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(target_model, available_germs,\n", " randomizationStrength=1e-3, numCopies=3, seed=1234,\n", " opPenalty=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 = %mdl\" % (time.time()-tStart))\n", " pickle.dump(germs,open(outFilename,\"wb\"))\n", " return germs\n", " \n", "#2Q case \n", "target_model = std2Q_XYICNOT.target_model()\n", "forced_germs = pygsti.construction.circuit_list([(gl,) for gl in target_model.operations.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(target_model, forced_germs, candidate_counts,\n", " seedStart, \"germs_EXAMPLE.pkl\", comm)" ] }, { "cell_type": "markdown", "metadata": { "collapsed": 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": {}, "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.7.0" } }, "nbformat": 4, "nbformat_minor": 2 }